Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

index.html 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Tag #exploration — David Larlet</title>
  13. <meta name="description" content="Publications relatives au tag #exploration">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Documented, feel free to shoot an email. -->
  28. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  29. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  30. <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>
  31. <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>
  32. <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>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  36. <script>
  37. function toggleTheme(themeName) {
  38. document.documentElement.classList.toggle(
  39. 'forced-dark',
  40. themeName === 'dark'
  41. )
  42. document.documentElement.classList.toggle(
  43. 'forced-light',
  44. themeName === 'light'
  45. )
  46. }
  47. const selectedTheme = localStorage.getItem('theme')
  48. if (selectedTheme !== 'undefined') {
  49. toggleTheme(selectedTheme)
  50. }
  51. </script>
  52. <style type="text/css">
  53. details[open] summary {
  54. display: none;
  55. }
  56. </style>
  57. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  58. <header>
  59. <h1>Publications relatives au tag #exploration</h1>
  60. </header>
  61. <nav>
  62. <p class="center">
  63. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  64. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  65. </svg> Accueil</a>
  66. • <a rel="tags" href="/david/#tags" title="Liste de toutes les étiquettes"><svg class="icon icon-tags">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-tags"></use>
  68. </svg> Étiquettes</a>
  69. </p>
  70. </nav>
  71. <hr>
  72. <main>
  73. <p>Les plus récentes en premier, les 3 premières sont dépliées et ensuite c’est à la demande, bonne exploration !</p>
  74. <h2><a href="/david/2021/10/09/" title="Lien permanent vers cet article">Slowgrégateur</a> (2021-10-09)</h2>
  75. <blockquote lang="en">
  76. <p>The current state web browsers is particularly damning from this perspective. Web browsers have access to such a treasure trove of valuable, often well-structured information about what we learn and how we think, what interests we have, and who we talk to. Rather than trying to take that information and <mark>let us build workflows out of them</mark>, browsers remain a strictly utilitarian tool – a rectangular window into documents and apps that play dumb, ignorant of the valuable information that transits through them every day. I think we can do better.</p>
  77. <p><cite><em><a href="https://thesephist.com/posts/browser/">The web browser as a tool of thought</a></em> (<a href="/david/cache/2021/ed384fc76fbe9728070efb6c71a0eb9c/">cache</a>)</cite></p>
  78. </blockquote>
  79. <p>J’ai de plus en plus envie/besoin que ce soit mon agrégateur de <a href="/david/blog/2019/flux-rss/">flux RSS</a> qui soit plus flexible. Personnaliser l’indexation, choisir de pouvoir introduire du délai entre les articles (voir plus bas), distinguer ce qui peut rester en stock sans que ce soit problématique, etc.</p>
  80. <p><a href="https://hello-bokeh.fr/">Anne-Sophie</a> me racontait qu’elle avait réussi à reconstruire un flux à partir d’un site qui donnait des conseils/tutos pour enfants avec plusieurs années de décalage pour que ça soit synchronisé avec un âge qui lui est pertinent, je trouve cela fabuleux et tellement peu mis en avant.</p>
  81. <p>Un autre exemple, lorsque je découvre un blog qui m’intéresse, je vais lire les dernières entrées mais ce qui serait pertinent serait de remonter d’anciens articles sporadiquement pour m’aider à mieux comprendre comment la personne en est arrivée là. C’est le cheminement que je trouve intéressant.</p>
  82. <p>Une dernière option, un flux de plusieurs milliers d’éléments c’est sous-optimal vu que c’est une technologie basée sur le fait de répéter des requêtes indéfiniment sur cette ressource (vs. uniquement pousser les nouveaux éléments vers les clients). En revanche, récupérer l’intégralité du stock une bonne fois pour toute afin de l’indexer et faire remonter des choses via une recherche plus ou moins intelligente, là c’est pertinent. Je ne connais pas d’option dans ces formats pour différencier ces deux usages.</p>
  83. <p>J’aurais plein d’autres idées, mon problème avec les outils actuels n’est pas liée à l’infobésité mais à la malnutriformation (?!)&nbsp;: avoir l’impression de toucher du doigt des mines d’informations et de réflexions qui sont enfouies par les 10&nbsp;dernières entrées.</p>
  84. <p><em>Je pense que l’on peut faire mieux.</em></p>
  85. <h2><a href="/david/2021/08/28/" title="Lien permanent vers cet article">Copie(s)</a> (2021-08-28)</h2>
  86. <blockquote lang="en">
  87. <p>As long as there is design, there will be copying.</p>
  88. <p><cite><em><a href="https://matthewstrom.com/writing/copying/">Copying is the way design works</a></em> (<a href="/david/cache/2021/4072b1e628106ec95319062a87d21f47/">cache</a>)</cite></p>
  89. </blockquote>
  90. <p><em>Je trouve cela d’autant plus ironique de faire une copie locale de cet article.</em></p>
  91. <p>Je parcoure de vieux onglets ces derniers jours, cela permet de mieux évaluer si ce que j’ai conservé plusieurs mois dans mon navigateur est encore pertinent. Je redécouvre des choses, je croise des aspirations passées comme apprendre le <a href="http://lvogel.free.fr/tokipona/">toki pona</a> (merci <a href="http://shl.huld.re/~f6k/">f6k</a>), des infographies du début de la pandémie, des <a href="http://www.coureursdeboises.com/img/carte.pdf">cartes de ski de fond</a> de lieux qu’il reste à explorer, pas mal d’articles autour de la <a href="https://www.pikselkraft.com/les-ressources-pour-l-ecoconception-et-la-sobriete-numerique/">sobriété</a> (<a href="/david/cache/2021/07f65527fb51a3d31cfd7173bde1d76c/">cache</a>), de la <a href="https://www.the-trouble.com/content/2021/2/11/ecosocialism-is-the-horizon-degrowth-is-the-way">décroissance</a> (<a href="/david/cache/2021/e554fd03f2342ab72115688dd258cba4/">cache</a>) et <a href="https://wiki.lescommuns.org/wiki/Low-tech_et_Communs">des communs</a> (<a href="/david/cache/2021/7a21fd7cca573df8b35b973d8ee080c8/">cache</a>), <a href="https://timdaub.github.io/2021/01/16/web-principles/">beaucoup</a> (<a href="/david/cache/2021/63317c91823b52571b851e7a27eb7b4f/">cache</a>) de <a href="https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs">technique</a> (<a href="/david/cache/2021/23d224bccb7af8db5017cebf813fec56/">cache</a>) <a href="https://bart.degoe.de/building-a-full-text-search-engine-150-lines-of-code/">bien sûr</a> (<a href="/david/cache/2021/b56bb56209a04e6144454283a22311ad/">cache</a>), des <a href="https://adamwilt.com/fieldmonitor/">outils</a> <a href="https://sites.google.com/site/starryskystacker/home">autour</a> de la photo/vidéo… et déjà pas mal de 404.</p>
  92. <p>C’est presque de la pré-archéologie.</p>
  93. <h2><a href="/david/2021/08/22/" title="Lien permanent vers cet article">Allemansrätten</a> (2021-08-22)</h2>
  94. <p>Il y a toujours un mot allemand, japonais ou… suédois pour exprimer avec concision (et exotisme&#8239;!) un concept qui n’est pas tout à fait exprimable en français, en tout cas pas en un seul mot. Ici, je parle de «&nbsp;<a href="https://fr.wikipedia.org/wiki/Droit_d%27acc%C3%A8s_%C3%A0_la_nature">Droit d’accès à la nature</a>&nbsp;» qui s’exerce à divers endroits (pays scandinaves mais pas que, la <a href="https://en.wikipedia.org/wiki/Freedom_to_roam">page wikipedia en anglais</a> est — comme souvent — plus complète) avec des contraintes différentes selon les localités. C’est un concept que je ne connaissais pas avant de m’inquiéter de cela au Canada (et de regarder des bushcrafteur·euses suédois·es sur Google Youtube).</p>
  95. <p>Ce qui s’en approche localement, c’est le concept de <a href="https://en.wikipedia.org/wiki/Crown_land">Crown land</a> qui est traduit par les <a href="https://fr.wikipedia.org/wiki/Terres_du_domaine_de_l%27%C3%89tat">Terres du domaine de l’État</a> en québécois. Je me suis mis en quête d’une carte de ces terres. Il existe un <a href="https://appli.mern.gouv.qc.ca/Rde/Info/Propos">registre dédié</a> qui fait notamment un lien vers <a href="http://legisquebec.gouv.qc.ca/fr/ShowDoc/cs/T-8.1/">le texte de loi</a>. Les terres sont peut-être visibles sur <a href="https://appli.mern.gouv.qc.ca/Infolot/">cette carte interactive</a> (avec un accès difficile) permettant de visualiser les territoires plus ou moins jaunes (habités) et <q>non organisés</q>. Je ne suis pas sûr de la façon dont le <em>Crown land</em> est représenté et s’il faut faire une requête spéciale pour un bout de terrain donné. Si j’en crois <a href="https://appli.mern.gouv.qc.ca/Rde/Documents/caractere_prive_public_rde.pdf">ce document</a>, il y aurait une notion de terres publiques/privées.</p>
  96. <p>En parallèle sur Mastodon, on me pointe <a href="https://mern.gouv.qc.ca/ministere/cartes-information-geographique/repertoire-services-web-donnees-geographiques/">cette liste de cartes</a> qui comprend notamment <a href="https://mern.gouv.qc.ca/repertoire-geographique/droits-fonciers/">celle des droits fonciers</a>. J’y découvre aussi des couches topographiques bien plus précises que ce que j’ai pu trouver par ailleurs, trop pratique pour de futures explorations&#8239;!</p>
  97. <p>Pourquoi s’intéresser à tout ceci&#8239;? J’ai toujours dans un coin de ma tête ce <a href="/david/2021/03/12/" title="Forêt">projet un peu f(l)ou</a> et j’imagine que ça serait plus cohérent en bordure d’espaces qu’il serait possible de parcourir librement. Si j’ai loupé des trucs, je veux bien apprendre.</p>
  98. <blockquote>
  99. <p>La férocité que nous manifestons à nos ennemis est toujours tempérée de la leçon que nous espérons leur donner.</p>
  100. <p><cite><em><a href="/david/2020/12/21/#dune">Dune</a> VI. La maison des mères</em>, Frank Herbert</cite></p>
  101. </blockquote>
  102. <figure>
  103. <a href="#pigeon-quebecois"
  104. title="Cliquer pour une version haute résolution">
  105. <img src="/static/david/2021/pigeon-quebecois.jpg" alt="Un pigeon avec un drapeau québécois en fond."
  106. loading="lazy" width="2048" height="1366" />
  107. </a>
  108. <a href="#_" class="lightbox" id="pigeon-quebecois">
  109. <img src="/static/david/2021/pigeon-quebecois.jpg" alt="Un pigeon avec un drapeau québécois en fond."
  110. loading="lazy" width="2048" height="1366" />
  111. </a>
  112. <figcaption>Sans commentaire.</figcaption>
  113. </figure>
  114. <h2><a href="/david/2021/08/21/" title="Lien permanent vers cet article">Électrique</a> (2021-08-21)</h2>
  115. <details>
  116. <summary>Déplier pour lire le contenu de la publication</summary>
  117. <p>En 2020, on a acheté une <a href="/david/2021/07/16/" title="Char">voiture</a> et… une brosse à dent électrique. Je vous rassure, j’ai beaucoup fait pipi sous la douche pour compenser. Je fais aussi une partie de ma lessive sous la douche (pas au même moment…), mais c’est une autre histoire. Donc, voilà, je suis passé du bambou recyclé d’Indonésie avec des poils de yacks de l’Himalaya local à un bâton de lithium extrait par des mineurs-esclaves. C’est <em>grosso modo</em> l’équivalent de passer du vélo au SUV. La bouche est bouclée (rires).</p>
  118. <p>J’en parle pour me justifier parce que c’est bien évidemment difficile à assumer… et pourtant, je n’ai jamais eu les dents aussi propres — ou du moins la sensation qu’elles le soient. À tel point que cela est devenu une nouvelle dépendance (dans le sens dont-je-pourrais-difficilement-me-passer) tellement la différence est frappante. Notamment au retour de la forêt.</p>
  119. <p>Je suis curieux de voir ce que ça donne niveau longévité, après neuf mois elle est encore en parfait état et je n’ai eu besoin que d’un embout de brosse (on partage la poignée). Six minutes par jours à faire vibrer mes dents, parfois davantage lorsque je suis en régime estival (il faudra que je parle de ça), et à méditer sur le nombre d’esclaves énergétiques qui s’activent dans ma bouche pour que je puisse me sentir propre.</p>
  120. <blockquote>
  121. <p>Nous n’enseignons pas l’histoire&#8239;; nous recréons l’expérience. Nous suivons la chaîne des conséquences — la piste de la bête dans sa forêt. Regardez au-delà de nos paroles et vous apercevrez toute l’étendue d’un comportement social qu’aucun historien n’a jamais effleuré.</p>
  122. <p><cite><em>Panoplia Propheticus B. G.</em>, <em><a href="/david/2020/12/21/#dune">Dune</a> VI. La maison des mères</em>, Frank Herbert</cite></p>
  123. </blockquote>
  124. <figure>
  125. <a href="#bouees-barrage"
  126. title="Cliquer pour une version haute résolution">
  127. <img src="/static/david/2021/bouees-barrage.jpg" alt="Une enfilade de bouées qui protègent un barrage hydro-électrique."
  128. loading="lazy" width="1366" height="2048" />
  129. </a>
  130. <a href="#_" class="lightbox" id="bouees-barrage">
  131. <img src="/static/david/2021/bouees-barrage.jpg" alt="Une enfilade de bouées qui protègent un barrage hydro-électrique."
  132. loading="lazy" width="1366" height="2048" />
  133. </a>
  134. <figcaption>Heureusement que l’électricité est très relativement « propre » dans le coin.</figcaption>
  135. </figure>
  136. </details>
  137. <h2><a href="/david/2021/05/09/" title="Lien permanent vers cet article">Reflets</a> (2021-05-09)</h2>
  138. <details>
  139. <summary>Déplier pour lire le contenu de la publication</summary>
  140. <blockquote>
  141. <p>Abandonner, n’est-ce pas fermer les yeux sur la banalité de notre existence&#8239;?</p>
  142. <p><cite><em>Encabanée</em>, Gabrielle Filteau-Chiba</cite></p>
  143. </blockquote>
  144. <p>Je continue sur ma lancée. Pour quelqu’un qui <a href="/david/2021/05/04/" title="Touriste">ne souhaitait pas partager</a>, c’est raté. J’ai pris beaucoup de plaisir à faire des photos lors de cette <a href="/david/2021/04/22/" title="Vacances">prise de soin</a>. Il y a un côté rassurant, presque thérapeutique, à se dire qu’il suffit parfois de déclencher pour ramener une image qui ne va pas demander des heures de post-production.</p>
  145. <p>Je me demande s’il y a des astuces pour transformer des bâtons de randonnée en <em>sliders</em> vidéo. Si non, ça serait probablement un projet fun avec une imprimante 3D. J’imagine deux raccords aux extrémités et de quoi fixer le trépied au milieu. La partie mobile pourrait être reprise d’une solution commerciale. À dessiner.</p>
  146. <hr />
  147. <figure>
  148. <a href="#soleil-soir"
  149. title="Cliquer pour une version haute résolution">
  150. <img src="/static/david/2021/soleil-soir.jpg" alt="Reflet du soleil sur un lac avant son coucher"
  151. loading="lazy" width="1600" height="1200" />
  152. </a>
  153. <a href="#_" class="lightbox" id="soleil-soir">
  154. <img src="/static/david/2021/soleil-soir.jpg" alt="Reflet du soleil sur un lac avant son coucher"
  155. loading="lazy" width="1600" height="1200" />
  156. </a>
  157. <figcaption>Jeux de lumières et de reflets au soleil couchant.</figcaption>
  158. </figure>
  159. <figure>
  160. <a href="#reflets-matin"
  161. title="Cliquer pour une version haute résolution">
  162. <img src="/static/david/2021/reflets-matin.jpg" alt="Reflet sur un lac de bon matin"
  163. loading="lazy" width="1600" height="1200" />
  164. </a>
  165. <a href="#_" class="lightbox" id="reflets-matin">
  166. <img src="/static/david/2021/reflets-matin.jpg" alt="Reflet sur un lac de bon matin"
  167. loading="lazy" width="1600" height="1200" />
  168. </a>
  169. <figcaption>Une envie de jouer avec l’envers du miroir.</figcaption>
  170. </figure>
  171. <figure>
  172. <a href="#reflets-nuages"
  173. title="Cliquer pour une version haute résolution">
  174. <img src="/static/david/2021/reflets-nuages.jpg" alt="Reflet de nuages sur un lac"
  175. loading="lazy" width="1600" height="1200" />
  176. </a>
  177. <a href="#_" class="lightbox" id="reflets-nuages">
  178. <img src="/static/david/2021/reflets-nuages.jpg" alt="Reflet de nuages sur un lac"
  179. loading="lazy" width="1600" height="1200" />
  180. </a>
  181. <figcaption>Les plantes s’envolent…</figcaption>
  182. </figure>
  183. <figure>
  184. <a href="#reflets-arbre"
  185. title="Cliquer pour une version haute résolution">
  186. <img src="/static/david/2021/reflets-arbre.jpg" alt="Reflet d’un arbre sur un lac"
  187. loading="lazy" width="1600" height="1200" />
  188. </a>
  189. <a href="#_" class="lightbox" id="reflets-arbre">
  190. <img src="/static/david/2021/reflets-arbre.jpg" alt="Reflet d’un arbre sur un lac"
  191. loading="lazy" width="1600" height="1200" />
  192. </a>
  193. <figcaption>…et les arbres s’abreuvent.</figcaption>
  194. </figure>
  195. </details>
  196. </main>
  197. <hr>
  198. <footer>
  199. <p>
  200. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  201. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  202. </svg> Accueil</a> •
  203. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  204. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  205. </svg> Suivre</a> •
  206. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  207. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  208. </svg> Pro</a> •
  209. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  210. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  211. </svg> Email</a> •
  212. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  213. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  214. </svg> Légal</abbr>
  215. </p>
  216. <template id="theme-selector">
  217. <form>
  218. <fieldset>
  219. <legend><svg class="icon icon-brightness-contrast">
  220. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  221. </svg> Thème</legend>
  222. <label>
  223. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  224. </label>
  225. <label>
  226. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  227. </label>
  228. <label>
  229. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  230. </label>
  231. </fieldset>
  232. </form>
  233. </template>
  234. </footer>
  235. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  236. <script>
  237. function loadThemeForm(templateName) {
  238. const themeSelectorTemplate = document.querySelector(templateName)
  239. const form = themeSelectorTemplate.content.firstElementChild
  240. themeSelectorTemplate.replaceWith(form)
  241. form.addEventListener('change', (e) => {
  242. const chosenColorScheme = e.target.value
  243. localStorage.setItem('theme', chosenColorScheme)
  244. toggleTheme(chosenColorScheme)
  245. })
  246. const selectedTheme = localStorage.getItem('theme')
  247. if (selectedTheme && selectedTheme !== 'undefined') {
  248. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  249. }
  250. }
  251. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  252. window.addEventListener('load', () => {
  253. let hasDarkRules = false
  254. for (const styleSheet of Array.from(document.styleSheets)) {
  255. let mediaRules = []
  256. for (const cssRule of styleSheet.cssRules) {
  257. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  258. continue
  259. }
  260. // WARNING: Safari does not have/supports `conditionText`.
  261. if (cssRule.conditionText) {
  262. if (cssRule.conditionText !== prefersColorSchemeDark) {
  263. continue
  264. }
  265. } else {
  266. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  267. continue
  268. }
  269. }
  270. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  271. }
  272. // WARNING: do not try to insert a Rule to a styleSheet you are
  273. // currently iterating on, otherwise the browser will be stuck
  274. // in a infinite loop…
  275. for (const mediaRule of mediaRules) {
  276. styleSheet.insertRule(mediaRule.cssText)
  277. hasDarkRules = true
  278. }
  279. }
  280. if (hasDarkRules) {
  281. loadThemeForm('#theme-selector')
  282. }
  283. })
  284. </script>
  285. </body>
  286. </html>