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

10 місяці тому
10 місяці тому
8 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
2 тижднів тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <!DOCTYPE html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="{% block lang %}fr{% endblock lang %}">
  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. {% block title %}{% endblock %}
  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="{% block description %}{% endblock %}">
  71. <!-- That good ol' feed, subscribe :). -->
  72. <link rel="alternate"
  73. type="application/atom+xml"
  74. title="Feed"
  75. href="/david/log/">
  76. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  77. <link rel="apple-touch-icon"
  78. sizes="180x180"
  79. href="/static/david/icons2/apple-touch-icon.png">
  80. <link rel="icon"
  81. type="image/png"
  82. sizes="32x32"
  83. href="/static/david/icons2/favicon-32x32.png">
  84. <link rel="icon"
  85. type="image/png"
  86. sizes="16x16"
  87. href="/static/david/icons2/favicon-16x16.png">
  88. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  89. <link rel="mask-icon"
  90. href="/static/david/icons2/safari-pinned-tab.svg"
  91. color="#07486c">
  92. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  93. <meta name="msapplication-TileColor" content="#f7f7f7">
  94. <meta name="msapplication-config"
  95. content="/static/david/icons2/browserconfig.xml">
  96. <meta name="theme-color"
  97. content="#f7f7f7"
  98. media="(prefers-color-scheme: light)">
  99. <meta name="theme-color"
  100. content="#272727"
  101. media="(prefers-color-scheme: dark)">
  102. <!-- Is that even respected? Retrospectively? What a shAItshow…
  103. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  104. <meta name="robots" content="noai, noimageai">
  105. <!-- To get attribution when linking on mastodon. -->
  106. <meta name="fediverse:creator" content="@david@larlet.fr">
  107. {% block extra_head %}{% endblock %}
  108. <body data-instant-intensity="viewport-all">
  109. <article>
  110. {% block content %}
  111. {% endblock content %}
  112. {% block search %}
  113. <form action="/david/recherche/" method="get">
  114. <fieldset>
  115. <legend>Recherche</legend>
  116. <label for="input-search">Termes de votre recherche :</label>
  117. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  118. <input type="submit" value="Chercher">
  119. <p id="indexation-infos">
  120. <small>
  121. Seuls les contenus de ces 8 dernières années sont indexés.
  122. </small>
  123. </p>
  124. </fieldset>
  125. </form>
  126. {% endblock search %}
  127. <aside>
  128. <theme-toggle></theme-toggle>
  129. </aside>
  130. </article>
  131. <hr>
  132. <footer>
  133. <p>
  134. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  135. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  136. <a href="http://larlet.com"
  137. title="Go to my English profile"
  138. data-instant>Pro</a>
  139. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  140. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  141. </p>
  142. <template id="theme-selector">
  143. <form>
  144. <style type="text/css">
  145. fieldset div {
  146. text-align: center;
  147. }
  148. </style>
  149. <fieldset>
  150. <legend>Thème</legend>
  151. <div>
  152. <label>
  153. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  154. Auto
  155. </label>
  156. <label>
  157. <input type="radio" value="dark" name="chosen-color-scheme">
  158. Foncé
  159. </label>
  160. <label>
  161. <input type="radio" value="light" name="chosen-color-scheme">
  162. Clair
  163. </label>
  164. </div>
  165. </fieldset>
  166. </form>
  167. </template>
  168. </footer>
  169. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  170. <script>
  171. class ThemeToggle extends HTMLElement {
  172. constructor() {
  173. super()
  174. const themeSelectorTemplate = document.querySelector('#theme-selector')
  175. const form = themeSelectorTemplate.content.firstElementChild
  176. this.attachShadow({ mode: 'open' })
  177. this.shadowRoot.appendChild(form.cloneNode(true))
  178. }
  179. connectedCallback() {
  180. const form = this.shadowRoot.querySelector('form')
  181. form.addEventListener('change', (e) => {
  182. const chosenColorScheme = e.target.value
  183. localStorage.setItem('theme', chosenColorScheme)
  184. toggleTheme(chosenColorScheme)
  185. })
  186. const selectedTheme = localStorage.getItem('theme')
  187. if (selectedTheme && selectedTheme !== 'undefined') {
  188. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  189. }
  190. }
  191. }
  192. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  193. window.addEventListener('load', () => {
  194. let colorsLayer = undefined
  195. let hasDarkRules = false
  196. for (const styleSheet of Array.from(document.styleSheets)) {
  197. let mediaRules = []
  198. for (const layerRule of styleSheet.cssRules) {
  199. if (!(layerRule instanceof CSSLayerBlockRule)) {
  200. continue
  201. }
  202. if (layerRule.name === 'colors') {
  203. colorsLayer = layerRule
  204. }
  205. for (const cssRule of layerRule.cssRules) {
  206. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  207. continue
  208. }
  209. // WARNING: Safari does not have/supports `conditionText`.
  210. if (cssRule.conditionText) {
  211. if (cssRule.conditionText !== prefersColorSchemeDark) {
  212. continue
  213. }
  214. } else {
  215. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  216. continue
  217. }
  218. }
  219. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  220. }
  221. }
  222. // WARNING: do not try to insert a Rule to a styleSheet you are
  223. // currently iterating on, otherwise the browser will be stuck
  224. // in a infinite loop…
  225. for (const mediaRule of mediaRules) {
  226. // Safari requires the `0` second parameter (even if default).
  227. colorsLayer.insertRule(mediaRule.cssText, 0)
  228. hasDarkRules = true
  229. }
  230. }
  231. if (hasDarkRules) {
  232. if ('customElements' in window && !customElements.get('theme-toggle')) {
  233. customElements.define('theme-toggle', ThemeToggle)
  234. }
  235. }
  236. })
  237. </script>
  238. {% block extra_body %}{% endblock %}
  239. </body>
  240. </html>