123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- <!DOCTYPE html><!-- This is a valid HTML5 document. -->
- <!-- Screen readers, SEO, extensions and so on. -->
- <html lang="fr">
- <!-- Has to be within the first 1024 bytes, hence before the `title` element
- See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
- <meta charset="utf-8">
- <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
- <!-- The viewport meta is quite crowded and we are responsible for that.
- See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <!-- Required to make a valid HTML5 document. -->
- <title>
- Tag #simplicité
- — David Larlet</title>
- <meta name="description" content="Publications relatives au tag #simplicité">
- <!-- That good ol' feed, subscribe :). -->
- <link rel="alternate"
- type="application/atom+xml"
- title="Feed"
- href="/david/log/">
- <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
- <link rel="apple-touch-icon"
- sizes="180x180"
- href="/static/david/icons2/apple-touch-icon.png">
- <link rel="icon"
- type="image/png"
- sizes="32x32"
- href="/static/david/icons2/favicon-32x32.png">
- <link rel="icon"
- type="image/png"
- sizes="16x16"
- href="/static/david/icons2/favicon-16x16.png">
- <link rel="manifest" href="/static/david/icons2/site.webmanifest">
- <link rel="mask-icon"
- href="/static/david/icons2/safari-pinned-tab.svg"
- color="#07486c">
- <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
- <meta name="msapplication-TileColor" content="#f7f7f7">
- <meta name="msapplication-config"
- content="/static/david/icons2/browserconfig.xml">
- <meta name="theme-color"
- content="#f7f7f7"
- media="(prefers-color-scheme: light)">
- <meta name="theme-color"
- content="#272727"
- media="(prefers-color-scheme: dark)">
- <!-- Is that even respected? Retrospectively? What a shAItshow…
- https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
- <meta name="robots" content="noai, noimageai">
- <!-- Documented, feel free to shoot an email. -->
- <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
- <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
- <link rel="preload"
- href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2"
- as="font"
- type="font/woff2"
- media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
- crossorigin>
- <link rel="preload"
- href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2"
- as="font"
- type="font/woff2"
- media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
- crossorigin>
- <link rel="preload"
- href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2"
- as="font"
- type="font/woff2"
- media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
- crossorigin>
- <link rel="preload"
- href="/static/david/css/fonts/triplicate_t3_regular.woff2"
- as="font"
- type="font/woff2"
- media="(prefers-color-scheme: dark)"
- crossorigin>
- <link rel="preload"
- href="/static/david/css/fonts/triplicate_t3_bold.woff2"
- as="font"
- type="font/woff2"
- media="(prefers-color-scheme: dark)"
- crossorigin>
- <link rel="preload"
- href="/static/david/css/fonts/triplicate_t3_italic.woff2"
- as="font"
- type="font/woff2"
- media="(prefers-color-scheme: dark)"
- crossorigin>
- <script>
- function toggleTheme(themeName) {
- document.documentElement.classList.toggle(
- 'forced-dark',
- themeName === 'dark'
- )
- document.documentElement.classList.toggle(
- 'forced-light',
- themeName === 'light'
- )
- }
- const selectedTheme = localStorage.getItem('theme')
- if (selectedTheme !== 'undefined') {
- toggleTheme(selectedTheme)
- }
- </script>
-
- <style type="text/css">
- details[open] summary {
- display: none;
- }
- </style>
-
- <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick"
- data-instant-intensity="viewport-all">
-
- <header>
- <h1>Publications relatives au tag #simplicité</h1>
- </header>
- <nav>
- <p class="center">
- <a href="/david/" title="Aller à l’accueil">
- <svg class="icon icon-home">
- <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
- </svg>
- Accueil</a>
- • <a rel="tags"
- href="/david/#tags-2023"
- title="Liste de toutes les étiquettes">
- <svg class="icon icon-tags">
- <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-tags"></use>
- </svg>
- Étiquettes</a>
- </p>
- </nav>
- <hr>
- <main>
- <p>Les plus récentes en premier, les 3 premières sont dépliées et ensuite c’est à la demande, bonne exploration !</p>
-
- <h2>
- <a href="/david/2023/06/19/" title="Lien permanent vers cet article">Village</a> (2023-06-19)
- </h2>
-
-
-
- <blockquote lang="en">
- <p>Because they are precious, it’s important to understand what makes a village a village, and what kills the village.</p>
- <p>The central thesis is that what these villages can’t tolerate is a sustained large influx of strangers. A stranger in this context is an nothing more or less than an unfamiliar face. I know it tends to draw the mind in those directions, but please refrain from projecting concepts such as nationality or ethnicity on the term. We’re all simultaneously villagers and strangers in various social circumstances.</p>
- <p>A slow trickle of strangers is tolerable, a brief large influx is fine; the strangers’ average interaction is eventually stabilizes and biases toward the a stable group of members, and they quickly find shared values and become villagers too. They become familiar faces, and undoubtedly make their mark on the shared culture. That’s often a refreshing and welcome thing. It’s still a village.</p>
- <p>When sustained growth is too large, the strangers’ average interaction is with other strangers, and even if this would have eventually stabilized into something like a village, there are yet more strangers to prevent this from happening. Everyone stays strangers, and a sort of stranger-culture emerges where guards are up by default because there are never any familiar faces.</p>
- <p><mark>It’s no longer a village, but something like a train station.</mark> The default mode of being is <em>passing through</em>. People come and go, and there’s no real sense of belonging. There is a sense of anonymity, there are no lasting repercussions for cutting in line or being rude.</p>
- <p>It’s an oppressive, alienating, and disempowering environment.</p>
- <p><cite><em><a href="https://www.marginalia.nu/log/82_killing_community/">Killing Community</a></em> (<a href="/david/cache/2023/e6c79911a93db53d87a80281d0037b97/">cache</a>)</cite></p>
- </blockquote>
- <p>Cet article parle de Reddit mais je ressens très fort la transformation qui s’est opérée au sein de Mastodon, d’un village en une gare. Il m’a fallu <a href="/david/2022/11/12/">6 mois</a> pour prendre le train et retourner dans ma grotte.</p>
- <p>Dans cet espace, je réfléchis beaucoup à cette différence de se sentir <a href="https://sive.rs/below-average">en-dessous de la moyenne</a> (<a href="/david/cache/2023/4d9148b9d78455c2d67051e467d2e824/">cache</a>). Et ce changement de point de vue me fait aussi reconsidérer mes dépendances et mes incompétences. Ce n’est pas cet atelier vélo qui est mauvais, ce sont mes choix techniques qui m’ont rendu incompétent face aux pannes actuelles qui demandent davantage d’outillage et d’expérience. Etc.</p>
- <p>En ce moment, je travaille avec <a href="https://www.croix-rouge.fr/">La Croix-Rouge française</a>, le <a href="https://labrri.net/">Laboratoire de recherche en relations interculturelles de l’Université de Montréal</a> et surtout <a href="https://github.com/umap-project/umap/">uMap</a> et son essaimage, autant de projets et d’explorations qui redonnent du sens à mes investissements dans le numérique. Il faudrait que je prenne le temps d’écrire à ce sujet, j’aurais probablement des choses à partager côté évolution de Scopyleft aussi.</p>
- <p>Dans un temps et un espaces finis, il faut constamment rebâtir les chemins de sa pensée et prendre soin des relations du village. Mon activité devient alors davantage celle d’un conteur, qui se sert parfois d’outils pour mettre en musique les actions des autres.</p>
-
-
-
- <h2>
- <a href="/david/2023/06/06/" title="Lien permanent vers cet article">Réponse(s)</a> (2023-06-06)
- </h2>
-
-
-
- <blockquote>
- <p>The structures of our network commons have concentrated our responses to the forces already pressing against our livelihoods and children and futures. Within their engagement-optimized interfaces, we’ve built ourselves into a standing wave: Abusive posts became network-wide events that require a response not only from moderating authorities, but from every user.</p>
- <p>In this machine, silence transmutes to approval of the worst thing happening; via entirely real human needs for signals of safety and support, continuous attention and engagement become mandatory. Simply bad posts are opportunities for demonstrations of prowess. People we agree with become footholds for demonstrating all the subtle ways in which they don’t quite understand.</p>
- <p>[…]</p>
- <p><mark>Here in my body, I want to be more human in service of a less painfully haunted world.</mark> I want ways of being together that let us pay our respects and build different kinds of power. I want to practice being free.</p>
- <p><cite><em><a href="https://erinkissane.com/tomorrow-and-tomorrow-and-tomorrow">Erin Kissane</a></em> (<a href="/david/cache/2023/62bf3ce6ef66e39b7f250a6123d92e66/">cache</a>)</cite></p>
- </blockquote>
- <p>J’étais ceux que je suis.</p>
- <p>Je me retrouve de moins en moins sur des plateformes d’échanges instantanés — fussent-elles libres. Cela me confirme que mon problème n’est pas dans l’outil mais dans la qualité des interactions.</p>
- <p>J’ai fait un atelier où j’ai dû dire à des personnes que j’estime à voix haute que j’étais profondément injuste et que j’étais OK avec ça. C’était difficile et je n’en mesure pas encore toutes les conséquences.</p>
- <p>La résilience de mon vélo passe par ma capacité à le réparer. Avec des <em>tubeless</em> je me sens moins à l’aise, trop d’outillage devient nécessaire pour pallier un confort relatif.</p>
- <p>Dans ces moments de repli, la photographie et la poésie (re)prennent une place importance. J’aimerais en accorder plus au dessin et à la musique mais le plaisir semble encore être trop éloigné.</p>
- <p>Je me demande parfois si la publication sur le web n’est pas un de mes privilèges de plus.</p>
- <p>Je deviens ce que je ne suis plus.</p>
-
-
-
- <h2>
- <a href="/david/2023/02/18/" title="Lien permanent vers cet article">Quiz</a> (2023-02-18)
- </h2>
-
-
-
- <blockquote>
- <p>On aimerait pouvoir faire des quiz.</p>
- </blockquote>
- <p>Il y a 20 ans, j’aurais commencé à modéliser cela dans une base de données relationnelles avec les bons index et tout.</p>
- <p>Il y a 15 ans, j’aurais essayé de représenter cela avec des données liées et du RDF pour une réutilisation sémantique.</p>
- <p>Il y a 10 ans, je me serais demandé si ça pouvait rentrer dans Redis ou MongoDB et à quel point ça passerait à l’échelle.</p>
- <p>Il y a 5 ans, j’aurais imaginé une API pour pouvoir généraliser l’usage et décliner plusieurs services équivalents.</p>
- <p><strong>Et aujourd’hui alors ?</strong></p>
- <p>Je commence par me demander comment est-ce que les utilisateur·ices vont pouvoir saisir ces données et devenir autonomes.</p>
- <p>Je n’envisage pas qu’iels puissent saisir du HTML — qui plus est valide et accessible — pour concevoir ce quiz. Je me demande quelle serait la structure la plus logique pour déterminer les réponses possibles et mentionner la bonne. Il y a un enjeu de <em>feedback</em> immédiat lors de la rédaction, par exemple en <em>CommonMark</em> un peu étendu dans un <em>pad</em> ou un forge <em>git</em>. J’imagine une structure qui ressemble à :</p>
- <pre><code>Le consentement c’est :
-
- * [ ] Demander la permission
- * [x] S’assurer à tout moment que l’autre↩
- est à l’aise et désire ce qu’on lui fait
- * [ ] Peut se donner avec un peu de pression
- </code></pre>
- <p>C’est ensuite à moi de convertir cette structure plate, textuelle, relativement compréhensible en un formulaire web interactif. C’est le seul moment où la technique entre en jeux avec des dépendances aussi minimalistes que possible.</p>
- <p>Ce qui a changé en 20 ans, c’est que j’ai pris conscience que la pérennité d’une donnée tient à l’autonomie que l’on peut donner aux personnes qui vont s’assurer de son évolution. La « bonne » modélisation est celle qui est explicite et non réservée à une élite de dévelopeur·euses.</p>
- <p>Entre l’<em>User eXperience</em> (UX) et la <em>Developer eXperience</em> (DX), il y aurait peut-être la <em>Maintenance eXperience</em> (MX) ? Et dans ce contexte, l’autonomie vis-à-vis des données est cruciale. Ce n’est peut-être pas techniquement très propre, c’est difficile à mettre en valeur sur un CV ou dans une conférence, c’est même aux antipodes de la mode actuelle.</p>
- <p>Mais c’est là où je positionne ma valeur aujourd’hui. De la cathédrale qu’il faut reconstruire tous les 2 ans au refuge qui ne nécessite que quelques planches et clous en maintenance annuelle pour qu’une poignée de personnes y trouvent du réconfort. Et soient en capacité de participer à l’effort commun.</p>
- <hr />
- <p>Bandes-dessinées de la semaine :</p>
- <ul>
- <li><a href="https://editions-sarbacane.com/bd/rene-e-aux-bois-dormants">René.e aux bois dormants</a> de Elene Usdin.</li>
- <li><a href="https://ecosociete.org/livres/megantic-un-train-dans-la-nuit">Mégantic, un train dans la nuit</a> de Anne-Marie Saint-Cerny et Christian Quesnel.</li>
- </ul>
- <p>Je ne sais pas si c’est le fait de résider sur ces territoires mais les deux m’ont pas mal affecté. L’héritage de la colonisation en étant sur les lieux colonisés est encore plus difficile à porter.</p>
- <hr />
- <p>Film de la semaine : <a href="https://en.wikipedia.org/wiki/The_Menu_(2022_film)">The Menu</a> (essayez de ne pas vous divulgâcher…).</p>
- <hr />
-
- <blockquote lang="en">
- <p>💯 Always remember that although a subset of the JavaScript community can be very loud, they represent a paltry portion of the web as a whole. This means that when they say something like “Best practices don’t actually work”—what they mean is “Best practices don’t actually work for a small subset of less than 5 percent of the web”.</p>
- <p><cite><em><a href="https://andy-bell.co.uk/the-extremely-loud-minority/">The (extremely) loud minority</a></em> (<a href="/david/cache/2023/78d79db0da7f60c48a02cfd088885085/">cache</a>)</cite></p>
- </blockquote>
-
- <blockquote lang="en">
- <p>🐦 Spinners are the dumbest progress bar.</p>
- <p><cite><em><a href="https://interconnected.org/home/2023/02/10/progress">A notification center for progress bars that sounds like birdsong</a></em> (<a href="/david/cache/2023/29dac969af1faa8ba0338a2e7e59ebbd/">cache</a>)</cite></p>
- </blockquote>
-
-
-
- <h2>
- <a href="/david/2023/01/17/" title="Lien permanent vers cet article">Populaire</a> (2023-01-17)
- </h2>
-
- <details>
- <summary>Déplier pour lire le contenu de la publication</summary>
-
- <p>Plus j’en fais et plus je considère que le ski de fond est un sport populaire (dans le sens « pour le peuple »). Très peu d’équipement est nécessaire et même de la récupération permet de s’amuser, le façonnage des pistes requiert relativement peu d’énergies (fossiles), il est possible d’en faire même en étant très débutant·e et pas à l’aise avec les pentes. Ça devrait être une politique de santé publique !</p>
- <p>Alors bien sûr, un bon équipement change des choses mais la technique et l’expérience compensent tellement que ça en devient presque négligeable (en loisir). Tout le monde peut se mettre dans les rails et pousser un pied devant l’autre. Bon OK, juste à côté. C’est un excellent moyen de se mettre en confiance avant d’oser glisser. Et puis, le pas s’allonge, les bras se décrispent et se mettent en mouvement aussi, les cuisses prennent le relai, les pieds se soulèvent.</p>
- <p>Lorsqu’on commence à glisser et à trouver l’équilibre, le point d’accroche, le mouvement juste, ça procure une sensation de vol incroyable et ça permet de suer en continu (autant que la course mais avec moins d’impacts). Le matériel est léger et plutôt silencieux, les pratiquant·es courtois·es (et âgé·es, <a href="/david/2021/02/10/">en tout cas l’après-midi</a>).</p>
- <p>Je n’en dis pas plus… il risquerait d’y avoir trop de monde dans les traces 😅.</p>
- <p>PS : j’ai une petite (8 km, hamster-style) piste à 250 mètres de chez moi et je suis tellement reconnaissant à la ville de Montréal d’aménager les parcs et pistes cyclables en hiver pour glisser dans la nature urbaine 💚.</p>
- <figure>
- <a href="/static/david/2023/2023-01-13-ski-visitation1.jpg"
- title="Cliquer pour une version haute résolution">
- <img
- src="/static/david/2023/2023-01-13-ski-visitation1.jpg"
- width="2048" height="2731"
- srcset="/static/david/2023/2023-01-13-ski-visitation1.jpg 2048w, /static/david/2023/2023-01-13-ski-visitation1_660x440.jpg 660w, /static/david/2023/2023-01-13-ski-visitation1_990x660.jpg 990w, /static/david/2023/2023-01-13-ski-visitation1_1320x880.jpg 1320w"
- sizes="min(100vw, calc(100vh * 2048 / 2731))"
- loading="lazy"
- decoding="async"
- alt="Des traces de piste de ski de fond dans la tempête de neige.">
- </a>
- <figcaption>Parc de l’Île de la Visitation, Montréal, 13 janvier 2023.</figcaption>
- </figure>
- <figure>
- <a href="/static/david/2023/2023-01-13-ski-visitation2.jpg"
- title="Cliquer pour une version haute résolution">
- <img
- src="/static/david/2023/2023-01-13-ski-visitation2.jpg"
- width="2048" height="1536"
- srcset="/static/david/2023/2023-01-13-ski-visitation2.jpg 2048w, /static/david/2023/2023-01-13-ski-visitation2_660x440.jpg 660w, /static/david/2023/2023-01-13-ski-visitation2_990x660.jpg 990w, /static/david/2023/2023-01-13-ski-visitation2_1320x880.jpg 1320w"
- sizes="min(100vw, calc(100vh * 2048 / 1536))"
- loading="lazy"
- decoding="async"
- alt="Des traces de piste de ski de fond dans la tempête de neige.">
- </a>
- <figcaption>Parc de l’Île de la Visitation, Montréal, 13 janvier 2023.</figcaption>
- </figure>
- <figure>
- <a href="/static/david/2023/2023-01-13-ski-visitation3.jpg"
- title="Cliquer pour une version haute résolution">
- <img
- src="/static/david/2023/2023-01-13-ski-visitation3.jpg"
- width="2048" height="2731"
- srcset="/static/david/2023/2023-01-13-ski-visitation3.jpg 2048w, /static/david/2023/2023-01-13-ski-visitation3_660x440.jpg 660w, /static/david/2023/2023-01-13-ski-visitation3_990x660.jpg 990w, /static/david/2023/2023-01-13-ski-visitation3_1320x880.jpg 1320w"
- sizes="min(100vw, calc(100vh * 2048 / 2731))"
- loading="lazy"
- decoding="async"
- alt="Des traces de piste de ski de fond dans la tempête de neige.">
- </a>
- <figcaption>Parc de l’Île de la Visitation, Montréal, 13 janvier 2023.</figcaption>
- </figure>
- <figure>
- <a href="/static/david/2023/2023-01-13-ski-visitation4.jpg"
- title="Cliquer pour une version haute résolution">
- <img
- src="/static/david/2023/2023-01-13-ski-visitation4.jpg"
- width="2048" height="2731"
- srcset="/static/david/2023/2023-01-13-ski-visitation4.jpg 2048w, /static/david/2023/2023-01-13-ski-visitation4_660x440.jpg 660w, /static/david/2023/2023-01-13-ski-visitation4_990x660.jpg 990w, /static/david/2023/2023-01-13-ski-visitation4_1320x880.jpg 1320w"
- sizes="min(100vw, calc(100vh * 2048 / 2731))"
- loading="lazy"
- decoding="async"
- alt="Des traces de piste de ski de fond dans la tempête de neige.">
- </a>
- <figcaption>Parc de l’Île de la Visitation, Montréal, 13 janvier 2023.</figcaption>
- </figure>
- <hr />
-
- <blockquote>
- <p>Et si l’attachement à la retraite des Français ne tenait plus à l’attente d’un repos ultime au terme d’une vie laborieuse et pénible, mais à la possibilité de <mark>faire retraite dès maintenant</mark> pour se réinventer dans un travail « amélioré » ?</p>
- <p><cite><em><a href="https://www.philomag.com/articles/retraite-la-fin-du-bonheur-differe-par-denis-maillard">Retraite : la fin du “bonheur différé”, par Denis Maillard</a></em> (<a href="/david/cache/2023/614fe609b04719e7835fc0717b99c1c6/">cache</a>)</cite></p>
- </blockquote>
-
- </details>
-
-
- </main>
-
- <hr>
- <footer>
- <p>
- <nobr>
- <a href="/david/" title="Aller à l’accueil">
- <svg class="icon icon-home">
- <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-home"></use>
- </svg>
- Accueil</a>
- </nobr>
- •
- <nobr>
- <a href="/david/log/" title="Accès au flux RSS">
- <svg class="icon icon-rss2">
- <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-rss2"></use>
- </svg>
- Suivre</a>
- </nobr>
- •
- <nobr>
- <a href="http://larlet.com"
- title="Go to my English profile"
- data-instant>
- <svg class="icon icon-user-tie">
- <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-user-tie"></use>
- </svg>
- Pro</a>
- </nobr>
- •
- <nobr>
- <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">
- <svg class="icon icon-mail">
- <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-mail"></use>
- </svg>
- Email</a>
- </nobr>
- •
- <nobr>
- <abbr class="nowrap"
- title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">
- <svg class="icon icon-hammer2">
- <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-hammer2"></use>
- </svg>
- Légal</abbr>
- </nobr>
- </p>
- <template id="theme-selector">
- <form>
- <fieldset>
- <legend>
- <svg class="icon icon-brightness-contrast">
- <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-brightness-contrast"></use>
- </svg>
- Thème
- </legend>
- <label>
- <input type="radio" value="auto" name="chosen-color-scheme" checked>
- Auto
- </label>
- <label>
- <input type="radio" value="dark" name="chosen-color-scheme">
- Foncé
- </label>
- <label>
- <input type="radio" value="light" name="chosen-color-scheme">
- Clair
- </label>
- </fieldset>
- </form>
- </template>
- </footer>
- <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
- <script>
- function loadThemeForm(templateName) {
- const themeSelectorTemplate = document.querySelector(templateName)
- const form = themeSelectorTemplate.content.firstElementChild
- themeSelectorTemplate.replaceWith(form)
-
- form.addEventListener('change', (e) => {
- const chosenColorScheme = e.target.value
- localStorage.setItem('theme', chosenColorScheme)
- toggleTheme(chosenColorScheme)
- })
-
- const selectedTheme = localStorage.getItem('theme')
- if (selectedTheme && selectedTheme !== 'undefined') {
- form.querySelector(`[value="${selectedTheme}"]`).checked = true
- }
- }
-
- const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
- window.addEventListener('load', () => {
- let hasDarkRules = false
- for (const styleSheet of Array.from(document.styleSheets)) {
- let mediaRules = []
- for (const cssRule of styleSheet.cssRules) {
- if (cssRule.type !== CSSRule.MEDIA_RULE) {
- continue
- }
- // WARNING: Safari does not have/supports `conditionText`.
- if (cssRule.conditionText) {
- if (cssRule.conditionText !== prefersColorSchemeDark) {
- continue
- }
- } else {
- if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
- continue
- }
- }
- mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
- }
-
- // WARNING: do not try to insert a Rule to a styleSheet you are
- // currently iterating on, otherwise the browser will be stuck
- // in a infinite loop…
- for (const mediaRule of mediaRules) {
- styleSheet.insertRule(mediaRule.cssText)
- hasDarkRules = true
- }
- }
- if (hasDarkRules) {
- loadThemeForm('#theme-selector')
- }
- })
- </script>
-
- </body>
- </html>
|