Browse Source

Add 2019 website

master
decentral1se 3 years ago
parent
commit
95a613f875
No known key found for this signature in database GPG Key ID: 92DAD76BD9567B8A
  1. BIN
      relearn.2019.be/html/css/Avara-Black.otf
  2. BIN
      relearn.2019.be/html/css/Avara-Bold.otf
  3. BIN
      relearn.2019.be/html/css/Avara-BoldItalic.otf
  4. 82
      relearn.2019.be/html/css/pathslider.css
  5. 368
      relearn.2019.be/html/css/stylesheet.css
  6. 61
      relearn.2019.be/html/css/warped.css
  7. 118
      relearn.2019.be/html/d3-example.html
  8. 440
      relearn.2019.be/html/index.html
  9. 2
      relearn.2019.be/html/js/jquery-3.4.1.min.js
  10. 402
      relearn.2019.be/html/js/jquery.pathslider.js
  11. BIN
      relearn.2019.be/html/relearn2019.png

BIN
relearn.2019.be/html/css/Avara-Black.otf

Binary file not shown.

BIN
relearn.2019.be/html/css/Avara-Bold.otf

Binary file not shown.

BIN
relearn.2019.be/html/css/Avara-BoldItalic.otf

Binary file not shown.

82
relearn.2019.be/html/css/pathslider.css

@ -0,0 +1,82 @@
/* set slider dimension here */
#slider {
width: 200px;
height: 200px;
}
/* Basic solid color slider grip */
.pathslider-grip {
width: 30px;
height: 15px;
position: absolute;
top: 0;
left: 0;
background: #ddd;
font-size: 1px;
z-index: 10;
cursor: move;
border: 1px solid;
border-radius: 7px;
-webkit-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 1px rgba(255,255,255,0.6);
box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 1px rgba(255,255,255,0.6);
}
/* grip hover/sliding state */
.pathslider-grip.sliding, .pathslider-grip:hover {
border-color: #8ce;
-webkit-box-shadow: 0 0 15px #8ce;
box-shadow: 0 0 15px #8ce;
}
/* slider extra css - same as #slider above */
.pathslider {
position: relative;
}
/*************
grip styles
add these using the gripClass option
*************/
/* shiny silver - sorta */
.silver {
border-color: #949494;
background-color: #ebebeb;
background-image: -webkit-linear-gradient(top,#ffffff 0%,#ebebeb 50%,#dbdbdb 50%,#b5b5b5);
background-image: linear-gradient(top,#ffffff 0%,#ebebeb 50%,#dbdbdb 50%,#b5b5b5);
}
/* shiny black */
.black {
border-color: #000000
background-color: #3b3b3b;
background-image: -webkit-linear-gradient(top,#a3a3a3 0%,#3b3b3b 50%,#242424 50%,#000000);
background-image: linear-gradient(top,#a3a3a3 0%,#3b3b3b 50%,#242424 50%,#000000);
}
/* Small circular chrome knob
including ".pathslider-grip" to remove border & box shadow
*/
.pathslider-grip.chrome1 {
width: 18px;
height: 18px;
border: 0;
border-radius: 0;
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAABI1BMVEUAAADHx8fNzc/29vbCwsOVlpfFxsbb29vp6enm5eX19vb6+vr///+vr6/Dw8K4uLjGxsbQ0NDR0dHh4eHl5uaqq6qlpaWoqqy+vr+9vb3e4OGTk5TIyMiSkpO9vb2kpabDw8SampzDw8O9vb62tratra7Ly8vW1tbk5OTKysrv8fLt7e3c3Nzi4uLd3d309PTv7+/o6Ojm5ufy8vPu7+/r6+zX2NnT09XS0tTk5Obh4eHP0NLKy83DxMX5+fr19fXz8/Xl5ube3+Dd3d/c3N7Z2tvW19jU1de+vr/3+Pjp6ura29zNztG7vL65uruztLWvsLGtra329vbw8PDh4uPLzc/HyMqysrLs7e3o6Orj4+PV1dfQ0dO4uLmoqKn7+/ujo6WIZbNwAAAAMXRSTlMA/v4F/v79kzcuFgkC9vHmsI9+ZRL99fHw7+7u7Ovj4+Hg19bNzMCooJ+Yi4p5SSYjiIrjEAAAASVJREFUGNMVz0OCxAAUANGfpG2MbSu27aTtmfufYtK1fLuCJgBg72g831bO3hoYQAuKvl+PPGkznWXHL/Um7KvfxVIUoZw9cZGLj0YhX93YZTkx4kJ9rArIZwvqDykTMi4nshZOKr9cZwiDtkQIhs2KrED5ikIlPehuDZzgDUdc4yNfG5NoBzKPx+mAsDhT9SlC4BkEcs80CHzJO0QgMBtxbVcgT6coy7qMaVqcNJuJjgz5LollRHJ0fcVPQsZyEEj/0kSObBxXF2ONpEi2BDe7uTy1ljRBajRN+mqpBNUsl0KexnVKIYOFap9UofZ0mBhBQfRI0ShBrhaTtV7bc80VQY20CVN5/oEibHBaLmceIs/LV8ODApotwGr9x9vL8+v7/h7gH5fyPZ6I/Z3zAAAAAElFTkSuQmCC');
background-position: center center;
background-repeat: no-repeat;
-webkit-box-shadow: 0 0 0;
box-shadow: 0 0 0;
}
/* Large curvy chrome slide */
.pathslider-grip.chrome2 {
width: 57px;
height: 35px;
border: 0;
border-radius: 0;
background: url('data:image/png;base64,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');
background-position: center center;
background-repeat: no-repeat;
-webkit-box-shadow: 0 0 0;
box-shadow: 0 0 0;
}

368
relearn.2019.be/html/css/stylesheet.css

@ -0,0 +1,368 @@
@font-face {
font-family: 'AvaraBold';
src: url('Avara-Bold.otf');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'AvaraBold';
src: url('Avara-BoldItalic.otf');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'AvaraBold';
src: url('Avara-Black.otf');
font-weight: bold;
font-style: normal;
}
.fr {
display: none;
}
:root {
font-size: 18px;
line-height: 1.4em;
}
html,
#curve {
scroll-behavior: smooth;
}
body{
position: relative;
margin:0;
padding:0;
color:purple;
background-color:#ff4d4d33;
font-family: 'AvaraBold';
overflow: hidden;
}
hr{
border:0;
border-bottom:1px dotted;
margin-top: 1em;
margin-bottom: 1em;
}
h1{
line-height: 1.1em;
}
h3 {
font-size: 1em;
margin-top: 0;
margin-bottom: 0;
}
dl {
column-count: 2;
}
dt {
text-decoration: underline;
}
dl {
text-indent: 0;
}
dd {
margin-left: 0;
display: inline-block;
}
p {
margin: 0;
}
p + p {
margin-top: 1em;
}
ul {
padding-left: 0;
}
select {
font-size: 1em;
}
a {
text-decoration-style: wavy;
text-decoration-skip-ink: none;
text-decoration-color: white;
}
sup {
line-height: 0;
}
/* --- slider --- */
div#sliders{
position: fixed;
width: 500px;
top:60px;
left: 61%;
bottom: 1em;
}
div#slider{
float: left;
margin:0.5em 1em 1em 0.5em;
z-index: 1;
position: absolute;
top:0;
left:0;
width : 100%;
height : 400px;
background: transparent;
}
#slider2 {
position: absolute;
top:0;
left:0;
width : 100%;
height : 400px;
background: transparent;
}
#controlpoints li {
position: absolute;
z-index: 10000;
list-style-type: none;
width: 10em;
line-height: 1.3em;
}
#controlpoints li#cp-paris {
top: 220px;
left: 20px;
}
#controlpoints li#cp-brussels {
top: 0px;
left: 220px;
}
#controlpoints li#cp-rotterdam {
top: 140px;
right: 20px;
}
#warped {
font-weight: bold;
position: absolute;
top: 220px;
left: -40px;
height: 220px;
}
div#relearn-infos {
position: fixed;
bottom: 2em;
left: 65%;
margin-top: 2em;
}
div#relearn-infos ul {
margin: 0;
}
/* --- control points ---*/
#curve {
width: 55%;
padding : 1em 2em;
height: 87vh;
overflow: auto;
padding-bottom: 4em;
}
#curve::-webkit-scrollbar {
width: 6px;
border-radius: 5px;
}
#curve::-webkit-scrollbar-track {
background-color: black;
}
#curve::-webkit-scrollbar-thumb {
-webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.3);
background-color: lightgray;
border-radius: 5px;
}
.details {
display: none;
margin-top: 1em;
}
div.controlpoint{
max-width: 800px;
margin: 1em 0;
margin-top: 2em;
padding-bottom: 2em;
border-top: 1px solid black;
border-bottom: 1px solid black;
}
div.controlpoint + div.controlpoint {
border-top: 0;
}
div.controlpoint ul {
column-count: 2;
}
dl:not(.summary) dt,
dl:not(.summary) dd {
display: inline;
}
dl:not(.summary) dd:before {
content: " ";
}
dl:not(.summary) dd + dt:before {
content: '';
display: block;
}
.practical-infos {
display: flex;
flex-wrap: wrap;
margin-top: 1em;
}
.programme {
margin-bottom: 1em;
width: 100%;
}
.programme div.flex {
float: left;
width: 50%;
}
.programme p {
width: 50%;
float: left;
box-sizing: border-box;
}
.programme p {
padding-right: 0.5em;
}
.programme p + p {
padding-right: 0em;
padding-left: 0.5em;
}
.programme div.flex p {
width: 100%;
float: none;
}
div.controlpoint .programme ul {
column-count: 1;
padding: 0 1em;
}
.participation,
.hosting {
flex-basis: 50%;
box-sizing: border-box;
}
.participation {
padding-right: 0.5em;
}
.hosting {
padding-left: 0.5em;
}
/*--- ROTTERDAM ---*/
#rotterdam{
color:#0054ff;
}
#rotterdam li{
list-style: none;
text-indent: -23px;
margin-left: 2em;
}
/*--- BRUSSELS ---*/
#brussels {
color: teal;
}
/*--- PARIS ---*/
#paris {
color: tomato;
}
/*--- MOBILE ---*/
@media only screen
and (max-width : 1024px) {
:root {
font-size: 13px;
line-height: 1.4em;
}
div#sliders {
top: 0;
left: 0;
right: 0;
width: initial;
height: 150px;
background-color: #ffdbdb;
}
div#slider {
top: -100px;
left: -40px;
transform: scale(0.5);
}
#warped {
top: -50px;
left: -225px;
transform: scale(0.5);
}
div#relearn-infos {
position: static;
}
#curve {
padding-top: 150px;
width: 100%;
box-sizing: border-box;
}
.programme div.flex,
.programme p {
width: 100%;
}
.programme ul {
margin-top: 0;
}
.participation,
.hosting {
flex-basis: 100%;
padding: 0;
}
.hosting {
margin-top: 1em;
}
#controlpoints li#cp-paris {
top: 120px;
left: 40px;
}
#controlpoints li#cp-brussels {
top: 10px;
left: 20px;
}
#controlpoints li#cp-rotterdam {
top: 10px;
right: -40px;
}
}

