diff --git a/relearn.2019.be/html/css/Avara-Black.otf b/relearn.2019.be/html/css/Avara-Black.otf new file mode 100644 index 0000000..5037bf6 Binary files /dev/null and b/relearn.2019.be/html/css/Avara-Black.otf differ diff --git a/relearn.2019.be/html/css/Avara-Bold.otf b/relearn.2019.be/html/css/Avara-Bold.otf new file mode 100644 index 0000000..7a7e7c5 Binary files /dev/null and b/relearn.2019.be/html/css/Avara-Bold.otf differ diff --git a/relearn.2019.be/html/css/Avara-BoldItalic.otf b/relearn.2019.be/html/css/Avara-BoldItalic.otf new file mode 100644 index 0000000..e5351d5 Binary files /dev/null and b/relearn.2019.be/html/css/Avara-BoldItalic.otf differ diff --git a/relearn.2019.be/html/css/pathslider.css b/relearn.2019.be/html/css/pathslider.css new file mode 100644 index 0000000..ff97a79 --- /dev/null +++ b/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; +} \ No newline at end of file diff --git a/relearn.2019.be/html/css/stylesheet.css b/relearn.2019.be/html/css/stylesheet.css new file mode 100644 index 0000000..635504e --- /dev/null +++ b/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; + } + +} diff --git a/relearn.2019.be/html/css/warped.css b/relearn.2019.be/html/css/warped.css new file mode 100644 index 0000000..7121eb8 --- /dev/null +++ b/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;} diff --git a/relearn.2019.be/html/d3-example.html b/relearn.2019.be/html/d3-example.html new file mode 100644 index 0000000..0e7c777 --- /dev/null +++ b/relearn.2019.be/html/d3-example.html @@ -0,0 +1,118 @@ + + + + + + + + + + diff --git a/relearn.2019.be/html/index.html b/relearn.2019.be/html/index.html new file mode 100644 index 0000000..6d879ea --- /dev/null +++ b/relearn.2019.be/html/index.html @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + +
+ +
+ Relearn 2019 +
+
+ +
+ +
+

Relearn + + curved

+

+ 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. Read more about Relearn. +

+
+

+ 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…). +

+

+ 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. +

+
+ +
+ +

+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 ! Read more about the curve. +

+
+

Relearn 2019 is a curve, transversing multiple times and spaces.

+

+ 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. +

+
+ + + +
+

·Rotterdam

+ + +
+
Date
7th–9th June 2019
+
Location
Varia - Gouwstraat 3, Rotterdam, The Netherlands
+
Initiator
Varia
+
Contact
info@varia.zone
+
+ +
+ +

For the Rotterdam control point on the Relearn curve, we propose to together attend to a subject zone (*) where different digital network practices intersect. This subject zone can morph into multiple directions throughout the session. Our specific interest is in how publishing formats (**) operate with/on/through this zone.

+ +

* 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:

+ + +

** 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:

+ + +

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.

+ +
+ +
+ +
+

Programme

+ +

Friday 7th June
+ 20:00–22:00
+ Relearn public evening program: embed yourself into Relearn

+

Saturday–Sunday, 8–9th June
+ 10:00–18:00
+ Relearn sub-zone-trajectories

+
+ +
+

Participation

+ +

If you would like to join this Relearn session, please send an email to info@varia.zone with a short motivation of your interest. We will reply to subscriptions on a regular basis, up to the 26th of May.

+

Our capacities 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). +

+

If you would like to join us only on the Friday evening, there is no need to subscribe, just come over ! :)

+
+ +
+

Hosting

+

+We will take care of a daily vegetarian lunch (please let us know about allergies or other dietary preferences). 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 in your house.

+
+ +
+ +
+ +
Relearn Rotterdam is kindly supported by Gemeente Rotterdam & Stimuleringsfonds Creative Industrie.
+ +
+ + +
+

·Brussels

+ + +
+
Date
21st–22nd June 2019
+
Location
Hacktiris - Rue Paul Devauxstraat 3, Brussels, Belgium
+
Initiator
OSP
+
Contact
registration@relearn.be
+
+ +
+ +

+ Exploring computed layout tools. +

+

+ 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? +

+

+ 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: +

+
+
Flat
A Python library made to draw graphics but also designed to produce multi-paged PDFs.
+
Sile
A contemporary rewriting of the TeX mastodon.
+
paged.js
A Javascript polyfill of CSS official specs for printed documents.
+
+ +
+ +
+ +
+

Programme

+ +
+

Friday 21st June
+ 10:00–18:00 +

+
    +
  • Short introduction of tools
  • +
  • Choose your tool and have fun with it!
  • +
+
+ +
+

Saturday 22nd June
+ 10:00–18:00

+
    +
  • Continuation of the exploration
  • +
  • Show/tell/criticize
  • +
+
+
+ +
+

Participation

+ +

Participation is free of charge. If you would like to join this Relearn session, please send an email to miam@osp.kitchen with a short motivation of your interest. We will reply to subscriptions on a regular basis, up to the 15th of June.

+

