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 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  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. Intendant
  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="In Why We Can’t Have Nice Software, I point out this pattern of needless software churn in the mindless quest for profit. This is a perfect example occurring right now. Redict has already reached its peak; it does not need any more serious software development to occur. It does not need to pivot to AI. It can be maintained for decades to come with minimal effort. It can continue to provide a high amount of value for a low amount of labor. That’s the entire point of software!">
  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>Intendant</h1>
  136. <p>Le <time datetime="2024-03-23">23 mars 2024</time></p>
  137. </hgroup>
  138. </header>
  139. <nav>
  140. <p>
  141. <a rel="prev"
  142. href="/david/2024/03/21/"
  143. title="Publication précédente : Fourchette">← 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/24/"
  150. title="Publication suivante : Cage">Suivant →</a>
  151. </p>
  152. </nav>
  153. <blockquote lang="en">
  154. <p>In <a data-link-domain="andrewkelley.me" href="https://andrewkelley.me/post/why-we-cant-have-nice-software.html">Why We Can’t Have Nice Software</a>, I point out this pattern of needless software churn in the mindless quest for profit. This is a perfect example occurring right now. Redict has already reached its peak; it does not need any more serious software development to occur. It does not need to <a data-link-domain="redis.com" href="https://redis.com/blog/the-future-of-redis/">pivot to AI</a>. It can be maintained for decades to come with minimal effort. It can continue to provide a high amount of value for a low amount of labor. That’s the entire point of&nbsp;software!</p>
  155. <p>Redict does not have any profit left to offer. It no longer needs a fund-raising entity behind it anymore. <mark>It just needs a good project&nbsp;steward.</mark></p>
  156. <p><cite><em><a data-link-domain="andrewkelley.me" href="https://andrewkelley.me/post/redis-renamed-to-redict.html" hreflang="en"
  157. title="Consultation de l’article (anglais)">Redis Renamed to Redict</a>
  158. <a href="/david/cache/2024/d58c7619eec894c5c069244114ea1df5/" hreflang="en"
  159. data-tippy data-description="In other words, Redict is the true spiritual successor to what was once Redis."
  160. data-source="https://andrewkelley.me/post/redis-renamed-to-redict.html"
  161. data-date="2024-03-23"
  162. data-favicon=""
  163. data-domain="andrewkelley.me"
  164. ><svg xmlns="http://www.w3.org/2000/svg"
  165. width="24" height="24" viewBox="0 0 24 24" fill="none"
  166. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  167. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  168. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  169. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  170. </svg>
  171. <span class="sr-only">[archive]</span></a></em></cite></p>
  172. </blockquote>
  173. <p>Je me pose beaucoup de questions sur cette notion de finitude logicielle. Et sur le fait de parfois créer ma propre nécessité, sans en avoir forcément conscience ou&nbsp;l’intention.</p>
  174. <p>J’y vois un parallèle avec une frugalité que je n’arrive pas à atteindre, les deux étant probablement&nbsp;liés.</p>
  175. <p>Il me reste encore tellement de choses à&nbsp;démêler…</p>
  176. <a href="#hr-130" title="Lien vers cette section de la page"><hr id="hr-130" /></a>
  177. <blockquote lang="en">
  178. <p>So, yeah, I’ve been at this for a while, and this is the answer: Write CSS. Not too much. Mostly&nbsp;scoped.</p>
  179. <p>I’m sure we’ll never argue about how to manage CSS ever&nbsp;again.</p>
  180. <p><cite><em><a data-link-domain="leereamsnyder.com" href="https://www.leereamsnyder.com/write-css-not-too-much-mostly-scoped" hreflang="en"
  181. title="Consultation de l’article (anglais)">Write CSS. Not too much. Mostly scoped.</a>
  182. <a href="/david/cache/2024/4e116948ed4d26daa981a6c4ea9e4282/" hreflang="en"
  183. data-tippy data-description="Let’s talk about Tailwind and appease no one"
  184. data-source="https://www.leereamsnyder.com/write-css-not-too-much-mostly-scoped"
  185. data-date="2024-03-23"
  186. data-favicon="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='64'%20height='64'%3e%3cstyle%3e%20@media%20(prefers-color-scheme:%20dark)%20{%20.lee%20{%20fill:%20%23FF4640;%20}%20.ream%20{%20fill:%20%23EC7F00;%20}%20.sny%20{%20fill:%20%23FFB258;%20}%20.der%20{%20fill:%20%23FFDFC6;%20}%20.letters%20{%20fill:%20%23373948;%20}%20}%20%3c/style%3e%3cpath%20class='lee'%20fill='%239B70FF'%20d='M0%203.066A3.066%203.066%200%200%201%203.066%200h57.868A3.066%203.066%200%200%201%2064%203.066v14.946H0V3.066Z'/%3e%3cpath%20class='ream'%20fill='%2300749D'%20d='M64%2034.108H0V15.713h64z'/%3e%3cpath%20class='sny'%20fill='%230092C5'%20d='M64%2031.808v20.695H0V31.808z'/%3e%3cpath%20class='der'%20fill='%238BCFFC'%20d='M64%2047.904v13.03A3.066%203.066%200%200%201%2060.934%2064H3.066A3.066%203.066%200%200%201%200%2060.934v-13.03h64Z'/%3e%3cg%20class='letters'%20fill='%23fff'%20fill-rule='nonzero'%3e%3cpath%20d='M13.275%2040.809c0-4.277%207.379-14.523%207.379-20.304%200-3.102-1.927-4.7-5.17-4.7-4.089%200-8.554%202.021-13.865%206.063a20.491%2020.491%200%200%201%202.726%204.277c3.807-3.055%206.016-4.559%207.849-4.559%201.081%200%201.457.517%201.457%201.363%200%203.76-6.956%2012.643-6.956%2019.458%200%204.136%202.444%206.063%207.144%206.063%205.687%200%2010.481-2.679%2016.215-9.494-1.175-.893-2.303-1.739-3.854-3.384-3.854%205.405-7.332%207.52-10.199%207.52-1.927%200-2.726-.846-2.726-2.303ZM50.286%2048c.33-1.692%201.128-3.431%201.833-5.17-.987.047-3.384.141-5.875.141-1.692%200-1.88-1.128-1.41-2.444%202.444-6.58%206.44-10.81%2010.575-10.81%201.363%200%202.491.423%203.243%201.41-.235-.047-.517-.047-.799-.047-2.538%200-3.9%201.739-3.9%203.76s1.268%203.29%203.336%203.29c3.29%200%204.935-3.431%204.935-7.332%200-3.619-1.692-6.627-5.687-6.627-4.183%200-7.52%203.055-10.763%209.87h-.423c.423-2.021.658-3.572.658-4.559%200-3.525-2.115-5.264-5.499-5.264-2.96%200-5.78%201.363-8.883%203.854.893.987%201.645%202.256%202.491%203.807%202.021-1.833%203.478-2.679%204.935-2.679%201.081%200%201.551.705%201.551%201.88%200%201.645-.94%205.311-2.726%209.776-.705%201.739-1.363%202.115-2.679%202.115-2.02%200-3.572-.141-4.324-.141-.329%201.692-1.08%203.431-1.786%205.17%202.632-.141%2018.33-.141%2021.197%200Z'/%3e%3c/g%3e%3c/svg%3e"
  187. data-domain="leereamsnyder.com"
  188. ><svg xmlns="http://www.w3.org/2000/svg"
  189. width="24" height="24" viewBox="0 0 24 24" fill="none"
  190. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  191. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  192. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  193. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  194. </svg>
  195. <span class="sr-only">[archive]</span></a></em></cite></p>
  196. </blockquote>
  197. <p>Ça commence par le classique «&nbsp;pour ou contre Tailwind&nbsp;» mais après il y a des choses&nbsp;inspirantes.</p>
  198. <a href="#hr-131" title="Lien vers cette section de la page"><hr id="hr-131" /></a>
  199. <blockquote lang="en">
  200. <p>quick q, however: how do they get off the worm when they’ve arrived at their&nbsp;destination</p>
  201. <p>keep noticing that the movie cuts before they get off, Denis my friend you can’t fool me, how do you stop riding the worm, answer&nbsp;us</p>
  202. <p><cite><em><a data-link-domain="youngvulgarian.substack.com" href="https://youngvulgarian.substack.com/p/sydney-sweeney-if-youre-free-on-thursday" hreflang="en"
  203. title="Consultation de l’article (anglais)">Sydney Sweeney, if you’re free on Thursday,</a>
  204. <a href="/david/cache/2024/0e3d54128711421c0878723dafed66e8/" hreflang="en"
  205. data-tippy data-description="Behold! I have had a thought."
  206. data-source="https://youngvulgarian.substack.com/p/sydney-sweeney-if-youre-free-on-thursday"
  207. data-date="2024-03-23"
  208. data-favicon="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdaf53371-1861-41b7-8e48-82787a877e62%2Ffavicon-16x16.png"
  209. data-domain="youngvulgarian.substack.com"
  210. ><svg xmlns="http://www.w3.org/2000/svg"
  211. width="24" height="24" viewBox="0 0 24 24" fill="none"
  212. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  213. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  214. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  215. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  216. </svg>
  217. <span class="sr-only">[archive]</span></a></em></cite></p>
  218. </blockquote>
  219. <p>Tiens c’est vrai ça&#8239;! 🤔🤯</p>
  220. <nav>
  221. <p>
  222. <a href="/david/2024/dependance/"
  223. title="Liste de tous les articles 2024 associés à cette étiquette"
  224. rel="tag">#dépendance</a>
  225. <a href="/david/2024/psychologie/"
  226. title="Liste de tous les articles 2024 associés à cette étiquette"
  227. rel="tag">#psychologie</a>
  228. <a href="/david/2024/technique/"
  229. title="Liste de tous les articles 2024 associés à cette étiquette"
  230. rel="tag">#technique</a>
  231. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  232. </p>
  233. </nav>
  234. <nav>
  235. <p>
  236. <a rel="prev"
  237. href="/david/2024/03/21/"
  238. title="Publication précédente : Fourchette">← Précédent</a> •
  239. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  240. • <a rel="next"
  241. href="/david/2024/03/24/"
  242. title="Publication suivante : Cage">Suivant →</a>
  243. </p>
  244. </nav>
  245. <form action="/david/recherche/" method="get">
  246. <fieldset>
  247. <legend>Recherche</legend>
  248. <label for="input-search">Termes de votre recherche :</label>
  249. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  250. <input type="submit" value="Chercher">
  251. <p id="indexation-infos">
  252. <small>
  253. Seuls les contenus de ces 8 dernières années sont indexés.
  254. </small>
  255. </p>
  256. </fieldset>
  257. </form>
  258. <aside>
  259. <theme-toggle></theme-toggle>
  260. </aside>
  261. </article>
  262. <hr>
  263. <footer>
  264. <p>
  265. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  266. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  267. <a href="http://larlet.com"
  268. title="Go to my English profile"
  269. data-instant>Pro</a>
  270. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  271. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  272. </p>
  273. <template id="theme-selector">
  274. <form>
  275. <style type="text/css">
  276. fieldset div {
  277. text-align: center;
  278. }
  279. </style>
  280. <fieldset>
  281. <legend>Thème</legend>
  282. <div>
  283. <label>
  284. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  285. Auto
  286. </label>
  287. <label>
  288. <input type="radio" value="dark" name="chosen-color-scheme">
  289. Foncé
  290. </label>
  291. <label>
  292. <input type="radio" value="light" name="chosen-color-scheme">
  293. Clair
  294. </label>
  295. </div>
  296. </fieldset>
  297. </form>
  298. </template>
  299. </footer>
  300. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  301. <script>
  302. class ThemeToggle extends HTMLElement {
  303. constructor() {
  304. super()
  305. const themeSelectorTemplate = document.querySelector('#theme-selector')
  306. const form = themeSelectorTemplate.content.firstElementChild
  307. this.attachShadow({ mode: 'open' })
  308. this.shadowRoot.appendChild(form.cloneNode(true))
  309. }
  310. connectedCallback() {
  311. const form = this.shadowRoot.querySelector('form')
  312. form.addEventListener('change', (e) => {
  313. const chosenColorScheme = e.target.value
  314. localStorage.setItem('theme', chosenColorScheme)
  315. toggleTheme(chosenColorScheme)
  316. })
  317. const selectedTheme = localStorage.getItem('theme')
  318. if (selectedTheme && selectedTheme !== 'undefined') {
  319. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  320. }
  321. }
  322. }
  323. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  324. window.addEventListener('load', () => {
  325. let colorsLayer = undefined
  326. let hasDarkRules = false
  327. for (const styleSheet of Array.from(document.styleSheets)) {
  328. let mediaRules = []
  329. for (const layerRule of styleSheet.cssRules) {
  330. if (!(layerRule instanceof CSSLayerBlockRule)) {
  331. continue
  332. }
  333. if (layerRule.name === 'colors') {
  334. colorsLayer = layerRule
  335. }
  336. for (const cssRule of layerRule.cssRules) {
  337. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  338. continue
  339. }
  340. // WARNING: Safari does not have/supports `conditionText`.
  341. if (cssRule.conditionText) {
  342. if (cssRule.conditionText !== prefersColorSchemeDark) {
  343. continue
  344. }
  345. } else {
  346. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  347. continue
  348. }
  349. }
  350. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  351. }
  352. }
  353. // WARNING: do not try to insert a Rule to a styleSheet you are
  354. // currently iterating on, otherwise the browser will be stuck
  355. // in a infinite loop…
  356. for (const mediaRule of mediaRules) {
  357. // Safari requires the `0` second parameter (even if default).
  358. colorsLayer.insertRule(mediaRule.cssText, 0)
  359. hasDarkRules = true
  360. }
  361. }
  362. if (hasDarkRules) {
  363. if ('customElements' in window && !customElements.get('theme-toggle')) {
  364. customElements.define('theme-toggle', ThemeToggle)
  365. }
  366. }
  367. })
  368. </script>
  369. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  370. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  371. <script>
  372. tippy('[data-tippy]', {
  373. content(reference) {
  374. reference.addEventListener('click', (e) => e.preventDefault())
  375. return `
  376. <h3 lang="fr">
  377. <img src="${reference.dataset.favicon}" loading="lazy">
  378. <a href="${reference.dataset.source}"
  379. >Article sur ${reference.dataset.domain}</a></h3>
  380. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  381. <div class="tippy-links" lang="fr">
  382. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  383. </div>
  384. `
  385. },
  386. allowHTML: true,
  387. interactive: true,
  388. delay: [150, 700],
  389. hideOnClick: false
  390. })
  391. </script>
  392. <script type="module">
  393. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  394. const markObserver = new IntersectionObserver((entries, observer) => {
  395. const computedStyle = getComputedStyle(document.documentElement)
  396. const markBackground = computedStyle.getPropertyValue('--mark-background')
  397. for (const entry of entries) {
  398. if (entry.intersectionRatio === 0) continue
  399. const markElement = entry.target
  400. markElement.style.backgroundColor = 'inherit'
  401. const annotation = annotate(
  402. markElement, {
  403. type: 'highlight',
  404. multiline: true,
  405. color: markBackground,
  406. // animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  407. animate: false
  408. }
  409. )
  410. annotation.show()
  411. observer.unobserve(markElement)
  412. }
  413. }, {threshold: 1.0})
  414. for (const markElement of document.querySelectorAll('mark')) {
  415. markObserver.observe(markElement)
  416. }
  417. </script>
  418. </body>
  419. </html>