61
relearn.2019.be/html/css/warped.css

@ -0,0 +1,61 @@
#warped {position: relative; display: block; width:817.9999694824219px;
height:655.0034713745117px;}
#warped>span[class^=w]:nth-of-type(n+0){display:block; position:absolute;
-moz-transform-origin:50% 100%; -webkit-transform-origin:50% 100%; -o-transform-origin:50%
100%; -ms-transform-origin:50% 100%; transform-origin:50% 100%; }
#warped span{font-family:'AvaraBold';font-size:46px;font-weight:regular;font-style:normal;
line-height:0.95; white-space:pre; overflow:visible; padding:0px;}
#warped .w0 {-moz-transform: rotate(-6.29rad);-webkit-transform: rotate(-6.29rad);-o-transform:
rotate(-6.29rad);-ms-transform: rotate(-6.29rad); transform: rotate(-6.29rad);
width: 31px; height: 43px; left: 129.24px; top: 58.02px;}
#warped .w1 {-moz-transform: rotate(-6.23rad);-webkit-transform: rotate(-6.23rad);-o-transform:
rotate(-6.23rad);-ms-transform: rotate(-6.23rad); transform: rotate(-6.23rad);
width: 20px; height: 43px; left: 178.6px; top: 59.06px;}
#warped .w2 {-moz-transform: rotate(-6.01rad);-webkit-transform: rotate(-6.01rad);-o-transform:
rotate(-6.01rad);-ms-transform: rotate(-6.01rad); transform: rotate(-6.01rad);
width: 13px; height: 43px; left: 217.28px; top: 64.23px;}
#warped .w3 {-moz-transform: rotate(-5.53rad);-webkit-transform: rotate(-5.53rad);-o-transform:
rotate(-5.53rad);-ms-transform: rotate(-5.53rad); transform: rotate(-5.53rad);
width: 20px; height: 43px; left: 243.79px; top: 82.1px;}
#warped .w4 {-moz-transform: rotate(-5.48rad);-webkit-transform: rotate(-5.48rad);-o-transform:
rotate(-5.48rad);-ms-transform: rotate(-5.48rad); transform: rotate(-5.48rad);
width: 20px; height: 43px; left: 270.77px; top: 110.44px;}
#warped .w5 {-moz-transform: rotate(-5.56rad);-webkit-transform: rotate(-5.56rad);-o-transform:
rotate(-5.56rad);-ms-transform: rotate(-5.56rad); transform: rotate(-5.56rad);
width: 16px; height: 43px; left: 299.48px; top: 136.24px;}
#warped .w6 {-moz-transform: rotate(-5.94rad);-webkit-transform: rotate(-5.94rad);-o-transform:
rotate(-5.94rad);-ms-transform: rotate(-5.94rad); transform: rotate(-5.94rad);
width: 23px; height: 43px; left: 328.82px; top: 158.28px;}
#warped .w7 {-moz-transform: rotate(-6.18rad);-webkit-transform: rotate(-6.18rad);-o-transform:
rotate(-6.18rad);-ms-transform: rotate(-6.18rad); transform: rotate(-6.18rad);
width: 11px; height: 43px; left: 369.77px; top: 165.89px;}
#warped .w8 {-moz-transform: rotate(-6.34rad);-webkit-transform: rotate(-6.34rad);-o-transform:
rotate(-6.34rad);-ms-transform: rotate(-6.34rad); transform: rotate(-6.34rad);
width: 11px; height: 43px; left: 399.6px; top: 166.65px;}
#warped .w9 {-moz-transform: rotate(-6.54rad);-webkit-transform: rotate(-6.54rad);-o-transform:
rotate(-6.54rad);-ms-transform: rotate(-6.54rad); transform: rotate(-6.54rad);
width: 23px; height: 43px; left: 429.17px; top: 161.36px;}
#warped .w10 {-moz-transform: rotate(-6.8rad);-webkit-transform: rotate(-6.8rad);-o-transform:
rotate(-6.8rad);-ms-transform: rotate(-6.8rad); transform: rotate(-6.8rad);
width: 23px; height: 43px; left: 468.58px; top: 145.76px;}
#warped .w11 {-moz-transform: rotate(-7.1rad);-webkit-transform: rotate(-7.1rad);-o-transform:
rotate(-7.1rad);-ms-transform: rotate(-7.1rad); transform: rotate(-7.1rad);
width: 23px; height: 43px; left: 506.17px; top: 115.42px;}
#warped .w12 {-moz-transform: rotate(-7.39rad);-webkit-transform: rotate(-7.39rad);-o-transform:
rotate(-7.39rad);-ms-transform: rotate(-7.39rad); transform: rotate(-7.39rad);
width: 23px; height: 43px; left: 525.54px; top: 85.72px;}