Our capacities allow us to have a group of 12 relearners. Our preference goes out to people that can join the whole session (Friday, Saturday). +

+
+ +
+

Hosting

+

+ 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 vegetarian lunch (please let us know about allergies or other dietary preferences). 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 in your house. +

+
+
+
+ +
+

·Paris

+ +
+ EN +
+
Date
06–08 septembre 2019
+
Lieu
La Générale - 14 Avenue Parmentier, 75011 Paris, France
+
Organisateurs
Anne Laforet et Quentin Juhel
+
Contact
registration@relearn.be
+
+

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.

+

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.

+

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 :

+ +
    +
  • pratiques artistiques collaboratives en ligne : pratiques artistiques collaboratives en ligne : dessin, texte, image, interaction, etc
  • +
  • modes de publication et de transmission, en particulier le Web 2 print
  • +
  • maintenance, administration système, care et travail reproductif
  • +
  • codes de conduite, modération
  • +
  • physicalité des serveurs
  • +
  • représentations
  • +
  • écologie et serveurs
  • +
  • serveurs locaux, fédérés, féministes, etc.
  • +
+ +
+
+
+

Programme

+ +

Relearn a lieu à La Générale - 14 Avenue Parmentier, 75011 Paris, France

+ +
+

Vendredi 6 septembre — 18h → 22h
+ Table-rondes de présentation des pistes de réflexions et échanges
+ Ouvert à tou·tes, participant·es ou non à Relearn
+ Bar sur place

+
+ +
+

Samedi 7 septembre — 10h → 18h (possibilité de rester plus tard)
+ Dimanche 8 septembre — 10h → 18h
+ séances de travail collectives, par petits groupes, en parallèle
+ 18h ménage collectif
+ Gratuit sur inscription à registration@relearn.be avant le 25 août

+
+
+
+

Participation

+

Si vous souhaitez participer à cette session de Relearn, merci d'envoyer un email à registration@relearn.be avec quelques mots sur le(s) axe(s) qui vous intéressent. La date limite d'inscription est le 25 août.
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.

+
+ +
+

Accueil, hébergement

+

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).

+

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.

+
+ +

Merci d'apporter une prise multiple.

+ + +

La session parisienne de Relearn est intiée par Anne Laforet et Quentin Juhel, en discussion avec d'autres participant·es, en particulier issu·es de Relearn, Prepostprint et le Reset.

+
+
+ +
+ FR +
+
Date
06–08 September 2019
+
Location
La Générale - 14 Avenue Parmentier, 75011 Paris, France
+
Initiators
Anne Laforet and Quentin Juhel
+
Contact
registration@relearn.be
+
+ +

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.

+

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.

+

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 :

+ +
    +
  • online collaborative art practices : drawing, text, image, interaction, etc
  • +
  • modes of publication and transmission, more specifically Web 2 print
  • +
  • maintenance, system administration, care and reproductive work
  • +
  • codes of conduct, moderation
  • +
  • physicality of servers
  • +
  • representations
  • +
  • ecology and servers
  • +
  • local, federated, feminist servers...
  • +
+ +

During Relearn sessions, we challenge our ways of learning, exchanging and experimenting through feminist, open, inclusive pedagogies together.

+ +

English, French, and languages in between, are spoken at Relearn. Participants will work in small groups, in parallel sessions.

+ +

You are welcome to bring your own resources for discussions.

+ +
+
+ +
+

Programme

+

Relearn will take place at La Générale - 14 Avenue Parmentier, 75011 Paris, France

+ +
+

Friday September 6th — 18h → 22h
+ Round-tables to present threads for discussion and exchange
+ Open to everybody, Relearners and Non-relearners

+
+ +
+

Saturday September 7th — 10h → 18h (or more)
+ Sunday Septembre 8th — 10h → 18h
+ parallel work sessions in small groups
+ 18h collective cleaning
+ Free of charge upon writing to registration@relearn.be before August 25th.

+
+
+ +
+

Participation

+

To take part of this Relearn session, please send an email to registration@relearn.be with a few words describing your interests for the session. The application deadline to apply is August 25th.
Our capacities allow us to welcome a group of 50 relearners for the entire session (Friday evening, Saturday and Sunday).
For only Friday evening participation, subscribing is unnecessary, just come and join us as is! :)

+
+ +
+

Hosting

+

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.

+ +

Please bring a power strip.

+
+ + +

Relearn Paris session is initiatied by Anne Laforet et Quentin Juhel, in collaboration with other participants, specifically from Relearn, Prepostprint and le Reset.

+
+
+
+ +
+

Resources & contact

+ +
+ +
+ + + + diff --git a/relearn.2019.be/html/js/jquery-3.4.1.min.js b/relearn.2019.be/html/js/jquery-3.4.1.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/relearn.2019.be/html/js/jquery-3.4.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0').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) { + $('').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); diff --git a/relearn.2019.be/html/relearn2019.png b/relearn.2019.be/html/relearn2019.png new file mode 100644 index 0000000..79095ff Binary files /dev/null and b/relearn.2019.be/html/relearn2019.png differ