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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  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. Déploiement
  14. — David Larlet</title>
  15. <meta name="description" content="Ce qui me fait penser que cela fait plusieurs fois que je veux demander comment David déploie son site.">
  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-02-03.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. .tippy-content {
  107. min-width: 280px;
  108. padding: .5rem;
  109. font-size: calc(var(--fluid-0) * 0.8);
  110. font-family: var(--labor-font);
  111. letter-spacing: initial;
  112. text-align: left;
  113. }
  114. .tippy-content h3 {
  115. margin-top: 0;
  116. }
  117. .tippy-content h3 img {
  118. max-width: 2rem;
  119. max-height: 2rem;
  120. display: inline-block;
  121. }
  122. .tippy-content .tippy-links {
  123. display: flex;
  124. justify-content: space-around;
  125. }
  126. .tippy-content a {
  127. padding: .4rem;
  128. color: #F06048;
  129. }
  130. </style>
  131. <body data-instant-intensity="viewport-all">
  132. <article>
  133. <header>
  134. <hgroup>
  135. <h1>Déploiement</h1>
  136. <p>Le <time datetime="2024-01-29">29 janvier 2024</time></p>
  137. </hgroup>
  138. </header>
  139. <nav>
  140. <p>
  141. <a rel="prev"
  142. href="/david/2024/01/28/"
  143. title="Publication précédente : Jour&nbsp;2">← Précédent</a> •
  144. <a href="/david/" title="Aller à l’accueil" rel="up">Accueil</a>
  145. <a href="/david/recherche/"
  146. title="Aller à la page de recherche"
  147. rel="search" data-no-instant>Recherche</a>
  148. • <a rel="next"
  149. href="/david/2024/01/30/"
  150. title="Publication suivante : Équipe">Suivant →</a>
  151. </p>
  152. </nav>
  153. <blockquote>
  154. <p>Ce qui me fait penser que cela fait plusieurs fois que je veux demander comment David déploie son&nbsp;site.</p>
  155. <p><cite><em><a data-link-domain="la-grange.net" href="https://www.la-grange.net/2024/01/24/herbe" hreflang="fr"
  156. title="Consultation de l’article">herbe</a>
  157. <a href="/david/cache/2024/956819385548bba6e768563b12edc2d6/" hreflang="fr"
  158. data-tippy data-description=""
  159. data-source="https://www.la-grange.net/2024/01/24/herbe"
  160. data-date="2024-01-28"
  161. data-favicon="https://www.la-grange.net/favicon.ico"
  162. data-domain="la-grange.net"
  163. ><svg xmlns="http://www.w3.org/2000/svg"
  164. width="24" height="24" viewBox="0 0 24 24" fill="none"
  165. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  166. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  167. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  168. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  169. </svg>
  170. <span class="sr-only">[archive]</span></a></em></cite></p>
  171. </blockquote>
  172. <p>Mes <a data-link-domain="git.larlet.fr" href="https://git.larlet.fr/explore/repos">dépôts</a> contiennent le HTML généré car c’est ce que je considère comme étant la version pérenne de mes écrits donc je ne souhaite pas avoir une génération sur le serveur. Cela fait grossir le dépôt mais ça offre une tranquillité d’esprit de pouvoir observer les différences lorsque je modifie le&nbsp;moteur.</p>
  173. <p>Il se trouve que ces dépôts sont sur le même serveur que celui qui sert les pages HTML que vous voyez. Je lance donc une commande distante avec <a data-link-domain="minicli.readthedocs.io" href="https://minicli.readthedocs.io/">minicli</a> qui va faire une archive du dépôt git au bon endroit sur le&nbsp;serveur&nbsp;:</p>
  174. <pre><code>git archive --remote=larlet-fr-index.git master | tar -x -C larlet-fr
  175. git archive --remote=larlet-fr-david.git master | tar -x -C larlet-fr
  176. git archive --remote=larlet-fr-david-cache.git master | tar -x -C larlet-fr/david
  177. […]
  178. </code></pre>
  179. <p>J’itère ainsi sur chacun des dépôts concernés et l’avantage c’est que je peux donner un sous-dossier à la commande <code>tar</code> selon où je veux placer le contenu dans l’arborescence. Par exemple, ci-dessus, les articles archivés <code>larlet-fr-david-cache.git</code> arrivent directement dans mon dossier personnel <code>larlet-fr/david</code>. Il faut tout de même vérifier de ne pas écraser ses propres&nbsp;dossiers/fichiers.</p>
  180. <p>Le déploiement met à ce jour une trentaine de secondes. Ce n’est pas optimisé mais je n’ai pas besoin de&nbsp;l’optimiser.</p>
  181. <a href="#hr-53" title="Lien vers cette section de la page"><hr id="hr-53" /></a>
  182. <blockquote lang="en">
  183. <p>I therefore officially announce 2024&nbsp;to be the year when the square checkbox has finally&nbsp;died.</p>
  184. <p><cite><em><a data-link-domain="tonsky.me" href="https://tonsky.me/blog/checkbox/" hreflang="en"
  185. title="Consultation de l’article (anglais)">In Loving Memory of Square Checkbox</a>
  186. <a href="/david/cache/2024/ff566a58892db07815a327802fea66d3/" hreflang="en"
  187. data-tippy data-description="History of checkboxes and radio buttons in user interfaces"
  188. data-source="https://tonsky.me/blog/checkbox/"
  189. data-date="2024-01-28"
  190. data-favicon="https://tonsky.me/i/favicon.png"
  191. data-domain="tonsky.me"
  192. ><svg xmlns="http://www.w3.org/2000/svg"
  193. width="24" height="24" viewBox="0 0 24 24" fill="none"
  194. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  195. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  196. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  197. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  198. </svg>
  199. <span class="sr-only">[archive]</span></a></em></cite></p>
  200. </blockquote>
  201. <p>À quand une petite coche sur les <a data-link-domain="alvaromontoro.com" href="https://alvaromontoro.com/blog/68049/new-toggle-switch-lands-in-safari" hreflang="en"
  202. title="Consultation de l’article (anglais)">futurs toggle/switch natifs</a>
  203. <a href="/david/cache/2024/b351cda8d2ccd73362ca1729845b7e79/" hreflang="en"
  204. data-tippy data-description="Toggle switches are a common request by Designers and Developers. Safari proposed a native way to create switches in HTML without the hassle of dealing with CSS or unnecessary control states."
  205. data-source="https://alvaromontoro.com/blog/68049/new-toggle-switch-lands-in-safari"
  206. data-date="2024-01-28"
  207. data-favicon="https://alvaromontoro.com/fav.ico"
  208. data-domain="alvaromontoro.com"
  209. ><svg xmlns="http://www.w3.org/2000/svg"
  210. width="24" height="24" viewBox="0 0 24 24" fill="none"
  211. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  212. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  213. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  214. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  215. </svg>
  216. <span class="sr-only">[archive]</span></a>&#8239;? Ou <a data-link-domain="grumpy.website" href="https://grumpy.website/1457">pire</a>&#8239;? 🙈</p>
  217. <p>R.I.P. <a data-link-domain="nubero.ch" href="https://www.nubero.ch/blog/009/" hreflang="de"
  218. title="Consultation de l’article">les boutons</a>
  219. <a href="/david/cache/2024/a3ccfb51f65cd59f375d5424d243e012/" hreflang="de"
  220. data-tippy data-description="Nuberodesign: Agentur für Grafikdesign, Animation, Videoproduktion und Usability in Winterthur"
  221. data-source="https://www.nubero.ch/blog/009/"
  222. data-date="2024-01-28"
  223. data-favicon="https://www.nubero.ch/favicon.svg"
  224. data-domain="nubero.ch"
  225. ><svg xmlns="http://www.w3.org/2000/svg"
  226. width="24" height="24" viewBox="0 0 24 24" fill="none"
  227. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  228. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  229. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  230. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  231. </svg>
  232. <span class="sr-only">[archive]</span></a>&nbsp;aussi…</p>
  233. <a href="#hr-54" title="Lien vers cette section de la page"><hr id="hr-54" /></a>
  234. <blockquote>
  235. <p>Les poètes et écrivains évitaient tous la colère des rois et des puissants par l’utilisation de métaphores. Mais c’est justement par cette analogie que cela devient&nbsp;intéressant.</p>
  236. <p><mark>Les empires informatiques d’aujourd’hui comme exemples de l’absolutisme du pouvoir des siècles précédents posent la question plus qu’intéressantes sur la liberté d’expression.</mark> Quand tout l’espace de notre expression transite par un domaine privé et commercial, nous ne sommes plus dans l’espace public de notre expression mais bien dans cet espace contrôlé. Que devient le sens de notre communication si dès que nous sommes sur ces espaces, l’expression devient plus limitée que celle que l’espace public&nbsp;permet.</p>
  237. <p><cite><em><a data-link-domain="la-grange.net" href="https://www.la-grange.net/2024/01/26/fraichement" hreflang="fr"
  238. title="Consultation de l’article">fraîchement</a>
  239. <a href="/david/cache/2024/b692faaa55fd2775e957b20e833e9e5e/" hreflang="fr"
  240. data-tippy data-description=""
  241. data-source="https://www.la-grange.net/2024/01/26/fraichement"
  242. data-date="2024-01-28"
  243. data-favicon="https://www.la-grange.net/favicon.ico"
  244. data-domain="la-grange.net"
  245. ><svg xmlns="http://www.w3.org/2000/svg"
  246. width="24" height="24" viewBox="0 0 24 24" fill="none"
  247. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  248. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  249. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  250. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  251. </svg>
  252. <span class="sr-only">[archive]</span></a></em></cite></p>
  253. </blockquote>
  254. <p>Il est interdit de parler anglais dans les écoles québécoises. Il n’en fallait pas beaucoup plus pour que les élèves aient envie de l’apprendre et d’échanger entre eux dans cette langue. <em>Oppression + contre-pouvoir = culture&nbsp;commune.</em></p>
  255. <p>Aussi, l’enseignement de l’anglais est relativement médiocre pour une province qui insiste sur le bilinguisme. Difficile d’en mesurer&nbsp;l’intention.</p>
  256. <a href="#hr-55" title="Lien vers cette section de la page"><hr id="hr-55" /></a>
  257. <blockquote>
  258. <p>[…] Je ne sais pas ce qui est le plus important, préserver un nom de domaine n’est qu’une partie. Préserver le contenu derrière le nom de domaine est plus difficile. Il faut penser serveurs, mise à jour de sécurité, les technologies utilisées, etc.</p>
  259. <p>Le No JS pour les sites Web est rarement mentionné pour la longévité du contenu. Et pourtant c’est une pièce&nbsp;fondamentale.</p>
  260. <p>Peut-être il serait plus important de <mark>penser à ce que les autres voudront préserver plutôt que de penser à ce que nous voulons transmettre.</mark> De même que voulons nous préserver des générations antérieures pour nous aider à mieux penser notre propre&nbsp;disparition.</p>
  261. <p><cite><em><a data-link-domain="la-grange.net" href="https://www.la-grange.net/2024/01/23/legacy" hreflang="fr"
  262. title="Consultation de l’article">ce que nous laissons</a>
  263. <a href="/david/cache/2024/1fe484434058e9c44d21bfebb0ddba31/" hreflang="fr"
  264. data-tippy data-description=""
  265. data-source="https://www.la-grange.net/2024/01/23/legacy"
  266. data-date="2024-01-28"
  267. data-favicon="https://www.la-grange.net/favicon.ico"
  268. data-domain="la-grange.net"
  269. ><svg xmlns="http://www.w3.org/2000/svg"
  270. width="24" height="24" viewBox="0 0 24 24" fill="none"
  271. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  272. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  273. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  274. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  275. </svg>
  276. <span class="sr-only">[archive]</span></a></em></cite></p>
  277. </blockquote>
  278. <p>Peut-être que si chaque personne avait sa <a href="/david/cache/2024/">propre archive</a> des publications des autres, on aurait accès à un réseau de citations distribuées qui contribueraient à cette préservation. Et qui auraient été considérées comme étant «&nbsp;pertinentes&nbsp;» par les lecteur·ices&#8239;? Les guillemets sont importants car citation ne veut pas forcément dire caution ou intérêt le plus grand. Par exemple, l’<a data-link-domain="la-grange.net" href="https://www.la-grange.net/2024/01/22/carnet" hreflang="fr"
  279. title="Consultation de l’article">anecdote</a>
  280. <a href="/david/cache/2024/790f724c45b26de460f9eeac04d48884/" hreflang="fr"
  281. data-tippy data-description=""
  282. data-source="https://www.la-grange.net/2024/01/22/carnet"
  283. data-date="2024-01-28"
  284. data-favicon="https://www.la-grange.net/favicon.ico"
  285. data-domain="la-grange.net"
  286. ><svg xmlns="http://www.w3.org/2000/svg"
  287. width="24" height="24" viewBox="0 0 24 24" fill="none"
  288. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  289. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  290. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  291. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  292. </svg>
  293. <span class="sr-only">[archive]</span></a> <q lang="fr">Je me pose de sérieuses questions sur l’image que nous renvoyons à notre enfant.</q> me fait beaucoup réfléchir et me donne envie de la conserver sans forcément la citer. Comment combiner réactions publiques et souvenirs plus&nbsp;intimes&#8239;?</p>
  294. <p>Maintenant je vais vouloir citer encore plus d’articles de&nbsp;Karl&nbsp;(-:.</p>
  295. <p><em>PS&nbsp;: Un réseau de <a data-link-domain="flus.fr" href="https://flus.fr/">flus</a> ou <a data-link-domain="readeck.org" href="https://readeck.org">readeck</a> serait aussi une option s’ils pouvaient devenir un des nœuds d’une archive distribuée et&nbsp;collective.</em></p>
  296. <nav>
  297. <p>
  298. <a href="/david/2024/echanges/"
  299. title="Liste de tous les articles 2024 associés à cette étiquette"
  300. rel="tag">#échanges</a>
  301. <a href="/david/2024/technique/"
  302. title="Liste de tous les articles 2024 associés à cette étiquette"
  303. rel="tag">#technique</a>
  304. <a href="/david/2024/web/"
  305. title="Liste de tous les articles 2024 associés à cette étiquette"
  306. rel="tag">#web</a>
  307. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  308. </p>
  309. </nav>
  310. <nav>
  311. <p>
  312. <a rel="prev"
  313. href="/david/2024/01/28/"
  314. title="Publication précédente : Jour&nbsp;2">← Précédent</a> •
  315. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  316. • <a rel="next"
  317. href="/david/2024/01/30/"
  318. title="Publication suivante : Équipe">Suivant →</a>
  319. </p>
  320. </nav>
  321. <form action="/david/recherche/" method="get">
  322. <fieldset>
  323. <legend>Recherche</legend>
  324. <label for="input-search">Termes de votre recherche :</label>
  325. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  326. <input type="submit" value="Chercher">
  327. <p id="indexation-infos">
  328. <small>
  329. Seuls les contenus de ces 8 dernières années sont indexés.
  330. </small>
  331. </p>
  332. </fieldset>
  333. </form>
  334. <aside>
  335. <theme-toggle></theme-toggle>
  336. </aside>
  337. </article>
  338. <hr>
  339. <footer>
  340. <p>
  341. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  342. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  343. <a href="http://larlet.com"
  344. title="Go to my English profile"
  345. data-instant>Pro</a>
  346. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  347. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  348. </p>
  349. <template id="theme-selector">
  350. <form>
  351. <style type="text/css">
  352. fieldset div {
  353. text-align: center;
  354. }
  355. </style>
  356. <fieldset>
  357. <legend>Thème</legend>
  358. <div>
  359. <label>
  360. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  361. Auto
  362. </label>
  363. <label>
  364. <input type="radio" value="dark" name="chosen-color-scheme">
  365. Foncé
  366. </label>
  367. <label>
  368. <input type="radio" value="light" name="chosen-color-scheme">
  369. Clair
  370. </label>
  371. </div>
  372. </fieldset>
  373. </form>
  374. </template>
  375. </footer>
  376. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  377. <script>
  378. class ThemeToggle extends HTMLElement {
  379. constructor() {
  380. super()
  381. const themeSelectorTemplate = document.querySelector('#theme-selector')
  382. const form = themeSelectorTemplate.content.firstElementChild
  383. this.attachShadow({ mode: 'open' })
  384. this.shadowRoot.appendChild(form.cloneNode(true))
  385. }
  386. connectedCallback() {
  387. const form = this.shadowRoot.querySelector('form')
  388. form.addEventListener('change', (e) => {
  389. const chosenColorScheme = e.target.value
  390. localStorage.setItem('theme', chosenColorScheme)
  391. toggleTheme(chosenColorScheme)
  392. })
  393. const selectedTheme = localStorage.getItem('theme')
  394. if (selectedTheme && selectedTheme !== 'undefined') {
  395. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  396. }
  397. }
  398. }
  399. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  400. window.addEventListener('load', () => {
  401. let colorsLayer = undefined
  402. let hasDarkRules = false
  403. for (const styleSheet of Array.from(document.styleSheets)) {
  404. let mediaRules = []
  405. for (const layerRule of styleSheet.cssRules) {
  406. if (!(layerRule instanceof CSSLayerBlockRule)) {
  407. continue
  408. }
  409. if (layerRule.name === 'colors') {
  410. colorsLayer = layerRule
  411. }
  412. for (const cssRule of layerRule.cssRules) {
  413. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  414. continue
  415. }
  416. // WARNING: Safari does not have/supports `conditionText`.
  417. if (cssRule.conditionText) {
  418. if (cssRule.conditionText !== prefersColorSchemeDark) {
  419. continue
  420. }
  421. } else {
  422. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  423. continue
  424. }
  425. }
  426. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  427. }
  428. }
  429. // WARNING: do not try to insert a Rule to a styleSheet you are
  430. // currently iterating on, otherwise the browser will be stuck
  431. // in a infinite loop…
  432. for (const mediaRule of mediaRules) {
  433. // Safari requires the `0` second parameter (even if default).
  434. colorsLayer.insertRule(mediaRule.cssText, 0)
  435. hasDarkRules = true
  436. }
  437. }
  438. if (hasDarkRules) {
  439. if ('customElements' in window && !customElements.get('theme-toggle')) {
  440. customElements.define('theme-toggle', ThemeToggle)
  441. }
  442. }
  443. })
  444. </script>
  445. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  446. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  447. <script>
  448. tippy('[data-tippy]', {
  449. content(reference) {
  450. reference.addEventListener('click', (e) => e.preventDefault())
  451. return `
  452. <h3 lang="fr">
  453. <img src="${reference.dataset.favicon}" loading="lazy">
  454. <a href="${reference.dataset.source}"
  455. >Article sur ${reference.dataset.domain}</a></h3>
  456. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  457. <div class="tippy-links" lang="fr">
  458. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  459. </div>
  460. `
  461. },
  462. allowHTML: true,
  463. interactive: true,
  464. delay: [150, 700],
  465. hideOnClick: false
  466. })
  467. </script>
  468. </body>
  469. </html>