118
relearn.2019.be/html/d3-example.html

@ -0,0 +1,118 @@
<!DOCTYPE html>
<html>
<!-- source: https://bl.ocks.org/mbostock/8027637 -->
<head>
<meta charset="utf-8">
<style>
path {
fill: none;
stroke: #000;
stroke-width: 8px;
}
line {
fill: none;
stroke: red;
stroke-width: 0;
}
circle {
fill: red;
}
rect {
fill: none;
cursor: crosshair;
pointer-events: all;
}
</style>
<body>
<script src="https://d3js.org/d3.v3.min.js"></script>
<script>
var points = [[600,600],[600, 400],[300,300], [400, 600]];
var width = 960,
height = 500;
var line = d3.svg.line()
.interpolate("cardinal");
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var path = svg.append("path")
.datum(points)
.attr("d", line);
var line = svg.append("line");
var circle = svg.append("circle")
.attr("cx", -10)
.attr("cy", -10)
.attr("r", 60);
var isDown = false;
svg.append("rect")
.attr("width", width)
.attr("height", height)
.on("mousedown", function(){
svg.on("mousemove", mousemoved);
})
.on("mouseup")
function mousemoved() {
var m = d3.mouse(this),
p = closestPoint(path.node(), m);
line.attr("x1", p[0]).attr("y1", p[1]).attr("x2", m[0]).attr("y2", m[1]);
circle.attr("cx", p[0]).attr("cy", p[1]);
}
function closestPoint(pathNode, point) {
var pathLength = pathNode.getTotalLength(),
precision = 8,
best,
bestLength,
bestDistance = Infinity;
// linear scan for coarse approximation
for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) {
if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) {
best = scan, bestLength = scanLength, bestDistance = scanDistance;
}
}
// binary search for precise estimate
precision /= 2;
while (precision > 0.5) {
var before,
after,
beforeLength,
afterLength,
beforeDistance,
afterDistance;
if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) {
best = before, bestLength = beforeLength, bestDistance = beforeDistance;
} else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) {
best = after, bestLength = afterLength, bestDistance = afterDistance;
} else {
precision /= 2;
}
}
best = [best.x, best.y];
best.distance = Math.sqrt(bestDistance);
return best;
function distance2(p) {
var dx = p.x - point[0],
dy = p.y - point[1];
return dx * dx + dy * dy;
}
}
</script>
<html>

440
relearn.2019.be/html/index.html

