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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  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. Écriture
  14. — David Larlet</title>
  15. <script>
  16. function toggleTheme(themeName) {
  17. document.documentElement.classList.toggle(
  18. 'forced-dark',
  19. themeName === 'dark'
  20. )
  21. document.documentElement.classList.toggle(
  22. 'forced-light',
  23. themeName === 'light'
  24. )
  25. }
  26. const selectedTheme = localStorage.getItem('theme')
  27. if (selectedTheme !== 'undefined') {
  28. toggleTheme(selectedTheme)
  29. }
  30. </script>
  31. <!-- Documented, feel free to shoot an email. -->
  32. <link rel="stylesheet" href="/static/david/css/style_2024-03-09.css">
  33. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  34. <link rel="preload"
  35. href="/static/david/css/fonts/century_supra_ot_a_regular.woff2"
  36. as="font"
  37. type="font/woff2"
  38. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  39. crossorigin>
  40. <link rel="preload"
  41. href="/static/david/css/fonts/century_supra_ot_a_bold.woff2"
  42. as="font"
  43. type="font/woff2"
  44. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  45. crossorigin>
  46. <link rel="preload"
  47. href="/static/david/css/fonts/century_supra_ot_a_italic.woff2"
  48. as="font"
  49. type="font/woff2"
  50. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  51. crossorigin>
  52. <link rel="preload"
  53. href="/static/david/css/fonts/century_supra_ot_b_regular.woff2"
  54. as="font"
  55. type="font/woff2"
  56. media="(prefers-color-scheme: dark)"
  57. crossorigin>
  58. <link rel="preload"
  59. href="/static/david/css/fonts/century_supra_ot_b_bold.woff2"
  60. as="font"
  61. type="font/woff2"
  62. media="(prefers-color-scheme: dark)"
  63. crossorigin>
  64. <link rel="preload"
  65. href="/static/david/css/fonts/century_supra_ot_b_italic.woff2"
  66. as="font"
  67. type="font/woff2"
  68. media="(prefers-color-scheme: dark)"
  69. crossorigin>
  70. <meta name="description" content="And, I’ll assume we all agree that owning your own website is a good thing, and we all want more people to do it.">
  71. <!-- That good ol' feed, subscribe :). -->
  72. <link rel="alternate"
  73. type="application/atom+xml"
  74. title="Feed"
  75. href="/david/log/">
  76. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  77. <link rel="apple-touch-icon"
  78. sizes="180x180"
  79. href="/static/david/icons2/apple-touch-icon.png">
  80. <link rel="icon"
  81. type="image/png"
  82. sizes="32x32"
  83. href="/static/david/icons2/favicon-32x32.png">
  84. <link rel="icon"
  85. type="image/png"
  86. sizes="16x16"
  87. href="/static/david/icons2/favicon-16x16.png">
  88. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  89. <link rel="mask-icon"
  90. href="/static/david/icons2/safari-pinned-tab.svg"
  91. color="#07486c">
  92. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  93. <meta name="msapplication-TileColor" content="#f7f7f7">
  94. <meta name="msapplication-config"
  95. content="/static/david/icons2/browserconfig.xml">
  96. <meta name="theme-color"
  97. content="#f7f7f7"
  98. media="(prefers-color-scheme: light)">
  99. <meta name="theme-color"
  100. content="#272727"
  101. media="(prefers-color-scheme: dark)">
  102. <!-- Is that even respected? Retrospectively? What a shAItshow…
  103. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  104. <meta name="robots" content="noai, noimageai">
  105. <!-- To get attribution when linking on mastodon. -->
  106. <meta name="fediverse:creator" content="@david@larlet.fr">
  107. <style type="text/css">
  108. .tippy-content {
  109. min-width: 280px;
  110. padding: .5rem;
  111. font-size: calc(var(--fluid-0) * 0.8);
  112. font-family: var(--labor-font);
  113. letter-spacing: initial;
  114. text-align: left;
  115. }
  116. .tippy-content h3 {
  117. margin-top: 0;
  118. }
  119. .tippy-content h3 img {
  120. max-width: 2rem;
  121. max-height: 2rem;
  122. display: inline-block;
  123. }
  124. .tippy-content .tippy-links {
  125. display: flex;
  126. justify-content: space-around;
  127. }
  128. .tippy-content a {
  129. padding: .4rem;
  130. color: #F06048;
  131. }
  132. </style>
  133. <body data-instant-intensity="viewport-all">
  134. <article>
  135. <header>
  136. <hgroup>
  137. <h1>Écriture</h1>
  138. <p>Le <time datetime="2024-01-10">10 janvier 2024</time></p>
  139. </hgroup>
  140. </header>
  141. <nav>
  142. <p>
  143. <a rel="prev"
  144. href="/david/2024/01/09/"
  145. title="Publication précédente : Blessure">← Précédent</a> •
  146. <a href="/david/" title="Aller à l’accueil" rel="up">Accueil</a>
  147. <a href="/david/recherche/"
  148. title="Aller à la page de recherche"
  149. rel="search" data-no-instant>Recherche</a>
  150. • <a rel="next"
  151. href="/david/2024/01/11/"
  152. title="Publication suivante : Impact">Suivant →</a>
  153. </p>
  154. </nav>
  155. <blockquote lang="en">
  156. <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>
  157. <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>
  158. <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>
  159. <p>We need a whole <em>galaxy</em> of&nbsp;options.</p>
  160. <p><cite><em><a data-link-domain="gilest.org" href="https://gilest.org/indie-easy.html" hreflang="en"
  161. title="Consultation de l’article (anglais)">Let’s make the indie web easier</a>
  162. <a href="/david/cache/2024/faa1d8cae94da6838ff9351e5df791ca/" hreflang="en"
  163. data-tippy data-description=""
  164. data-source="https://gilest.org/indie-easy.html"
  165. data-date="2024-01-09"
  166. data-favicon="https://gilest.org/favicon.ico"
  167. data-domain="gilest.org"
  168. ><svg xmlns="http://www.w3.org/2000/svg"
  169. width="24" height="24" viewBox="0 0 24 24" fill="none"
  170. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  171. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  172. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  173. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  174. </svg>
  175. <span class="sr-only">[archive]</span></a></em></cite></p>
  176. </blockquote>
  177. <p>Quelques étoiles dans la&nbsp;galaxie&nbsp;:</p>
  178. <ul>
  179. <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>
  180. <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>
  181. <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>
  182. <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>
  183. <li><a data-link-domain="pika.page" href="https://pika.page/">Pika</a> aussi avec une saveur plus&nbsp;humaine.</li>
  184. </ul>
  185. <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>
  186. <a href="#hr-21" title="Lien vers cette section de la page"><hr id="hr-21" /></a>
  187. <blockquote lang="en">
  188. <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>
  189. <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>
  190. <p><cite><em><a data-link-domain="theverge.com" href="https://www.theverge.com/c/23998379/google-search-seo-algorithm-webpage-optimization" hreflang="en"
  191. title="Consultation de l’article (anglais)">The Perfect Web Page</a>
  192. <a href="/david/cache/2024/3debc675a055d691b32c7d6904531eb4/" hreflang="en"
  193. data-tippy data-description="How the internet reshaped itself around Google’s search algorithms — and into a world where websites look the same."
  194. data-source="https://www.theverge.com/c/23998379/google-search-seo-algorithm-webpage-optimization"
  195. data-date="2024-01-09"
  196. data-favicon="https://cdn.vox-cdn.com/uploads/chorus_asset/file/23989695/favicon_32x32.png"
  197. data-domain="theverge.com"
  198. ><svg xmlns="http://www.w3.org/2000/svg"
  199. width="24" height="24" viewBox="0 0 24 24" fill="none"
  200. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  201. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  202. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  203. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  204. </svg>
  205. <span class="sr-only">[archive]</span></a></em></cite></p>
  206. </blockquote>
  207. <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>
  208. <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>
  209. <blockquote lang="en">
  210. <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>
  211. <p><cite><em><a data-link-domain="danmcquillan.org" href="https://www.danmcquillan.org/dataluddism.html" hreflang="en"
  212. title="Consultation de l’article (anglais)">Data Luddism</a>
  213. <a href="/david/cache/2024/b1da1249f2db388d7e84d6ad23c2fc5d/" hreflang="en"
  214. data-tippy data-description=""
  215. data-source="https://www.danmcquillan.org/dataluddism.html"
  216. data-date="2024-01-09"
  217. data-favicon=""
  218. data-domain="danmcquillan.org"
  219. ><svg xmlns="http://www.w3.org/2000/svg"
  220. width="24" height="24" viewBox="0 0 24 24" fill="none"
  221. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  222. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  223. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  224. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  225. </svg>
  226. <span class="sr-only">[archive]</span></a></em></cite></p>
  227. </blockquote>
  228. <a href="#hr-22" title="Lien vers cette section de la page"><hr id="hr-22" /></a>
  229. <blockquote lang="en">
  230. <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>
  231. <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>
  232. <p><cite><em><a data-link-domain="socket.dev" href="https://socket.dev/blog/when-everything-becomes-too-much" hreflang="en"
  233. title="Consultation de l’article (anglais)">When “Everything” Becomes Too Much: The npm Package Chaos of 2024</a>
  234. <a href="/david/cache/2024/4a56aa5497e68df0c5bb1d5331203219/" hreflang="en"
  235. data-tippy data-description="An NPM user named PatrickJS launched a troll campaign with a package called everything, which depends on all public npm packages."
  236. data-source="https://socket.dev/blog/when-everything-becomes-too-much"
  237. data-date="2024-01-09"
  238. data-favicon="https://socket.dev/favicon-32x32.png"
  239. data-domain="socket.dev"
  240. ><svg xmlns="http://www.w3.org/2000/svg"
  241. width="24" height="24" viewBox="0 0 24 24" fill="none"
  242. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  243. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  244. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  245. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  246. </svg>
  247. <span class="sr-only">[archive]</span></a></em></cite></p>
  248. </blockquote>
  249. <p><code>npm install lol</code> 🤣</p>
  250. <p>En <a data-link-domain="jop2024.lol" href="https://jop2024.lol/">parlant de lol</a>…</p>
  251. <a href="#hr-23" title="Lien vers cette section de la page"><hr id="hr-23" /></a>
  252. <blockquote>
  253. <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>
  254. <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>
  255. <p><cite><em>Alors nous irons trouver la beauté ailleurs</em>, Corinne Morel&nbsp;Darleux</cite></p>
  256. </blockquote>
  257. <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>
  258. <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>
  259. <a href="#hr-24" title="Lien vers cette section de la page"><hr id="hr-24" /></a>
  260. <blockquote lang="en">
  261. <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>
  262. <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>
  263. <p><cite><em><a data-link-domain="fromjason.xyz" href="https://www.fromjason.xyz/p/notebook/where-have-all-the-websites-gone/" hreflang="en"
  264. title="Consultation de l’article (anglais)">Where have all the websites gone?</a>
  265. <a href="/david/cache/2024/c3272392d462da90874d32841e5caac8/" hreflang="en"
  266. data-tippy data-description="It feels like all the cool websites from the late 2000s are gone. But maybe we are looking at this the wrong way. Maybe it is us who vanished."
  267. data-source="https://www.fromjason.xyz/p/notebook/where-have-all-the-websites-gone/"
  268. data-date="2024-01-09"
  269. data-favicon="https://www.fromjason.xyz/img/favicon.png"
  270. data-domain="fromjason.xyz"
  271. ><svg xmlns="http://www.w3.org/2000/svg"
  272. width="24" height="24" viewBox="0 0 24 24" fill="none"
  273. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  274. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  275. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  276. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  277. </svg>
  278. <span class="sr-only">[archive]</span></a></em></cite></p>
  279. </blockquote>
  280. <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>
  281. <nav>
  282. <p>
  283. <a href="/david/2024/apprentissage/"
  284. title="Liste de tous les articles 2024 associés à cette étiquette"
  285. rel="tag">#apprentissage</a>
  286. <a href="/david/2024/ecriture/"
  287. title="Liste de tous les articles 2024 associés à cette étiquette"
  288. rel="tag">#écriture</a>
  289. <a href="/david/2024/ia/"
  290. title="Liste de tous les articles 2024 associés à cette étiquette"
  291. rel="tag">#IA</a>
  292. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  293. </p>
  294. </nav>
  295. <nav>
  296. <p>
  297. <a rel="prev"
  298. href="/david/2024/01/09/"
  299. title="Publication précédente : Blessure">← Précédent</a> •
  300. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  301. • <a rel="next"
  302. href="/david/2024/01/11/"
  303. title="Publication suivante : Impact">Suivant →</a>
  304. </p>
  305. </nav>
  306. <form action="/david/recherche/" method="get">
  307. <fieldset>
  308. <legend>Recherche</legend>
  309. <label for="input-search">Termes de votre recherche :</label>
  310. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  311. <input type="submit" value="Chercher">
  312. <p id="indexation-infos">
  313. <small>
  314. Seuls les contenus de ces 8 dernières années sont indexés.
  315. </small>
  316. </p>
  317. </fieldset>
  318. </form>
  319. <aside>
  320. <theme-toggle></theme-toggle>
  321. </aside>
  322. </article>
  323. <hr>
  324. <footer>
  325. <p>
  326. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  327. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  328. <a href="http://larlet.com"
  329. title="Go to my English profile"
  330. data-instant>Pro</a>
  331. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  332. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  333. </p>
  334. <template id="theme-selector">
  335. <form>
  336. <style type="text/css">
  337. fieldset div {
  338. text-align: center;
  339. }
  340. </style>
  341. <fieldset>
  342. <legend>Thème</legend>
  343. <div>
  344. <label>
  345. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  346. Auto
  347. </label>
  348. <label>
  349. <input type="radio" value="dark" name="chosen-color-scheme">
  350. Foncé
  351. </label>
  352. <label>
  353. <input type="radio" value="light" name="chosen-color-scheme">
  354. Clair
  355. </label>
  356. </div>
  357. </fieldset>
  358. </form>
  359. </template>
  360. </footer>
  361. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  362. <script>
  363. class ThemeToggle extends HTMLElement {
  364. constructor() {
  365. super()
  366. const themeSelectorTemplate = document.querySelector('#theme-selector')
  367. const form = themeSelectorTemplate.content.firstElementChild
  368. this.attachShadow({ mode: 'open' })
  369. this.shadowRoot.appendChild(form.cloneNode(true))
  370. }
  371. connectedCallback() {
  372. const form = this.shadowRoot.querySelector('form')
  373. form.addEventListener('change', (e) => {
  374. const chosenColorScheme = e.target.value
  375. localStorage.setItem('theme', chosenColorScheme)
  376. toggleTheme(chosenColorScheme)
  377. })
  378. const selectedTheme = localStorage.getItem('theme')
  379. if (selectedTheme && selectedTheme !== 'undefined') {
  380. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  381. }
  382. }
  383. }
  384. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  385. window.addEventListener('load', () => {
  386. let colorsLayer = undefined
  387. let hasDarkRules = false
  388. for (const styleSheet of Array.from(document.styleSheets)) {
  389. let mediaRules = []
  390. for (const layerRule of styleSheet.cssRules) {
  391. if (!(layerRule instanceof CSSLayerBlockRule)) {
  392. continue
  393. }
  394. if (layerRule.name === 'colors') {
  395. colorsLayer = layerRule
  396. }
  397. for (const cssRule of layerRule.cssRules) {
  398. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  399. continue
  400. }
  401. // WARNING: Safari does not have/supports `conditionText`.
  402. if (cssRule.conditionText) {
  403. if (cssRule.conditionText !== prefersColorSchemeDark) {
  404. continue
  405. }
  406. } else {
  407. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  408. continue
  409. }
  410. }
  411. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  412. }
  413. }
  414. // WARNING: do not try to insert a Rule to a styleSheet you are
  415. // currently iterating on, otherwise the browser will be stuck
  416. // in a infinite loop…
  417. for (const mediaRule of mediaRules) {
  418. // Safari requires the `0` second parameter (even if default).
  419. colorsLayer.insertRule(mediaRule.cssText, 0)
  420. hasDarkRules = true
  421. }
  422. }
  423. if (hasDarkRules) {
  424. if ('customElements' in window && !customElements.get('theme-toggle')) {
  425. customElements.define('theme-toggle', ThemeToggle)
  426. }
  427. }
  428. })
  429. </script>
  430. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  431. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  432. <script>
  433. tippy('[data-tippy]', {
  434. content(reference) {
  435. reference.addEventListener('click', (e) => e.preventDefault())
  436. return `
  437. <h3 lang="fr">
  438. <img src="${reference.dataset.favicon}" loading="lazy">
  439. <a href="${reference.dataset.source}"
  440. >Article sur ${reference.dataset.domain}</a></h3>
  441. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  442. <div class="tippy-links" lang="fr">
  443. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  444. </div>
  445. `
  446. },
  447. allowHTML: true,
  448. interactive: true,
  449. delay: [150, 700],
  450. hideOnClick: false
  451. })
  452. </script>
  453. <script type="module">
  454. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  455. const markObserver = new IntersectionObserver((entries, observer) => {
  456. const computedStyle = getComputedStyle(document.documentElement)
  457. const markBackground = computedStyle.getPropertyValue('--mark-background')
  458. for (const entry of entries) {
  459. if (entry.intersectionRatio === 0) continue
  460. const markElement = entry.target
  461. markElement.style.backgroundColor = 'inherit'
  462. const annotation = annotate(
  463. markElement, {
  464. type: 'highlight',
  465. multiline: true,
  466. color: markBackground,
  467. // animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  468. animate: false
  469. }
  470. )
  471. annotation.show()
  472. observer.unobserve(markElement)
  473. }
  474. }, {threshold: 1.0})
  475. for (const markElement of document.querySelectorAll('mark')) {
  476. markObserver.observe(markElement)
  477. }
  478. </script>
  479. </body>
  480. </html>