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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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. </p>
  149. </nav>
  150. <blockquote lang="en">
  151. <p>A small JavaScript library <mark>to create and animate annotations on a web&nbsp;page</mark></p>
  152. <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>
  153. <p>Rough Notation is 3.8kb in size when gzipped, and the code is available on&nbsp;GitHub.</p>
  154. <p><cite><em><a data-link-domain="roughnotation.com" href="https://roughnotation.com/">Rough&nbsp;Notation</a></em></cite></p>
  155. </blockquote>
  156. <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"
  157. title="Consultation de l’article (anglais)">par chez Biou</a>
  158. <a href="/david/cache/2024/41e9f48de9ccd2449bceca518fff8606/" hreflang="en"
  159. 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"
  160. data-source="https://vanschklift.com/blog/post/2020/06/19/Time-for-a-refresh%21"
  161. data-date="2024-03-12"
  162. data-favicon="https://vanschklift.com/themes/wip/img/android-icon-192x192.png"
  163. data-domain="vanschklift.com"
  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> 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>
  172. <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>
  173. <p>N’hésitez pas à me faire des&nbsp;retours.</p>
  174. <a href="#hr-110" title="Lien vers cette section de la page"><hr id="hr-110" /></a>
  175. <blockquote>
  176. <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>
  177. <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>
  178. <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>
  179. <p><cite><em><a data-link-domain="hashbang.coop" href="https://hashbang.coop/blog/appel-a-interet-pour-un-bureau-denregistrement-cooperatif/" hreflang="fr"
  180. title="Consultation de l’article">Appel à intérêt pour un bureau d’enregistrement coopératif</a>
  181. <a href="/david/cache/2024/2c027efb3689a1067c7f32a659fd4092/" hreflang="fr"
  182. data-tippy data-description="Nous lançons un projet pour gérer des noms de domaines dans une nouvelle coopérative"
  183. data-source="https://hashbang.coop/blog/appel-a-interet-pour-un-bureau-denregistrement-cooperatif/"
  184. data-date="2024-03-12"
  185. data-favicon="https://hashbang.coop/static/images/favicon.1d2088a755c9.ico"
  186. data-domain="hashbang.coop"
  187. ><svg xmlns="http://www.w3.org/2000/svg"
  188. width="24" height="24" viewBox="0 0 24 24" fill="none"
  189. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  190. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  191. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  192. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  193. </svg>
  194. <span class="sr-only">[archive]</span></a></em></cite></p>
  195. </blockquote>
  196. <p>Superbe initiative, coopératives pour&nbsp;tou·tes&#8239;!</p>
  197. <a href="#hr-111" title="Lien vers cette section de la page"><hr id="hr-111" /></a>
  198. <blockquote lang="en">
  199. <p>I know a lot of people hate anti-ad-block popups, but to me they are&nbsp;perfect.</p>
  200. <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>
  201. <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>
  202. <p><cite><em><a data-link-domain="lmnt.me" href="https://lmnt.me/blog/anti-ad-block.html" hreflang="en"
  203. title="Consultation de l’article (anglais)">Anti-Ad-Block</a>
  204. <a href="/david/cache/2024/09cfcfafab15ad576de8b32d0046fb93/" hreflang="en"
  205. data-tippy data-description="I know a lot of people hate anti-ad-block popups, but to me they are perfect."
  206. data-source="https://lmnt.me/blog/anti-ad-block.html"
  207. data-date="2024-03-12"
  208. data-favicon="https://lmnt.me/lmnt.png"
  209. data-domain="lmnt.me"
  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>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"
  220. title="Consultation de l’article (anglais)">megabytes de JavaScript</a>
  221. <a href="/david/cache/2024/ad911ebf7ba5523ef0be1bdd599f7623/" hreflang="en"
  222. data-tippy data-description="What is the average size of JavaScript code downloaded per website? Fuck around and find out!"
  223. data-source="https://tonsky.me/blog/js-bloat/"
  224. data-date="2024-03-03"
  225. data-favicon="https://tonsky.me/i/favicon.png"
  226. data-domain="tonsky.me"
  227. ><svg xmlns="http://www.w3.org/2000/svg"
  228. width="24" height="24" viewBox="0 0 24 24" fill="none"
  229. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  230. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  231. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  232. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  233. </svg>
  234. <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>
  235. <p>…dit-il en venant d’ajouter 13Ko de&nbsp;JS&nbsp;😬.</p>
  236. <nav>
  237. <p>
  238. <a href="/david/2024/partage/"
  239. title="Liste de tous les articles 2024 associés à cette étiquette"
  240. rel="tag">#partage</a>
  241. <a href="/david/2024/technique/"
  242. title="Liste de tous les articles 2024 associés à cette étiquette"
  243. rel="tag">#technique</a>
  244. <a href="/david/2024/web/"
  245. title="Liste de tous les articles 2024 associés à cette étiquette"
  246. rel="tag">#web</a>
  247. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  248. </p>
  249. </nav>
  250. <nav>
  251. <p>
  252. <a rel="prev"
  253. href="/david/2024/03/11/"
  254. title="Publication précédente : LoginWall">← Précédent</a> •
  255. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  256. </p>
  257. </nav>
  258. <form action="/david/recherche/" method="get">
  259. <fieldset>
  260. <legend>Recherche</legend>
  261. <label for="input-search">Termes de votre recherche :</label>
  262. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  263. <input type="submit" value="Chercher">
  264. <p id="indexation-infos">
  265. <small>
  266. Seuls les contenus de ces 8 dernières années sont indexés.
  267. </small>
  268. </p>
  269. </fieldset>
  270. </form>
  271. <aside>
  272. <theme-toggle></theme-toggle>
  273. </aside>
  274. </article>
  275. <hr>
  276. <footer>
  277. <p>
  278. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  279. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  280. <a href="http://larlet.com"
  281. title="Go to my English profile"
  282. data-instant>Pro</a>
  283. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  284. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  285. </p>
  286. <template id="theme-selector">
  287. <form>
  288. <style type="text/css">
  289. fieldset div {
  290. text-align: center;
  291. }
  292. </style>
  293. <fieldset>
  294. <legend>Thème</legend>
  295. <div>
  296. <label>
  297. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  298. Auto
  299. </label>
  300. <label>
  301. <input type="radio" value="dark" name="chosen-color-scheme">
  302. Foncé
  303. </label>
  304. <label>
  305. <input type="radio" value="light" name="chosen-color-scheme">
  306. Clair
  307. </label>
  308. </div>
  309. </fieldset>
  310. </form>
  311. </template>
  312. </footer>
  313. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  314. <script>
  315. class ThemeToggle extends HTMLElement {
  316. constructor() {
  317. super()
  318. const themeSelectorTemplate = document.querySelector('#theme-selector')
  319. const form = themeSelectorTemplate.content.firstElementChild
  320. this.attachShadow({ mode: 'open' })
  321. this.shadowRoot.appendChild(form.cloneNode(true))
  322. }
  323. connectedCallback() {
  324. const form = this.shadowRoot.querySelector('form')
  325. form.addEventListener('change', (e) => {
  326. const chosenColorScheme = e.target.value
  327. localStorage.setItem('theme', chosenColorScheme)
  328. toggleTheme(chosenColorScheme)
  329. })
  330. const selectedTheme = localStorage.getItem('theme')
  331. if (selectedTheme && selectedTheme !== 'undefined') {
  332. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  333. }
  334. }
  335. }
  336. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  337. window.addEventListener('load', () => {
  338. let colorsLayer = undefined
  339. let hasDarkRules = false
  340. for (const styleSheet of Array.from(document.styleSheets)) {
  341. let mediaRules = []
  342. for (const layerRule of styleSheet.cssRules) {
  343. if (!(layerRule instanceof CSSLayerBlockRule)) {
  344. continue
  345. }
  346. if (layerRule.name === 'colors') {
  347. colorsLayer = layerRule
  348. }
  349. for (const cssRule of layerRule.cssRules) {
  350. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  351. continue
  352. }
  353. // WARNING: Safari does not have/supports `conditionText`.
  354. if (cssRule.conditionText) {
  355. if (cssRule.conditionText !== prefersColorSchemeDark) {
  356. continue
  357. }
  358. } else {
  359. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  360. continue
  361. }
  362. }
  363. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  364. }
  365. }
  366. // WARNING: do not try to insert a Rule to a styleSheet you are
  367. // currently iterating on, otherwise the browser will be stuck
  368. // in a infinite loop…
  369. for (const mediaRule of mediaRules) {
  370. // Safari requires the `0` second parameter (even if default).
  371. colorsLayer.insertRule(mediaRule.cssText, 0)
  372. hasDarkRules = true
  373. }
  374. }
  375. if (hasDarkRules) {
  376. if ('customElements' in window && !customElements.get('theme-toggle')) {
  377. customElements.define('theme-toggle', ThemeToggle)
  378. }
  379. }
  380. })
  381. </script>
  382. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  383. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  384. <script>
  385. tippy('[data-tippy]', {
  386. content(reference) {
  387. reference.addEventListener('click', (e) => e.preventDefault())
  388. return `
  389. <h3 lang="fr">
  390. <img src="${reference.dataset.favicon}" loading="lazy">
  391. <a href="${reference.dataset.source}"
  392. >Article sur ${reference.dataset.domain}</a></h3>
  393. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  394. <div class="tippy-links" lang="fr">
  395. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  396. </div>
  397. `
  398. },
  399. allowHTML: true,
  400. interactive: true,
  401. delay: [150, 700],
  402. hideOnClick: false
  403. })
  404. </script>
  405. <script type="module">
  406. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  407. const markObserver = new IntersectionObserver((entries, observer) => {
  408. const computedStyle = getComputedStyle(document.documentElement)
  409. const markBackground = computedStyle.getPropertyValue('--mark-background')
  410. for (const entry of entries) {
  411. if (entry.intersectionRatio === 0) continue
  412. const markElement = entry.target
  413. const annotation = annotate(
  414. markElement, {
  415. type: 'highlight',
  416. multiline: true,
  417. color: markBackground,
  418. animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  419. }
  420. )
  421. annotation.show()
  422. observer.unobserve(markElement)
  423. }
  424. }, {threshold: 1.0})
  425. for (const markElement of document.querySelectorAll('mark')) {
  426. markElement.style.backgroundColor = 'inherit'
  427. markObserver.observe(markElement)
  428. }
  429. </script>
  430. </body>
  431. </html>