Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  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>
  13. Étiquette #IA
  14. — David Larlet</title>
  15. <meta name="description" content="Publications relatives au tag #IA">
  16. <!-- That good ol' feed, subscribe :). -->
  17. <link rel="alternate"
  18. type="application/atom+xml"
  19. title="Feed"
  20. href="/david/log/">
  21. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  22. <link rel="apple-touch-icon"
  23. sizes="180x180"
  24. href="/static/david/icons2/apple-touch-icon.png">
  25. <link rel="icon"
  26. type="image/png"
  27. sizes="32x32"
  28. href="/static/david/icons2/favicon-32x32.png">
  29. <link rel="icon"
  30. type="image/png"
  31. sizes="16x16"
  32. href="/static/david/icons2/favicon-16x16.png">
  33. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  34. <link rel="mask-icon"
  35. href="/static/david/icons2/safari-pinned-tab.svg"
  36. color="#07486c">
  37. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  38. <meta name="msapplication-TileColor" content="#f7f7f7">
  39. <meta name="msapplication-config"
  40. content="/static/david/icons2/browserconfig.xml">
  41. <meta name="theme-color"
  42. content="#f7f7f7"
  43. media="(prefers-color-scheme: light)">
  44. <meta name="theme-color"
  45. content="#272727"
  46. media="(prefers-color-scheme: dark)">
  47. <!-- Is that even respected? Retrospectively? What a shAItshow…
  48. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  49. <meta name="robots" content="noai, noimageai">
  50. <!-- Documented, feel free to shoot an email. -->
  51. <link rel="stylesheet" href="/static/david/css/style_2024-01-13.css">
  52. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  53. <link rel="preload"
  54. href="/static/david/css/fonts/century_supra_ot_a_regular.woff2"
  55. as="font"
  56. type="font/woff2"
  57. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  58. crossorigin>
  59. <link rel="preload"
  60. href="/static/david/css/fonts/century_supra_ot_a_bold.woff2"
  61. as="font"
  62. type="font/woff2"
  63. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  64. crossorigin>
  65. <link rel="preload"
  66. href="/static/david/css/fonts/century_supra_ot_a_italic.woff2"
  67. as="font"
  68. type="font/woff2"
  69. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  70. crossorigin>
  71. <link rel="preload"
  72. href="/static/david/css/fonts/century_supra_ot_b_regular.woff2"
  73. as="font"
  74. type="font/woff2"
  75. media="(prefers-color-scheme: dark)"
  76. crossorigin>
  77. <link rel="preload"
  78. href="/static/david/css/fonts/century_supra_ot_b_bold.woff2"
  79. as="font"
  80. type="font/woff2"
  81. media="(prefers-color-scheme: dark)"
  82. crossorigin>
  83. <link rel="preload"
  84. href="/static/david/css/fonts/century_supra_ot_b_italic.woff2"
  85. as="font"
  86. type="font/woff2"
  87. media="(prefers-color-scheme: dark)"
  88. crossorigin>
  89. <script>
  90. function toggleTheme(themeName) {
  91. document.documentElement.classList.toggle(
  92. 'forced-dark',
  93. themeName === 'dark'
  94. )
  95. document.documentElement.classList.toggle(
  96. 'forced-light',
  97. themeName === 'light'
  98. )
  99. }
  100. const selectedTheme = localStorage.getItem('theme')
  101. if (selectedTheme !== 'undefined') {
  102. toggleTheme(selectedTheme)
  103. }
  104. </script>
  105. <style type="text/css">
  106. details[open] summary {
  107. display: none;
  108. }
  109. </style>
  110. <body data-instant-intensity="viewport-all">
  111. <article>
  112. <header>
  113. <hgroup>
  114. <h1>#IA</h1>
  115. <p>Publications relatives à cette étiquette</p>
  116. </hgroup>
  117. </header>
  118. <nav>
  119. <p class="center">
  120. <a href="/david/" title="Aller à l’accueil">
  121. Accueil</a>
  122. <a rel="tags"
  123. href="/david/#tags-2024"
  124. title="Liste de toutes les étiquettes">
  125. Étiquettes</a>
  126. </p>
  127. </nav>
  128. <h2>
  129. <a href="/david/2024/01/13/" title="Lien permanent vers cet article">Wuwei</a> <time datetime="2024-01-13">13 janvier 2024</time>
  130. </h2>
  131. <blockquote>
  132. <p>Le <em>wuwei</em>, dans le taoïsme, est d’ailleurs composé de deux idéogrammes&nbsp;: le rien et la volonté. Et on sait à quel point il faut beaucoup de volonté pour revendiquer davantage de rien. Il se traduit généralement par <em>non-agir</em> ou <em>non-intervention</em>, mais cela ne signifie pas pour autant rester les bras croisés en rejetant toute nouveauté, simplement de faire des choix éclairés et de ne pas forcer le cours des choses. Se fixer des limites, distinguer ce qui relève du progrès vers une vie bonne et décente de ce qui nous aliène, savoir <em>ne pas</em> est un art de vivre au quotidien. Et je ne peux m’empêcher de penser que Bartleby devait être&nbsp;chinois.</p>
  133. <p>Décliner l’usage de ce dont on n’a pas besoin, <mark>discerner parmi les technologies celles qui risquent de faire plus de mal que de bien,</mark> voilà qui manque cruellement à notre époque où l’on a oublié que parfois ne pas nuire vaut mieux qu’agir. Il y aurait pourtant un nombre incalculable d’applications pratiques du <em>wuwei</em>, de la géo-ingénierie à l’intelligence artificielle, tant de cas où il serait bon que l’espèce humaine sache se&nbsp;retenir.</p>
  134. <p><cite><em>Alors nous irons trouver la beauté ailleurs</em>, Corinne Morel&nbsp;Darleux</cite></p>
  135. </blockquote>
  136. <p>Cette année encore, ce sera pour moi le <em>non-usage</em> de l’<a data-link-domain="simonwillison.net" href="https://simonwillison.net/2024/Jan/7/call-it-ai/">intelligence artificielle</a> <a href="/david/cache/2024/3ea27fca4fabb81676fc1b98264f3bd8/" title="Copie locale au 2024-01-13">[archive]</a> explicite qui sera mon <em>wuwei</em>. Je précise le <q lang="fr">explicite</q> car il y en a déjà plein partout dans mon téléphone et ailleurs. J’ai peut-être une des dernières générations d’appareil photo qui ne va pas adapter l’image à une norme / culture apprise. Je suis curieux d’observer le nivellement (au sens moyenne, pas forcément par le bas) que vont provoquer les <abbr title="Large Language Model">LLM</abbr> dans le domaine, peut-être deviendra-t-il plus imperceptible qu’une <a data-link-domain="theverge.com" href="https://www.theverge.com/2023/3/13/23637401/samsung-fake-moon-photos-ai-galaxy-s21-s23-ultra">lune</a> <a href="/david/cache/2024/e990536ed88823f047296ea25a6b7933/" title="Copie locale au 2024-01-13">[archive]</a> ou une <a data-link-domain="theverge.com" href="https://www.theverge.com/2023/12/2/23985299/iphone-bridal-photo-three-poses-explanation-panorama-photoshop-generative-ai">mariée</a> <a href="/david/cache/2024/668d0f82ae65b0e94ea76145057759a7/" title="Copie locale au 2024-01-13">[archive]</a> mais il sera toujours&nbsp;là.</p>
  137. <p>Ce <strong>explicite</strong> correspond principalement pour moi à des <em>prompts</em> qui m’aideraient à coder. Je regarde ce qui se fait dans le domaine et j’en vois l’intérêt mais je vois aussi au détriment de tout ce que cela est rendu possible. Des humains-esclaves qui modèrent ce qui est généré d’un côté, des sources d’apprentissage non consenties —&nbsp;voire privées&nbsp;— et des ressources pharaoniques pour réussir à aligner 3&nbsp;fonctions qu’il faut ensuite comprendre et adapter de toute&nbsp;façon.</p>
  138. <p>Et puis il y a toute cette zone grise, je me sers par exemple de la reconnaissance de caractère intégrée à Photos.app de macOS pour retranscrire les citations depuis des photos de passages de livres. Auparavant, je les recopiais à la main. Est-ce que cela changeait ma manière de les&nbsp;ré-interpréter&#8239;?</p>
  139. <hr />
  140. <blockquote>
  141. <p>Il nous faut trouver de nouvelles manières littéraires susceptibles de percuter sans chercher à convaincre, et déjouer le didactisme qui veut à tout prix expliquer et instruire. Peut-être faudrait-il aller jusqu’à s’imposer comme contrainte de proscrire l’usage de certains mots afin de renouveler le&nbsp;genre.</p>
  142. <p>Écologie, capitalisme, croissance, nature, social, climat, peuple, vert, environnement, progrès, révolution, biodiversité, démocratie&nbsp;: la plupart d’entre eux ne manquerait à personne tant ils ont été dévoyés et usés jusqu’à la lie. Mais notre meilleure botte est sans doute de miser sur la capacité du sensible à <em>affecter</em>.</p>
  143. <p><mark>En littérature, c’est l’empathie qui amène à la réflexion et non l’inverse.</mark> Vous pouvez développer l’argumentaire le plus serré qui soit dans un livre, je doute fort que cela fasse changer quiconque d’avis. En revanche, donnez-nous un personnage à chérir, faites-nous partager son intimité, ses émois, ses douleurs et ses joies, et il nous sera bien plus aisé de prendre en compte son point de vue, à défaut de le&nbsp;partager.</p>
  144. <p><cite><em>Ibid.</em></cite></p>
  145. </blockquote>
  146. <p>De plus en plus tenté d’explorer cette piste. Je me <a href="/david/stream/2018/11/13/">souviens</a> <a href="/david/stream/2018/11/25/">avec</a> <a href="/david/stream/2018/11/27/">émotion</a> de ma lecture de <em>Professeur cherche élève ayant désir de sauver le monde</em> par Daniel&nbsp;Quinn.</p>
  147. <nav>
  148. <p>
  149. <a href="/david/2024/ecriture/"
  150. title="Liste de tous les articles 2024 associés à cette étiquette"
  151. rel="tag">#écriture</a>
  152. <a href="/david/2024/ia/"
  153. title="Liste de tous les articles 2024 associés à cette étiquette"
  154. rel="tag">#IA</a>
  155. <a href="/david/2024/parvenir/"
  156. title="Liste de tous les articles 2024 associés à cette étiquette"
  157. rel="tag">#parvenir</a>
  158. <a href="/david/#tags-2024" title="Liste de toutes les étiquettes 2024">tous ?</a>
  159. </p>
  160. </nav>
  161. <hr>
  162. <h2>
  163. <a href="/david/2024/01/10/" title="Lien permanent vers cet article">Écriture</a> <time datetime="2024-01-10">10 janvier 2024</time>
  164. </h2>
  165. <blockquote lang="en">
  166. <p>And, I’ll assume we all agree that owning your own website is a <em>good thing</em>, and we all want more people to do&nbsp;it.</p>
  167. <p>But here’s the thing: we need more tools for it. We need simpler tools for it. And we need to make installing and using them <em>trivially simple</em>.</p>
  168. <p>We need more self-hosted platforms for personal publishing that <em>aren’t Wordpress</em>. <mark>And don’t point me to Hugo or Netlify or Eleventy or all those things - all of them are great, but none of them are simple enough.</mark> We need web publishing tools that do not require users to open the Terminal <em>at all</em>. And we need lots of&nbsp;them.</p>
  169. <p>We need a whole <em>galaxy</em> of&nbsp;options.</p>
  170. <p><cite><em><a data-link-domain="gilest.org" href="https://gilest.org/indie-easy.html">Let’s make the indie web easier</a> <a href="/david/cache/2024/faa1d8cae94da6838ff9351e5df791ca/" title="Copie locale au 2024-01-09">[archive]</a></em></cite></p>
  171. </blockquote>
  172. <p>Quelques étoiles dans la&nbsp;galaxie&nbsp;:</p>
  173. <ul>
  174. <li><a data-link-domain="atelier.scribouilli.org" href="https://atelier.scribouilli.org/">Scribouilli</a> (<a data-link-domain="github.com" href="https://github.com/Scribouilli/scribouilli">code</a>) par <a data-link-domain="lechappeebelle.team" href="https://lechappeebelle.team/">L’Échappée Belle</a>&#8239;;</li>
  175. <li><a data-link-domain="write.as" href="https://write.as/">Write.as</a> (<a data-link-domain="writefreely.org" href="https://writefreely.org/">open-source</a>) est le plus proche que je pourrais conseiller avec un support commercial de <a data-link-domain="musing.studio" href="https://musing.studio/">Musing Studio</a>&#8239;;</li>
  176. <li><a data-link-domain="masto.host" href="https://masto.host/">mastohost</a> —&nbsp;que <a data-link-domain="fedi.larlet.fr" href="https://fedi.larlet.fr/">j’utilise</a>&nbsp;— permet d’avoir son propre domaine aussi sans vraiment de connaissance technique, le support est&nbsp;réactif&#8239;;</li>
  177. <li><a data-link-domain="carrd.co" href="https://carrd.co/">Carrd</a> est revenu plusieurs fois dans ma bulle ces derniers&nbsp;temps&#8239;;</li>
  178. <li><a data-link-domain="pika.page" href="https://pika.page/">Pika</a> aussi avec une saveur plus&nbsp;humaine.</li>
  179. </ul>
  180. <p>Il y a une bonne liste dans <a data-link-domain="mastodon.social" href="https://mastodon.social/@matthiasott/111557355056827064">cette discussion</a> et une autre <a data-link-domain="robertkingett.com" href="https://robertkingett.com/links/">par ici</a> (section <q lang="en">Managed Static site hosts or Blogging platforms</q>).</p>
  181. <hr />
  182. <blockquote lang="en">
  183. <p>Among its suggestions: write a longer headline; split a six-sentence paragraph up because it’s “too long”; and replace “too complex” words like “invariably,” “notoriety,” and “modification.” Dozens of sentences were flagged as being confusing (I disagree) — and it really hated em dashes. I rewrote my prose over and over, but it didn’t seem to satisfy my robot grader. I finally chose one thought per sentence, broke up paragraphs, and replaced words with suggested keywords to get rid of the red dots signaling&nbsp;problems.</p>
  184. <p><mark>The result feels like an AI summary of my story</mark> — at any moment, a paragraph could start with “In conclusion…” or “The next thing to consider is…” The nuance, voice, and unexpected twists and turns have been snuffed out. I’m sure some people would prefer this uncomplicated, beat-by-beat version of the story, but it’s gone from being a story written by a real person to a clinical, stiff series of&nbsp;sentences.</p>
  185. <p><cite><em><a data-link-domain="theverge.com" href="https://www.theverge.com/c/23998379/google-search-seo-algorithm-webpage-optimization">The Perfect Web Page</a> <a href="/david/cache/2024/3debc675a055d691b32c7d6904531eb4/" title="Copie locale au 2024-01-09">[archive]</a></em></cite></p>
  186. </blockquote>
  187. <p>Un article de TheVerge qui risque de ne pas être très bien référencé. Le moment où l’on s’adapte pour nourrir les robots n’est pas nouveau, on a «&nbsp;juste&nbsp;» mis une nouvelle étiquette dessus en 2023&nbsp;qui permet aux robots / algorithmes de se battre entre eux de manière&nbsp;explicite.</p>
  188. <p>Pas sûr de vouloir <a data-link-domain="darkvisitors.com" href="https://darkvisitors.com/robots-txt-builder">entrer sur le ring</a> sans m’épuiser très&nbsp;vite.</p>
  189. <blockquote lang="en">
  190. <p>I propose <mark>Data Luddism</mark> as a radical response to the productive power of big data and predictive algorithms. My starting point is not the Romantic neo-Luddism of Kirkpatrick Sale but the historical Luddism of 1811-1816, and the Luddites' own rhetoric regarding their resistance to 'obnoxious&nbsp;machines'.</p>
  191. <p><cite><em><a data-link-domain="danmcquillan.org" href="https://www.danmcquillan.org/dataluddism.html">Data Luddism</a> <a href="/david/cache/2024/b1da1249f2db388d7e84d6ad23c2fc5d/" title="Copie locale au 2024-01-09">[archive]</a></em></cite></p>
  192. </blockquote>
  193. <hr />
  194. <blockquote lang="en">
  195. <p>The <code>everything</code> package and its 3,000+ sub-packages have caused a Denial of Service (DOS) for anyone who installs it. We’re talking about storage space running out and system resource&nbsp;exhaustion.</p>
  196. <p>But that’s not all. The creator took their prank to the next level by setting up http://everything.npm.lol, showcasing the chaos they unleashed. They even included a meme from Skyrim, adding some humor (or mockery, depending on your perspective) to the&nbsp;situation.</p>
  197. <p><cite><em><a data-link-domain="socket.dev" href="https://socket.dev/blog/when-everything-becomes-too-much">When “Everything” Becomes Too Much: The npm Package Chaos of 2024</a> <a href="/david/cache/2024/4a56aa5497e68df0c5bb1d5331203219/" title="Copie locale au 2024-01-09">[archive]</a></em></cite></p>
  198. </blockquote>
  199. <p><code>npm install lol</code> 🤣</p>
  200. <p>En <a data-link-domain="jop2024.lol" href="https://jop2024.lol/">parlant de lol</a>…</p>
  201. <hr />
  202. <blockquote>
  203. <p>Si les fictions, celles qu’on s’invente, celles que nous souffle notre inconscient comme celles qu’on lit, ont un rôle majeur à jouer dans la fabrique de notre rapport au monde, alors voilà qui plaide pour redoubler d’ardeur quand il s’agit de nourrir soigneusement nos imaginaires. Quand on voit les déferlements de violence et le virilisme qui caractérisent les héros modernes, on ne peut que s’interroger sur le type de rapport au monde que cela crée. C’est la raison pour laquelle <mark>la bataille culturelle passe aussi par la création de nouvelles utopies,</mark> ni niaises ni naïves, qui puissent donner d’autres matières à rêver qu’un monde dévasté et peuplé de soldats&nbsp;augmentés.</p>
  204. <p>[…] Nous avons besoin d’autres cadres de pensée dans lesquels évoluer. Nous avons besoin d’<em>ailleurs culturels</em> pour sortir de l’ornière et nous&nbsp;dérouter.</p>
  205. <p><cite><em>Alors nous irons trouver la beauté ailleurs</em>, Corinne Morel&nbsp;Darleux</cite></p>
  206. </blockquote>
  207. <p>Nous accueillons une nouvelle personne chez Scopyleft, l’occasion de former une <a href="/david/2021/03/17/">nouvelle équipe</a>. Ces <em>ailleurs culturels</em> doivent pouvoir être partagés et inspirer pour réussir à&nbsp;essaimer.</p>
  208. <p>C’est l’une de mes frustrations à ne plus <a href="/david/2021/01/26/">participer à des regroupements</a>, ne pas partager par ce biais là les expériences menées depuis 11&nbsp;ans en matière d’horizontalité et de travail en&nbsp;commun·s.</p>
  209. <hr />
  210. <blockquote lang="en">
  211. <p>So when we wonder where all the websites have gone, know it’s the <em>curators</em> we’re nostalgic for because the curators showed us the best the web had to offer once upon a time. And the curators— the tenders, aggregators, collectors, and connectors— can bring us back to something better. Because it’s still out there, we just have to find&nbsp;it.</p>
  212. <p>Here’s the best part. <mark>You can be that curator right now, at this very moment.</mark> You can start to rebuild the interconnectivity that made the web fun to explore. And you don’t need to be a computer scientist to do&nbsp;it.</p>
  213. <p><cite><em><a data-link-domain="fromjason.xyz" href="https://www.fromjason.xyz/p/notebook/where-have-all-the-websites-gone/">Where have all the websites gone?</a> <a href="/david/cache/2024/c3272392d462da90874d32841e5caac8/" title="Copie locale au 2024-01-09">[archive]</a></em></cite></p>
  214. </blockquote>
  215. <p>Dixième jour que j’ai l’impression de faire des billets trop longs. Beaucoup d’éparpillement suite à un cumul d’onglets ouverts, parfois depuis bien longtemps. Ça vous laisse un petit exercice de <q lang="en">curation</q> vous&nbsp;aussi&nbsp;:).</p>
  216. <nav>
  217. <p>
  218. <a href="/david/2024/apprentissage/"
  219. title="Liste de tous les articles 2024 associés à cette étiquette"
  220. rel="tag">#apprentissage</a>
  221. <a href="/david/2024/ecriture/"
  222. title="Liste de tous les articles 2024 associés à cette étiquette"
  223. rel="tag">#écriture</a>
  224. <a href="/david/2024/ia/"
  225. title="Liste de tous les articles 2024 associés à cette étiquette"
  226. rel="tag">#IA</a>
  227. <a href="/david/#tags-2024" title="Liste de toutes les étiquettes 2024">tous ?</a>
  228. </p>
  229. </nav>
  230. <hr>
  231. </article>
  232. <hr>
  233. <footer>
  234. <p>
  235. <nobr>
  236. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  237. </nobr>
  238. <nobr>
  239. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  240. </nobr>
  241. <nobr>
  242. <a href="http://larlet.com"
  243. title="Go to my English profile"
  244. data-instant>Pro</a>
  245. </nobr>
  246. <nobr>
  247. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  248. </nobr>
  249. <nobr>
  250. <abbr class="nowrap"
  251. title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  252. </nobr>
  253. </p>
  254. <template id="theme-selector">
  255. <form>
  256. <style type="text/css">
  257. fieldset {
  258. text-align: center;
  259. }
  260. </style>
  261. <fieldset>
  262. <legend>Thème
  263. </legend>
  264. <label>
  265. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  266. Auto
  267. </label>
  268. <label>
  269. <input type="radio" value="dark" name="chosen-color-scheme">
  270. Foncé
  271. </label>
  272. <label>
  273. <input type="radio" value="light" name="chosen-color-scheme">
  274. Clair
  275. </label>
  276. </fieldset>
  277. </form>
  278. </template>
  279. </footer>
  280. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  281. <script>
  282. class ThemeToggle extends HTMLElement {
  283. constructor() {
  284. super()
  285. const themeSelectorTemplate = document.querySelector('#theme-selector')
  286. const form = themeSelectorTemplate.content.firstElementChild
  287. this.attachShadow({ mode: 'open' })
  288. this.shadowRoot.appendChild(form.cloneNode(true))
  289. }
  290. connectedCallback() {
  291. const form = this.shadowRoot.querySelector('form')
  292. form.addEventListener('change', (e) => {
  293. const chosenColorScheme = e.target.value
  294. localStorage.setItem('theme', chosenColorScheme)
  295. toggleTheme(chosenColorScheme)
  296. })
  297. const selectedTheme = localStorage.getItem('theme')
  298. if (selectedTheme && selectedTheme !== 'undefined') {
  299. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  300. }
  301. }
  302. }
  303. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  304. window.addEventListener('load', () => {
  305. let colorsLayer = undefined
  306. let hasDarkRules = false
  307. for (const styleSheet of Array.from(document.styleSheets)) {
  308. let mediaRules = []
  309. for (const layerRule of styleSheet.cssRules) {
  310. if (!(layerRule instanceof CSSLayerBlockRule)) {
  311. continue
  312. }
  313. if (layerRule.name === 'colors') {
  314. colorsLayer = layerRule
  315. }
  316. for (const cssRule of layerRule.cssRules) {
  317. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  318. continue
  319. }
  320. // WARNING: Safari does not have/supports `conditionText`.
  321. if (cssRule.conditionText) {
  322. if (cssRule.conditionText !== prefersColorSchemeDark) {
  323. continue
  324. }
  325. } else {
  326. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  327. continue
  328. }
  329. }
  330. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  331. }
  332. }
  333. // WARNING: do not try to insert a Rule to a styleSheet you are
  334. // currently iterating on, otherwise the browser will be stuck
  335. // in a infinite loop…
  336. for (const mediaRule of mediaRules) {
  337. // Safari requires the `0` second parameter (even if default).
  338. colorsLayer.insertRule(mediaRule.cssText, 0)
  339. hasDarkRules = true
  340. }
  341. }
  342. if (hasDarkRules) {
  343. if ('customElements' in window && !customElements.get('theme-toggle')) {
  344. customElements.define('theme-toggle', ThemeToggle)
  345. }
  346. }
  347. })
  348. </script>
  349. </body>
  350. </html>