Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  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. Surligner
  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="A small JavaScript library to create and animate annotations on a web page">
  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. <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>Surligner</h1>
  136. <p>Le <time datetime="2024-03-12">12 mars 2024</time></p>
  137. </hgroup>
  138. </header>
  139. <nav>
  140. <p>
  141. <a rel="prev"
  142. href="/david/2024/03/11/"
  143. title="Publication précédente : LoginWall">← 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/03/13/"
  150. title="Publication suivante : Sérendipité">Suivant →</a>
  151. </p>
  152. </nav>
  153. <blockquote lang="en">
  154. <p>A small JavaScript library <mark>to create and animate annotations on a web&nbsp;page</mark></p>
  155. <p>Rough Notation uses RoughJS to create a hand-drawn look and feel. Elements can be annotated in a number of different styles. Animation duration and delay can be configured, or just turned&nbsp;off.</p>
  156. <p>Rough Notation is 3.8kb in size when gzipped, and the code is available on&nbsp;GitHub.</p>
  157. <p><cite><em><a data-link-domain="roughnotation.com" href="https://roughnotation.com/">Rough&nbsp;Notation</a></em></cite></p>
  158. </blockquote>
  159. <p>J’utilise cette façon de mettre en avant des fragments de citations <a href="/david/2020/02/21/#surlignage">depuis un petit moment</a> et en passant <a data-link-domain="vanschklift.com" href="https://vanschklift.com/blog/post/2020/06/19/Time-for-a-refresh%21" hreflang="en"
  160. title="Consultation de l’article (anglais)">par chez Biou</a>
  161. <a href="/david/cache/2024/41e9f48de9ccd2449bceca518fff8606/" hreflang="en"
  162. data-tippy data-description="It has been a while since I last changed the theme of this blog! Seems that with all the time spent at home in the last three months, I had some new blog posts ideas, but blogging"
  163. data-source="https://vanschklift.com/blog/post/2020/06/19/Time-for-a-refresh%21"
  164. data-date="2024-03-12"
  165. data-favicon="https://vanschklift.com/themes/wip/img/android-icon-192x192.png"
  166. data-domain="vanschklift.com"
  167. ><svg xmlns="http://www.w3.org/2000/svg"
  168. width="24" height="24" viewBox="0 0 24 24" fill="none"
  169. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  170. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  171. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  172. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  173. </svg>
  174. <span class="sr-only">[archive]</span></a> aujourd’hui, j’ai trouvé l’effet bien sympathique. Je ne l’applique pour l’instant(?) que sur la balise <code>&lt;mark&gt;</code> (relativement inoffensif si ça casse), en respectant <code>prefers-reduced-motion</code> et en animant que lorsque la partie surlignée devient visible grâce à <a data-link-domain="MDN" href="https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver">IntersectionObserver</a>.</p>
  175. <p>Cela peut se révéler être distrayant pour certaines personnes car ça bouge à un endroit éloigné du point de lecture (merci @maiwann), invisible pour d’autres qui chargent les onglets sans être dessus (merci @lamecarlate). Il s’agit d’une famille d’animations pas trop invasives, encore moins essentielles, qui peuvent se révéler être de fausses bonnes idées. Je vais tester pour un temps, toujours dans cette recherche d’aller <a href="/david/2024/03/09/#hr-106">vers un peu plus de fantaisie</a>.</p>
  176. <p>N’hésitez pas à me faire des&nbsp;retours.</p>
  177. <p><mark>Plus tard dans la journée</mark>, Nicolas Hoizey m’indique qu’il sera possible d’avoir un <a data-link-domain="frontendmasters.com" href="https://frontendmasters.com/blog/highlight-text-when-a-user-scrolls-down-to-that-piece-of-text/" hreflang="en"
  178. title="Consultation de l’article (anglais)">comportement approchant en CSS</a>
  179. <a href="/david/cache/2024/5ff0fe74d43b57fa41db8851bc56ac88/" hreflang="en"
  180. data-tippy data-description="I was reading a great post on Lene Saile’s blog and noticed a cool little design feature on her site that highlights a line of text once you scroll to it. Here’s a video so you can see …"
  181. data-source="https://frontendmasters.com/blog/highlight-text-when-a-user-scrolls-down-to-that-piece-of-text/"
  182. data-date="2024-03-12"
  183. data-favicon="https://frontendmasters.com/favicon-32x32.png"
  184. data-domain="frontendmasters.com"
  185. ><svg xmlns="http://www.w3.org/2000/svg"
  186. width="24" height="24" viewBox="0 0 24 24" fill="none"
  187. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  188. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  189. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  190. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  191. </svg>
  192. <span class="sr-only">[archive]</span></a> <a data-link-domain="caniuse.com" href="https://caniuse.com/mdn-css_properties_animation-range">prochainement</a>.</p>
  193. <p><mark>Le lendemain</mark>, <a href="/david/2024/03/13/#hr-114">j’ai désactivé l’animation</a> suite à plusieurs retours de&nbsp;lecteur·ices.</p>
  194. <a href="#hr-110" title="Lien vers cette section de la page"><hr id="hr-110" /></a>
  195. <blockquote>
  196. <p>Ce qu’Hashbang propose est de créer un registrar sous forme de SCIC avec en plus un processus participatif pour définir les services et leurs tarifs. Le premier service proposé sera certainement le nom de domaine, mais personne ne peut actuellement définir quel tarif sera proposé. <mark>Ce sera issu d’un processus participatif en fonction des participant·e·s au&nbsp;départ.</mark></p>
  197. <p>Chez Hashbang, nous portons un regard attentif aux enjeux environnementaux et nous proposons donc de mesurer et limiter l’impact environnemental des activités du&nbsp;registrar.</p>
  198. <p>Nous souhaitons également s’assurer qu’il n’y ait pas de discriminations et que les personnes minorisé·e·s puissent s’emparer de cet espace. Il faut donc s’attendre à ce qu’il y ait des événements en mixité choisie et du langage&nbsp;inclusif.</p>
  199. <p><cite><em><a data-link-domain="hashbang.coop" href="https://hashbang.coop/blog/appel-a-interet-pour-un-bureau-denregistrement-cooperatif/" hreflang="fr"
  200. title="Consultation de l’article">Appel à intérêt pour un bureau d’enregistrement coopératif</a>
  201. <a href="/david/cache/2024/2c027efb3689a1067c7f32a659fd4092/" hreflang="fr"
  202. data-tippy data-description="Nous lançons un projet pour gérer des noms de domaines dans une nouvelle coopérative"
  203. data-source="https://hashbang.coop/blog/appel-a-interet-pour-un-bureau-denregistrement-cooperatif/"
  204. data-date="2024-03-12"
  205. data-favicon="https://hashbang.coop/static/images/favicon.1d2088a755c9.ico"
  206. data-domain="hashbang.coop"
  207. ><svg xmlns="http://www.w3.org/2000/svg"
  208. width="24" height="24" viewBox="0 0 24 24" fill="none"
  209. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  210. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  211. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  212. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  213. </svg>
  214. <span class="sr-only">[archive]</span></a></em></cite></p>
  215. </blockquote>
  216. <p>Superbe initiative, coopératives pour&nbsp;tou·tes&#8239;!</p>
  217. <a href="#hr-111" title="Lien vers cette section de la page"><hr id="hr-111" /></a>
  218. <blockquote lang="en">
  219. <p>I know a lot of people hate anti-ad-block popups, but to me they are&nbsp;perfect.</p>
  220. <p>In presenting those popups, those websites demonstrate that they realize the lack of control they have. They show us so plainly that they are unable to make money from us, which leaves them no option but to grovel and beg us to turn off&nbsp;ad-blocking.[…]</p>
  221. <p>When we use web browsers, <strong>we</strong> are in more control than <strong>they</strong> are. <mark>That’s simply not the case when we’re inside an app they get to&nbsp;control.</mark></p>
  222. <p><cite><em><a data-link-domain="lmnt.me" href="https://lmnt.me/blog/anti-ad-block.html" hreflang="en"
  223. title="Consultation de l’article (anglais)">Anti-Ad-Block</a>
  224. <a href="/david/cache/2024/09cfcfafab15ad576de8b32d0046fb93/" hreflang="en"
  225. data-tippy data-description="I know a lot of people hate anti-ad-block popups, but to me they are perfect."
  226. data-source="https://lmnt.me/blog/anti-ad-block.html"
  227. data-date="2024-03-12"
  228. data-favicon="https://lmnt.me/lmnt.png"
  229. data-domain="lmnt.me"
  230. ><svg xmlns="http://www.w3.org/2000/svg"
  231. width="24" height="24" viewBox="0 0 24 24" fill="none"
  232. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  233. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  234. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  235. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  236. </svg>
  237. <span class="sr-only">[archive]</span></a></em></cite></p>
  238. </blockquote>
  239. <p>Ma configuration à ce sujet est assez extrême et il n’est pas rare (surtout sur les boutiques&#8239;!) que je doive m’y reprendre à pas mal de fois pour débloquer les <a data-link-domain="tonsky.me" href="https://tonsky.me/blog/js-bloat/" hreflang="en"
  240. title="Consultation de l’article (anglais)">megabytes de JavaScript</a>
  241. <a href="/david/cache/2024/ad911ebf7ba5523ef0be1bdd599f7623/" hreflang="en"
  242. data-tippy data-description="What is the average size of JavaScript code downloaded per website? Fuck around and find out!"
  243. data-source="https://tonsky.me/blog/js-bloat/"
  244. data-date="2024-03-03"
  245. data-favicon="https://tonsky.me/i/favicon.png"
  246. data-domain="tonsky.me"
  247. ><svg xmlns="http://www.w3.org/2000/svg"
  248. width="24" height="24" viewBox="0 0 24 24" fill="none"
  249. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  250. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  251. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  252. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  253. </svg>
  254. <span class="sr-only">[archive]</span></a> à télécharger qui sont pertinents, ou plutôt nécessaires aux personnes ayant développé ces sites. Car pour ma part, je n’aurais besoin que de HTML dans 99% des&nbsp;cas…</p>
  255. <p>…dit-il en venant d’ajouter 13Ko de&nbsp;JS&nbsp;😬.</p>
  256. <nav>
  257. <p>
  258. <a href="/david/2024/partage/"
  259. title="Liste de tous les articles 2024 associés à cette étiquette"
  260. rel="tag">#partage</a>
  261. <a href="/david/2024/technique/"
  262. title="Liste de tous les articles 2024 associés à cette étiquette"
  263. rel="tag">#technique</a>
  264. <a href="/david/2024/web/"
  265. title="Liste de tous les articles 2024 associés à cette étiquette"
  266. rel="tag">#web</a>
  267. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  268. </p>
  269. </nav>
  270. <nav>
  271. <p>
  272. <a rel="prev"
  273. href="/david/2024/03/11/"
  274. title="Publication précédente : LoginWall">← Précédent</a> •
  275. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  276. • <a rel="next"
  277. href="/david/2024/03/13/"
  278. title="Publication suivante : Sérendipité">Suivant →</a>
  279. </p>
  280. </nav>
  281. <form action="/david/recherche/" method="get">
  282. <fieldset>
  283. <legend>Recherche</legend>
  284. <label for="input-search">Termes de votre recherche :</label>
  285. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  286. <input type="submit" value="Chercher">
  287. <p id="indexation-infos">
  288. <small>
  289. Seuls les contenus de ces 8 dernières années sont indexés.
  290. </small>
  291. </p>
  292. </fieldset>
  293. </form>
  294. <aside>
  295. <theme-toggle></theme-toggle>
  296. </aside>
  297. </article>
  298. <hr>
  299. <footer>
  300. <p>
  301. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  302. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  303. <a href="http://larlet.com"
  304. title="Go to my English profile"
  305. data-instant>Pro</a>
  306. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  307. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  308. </p>
  309. <template id="theme-selector">
  310. <form>
  311. <style type="text/css">
  312. fieldset div {
  313. text-align: center;
  314. }
  315. </style>
  316. <fieldset>
  317. <legend>Thème</legend>
  318. <div>
  319. <label>
  320. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  321. Auto
  322. </label>
  323. <label>
  324. <input type="radio" value="dark" name="chosen-color-scheme">
  325. Foncé
  326. </label>
  327. <label>
  328. <input type="radio" value="light" name="chosen-color-scheme">
  329. Clair
  330. </label>
  331. </div>
  332. </fieldset>
  333. </form>
  334. </template>
  335. </footer>
  336. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  337. <script>
  338. class ThemeToggle extends HTMLElement {
  339. constructor() {
  340. super()
  341. const themeSelectorTemplate = document.querySelector('#theme-selector')
  342. const form = themeSelectorTemplate.content.firstElementChild
  343. this.attachShadow({ mode: 'open' })
  344. this.shadowRoot.appendChild(form.cloneNode(true))
  345. }
  346. connectedCallback() {
  347. const form = this.shadowRoot.querySelector('form')
  348. form.addEventListener('change', (e) => {
  349. const chosenColorScheme = e.target.value
  350. localStorage.setItem('theme', chosenColorScheme)
  351. toggleTheme(chosenColorScheme)
  352. })
  353. const selectedTheme = localStorage.getItem('theme')
  354. if (selectedTheme && selectedTheme !== 'undefined') {
  355. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  356. }
  357. }
  358. }
  359. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  360. window.addEventListener('load', () => {
  361. let colorsLayer = undefined
  362. let hasDarkRules = false
  363. for (const styleSheet of Array.from(document.styleSheets)) {
  364. let mediaRules = []
  365. for (const layerRule of styleSheet.cssRules) {
  366. if (!(layerRule instanceof CSSLayerBlockRule)) {
  367. continue
  368. }
  369. if (layerRule.name === 'colors') {
  370. colorsLayer = layerRule
  371. }
  372. for (const cssRule of layerRule.cssRules) {
  373. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  374. continue
  375. }
  376. // WARNING: Safari does not have/supports `conditionText`.
  377. if (cssRule.conditionText) {
  378. if (cssRule.conditionText !== prefersColorSchemeDark) {
  379. continue
  380. }
  381. } else {
  382. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  383. continue
  384. }
  385. }
  386. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  387. }
  388. }
  389. // WARNING: do not try to insert a Rule to a styleSheet you are
  390. // currently iterating on, otherwise the browser will be stuck
  391. // in a infinite loop…
  392. for (const mediaRule of mediaRules) {
  393. // Safari requires the `0` second parameter (even if default).
  394. colorsLayer.insertRule(mediaRule.cssText, 0)
  395. hasDarkRules = true
  396. }
  397. }
  398. if (hasDarkRules) {
  399. if ('customElements' in window && !customElements.get('theme-toggle')) {
  400. customElements.define('theme-toggle', ThemeToggle)
  401. }
  402. }
  403. })
  404. </script>
  405. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  406. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  407. <script>
  408. tippy('[data-tippy]', {
  409. content(reference) {
  410. reference.addEventListener('click', (e) => e.preventDefault())
  411. return `
  412. <h3 lang="fr">
  413. <img src="${reference.dataset.favicon}" loading="lazy">
  414. <a href="${reference.dataset.source}"
  415. >Article sur ${reference.dataset.domain}</a></h3>
  416. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  417. <div class="tippy-links" lang="fr">
  418. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  419. </div>
  420. `
  421. },
  422. allowHTML: true,
  423. interactive: true,
  424. delay: [150, 700],
  425. hideOnClick: false
  426. })
  427. </script>
  428. <script type="module">
  429. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  430. const markObserver = new IntersectionObserver((entries, observer) => {
  431. const computedStyle = getComputedStyle(document.documentElement)
  432. const markBackground = computedStyle.getPropertyValue('--mark-background')
  433. for (const entry of entries) {
  434. if (entry.intersectionRatio === 0) continue
  435. const markElement = entry.target
  436. markElement.style.backgroundColor = 'inherit'
  437. const annotation = annotate(
  438. markElement, {
  439. type: 'highlight',
  440. multiline: true,
  441. color: markBackground,
  442. // animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  443. animate: false
  444. }
  445. )
  446. annotation.show()
  447. observer.unobserve(markElement)
  448. }
  449. }, {threshold: 1.0})
  450. for (const markElement of document.querySelectorAll('mark')) {
  451. markObserver.observe(markElement)
  452. }
  453. </script>
  454. </body>
  455. </html>