@ -0,0 +1,440 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="js/jquery.pathslider.js"></script>
<link rel="stylesheet" media="screen" href="https://fontlibrary.org/face/avara" type="text/css"/>
<link rel="stylesheet" type="text/css" href="css/pathslider.css">
<link rel="stylesheet" type="text/css" href="css/warped.css">
<link rel="stylesheet" type="text/css" href="css/stylesheet.css">
</head>
<body>
<!-- The curved slider -->
<div id="sliders">
<ul id='controlpoints'>
<li id="cp-rotterdam"><a href="#rotterdam">Rotterdam, 07→09/06</a></li>
<li id="cp-brussels"><a href="#brussels">Brussels, 21→22/06</a></li>
<li id="cp-paris"><a href='#paris'>Paris, 06→08/09</a></li>
</ul>
<div id='warped'>
<span class='w0'>R</span><span class='w1'>e</span><span class='w2'>l</span><span class='w3'>e</span><span class='w4'>a</span><span class='w5'>r</span><span class='w6'>n</span><span class='w7'> </span><span class='w8'> </span><span class='w9'>2</span><span class='w10'>0</span><span class='w11'>1</span><span class='w12'>9</span>
</div>
<div id="slider"></div>
<!--<div id="slider2"></div>-->
</div>
<div id="curve">
<h1>Relearn
<select onchange="window.location.href=this.value" style="display: inline-block;">
<option value="http://relearn.be/2019/" selected="selected">2019</option>
<option value="http://relearn.be/2017/">2017</option>
<option value="http://relearn.be/2016/">2016</option>
<option value="http://relearn.be/2015/">2015</option>
<option value="http://relearn.be/2014/">2014</option>
<option value="http://relearn.be/2013/">2013</option>
</select>
curved</h1>
<p>
Relearn is a collective learning experiment with as many teachers as it has participants. It is motivated by the possibility to displace parameters of/for research, studying and learning. <a href='#' class='more'>Read more about Relearn.</a>
</p>
<div class='details'>
<p>
Relearn is a summerschool which welcomes persons, artists, students, teachers from all backgrounds and disciplines. Participants will gather to learn from and teach to each other, beyond the traditional paradigms of education.
Relearn researches convivial, experimental and deviant methods and means in the fields of design, computing and education, challenging the normal roles and separations in them (teacher/student, developer/user, art/life…).
</p>
<p>
Free, Libre and Open Source Software plays a fundamental role at Relearn, as it facilitates a different approach to the tools we commonly use in our practices and lives. For instance, it can allow us to understand the influence that tools themselves exert on the way they are used, or the different social relations and economies that are formed between who creates and uses them. Such a questioning approach to technology feels urgent, in a time in which more and more social, political and personal issues are addressed by solely technological means.
</p>
</div>
<hr>
<p>
This summer, Relearn is back in the form of a curve, transversing multiple times and spaces. Curl yourselves this summer from, to and between Rotterdam, Brussels and Paris ! <a href='#' class='more'>Read more about the curve.</a>
</p>
<div class='details'>
<p>Relearn 2019 is a curve, transversing multiple times and spaces.</p>
<p>
These would be independently organized sessions based on the urgencies
and affordances of each of the participating spaces. However, there
would still be a common thread throughout the series, perhaps in the
form of a transversal “reroam” but also in the form of a roaming server
that is passed on to each subsequent event.
It is possible to attend all sessions but not required, nor the goal, it
is really the intention to have self-standing events which do not depend
people joining a succession of events but still share commonalities.
</p>
</div>
<div id="rotterdam" class="controlpoint">
<h2>·Rotterdam</h2>
<dl class='summary'>
<dt>Date</dt> <dd>7<sup>th</sup>–9<sup>th</sup> June 2019</dd>
<dt>Location</dt> <dd>Varia - Gouwstraat 3, Rotterdam, The Netherlands</dd>
<dt>Initiator</dt> <dd><a href="https://varia.zone/en/" target='_blank'>Varia</a></dd>
<dt>Contact</dt> <dd><a href="mailto:&#105;&#110;&#102;&#111;&#064;&#118;&#097;&#114;&#105;&#097;&#046;&#122;&#111;&#110;&#101;">&#105;&#110;&#102;&#111;&#064;&#118;&#097;&#114;&#105;&#097;&#046;&#122;&#111;&#110;&#101;</a></dd>
</dl>
<hr />
<p>For the Rotterdam control point on the Relearn curve, we propose to together attend to a <strong>subject zone</strong> (<strong>*</strong>) where different digital network practices intersect. This subject zone can morph into multiple directions throughout the session. Our specific interest is in how <strong>publishing formats</strong> (<strong>**</strong>) operate with/on/through this zone.</p>
<p><strong>*</strong> There are many questions in the air when we start to speak about digital infrastructures, hosters, servers, services, networks and their technical realities. Instead of picking one and diving deeper, we thought it would be more interesting to present a range and explore different vocabularies, protocols, technologies, infrastructures. We invite you to join Relearn to stretch this zone, starting from or moving towards:</p>
<ul>
<li>&nbsp;&nbsp;digital interdependencies</li>
<li>&nbsp;&nbsp;affective infrastructures</li>
<li>&nbsp;&nbsp;homebrew networks</li>
<li>&nbsp;&nbsp;networked entanglements</li>
<li>&nbsp;&nbsp;feminist servers</li>
<li>&nbsp;&nbsp;federated networks</li>
<li>&nbsp;&nbsp;and-and-networks</li>
<li>&nbsp;&nbsp;digital autonomy</li>
<li>&nbsp;&nbsp;transitional infrastructures</li>
<li>&nbsp;&nbsp;digital selves-organisations</li>
<li>&nbsp;&nbsp;so-and-sovereignty networks</li>
<li>&nbsp;&nbsp;out-of-the-cloud thinking</li>
<li>&nbsp;&nbsp;</li>
</ul>
<p><strong>**</strong> We’re curious about learning through publishing formats. The different publishing formats serve as an invitation to embed ourselves within the subject zone of digital networks. How can these formats be our morphable lenses, that we use to relearn digital networks? Starting from or moving towards:</p>
<ul>
<li>&nbsp;&nbsp;multiple readers</li>
<li>&nbsp;&nbsp;cross-readings created through algorithms</li>
<li>&nbsp;&nbsp;logbooks</li>
<li>&nbsp;&nbsp;syllabi</li>
<li>&nbsp;&nbsp;documentation</li>
<li>&nbsp;&nbsp;annotations</li>
<li>&nbsp;&nbsp;cookbooks</li>
<li>&nbsp;&nbsp;tutorials</li>
<li>&nbsp;&nbsp;README</li>
<li>&nbsp;&nbsp;bug reports</li>
<li>&nbsp;&nbsp;link dumps</li>
<li>&nbsp;&nbsp;scores</li>
<li>&nbsp;&nbsp;</li>
</ul>
<p>Many sub-trajectories can emerge from here during the days, without the need of taking the same path or agreeing about vocabularies or geometries altogether.</p>
<hr />
<div class='practical-infos'>
<div class='programme'>
<h3>Programme</h3>
<p><u>Friday 7<sup>th</sup> June</u><br>
20:00–22:00<br>
Relearn public evening program: embed yourself into Relearn</p>
<p><u>Saturday–Sunday, 8–9<sup>th</sup> June</u><br>
10:00–18:00<br>
Relearn sub-zone-trajectories</p>
</div>
<div class='participation'>
<h3>Participation</h3>
<p>If you would like to join this Relearn session, please send an email to <a href="mailto:&#105;&#110;&#102;&#111;&#064;&#118;&#097;&#114;&#105;&#097;&#046;&#122;&#111;&#110;&#101;">&#105;&#110;&#102;&#111;&#064;&#118;&#097;&#114;&#105;&#097;&#046;&#122;&#111;&#110;&#101;</a> with a short motivation of your interest. We will reply to subscriptions on a regular basis, up to the <strong>26<sup>th</sup> of May</strong>.</p>
<p>Our <em>capacities</em> allow us to have a group of 30 relearners. Our preference goes out to people that can join the whole session (Friday evening, Saturday and Sunday).
</p>
<p>If you would like to join us only on the Friday evening, there is no need to subscribe, just come over ! :)</p>
</div>
<div class='hosting'>
<h3>Hosting</h3>
<p>
We will take care of a <em>daily vegetarian lunch</em> (please let us know about allergies or other dietary preferences). Following a tradition from previous years, we will arrange a <em>hosting network</em> in the city and find a place to stay for everyone. Please mention in the email if you need to be hosted or could host one or more relearners in your house.</p>
</div>
</div>
<br>
<div>Relearn Rotterdam is kindly supported by Gemeente Rotterdam & Stimuleringsfonds Creative Industrie.</div>
</div> <!-- END OF ROTTERDAM CONTROL POINT -->
<div id="brussels" class="controlpoint">
<h2>·Brussels</h2>
<dl class='summary'>
<dt>Date</dt> <dd>21<sup>st</sup>–22<sup>nd</sup> June 2019</dd>
<dt>Location</dt> <dd>Hacktiris - Rue Paul Devauxstraat 3, Brussels, Belgium</dd>
<dt>Initiator</dt> <dd><a href="http://osp.kitchen/" target='_blank'>OSP</a></dd>
<dt>Contact</dt> <dd><a href="mailto:&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;&subject=[BXL] ">&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;</a></dd>
</dl>
<hr />
<p>
Exploring computed layout tools.
</p>
<p>
Since 2013, several initiatives have been experimenting with making printed publications using HTML/CSS/Javascript with the help of CSS regions. This feature is necessary to produce multi-paged publications and since its removal from Blink (2014) and in WebKit (2017), users are trapped with old versions of WebKit. Sticking to older version is still viable today but for how long?
</p>
<p>
This urgency leads us to a quite pragmatic but necessary worksession which will therefore focus on exploring other tools for making printed publications, especially computed layout tools (making layout with code). We already spotted three tools we would like to explore, but anyone is welcome to propose and experiment with other tools:
</p>
<dl>
<dt><a href='https://xxyxyz.org/' target='_blank'>Flat</a></dt><dd>A Python library made to draw graphics but also designed to produce multi-paged PDFs.</dd>
<dt><a href='http://sile-typesetter.org/' target='_blank'>Sile</a></dt><dd>A contemporary rewriting of the TeX mastodon.</dd>
<dt><a href='https://www.pagedmedia.org/paged-js/' target='_blank'>paged.js</a></dt><dd>A Javascript polyfill of CSS official specs for printed documents.</dd>
</dl>
<hr />
<div class='practical-infos'>
<div class='programme'>
<h3>Programme</h3>
<div class='flex'>
<p><u>Friday 21<sup>st</sup> June</u><br>
10:00–18:00
</p>
<ul>
<li>Short introduction of tools</li>
<li>Choose your tool and have fun with it!</li>
</ul>
</div>
<div class='flex'>
<p><u>Saturday 22<sup>nd</sup> June</u><br>
10:00–18:00</p>
<ul>
<li>Continuation of the exploration</li>
<li>Show/tell/criticize</li>
</ul>
</div>
</div>
<div class='participation'>
<h3>Participation</h3>
<p>Participation is free of charge. If you would like to join this Relearn session, please send an email to <a href="mailto:&#109;&#105;&#097;&#109;&#064;&#111;&#115;&#112;&#046;&#107;&#105;&#116;&#099;&#104;&#101;&#110;">&#109;&#105;&#097;&#109;&#064;&#111;&#115;&#112;&#046;&#107;&#105;&#116;&#099;&#104;&#101;&#110;</a> with a short motivation of your interest. We will reply to subscriptions on a regular basis, up to the <strong>15<sup>th</sup> of June</strong>.</p>
<p>Our <em>capacities</em> allow us to have a group of 12 relearners. Our preference goes out to people that can join the whole session (Friday, Saturday).
</p>
</div>
<div class='hosting'>
<h3>Hosting</h3>
<p>
On Friday, there's a vegetarian canteen in the working space or many eating choices outside (the location is in the heart of Brussels). On Saturday we will take care of a <em>vegetarian lunch</em> (please let us know about allergies or other dietary preferences). Following a tradition from previous years, we will arrange a <em>hosting network</em> in the city and find a place to stay for everyone. Please mention in the email if you need to be hosted or could host one or more relearners in your house.
</p>
</div>
</div>
</div> <!-- END BRUSSELS CONTROL POINT -->
<div id="paris" class="controlpoint">
<h2>·Paris</h2>
<div class='fr'>
<a class='lang' href='#'>EN</a>
<dl class='summary'>
<dt>Date</dt> <dd>06–08 septembre 2019</dd>
<dt>Lieu</dt> <dd>La Générale - 14 Avenue Parmentier, 75011 Paris, France</dd>
<dt>Organisateurs</dt> <dd><a href="http://www.sakasama.net/" target='_blank'>Anne Laforet</a> et <a href="https://juhel-quentin.fr/" target='_blank'>Quentin Juhel</a></dd>
<dt>Contact</dt> <dd><a href="mailto:&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;&subject=[PARIS] ">&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;</a></dd>
</dl>
<p>Relearn est une expérience d’apprentissage et de recherche collectifs avec autant d'enseignant·es que de participant·es. Relearn est un réseau d'artistes, de designers, d'enseignant⋅es, de programmeur⋅euses, de praticien·nes et/ou de curieux ⋅ses qui se rassemblent pour re-imaginer des formes de pédagogie, de création, de partage autour d'outils numériques libres. L'horizontalité, la transdisciplinarité et la diversité des approches et des pratiques sont au cœur des sessions de Relearn.</p>
<p>Cet été, Relearn est de retour sous la forme d’une courbe, traversant des temps et espaces multiples. Cet été, après les sessions de Rotterdam et Bruxelles, la courbe s'arrête à Paris du 6 au 8 septembre.</p>
<p>Nous vous proposons de venir expérimenter ensemble avec le serveur local de Relearn qui voyage entre chacune des sessions. Nous nous intéresserons à plusieurs pistes de réflexions concernant les serveurs et les enjeux sociaux, techniques, artistiques, affectifs... Nous souhaitons ré-interroger ce que l'on entend par serveur, sa place dans l'apprentissage et la recherche, ainsi que les modes de co-existence et d'échange. Nous vous invitons à venir prendre soin de ce dispositif à partir des enjeux de :</p>
<ul>
<li>pratiques artistiques collaboratives en ligne : pratiques artistiques collaboratives en ligne : dessin, texte, image, interaction, etc</li>
<li>modes de publication et de transmission, en particulier le Web 2 print</li>
<li>maintenance, administration système, care et travail reproductif</li>
<li>codes de conduite, modération</li>
<li>physicalité des serveurs</li>
<li>représentations</li>
<li>écologie et serveurs</li>
<li>serveurs locaux, fédérés, féministes, etc.</li>
</ul>
<hr>
<div class='practical-infos'>
<div class='programme'>
<h3>Programme</h3>
<p style="width: 100%; margin-bottom: 1.5em;">Relearn a lieu à <a href="https://www.lagenerale.fr/">La Générale</a> - 14 Avenue Parmentier, 75011 Paris, France</p>
<div class='flex'>
<p><u>Vendredi 6 septembre — 18h &rarr; 22h</u><br>
Table-rondes de présentation des pistes de réflexions et échanges<br>
Ouvert à tou·tes, participant·es ou non à Relearn<br>
Bar sur place</p>
</div>
<div class='flex'>
<p><u>Samedi 7 septembre — 10h &rarr; 18h (possibilité de rester plus tard)</u><br>
<u>Dimanche 8 septembre — 10h &rarr; 18h</u><br>
séances de travail collectives, par petits groupes, en parallèle<br>
18h ménage collectif<br>
Gratuit sur inscription à <a href="mailto:&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;&subject=[PARIS] ">&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;</a> avant le 25 août</p>
</div>
</div>
<div class='participation'>
<h3>Participation</h3>
<p>Si vous souhaitez participer à cette session de Relearn, merci d'envoyer un email à <a href="mailto:&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;&subject=[PARIS] ">&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;</a> avec quelques mots sur le(s) axe(s) qui vous intéressent. La date limite d'inscription est le 25 août.<br>Nous pouvons accueillir une cinquantaine de participant·es pendant la totalité de Relearn (vendredi soir, samedi et dimanche). Le vendredi soir est ouvert à toute personne intéressée par les thématiques de Relearn et si vous ne souhaitez venir que ce soir-là, ce n'est pas nécessaire de s'inscrire.</p>
</div>
<div class='hosting'>
<h3>Accueil, hébergement</h3>
<p>Nous prenons en charge un déjeuner végétarien samedi et dimanche (merci de nous dire si vous avez des allergies ou intolérances). </p>
<p>En continuité des éditions précédentes de Relearn, nous mettons en place un réseau d'hébergement pour loger les participant·es non loca·les. Merci de mentionner dans votre email si vous avez besoin d'être logé·e ou si vous pouvez loger un·e ou plusieurs participant·es.</p>
</div>
<p>Merci d'apporter une prise multiple.</p>
<p>La session parisienne de Relearn est intiée par <a href="http://www.sakasama.net/">Anne Laforet et <a href="http://juhel-quentin.fr/">Quentin Juhel</a>, en discussion avec d'autres participant·es, en particulier issu·es de Relearn, <a href="https://prepostprint.org">Prepostprint</a> et <a href="https://lereset.org/">le Reset</a>.</p>
</div>
</div> <!-- END DIV .fr -->
<div class='en'>
<a class='lang' href='#'>FR</a>
<dl class='summary'>
<dt>Date</dt> <dd>06–08 September 2019</dd>
<dt>Location</dt> <dd>La Générale - 14 Avenue Parmentier, 75011 Paris, France</dd>
<dt>Initiators</dt> <dd><a href="http://www.sakasama.net/" target='_blank'>Anne Laforet</a> and <a href="https://juhel-quentin.fr/" target='_blank'>Quentin Juhel</a></dd>
<dt>Contact</dt> <dd><a href="mailto:&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;&subject=[PARIS] ">&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;</a></dd>
</dl>
<p>Relearn is a collective learning experiment with as many teachers as there are participants. Relearn is a network of artists, designers, teachers, programmers, practitioners and/or curious minds coming together to re-imagine pedagogical forms, creation, sharing around the concept of free software tools. During Relearn, we experience together horizontality, transdisciplinarity, diversity of approaches and practices.</p>
<p>This summer, Relearn is back in the form of a curve, passing through multiple times and spaces. This summer, after Rotterdam, Brussels, the curve will reach Paris from September 6-8.</p>
<p>You are invited to come and experiment with the local Relearn server that travels between each session of the curve. Our interests are focused on several threads around servers and the social, technical, artistic, affective issues around them. We propose to re-examine what we understand as servers, their place in learning and research, as well as modes and ways of co-existence and exchange with and via them. You will have the possibility to come and take care for this device meanwhile addressing the following issues :</p>
<ul>
<li>online collaborative art practices : drawing, text, image, interaction, etc</li>
<li>modes of publication and transmission, more specifically Web 2 print</li>
<li>maintenance, system administration, care and reproductive work</li>
<li>codes of conduct, moderation</li>
<li>physicality of servers</li>
<li>representations</li>
<li>ecology and servers</li>
<li>local, federated, feminist servers...</li>
</ul>
<p>During Relearn sessions, we challenge our ways of learning, exchanging and experimenting through feminist, open, inclusive pedagogies together.</p>
<p>English, French, and languages in between, are spoken at Relearn. Participants will work in small groups, in parallel sessions.</p>
<p>You are welcome to bring your own resources for discussions.</p>
<hr>
<div class='practical-infos'>
<div class='programme'>
<h3>Programme</h3>
<p style="width: 100%; margin-bottom: 1.5em;">Relearn will take place at <a href="https://www.lagenerale.fr/" target="_blank">La Générale</a> - 14 Avenue Parmentier, 75011 Paris, France</p>
<div class='flex'>
<p><u>Friday September 6th — 18h &rarr; 22h</u><br>
Round-tables to present threads for discussion and exchange<br>
Open to everybody, Relearners and Non-relearners</p>
</div>
<div class='flex'>
<p><u>Saturday September 7th — 10h &rarr; 18h (or more)</u><br>
<u>Sunday Septembre 8th — 10h &rarr; 18h</u><br>
parallel work sessions in small groups<br>
18h collective cleaning<br>
Free of charge upon writing to <a href="mailto:&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;&subject=[PARIS] ">&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;</a> before August 25<sup>th</sup>.</p>
</div>
</div>
<div class='participation'>
<h3>Participation</h3>
<p>To take part of this Relearn session, please send an email to <a href="mailto:&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;&subject=[PARIS] ">&#114;&#101;&#103;&#105;&#115;&#116;&#114;&#097;&#116;&#105;&#111;&#110;&#064;&#114;&#101;&#108;&#101;&#097;&#114;&#110;&#046;&#098;&#101;</a> with a few words describing your interests for the session. The application deadline to apply is August 25th.<br>Our capacities allow us to welcome a group of 50 relearners for the entire session (Friday evening, Saturday and Sunday).<br>For only Friday evening participation, subscribing is unnecessary, just come and join us as is! :)</p>
</div>
<div class='hosting'>
<h3>Hosting</h3>
<p>A daily vegetarian lunch is provided (please let us know about allergies or other dietary requirements). Following a tradition from previous years, we will arrange a hosting network in the city and find a place to stay for everyone. Please mention in the email if you need to be hosted or could host one or more relearners at your home.</p>
<p>Please bring a power strip.</p>
</div>
<p style='margin-top:1.5em;''>Relearn Paris session is initiatied by <a href="http://www.sakasama.net/">Anne Laforet</a> et <a href="http://juhel-quentin.fr/">Quentin Juhel</a>, in collaboration with other participants, specifically from Relearn, <a href="https://prepostprint.org">Prepostprint</a> and <a href="https://lereset.org/">le Reset</a>.</p>
</div>
</div> <!-- END DIV .en -->
</div>
<div id="relearn-infos">
<h3>Resources &amp; contact</h3>
<ul>
<li><a href="https://tumulte.domainepublic.net/cgi-bin/mailman/listinfo/relearn" target='_blank'>Subscribe to the Relearn mailinglist </a></li>
<li><a href="https://webchat.freenode.net/" target='_blank'>IRC channel: #relearn on Freenode</a></li>
<li><a href="https://gitlab.com/relearn" target='_blank'>Relearn gitlab repository </a></li>
<li><a href="https://gallery.constantvzw.org/index.php/search?album=1&amp;q=relearn" target='_blank'>Photographs of previous Relearn editions</a></li>
</ul>
</div>
</div> <!-- END CURVE -->
<script>
jQuery(function($){
$("#slider").pathslider({
//points : [250,50,-150,100,-50,-400,250,250],
points : [350,100,-750,350,400,-500,150,200],
value : 0,
rotateGrip : true,
tolerance : 3,
range : 30,
curve : { width:4, color:"#333", cap:"round" }
});
$("#slider2").pathslider({
points : [490,300,-150,0,-200,-200,300,100],
value : 49,
rotateGrip : true,
tolerance : 3,
range : 30,
curve : { width:4, color:"#333", cap:"round" }
});
});
// scroll
$(document).ready(function() {
$('#slider').bind('slide.pathslider', function(event, slider){
var scrollPos = slider.percent * ( $('#curve')[0].scrollHeight - $(window).height() ) / 100
//$('#curve').scrollTop(scrollPos);
$('#curve').stop().animate({scrollTop: scrollPos}, 200);
});
$('#curve').scroll(function() {
curve = document.querySelectorAll('#curve')[0]
offset = curve.scrollTop / (curve.scrollHeight - curve.clientHeight) * 100;
$('#slider').getpathslider().setSlider(offset);
});
$('#slider2').bind('slide.pathslider', function(event, slider){
var scrollPos = slider.percent * ( $('#curve')[0].scrollHeight - $(window).height() ) / 100
$('#curve').stop().animate({scrollTop: scrollPos}, 200);
});
$('a.more').click(function(){
$(this).parent().next().toggle();
});
$('#paris .fr a.lang').click(function(){
$('#paris .en').toggle();
$('#paris .fr').toggle();
});
$('#paris .en a.lang').click(function(){
$('#paris .en').toggle();
$('#paris .fr').toggle();
});
});
</script>
</body>
</html>

2
relearn.2019.be/html/js/jquery-3.4.1.min.js

File diff suppressed because one or more lines are too long

402
relearn.2019.be/html/js/jquery.pathslider.js

@ -0,0 +1,402 @@
/* jQuery Pathslider v1.0.0 alpha
* By Rob Garrison (Mottie)
* MIT License
*/
(function($){
$.pathslider = function(el, options){
// To avoid scope issues, use 'base' instead of 'this'
// to reference this class from internal events and functions.
var base = this, o;
// Access to jQuery and DOM versions of element
base.$el = $(el).addClass('pathslider');
base.el = el;
// Add a reverse reference to the DOM object
base.$el.data("pathslider", base);
base.init = function(){
var t;
base.options = o = $.extend(true, {}, $.pathslider.defaults, options);
// Is there a canvas?
t = document.createElement('canvas');
base.hasCanvas = !!(t.getContext && t.getContext('2d'));
base.hasTouch = document.hasOwnProperty("ontouchend");
// add grip
base.$grip = $('<div></div>').appendTo(base.$el);
// store array of x & y positions for cross reference
base.points = [];
base.pointsxy = [];
base.arrayX = [];
base.arrayY = [];
base.arrayP = [];
base.rad2deg = 180 / Math.PI; // convert radians to degrees (multiply radian by this value)
base.sliding = false; // flag for dragging element
base.lastPercent = base.percent = o.value;
// Callbacks
// slide triggered on EVERY mouse move; change triggered on slide stop
$.each('create update start slide change stop'.split(' '), function(i,f){
if ($.isFunction(o[f])){
base.$el.bind(f + '.pathslider', o[f]);
}
});
$(document)
.bind( base.hasTouch ? 'touchend.pathslider touchcancel.pathslider' : 'mouseup.pathslider mouseleave.pathslider', function(e){
if (base.sliding) { // && ($(e.target).closest('.pathslider').length || e.type === 'mouseleave')) {
base.$el.trigger('stop.pathslider', [base]);
if (base.lastPercent !== base.percent) {
base.lastPercent = base.percent;
base.$el.trigger('change.pathslider', [base]);
}
}
base.$grip.removeClass('sliding');
base.sliding = false;
})
.bind( (base.hasTouch ? 'touchmove' : 'mousemove') + '.pathslider', function(e){
if (base.sliding) {
base.setSlider( base.findPos(e), null, true );
}
});
$(window)
.bind('resize.pathslider', function(){
base.update();
})
.bind('load', function(){
// needed because loading images/fonts will shift the page
base.sliderDim[0] = base.$el.offset().left;
base.sliderDim[1] = base.$el.offset().top;
});
base.$grip
.bind( (base.hasTouch ? 'touchstart' : 'mousedown') + '.pathslider', function(e){
base.sliding = true;
$(this).addClass('sliding');
base.$el.trigger('start.pathslider', [base]);
return false;
})
.bind('click', function(){
return false;
});
base.redraw();
base.$el.trigger('create.pathslider', [base]);
};
// update dimensions & grip position
base.update = function(){
// using attr to remove other css grip classes when updating
base.$grip.attr('class', 'pathslider-grip ' + o.gripClass);
if (base.ctx) {
// clear canvas *before* setting new dimensions
// just in case the new size is smaller than the previous
base.ctx.clearRect(0, 0, base.sliderDim[2], base.sliderDim[3]);
}
base.sliderDim = [
base.$el.offset().left,
base.$el.offset().top,
base.$el.width(),
base.$el.height()
];
// get grip dimensions; jQuery v3+ width() & height() return the rotated dimensions
// which we don't want!
var computedStyle = window.getComputedStyle(base.$grip[0]);
// for centering grip
base.gripCenter = [ parseInt(computedStyle.width, 10)/2, parseInt(computedStyle.height, 10)/2 ];
// number of data points to store - increase to smooth the animation (based on slider size)
base.dataPoints = o.dataPoints;
// in next update add min/max/step
// base.range = o.max - o.min;
// base.dataPoints = base.range * o.step;
base.makeArray();
// save the position in the array of the starting value (roughly)
var t = $.inArray(base.percent, base.arrayP);
base.position = (t === -1) ? Math.round(base.percent/100 * base.dataPoints) : t;
base.setSlider(base.percent, null, true);
if (base.hasCanvas && o.useCanvas) { base.drawCurve(); }
};
// set position of slider
base.setSlider = function(percent, callback, internal) {
if (!isNaN(percent)) {
// find position on bezier curve; p = percent (range 0 - 100)
// set position of slider without using the array (more precision)
percent = parseFloat(percent, 10);
percent = (percent > 100) ? 100 : percent < 0 ? 0 : percent;
var css, angle,
// pos = $.inArray(percent, base.arrayP),
p = base.calcBezier(percent/100, base.pointsxy),
pm1 = (percent - 2 > 0) ? base.calcBezier( (percent-2)/100, base.pointsxy ) : p,
pp1 = (percent + 2 < 100) ? base.calcBezier( (percent+2)/100, base.pointsxy ) : p,
// m = slope of tangent - used to change rotation angle of the grip
// yes, I could have used the cubic derivative, but this is less math
m = (pp1[0] - pm1[0] === 0) ? 90 : (pp1[1] - pm1[1])/(pp1[0] - pm1[0]);
base.angle = parseInt(Math.atan(m) * base.rad2deg, 10);
angle = 'rotate(' + base.angle + 'deg)';
css = (o.rotateGrip) ? {
'-webkit-transform' : angle,
'transform' : angle
} : {};
css.left = p[0] - base.gripCenter[0];
css.top = p[1] - base.gripCenter[1];
base.$grip
.attr({
'data-angle' : base.angle,
'data-percent' : percent
})
.css(css);
// find closest percent in the array - this relies on there being a factor
// of 100 datapoints, so it'll need changing when we have a min/max/step
base.percent = percent; // Math.round(percent*r)/r;
if ((percent !== base.lastPercent && !base.sliding) || !internal) {
base.$el.trigger('change.pathslider', [base]);
}
}
if (typeof callback === 'function') { callback(base); }
};
// relative mouse position
base.mousePos = function(e) {
return [
(e.originalEvent.touches ? e.originalEvent.touches[0].pageX : e.pageX) - base.sliderDim[0],
(e.originalEvent.touches ? e.originalEvent.touches[0].pageY : e.pageY) - base.sliderDim[1]
];
};
// find percentage given the x,y coordinates
// searching through a set array of points starting from the last known position
// This allows the curve to loop over itself without mixing up intersecting points
// The biggest issue is a very sharp turn
base.findPos = function(event) {
var i, j, dx, dy, px = [], py = [],
last = base.position, //* base.dataPoints / 100,
// check x & y cross ref based on nearby positions (+/- tolerance)
t = parseInt(o.tolerance + 1, 10) || 2, // tolerance of 1 is too small
r = parseInt(o.range, 10) || base.gripCenter[0], // set to 1/2 width of grip
pos = base.mousePos(event);
// save percent
for ( i=0; i < r; i++ ){
px = []; py = [];
for ( j=0; j < t + 1; j++ ){
// check positive direction
dx = Math.abs(base.arrayX[last+j] - pos[0]) <= i;
dy = Math.abs(base.arrayY[last+j] - pos[1]) <= i;
if (dx && dy) { return base.returnPos(last+j); }
if (dx) { px.push(last+j); }
if (dy) { py.push(last+j); }
// check in negative direction
dx = Math.abs(base.arrayX[last-j] - pos[0]) <= i;
dy = Math.abs(base.arrayY[last-j] - pos[1]) <= i;
if (dx && dy) { return base.returnPos(last-j); }
if (dx) { px.push(last-j); }
if (dy) { py.push(last-j); }
}
if (px.length === 1 && py.length > 1) { return base.returnPos(px[0]); }
if (py.length === 1 && px.length > 1) { return base.returnPos(py[0]); }
}
return base.returnPos(last);
};
// return found position & trigger slide event
base.returnPos = function(p) {
var t = base.position === p;
base.percent = base.arrayP[p];
base.position = p;
if (!t) {
if (base.hasCanvas && o.useCanvas) {
base.drawCurve();
}
base.$el.trigger('slide.pathslider', [base] );
}
return base.percent;
};
// build cross-ref array - find position based on x,y coords
base.makeArray = function(){
var i, t, b = base.pointsxy,
n = base.dataPoints;
for ( i=0; i < n+1; i++ ){
t = base.calcBezier(i/n, b);
base.arrayX[i] = t[0];
base.arrayY[i] = t[1];
base.arrayP[i] = t[2];
}
};
// Calculate bezier x & y based on percentage (p)
// cubic bezier = start(p^3) + cstart(3*p^2*(1−p)) + cend(3*p*(1−p)^2) + end(1−p)^3
// b = [ startx,starty, cstartx,cstarty, cendx,cendy, endx,endy ]
base.calcBezier = function(p,b){
var p2 = p*p,
omp = (1-p), // omp = one minus p - smart naming ftw!
omp2 = omp*omp,
f1 = omp*omp2,
f2 = 3*p*omp2,
f3 = 3*p2*omp,
f4 = p*p2;
return [
Math.round(b[0]*f1 + b[2]*f2 + b[4]*f3 + b[6]*f4), // bezier x
Math.round(b[1]*f1 + b[3]*f2 + b[5]*f3 + b[7]*f4), // bezier y
Math.round(p*1000)/10 // percentage with one decimal place
];
};
// base.points = [ sx,sy, csxo,csyo, cexo,ceyo, ex,ey ]
// sx,sy = start x & y
// csxo,csyo = control start x & y offset from start point
// cexo,ceyo = control end x & y offset from end point
// ex,ey = end x & y
// convert needed for canvas - using the offset just makes the code easier to read
// base.pointsxy = [ sx, sy, csx, csy, cex, cey, ex, ey ]
base.convert2xy = function(p){
p = p || base.points;
return [
p[0], p[1], // start x,y
p[0] + p[2], p[1] + p[3], // start control x,y
p[6] + p[4], p[7] + p[5], // end control x,y
p[6], p[7] // end x,y
];
};
base.redraw = function(points) {
// update from options
base.points = base.options.points = points || base.options.points;
// store array of x & y positions for cross reference
base.pointsxy = base.convert2xy();
// update grip
base.update();
// update curve
base.drawCurve();
base.setSlider(base.percent, null, true);
};
// Make purdy curve
base.drawCurve = function() {
var ctx, grad, tmp,
points = base.pointsxy;
if (!base.$el.find('canvas').length) {
$('<canvas class="pathslider-canvas"></canvas>').appendTo(base.$el);
// size in attribute needed to keep canvas size in proportion
base.$canvas = base.$el.find('canvas').attr({ width: base.sliderDim[2], height: base.sliderDim[3] });
base.canvas = base.$canvas[0];
base.ctx = base.canvas.getContext("2d");
}
ctx = base.ctx;
ctx.clearRect(0, 0, base.sliderDim[2], base.sliderDim[3]);
ctx.lineCap = o.curve.cap;
ctx.lineJoin = o.curve.cap;
ctx.lineWidth = o.curve.width;
// this can be a gradient or image as well. See
// https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Applying_styles_and_colors
if ($.isArray(o.curve.color)) {
grad = ctx.createLinearGradient(points[0], points[1], points[6], points[7]);
tmp = base.percent/100;
grad.addColorStop(0, o.curve.color[0]);
grad.addColorStop(tmp, o.curve.color[0]);
if (tmp + 0.01 <= 1) { tmp += 0.01; }
grad.addColorStop(tmp, o.curve.color[1]);
grad.addColorStop(1, o.curve.color[1]);
ctx.strokeStyle = grad;
} else {
ctx.strokeStyle = o.curve.color;
}
tmp = true;
if (typeof o.drawCanvas === 'function') {
// return anything except false to continue drawing the curve
tmp = o.drawCanvas(base, ctx, points) !== false;
ctx = base.ctx;
}
// tmp returned from drawCanvas; if
if (tmp === true) {
base.finishCurve(ctx, points);
}
};
base.finishCurve = function(ctx, points) {
ctx = ctx || base.ctx;
points = points || base.pointsxy;
ctx.beginPath();
ctx.moveTo(points[0], points[1]);
ctx.bezierCurveTo(points[2], points[3], points[4], points[5], points[6], points[7]);
ctx.stroke();
};
// Run initializer
base.init();
};
$.pathslider.defaults = {
// Appearance
gripClass : '', // class added to the grip/handle
rotateGrip : true, // when true, the grip will rotate based on the shape of the path
// canvas curve styling
useCanvas : true,
curve : { width: 4, color: "#333", cap: "round" },
// Usability
// sx,sy = start x & y
// csxo,csyo = control start x & y offset from start point
// cexo,ceyo = control end x & y offset from end point
// ex,ey = end x & y
// [ sx,sy, csxo,csyo, cexo,ceyo, ex,ey ]
points : [ 0,50, 50,-50, -50,-50, 250,50 ],
value : 50, // starting value - range 0 - 100%
// min : 0, // minimum value on the slider
// max : 100, // maximum value on the slider
// step : 1, // step to use between min and max
// Tweaking
dataPoints: 100, // Total number of points of the curve to save; increase in increments of 100 to smooth out the grip movement, but not more than 500 (it slows everything down)
tolerance : 3, // distance on the curve from the last position to check; increase this to scroll faster
range : 30 // distance, in pixels, from the cursor to a matching x/y on the curve (should be about the same size as the grip)
};
$.fn.pathslider = function(options, callback){
return this.each(function(){
var percent, slider = $(this).data('pathslider');
// initialize the slider but prevent multiple initializations
if ((typeof(options)).match('object|undefined')){
if (!slider) {
(new $.pathslider(this, options));
} else {
return slider.redraw();
}
// If options is a number, set percentage
} else if (/\d/.test(options) && !isNaN(options) && slider) {
percent = (typeof(options) === "number") ? options : parseInt($.trim(options),10); // accepts " 2 "
// ignore out of bound percentages
if ( percent >= 0 && percent <= 100 ) {
slider.setSlider(percent, callback); // set percent & callback
}
}
});
};
$.fn.getpathslider = function(){
return this.data('pathslider');
};
})(jQuery);

BIN
relearn.2019.be/html/relearn2019.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Loading…
Cancel
Save