Browse Source

More links

master
David Larlet 1 year ago
parent
commit
743bba5249
29 changed files with 4014 additions and 0 deletions
  1. 230
    0
      cache/2022/0195a7767c46de6bc21bb35b542911a6/index.html
  2. 122
    0
      cache/2022/0195a7767c46de6bc21bb35b542911a6/index.md
  3. 314
    0
      cache/2022/0707aa459878d644f14b65e9e05e9537/index.html
  4. 145
    0
      cache/2022/0707aa459878d644f14b65e9e05e9537/index.md
  5. 366
    0
      cache/2022/1dd0383e3a416109e4259144d7a67e2d/index.html
  6. 162
    0
      cache/2022/1dd0383e3a416109e4259144d7a67e2d/index.md
  7. 172
    0
      cache/2022/2458bbc9f86af47ffffcd1b99f19743a/index.html
  8. 5
    0
      cache/2022/2458bbc9f86af47ffffcd1b99f19743a/index.md
  9. 235
    0
      cache/2022/34e73243a6ed7e36a8348b98ea79e52b/index.html
  10. 130
    0
      cache/2022/34e73243a6ed7e36a8348b98ea79e52b/index.md
  11. 197
    0
      cache/2022/4687697ee56ee244b7d9d17a4a328c6a/index.html
  12. 8
    0
      cache/2022/4687697ee56ee244b7d9d17a4a328c6a/index.md
  13. 214
    0
      cache/2022/4d01ca34a54c4be19535df17fdf0c9d2/index.html
  14. 47
    0
      cache/2022/4d01ca34a54c4be19535df17fdf0c9d2/index.md
  15. 192
    0
      cache/2022/6a8fadb032ab4c1951319268a1315655/index.html
  16. 25
    0
      cache/2022/6a8fadb032ab4c1951319268a1315655/index.md
  17. 261
    0
      cache/2022/72b4d15d286c2df85aba5742b1d98e62/index.html
  18. 94
    0
      cache/2022/72b4d15d286c2df85aba5742b1d98e62/index.md
  19. 210
    0
      cache/2022/7616326c2896e35714a26de5d2898736/index.html
  20. 10
    0
      cache/2022/7616326c2896e35714a26de5d2898736/index.md
  21. 179
    0
      cache/2022/7f62798239c75130d19c030a4c695027/index.html
  22. 5
    0
      cache/2022/7f62798239c75130d19c030a4c695027/index.md
  23. 205
    0
      cache/2022/ce44e844633f17f25d53f44c1ebd35e7/index.html
  24. 10
    0
      cache/2022/ce44e844633f17f25d53f44c1ebd35e7/index.md
  25. 184
    0
      cache/2022/ce69309198dcbdbcb1d5ff9f784c4925/index.html
  26. 17
    0
      cache/2022/ce69309198dcbdbcb1d5ff9f784c4925/index.md
  27. 208
    0
      cache/2022/f761b745c18906fa98046badd51231c2/index.html
  28. 39
    0
      cache/2022/f761b745c18906fa98046badd51231c2/index.md
  29. 28
    0
      cache/2022/index.html

+ 230
- 0
cache/2022/0195a7767c46de6bc21bb35b542911a6/index.html View File

@@ -0,0 +1,230 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Un homme peut-il être un conjoint violent malgré lui ? (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://centre-bertha-pappenheim.fr/2021/10/20/un-homme-peut-il-etre-un-conjoint-violent-malgre-lui/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Un homme peut-il être un conjoint violent malgré lui ?</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://centre-bertha-pappenheim.fr/2021/10/20/un-homme-peut-il-etre-un-conjoint-violent-malgre-lui/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>À l’heure où des avocats trouvent aisément à faire éditer leurs plaidoyers larmoyants en faveur de conjoints féminicidaires et où d’autres, parvenus à se hisser au sommet de la chaîne judiciaire, prétendent nous faire croire que des casques de réalité virtuelle peuvent transformer des conjoints agresseurs en des partenaires de vie empathiques, il nous a semblé nécessaire de faire un point sur la question des violences conjugales, grandes <strong>pourvoyeuses de psychotraumatismes</strong>. </p>

<h2 class="has-secondary-color has-text-color" id="la-violence-conjugale-est-structurelle">La violence conjugale est structurelle</h2>

<p>Rappelons tout d’abord avec Lucile Peytavin que, en France comme ailleurs, l’intégralité des formes de violences sont essentiellement <strong>commises par des hommes</strong><sup>[1]</sup>. Cette distribution statistique n’a rien d’accidentel : la violence est à la fois le produit et le principal outil de reproduction de la <strong>domination masculine</strong> en tant que <strong>système social</strong>. </p>

<p>En effet, des (pré)historien· nes ont démontré que les violences de masse sont apparues de manière simultanée avec l’instauration d’une domination systématique des hommes sur les femmes et les enfants, système social qu’on appelle <strong>patriarcat</strong><sup>[2]</sup>. Des anthropologues ont également mis en évidence que les sociétés où les hommes exercent le moins de pouvoir sur les femmes se caractérisent par les taux d’agressions interpersonnelles les plus bas et ce, quel que soit le type de violence ou la catégorie de population considérée (femmes, enfants ou hommes)<sup>[3]</sup>. C’est pourquoi <strong>nous considérons illusoire de vouloir analyser les violences conjugales isolément de ce contexte de domination masculine structurelle</strong>.</p>

<p>Quant au caractère <strong>instrumental </strong>de la violence masculine, il existe un certain consensus lorsque l’on parle de violences de guerre ou de sociétés que nous, populations occidentales, voyons comme éloignées de la nôtre, mais ce consensus s’évanouit lorsqu’il est question de violences « bien de chez nous », en particulier les violences conjugales et intrafamiliales.</p>

<h2 class="has-secondary-color has-text-color" id="en-finir-avec-la-surparticularisation-de-la-violence-physique">En finir avec la surparticularisation de la violence physique</h2>

<h4 id="une-mise-en-lumiere-qui-en-laisse-beaucoup-dans-l-ombre">Une mise en lumière qui en laisse beaucoup dans l’ombre</h4>

<p>Bien que la question des violences masculines conjugales<sup>[4]</sup> fasse l’objet d’un intérêt médiatique plus conséquent depuis #MeToo, il s’agit d’une <strong>médiatisation en trompe-l’œil</strong>, qui réduit le plus souvent la violence à sa seule dimension physique. Ce traitement médiatique alimente l’idée qu’il s’agit d’un problème certes fâcheux, mais somme toute marginal, causé par une frange d’individus un peu malades et, ce faisant, inaptes à contrôler leur violence, voire contrôlés par elle.</p>

<h4 id="les-sequelles-de-la-violence-psychologique">Les séquelles de la violence psychologique</h4>

<p>Les spécialistes de la domination masculine dans le couple exhortent pourtant à se garder d’une vision trop singularisante des violences physiques : <strong>les coups à proprement parler constituent l’aboutissement <em>possible</em> de tout un continuum de violences psychologiques</strong>, souvent assorties de violences sexuelles et/ou économiques, instaurant progressivement et insidieusement un <strong>climat d’emprise</strong>. De manière significative, les enquêtes menées sur les féminicides conjugaux ne permettent pas toujours d’en conclure à des antécédents de violences physiques. Au Québec, aux États-Unis et en France, ce pourcentage a été estimé à environ un tiers – ce qui signifie que deux tiers des hommes qui assassinent leur compagne ou ex-compagne n’avaient vraisemblablement jamais levé la main sur elle auparavant<sup>[5]</sup>. Les agressions physiques constituent donc une composante<em> </em><strong>possible mais non nécessaire</strong> à la caractérisation de la violence conjugales, et son absence ne doit en aucun cas être appréhendée comme un indicateur de moindre dangerosité pour la femme victime. Lundy Bancroft signale par ailleurs que<strong> le degré de violence psychologique est le meilleur facteur de prédiction du passage à l’agression physique</strong><sup>[6]</sup>. Il souligne également que la violence sexuelle constitue la forme de violence conjugale la plus répandue, la plus transversale à tous les profils de conjoints agresseurs ; or, il s’agit là d’une violence indissociablement physique et psychologique. </p>

<p>Cet expert étatsunien intervenant auprès de conjoints violents depuis plus de trente ans englobe sous l’étiquette “conjoint violent” (<em>abusive partner</em>)<strong> tout homme qui “[fait] chroniquement sentir [sa] partenaire maltraitée ou dévalorisée</strong>”<sup>[7]</sup>. Il insiste également sur le caractère injustifié du traitement particularisant réservé à la violence physique :</p>

<p class="has-text-align-center">“Les cicatrices de la cruauté mentale peuvent être aussi profondes et durables que les séquelles de coups de poings ou de gifles mais ne sont généralement pas aussi visibles. En réalité, même parmi les femmes qui ont subi des violences physiques de la part d’un conjoint, la moitié voire plus reporte que <strong>c’est la violence émotionnelle de l’homme qui leur a causé le plus de dommages</strong>.”</p>

<p>Ses conclusions concernant les dommages causés par les différentes formes de violence conjugale convergent avec celles d’études ayant mis en évidence que <strong>les séquelles traumatiques de la torture psychologique étaient équivalentes à celles laissées par la torture physique</strong><sup>[8]</sup>.</p>

<h4 id="aux-racines-de-la-violence">Aux racines de la violence</h4>

<p>Bancroft poursuit ainsi :</p>

<p class="has-text-align-center">“Les différences entre l’homme verbalement violent et l’agresseur physique ne sont pas aussi grandes que beaucoup de gens le croient. Le comportement de l’un comme de l’autre se nourrit des mêmes racines et est mû par le même mode de pensée.”<sup>[9]</sup></p>

<p>Il rejoint en cela les analyses posées par les féministes depuis plusieurs décennies, à savoir que les différentes formes que revêt la violence masculine conjugale n’ont pas seulement les mêmes effets en termes de séquelles, mais également les mêmes causes : elles puisent leurs racines dans <strong>l’intime conviction de ces hommes que les femmes – à plus forte raison <em>la leur</em> – sont là pour les servir</strong> (les anglophones parlent d’<em>entitlement</em>). La totalité du spectre de cette violence, depuis la contrainte la plus explicite jusqu’à la manipulation la plus insidieuse, vise <strong>une même finalité : asseoir le contrôle</strong> qui leur permet d’imposer leur volonté d’être servis et obéis. Que les contours des “prestations” qu’ils estiment leur être dues et des stratégies qu’ils déploient pour arriver à leurs fins varient d’un individu à un autre ne fait que masquer leur point commun fondamental : le <strong>rapport utilitariste </strong>qu’ils entretiennent à leur partenaire, et sa conséquence logique, leur usage instrumental de la violence. Rudolf Rausch, également spécialiste de la question, affirme ainsi :</p>

<p class="has-text-align-center">“Ce qui explique pourquoi il y a autant de violence conjugale c’est que, d’une part, au niveau de la construction sociale, depuis bien longtemps et jusqu’à très récemment, <strong>les hommes pouvaient essentiellement se servir de la violence pour arriver à leurs fins impunément</strong> et ils étaient même encouragés à utiliser ce moyen-là. Et d’autre part, au niveau individuel, il est sûr que cette violence-là est très <strong>rentable </strong>: à chaque fois qu’on y a recours, habituellement on a gain de cause, on arrive à nos fins, ce qui fait qu’il y a un renforcement presque immédiat à son utilisation. Plus il y a d’individus qui l’utilisent, plus la construction sociale de la violence se maintient et plus cette construction se maintient, plus il y a d’individus qui se croient autorisés à y recourir. […] Cela permet de rapatrier un peu plus la responsabilité des hommes : <strong>la violence n’est plus un geste réactionnel, mais instrumental, axé sur l’obtention d’un but</strong>. […] c’est un geste qu’on peut identifier et nommer, de même que l’intention derrière le geste, mais en plus on constate que, en général, cela a fonctionné et que l’homme a effectivement eu gain de cause.”<sup>[10]</sup></p>

<p>Pour Marie-France Hirigoyen, experte de l’emprise conjugale, le recours à la force physique est dès lors à comprendre comme pleinement rationnel : </p>

<p class="has-text-align-center">“On ne peut pas parler de violence physique sans parler de violence psychologique car il existe un <em>continuum</em> entre les deux. Quand un homme frappe sa femme, son but n’est pas de lui mettre un œil au beurre noir mais de lui faire peur afin de la soumettre et de garder le pouvoir. <strong>L’enjeu de la violence, c’est toujours la domination.</strong> La plupart du temps, la violence physique n’intervient que si la femme résiste au contrôle et à la violence psychologique.”<sup>[11]</sup></p>

<p>La violence sexuelle a ceci de spécifique qu’elle est à la fois un outil et une fin de la domination masculine, notamment au sein du couple.</p>

<h2 class="has-secondary-color has-text-color" id="la-violence-conjugale-est-deliberee">La violence conjugale est délibérée</h2>

<p>Il nous paraît fondamental d’insister sur ce point, car les conjoints violents tirent activement parti du mythe selon lequel les hommes ne sont pas pleinement conscients du mal qu’ils font et/ou qu’ils le font malgré eux, comme si leur violence était quelque chose qu’ils subissaient. Il suffirait qu’ils comprennent pourquoi ils font ce qu’ils font et qu’ils apprennent comment ne plus le faire pour qu’ils cessent de le faire. Mais, que ce soit avec les mains ou avec les mots, les coups que les hommes portent à leur compagne ne résultent ni d’incontrôlables éruptions émotionnelles, ni d’une sorte de malentendu qu’une simulation en réalité virtuelle ou un travail de “pédagogie” féministe – aussi assidu soit-il – suffirait à dissiper : <strong>ils savent ce qu’ils font et pourquoi ils le font</strong>. </p>

<p>Conjugué au dressage précoce – et féroce – des filles au rôle de bienfaitrices de la communauté pétries d’abnégation, ce mythe des-hommes-qui-ne-se-rendent-pas-compte est un moyen redoutable d’asseoir leur emprise sur les femmes, tant à l’échelle individuelle que collective. « Pardonne-leur, ils ne savent pas ce qu’ils font ! « , nous serine-t-on depuis au moins 2000 ans. « Éduque-les à devenir meilleurs ! » nous enjoint-on désormais en prime – qui plus est, au nom du féminisme. Il s’agit là du terreau sur lequel les conjoints violents peuvent semer la confusion dans l’esprit de leurs compagnes : “Chérie, je ne comprends pas pourquoi je suis comme ça, c’est plus fort que moi et j’en souffre tellement, toi seule peux m’aider à devenir une meilleure personne !” C’est ainsi qu’ils les enchaînent à eux.</p>

<figure class="wp-block-image size-large"><img data-attachment-id="436" data-permalink="https://centre-bertha-pappenheim.fr/stethoscope/" data-orig-file="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg" data-orig-size="3256,2480" data-comments-opened="0" data-image-meta='{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="stethoscope-" data-image-description="" data-image-caption="" data-medium-file="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=300" data-large-file="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=620" src="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=1024" alt="" class="wp-image-436" srcset="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=1024 1024w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=2048 2048w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=150 150w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=300 300w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px"></figure>

<p>Lundy Bancroft explique que, par-delà la diversité de leurs profils, les conjoints violents ont en commun de jouer sur l’alternance imprévisible entre leur côté “Docteur Jekyll” et leur facette “Mister Hyde” afin de plonger leur conjointe dans un abîme d’incompréhension : <strong>comment peut-il avoir autant de bons côtés et me faire <em>quand même </em>autant de mal ?</strong> </p>

<p>La réponse de Lundy Bancroft à cette question est sans appel :</p>

<p class="has-text-align-center">“J’ai fini par me rendre compte, à travers mon expérience auprès de milliers d’agresseurs, que le conjoint violent <em>veut</em> être un mystère. Pour ne pas subir les conséquences de ses actes et éviter d’affronter son problème, il doit convaincre tout son entourage que son comportement est incompréhensible. <strong>Il a besoin que sa conjointe se concentre sur tout <em>sauf</em> sur la cause réelle de son comportement. </strong>(…) Dans l’esprit de l’agresseur, il existe un monde de croyances, de perceptions et de réponses qui s’assemblent de manière étonnamment logique. Son comportement est cohérent. Sous la façade de l’irrationalité et de l’explosivité, il y a un être humain avec un problème compréhensible et soluble. Mais il ne veut pas que vous le compreniez.”<sup>[12]</sup></p>

<p>Une femme a très peu de chances de parvenir à quitter un conjoint maltraitant tant qu’elle reste convaincue d’avoir la possibilité de l’amener à changer. Et, tant qu’elle restera à ses côtés, il aura tout le loisir de continuer à la meurtrir, en instaurant une escalade graduelle de la violence qui aura pour effet de resserrer de plus en plus sur elle l’étau de l’<a href="https://centre-bertha-pappenheim.fr/2021/09/13/le-stress-post-traumatique-complexe/"><strong>attachement traumatique</strong></a>, <strong>caractéristique des situations d’emprise</strong>.</p>

<p class="has-secondary-background-color has-background">Faire croire aux femmes qu’elles peuvent se prémunir de la violence des hommes en sondant leur cœur pour le soigner, telles des infirmières de l’âme, n’est pas seulement mensonger – c’est criminel, car cela contribue à mettre les femmes en danger. <strong>Ce qui est stéthoscope pour les unes est harpon pour les autres. </strong>En finir avec le mythe des-hommes-qui-ne-se-rendent-pas-compte et rendre aux agresseurs leur responsabilité est donc à la fois <strong>une étape, certes douloureuse, mais incontournable du cheminement thérapeutique pour surmonter les séquelles d’une relation violente et un impératif politique dans la lutte globale contre les violences patriarcales</strong>.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 122
- 0
cache/2022/0195a7767c46de6bc21bb35b542911a6/index.md View File

@@ -0,0 +1,122 @@
title: Un homme peut-il être un conjoint violent malgré lui ?
url: https://centre-bertha-pappenheim.fr/2021/10/20/un-homme-peut-il-etre-un-conjoint-violent-malgre-lui/
hash_url: 0195a7767c46de6bc21bb35b542911a6

<p>À l’heure où des avocats trouvent aisément à faire éditer leurs plaidoyers larmoyants en faveur de conjoints féminicidaires et où d’autres, parvenus à se hisser au sommet de la chaîne judiciaire, prétendent nous faire croire que des casques de réalité virtuelle peuvent transformer des conjoints agresseurs en des partenaires de vie empathiques, il nous a semblé nécessaire de faire un point sur la question des violences conjugales, grandes <strong>pourvoyeuses de psychotraumatismes</strong>. </p>



<h2 class="has-secondary-color has-text-color" id="la-violence-conjugale-est-structurelle">La violence conjugale est structurelle</h2>



<p>Rappelons tout d’abord avec Lucile Peytavin que, en France comme ailleurs, l’intégralité des formes de violences sont essentiellement <strong>commises par des hommes</strong><sup>[1]</sup>. Cette distribution statistique n’a rien d’accidentel : la violence est à la fois le produit et le principal outil de reproduction de la <strong>domination masculine</strong> en tant que <strong>système social</strong>. </p>



<p>En effet, des (pré)historien· nes ont démontré que les violences de masse sont apparues de manière simultanée avec l’instauration d’une domination systématique des hommes sur les femmes et les enfants, système social qu’on appelle <strong>patriarcat</strong><sup>[2]</sup>. Des anthropologues ont également mis en évidence que les sociétés où les hommes exercent le moins de pouvoir sur les femmes se caractérisent par les taux d’agressions interpersonnelles les plus bas et ce, quel que soit le type de violence ou la catégorie de population considérée (femmes, enfants ou hommes)<sup>[3]</sup>. C’est pourquoi <strong>nous considérons illusoire de vouloir analyser les violences conjugales isolément de ce contexte de domination masculine structurelle</strong>.</p>



<p>Quant au caractère <strong>instrumental </strong>de la violence masculine, il existe un certain consensus lorsque l’on parle de violences de guerre ou de sociétés que nous, populations occidentales, voyons comme éloignées de la nôtre, mais ce consensus s’évanouit lorsqu’il est question de violences « bien de chez nous », en particulier les violences conjugales et intrafamiliales.</p>



<h2 class="has-secondary-color has-text-color" id="en-finir-avec-la-surparticularisation-de-la-violence-physique">En finir avec la surparticularisation de la violence physique</h2>



<h4 id="une-mise-en-lumiere-qui-en-laisse-beaucoup-dans-l-ombre">Une mise en lumière qui en laisse beaucoup dans l’ombre</h4>



<p>Bien que la question des violences masculines conjugales<sup>[4]</sup> fasse l’objet d’un intérêt médiatique plus conséquent depuis #MeToo, il s’agit d’une <strong>médiatisation en trompe-l’œil</strong>, qui réduit le plus souvent la violence à sa seule dimension physique. Ce traitement médiatique alimente l’idée qu’il s’agit d’un problème certes fâcheux, mais somme toute marginal, causé par une frange d’individus un peu malades et, ce faisant, inaptes à contrôler leur violence, voire contrôlés par elle.</p>



<h4 id="les-sequelles-de-la-violence-psychologique">Les séquelles de la violence psychologique</h4>



<p>Les spécialistes de la domination masculine dans le couple exhortent pourtant à se garder d’une vision trop singularisante des violences physiques : <strong>les coups à proprement parler constituent l’aboutissement <em>possible</em> de tout un continuum de violences psychologiques</strong>, souvent assorties de violences sexuelles et/ou économiques, instaurant progressivement et insidieusement un <strong>climat d’emprise</strong>. De manière significative, les enquêtes menées sur les féminicides conjugaux ne permettent pas toujours d’en conclure à des antécédents de violences physiques. Au Québec, aux États-Unis et en France, ce pourcentage a été estimé à environ un tiers – ce qui signifie que deux tiers des hommes qui assassinent leur compagne ou ex-compagne n’avaient vraisemblablement jamais levé la main sur elle auparavant<sup>[5]</sup>. Les agressions physiques constituent donc une composante<em> </em><strong>possible mais non nécessaire</strong> à la caractérisation de la violence conjugales, et son absence ne doit en aucun cas être appréhendée comme un indicateur de moindre dangerosité pour la femme victime. Lundy Bancroft signale par ailleurs que<strong> le degré de violence psychologique est le meilleur facteur de prédiction du passage à l’agression physique</strong><sup>[6]</sup>. Il souligne également que la violence sexuelle constitue la forme de violence conjugale la plus répandue, la plus transversale à tous les profils de conjoints agresseurs ; or, il s’agit là d’une violence indissociablement physique et psychologique. </p>



<p>Cet expert étatsunien intervenant auprès de conjoints violents depuis plus de trente ans englobe sous l’étiquette “conjoint violent” (<em>abusive partner</em>)<strong> tout homme qui “[fait] chroniquement sentir [sa] partenaire maltraitée ou dévalorisée</strong>”<sup>[7]</sup>. Il insiste également sur le caractère injustifié du traitement particularisant réservé à la violence physique :</p>



<p class="has-text-align-center">“Les cicatrices de la cruauté mentale peuvent être aussi profondes et durables que les séquelles de coups de poings ou de gifles mais ne sont généralement pas aussi visibles. En réalité, même parmi les femmes qui ont subi des violences physiques de la part d’un conjoint, la moitié voire plus reporte que <strong>c’est la violence émotionnelle de l’homme qui leur a causé le plus de dommages</strong>.”</p>



<p>Ses conclusions concernant les dommages causés par les différentes formes de violence conjugale convergent avec celles d’études ayant mis en évidence que <strong>les séquelles traumatiques de la torture psychologique étaient équivalentes à celles laissées par la torture physique</strong><sup>[8]</sup>.</p>



<h4 id="aux-racines-de-la-violence">Aux racines de la violence</h4>



<p>Bancroft poursuit ainsi :</p>



<p class="has-text-align-center">“Les différences entre l’homme verbalement violent et l’agresseur physique ne sont pas aussi grandes que beaucoup de gens le croient. Le comportement de l’un comme de l’autre se nourrit des mêmes racines et est mû par le même mode de pensée.”<sup>[9]</sup></p>



<p>Il rejoint en cela les analyses posées par les féministes depuis plusieurs décennies, à savoir que les différentes formes que revêt la violence masculine conjugale n’ont pas seulement les mêmes effets en termes de séquelles, mais également les mêmes causes : elles puisent leurs racines dans <strong>l’intime conviction de ces hommes que les femmes – à plus forte raison <em>la leur</em> – sont là pour les servir</strong> (les anglophones parlent d’<em>entitlement</em>). La totalité du spectre de cette violence, depuis la contrainte la plus explicite jusqu’à la manipulation la plus insidieuse, vise <strong>une même finalité : asseoir le contrôle</strong> qui leur permet d’imposer leur volonté d’être servis et obéis. Que les contours des “prestations” qu’ils estiment leur être dues et des stratégies qu’ils déploient pour arriver à leurs fins varient d’un individu à un autre ne fait que masquer leur point commun fondamental : le <strong>rapport utilitariste </strong>qu’ils entretiennent à leur partenaire, et sa conséquence logique, leur usage instrumental de la violence. Rudolf Rausch, également spécialiste de la question, affirme ainsi :</p>



<p class="has-text-align-center">“Ce qui explique pourquoi il y a autant de violence conjugale c’est que, d’une part, au niveau de la construction sociale, depuis bien longtemps et jusqu’à très récemment, <strong>les hommes pouvaient essentiellement se servir de la violence pour arriver à leurs fins impunément</strong> et ils étaient même encouragés à utiliser ce moyen-là. Et d’autre part, au niveau individuel, il est sûr que cette violence-là est très <strong>rentable </strong>: à chaque fois qu’on y a recours, habituellement on a gain de cause, on arrive à nos fins, ce qui fait qu’il y a un renforcement presque immédiat à son utilisation. Plus il y a d’individus qui l’utilisent, plus la construction sociale de la violence se maintient et plus cette construction se maintient, plus il y a d’individus qui se croient autorisés à y recourir. […] Cela permet de rapatrier un peu plus la responsabilité des hommes : <strong>la violence n’est plus un geste réactionnel, mais instrumental, axé sur l’obtention d’un but</strong>. […] c’est un geste qu’on peut identifier et nommer, de même que l’intention derrière le geste, mais en plus on constate que, en général, cela a fonctionné et que l’homme a effectivement eu gain de cause.”<sup>[10]</sup></p>



<p>Pour Marie-France Hirigoyen, experte de l’emprise conjugale, le recours à la force physique est dès lors à comprendre comme pleinement rationnel : </p>



<p class="has-text-align-center">“On ne peut pas parler de violence physique sans parler de violence psychologique car il existe un <em>continuum</em> entre les deux. Quand un homme frappe sa femme, son but n’est pas de lui mettre un œil au beurre noir mais de lui faire peur afin de la soumettre et de garder le pouvoir. <strong>L’enjeu de la violence, c’est toujours la domination.</strong> La plupart du temps, la violence physique n’intervient que si la femme résiste au contrôle et à la violence psychologique.”<sup>[11]</sup></p>



<p>La violence sexuelle a ceci de spécifique qu’elle est à la fois un outil et une fin de la domination masculine, notamment au sein du couple.</p>



<h2 class="has-secondary-color has-text-color" id="la-violence-conjugale-est-deliberee">La violence conjugale est délibérée</h2>



<p>Il nous paraît fondamental d’insister sur ce point, car les conjoints violents tirent activement parti du mythe selon lequel les hommes ne sont pas pleinement conscients du mal qu’ils font et/ou qu’ils le font malgré eux, comme si leur violence était quelque chose qu’ils subissaient. Il suffirait qu’ils comprennent pourquoi ils font ce qu’ils font et qu’ils apprennent comment ne plus le faire pour qu’ils cessent de le faire. Mais, que ce soit avec les mains ou avec les mots, les coups que les hommes portent à leur compagne ne résultent ni d’incontrôlables éruptions émotionnelles, ni d’une sorte de malentendu qu’une simulation en réalité virtuelle ou un travail de “pédagogie” féministe – aussi assidu soit-il – suffirait à dissiper : <strong>ils savent ce qu’ils font et pourquoi ils le font</strong>. </p>



<p>Conjugué au dressage précoce – et féroce – des filles au rôle de bienfaitrices de la communauté pétries d’abnégation, ce mythe des-hommes-qui-ne-se-rendent-pas-compte est un moyen redoutable d’asseoir leur emprise sur les femmes, tant à l’échelle individuelle que collective. « Pardonne-leur, ils ne savent pas ce qu’ils font ! « , nous serine-t-on depuis au moins 2000 ans. « Éduque-les à devenir meilleurs ! » nous enjoint-on désormais en prime – qui plus est, au nom du féminisme. Il s’agit là du terreau sur lequel les conjoints violents peuvent semer la confusion dans l’esprit de leurs compagnes : “Chérie, je ne comprends pas pourquoi je suis comme ça, c’est plus fort que moi et j’en souffre tellement, toi seule peux m’aider à devenir une meilleure personne !” C’est ainsi qu’ils les enchaînent à eux.</p>



<figure class="wp-block-image size-large"><img data-attachment-id="436" data-permalink="https://centre-bertha-pappenheim.fr/stethoscope/" data-orig-file="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg" data-orig-size="3256,2480" data-comments-opened="0" data-image-meta='{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="stethoscope-" data-image-description="" data-image-caption="" data-medium-file="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=300" data-large-file="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=620" src="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=1024" alt="" class="wp-image-436" srcset="https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=1024 1024w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=2048 2048w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=150 150w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=300 300w, https://centreberthapappenheim.files.wordpress.com/2021/10/stethoscope-.jpg?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px"></figure>



<p>Lundy Bancroft explique que, par-delà la diversité de leurs profils, les conjoints violents ont en commun de jouer sur l’alternance imprévisible entre leur côté “Docteur Jekyll” et leur facette “Mister Hyde” afin de plonger leur conjointe dans un abîme d’incompréhension : <strong>comment peut-il avoir autant de bons côtés et me faire <em>quand même </em>autant de mal ?</strong> </p>



<p>La réponse de Lundy Bancroft à cette question est sans appel :</p>



<p class="has-text-align-center">“J’ai fini par me rendre compte, à travers mon expérience auprès de milliers d’agresseurs, que le conjoint violent <em>veut</em> être un mystère. Pour ne pas subir les conséquences de ses actes et éviter d’affronter son problème, il doit convaincre tout son entourage que son comportement est incompréhensible. <strong>Il a besoin que sa conjointe se concentre sur tout <em>sauf</em> sur la cause réelle de son comportement. </strong>(…) Dans l’esprit de l’agresseur, il existe un monde de croyances, de perceptions et de réponses qui s’assemblent de manière étonnamment logique. Son comportement est cohérent. Sous la façade de l’irrationalité et de l’explosivité, il y a un être humain avec un problème compréhensible et soluble. Mais il ne veut pas que vous le compreniez.”<sup>[12]</sup></p>



<p>Une femme a très peu de chances de parvenir à quitter un conjoint maltraitant tant qu’elle reste convaincue d’avoir la possibilité de l’amener à changer. Et, tant qu’elle restera à ses côtés, il aura tout le loisir de continuer à la meurtrir, en instaurant une escalade graduelle de la violence qui aura pour effet de resserrer de plus en plus sur elle l’étau de l’<a href="https://centre-bertha-pappenheim.fr/2021/09/13/le-stress-post-traumatique-complexe/"><strong>attachement traumatique</strong></a>, <strong>caractéristique des situations d’emprise</strong>.</p>



<p class="has-secondary-background-color has-background">Faire croire aux femmes qu’elles peuvent se prémunir de la violence des hommes en sondant leur cœur pour le soigner, telles des infirmières de l’âme, n’est pas seulement mensonger – c’est criminel, car cela contribue à mettre les femmes en danger. <strong>Ce qui est stéthoscope pour les unes est harpon pour les autres. </strong>En finir avec le mythe des-hommes-qui-ne-se-rendent-pas-compte et rendre aux agresseurs leur responsabilité est donc à la fois <strong>une étape, certes douloureuse, mais incontournable du cheminement thérapeutique pour surmonter les séquelles d’une relation violente et un impératif politique dans la lutte globale contre les violences patriarcales</strong>.</p>


+ 314
- 0
cache/2022/0707aa459878d644f14b65e9e05e9537/index.html View File

@@ -0,0 +1,314 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Progressively Enhanced Builds (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://blog.jim-nielsen.com/2022/progressively-enhanced-builds/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Progressively Enhanced Builds</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://blog.jim-nielsen.com/2022/progressively-enhanced-builds/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>With the advent of the Jamstack, so many of websites require a build step of some kind before a functioning website can be born.</p>
<p>Build steps are great. I use them all the time. But they do come at a cost.</p>
<p>One of those costs is fragility—builds are prone to breaking. It’s not uncommon to setup a project, return to it six weeks later, run <code>npm install &amp;&amp; npm start</code>, and <em>something</em> breaks. Then begins the troubleshooting. A project from 6 days ago, 6 weeks ago, or 6 years ago, each one of those could present its own set of build problems. Often, you end up with a non-functioning website you cannot edit, test, and update until your build is fixed.</p>
<p>We have a strategy for delivering robust, <a href="https://resilientwebdesign.com">resilient</a> experiences to users in the browser: progressive enhancement. Start with the most basic functionality that lets people do what they need, then enhance from there. In this way, lots of things could go wrong — JavaScript doesn’t load, network calls fail, the user is on an old browser, etc. — but the website remains functional and accessible.</p>
<p>What if we applied a mindset of progressive enhancement to builds and not only user agents? What if build processes were thought of as enhancements and not dependencies? Can you have a progressively enhanced build?</p>
<h2 id="conceptual-underpinnings">Conceptual Underpinnings</h2>
<p>I’ve had a few thoughts swirling in my head around this idea.</p>
<p>First there’s <a href="https://www.baldurbjarnason.com/2021/100-things-every-web-developer-should-know/">Baldur Bjarnason</a> who speaks on the value of tight feedback loops:</p>
<blockquote>
<p>Tight feedback loops are magic: build processes suck. They will always suck because they always loosen up the feedback loop. You can make builds quicker, but until they are virtually instantaneous, they will always suck…If you can make something without a build step, do so. If you can make something without compilation or building, do that. </p>
</blockquote>
<p>Then there’s <a href="https://inoads.com/articles/2021-01-09-Next-Gen-Static-Blogging">this proof-of-concept post from Maximilian Mackh</a> (with some <a href="https://news.ycombinator.com/item?id=25701053">intriguing hackernews comments</a>) which shows how to write a blog post and skip the build process using nifty tricks from HTML and CSS.</p>
<blockquote>
<p>My workflow consists of pressing CMD+S, switching to Safari and reloading the page. What you see now is what I get.</p>
</blockquote>
<p>Then there’s <a href="https://www.robinrendle.com/notes/blogging-and-the-heat-death-of-the-universe/">this post from Robin</a> who notes that entropy acts on all things, including websites and build processes until the last thing left standing is the markup.</p>
<blockquote>
<p>That complex build process? That’s a dependency…</p>
<p>the thing that lasts longest with our websites is probably the part that we spend the least time thinking about—the markup…</p>
<p>This is the second law of thermodynamics made clear on the web: the entropy of any isolated system always increases and, at some point or another, all that’s left of a website is the markup.</p>
</blockquote>
<p>Then there’s <a href="https://adactio.com/journal/17537">this post from Jeremy</a> which details how to think about your website’s features as an enhancements rather than dependencies.</p>
<blockquote>
<p>You certainly couldn’t use an experimental feature for anything mission critical…but you could use it as an enhancement.</p>
<p>And that is a pretty great way to think about all web features, experimental or otherwise. Don’t assume the feature will be supported. Use feature detection (or @supports in the case of CSS). Try to use the feature as an enhancement rather than a dependency.</p>
</blockquote>
<p>The key is to, as Jeremy says, “acknowledge and embrace unpredictability”. That seems like solid advice, whether you’re building on the client <em>or the server</em>.</p>
<blockquote>
<p>Instead of looking at the support table for something on caniuse.com and thinking, “I wish more browsers supported this feature so that I could use it!”, you can instead think “I’m going to use this feature today, but treat it as an experimental feature.”</p>
</blockquote>
<p>In a similar vein, what if you could look at building a website in a different light? Rather than thinking, “how do I combine a bunch of disparate content, templates, and tooling into a functioning website?”, you might think “how do I start at a functioning website with content and then use templates and build tooling to enhance it?”</p>
<p>[Granted: this is not a silver bullet for building every website. Lots of websites can’t start here—but maybe some could?]</p>
<h2 id="technical-ideas">Technical Ideas</h2>
<p>What could this look like? Honestly, I don’t know. But I’ll take a moment to try and imagine <em>something</em>.</p>
<p>I want to be able to view, edit, <em>and if need be ship</em> a website, even if the build process fails. In essence, if the build does fail I can still take all the source files, put them on a server, and the website remains functional (however crude).</p>
<p>I think this kind of approach begs for an HTML-first solution. Your content starts as something that works in the browser — in a less-than-ideal way, sure, but still functional — and the build process parses the base content, injecting additional “features” as enhancements (global header and footer, meta tags, links to CSS and JS, etc.). In this manner, your website starts as content at a URL. Everything else is an enhancement.</p>
<p>For example, think of a classic blog post as a markdown file.</p>
<pre><code class="language language-md">---
title: This is the title of my blog post
date: 2020-09-02
tags:
<span class="hljs-bullet"> -</span> readingNotes
<span class="hljs-section"> - somethingElse
---</span>

<span class="hljs-section"># This is the title of my post</span>

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. [<span class="hljs-string">Here’s a link</span>](<span class="hljs-link">./another-post.md</span>)

![<span class="hljs-string">An image for my blog post</span>](<span class="hljs-link">../images/my-image.jpg</span>)
</code></pre>
<p>What if you rewrote that using HTML for the front-matter semantics? If you want to continue to author the content of the post in markdown, do it, but embed it in a web component (which would get “enhanced” and rendered to HTML somewhere further down the line).</p>
<p>What’s beautiful about markdown is that it’s a kind of progressively-enhanced syntax for writing: link and image URLs are still accessible even when unparsed.</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">wc-markdown</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"white-space: pre-line"</span>&gt;</span>
# This is the title of my post

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. [Here is a link](./another-post.html)

![An image for my blog post](../images/my-image.jpg)
<span class="hljs-tag">&lt;/<span class="hljs-name">wc-markdown</span>&gt;</span>
</code></pre>
<p class="image-container"><img src="https://cdn.jim-nielsen.com/blog/2022/progressive-build-markdown.png" alt="">

</p>
<p>There are trade-offs here: authoring in markdown is a convenience for me, the author, and results in a more crude initial experience (if a build enhancement fails later).</p>
<p>Given that markdown supports HTML, you could trade the image syntax (<code>![]()</code>) for <code>&lt;img&gt;</code> tags or the link syntax (<code>[]()</code>) for <code>&lt;a&gt;</code> tags. That’ll improve the core experience a tiny bit in the browser, as links would be functionally clickable and images would display directly inline.</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">wc-markdown</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"white-space: pre-line"</span>&gt;</span>
# This is the title of my post

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"./another-post.html"</span>&gt;</span>Here is a link<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>

![An image for my blog post](../images/my-image.jpg)
<span class="hljs-tag">&lt;/<span class="hljs-name">wc-markdown</span>&gt;</span>
</code></pre>
<p>Or, as inspired by <a href="https://news.ycombinator.com/item?id=25701842">this comment</a>, you could author your content directly in as sparse a take on HTML as is possible.</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>This is the title of my post<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
I just want to start writing here whatever it is i'm about.
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
This is just another example of how you might do something that is really light and minimal. <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"./another-post.html"</span>&gt;</span>Here is a link<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./image.jpg"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"An image for my blog post"</span>&gt;</span>
</code></pre>
<p>You can see how trading authoring conveniences begins to enhance the base browser experience.</p>
<p class="image-container"><img src="https://cdn.jim-nielsen.com/blog/2022/progressive-build-html.png" alt="">

</p>
<p>These files could be opened in a browser, without a build process or server (i.e. at a URL of <code>file:///Users/Me/Path/To/my-post.html</code>) and the core content would be accessible. And if you markup all the page’s included resources (links, images, styles, scripts, etc.) as relative links, everything will work even without a server. (Granted you’d have to give some thought to structuring your files accordingly.)</p>
<pre><code>.
├── index.html
├── styles.css
├── scripts.js
├── posts/
│ ├── 2020-02-05-my-post.html
│ ├── 2020-02-05-my-post-image.jpg
│ └── 2020-03-21-another-post.html
</code></pre>
<p>If you want the base experience you author to be even slightly better, you could write the stylesheet links and script includes in every single file (rather than append them to each document through a build process). Going back to the markdown example:</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"./web-component-markdown.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">wc-markdown</span>&gt;</span>
# This is the title of my post

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. [Here is a link](./another-post.html)

![An image for my blog post](../images/my-image.jpg)
<span class="hljs-tag">&lt;/<span class="hljs-name">wc-markdown</span>&gt;</span>
</code></pre>
<p>In this example, the trade-off is: overhead to include the <code>&lt;script&gt;</code> tag in every post, but the core experience in the browser is now more enhanced (if JavaScript runs) because the <code>&lt;wc-markdown&gt;</code> component will turn the markdown to HTML in the browser. An additional enhancement from here would be to have the build process (again, if it runs) render the markdown to HTML so the client doesn’t even need the web component!</p>
<p>The beauty is the build process works like progressive enhancement in the browser: the core experience is functional and accessible, then the build process enhances whatever you want to add by injecting those enhancements to the original, accessible HTML documents (things like style tags, script tags, or global header/footer HTML — I could imagine something like <a href="https://cheerio.js.org/">cheerio</a> being useful here).</p>
<p>The build process is a progressive enhancement to the core content of your website. Whether it runs or not, your site remains accessible and deployable at any point in time.</p>
<p>I get it, this won’t work for every website. And things like permalinks get tricky. But I still think it’s an intriguing mindset to start from: don’t assume the presence of a build, treat it as an enhancement rather than a dependency.</p>
<p>I should prototype the idea. I could imagine doing this with a tool like Metalsmith:</p>
<ul>
<li>Put your source files in directory (which works and remains deployable if everything else fails).</li>
<li>Metalsmith reads in all the files and produces a data structure of all the content</li>
<li>Additional files and markup are generated from your site’s content, like index listings, “related posts” sections, etc., while other necessary elements like styles, scripts, or global header/footer markup are injected to each page.</li>
<li>The new site is output as an “enhanced” version of the site <em>before your build started</em>.</li>
</ul>
<p>Are there any build tools advocating this kind of mindset? If you know of any, hit me up. </p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 145
- 0
cache/2022/0707aa459878d644f14b65e9e05e9537/index.md View File

@@ -0,0 +1,145 @@
title: Progressively Enhanced Builds
url: https://blog.jim-nielsen.com/2022/progressively-enhanced-builds/
hash_url: 0707aa459878d644f14b65e9e05e9537

<p>With the advent of the Jamstack, so many of websites require a build step of some kind before a functioning website can be born.</p>
<p>Build steps are great. I use them all the time. But they do come at a cost.</p>
<p>One of those costs is fragility—builds are prone to breaking. It’s not uncommon to setup a project, return to it six weeks later, run <code>npm install &amp;&amp; npm start</code>, and <em>something</em> breaks. Then begins the troubleshooting. A project from 6 days ago, 6 weeks ago, or 6 years ago, each one of those could present its own set of build problems. Often, you end up with a non-functioning website you cannot edit, test, and update until your build is fixed.</p>
<p>We have a strategy for delivering robust, <a href="https://resilientwebdesign.com">resilient</a> experiences to users in the browser: progressive enhancement. Start with the most basic functionality that lets people do what they need, then enhance from there. In this way, lots of things could go wrong — JavaScript doesn’t load, network calls fail, the user is on an old browser, etc. — but the website remains functional and accessible.</p>
<p>What if we applied a mindset of progressive enhancement to builds and not only user agents? What if build processes were thought of as enhancements and not dependencies? Can you have a progressively enhanced build?</p>
<h2 id="conceptual-underpinnings">Conceptual Underpinnings</h2>
<p>I’ve had a few thoughts swirling in my head around this idea.</p>
<p>First there’s <a href="https://www.baldurbjarnason.com/2021/100-things-every-web-developer-should-know/">Baldur Bjarnason</a> who speaks on the value of tight feedback loops:</p>
<blockquote>
<p>Tight feedback loops are magic: build processes suck. They will always suck because they always loosen up the feedback loop. You can make builds quicker, but until they are virtually instantaneous, they will always suck…If you can make something without a build step, do so. If you can make something without compilation or building, do that. </p>
</blockquote>
<p>Then there’s <a href="https://inoads.com/articles/2021-01-09-Next-Gen-Static-Blogging">this proof-of-concept post from Maximilian Mackh</a> (with some <a href="https://news.ycombinator.com/item?id=25701053">intriguing hackernews comments</a>) which shows how to write a blog post and skip the build process using nifty tricks from HTML and CSS.</p>
<blockquote>
<p>My workflow consists of pressing CMD+S, switching to Safari and reloading the page. What you see now is what I get.</p>
</blockquote>
<p>Then there’s <a href="https://www.robinrendle.com/notes/blogging-and-the-heat-death-of-the-universe/">this post from Robin</a> who notes that entropy acts on all things, including websites and build processes until the last thing left standing is the markup.</p>
<blockquote>
<p>That complex build process? That’s a dependency…</p>
<p>the thing that lasts longest with our websites is probably the part that we spend the least time thinking about—the markup…</p>
<p>This is the second law of thermodynamics made clear on the web: the entropy of any isolated system always increases and, at some point or another, all that’s left of a website is the markup.</p>
</blockquote>
<p>Then there’s <a href="https://adactio.com/journal/17537">this post from Jeremy</a> which details how to think about your website’s features as an enhancements rather than dependencies.</p>
<blockquote>
<p>You certainly couldn’t use an experimental feature for anything mission critical…but you could use it as an enhancement.</p>
<p>And that is a pretty great way to think about all web features, experimental or otherwise. Don’t assume the feature will be supported. Use feature detection (or @supports in the case of CSS). Try to use the feature as an enhancement rather than a dependency.</p>
</blockquote>
<p>The key is to, as Jeremy says, “acknowledge and embrace unpredictability”. That seems like solid advice, whether you’re building on the client <em>or the server</em>.</p>
<blockquote>
<p>Instead of looking at the support table for something on caniuse.com and thinking, “I wish more browsers supported this feature so that I could use it!”, you can instead think “I’m going to use this feature today, but treat it as an experimental feature.”</p>
</blockquote>
<p>In a similar vein, what if you could look at building a website in a different light? Rather than thinking, “how do I combine a bunch of disparate content, templates, and tooling into a functioning website?”, you might think “how do I start at a functioning website with content and then use templates and build tooling to enhance it?”</p>
<p>[Granted: this is not a silver bullet for building every website. Lots of websites can’t start here—but maybe some could?]</p>
<h2 id="technical-ideas">Technical Ideas</h2>
<p>What could this look like? Honestly, I don’t know. But I’ll take a moment to try and imagine <em>something</em>.</p>
<p>I want to be able to view, edit, <em>and if need be ship</em> a website, even if the build process fails. In essence, if the build does fail I can still take all the source files, put them on a server, and the website remains functional (however crude).</p>
<p>I think this kind of approach begs for an HTML-first solution. Your content starts as something that works in the browser — in a less-than-ideal way, sure, but still functional — and the build process parses the base content, injecting additional “features” as enhancements (global header and footer, meta tags, links to CSS and JS, etc.). In this manner, your website starts as content at a URL. Everything else is an enhancement.</p>
<p>For example, think of a classic blog post as a markdown file.</p>
<pre><code class="language language-md">---
title: This is the title of my blog post
date: 2020-09-02
tags:
<span class="hljs-bullet"> -</span> readingNotes
<span class="hljs-section"> - somethingElse
---</span>

<span class="hljs-section"># This is the title of my post</span>

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. [<span class="hljs-string">Here’s a link</span>](<span class="hljs-link">./another-post.md</span>)

![<span class="hljs-string">An image for my blog post</span>](<span class="hljs-link">../images/my-image.jpg</span>)
</code></pre>
<p>What if you rewrote that using HTML for the front-matter semantics? If you want to continue to author the content of the post in markdown, do it, but embed it in a web component (which would get “enhanced” and rendered to HTML somewhere further down the line).</p>
<p>What’s beautiful about markdown is that it’s a kind of progressively-enhanced syntax for writing: link and image URLs are still accessible even when unparsed.</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">wc-markdown</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"white-space: pre-line"</span>&gt;</span>
# This is the title of my post

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. [Here is a link](./another-post.html)

![An image for my blog post](../images/my-image.jpg)
<span class="hljs-tag">&lt;/<span class="hljs-name">wc-markdown</span>&gt;</span>
</code></pre>
<p class="image-container"><img src="https://cdn.jim-nielsen.com/blog/2022/progressive-build-markdown.png" alt="">

</p><p>There are trade-offs here: authoring in markdown is a convenience for me, the author, and results in a more crude initial experience (if a build enhancement fails later).</p>
<p>Given that markdown supports HTML, you could trade the image syntax (<code>![]()</code>) for <code>&lt;img&gt;</code> tags or the link syntax (<code>[]()</code>) for <code>&lt;a&gt;</code> tags. That’ll improve the core experience a tiny bit in the browser, as links would be functionally clickable and images would display directly inline.</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">wc-markdown</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"white-space: pre-line"</span>&gt;</span>
# This is the title of my post

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"./another-post.html"</span>&gt;</span>Here is a link<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>

![An image for my blog post](../images/my-image.jpg)
<span class="hljs-tag">&lt;/<span class="hljs-name">wc-markdown</span>&gt;</span>
</code></pre>
<p>Or, as inspired by <a href="https://news.ycombinator.com/item?id=25701842">this comment</a>, you could author your content directly in as sparse a take on HTML as is possible.</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>This is the title of my post<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
I just want to start writing here whatever it is i'm about.
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
This is just another example of how you might do something that is really light and minimal. <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"./another-post.html"</span>&gt;</span>Here is a link<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./image.jpg"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"An image for my blog post"</span>&gt;</span>
</code></pre>
<p>You can see how trading authoring conveniences begins to enhance the base browser experience.</p>
<p class="image-container"><img src="https://cdn.jim-nielsen.com/blog/2022/progressive-build-html.png" alt="">

</p><p>These files could be opened in a browser, without a build process or server (i.e. at a URL of <code>file:///Users/Me/Path/To/my-post.html</code>) and the core content would be accessible. And if you markup all the page’s included resources (links, images, styles, scripts, etc.) as relative links, everything will work even without a server. (Granted you’d have to give some thought to structuring your files accordingly.)</p>
<pre><code>.
├── index.html
├── styles.css
├── scripts.js
├── posts/
│ ├── 2020-02-05-my-post.html
│ ├── 2020-02-05-my-post-image.jpg
│ └── 2020-03-21-another-post.html
</code></pre>
<p>If you want the base experience you author to be even slightly better, you could write the stylesheet links and script includes in every single file (rather than append them to each document through a build process). Going back to the markdown example:</p>
<pre><code class="language language-html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>This is the title of my blog post<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"date"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"2020-09-02"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"tags"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"readingNotes,somethingElse"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"./web-component-markdown.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">wc-markdown</span>&gt;</span>
# This is the title of my post

I just want to start writing here whatever it is i'm about.

This is just another example of how you might do something that is really light and minimal. [Here is a link](./another-post.html)

![An image for my blog post](../images/my-image.jpg)
<span class="hljs-tag">&lt;/<span class="hljs-name">wc-markdown</span>&gt;</span>
</code></pre>
<p>In this example, the trade-off is: overhead to include the <code>&lt;script&gt;</code> tag in every post, but the core experience in the browser is now more enhanced (if JavaScript runs) because the <code>&lt;wc-markdown&gt;</code> component will turn the markdown to HTML in the browser. An additional enhancement from here would be to have the build process (again, if it runs) render the markdown to HTML so the client doesn’t even need the web component!</p>
<p>The beauty is the build process works like progressive enhancement in the browser: the core experience is functional and accessible, then the build process enhances whatever you want to add by injecting those enhancements to the original, accessible HTML documents (things like style tags, script tags, or global header/footer HTML — I could imagine something like <a href="https://cheerio.js.org/">cheerio</a> being useful here).</p>
<p>The build process is a progressive enhancement to the core content of your website. Whether it runs or not, your site remains accessible and deployable at any point in time.</p>
<p>I get it, this won’t work for every website. And things like permalinks get tricky. But I still think it’s an intriguing mindset to start from: don’t assume the presence of a build, treat it as an enhancement rather than a dependency.</p>
<p>I should prototype the idea. I could imagine doing this with a tool like Metalsmith:</p>
<ul>
<li>Put your source files in directory (which works and remains deployable if everything else fails).</li>
<li>Metalsmith reads in all the files and produces a data structure of all the content</li>
<li>Additional files and markup are generated from your site’s content, like index listings, “related posts” sections, etc., while other necessary elements like styles, scripts, or global header/footer markup are injected to each page.</li>
<li>The new site is output as an “enhanced” version of the site <em>before your build started</em>.</li>
</ul>
<p>Are there any build tools advocating this kind of mindset? If you know of any, hit me up. </p>

+ 366
- 0
cache/2022/1dd0383e3a416109e4259144d7a67e2d/index.html View File

@@ -0,0 +1,366 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Write plain text files (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://sive.rs/plaintext">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Write plain text files</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://sive.rs/plaintext" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>
I write almost everything important in my life: thoughts, plans, notes, diaries, correspondence, code, articles, and entire books.
</p>
<p>
They are my extended memory — my noted self — my organized thoughts.
I refer to them often.
I search them, update them, and learn from them.
I convert them into HTML to make websites, or LaTeX to make books.
</p>
<p>
My written words are my most precious asset.
They are also a history of my life.
<strong>
That’s why I only use plain text files.
</strong>
They are the most reliable, flexible, and long-lasting option.
Here’s why.
</p>
<h2>
PORTABLE
</h2>
<p>
I’ve brought my text files with me since 1990, from Mac to Windows to Linux to BSD, from PCs to laptops to tablets to Android to iOS to a tiny device the size of my thumb, and back again.
</p>
<p>
<strong>
Every device, including ones long gone, and ones not invented yet, can read and edit plain text.
</strong>
Whether future virtual reality, or a chip you can implant in your earlobe, plain text will be there.
Will Microsoft Word?
Evernote?
Notion?
Maybe.
Maybe not.
</p>
<p>
But plain text?
Always.
Everywhere.
</p>
<h2>
UN-COMMERCIAL
</h2>
<p>
Every few years a new company says you should use their special format.
You have to pay them a monthly fee to use it — or keep all of your documents in their care.
They offer some convenience or features, but at the cost of flexibility, portability, and independence.
</p>
<p>
When you store your writing in one company’s unique format, then you need that program to access it.
Then the economy takes a turn, they go out of business, and your work is trapped in an unusable format.
</p>
<p>
<strong>
You will outlive these companies.
</strong>
Your writing should outlive you.
Depending on companies is not an option.
</p>
<p>
Plain text is un-commercial.
It removes you from the world of subscriptions and hype.
There will always be plenty of free, non-commercial software in the public domain for reading and editing text files.
</p>
<h2>
OFFLINE
</h2>
<p>
There are places and times when you can’t get online.
Don’t depend on any tool that needs an internet connection.
</p>
<p>
<strong>
There are great benefits to being intentionally offline and unreachable, to focus.
</strong>
It’s a super productivity boost.
You need to be able to write, and have access to all your writing, during these times.
</p>
<h2>
NO DEPENDENCIES
</h2>
<p>
If you rely on Word, Evernote or Notion, for example, then you can’t work unless you have Word, Evernote, or Notion.
<strong>
You are helpless without them.
</strong>
You are dependent.
</p>
<p>
People tell me about more tools I could use in addition to my text files.
But I don’t need or want anything else.
<strong>
Plain text files and a basic text editor are enough.
This is everything you need for great thinking and writing.
</strong>
(A paper notebook and pencil are enough, too.)
</p>
<p>
If you only use plain text, you can work on any device, forever.
The less you depend on, the better.
Peace and focus come when you stop looking for more.
</p>
<h2>
EASIEST TO CONVERT
</h2>
<p>
Plain text can be converted into anything else.
</p>
<p>
HTML, Markdown, JSON, LaTeX, and many other standard formats, are just plain text.
I’ve written four books and four hundred blog posts in plain text.
</p>
<p>
You can make your own personal formats in your plain text files.
Maybe in each diary entry, the first two lines are like:
</p>
<pre>
date: 2022-02-28
tags: where-to-live, kids, dog, anxious
</pre>
<p>
Then it’s easy to use any little scripting language like Ruby, Python, or JavaScript to grab the date and tags, and use them for categorizing, sorting, renaming, archiving, or exporting.
</p>
<p>
Or if you don’t want to do it yourself, then it’s easy to find someone who can.
Anyone who’s been programming for more than a week should be able to do it easily.
</p>
<h2>
NEED HIERARCHY?
</h2>
<p>
Use directories — also known as folders.
These are also good for keeping your text together with other files like images and audio.
</p>
<pre>
Documents/
Documents/Diary/
Documents/Diary/2022/
Documents/Diary/2022/2022-02-28.txt
Documents/Thoughts/
Documents/Thoughts/WhereToLive/
Documents/Thoughts/WhereToLive/2019-06-30.txt
Documents/Thoughts/WhereToLive/2020-01-18.txt
Documents/Ideas/
Documents/Ideas/MusicalChairs.txt
Documents/Ideas/NewHouse/
Documents/Ideas/NewHouse/Design/
Documents/Ideas/NewHouse/Design/entryway.jpg
Documents/Ideas/NewHouse/Design/roof.jpg
Documents/Ideas/NewHouse/Architect/
Documents/Ideas/NewHouse/Architect/JM_Lim.txt
Documents/Ideas/NewHouse/Architect/TPS_Inc.txt
</pre>
<h2>
NEED VISUALS OR GRAPHICS?
</h2>
<p>
Need visual mind-mapping with circles and lines?
Maybe you do.
<strong>
But maybe you don’t.
</strong>
Maybe it’s just another distraction, focusing on the tools instead of your thinking.
</p>
<p>
I love that plain text files have no formatting to tinker with.
A tab key, SHIFT KEY, and vertical line breaks can go a long way, keeping you writing instead of formatting.
</p>
<p>
If you really need graphics, do your drawing using something else.
Digital drawing into SVG files.
Paper drawing, scanned into JPGs.
</p>
<p>
Formats that aren’t owned by any company.
Formats that will outlast you.
</p>
<p>
Keep your graphics files alongside your text files.
But keep your text as plain text.
</p>
<h2>
CONCLUSION
</h2>
<p>
Reliable, flexible, portable, independent, and long-lasting.
Plain text files will be readable by future generations, hundreds of years from now.
</p>
<p>
I especially enjoy the tranquility of their offline, non-commercial nature.
They’re quiet.
They’re focused.
(As I aim to be.)
</p>
<p><img src="https://sive.rs/images/plaintext.png" alt="screen shot of the text of this post"></p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 162
- 0
cache/2022/1dd0383e3a416109e4259144d7a67e2d/index.md View File

@@ -0,0 +1,162 @@
title: Write plain text files
url: https://sive.rs/plaintext
hash_url: 1dd0383e3a416109e4259144d7a67e2d

<p>
I write almost everything important in my life: thoughts, plans, notes, diaries, correspondence, code, articles, and entire books.
</p><p>
They are my extended memory — my noted self — my organized thoughts.
I refer to them often.
I search them, update them, and learn from them.
I convert them into HTML to make websites, or LaTeX to make books.
</p><p>
My written words are my most precious asset.
They are also a history of my life.
<strong>
That’s why I only use plain text files.
</strong>
They are the most reliable, flexible, and long-lasting option.
Here’s why.
</p><h2>
PORTABLE
</h2><p>
I’ve brought my text files with me since 1990, from Mac to Windows to Linux to BSD, from PCs to laptops to tablets to Android to iOS to a tiny device the size of my thumb, and back again.
</p><p>
<strong>
Every device, including ones long gone, and ones not invented yet, can read and edit plain text.
</strong>
Whether future virtual reality, or a chip you can implant in your earlobe, plain text will be there.
Will Microsoft Word?
Evernote?
Notion?
Maybe.
Maybe not.
</p><p>
But plain text?
Always.
Everywhere.
</p><h2>
UN-COMMERCIAL
</h2><p>
Every few years a new company says you should use their special format.
You have to pay them a monthly fee to use it — or keep all of your documents in their care.
They offer some convenience or features, but at the cost of flexibility, portability, and independence.
</p><p>
When you store your writing in one company’s unique format, then you need that program to access it.
Then the economy takes a turn, they go out of business, and your work is trapped in an unusable format.
</p><p>
<strong>
You will outlive these companies.
</strong>
Your writing should outlive you.
Depending on companies is not an option.
</p><p>
Plain text is un-commercial.
It removes you from the world of subscriptions and hype.
There will always be plenty of free, non-commercial software in the public domain for reading and editing text files.
</p><h2>
OFFLINE
</h2><p>
There are places and times when you can’t get online.
Don’t depend on any tool that needs an internet connection.
</p><p>
<strong>
There are great benefits to being intentionally offline and unreachable, to focus.
</strong>
It’s a super productivity boost.
You need to be able to write, and have access to all your writing, during these times.
</p><h2>
NO DEPENDENCIES
</h2><p>
If you rely on Word, Evernote or Notion, for example, then you can’t work unless you have Word, Evernote, or Notion.
<strong>
You are helpless without them.
</strong>
You are dependent.
</p><p>
People tell me about more tools I could use in addition to my text files.
But I don’t need or want anything else.
<strong>
Plain text files and a basic text editor are enough.
This is everything you need for great thinking and writing.
</strong>
(A paper notebook and pencil are enough, too.)
</p><p>
If you only use plain text, you can work on any device, forever.
The less you depend on, the better.
Peace and focus come when you stop looking for more.
</p><h2>
EASIEST TO CONVERT
</h2><p>
Plain text can be converted into anything else.
</p><p>
HTML, Markdown, JSON, LaTeX, and many other standard formats, are just plain text.
I’ve written four books and four hundred blog posts in plain text.
</p><p>
You can make your own personal formats in your plain text files.
Maybe in each diary entry, the first two lines are like:
</p><pre>
date: 2022-02-28
tags: where-to-live, kids, dog, anxious
</pre><p>
Then it’s easy to use any little scripting language like Ruby, Python, or JavaScript to grab the date and tags, and use them for categorizing, sorting, renaming, archiving, or exporting.
</p><p>
Or if you don’t want to do it yourself, then it’s easy to find someone who can.
Anyone who’s been programming for more than a week should be able to do it easily.
</p><h2>
NEED HIERARCHY?
</h2><p>
Use directories — also known as folders.
These are also good for keeping your text together with other files like images and audio.
</p><pre>
Documents/
Documents/Diary/
Documents/Diary/2022/
Documents/Diary/2022/2022-02-28.txt
Documents/Thoughts/
Documents/Thoughts/WhereToLive/
Documents/Thoughts/WhereToLive/2019-06-30.txt
Documents/Thoughts/WhereToLive/2020-01-18.txt
Documents/Ideas/
Documents/Ideas/MusicalChairs.txt
Documents/Ideas/NewHouse/
Documents/Ideas/NewHouse/Design/
Documents/Ideas/NewHouse/Design/entryway.jpg
Documents/Ideas/NewHouse/Design/roof.jpg
Documents/Ideas/NewHouse/Architect/
Documents/Ideas/NewHouse/Architect/JM_Lim.txt
Documents/Ideas/NewHouse/Architect/TPS_Inc.txt
</pre><h2>
NEED VISUALS OR GRAPHICS?
</h2><p>
Need visual mind-mapping with circles and lines?
Maybe you do.
<strong>
But maybe you don’t.
</strong>
Maybe it’s just another distraction, focusing on the tools instead of your thinking.
</p><p>
I love that plain text files have no formatting to tinker with.
A tab key, SHIFT KEY, and vertical line breaks can go a long way, keeping you writing instead of formatting.
</p><p>
If you really need graphics, do your drawing using something else.
Digital drawing into SVG files.
Paper drawing, scanned into JPGs.
</p><p>
Formats that aren’t owned by any company.
Formats that will outlast you.
</p><p>
Keep your graphics files alongside your text files.
But keep your text as plain text.
</p><h2>
CONCLUSION
</h2><p>
Reliable, flexible, portable, independent, and long-lasting.
Plain text files will be readable by future generations, hundreds of years from now.
</p><p>
I especially enjoy the tranquility of their offline, non-commercial nature.
They’re quiet.
They’re focused.
(As I aim to be.)
</p>
<img src="https://sive.rs/images/plaintext.png" alt="screen shot of the text of this post">

+ 172
- 0
cache/2022/2458bbc9f86af47ffffcd1b99f19743a/index.html View File

@@ -0,0 +1,172 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Next Gen Static Blogging (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://inoads.com/articles/2021-01-09-Next-Gen-Static-Blogging">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Next Gen Static Blogging</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://inoads.com/articles/2021-01-09-Next-Gen-Static-Blogging" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p><date>2021-01-09</date> <author>mmackh</author><button id="accessibility" class="accessibilityToggle">Toggle Reader</button><p></p><p></p><h2>TL;DR</h2><p>Take a look at the source code of this page - I rely mostly on CSS for the rendering of this article. </p><p></p><p>The CSS property powering this article, </p><pre><code>white-space: pre-line</code></pre>, has existed since the IE8 days.<p></p><p></p><p></p><h2>Background</h2><p>My first programming exercise was to code a blog using PHP. Add text files to a folder via FTP, scan the directory and generate the HTML dynamically. How about adding an admin frontend? Or a database as a backend? All good and well, but when do you find the time to actually write your articles? </p><p></p><p>If it's one thing I learnt over the past years of coding is that simplicity is key. You don't need a lot of CSS or HTML Tags to make a page look pretty. It may not be the absolute correct way to do it, but look at the source code of this page. It's tiny!</p><p></p><p></p><p></p><h2>My Solution</h2><p>Instead of nesting </p><pre><code>&lt;div&gt;</code></pre> after <pre><code>&lt;div&gt;</code></pre> or <pre><code>&lt;p&gt;</code></pre> to create paragraphs, I stumbled upon <pre><code>white-space: pre-line</code></pre>. To quote the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/white-space">MDN Web Docs</a> - <em>"Sequences of white space are collapsed. Lines are broken at newline characters, ..."</em> - and that is key. I use HTML tags like <pre><code>&lt;em&gt;</code></pre> or <pre><code>&lt;b&gt;</code></pre> for emphasis only.<p></p><p>Every paragraph is initiated with a newline character. The experience to writing this blog entry is very similar to using a dedicated word processor. Except you have much more control, more settings you can tweak and more visuals you can add. </p><p></p><p>A similar technology I can think of is Markdown. Except you have to run it through a parser before seeing the result. Also, different flavours produce different outputs. All rather messy for me. My workflow consists of pressing CMD+S, switching to Safari and reloading the page. What you see now is what I get.</p><p></p><p>Managing this blog is a little more involved than dynamically generating everything. The design could also be a little prettier.</p><p></p><p></p><p></p><h2>More Benefits</h2><p>The overall page size is tiny. No need for JavaScript or any other complicated backend or client-side frameworks. I can use PHP to introduce dynamic elements to the page, but that's optional. Maybe you might be inspired a little and move your blog off centralised platforms like Medium, etc. and start embracing the simplicity of creating compelling pages with very little code. Simplicity is key.</p></p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 5
- 0
cache/2022/2458bbc9f86af47ffffcd1b99f19743a/index.md View File

@@ -0,0 +1,5 @@
title: Next Gen Static Blogging
url: https://inoads.com/articles/2021-01-09-Next-Gen-Static-Blogging
hash_url: 2458bbc9f86af47ffffcd1b99f19743a

<date>2021-01-09</date> <author>mmackh</author><button id="accessibility" class="accessibilityToggle">Toggle Reader</button><p></p><p></p><h2>TL;DR</h2><p>Take a look at the source code of this page - I rely mostly on CSS for the rendering of this article. </p><p></p><p>The CSS property powering this article, </p><pre><code>white-space: pre-line</code></pre>, has existed since the IE8 days.<p></p><p></p><p></p><h2>Background</h2><p>My first programming exercise was to code a blog using PHP. Add text files to a folder via FTP, scan the directory and generate the HTML dynamically. How about adding an admin frontend? Or a database as a backend? All good and well, but when do you find the time to actually write your articles? </p><p></p><p>If it's one thing I learnt over the past years of coding is that simplicity is key. You don't need a lot of CSS or HTML Tags to make a page look pretty. It may not be the absolute correct way to do it, but look at the source code of this page. It's tiny!</p><p></p><p></p><p></p><h2>My Solution</h2><p>Instead of nesting </p><pre><code>&lt;div&gt;</code></pre> after <pre><code>&lt;div&gt;</code></pre> or <pre><code>&lt;p&gt;</code></pre> to create paragraphs, I stumbled upon <pre><code>white-space: pre-line</code></pre>. To quote the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/white-space">MDN Web Docs</a> - <em>"Sequences of white space are collapsed. Lines are broken at newline characters, ..."</em> - and that is key. I use HTML tags like <pre><code>&lt;em&gt;</code></pre> or <pre><code>&lt;b&gt;</code></pre> for emphasis only.<p></p><p>Every paragraph is initiated with a newline character. The experience to writing this blog entry is very similar to using a dedicated word processor. Except you have much more control, more settings you can tweak and more visuals you can add. </p><p></p><p>A similar technology I can think of is Markdown. Except you have to run it through a parser before seeing the result. Also, different flavours produce different outputs. All rather messy for me. My workflow consists of pressing CMD+S, switching to Safari and reloading the page. What you see now is what I get.</p><p></p><p>Managing this blog is a little more involved than dynamically generating everything. The design could also be a little prettier.</p><p></p><p></p><p></p><h2>More Benefits</h2><p>The overall page size is tiny. No need for JavaScript or any other complicated backend or client-side frameworks. I can use PHP to introduce dynamic elements to the page, but that's optional. Maybe you might be inspired a little and move your blog off centralised platforms like Medium, etc. and start embracing the simplicity of creating compelling pages with very little code. Simplicity is key.</p>

+ 235
- 0
cache/2022/34e73243a6ed7e36a8348b98ea79e52b/index.html View File

@@ -0,0 +1,235 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Du concept de « fracture(s) numérique(s) » à celui de capital numérique ? (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://louisderrac.com/2020/11/19/du-concept-de-fractures-numeriques-a-celui-de-capital-numerique/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Du concept de « fracture(s) numérique(s) » à celui de capital numérique ?</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://louisderrac.com/2020/11/19/du-concept-de-fractures-numeriques-a-celui-de-capital-numerique/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>Cela fait quelque temps maintenant que je travaille autour de questions d’inclusions, d’éducation, d’acculturation au numérique.</p>

<p>En cette rentrée difficile où les technologies numériques sont, c’est peu de le dire, au-devant de la scène, j’ai eu l’occasion de travailler sur un programme très ambitieux de médiation numérique, pour le compte d’un gros acteur national. Je ne peux pas en dévoiler davantage, c’est encore un secret 🙂</p>

<p>Toujours est-il que pour concevoir ce programme, un élément fut essentiel : passer du concept largement controversé de « fracture(s) numérique(s) » pour lui préférer celui de capital numérique.</p>

<p><span id="more-5706"></span></p>
<h2 id="h-fracture-s-num-rique-s"><span class="ez-toc-section" id="Fractures_numeriques"></span>Fracture(s) numérique(s) ?<span class="ez-toc-section-end"></span></h2>

<p>Parti sans a priori sur la question, mes lectures m’ont rapidement rallié aux thèses des nombreux chercheurs en SHS qui tentent, aujourd’hui encore (c’est peut-être ça le plus étonnant), de déminer l’expression même de fracture numérique, tant ils la trouvent simpliste et décalée de la complexité des usages observés.</p>

<p>Ainsi, les travaux de Dominique Pasquier ont permis de découvrir les usages populaires d’Internet. En 2013 déjà, Pascal Plantard écrit, en reprenant Eric Guichard (2009), que « la fracture numérique est un produit des croyances au déterminisme technique et au progrès. C’est une notion beaucoup plus politique que scientifique ». </p>

<p>Encore plus tôt, en 2007, Daniel Pimienta écrit que « La fracture numérique n’est rien d’autre que le reflet de la fracture sociale dans le monde numérique » . Par ailleurs, et c’est ce que répètent de nombreux chercheurs, impossible de comparer le début des années 90, lorsque le terme « digital divide » est apparu aux États-Unis, et la situation actuelle. </p>

<p>En 1998, 23% de la population française possédait un ordinateur, et à peine 4% avaient accès à Internet. En 2019, 79% des Français possédaient un smartphone, et 76% un ordinateur. 88% avaient accès à Internet. Des chiffres globalement stables, et qui laissent globalement dire que la question de l’équipement n’en est plus une. </p>

<h2 id="h-le-capital-num-rique"><span class="ez-toc-section" id="Le_capital_numerique"></span>Le capital numérique<span class="ez-toc-section-end"></span></h2>

<p>Le concept de capital numérique est, à ma connaissance, très peu utilisé par les professionnels de la médiation numérique au sens large. Je ne l’ai pas non plus retrouvé dans les articles de chercheurs en sciences sociales. Sa principale utilisation provient de l’excellente exploration, ainsi titrée « Capital numérique », portée par Ouishare et Chronos. Je vous en conseille vivement la lecture.</p>

<p>Cette exploration, dispositif de recherche-action, part du constat que le numérique « n’a pas résorbé les inégalités sociales et territoriales ». Et elle enfonce plusieurs idées reçues, à commencer par le concept de « fracture numérique », comme l’illustre le document de synthèse reproduit ci-dessous. </p>

<figure class="wp-block-image size-large"><picture class="wp-image-5774">
<source type="image/webp" srcset="https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-1024x576.jpg.webp 1024w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-300x169.jpg.webp 300w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-768x432.jpg.webp 768w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-100x56.jpg.webp 100w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-700x394.jpg.webp 700w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese.jpg.webp 1440w" sizes="(max-width: 1024px) 100vw, 1024px"></source>
<img src="https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-1024x576.jpg" alt="" srcset="https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-1024x576.jpg 1024w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-300x169.jpg 300w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-768x432.jpg 768w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-100x56.jpg 100w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-700x394.jpg 700w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese.jpg 1440w" sizes="(max-width: 1024px) 100vw, 1024px">
</picture>
</figure>

<p>Dans cette exploration, qui cite à nouveau les <a href="https://www.ouishare.net/article/comparer-cest-deplorer-plongee-sans-miserabilisme-dans-lunivers-numerique-des-classes-populaires">travaux de Dominique Pasquier</a> autour des classes populaires, il est défendu l’idée qu’un dispositif d’inclusion numérique ne peut pas réussir s’il ne donne pas à ses bénéficiaires des moyens de capacitation , d’autonomisation. J’adhère totalement. Il parait aberrant d’espérer former des citoyens numériques en se contentant de leur apprendre à payer leurs impôts en ligne.</p>

<p>Comme en témoigne Frédéric Bardeau, toujours dans cette exploration : « le capital numérique fond comme neige au soleil car il doit s’actualiser ». Je suis étonné que cette citation, absolument excellente, n’ait pas été plus partagée. Les professionnels le savent, une veille très rigoureuse est indispensable pour « rester à la page » des technologies et des usages numériques. </p>

<p>La notion d’un capital culturel comme d’un réservoir qu’il faut alimenter parait alors très intéressante à développer.</p>

<h2 id="h-le-capital-num-rique-vu-par-bourdieu"><span class="ez-toc-section" id="Le_capital_numerique_vu_par_Bourdieu"></span>Le capital numérique vu par Bourdieu<span class="ez-toc-section-end"></span></h2>

<p>Même si l’exploration n’y fait pas écho, son titre, « Capital numérique », semble découler et se nourrir naturellement des concepts bourdieusiens de capital social, économique et <a href="https://fr.wikipedia.org/wiki/Capital_culturel">culturel</a>. C’est en tout cas dans cette continuité que j’emploie ce concept.</p>

<p>En effet, comme on le retrouve dans les travaux de Dominique Pasquier et de bien d’autres, ces différentes formes de capitaux influencent fortement le capital numérique d’un individu.</p>

<p>Selon qu’on ait un capital culturel plus ou moins élevé, on va diversifier ses usages culturels du numérique et accéder à des usages dits « savants ». Consommer différents genres musicaux, des documentaires, des films d’auteur, plusieurs sites de presse nationale… Mais également produire, contribuer davantage.</p>

<p>Selon qu’on ait un capital social plus ou moins élevé, on va développer des réseaux sociaux différemment hétérogènes et de types plus ou moins variés (professionnels sur LinkedIn, amicaux sur Facebook ou Instagram, voire des réseaux « exclusifs » comme <a href="https://gensdeconfiance.com">GensDeConfiance</a>).</p>

<p>Le capital économique jouera également, d’abord sur les choix de l’équipement. Smartphone ou ordinateur, niveau de gamme de matériel choisi. Ensuite sur l’accès à des services payants (Cloud sécurisé, Netflix, sites d’informations payants) vs des services gratuits (Youtube, sites d’informations gratuits), soumis aux dérives du modèle économique de la publicité.</p>

<h2 id="h-la-transmission-du-capital-num-rique"><span class="ez-toc-section" id="La_transmission_du_capital_numerique"></span>La transmission du capital numérique<span class="ez-toc-section-end"></span></h2>

<p>Par ailleurs, le capital numérique, à la manière des autres formes de capitaux, va se transmettre et s’hériter. Il parait assez naturel que des parents disposant d’un fort capital numérique transmettent (consciemment ou inconsciemment) ce capital à leurs enfants. Comme pour le capital culturel, il s’agira alors d’une transmission sous une forme objectivée, avec des biens numériques proprement configurés et maintenus (ordinateur fixe, appareils numériques variés, connexion internet à très haut débit), et une forme incorporée, donc une aisance d’usage des différents biens numériques, la capacité à s’en servir.</p>

<p>Cela semble d’autant plus certain que le capital numérique, bien plus que le capital culturel, est bien identifié aujourd’hui comme étant essentiel à une bonne insertion dans la société. Que ce soit pour comprendre les nombreux enjeux citoyens que pose notre écosystème numérique ou plus simplement pour se positionner avantageusement sur le marché du travail.</p>

<h2 id="h-conclusion"><span class="ez-toc-section" id="Conclusion"></span>Conclusion<span class="ez-toc-section-end"></span></h2>

<p>Le concept de capital numérique me semble être beaucoup plus intéressant que celui d’inclusion (ou d’exclusion) numérique. Il me semble évidemment plus juste que celui de fracture numérique.</p>

<p>Le capital numérique intègre le poids des capitaux sociaux, économiques et culturels, qui me semblent être une bonne grille de lecture pour comprendre la diversité sociale des usages du numérique.</p>

<p>Le capital numérique intègre l’idée d’un réservoir qu’il faut alimenter, quasiment continuellement, pour éviter qu’il ne se vide. Cette idée me semble être tout à fait pertinente quand on voit la vitesse à laquelle les technologies numériques transforment notre société, notre droit, nos habitudes. Pour pouvoir suivre, il faut entretenir sa veille.</p>

<p>Le capital numérique intègre enfin l’idée d’une transmission, d’un héritage. Ainsi le capital numérique ne vient pas de nulle part, il s’acquiert en partie dans un processus de reproduction sociale.</p>

<p>Mais surtout, la notion de capital numérique évite les termes d’inclusion/exclusion. Il faut bien admettre qu’on peut faire le choix de ne pas développer de capital numérique, parce qu’on n’en voit pas l’intérêt, qu’on ne développe pas d’appétence numérique. Et il faudra bien finir par accepter que tous les citoyens ne sont pas intéressés par les technologies numériques, n’en déplaise à certains politiques ou champions de la tech.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 130
- 0
cache/2022/34e73243a6ed7e36a8348b98ea79e52b/index.md View File

@@ -0,0 +1,130 @@
title: Du concept de « fracture(s) numérique(s) » à celui de capital numérique ?
url: https://louisderrac.com/2020/11/19/du-concept-de-fractures-numeriques-a-celui-de-capital-numerique/
hash_url: 34e73243a6ed7e36a8348b98ea79e52b

<p>Cela fait quelque temps maintenant que je travaille autour de questions d’inclusions, d’éducation, d’acculturation au numérique.</p>



<p>En cette rentrée difficile où les technologies numériques sont, c’est peu de le dire, au-devant de la scène, j’ai eu l’occasion de travailler sur un programme très ambitieux de médiation numérique, pour le compte d’un gros acteur national. Je ne peux pas en dévoiler davantage, c’est encore un secret 🙂</p>



<p>Toujours est-il que pour concevoir ce programme, un élément fut essentiel : passer du concept largement controversé de « fracture(s) numérique(s) » pour lui préférer celui de capital numérique.</p>



<span id="more-5706"></span>




<h2 id="h-fracture-s-num-rique-s"><span class="ez-toc-section" id="Fractures_numeriques"></span>Fracture(s) numérique(s) ?<span class="ez-toc-section-end"></span></h2>



<p>Parti sans a priori sur la question, mes lectures m’ont rapidement rallié aux thèses des nombreux chercheurs en SHS qui tentent, aujourd’hui encore (c’est peut-être ça le plus étonnant), de déminer l’expression même de fracture numérique, tant ils la trouvent simpliste et décalée de la complexité des usages observés.</p>



<p>Ainsi, les travaux de Dominique Pasquier ont permis de découvrir les usages populaires d’Internet. En 2013 déjà, Pascal Plantard écrit, en reprenant Eric Guichard (2009), que « la fracture numérique est un produit des croyances au déterminisme technique et au progrès. C’est une notion beaucoup plus politique que scientifique ». </p>



<p>Encore plus tôt, en 2007, Daniel Pimienta écrit que « La fracture numérique n’est rien d’autre que le reflet de la fracture sociale dans le monde numérique » . Par ailleurs, et c’est ce que répètent de nombreux chercheurs, impossible de comparer le début des années 90, lorsque le terme « digital divide » est apparu aux États-Unis, et la situation actuelle. </p>



<p>En 1998, 23% de la population française possédait un ordinateur, et à peine 4% avaient accès à Internet. En 2019, 79% des Français possédaient un smartphone, et 76% un ordinateur. 88% avaient accès à Internet. Des chiffres globalement stables, et qui laissent globalement dire que la question de l’équipement n’en est plus une. </p>



<h2 id="h-le-capital-num-rique"><span class="ez-toc-section" id="Le_capital_numerique"></span>Le capital numérique<span class="ez-toc-section-end"></span></h2>



<p>Le concept de capital numérique est, à ma connaissance, très peu utilisé par les professionnels de la médiation numérique au sens large. Je ne l’ai pas non plus retrouvé dans les articles de chercheurs en sciences sociales. Sa principale utilisation provient de l’excellente exploration, ainsi titrée « Capital numérique », portée par Ouishare et Chronos. Je vous en conseille vivement la lecture.</p>



<p>Cette exploration, dispositif de recherche-action, part du constat que le numérique « n’a pas résorbé les inégalités sociales et territoriales ». Et elle enfonce plusieurs idées reçues, à commencer par le concept de « fracture numérique », comme l’illustre le document de synthèse reproduit ci-dessous. </p>



<figure class="wp-block-image size-large"><picture class="wp-image-5774">
<source type="image/webp" srcset="https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-1024x576.jpg.webp 1024w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-300x169.jpg.webp 300w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-768x432.jpg.webp 768w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-100x56.jpg.webp 100w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-700x394.jpg.webp 700w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese.jpg.webp 1440w" sizes="(max-width: 1024px) 100vw, 1024px"></source>
<img src="https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-1024x576.jpg" alt="" srcset="https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-1024x576.jpg 1024w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-300x169.jpg 300w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-768x432.jpg 768w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-100x56.jpg 100w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese-700x394.jpg 700w, https://louisderrac.com/wp-content/uploads/2020/11/Capital-numerique-Synthese.jpg 1440w" sizes="(max-width: 1024px) 100vw, 1024px">
</picture>
</figure>



<p>Dans cette exploration, qui cite à nouveau les <a href="https://www.ouishare.net/article/comparer-cest-deplorer-plongee-sans-miserabilisme-dans-lunivers-numerique-des-classes-populaires">travaux de Dominique Pasquier</a> autour des classes populaires, il est défendu l’idée qu’un dispositif d’inclusion numérique ne peut pas réussir s’il ne donne pas à ses bénéficiaires des moyens de capacitation , d’autonomisation. J’adhère totalement. Il parait aberrant d’espérer former des citoyens numériques en se contentant de leur apprendre à payer leurs impôts en ligne.</p>



<p>Comme en témoigne Frédéric Bardeau, toujours dans cette exploration : « le capital numérique fond comme neige au soleil car il doit s’actualiser ». Je suis étonné que cette citation, absolument excellente, n’ait pas été plus partagée. Les professionnels le savent, une veille très rigoureuse est indispensable pour « rester à la page » des technologies et des usages numériques. </p>



<p>La notion d’un capital culturel comme d’un réservoir qu’il faut alimenter parait alors très intéressante à développer.</p>



<h2 id="h-le-capital-num-rique-vu-par-bourdieu"><span class="ez-toc-section" id="Le_capital_numerique_vu_par_Bourdieu"></span>Le capital numérique vu par Bourdieu<span class="ez-toc-section-end"></span></h2>



<p>Même si l’exploration n’y fait pas écho, son titre, « Capital numérique », semble découler et se nourrir naturellement des concepts bourdieusiens de capital social, économique et <a href="https://fr.wikipedia.org/wiki/Capital_culturel">culturel</a>. C’est en tout cas dans cette continuité que j’emploie ce concept.</p>



<p>En effet, comme on le retrouve dans les travaux de Dominique Pasquier et de bien d’autres, ces différentes formes de capitaux influencent fortement le capital numérique d’un individu.</p>



<p>Selon qu’on ait un capital culturel plus ou moins élevé, on va diversifier ses usages culturels du numérique et accéder à des usages dits « savants ». Consommer différents genres musicaux, des documentaires, des films d’auteur, plusieurs sites de presse nationale… Mais également produire, contribuer davantage.</p>



<p>Selon qu’on ait un capital social plus ou moins élevé, on va développer des réseaux sociaux différemment hétérogènes et de types plus ou moins variés (professionnels sur LinkedIn, amicaux sur Facebook ou Instagram, voire des réseaux « exclusifs » comme <a href="https://gensdeconfiance.com">GensDeConfiance</a>).</p>



<p>Le capital économique jouera également, d’abord sur les choix de l’équipement. Smartphone ou ordinateur, niveau de gamme de matériel choisi. Ensuite sur l’accès à des services payants (Cloud sécurisé, Netflix, sites d’informations payants) vs des services gratuits (Youtube, sites d’informations gratuits), soumis aux dérives du modèle économique de la publicité.</p>



<h2 id="h-la-transmission-du-capital-num-rique"><span class="ez-toc-section" id="La_transmission_du_capital_numerique"></span>La transmission du capital numérique<span class="ez-toc-section-end"></span></h2>



<p>Par ailleurs, le capital numérique, à la manière des autres formes de capitaux, va se transmettre et s’hériter. Il parait assez naturel que des parents disposant d’un fort capital numérique transmettent (consciemment ou inconsciemment) ce capital à leurs enfants. Comme pour le capital culturel, il s’agira alors d’une transmission sous une forme objectivée, avec des biens numériques proprement configurés et maintenus (ordinateur fixe, appareils numériques variés, connexion internet à très haut débit), et une forme incorporée, donc une aisance d’usage des différents biens numériques, la capacité à s’en servir.</p>



<p>Cela semble d’autant plus certain que le capital numérique, bien plus que le capital culturel, est bien identifié aujourd’hui comme étant essentiel à une bonne insertion dans la société. Que ce soit pour comprendre les nombreux enjeux citoyens que pose notre écosystème numérique ou plus simplement pour se positionner avantageusement sur le marché du travail.</p>



<h2 id="h-conclusion"><span class="ez-toc-section" id="Conclusion"></span>Conclusion<span class="ez-toc-section-end"></span></h2>



<p>Le concept de capital numérique me semble être beaucoup plus intéressant que celui d’inclusion (ou d’exclusion) numérique. Il me semble évidemment plus juste que celui de fracture numérique.</p>



<p>Le capital numérique intègre le poids des capitaux sociaux, économiques et culturels, qui me semblent être une bonne grille de lecture pour comprendre la diversité sociale des usages du numérique.</p>



<p>Le capital numérique intègre l’idée d’un réservoir qu’il faut alimenter, quasiment continuellement, pour éviter qu’il ne se vide. Cette idée me semble être tout à fait pertinente quand on voit la vitesse à laquelle les technologies numériques transforment notre société, notre droit, nos habitudes. Pour pouvoir suivre, il faut entretenir sa veille.</p>



<p>Le capital numérique intègre enfin l’idée d’une transmission, d’un héritage. Ainsi le capital numérique ne vient pas de nulle part, il s’acquiert en partie dans un processus de reproduction sociale.</p>



<p>Mais surtout, la notion de capital numérique évite les termes d’inclusion/exclusion. Il faut bien admettre qu’on peut faire le choix de ne pas développer de capital numérique, parce qu’on n’en voit pas l’intérêt, qu’on ne développe pas d’appétence numérique. Et il faudra bien finir par accepter que tous les citoyens ne sont pas intéressés par les technologies numériques, n’en déplaise à certains politiques ou champions de la tech.</p>

+ 197
- 0
cache/2022/4687697ee56ee244b7d9d17a4a328c6a/index.html View File

@@ -0,0 +1,197 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>La maison en A, plan B des « fauchés » (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://bag.fiat-tux.fr/share/6252865f762331.80369904">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>La maison en A, plan B des « fauchés »</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://bag.fiat-tux.fr/share/6252865f762331.80369904" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<figure class="article__media"><img src="https://bag.fiat-tux.fr/assets/images/f/1/f1153653/1308528d.jpeg" srcset="https://bag.fiat-tux.fr/assets/images/f/1/f1153653/e88ef28d.jpeg 1328w, https://bag.fiat-tux.fr/assets/images/f/1/f1153653/1308528d.jpeg 664w" alt="La maison construite en 2013 par Elizabeth Faure dans le village de Lusignac (Dordogne), le 23 février 2022." referrerpolicy="no-referrer"><noscript><img src="https://bag.fiat-tux.fr/assets/images/f/1/f1153653/1308528d.jpeg" alt="La maison construite en 2013 par Elizabeth Faure dans le village de Lusignac (Dordogne), le 23 février 2022." referrerpolicy="no-referrer"></noscript>
<figcaption class="article__legend" aria-hidden="true">La maison construite en 2013 par Elizabeth Faure dans le village de Lusignac (Dordogne), le 23 février 2022. YOHAN BONNET POUR « LE MONDE »</figcaption></figure>
<p class="article__paragraph">A reprendre en chœur : il était une petite femme, pirouette, cacahuète, il était une petite femme, qui avait une drôle de maison. Une maison qui, quoique vaste et robuste, inspirait la sympathie tant elle ressemblait à une cabane d’enfants. Dans les provinces de France, le bruit avait couru : il était donc possible de bâtir soi-même une chaumière, à tout âge et sans fortune princière…</p>
<p class="article__paragraph">L’histoire d’Elizabeth Faure ne se résume pas à une comptine gentillette. Mais la singulière demeure que cette rebelle a érigée à 65 ans, de ses propres mains, dans le village de Lusignac (Dordogne), fait rêver bien du monde. Pour moins de 40 000 euros, la retraitée a construit quasiment seule, en 2013, une bâtisse de 180 mètres carrés qui, depuis le confinement de 2020, suscite un drôle d’engouement.</p>
<p class="article__paragraph">Une visite s’impose, d’abord… Solidement planté en bordure de champs et de bois, l’antre d’Elizabeth Faure est un gros triangle à façade rouge terre de Sienne. Ce A géant est lui-même composé de 18 triangles de bois équilatéraux, dressés tous les mètres, que relient entre eux des panneaux de bois compressé couverts d’un pare-pluie puis de tuiles de bitume. La barre du A fait office de plancher du premier étage. A l’intérieur, on retrouve l’ambiance chaleureuse d’une maison en bois et on s’étonne, surtout, de ne pas se sentir écrasé par l’inclinaison des murs que forme le toit à double pente : la hauteur sous plafond et la surface confortablement habitable sur deux étages (112 m<sup>2</sup>, loi Carrez) dissipent les craintes.</p>
<h2 class="article__sub-title">Une pirate en polaire</h2>
<p class="article__paragraph"><em>« Je n’ai rien inventé,</em> précise la bâtisseuse, pas du genre à se flatter l’ego. <em>Cette forme de bâti existe partout depuis la nuit des temps. Depuis Astérix et Obélix ! L’équilatéral, c’est la structure la plus costaude, la forme géométrique parfaite. »</em> Pour expliquer le renouveau français des <em>A-frame</em>, comme on dit en Amérique, il faut aussi tenter de faire le tour du personnage qu’est Elizabeth Faure. Ce qui se révèle plus compliqué que le tour du propriétaire.</p>
<p class="article__paragraph">A 73 ans, désormais, malgré une chevelure blanche et l’affectueux cocker qui lui colle aux basques, cette retraitée sans retraite n’a rien d’une paisible et consensuelle mamie gâteau. Imaginez plutôt une pirate en polaire trop large et bottes en caoutchouc, cigarette roulée et jurons à portée de bouche, que sa franchise honore – elle suggère au journaliste de potasser avant de venir <em>« pour ne pas poser les mêmes questions idiotes que tout le monde ».</em> Une végétarienne et féministe de toujours, révoltée par la <em>« présomption d’incompétence que subissent les bonnes femmes ».</em> En trois mots – les siens –, une <em>« vieille hippie utopiste »</em> dont on mesure vite, pourtant, l’énergie, la détermination et le sérieux. <em>« Ma devise, c’est “Tout est possible”. Quand j’ai commencé le chantier,</em> se souvient-elle, <em>on me disait que je n’y arriverais pas. Les gens rêvent puis crèvent sans avoir pris de risques, assis sur leur canapé. Moi, j’ai le soleil dans la tête. La peur m’est étrangère. Je risque quoi ? Ce ne sera jamais un échec, j’aurai appris. »</em></p>
<p class="article__paragraph">Née à Fès, au Maroc, rapatriée en France à 11 ans avec ses parents qu’elle connaît peu (<em>« Ce sont les fatmas qui m’ont élevée, ces femmes fortes à l’amour inconditionnel »</em> ), elle part seule à 15 ans au Québec, comme jeune fille au pair. Ne revient en France que pour le bac, ou du moins pour lancer la révolution de 1968 dans son lycée de Haute-Savoie. Avant de financer elle-même ses études au Hammersmith College of Art and Building de Londres – <em>« Dans ma famille, on payait des études aux gars, pas aux filles… »</em> Elle s’y forme au design du bâti en pleine période beatnik où fleurissent mille architectures alternatives.</p>
<figure class="article__media"><img src="https://bag.fiat-tux.fr/assets/images/f/1/f1153653/eebeeca0.jpeg" alt="Elizabeth Faure dans sa maison en A, à Lusignac (Dordogne), le 23 février 2022." referrerpolicy="no-referrer">
<figcaption class="article__legend" aria-hidden="true">Elizabeth Faure dans sa maison en A, à Lusignac (Dordogne), le 23 février 2022. YOHAN BONNET POUR « LE MONDE »</figcaption></figure>
<p class="article__paragraph">Entre Londres, New York et la France, la vie qui s’ensuit est un tourbillon de squats entre amis, de maisons bâties ou rénovées gracieusement, pour qui en a besoin, d’aventures artistiques – peintures monumentales, calligraphie japonaise… <em>« J’ai toujours été sous les radars,</em> dit-elle. <em>Très fauchée, mais je m’en sortais toujours, consciente qu’il y avait plus malheureux que moi. »</em> Dans les années 1990, elle vient au secours des Anglais qui retapent à tour de bras les maisons de Dordogne. Puis, en 2003, la voilà qui tombe sur ce reportage télé présentant un abri pour SDF de l’association Emmaüs. <em>« On aurait dit une cabane de jardin de Leroy-Merlin,</em> peste-t-elle. <em>J’ai pensé qu’on pouvait faire une jolie petite maison en A de 25 mètres carrés pour moins cher, et monter des ateliers pour apprendre à la construire. Quand tu es pauvre, tu as aussi besoin d’une maison. Tu te sens mieux dans ta peau, tu te vois un avenir. »</em></p>
<h2 class="article__sub-title">Une année de travaux épique</h2>
<p class="article__paragraph">Sa solution laissant Emmaüs Gironde de marbre, elle se promet d’en faire un jour la démonstration. Dix ans plus tard, sans RSA (puisqu’elle a vendu une petite maison rénovée), ni retraite, ni minimum vieillesse (elle n’a pas encore 68 ans), elle achète un terrain à 16 000 euros et commence enfin l’édification de cette maison pour gens de peu qui lui trotte dans la tête. La minicabane pour vivre sur le chantier, avec toilettes extérieures sous tente Quechua, la piscine gonflable de mômes pour affronter la canicule, la laborieuse levée du premier triangle, quand les copains espérés font défaut… l’épique année de travaux est narrée dans un <a href="https://www.youtube.com/watch?v=bBf3Sniwfqw" target="_blank" rel="noopener" title="Nouvelle fenêtre">documentaire</a> signé Morgane Launay.</p>
<p class="article__paragraph">La photographe de 36 ans connaît Elizabeth depuis l’enfance, quand elle l’a rencontrée dans la librairie de ses parents, à Ribérac (Dordogne). En 2013, la jeune femme lâche son quotidien de portraitiste pour filmer l’affaire de son amie. <em>« Je voulais partager avec le monde ce personnage qui ne connaît pas la peur, ce qui lui donne une énorme liberté »,</em> résume-t-elle aujourd’hui. Après une trentaine de rencontres dans les cinémas de la région, Morgane Launay poste en 2018 son documentaire en libre accès sur Internet. Il vivote. Mais en octobre 2020, « 18 h 39 », la chaîne YouTube des magasins de bricolage Castorama, se déplace à Lusignac pour un reportage titré <a href="https://www.youtube.com/watch?v=Ly236vzlHE0" target="_blank" rel="noopener" title="Nouvelle fenêtre"><em>A 65 ans, elle construit seule sa maison en A</em></a> <em>–</em> 725 000 vues engrangées aujourd’hui. Et là, tout s’emballe.</p>
<p class="article__paragraph"><em>« Pendant le confinement, les gens s’emmerdaient,</em> croit comprendre Elizabeth. <em>Ils ont regardé le doc et se sont déplacés pour voir, malgré les interdictions. C’est devenu complètement dingue ! »</em> Elle croule alors sous les appels, les mails et ouvre grand ses portes. <em>« Je voulais juste que la maison soit connue pour que davantage de gens aient un abri. »</em> L’affluence est telle que, usée et virant mal aimable, elle finit par limiter les visites, puis les stopper, en août 2021. Mais le documentaire continue son petit bonhomme de chemin, jusqu’à dépasser les 300 000 vues.</p>
<figure class="article__media"><img src="https://bag.fiat-tux.fr/assets/images/f/1/f1153653/24fbe4f9.jpeg" alt="Les plans de cette maison en A conçue par Elizabeth Faure sont disponibles en libre accès sur Internet. Une centaine de maisons ont déjà été érigées sur ce modèle, plusieurs centaines d’autres sont en projet. A Lusignac (Dordogne), le 23 février 2022." referrerpolicy="no-referrer">
<figcaption class="article__legend" aria-hidden="true">Les plans de cette maison en A conçue par Elizabeth Faure sont disponibles en libre accès sur Internet. Une centaine de maisons ont déjà été érigées sur ce modèle, plusieurs centaines d’autres sont en projet. A Lusignac (Dordogne), le 23 février 2022. YOHAN BONNET POUR « LE MONDE »</figcaption></figure>
<p class="article__paragraph">Les deux femmes décident de mettre à disposition sur Internet les plans de la maison en A. Surtout, elles se lancent dans la confection de tutoriels, grâce aux 27 000 euros de financement participatif récoltés sur la plate-forme Ulule en un rien de temps. Une cinquantaine de vidéos détaillent de A à Z les étapes du projet, du permis de construire à la fabrication de peinture à la farine. Chien sur les genoux, manches de chemise coupées à l’arrache, la retraitée y fait preuve de son éternel naturel. <em>« Là, on travaille au poil de cul, d’accord ? »</em></p>
<h2 class="article__sub-title">Aide entre bâtisseurs</h2>
<p class="article__paragraph">Toute une communauté gravite, désormais, autour de la maison en A, de son <a href="https://www.facebook.com/groups/199450765185982/" target="_blank" rel="noopener" title="Nouvelle fenêtre">groupe Facebook</a> (32 700 membres), de sa <a href="https://www.youtube.com/c/lamaisonena" target="_blank" rel="noopener" title="Nouvelle fenêtre">chaîne YouTube</a>, de son <a href="https://lamaisonena.com/" target="_blank" rel="noopener" title="Nouvelle fenêtre">site</a>, de son blog… On s’y encourage : pas besoin d’être super bricoleur, juste de vouloir apprendre. On y échange des formules géométriques oubliées depuis le collège, des blagues éculées (<em>« Mieux qu’une maison en T ? »</em>) et des tuyaux précieux sur les terrains ou les charpentiers. On y exhibe ses plans 3D puis ses photos de chantier. On y maudit les banques radines en prêts pour l’autoconstruction, les maires crispés sur leur PLU…</p>
<p class="article__paragraph">La hausse du prix des matériaux pousse à attendre des jours moins dispendieux en peaufinant le projet. Sur la carte interactive créée pour faciliter l’entraide entre bâtisseurs présents et futurs, par le biais des chantiers participatifs, une centaine de constructions sont en cours, le double est à venir. A lire les commentaires laissés de toutes parts, le tipi géant bon marché rend à ceux qui l’avaient perdu l’espoir de devenir un jour propriétaires d’une maison. Sa structure en bois peut se dresser en une semaine (et 7 triangles, pour 49 m<sup>2</sup> au sol), se transformer en habitat digne de ce nom en trois mois et s’adapter aux exigences écologiques : sur piliers, elle n’a que peu d’emprise au sol, son toit (grâce à sa surface et son inclinaison) se prête aux panneaux solaires, à la récupération d’eau…</p>
<p class="article__paragraph">Pour s’en assurer, il n’y a qu’à rejoindre Antony Debarre sur son chantier, à Chantérac (Dordogne), non loin de là. Un gars du pays, costaud et barbu, autoentrepreneur dans l’audiovisuel mais tourneur fraiseur de formation. Il a démarré en septembre 2021 son projet de 160 mètres carrés (seuls 90 m<sup>2</sup> loi Carrez seront taxés), <em>« approche du hors d’eau »</em>, en est <em>« aux bacs acier »</em>, plus coûteux mais écologiquement plus vertueux que les tuiles bitumées…</p>
<p class="article__paragraph">Des Normands, des Bretons, une quinzaine de personnes sont déjà venues se former en l’aidant. <em>« Je n’avais pas les moyens de me lancer à 150 000 euros les 90 mètres carrés, et l’atypique, ça m’allait bien »,</em> déclare le quadragénaire qui, mains sur les madriers, exprime sa fierté de construire lui-même pour une cinquantaine de milliers d’euros. <em>« Même si la maison n’est pas parfaite, c’est moi qui l’ai faite ! Elle aura une isolation en paille, des panneaux photovoltaïques, des petites éoliennes en faîtage, que j’ai fabriquées à l’imprimante 3D, des récupérateurs d’eau sous les 320 mètres carrés de toiture, pour les toilettes et les lavages… »</em></p>
<p class="article__paragraph">A Ribérac, Rachelle Zürcher et Romain Eloy, 26 et 35 ans, deux enfants et un smic pour revenu, s’échinent eux aussi, <em>« dès qu’</em>[ils peuvent]<em>, du lever au coucher du soleil ».</em> Ils ont délaissé leur location mal isolée. <em>« C’est très important pour nous d’être autonomes et de polluer le moins possible,</em> insiste la mère de famille. <em>Là, c’est moins cher qu’une maison en bois classique et on peut tout faire. On ne voulait pas s’endetter sur quinze ans, et risquer d’être saisis s’il y a un problème et qu’on n’arrive plus à payer… »</em> L’architecture triangulaire ne fait pas que des heureux, sait-elle, dans le voisinage. <em>« Pour certains, on détruit le paysage. Mais pour nous, c’est un accomplissement. On regarde en arrière, on voit qu’on a fait ça, ça et ça. La vie a plus de sens. »</em></p>
<p class="article__paragraph">De retour dans sa cuisine, Elizabeth Faure sert l’apéritif à l’heure du thé, pour d’autres. Les visiteurs qui l’accaparaient des heures l’ont parfois gratifiée d’une bouteille de ce vin rouge dont le documentaire la montrait friande. C’est bien là tout son gain. Elle sourit. <em>« On a lancé le truc, c’est trop génial, ça me suffit. Je me sens hippie entourée de bébés hippies. »</em></p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 8
- 0
cache/2022/4687697ee56ee244b7d9d17a4a328c6a/index.md
File diff suppressed because it is too large
View File


+ 214
- 0
cache/2022/4d01ca34a54c4be19535df17fdf0c9d2/index.html View File

@@ -0,0 +1,214 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Creating a Nice-Looking PDF with pandoc (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://plaintextproject.online/articles/2022/04/06/pdf.html">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Creating a Nice-Looking PDF with pandoc</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://plaintextproject.online/articles/2022/04/06/pdf.html" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>If you’re familiar with <a href="https://pandoc.org" target="_blank">pandoc</a>, you know how useful and flexible it is. One of the many formats that you can convert to using pandoc is PDF.</p>
<p>Before version 2 of the tool, you needed the TeX typesetting system (and the LaTeX extensions) installed on your computer to go directly to PDF. TeX is great, but it’s also quite big. And if you’re only producing the occasional PDF, then it’s overkill to have even a basic TeX system installed on your computer.</p>
<p>With version 2 of pandoc came a new option: <em>–pdf-engine</em>. That option lets you specify which tool to use when doing a conversion to PDF. While you can still use LaTeX (and a few other tools) to do the deed, you don’t need to bother with all that bulk.</p>
<p>Let’s take a look at how to create a PDF from a <a href="https://gum.co/learnmarkdown" target="_blank">Markdown</a> file using pandoc and a couple of lighter-weight utilities.</p>
<h2 id="getting-started">Getting Started</h2>
<p>You’ll need pandoc installed on your computer, along with one of these tools:</p>

<p>For our purposes, WeasyPrint and wkhtmltopdf are essentially the same, but there are a couple or three little differences. I’ll touch on one of those differences in a moment.</p>
<h2 id="doing-the-conversion">Doing the Conversion</h2>
<p>As I mentioned a few paragraphs ago, I’m going to look at how to create a PDF from a file formatted with Markdown. To do that, open a terminal window on your computer. Navigate to the folder containing the file that you want to convert to PDF and then type either:</p>
<p><code>pandoc [file-name].md --pdf-engine=weasyprint -o [file-name].pdf</code></p>
<p>or</p>
<p><code>pandoc [file-name].md --pdf-engine=wkhtmltopdf -o [file-name].pdf</code></p>
<p>Where <em>[file-name].md</em> is the name of the Markdown file that you want to convert.</p>
<p><strong>Note:</strong> Some people add the <em>-t html</em> option to those commands to create an HTML file that WeasyPrint and wkhtmltopdf then convert to PDF. The command also works without that option.</p>
<p>Here’s the result of a conversion using wkhtmltopdf:</p>
<figure>
<img src="https://plaintextproject.online/images/pdf/wkhtmltopdf-conversion.png" alt="Markdown file converted to PDF with wkhtmltopdf">
</figure>
<p>What you get looks pretty much the same when you use WeasyPrint to do the conversion. The result is functional, but it’s not the nice PDF file that I promised you in the title of this article. So let’s look at how to add a bit of visual flair to a PDF generated with pandoc.</p>
<h2 id="enter-print-css">Enter Print CSS</h2>
<p><a href="https://en.wikipedia.org/wiki/CSS" target="_blank">Cascading Style Sheets</a> (CSS for short) is a way to change the look and feel of a web page or website. Print CSS extends that to formatting a web page or website to be printed. It adds support for changing page sizes, adding page breaks, hiding elements that shouldn’t be printed, adding a cover page, and more.</p>
<p>I’m not going to into print CSS in any detail here, because it’s a big topic that my little brain has trouble wrapping itself around. However, I’m not going to leave you hanging. Here are some sources of information that can help you get started with print CSS:</p>

<h2 id="using-print-css-in-a-conversion">Using Print CSS in a Conversion</h2>
<p>Let’s say you’ve crafted your own print CSS file or begged/borrowed one from somewhere. To use it, you’ll need to add the <em>–css=</em> option to the string of options that you use with pandoc.</p>
<p>So, once again, open a terminal window on your computer. Navigate to the folder containing the file that you want to convert to PDF and then type either:</p>
<p><code>pandoc [file-name].md --pdf-engine=weasyprint --css=pdf-styles.css -o [file-name].pdf</code></p>
<p>or</p>
<p><code>pandoc [file-name].md --pdf-engine=wkhtmltopdf --css=pdf-styles.css -V papersize:a5 -o [file-name].pdf</code></p>
<p>Change <em>pdf-styles.css</em> to the name of your print CSS file. Here’s an example the output, via WeasyPrint, from a print CSS file that I use:</p>
<figure>
<img src="https://plaintextproject.online/images/pdf/weasyprint-conversion.png" alt="Markdown file converted to PDF with WeasyPrint">
</figure>
<p>My stylesheet, while fairly basic:</p>
<ul>
<li>Sets the size of the page to <a href="https://papersizes.io/a/a5" target="_blank">A5</a>.</li>
<li>Adds page breaks before every Heading 1.</li>
<li>Creates margins of 1 inch (2.5 cm) all around.</li>
<li>Uses the Overpass font for all text.</li>
</ul>
<p>The first point in the list above is one area in which WeasyPrint and wkhtmltopdf differ. wkhtmltopdf ignores page sizes that you specify in the CSS file. Instead, you need to specify the page size in the conversion command using the option <em>-V papersize:a5</em>.</p>
<p>The examples I’ve included in this article are fairly basic. But, I hope, they’ll help spark a few ideas for converting your documents formatted with Markdown (or another markup language) to PDF using pandoc.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 47
- 0
cache/2022/4d01ca34a54c4be19535df17fdf0c9d2/index.md View File

@@ -0,0 +1,47 @@
title: Creating a Nice-Looking PDF with pandoc
url: https://plaintextproject.online/articles/2022/04/06/pdf.html
hash_url: 4d01ca34a54c4be19535df17fdf0c9d2

<p>If you’re familiar with <a href="https://pandoc.org" target="_blank">pandoc</a>, you know how useful and flexible it is. One of the many formats that you can convert to using pandoc is PDF.</p>
<p>Before version 2 of the tool, you needed the TeX typesetting system (and the LaTeX extensions) installed on your computer to go directly to PDF. TeX is great, but it’s also quite big. And if you’re only producing the occasional PDF, then it’s overkill to have even a basic TeX system installed on your computer.</p>
<p>With version 2 of pandoc came a new option: <em>–pdf-engine</em>. That option lets you specify which tool to use when doing a conversion to PDF. While you can still use LaTeX (and a few other tools) to do the deed, you don’t need to bother with all that bulk.</p>
<p>Let’s take a look at how to create a PDF from a <a href="https://gum.co/learnmarkdown" target="_blank">Markdown</a> file using pandoc and a couple of lighter-weight utilities.</p>
<h2 id="getting-started">Getting Started</h2>
<p>You’ll need pandoc installed on your computer, along with one of these tools:</p>

<p>For our purposes, WeasyPrint and wkhtmltopdf are essentially the same, but there are a couple or three little differences. I’ll touch on one of those differences in a moment.</p>
<h2 id="doing-the-conversion">Doing the Conversion</h2>
<p>As I mentioned a few paragraphs ago, I’m going to look at how to create a PDF from a file formatted with Markdown. To do that, open a terminal window on your computer. Navigate to the folder containing the file that you want to convert to PDF and then type either:</p>
<p><code>pandoc [file-name].md --pdf-engine=weasyprint -o [file-name].pdf</code></p>
<p>or</p>
<p><code>pandoc [file-name].md --pdf-engine=wkhtmltopdf -o [file-name].pdf</code></p>
<p>Where <em>[file-name].md</em> is the name of the Markdown file that you want to convert.</p>
<p><strong>Note:</strong> Some people add the <em>-t html</em> option to those commands to create an HTML file that WeasyPrint and wkhtmltopdf then convert to PDF. The command also works without that option.</p>
<p>Here’s the result of a conversion using wkhtmltopdf:</p>
<figure>
<img src="https://plaintextproject.online/images/pdf/wkhtmltopdf-conversion.png" alt="Markdown file converted to PDF with wkhtmltopdf">
</figure>
<p>What you get looks pretty much the same when you use WeasyPrint to do the conversion. The result is functional, but it’s not the nice PDF file that I promised you in the title of this article. So let’s look at how to add a bit of visual flair to a PDF generated with pandoc.</p>
<h2 id="enter-print-css">Enter Print CSS</h2>
<p><a href="https://en.wikipedia.org/wiki/CSS" target="_blank">Cascading Style Sheets</a> (CSS for short) is a way to change the look and feel of a web page or website. Print CSS extends that to formatting a web page or website to be printed. It adds support for changing page sizes, adding page breaks, hiding elements that shouldn’t be printed, adding a cover page, and more.</p>
<p>I’m not going to into print CSS in any detail here, because it’s a big topic that my little brain has trouble wrapping itself around. However, I’m not going to leave you hanging. Here are some sources of information that can help you get started with print CSS:</p>

<h2 id="using-print-css-in-a-conversion">Using Print CSS in a Conversion</h2>
<p>Let’s say you’ve crafted your own print CSS file or begged/borrowed one from somewhere. To use it, you’ll need to add the <em>–css=</em> option to the string of options that you use with pandoc.</p>
<p>So, once again, open a terminal window on your computer. Navigate to the folder containing the file that you want to convert to PDF and then type either:</p>
<p><code>pandoc [file-name].md --pdf-engine=weasyprint --css=pdf-styles.css -o [file-name].pdf</code></p>
<p>or</p>
<p><code>pandoc [file-name].md --pdf-engine=wkhtmltopdf --css=pdf-styles.css -V papersize:a5 -o [file-name].pdf</code></p>
<p>Change <em>pdf-styles.css</em> to the name of your print CSS file. Here’s an example the output, via WeasyPrint, from a print CSS file that I use:</p>
<figure>
<img src="https://plaintextproject.online/images/pdf/weasyprint-conversion.png" alt="Markdown file converted to PDF with WeasyPrint">
</figure>
<p>My stylesheet, while fairly basic:</p>
<ul>
<li>Sets the size of the page to <a href="https://papersizes.io/a/a5" target="_blank">A5</a>.</li>
<li>Adds page breaks before every Heading 1.</li>
<li>Creates margins of 1 inch (2.5 cm) all around.</li>
<li>Uses the Overpass font for all text.</li>
</ul>
<p>The first point in the list above is one area in which WeasyPrint and wkhtmltopdf differ. wkhtmltopdf ignores page sizes that you specify in the CSS file. Instead, you need to specify the page size in the conversion command using the option <em>-V papersize:a5</em>.</p>
<p>The examples I’ve included in this article are fairly basic. But, I hope, they’ll help spark a few ideas for converting your documents formatted with Markdown (or another markup language) to PDF using pandoc.</p>

+ 192
- 0
cache/2022/6a8fadb032ab4c1951319268a1315655/index.html View File

@@ -0,0 +1,192 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Commentaire Hacker News sur Next Gen Static Blogging (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://news.ycombinator.com/item?id=25701053">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Commentaire Hacker News sur Next Gen Static Blogging</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://news.ycombinator.com/item?id=25701053" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p><span class="commtext c00">Note that closing &lt;/p&gt; tags are optional<i>†</i>, so one can be an HTML purist and still write a decent HTML document with a relatively clean markup like this:<p></p><pre><code> &lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;title&gt;Lorem Ipsum&lt;/title&gt;
&lt;h1&gt;Lorem Ipsum&lt;/h1&gt;
&lt;p&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Duis id maximus tortor. Sed nisi ante, fermentum vel nunc
et, tincidunt sagittis magna. In ultrices commodo lacus, id
tristique ipsum euismod laoreet.
&lt;p&gt;
Maecenas at neque posuere, aliquet erat at, vehicula est.
Duis aliquet elit et arcu laoreet, id pulvinar eros pretium.
Quisque consectetur, enim semper facilisis feugiat, velit
sapien semper arcu, eu mollis libero est et odio.
&lt;p&gt;
Curabitur fringilla interdum ante vel ultricies. Mauris
volutpat nisi sed turpis elementum elementum. Mauris nec
eleifend lorem. Sed ac vulputate libero.
</code></pre>
A valid HTML5 document does not require<i>†</i> explicit &lt;head&gt;, &lt;body&gt;, or the closing &lt;/p&gt;, &lt;/html&gt; tags. See the spec for optional tags at <a href="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags" rel="nofollow">https://html.spec.whatwg.org/multipage/syntax.html#optional-...</a> for more details. Similarly, the markup for lists and tables can be cleaned up too because the closing &lt;/li&gt;, &lt;/tr&gt;, &lt;/th&gt;, &lt;/td&gt; tags are optional<i>†</i>.<p>Note that the opening &lt;html&gt; tag is optional<i>†</i> too but I retained it in the above example to specify the lang attribute otherwise the W3 markup validator warns, "Consider adding a lang attribute to the html start tag to declare the language of this document."</p><p><i>† These tags are optional provided certain conditions are met. See the spec for full details. In practice, one rarely has to worry about these conditions.</i>
</p></p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 25
- 0
cache/2022/6a8fadb032ab4c1951319268a1315655/index.md View File

@@ -0,0 +1,25 @@
title: Commentaire Hacker News sur Next Gen Static Blogging
url: https://news.ycombinator.com/item?id=25701053
hash_url: 6a8fadb032ab4c1951319268a1315655

<span class="commtext c00">Note that closing &lt;/p&gt; tags are optional<i>†</i>, so one can be an HTML purist and still write a decent HTML document with a relatively clean markup like this:<p></p><pre><code> &lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;title&gt;Lorem Ipsum&lt;/title&gt;
&lt;h1&gt;Lorem Ipsum&lt;/h1&gt;
&lt;p&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Duis id maximus tortor. Sed nisi ante, fermentum vel nunc
et, tincidunt sagittis magna. In ultrices commodo lacus, id
tristique ipsum euismod laoreet.
&lt;p&gt;
Maecenas at neque posuere, aliquet erat at, vehicula est.
Duis aliquet elit et arcu laoreet, id pulvinar eros pretium.
Quisque consectetur, enim semper facilisis feugiat, velit
sapien semper arcu, eu mollis libero est et odio.
&lt;p&gt;
Curabitur fringilla interdum ante vel ultricies. Mauris
volutpat nisi sed turpis elementum elementum. Mauris nec
eleifend lorem. Sed ac vulputate libero.
</code></pre>
A valid HTML5 document does not require<i>†</i> explicit &lt;head&gt;, &lt;body&gt;, or the closing &lt;/p&gt;, &lt;/html&gt; tags. See the spec for optional tags at <a href="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags" rel="nofollow">https://html.spec.whatwg.org/multipage/syntax.html#optional-...</a> for more details. Similarly, the markup for lists and tables can be cleaned up too because the closing &lt;/li&gt;, &lt;/tr&gt;, &lt;/th&gt;, &lt;/td&gt; tags are optional<i>†</i>.<p>Note that the opening &lt;html&gt; tag is optional<i>†</i> too but I retained it in the above example to specify the lang attribute otherwise the W3 markup validator warns, "Consider adding a lang attribute to the html start tag to declare the language of this document."</p><p><i>† These tags are optional provided certain conditions are met. See the spec for full details. In practice, one rarely has to worry about these conditions.</i>
</p>

+ 261
- 0
cache/2022/72b4d15d286c2df85aba5742b1d98e62/index.html View File

@@ -0,0 +1,261 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Web Components as Progressive Enhancement (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://cloudfour.com/thinks/web-components-as-progressive-enhancement/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Web Components as Progressive Enhancement</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://cloudfour.com/thinks/web-components-as-progressive-enhancement/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<div class="u-bgGray u-pad1 u-pullSides1 u-spaceItems1 u-textGrow1"><p>Web components are a powerful tool for creating custom HTML elements, but you can run into challenges if you try to replace existing elements with web components. To get the best of both worlds, try wrapping existing elements in web components instead.</p></div>
<p>I learned this the hard way&#8230; On a few recent projects we&#8217;ve wanted to create an auto-expanding <code>textarea</code>: When a user types its height would increase so that its content is never clipped.</p>
<p>I was tired of rewriting this behavior across projects and frameworks and began thinking through how it could be written as a reusable web component. My first draft of an API looked like this:</p>
<pre><code class="language-html">&lt;elastic-textarea name="textarea-name" id="textarea-id" rows="4"&gt;
Here is my textarea content
&lt;/elastic-textarea&gt;
</code></pre>
<p>This is pretty sweet. Developers can use this exactly like the <code>textarea</code> they&#8217;re already used to! But, as I was testing this out I noticed a couple of major downsides:</p>
<ol>
<li>Web components require JavaScript to render <sup id="fnref-6408-1"><a href="#fn-6408-1" class="jetpack-footnote" title="Read footnote.">1</a></sup>. This means that until the JavaScript is downloaded, parsed, and run, no <code>textarea</code> is displayed. Instead &#8220;Here is my textarea content&#8221; is displayed as an unstyled string. If a user has JavaScript disabled, or the JavaScript fails to load, the textarea just won&#8217;t work.</li>
<li>The <code>textarea</code> element has its own complex behavior, APIs, and accessibility behaviors. I&#8217;d need to recreate a lot of this from scratch for my component. I&#8217;d need to apply the <code>name</code>, <code>id</code>, and <code>rows</code> to the actual <code>textarea</code> element that my JavaScript renders. I&#8217;d also need to add all of the <code>textarea</code> JavaScript APIs to my custom element (<code>.value</code>, <code>.is-valid</code>, etc.) <sup id="fnref-6408-2"><a href="#fn-6408-2" class="jetpack-footnote" title="Read footnote.">2</a></sup></li>
</ol>
<div class="HashHeading HashHeading--h2">
<h2 id="the-solution">The Solution</h2>
<a href="#the-solution"
aria-label="Permalink for The Solution"
class="HashHeading-link">
<svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M13.77,10.09l-0.71-.71a4,4,0,0,0-5.65,0L3.16,13.63a4,4,0,0,0,0,5.66l1.4,1.4a4,4,0,0,0,5.67,0l1.41-1.41"/><path d="M10.23,13.62l0.71,0.71a4,4,0,0,0,5.65,0l4.25-4.25a4,4,0,0,0,0-5.66L19.43,3a4,4,0,0,0-5.67,0L12.35,4.43"/></g></svg>

</a>
</div>

<p>We can avoid both of these drawbacks by wrapping and enhancing an existing element instead of replacing it. Here&#8217;s what that looks like:</p>
<pre><code class="language-html">&lt;elastic-textarea&gt;
&lt;textarea name="textarea-name" id="textarea-id" rows="4"&gt;
Here is my textarea content
&lt;/textarea&gt;
&lt;/elastic-textarea&gt;
</code></pre>
<p>This is a little more verbose, but it gets me the best of both worlds. Before JavaScript loads I have a fully functioning <code>textarea</code>. After JavaScript loads my <code>textarea</code> is progressively enhanced with additional functionality.</p>
<p>It could get a little tedious to wrap every <code>textarea</code> on the page. To avoid this we could set the component up so it can wrap multiple <code>textarea</code>s and enhance all of them at once. This would allow you to wrap a whole form or page to enable this behavior:</p>
<pre><code class="language-html">&lt;elastic-textarea&gt;
&lt;textarea name="textarea-name" id="textarea-id" rows="2"&gt;
Here is my textarea content
&lt;/textarea&gt;

&lt;textarea name="textarea-2" id="textarea-id-2" rows="5"&gt;
Here is another textarea
&lt;/textarea&gt;
&lt;/elastic-textarea&gt;
</code></pre>
<p>You can play with the finished component below:</p>
<figure class="Figure" style="text-align: center;">
<script type="module" src="https://unpkg.com/@cloudfour/elastic-textarea/index.min.js"></script><br />
<elastic-textarea><br />
<label for="textarea-id">Type in the textarea below to watch it expand and contract.</label><br />
<textarea name="textarea-name" id="textarea-id" style="resize: horizontal;width:100%;margin-top: 1em;"></textarea><br />
</elastic-textarea><figcaption class="Figure-caption">
We released this as an <a href="https://www.npmjs.com/package/@cloudfour/elastic-textarea">open source component</a> you can use in your projects. Most of the JavaScript logic was borrowed from an excellent implementation my colleague <a href="https://cloudfour.com/is/scott">Scott Vandehey</a> wrote for a previous project.<br />
</figcaption></figure>
<div class="HashHeading HashHeading--h2">
<h2 id="the-skys-the-limit">The Sky&#8217;s the Limit</h2>
<a href="#the-skys-the-limit"
aria-label="Permalink for The Sky&#8217;s the Limit"
class="HashHeading-link">
<svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M13.77,10.09l-0.71-.71a4,4,0,0,0-5.65,0L3.16,13.63a4,4,0,0,0,0,5.66l1.4,1.4a4,4,0,0,0,5.67,0l1.41-1.41"/><path d="M10.23,13.62l0.71,0.71a4,4,0,0,0,5.65,0l4.25-4.25a4,4,0,0,0,0-5.66L19.43,3a4,4,0,0,0-5.67,0L12.35,4.43"/></g></svg>

</a>
</div>

<p>The <code>elastic-textarea</code> component is a single example of how web components can be used for progressive enhancement, but there are tons of other potential use cases for this technique. Here are a couple other examples to check out for inspiration:</p>
<ul>
<li><a href="https://www.zachleat.com/">Zach Leatherman</a> created an <em>excellent</em> <a href="https://www.zachleat.com/web/details-utils/"><code>details-utils</code></a> component that wraps and progressively enhances the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details"><code>details</code> element</a>. (This was a big source of inspiration for my approach here.)</li>
<li>I used this same technique to create <a href="https://cloudfour.com/thinks/building-an-accessible-image-comparison-web-component/">a progressively enhanced image comparison component</a>.</li>
</ul>
<div class="HashHeading HashHeading--h2">
<h2 id="sharing-is-caring">Sharing is Caring</h2>
<a href="#sharing-is-caring"
aria-label="Permalink for Sharing is Caring"
class="HashHeading-link">
<svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M13.77,10.09l-0.71-.71a4,4,0,0,0-5.65,0L3.16,13.63a4,4,0,0,0,0,5.66l1.4,1.4a4,4,0,0,0,5.67,0l1.41-1.41"/><path d="M10.23,13.62l0.71,0.71a4,4,0,0,0,5.65,0l4.25-4.25a4,4,0,0,0,0-5.66L19.43,3a4,4,0,0,0-5.67,0L12.35,4.43"/></g></svg>

</a>
</div>

<p>I&#8217;m a big fan of this strategy and I&#8217;m excited to create and share more progressively enhanced components. At Cloud Four we work on a lot of different projects for a lot of different clients, and I&#8217;ve found myself rewriting the same functionality across several projects. Next time I catch myself rewriting the same component logic for the third or fourth time I&#8217;m going to make it a web component so I don&#8217;t have to write it a fifth time.</p>
<p>By packaging these chunks of interactive logic as custom elements, we can make them easy to share and reuse across projects and frameworks. By enhancing native HTML instead of replacing it, we can provide a solid baseline experience, and add progressive enhancement as the cherry on top.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-6408-1">
There are various libraries that allow server side rendering of web components, but they usually require you to buy into a specific web component framework, and/or modify your build steps. These are useful tools for individuals projects, but don&#8217;t work as well for creating easily shareable components.&#160;<a href="#fnref-6408-1" title="Return to main content."><svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"><path d="M4,14H16a5.76,5.76,0,0,0,6-6,5.76,5.76,0,0,0-6-6"/><polyline points="8 8 2 14 8 20"/></g></svg>
</a>
</li>
<li id="fn-6408-2">
There&#8217;s a spec to allow <a href="https://web.dev/custom-elements-v1/#extending-native-html-elements">extending existing elements</a> but it looks unlikely that Safari will adopt it. On some projects, <a href="https://cloudfour.com/thinks/mighty-morphin-web-components/">recreating element APIs can have a big payoff</a> but it&#8217;s a lot of work if you&#8217;re just trying to add a little functionality to an existing element.&#160;<a href="#fnref-6408-2" title="Return to main content."><svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"><path d="M4,14H16a5.76,5.76,0,0,0,6-6,5.76,5.76,0,0,0-6-6"/><polyline points="8 8 2 14 8 20"/></g></svg>
</a>
</li>
</ol>
</div>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 94
- 0
cache/2022/72b4d15d286c2df85aba5742b1d98e62/index.md View File

@@ -0,0 +1,94 @@
title: Web Components as Progressive Enhancement
url: https://cloudfour.com/thinks/web-components-as-progressive-enhancement/
hash_url: 72b4d15d286c2df85aba5742b1d98e62

<div class="u-bgGray u-pad1 u-pullSides1 u-spaceItems1 u-textGrow1"><p>Web components are a powerful tool for creating custom HTML elements, but you can run into challenges if you try to replace existing elements with web components. To get the best of both worlds, try wrapping existing elements in web components instead.</p></div>
<p>I learned this the hard way&#8230; On a few recent projects we&#8217;ve wanted to create an auto-expanding <code>textarea</code>: When a user types its height would increase so that its content is never clipped.</p>
<p>I was tired of rewriting this behavior across projects and frameworks and began thinking through how it could be written as a reusable web component. My first draft of an API looked like this:</p>
<pre><code class="language-html">&lt;elastic-textarea name="textarea-name" id="textarea-id" rows="4"&gt;
Here is my textarea content
&lt;/elastic-textarea&gt;
</code></pre>
<p>This is pretty sweet. Developers can use this exactly like the <code>textarea</code> they&#8217;re already used to! But, as I was testing this out I noticed a couple of major downsides:</p>
<ol>
<li>Web components require JavaScript to render <sup id="fnref-6408-1"><a href="#fn-6408-1" class="jetpack-footnote" title="Read footnote.">1</a></sup>. This means that until the JavaScript is downloaded, parsed, and run, no <code>textarea</code> is displayed. Instead &#8220;Here is my textarea content&#8221; is displayed as an unstyled string. If a user has JavaScript disabled, or the JavaScript fails to load, the textarea just won&#8217;t work.</li>
<li>The <code>textarea</code> element has its own complex behavior, APIs, and accessibility behaviors. I&#8217;d need to recreate a lot of this from scratch for my component. I&#8217;d need to apply the <code>name</code>, <code>id</code>, and <code>rows</code> to the actual <code>textarea</code> element that my JavaScript renders. I&#8217;d also need to add all of the <code>textarea</code> JavaScript APIs to my custom element (<code>.value</code>, <code>.is-valid</code>, etc.) <sup id="fnref-6408-2"><a href="#fn-6408-2" class="jetpack-footnote" title="Read footnote.">2</a></sup></li>
</ol>
<div class="HashHeading HashHeading--h2">
<h2 id="the-solution">The Solution</h2>
<a href="#the-solution"
aria-label="Permalink for The Solution"
class="HashHeading-link">
<svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M13.77,10.09l-0.71-.71a4,4,0,0,0-5.65,0L3.16,13.63a4,4,0,0,0,0,5.66l1.4,1.4a4,4,0,0,0,5.67,0l1.41-1.41"/><path d="M10.23,13.62l0.71,0.71a4,4,0,0,0,5.65,0l4.25-4.25a4,4,0,0,0,0-5.66L19.43,3a4,4,0,0,0-5.67,0L12.35,4.43"/></g></svg>

</a>
</div>
<p>We can avoid both of these drawbacks by wrapping and enhancing an existing element instead of replacing it. Here&#8217;s what that looks like:</p>
<pre><code class="language-html">&lt;elastic-textarea&gt;
&lt;textarea name="textarea-name" id="textarea-id" rows="4"&gt;
Here is my textarea content
&lt;/textarea&gt;
&lt;/elastic-textarea&gt;
</code></pre>
<p>This is a little more verbose, but it gets me the best of both worlds. Before JavaScript loads I have a fully functioning <code>textarea</code>. After JavaScript loads my <code>textarea</code> is progressively enhanced with additional functionality.</p>
<p>It could get a little tedious to wrap every <code>textarea</code> on the page. To avoid this we could set the component up so it can wrap multiple <code>textarea</code>s and enhance all of them at once. This would allow you to wrap a whole form or page to enable this behavior:</p>
<pre><code class="language-html">&lt;elastic-textarea&gt;
&lt;textarea name="textarea-name" id="textarea-id" rows="2"&gt;
Here is my textarea content
&lt;/textarea&gt;

&lt;textarea name="textarea-2" id="textarea-id-2" rows="5"&gt;
Here is another textarea
&lt;/textarea&gt;
&lt;/elastic-textarea&gt;
</code></pre>
<p>You can play with the finished component below:</p>
<figure class="Figure" style="text-align: center;">
<script type="module" src="https://unpkg.com/@cloudfour/elastic-textarea/index.min.js"></script><br />
<elastic-textarea><br />
<label for="textarea-id">Type in the textarea below to watch it expand and contract.</label><br />
<textarea name="textarea-name" id="textarea-id" style="resize: horizontal;width:100%;margin-top: 1em;"></textarea><br />
</elastic-textarea><figcaption class="Figure-caption">
We released this as an <a href="https://www.npmjs.com/package/@cloudfour/elastic-textarea">open source component</a> you can use in your projects. Most of the JavaScript logic was borrowed from an excellent implementation my colleague <a href="https://cloudfour.com/is/scott">Scott Vandehey</a> wrote for a previous project.<br />
</figcaption></figure>
<div class="HashHeading HashHeading--h2">
<h2 id="the-skys-the-limit">The Sky&#8217;s the Limit</h2>
<a href="#the-skys-the-limit"
aria-label="Permalink for The Sky&#8217;s the Limit"
class="HashHeading-link">
<svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M13.77,10.09l-0.71-.71a4,4,0,0,0-5.65,0L3.16,13.63a4,4,0,0,0,0,5.66l1.4,1.4a4,4,0,0,0,5.67,0l1.41-1.41"/><path d="M10.23,13.62l0.71,0.71a4,4,0,0,0,5.65,0l4.25-4.25a4,4,0,0,0,0-5.66L19.43,3a4,4,0,0,0-5.67,0L12.35,4.43"/></g></svg>

</a>
</div>
<p>The <code>elastic-textarea</code> component is a single example of how web components can be used for progressive enhancement, but there are tons of other potential use cases for this technique. Here are a couple other examples to check out for inspiration:</p>
<ul>
<li><a href="https://www.zachleat.com/">Zach Leatherman</a> created an <em>excellent</em> <a href="https://www.zachleat.com/web/details-utils/"><code>details-utils</code></a> component that wraps and progressively enhances the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details"><code>details</code> element</a>. (This was a big source of inspiration for my approach here.)</li>
<li>I used this same technique to create <a href="https://cloudfour.com/thinks/building-an-accessible-image-comparison-web-component/">a progressively enhanced image comparison component</a>.</li>
</ul>
<div class="HashHeading HashHeading--h2">
<h2 id="sharing-is-caring">Sharing is Caring</h2>
<a href="#sharing-is-caring"
aria-label="Permalink for Sharing is Caring"
class="HashHeading-link">
<svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"><path d="M13.77,10.09l-0.71-.71a4,4,0,0,0-5.65,0L3.16,13.63a4,4,0,0,0,0,5.66l1.4,1.4a4,4,0,0,0,5.67,0l1.41-1.41"/><path d="M10.23,13.62l0.71,0.71a4,4,0,0,0,5.65,0l4.25-4.25a4,4,0,0,0,0-5.66L19.43,3a4,4,0,0,0-5.67,0L12.35,4.43"/></g></svg>

</a>
</div>
<p>I&#8217;m a big fan of this strategy and I&#8217;m excited to create and share more progressively enhanced components. At Cloud Four we work on a lot of different projects for a lot of different clients, and I&#8217;ve found myself rewriting the same functionality across several projects. Next time I catch myself rewriting the same component logic for the third or fourth time I&#8217;m going to make it a web component so I don&#8217;t have to write it a fifth time.</p>
<p>By packaging these chunks of interactive logic as custom elements, we can make them easy to share and reuse across projects and frameworks. By enhancing native HTML instead of replacing it, we can provide a solid baseline experience, and add progressive enhancement as the cherry on top.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-6408-1">
There are various libraries that allow server side rendering of web components, but they usually require you to buy into a specific web component framework, and/or modify your build steps. These are useful tools for individuals projects, but don&#8217;t work as well for creating easily shareable components.&#160;<a href="#fnref-6408-1" title="Return to main content."><svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"><path d="M4,14H16a5.76,5.76,0,0,0,6-6,5.76,5.76,0,0,0-6-6"/><polyline points="8 8 2 14 8 20"/></g></svg>
</a>
</li>
<li id="fn-6408-2">
There&#8217;s a spec to allow <a href="https://web.dev/custom-elements-v1/#extending-native-html-elements">extending existing elements</a> but it looks unlikely that Safari will adopt it. On some projects, <a href="https://cloudfour.com/thinks/mighty-morphin-web-components/">recreating element APIs can have a big payoff</a> but it&#8217;s a lot of work if you&#8217;re just trying to add a little functionality to an existing element.&#160;<a href="#fnref-6408-2" title="Return to main content."><svg viewBox="0 0 24 24" width="24" height="24" class="Icon" role="presentation"><g fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"><path d="M4,14H16a5.76,5.76,0,0,0,6-6,5.76,5.76,0,0,0-6-6"/><polyline points="8 8 2 14 8 20"/></g></svg>
</a>
</li>
</ol>
</div>

+ 210
- 0
cache/2022/7616326c2896e35714a26de5d2898736/index.html View File

@@ -0,0 +1,210 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Considérations générales sur le vote en ligne (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://voter.cliss21.org/consid%C3%A9rations-g%C3%A9n%C3%A9rales-sur-le-vote-en-ligne/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Considérations générales sur le vote en ligne</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://voter.cliss21.org/consid%C3%A9rations-g%C3%A9n%C3%A9rales-sur-le-vote-en-ligne/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>Il nous semble important de préciser ici que <b>GvoT</b> est une solution de vote en ligne et que, à ce titre, il faut être conscient des limites d’un tel outil.</p>
<p>A fortiori, <b>GvoT</b> est conçu pour des besoins typiques d’un contexte de prises de décisions formelles. Le caractère d’urgence et de force majeur que nous impose la crise du COVID19 pourrait sembler justifier quelques libertés prises avec la forme d’un scrutin. Après tout, pourrait on se dire, « <i>papier ou électronique, quelle différence cela fait pour les participants au vote ?</i> »</p>
<p>Néanmoins il se trouve qu’un scrutin électronique n’a pas les propriétés d’un scrutin à bulletin secret dans une urne transparente et il faut en être conscient. À ce titre, il n’offre pas du tout les mêmes garanties (voir par exemple l’<a href="https://wiki.april.org/w/Discussion_vote_%C3%A9lectronique">excellente synthèse</a> de l’<a href="https://april.org/">April</a> sur le sujet). Le fait que <b>GvoT</b> soit un logiciel libre ne protège pas de tous les risques de manipulation.</p>
<h2>Difficultés techniques</h2>
<h3>Compromis contrôlabilité/traçabilité</h3>
<p>La nature d’un scrutin en ligne est différente de celui impliquant une urne physique. En particulier, il n’existe aucune méthode connue permettant à la fois :</p>
<ul><li>Le <b>contrôle</b> du scrutin par les participant⋅e⋅s (vérifier que ce tous les votes sont pris en compte et seulement eux).</li><li>La <b>non-traçabilité</b> du scrutin (préservation de l’anonymat des participant⋅e⋅s).</li></ul>
<p>En l’état de l’art, cette aporie est un problème théorique ouvert qui ne possède pas à notre connaissance de solution technologique (y compris à base de chiffrement et/ou autre blockchain).</p>
<p>Le chiffrement n’est pas une solution, notamment car il ne protège pas contre le bourrage d’urnes. Contrôler un scrutin ne se limite pas à ce que je contrôle que mon expression est prise en compte. Cela implique aussi de contrôler que l’expression de chacun et seulement elle est prise en compte.</p>
<p>La conséquence est qu'en cas de réclamation, la seule manière possible d’établir les faits est d’ouvrir le scrutin afin que <b>chacun</b> puisse <b>contrôler</b> que <b>tous les votes</b> sont pris en compte et <b>seulement eux</b>. Cela s’apparenterait à « rejouer » le scrutin, à main levée.</p>
<p>L’ouverture du scrutin doit donc pouvoir être demandée à l’organisateur⋅ice. L’intégralité des personnes devraient alors recevoir un accès à l’intégralité des données propres au scrutin concerné.</p>
<h3>Dépendance à la technologie email</h3>
<p>Pour des raisons de rapidité d’organisation et d’interopérabilité, l’envoi des pouvoirs se fera par courriel.</p>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager à une obligation de moyen pour permettre au mieux la délivrance des pouvoirs aux adresses destinataires par courriel.</p>
<p>Néanmoins, du fait de la nature décentralisée des protocoles de courriels et de la difficulté majeure de vérifier des identités en ligne :</p>
<ul><li>Les hébergeurs ne peuvent garantir que les courriels seront <b>présentés</b> aux personnes jugées légitimes. Hors de notre périmètre, nous ne contrôlons pas que le courriel atterrit dans le dossier des courriels à lire en urgence.</li><li>Les hébergeurs ne peuvent garantir que les courriels envoyés <b>seront lus</b> par les personnes jugées légitimes. Hors de notre périmètre nous ne contrôlons pas que les personnes relèvent la bonne boite.</li><li>Les hébergeurs ne peuvent garantir que les courriels envoyés seront lus <b>par les seules personnes</b> jugées légitimes. Rien n’empêche les fuites d’information et donc la fuite des pouvoirs.</li></ul>
<h2>Conseils aux usagers</h2>
<p>La coopérative Cliss XXI reconnaît la nature particulièrement sensible des données et des résultats d’un scrutin d’assemblée générale, de modification de statut ou d’un règlement intérieur.</p>
<p>À ce titre elle insiste sur ce qui fait la bonne tenue d’un scrutin à travers 3 axes : ouverture, transparence et neutralité.</p>
<p>Ouverture car le logiciel est libre. Transparence des pratiques et reconnaissance des limitations existantes. Neutralité par déontologie, en tant que prestataire technique d’hébergement tel que défini par la loi sur la confiance en l’économie numérique (LCEN).</p>
<h3>Ouverture</h3>
<p><b>GvoT</b> est un logiciel libre : sous licence <a href="https://forge.cliss21.org/cliss21/gvot/src/branch/master/LICENSE">GNU Affero GPL</a>. Une disposition spéciale de cette licence est que tout utilisateur⋅ice du logiciel est en droit d’obtenir une copie de son code source avec les permissions usuelles du logiciel libre (droits d’usage, d’étude, de modification, de redistribution).</p>
<p>Le code du logiciel est disponible sur la <a href="https://forge.cliss21.org/cliss21/gvot">forge de Cliss XXI</a> .</p>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ce que le code utilisé pour le vote soit celui publié et librement auditable par ailleurs.</p>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ce que l’accès aux données du vote NE SOIT accessible à aucune autre application que la présente plateforme hébergée ainsi que le socle technique qui la porte.</p>
<p>La procédure de vote et d’administration du vote sur le site web devrait être protégée par le chiffrement <b>TLS</b> en vigueur au moment du vote (TLS version 1.2 ou 1.3 au moment du COVID19). Il s’agit d’un standard international recommandé et conforme aux préconisations de l’ANSSI.</p>
<h3>Transparence</h3>
<p>Un hébergeur de <b>GvoT</b> devrait reconnaître les limites technologiques et déontologiques qui affectent le vote en ligne pour un scrutin à bulletin secret.</p>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ce que les données du scrutin soient recueillies dans le seul but décrit en introduction du scrutin. En conséquence ces données ainsi que celles recueillies dans le cadre du vote ne seraient pas utilisées à d’autres fins ni transmises à un tiers.</p>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur en accord avec l’organisateur, à ce que ces données <b>soient détruites</b> une fois le scrutin passé, et dans tous les cas au plus tard un certain nombre de jours après la fin de la tenue du scrutin.</p>
<p>Dans tous les cas, les participant⋅e⋅s disposent d’un droit d’accès, de modification, de rectification et de suppression des données les concernant (loi « Informatique et Liberté » du 6 janvier 1978).</p>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ne pas cacher la détection d’un comportement anormal s’il était détecté (piratage, fuite accidentelle d’informations, etc.).</p>
<h3>Neutralité</h3>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager à une obligation de moyens pour permettre la tenue du scrutin dans les meilleurs conditions.</p>
<p>Cela implique, de façon non exhaustive à :</p>
<ul><li>suivre l’expédition des courriels d’annonce,</li><li>veiller à la disponibilité de la plateforme aux heures ouvrées pendant la durée du scrutin,</li><li>répondre aux demandes d’assistance des utilisateur⋅ices.</li></ul>
<p>Un moyen d’accéder à l’assistance devrait être précisée sur la plateforme de vote ainsi que dans chaque courriel expédié aux participant⋅e⋅s.</p>
<p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ne procéder à aucune intervention qui soit de nature à biaiser l’issue du scrutin. Les éventuelles interventions se feront uniquement sous la forme d’une assistance avec une éventuelle intervention qui sera strictement proportionnée à la demande de la personne assistée dans le vote.</p>
<p>En cas d’intervention impliquant les données du scrutin, un journal des interventions devrait être tenu avec soin.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 10
- 0
cache/2022/7616326c2896e35714a26de5d2898736/index.md View File

@@ -0,0 +1,10 @@
title: Considérations générales sur le vote en ligne
url: https://voter.cliss21.org/consid%C3%A9rations-g%C3%A9n%C3%A9rales-sur-le-vote-en-ligne/
hash_url: 7616326c2896e35714a26de5d2898736

<p>Il nous semble important de préciser ici que <b>GvoT</b> est une solution de vote en ligne et que, à ce titre, il faut être conscient des limites d’un tel outil.</p><p>A fortiori, <b>GvoT</b> est conçu pour des besoins typiques d’un contexte de prises de décisions formelles. Le caractère d’urgence et de force majeur que nous impose la crise du COVID19 pourrait sembler justifier quelques libertés prises avec la forme d’un scrutin. Après tout, pourrait on se dire, « <i>papier ou électronique, quelle différence cela fait pour les participants au vote ?</i> »</p><p>Néanmoins il se trouve qu’un scrutin électronique n’a pas les propriétés d’un scrutin à bulletin secret dans une urne transparente et il faut en être conscient. À ce titre, il n’offre pas du tout les mêmes garanties (voir par exemple l’<a href="https://wiki.april.org/w/Discussion_vote_%C3%A9lectronique">excellente synthèse</a> de l’<a href="https://april.org/">April</a> sur le sujet). Le fait que <b>GvoT</b> soit un logiciel libre ne protège pas de tous les risques de manipulation.</p><h2>Difficultés techniques</h2>
<h3>Compromis contrôlabilité/traçabilité</h3><p>La nature d’un scrutin en ligne est différente de celui impliquant une urne physique. En particulier, il n’existe aucune méthode connue permettant à la fois :</p><ul><li>Le <b>contrôle</b> du scrutin par les participant⋅e⋅s (vérifier que ce tous les votes sont pris en compte et seulement eux).</li><li>La <b>non-traçabilité</b> du scrutin (préservation de l’anonymat des participant⋅e⋅s).</li></ul><p>En l’état de l’art, cette aporie est un problème théorique ouvert qui ne possède pas à notre connaissance de solution technologique (y compris à base de chiffrement et/ou autre blockchain).</p><p>Le chiffrement n’est pas une solution, notamment car il ne protège pas contre le bourrage d’urnes. Contrôler un scrutin ne se limite pas à ce que je contrôle que mon expression est prise en compte. Cela implique aussi de contrôler que l’expression de chacun et seulement elle est prise en compte.</p><p>La conséquence est qu'en cas de réclamation, la seule manière possible d’établir les faits est d’ouvrir le scrutin afin que <b>chacun</b> puisse <b>contrôler</b> que <b>tous les votes</b> sont pris en compte et <b>seulement eux</b>. Cela s’apparenterait à « rejouer » le scrutin, à main levée.</p><p>L’ouverture du scrutin doit donc pouvoir être demandée à l’organisateur⋅ice. L’intégralité des personnes devraient alors recevoir un accès à l’intégralité des données propres au scrutin concerné.</p>
<h3>Dépendance à la technologie email</h3><p>Pour des raisons de rapidité d’organisation et d’interopérabilité, l’envoi des pouvoirs se fera par courriel.</p><p>Un hébergeur de <b>GvoT</b> devrait s’engager à une obligation de moyen pour permettre au mieux la délivrance des pouvoirs aux adresses destinataires par courriel.</p><p>Néanmoins, du fait de la nature décentralisée des protocoles de courriels et de la difficulté majeure de vérifier des identités en ligne :</p><ul><li>Les hébergeurs ne peuvent garantir que les courriels seront <b>présentés</b> aux personnes jugées légitimes. Hors de notre périmètre, nous ne contrôlons pas que le courriel atterrit dans le dossier des courriels à lire en urgence.</li><li>Les hébergeurs ne peuvent garantir que les courriels envoyés <b>seront lus</b> par les personnes jugées légitimes. Hors de notre périmètre nous ne contrôlons pas que les personnes relèvent la bonne boite.</li><li>Les hébergeurs ne peuvent garantir que les courriels envoyés seront lus <b>par les seules personnes</b> jugées légitimes. Rien n’empêche les fuites d’information et donc la fuite des pouvoirs.</li></ul><h2>Conseils aux usagers</h2><p>La coopérative Cliss XXI reconnaît la nature particulièrement sensible des données et des résultats d’un scrutin d’assemblée générale, de modification de statut ou d’un règlement intérieur.</p><p>À ce titre elle insiste sur ce qui fait la bonne tenue d’un scrutin à travers 3 axes : ouverture, transparence et neutralité.</p><p>Ouverture car le logiciel est libre. Transparence des pratiques et reconnaissance des limitations existantes. Neutralité par déontologie, en tant que prestataire technique d’hébergement tel que défini par la loi sur la confiance en l’économie numérique (LCEN).</p>
<h3>Ouverture</h3><p><b>GvoT</b> est un logiciel libre : sous licence <a href="https://forge.cliss21.org/cliss21/gvot/src/branch/master/LICENSE">GNU Affero GPL</a>. Une disposition spéciale de cette licence est que tout utilisateur⋅ice du logiciel est en droit d’obtenir une copie de son code source avec les permissions usuelles du logiciel libre (droits d’usage, d’étude, de modification, de redistribution).</p><p>Le code du logiciel est disponible sur la <a href="https://forge.cliss21.org/cliss21/gvot">forge de Cliss XXI</a> .</p><p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ce que le code utilisé pour le vote soit celui publié et librement auditable par ailleurs.</p><p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ce que l’accès aux données du vote NE SOIT accessible à aucune autre application que la présente plateforme hébergée ainsi que le socle technique qui la porte.</p><p>La procédure de vote et d’administration du vote sur le site web devrait être protégée par le chiffrement <b>TLS</b> en vigueur au moment du vote (TLS version 1.2 ou 1.3 au moment du COVID19). Il s’agit d’un standard international recommandé et conforme aux préconisations de l’ANSSI.</p>
<h3>Transparence</h3><p>Un hébergeur de <b>GvoT</b> devrait reconnaître les limites technologiques et déontologiques qui affectent le vote en ligne pour un scrutin à bulletin secret.</p><p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ce que les données du scrutin soient recueillies dans le seul but décrit en introduction du scrutin. En conséquence ces données ainsi que celles recueillies dans le cadre du vote ne seraient pas utilisées à d’autres fins ni transmises à un tiers.</p><p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur en accord avec l’organisateur, à ce que ces données <b>soient détruites</b> une fois le scrutin passé, et dans tous les cas au plus tard un certain nombre de jours après la fin de la tenue du scrutin.</p><p>Dans tous les cas, les participant⋅e⋅s disposent d’un droit d’accès, de modification, de rectification et de suppression des données les concernant (loi « Informatique et Liberté » du 6 janvier 1978).</p><p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ne pas cacher la détection d’un comportement anormal s’il était détecté (piratage, fuite accidentelle d’informations, etc.).</p>
<h3>Neutralité</h3><p>Un hébergeur de <b>GvoT</b> devrait s’engager à une obligation de moyens pour permettre la tenue du scrutin dans les meilleurs conditions.</p><p>Cela implique, de façon non exhaustive à :</p><ul><li>suivre l’expédition des courriels d’annonce,</li><li>veiller à la disponibilité de la plateforme aux heures ouvrées pendant la durée du scrutin,</li><li>répondre aux demandes d’assistance des utilisateur⋅ices.</li></ul><p>Un moyen d’accéder à l’assistance devrait être précisée sur la plateforme de vote ainsi que dans chaque courriel expédié aux participant⋅e⋅s.</p><p>Un hébergeur de <b>GvoT</b> devrait s’engager sur l’honneur à ne procéder à aucune intervention qui soit de nature à biaiser l’issue du scrutin. Les éventuelles interventions se feront uniquement sous la forme d’une assistance avec une éventuelle intervention qui sera strictement proportionnée à la demande de la personne assistée dans le vote.</p><p>En cas d’intervention impliquant les données du scrutin, un journal des interventions devrait être tenu avec soin.</p>

+ 179
- 0
cache/2022/7f62798239c75130d19c030a4c695027/index.html View File

@@ -0,0 +1,179 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Blogging and the heat death of the universe (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://www.robinrendle.com/notes/blogging-and-the-heat-death-of-the-universe/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Blogging and the heat death of the universe</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://www.robinrendle.com/notes/blogging-and-the-heat-death-of-the-universe/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>Here’s a fun thing: the other day <a href="https://twitter.com/m_ott/status/1516136120198836224">Matthias linked</a> to an <a href="https://www.robinrendle.com/essays/new-web-typography/">old essay</a> of mine—please do not read it because <em>yikes</em>—but I noticed that it looks very different now; the layout is busted in a few places, the animations have stopped altogether, and <a href="https://www.typotheque.com/fonts/nocturno">Nocturno</a> has been replaced with sturdy, reliable, good-ol’ Georgia.</p>
<p>What happened here?</p>
<p>Well, some things were lost in the shuffle from one build process to another but these regressions also happened because I was using a lot of third party scripts and, dearest of readers, <a href="https://css-tricks.com/aint-no-party-like-a-third-party/">you should avoid them altogether</a>. It wasn’t until a few years ago that I started to bundle all of my essays up into pure HTML. Inject the CSS into them, save it as a .html file, and make sure that even if I change build processes nothing can ever really break (like there’s no dependencies on some weird markdown plugin only available through the Liquid templating language or some such thing I’ll forget in 5 years).</p>
<p>The way that this essay has slowly regressed over the years isn’t something I lament though. Sure, it’s a bit embarrassing maybe, but it’s also a sign of something important: all websites want to be HTML. Regardless of all the complexity, the kick-flip JavaScript you write, or the fancy fonts you throw in there, eventually all that stuff will fade away.</p>
<p>Eventually, if we’re lucky, only the HTML will be left.</p>
<p>The lesson here (I think) is that this is the fate of all websites. If it’s not link rot that gets you then it’s this heat death of the universe problem with entropy setting in slowly over time. And the only way to really defend against it is to build things progressively, to make sure that you’re not tied to one dependency or another. That complex build process? That’s a dependency. Your third party link to some third party font service that depends on their servers running forever? Another dependency.</p>
<p>Thankfully, because of the way the web was built, these dependencies don’t have to end up in absolute failure. Like, the fact that a website I made back in 2016 still exists at all is a complete wonder. But it’s also kinda funny to me that the thing that lasts longest with our websites is probably the part that we spend the least time thinking about—the markup. We spend so long on the animations and the cool grid CSS layout and ultimately all that will slip away (unless you are extremely careful about how you build your website which, dearest of readers, you are absolutely not ever careful enough).</p>
<p>This is the second law of thermodynamics made clear on the web: the entropy of any isolated system always increases and, at some point or another, all that’s left of a website is the markup.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 5
- 0
cache/2022/7f62798239c75130d19c030a4c695027/index.md View File

@@ -0,0 +1,5 @@
title: Blogging and the heat death of the universe
url: https://www.robinrendle.com/notes/blogging-and-the-heat-death-of-the-universe/
hash_url: 7f62798239c75130d19c030a4c695027

<p>Here’s a fun thing: the other day <a href="https://twitter.com/m_ott/status/1516136120198836224">Matthias linked</a> to an <a href="https://www.robinrendle.com/essays/new-web-typography/">old essay</a> of mine—please do not read it because <em>yikes</em>—but I noticed that it looks very different now; the layout is busted in a few places, the animations have stopped altogether, and <a href="https://www.typotheque.com/fonts/nocturno">Nocturno</a> has been replaced with sturdy, reliable, good-ol’ Georgia.</p><p>What happened here?</p><p>Well, some things were lost in the shuffle from one build process to another but these regressions also happened because I was using a lot of third party scripts and, dearest of readers, <a href="https://css-tricks.com/aint-no-party-like-a-third-party/">you should avoid them altogether</a>. It wasn’t until a few years ago that I started to bundle all of my essays up into pure HTML. Inject the CSS into them, save it as a .html file, and make sure that even if I change build processes nothing can ever really break (like there’s no dependencies on some weird markdown plugin only available through the Liquid templating language or some such thing I’ll forget in 5 years).</p><p>The way that this essay has slowly regressed over the years isn’t something I lament though. Sure, it’s a bit embarrassing maybe, but it’s also a sign of something important: all websites want to be HTML. Regardless of all the complexity, the kick-flip JavaScript you write, or the fancy fonts you throw in there, eventually all that stuff will fade away.</p><p>Eventually, if we’re lucky, only the HTML will be left.</p><p>The lesson here (I think) is that this is the fate of all websites. If it’s not link rot that gets you then it’s this heat death of the universe problem with entropy setting in slowly over time. And the only way to really defend against it is to build things progressively, to make sure that you’re not tied to one dependency or another. That complex build process? That’s a dependency. Your third party link to some third party font service that depends on their servers running forever? Another dependency.</p><p>Thankfully, because of the way the web was built, these dependencies don’t have to end up in absolute failure. Like, the fact that a website I made back in 2016 still exists at all is a complete wonder. But it’s also kinda funny to me that the thing that lasts longest with our websites is probably the part that we spend the least time thinking about—the markup. We spend so long on the animations and the cool grid CSS layout and ultimately all that will slip away (unless you are extremely careful about how you build your website which, dearest of readers, you are absolutely not ever careful enough).</p><p>This is the second law of thermodynamics made clear on the web: the entropy of any isolated system always increases and, at some point or another, all that’s left of a website is the markup.</p>

+ 205
- 0
cache/2022/ce44e844633f17f25d53f44c1ebd35e7/index.html View File

@@ -0,0 +1,205 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Add Responsive-Friendly Enhancements to `details` with `details-utils`-zachleat.com (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://www.zachleat.com/web/details-utils/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Add Responsive-Friendly Enhancements to `details` with `details-utils`-zachleat.com</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://www.zachleat.com/web/details-utils/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>I use <code>&lt;details&gt;</code>. I use <code>&lt;details&gt;</code> a lot. It is one of my favorite HTML elements.</p>
<p>Over time I’ve collected a bunch of add-on utilities to enhance <code>&lt;details&gt;</code> with new features and functionality. They’ve been super useful in <em>a bunch</em> of long-standing production implementations at Netlify:</p>
<p>I’ve decided to finally package those <code>&lt;details&gt;</code> helpers up and formally release them as a web component!</p>
<h2 id="lessdetails-utilsgreater" tabindex="-1"><code>&lt;details-utils&gt;</code> <a class="direct-link" href="#lessdetails-utilsgreater" aria-hidden="true">#</a></h2>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br> <br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<p>At time of writing, this web component adds five new responsive-friendly enhancements to one or more <code>&lt;details&gt;</code> elements nestled inside:</p>
<ul><li>Force open/closed</li><li>Click outside to close</li><li>Close on <code>esc</code></li><li>Animate open/closed</li><li>Toggle root element <code>class</code></li></ul>
<h3 id="force-openclosed" tabindex="-1">Force open/closed <a class="direct-link" href="#force-openclosed" aria-hidden="true">#</a></h3>
<p>In this example, the <code>&lt;details&gt;</code> is forced open when viewport is wider than <code>48em</code>.</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">force-open</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>(min-width: 48em)<span class="token punctuation">"</span></span> <span class="token attr-name">force-restore</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span> <span class="token attr-name">open</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<p>I’ve gotten <em>a lot</em> of mileage out of the above example, specifically to drive navigation that is always visible at a certain breakpoint (think a collapsible menu at small viewport versus sidebar, e.g. <a href="https://www.11ty.dev/docs/"><code>11ty.dev/docs/</code></a>).</p>
<p>Alternatively, <code>force-close</code> is also available. The optional <code>force-restore</code> attribute will restore previous state when the <code>force-open</code> or <code>force-close</code> media queries do not match.</p>
<p>The media query is optional, and using it as a bare attribute allows control of the state pre and post JavaScript.</p>
<pre class="language-html"><code class="language-html"><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">force-open</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span><br><br><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">force-close</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span> <span class="token attr-name">open</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<h3 id="click-outside-to-close" tabindex="-1">Click outside to close <a class="direct-link" href="#click-outside-to-close" aria-hidden="true">#</a></h3>
<p>If you click anywhere on the document (outside of the <code>&lt;details&gt;</code> content), the <code>&lt;details&gt;</code> will be closed. This is useful when you want to absolutely position the <code>&lt;details&gt;</code> content (maybe to make a little custom dropdown 😱)</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-click-outside</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<p>You can scope this with a media query as well:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-click-outside</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>(min-width: 48em)<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<p>Add your own bonus close button inside of the content (to complement <code>&lt;summary&gt;</code>):</p>
<pre class="language-css"><code class="language-css"><br><span class="token selector">details-utils:not(:defined) [data-du-close-click]</span> <span class="token punctuation">{</span><br> <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span><br><span class="token punctuation">}</span></code></pre>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-click-outside</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>my-details<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>summary</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>summary</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>button<span class="token punctuation">"</span></span> <span class="token attr-name">aria-controls</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>my-details<span class="token punctuation">"</span></span> <span class="token attr-name">data-du-close-click</span><span class="token punctuation">&gt;</span></span>Close<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<h3 id="close-on-esc" tabindex="-1">Close on <code>esc</code> <a class="direct-link" href="#close-on-esc" aria-hidden="true">#</a></h3>
<p>Closes the <code>&lt;details&gt;</code> when the <code>esc</code> key is hit on the keyboard. Media query is optional.</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-esc</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>(max-width: 767px)<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<h3 id="animate-openclose" tabindex="-1">Animate open/close <a class="direct-link" href="#animate-openclose" aria-hidden="true">#</a></h3>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">animate</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<p>Animates the height of the content when opening and closing the <code>&lt;details&gt;</code>. Ignored automatically if <code>(prefers-reduced-motion)</code> is detected.</p>
<p>Just a full disclosure, the configuration around this one is pretty limited (re: easing and timing). Also this doesn’t support media query scoping yet (not for any technical reason, just haven’t run into this use case yet). Open to contributions here!</p>
<h3 id="toggle-class-on-root-element" tabindex="-1">Toggle <code>class</code> on root element <a class="direct-link" href="#toggle-class-on-root-element" aria-hidden="true">#</a></h3>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">toggle-document-class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>my-class-name<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<p>Adds a <code>class</code> to your <code>&lt;html&gt;</code> element when the <code>&lt;details&gt;</code> is open and removes it when the <code>&lt;details&gt;</code> is closed.</p>
<h2 id="enjoy!" tabindex="-1">Enjoy! <a class="direct-link" href="#enjoy!" aria-hidden="true">#</a></h2>
<p>Wiring up and combining each of these enhancements to <code>&lt;details&gt;</code> really can go a long way in building a lot of complex user interface elements in a pretty straightforward way. In my humble opinion, the super long list of things I’ve built using this is proof of that. I hope you can get some useful mileage out of them too!</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 10
- 0
cache/2022/ce44e844633f17f25d53f44c1ebd35e7/index.md View File

@@ -0,0 +1,10 @@
title: Add Responsive-Friendly Enhancements to `details` with `details-utils`-zachleat.com
url: https://www.zachleat.com/web/details-utils/
hash_url: ce44e844633f17f25d53f44c1ebd35e7

<p>I use <code>&lt;details&gt;</code>. I use <code>&lt;details&gt;</code> a lot. It is one of my favorite HTML elements.</p><p>Over time I’ve collected a bunch of add-on utilities to enhance <code>&lt;details&gt;</code> with new features and functionality. They’ve been super useful in <em>a bunch</em> of long-standing production implementations at Netlify:</p><p>I’ve decided to finally package those <code>&lt;details&gt;</code> helpers up and formally release them as a web component!</p><h2 id="lessdetails-utilsgreater" tabindex="-1"><code>&lt;details-utils&gt;</code> <a class="direct-link" href="#lessdetails-utilsgreater" aria-hidden="true">#</a></h2><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br> <br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre><p>At time of writing, this web component adds five new responsive-friendly enhancements to one or more <code>&lt;details&gt;</code> elements nestled inside:</p><ul><li>Force open/closed</li><li>Click outside to close</li><li>Close on <code>esc</code></li><li>Animate open/closed</li><li>Toggle root element <code>class</code></li></ul>
<h3 id="force-openclosed" tabindex="-1">Force open/closed <a class="direct-link" href="#force-openclosed" aria-hidden="true">#</a></h3><p>In this example, the <code>&lt;details&gt;</code> is forced open when viewport is wider than <code>48em</code>.</p><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">force-open</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>(min-width: 48em)<span class="token punctuation">"</span></span> <span class="token attr-name">force-restore</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span> <span class="token attr-name">open</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre><p>I’ve gotten <em>a lot</em> of mileage out of the above example, specifically to drive navigation that is always visible at a certain breakpoint (think a collapsible menu at small viewport versus sidebar, e.g. <a href="https://www.11ty.dev/docs/"><code>11ty.dev/docs/</code></a>).</p><p>Alternatively, <code>force-close</code> is also available. The optional <code>force-restore</code> attribute will restore previous state when the <code>force-open</code> or <code>force-close</code> media queries do not match.</p><p>The media query is optional, and using it as a bare attribute allows control of the state pre and post JavaScript.</p><pre class="language-html"><code class="language-html"><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">force-open</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span><br><br><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">force-close</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span> <span class="token attr-name">open</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<h3 id="click-outside-to-close" tabindex="-1">Click outside to close <a class="direct-link" href="#click-outside-to-close" aria-hidden="true">#</a></h3><p>If you click anywhere on the document (outside of the <code>&lt;details&gt;</code> content), the <code>&lt;details&gt;</code> will be closed. This is useful when you want to absolutely position the <code>&lt;details&gt;</code> content (maybe to make a little custom dropdown 😱)</p><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-click-outside</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre><p>You can scope this with a media query as well:</p><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-click-outside</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>(min-width: 48em)<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre><p>Add your own bonus close button inside of the content (to complement <code>&lt;summary&gt;</code>):</p><pre class="language-css"><code class="language-css"><br><span class="token selector">details-utils:not(:defined) [data-du-close-click]</span> <span class="token punctuation">{</span><br> <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span><br><span class="token punctuation">}</span></code></pre><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-click-outside</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>my-details<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>summary</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>summary</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>button<span class="token punctuation">"</span></span> <span class="token attr-name">aria-controls</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>my-details<span class="token punctuation">"</span></span> <span class="token attr-name">data-du-close-click</span><span class="token punctuation">&gt;</span></span>Close<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<h3 id="close-on-esc" tabindex="-1">Close on <code>esc</code> <a class="direct-link" href="#close-on-esc" aria-hidden="true">#</a></h3><p>Closes the <code>&lt;details&gt;</code> when the <code>esc</code> key is hit on the keyboard. Media query is optional.</p><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">close-esc</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>(max-width: 767px)<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre>
<h3 id="animate-openclose" tabindex="-1">Animate open/close <a class="direct-link" href="#animate-openclose" aria-hidden="true">#</a></h3><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">animate</span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre><p>Animates the height of the content when opening and closing the <code>&lt;details&gt;</code>. Ignored automatically if <code>(prefers-reduced-motion)</code> is detected.</p><p>Just a full disclosure, the configuration around this one is pretty limited (re: easing and timing). Also this doesn’t support media query scoping yet (not for any technical reason, just haven’t run into this use case yet). Open to contributions here!</p>
<h3 id="toggle-class-on-root-element" tabindex="-1">Toggle <code>class</code> on root element <a class="direct-link" href="#toggle-class-on-root-element" aria-hidden="true">#</a></h3><pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details-utils</span> <span class="token attr-name">toggle-document-class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>my-class-name<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><br> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>details</span><span class="token punctuation">&gt;</span></span>…<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details</span><span class="token punctuation">&gt;</span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>details-utils</span><span class="token punctuation">&gt;</span></span></code></pre><p>Adds a <code>class</code> to your <code>&lt;html&gt;</code> element when the <code>&lt;details&gt;</code> is open and removes it when the <code>&lt;details&gt;</code> is closed.</p><h2 id="enjoy!" tabindex="-1">Enjoy! <a class="direct-link" href="#enjoy!" aria-hidden="true">#</a></h2><p>Wiring up and combining each of these enhancements to <code>&lt;details&gt;</code> really can go a long way in building a lot of complex user interface elements in a pretty straightforward way. In my humble opinion, the super long list of things I’ve built using this is proof of that. I hope you can get some useful mileage out of them too!</p>

+ 184
- 0
cache/2022/ce69309198dcbdbcb1d5ff9f784c4925/index.html View File

@@ -0,0 +1,184 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>bearing witness (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://winnielim.org/journal/bearing-witness/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>bearing witness</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://winnielim.org/journal/bearing-witness/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>Everyone is trying to move on with life declaring the pandemic is over, while a conservative estimate of 10% of the world’s infected population will face potential lifelong complications of the virus. I guess there is not much of a choice. No matter how much suffering there is and how many tragedies we face – pandemic or not – we can only try to move forward. This sort of moving forward can only be possible with some magical thinking mixed with denialism, and a lot of looking away. Maybe the difference is that I <em>know</em> I am looking away.</p>

<p>I’ve been entertaining thoughts of wearing a n95 mask with goggles to get on a plane so we can travel. Yet I know I will not be able to forgive myself if my partner happens to be one of the unlucky 10%. Who knows? Do we want to play this russian roulette? I feel very envious browsing through the instagram stories of friends who are overseas right now. But I have no courage to do the same. Maybe the way I approach life has been forever tainted by my chronic illness. I remember I was in my 20s the first time Singapore had SARs, and I didn’t give a shit. Oh, the ignorant blissfulness of my youth, the unwarranted confidence in my body back then.</p>

<p>I personally believe the world will face some sort of collapse, if not multiple collapses in my lifetime. I don’t think I’ll suffer the brunt of climate change, but I’ll suffer the brunt of the many events that are already occurring because of climate change. Looking at how we responded to the virus I am not optimistic at all. Nobody wants to believe or know that things will be bad, so we’ll all try to live life as normally as possible, whatever normal means. Prevention is better than cure, but prevention is also a lot of hard work. </p>

<p>Unlike my younger self I don’t blame people for wanting to stay in their made-belief Disneyland while fire is burning outside. Even without all the issues we face, life is inherently difficult. I think we have limited emotional and psychological capacity. We’re like puppies, we just want to run around, smell the wind and have some fun along the way. We wish to love and be loved. Not crank for exams, tire our bodies out, exhaust our brains – just so we can pay bills and look good to each other – over and over again. But to survive we have to pay bills, and to pay bills we have to crank for exams, manage our parents, children, colleagues, clients, bosses, our unhinged psyches, our suffering bodies. On top of that we have to care about justice, the environment, politics, violence, society. I too, want to retreat into my own Disneyland.</p>

<p>I am one of those people who will write posts like this over and over again and offer no solutions. I can barely cope with my existence prior to this. I just want to lie on the sofa, sip my coffee and read a book. Not live through a million guilt trips of how much more I should have done as a human being or a thousand nightmares of getting long-term disabling illnesses. </p>

<p>I will continue to record these observations and feelings. Maybe I’m only good writing down these convoluted words so I can bear witness – to the world and her people, to myself and my hypocritical feelings. I will look away, but first I’ll acknowledge. </p>

<p>Meanwhile I’ll still try to savour whatever’s left of the world’s goodness: books, music, art, cooking, films, love, in the sanctuary of my own make-belief Disneyland. </p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 17
- 0
cache/2022/ce69309198dcbdbcb1d5ff9f784c4925/index.md View File

@@ -0,0 +1,17 @@
title: bearing witness
url: https://winnielim.org/journal/bearing-witness/
hash_url: ce69309198dcbdbcb1d5ff9f784c4925

<p>Everyone is trying to move on with life declaring the pandemic is over, while a conservative estimate of 10% of the world’s infected population will face potential lifelong complications of the virus. I guess there is not much of a choice. No matter how much suffering there is and how many tragedies we face – pandemic or not – we can only try to move forward. This sort of moving forward can only be possible with some magical thinking mixed with denialism, and a lot of looking away. Maybe the difference is that I <em>know</em> I am looking away.</p>

<p>I’ve been entertaining thoughts of wearing a n95 mask with goggles to get on a plane so we can travel. Yet I know I will not be able to forgive myself if my partner happens to be one of the unlucky 10%. Who knows? Do we want to play this russian roulette? I feel very envious browsing through the instagram stories of friends who are overseas right now. But I have no courage to do the same. Maybe the way I approach life has been forever tainted by my chronic illness. I remember I was in my 20s the first time Singapore had SARs, and I didn’t give a shit. Oh, the ignorant blissfulness of my youth, the unwarranted confidence in my body back then.</p>

<p>I personally believe the world will face some sort of collapse, if not multiple collapses in my lifetime. I don’t think I’ll suffer the brunt of climate change, but I’ll suffer the brunt of the many events that are already occurring because of climate change. Looking at how we responded to the virus I am not optimistic at all. Nobody wants to believe or know that things will be bad, so we’ll all try to live life as normally as possible, whatever normal means. Prevention is better than cure, but prevention is also a lot of hard work. </p>

<p>Unlike my younger self I don’t blame people for wanting to stay in their made-belief Disneyland while fire is burning outside. Even without all the issues we face, life is inherently difficult. I think we have limited emotional and psychological capacity. We’re like puppies, we just want to run around, smell the wind and have some fun along the way. We wish to love and be loved. Not crank for exams, tire our bodies out, exhaust our brains – just so we can pay bills and look good to each other – over and over again. But to survive we have to pay bills, and to pay bills we have to crank for exams, manage our parents, children, colleagues, clients, bosses, our unhinged psyches, our suffering bodies. On top of that we have to care about justice, the environment, politics, violence, society. I too, want to retreat into my own Disneyland.</p>

<p>I am one of those people who will write posts like this over and over again and offer no solutions. I can barely cope with my existence prior to this. I just want to lie on the sofa, sip my coffee and read a book. Not live through a million guilt trips of how much more I should have done as a human being or a thousand nightmares of getting long-term disabling illnesses. </p>

<p>I will continue to record these observations and feelings. Maybe I’m only good writing down these convoluted words so I can bear witness – to the world and her people, to myself and my hypocritical feelings. I will look away, but first I’ll acknowledge. </p>

<p>Meanwhile I’ll still try to savour whatever’s left of the world’s goodness: books, music, art, cooking, films, love, in the sanctuary of my own make-belief Disneyland. </p>

+ 208
- 0
cache/2022/f761b745c18906fa98046badd51231c2/index.html View File

@@ -0,0 +1,208 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>(Why) Some HTML is "optional" (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://remysharp.com/2019/09/12/why-some-html-is-optional">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>(Why) Some HTML is "optional"</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://remysharp.com/2019/09/12/why-some-html-is-optional" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>Chris Coyier <a href="https://css-tricks.com/some-html-is-optional/">blogged recently on <em>weird looking HTML</em></a>. It's a nice short post and I'd say it's worth knowing these optional features (potentially known as defaults). My favourite optional is <code>&lt;script&gt;</code> and not having to include the <code>type</code> attribute.</p>
<p>But Chris' first example is the most common, the optional closing <code>&lt;/p&gt;</code> tag. What (I think) is an interesting question is: <em>why?</em></p>
<p><a class="cta" rel="nofollow" href="https://training.leftlogic.com/buy/terminal/cli2?coupon=BLOG&amp;utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=remysharp-discount"><img src="/images/terminal-600.jpg">
<br />
<div>
<p><span class="label">READER DISCOUNT</span><strong>Save $50 on terminal.training</strong></p>
<p class="desc">I've published 38 videos for new developers, designers, UX, UI, product owners and anyone who needs to conquer the command line today.</p>
<p><strong><span class="like-link">$49 - only from this link</span></strong></p>
</div></p>
<p></a></p>
<h2>The easy answer</h2>
<p>HTML has an amazing quality: it's super-dooper backwards compatible. It's why we have HTML5 and not XHTML2.</p>
<p>This backward compatibility means that devices and browsers reaching all the way back to the very first browser are still able to render HTML (just about - the <em>first</em> makes a bit of mess of unknown elements but that's more of an exception).</p>
<p>So if you ever find yourself asking <em>why</em>, the answer will nearly always lay in the past and original functionality.</p>
<p>This same reasoning also explains why you'll never find a newly introduced element to go inside the <code>&lt;head&gt;</code> element - but I'll leave that for <span title="Remy hereby challenges Jeremy Keith">someone else</span> to blog about…</p>
<h2>Performance and optimisation?</h2>
<p>Without looking at modern day browsers' HTML parsing algorithms, I'm guessing the perf cost is incredibly minute. So minute that it makes no difference that we mortal users could experience.</p>
<p>Compression is really a moot point too, it's a micro optimisation that <em>may</em> save a byte or two, but because of how repeating sequences are compressed, a closing <code>&lt;/p&gt;</code> won't have an impact.</p>
<p>But, what exactly about this <code>&lt;p&gt;</code> tag?</p>
<h2>Back to 1989</h2>
<p>Pre-DOM, pre-browsers, the world's first browser was being written by Sir Tim Berners-Lee.</p>
<p>There was no reference implementation and certainly no such thing as a parsing specification.</p>
<p>The first browser, the <a href="https://worldwideweb.cern.ch">WorldWideWeb.app</a>, parsed HTML character by character applying styles as it went along. As opposed to today's methods whereby a document object model is built up, then rendered.</p>
<p>I happened to be lucky enough to be sat next to <a href="https://www.kimberlyblessing.com/">Kimberly Blessing</a> when they unearthed the parsing algorithm for the <code>&lt;p&gt;</code> tag.</p>
<p>In fact, Chris' earlier example of paragraph text should be reformatted to truly see how the paragraph was intended to be used:</p>
<pre><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>P</span><span class="token punctuation">&gt;</span></span>
Paragraph one.
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>P</span><span class="token punctuation">&gt;</span></span>
Paragraph two.
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>P</span><span class="token punctuation">&gt;</span></span>
Paragraph three.
</code></pre>
<p>The paragraph tag (yes, in upper case) was intended to <em>separate</em> paragraphs, not wrap them.</p>
<p>Which is why you don't need a closing tag, to support this original use and support existing documents around the web.</p>
<p>Here's a photo I took of Kimberly's screen showing the source:</p>
<p><img src="/images/p-tag.jpg" alt="paragraph formatting"></p>
<p>Pretty geeky, and for some reason, I love these historical details.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 39
- 0
cache/2022/f761b745c18906fa98046badd51231c2/index.md View File

@@ -0,0 +1,39 @@
title: (Why) Some HTML is "optional"
url: https://remysharp.com/2019/09/12/why-some-html-is-optional
hash_url: f761b745c18906fa98046badd51231c2

<p>Chris Coyier <a href="https://css-tricks.com/some-html-is-optional/">blogged recently on <em>weird looking HTML</em></a>. It's a nice short post and I'd say it's worth knowing these optional features (potentially known as defaults). My favourite optional is <code>&lt;script&gt;</code> and not having to include the <code>type</code> attribute.</p>
<p>But Chris' first example is the most common, the optional closing <code>&lt;/p&gt;</code> tag. What (I think) is an interesting question is: <em>why?</em></p>
<a class="cta" rel="nofollow" href="https://training.leftlogic.com/buy/terminal/cli2?coupon=BLOG&amp;utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=remysharp-discount"><img src="/images/terminal-600.jpg">
<div>
<p><span class="label">READER DISCOUNT</span><strong>Save $50 on terminal.training</strong></p>
<p class="desc">I've published 38 videos for new developers, designers, UX, UI, product owners and anyone who needs to conquer the command line today.</p>
<p><strong><span class="like-link">$49 - only from this link</span></strong></p>
</div></a>
<h2>The easy answer</h2>
<p>HTML has an amazing quality: it's super-dooper backwards compatible. It's why we have HTML5 and not XHTML2.</p>
<p>This backward compatibility means that devices and browsers reaching all the way back to the very first browser are still able to render HTML (just about - the <em>first</em> makes a bit of mess of unknown elements but that's more of an exception).</p>
<p>So if you ever find yourself asking <em>why</em>, the answer will nearly always lay in the past and original functionality.</p>
<p>This same reasoning also explains why you'll never find a newly introduced element to go inside the <code>&lt;head&gt;</code> element - but I'll leave that for <span title="Remy hereby challenges Jeremy Keith">someone else</span> to blog about…</p>
<h2>Performance and optimisation?</h2>
<p>Without looking at modern day browsers' HTML parsing algorithms, I'm guessing the perf cost is incredibly minute. So minute that it makes no difference that we mortal users could experience.</p>
<p>Compression is really a moot point too, it's a micro optimisation that <em>may</em> save a byte or two, but because of how repeating sequences are compressed, a closing <code>&lt;/p&gt;</code> won't have an impact.</p>
<p>But, what exactly about this <code>&lt;p&gt;</code> tag?</p>
<h2>Back to 1989</h2>
<p>Pre-DOM, pre-browsers, the world's first browser was being written by Sir Tim Berners-Lee.</p>
<p>There was no reference implementation and certainly no such thing as a parsing specification.</p>
<p>The first browser, the <a href="https://worldwideweb.cern.ch">WorldWideWeb.app</a>, parsed HTML character by character applying styles as it went along. As opposed to today's methods whereby a document object model is built up, then rendered.</p>
<p>I happened to be lucky enough to be sat next to <a href="https://www.kimberlyblessing.com/">Kimberly Blessing</a> when they unearthed the parsing algorithm for the <code>&lt;p&gt;</code> tag.</p>
<p>In fact, Chris' earlier example of paragraph text should be reformatted to truly see how the paragraph was intended to be used:</p>
<pre><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>P</span><span class="token punctuation">&gt;</span></span>
Paragraph one.
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>P</span><span class="token punctuation">&gt;</span></span>
Paragraph two.
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>P</span><span class="token punctuation">&gt;</span></span>
Paragraph three.
</code></pre>
<p>The paragraph tag (yes, in upper case) was intended to <em>separate</em> paragraphs, not wrap them.</p>
<p>Which is why you don't need a closing tag, to support this original use and support existing documents around the web.</p>
<p>Here's a photo I took of Kimberly's screen showing the source:</p>
<p><img src="/images/p-tag.jpg" alt="paragraph formatting"></p>
<p>Pretty geeky, and for some reason, I love these historical details.</p>

+ 28
- 0
cache/2022/index.html View File

@@ -75,6 +75,8 @@
<li><a href="/david/cache/2022/a863c20d0cb9722df74219009e8365a3/" title="Accès à l’article dans le cache local : Jakarta’s Transit Miracle">Jakarta’s Transit Miracle</a> (<a href="https://infiniteblock.substack.com/p/jakartas-transit-miracle" title="Accès à l’article original distant : Jakarta’s Transit Miracle">original</a>)</li>
<li><a href="/david/cache/2022/6a8fadb032ab4c1951319268a1315655/" title="Accès à l’article dans le cache local : Commentaire Hacker News sur Next Gen Static Blogging">Commentaire Hacker News sur Next Gen Static Blogging</a> (<a href="https://news.ycombinator.com/item?id=25701053" title="Accès à l’article original distant : Commentaire Hacker News sur Next Gen Static Blogging">original</a>)</li>
<li><a href="/david/cache/2022/389205e96cefd5e4633c70f22d029e1b/" title="Accès à l’article dans le cache local : Un hacker pirate le vol d'un avion depuis un siège passager">Un hacker pirate le vol d'un avion depuis un siège passager</a> (<a href="https://www.silicon.fr/hacker-modifie-vol-dun-avion-systeme-de-divertissement-116431.html" title="Accès à l’article original distant : Un hacker pirate le vol d'un avion depuis un siège passager">original</a>)</li>
<li><a href="/david/cache/2022/10bfffb87f475e23c0dd0a30527b9750/" title="Accès à l’article dans le cache local : How a Wikipedia volunteer editor became a very vocal Web3 critic">How a Wikipedia volunteer editor became a very vocal Web3 critic</a> (<a href="https://www.fastcompany.com/90733574/how-a-wikipedia-engineer-became-one-of-the-loudest-web3-skeptics" title="Accès à l’article original distant : How a Wikipedia volunteer editor became a very vocal Web3 critic">original</a>)</li>
@@ -93,10 +95,16 @@
<li><a href="/david/cache/2022/0dc625e86fb8e680308250b1245f1086/" title="Accès à l’article dans le cache local : What makes writing more readable?">What makes writing more readable?</a> (<a href="https://pudding.cool/2022/02/plain/" title="Accès à l’article original distant : What makes writing more readable?">original</a>)</li>
<li><a href="/david/cache/2022/72b4d15d286c2df85aba5742b1d98e62/" title="Accès à l’article dans le cache local : Web Components as Progressive Enhancement">Web Components as Progressive Enhancement</a> (<a href="https://cloudfour.com/thinks/web-components-as-progressive-enhancement/" title="Accès à l’article original distant : Web Components as Progressive Enhancement">original</a>)</li>
<li><a href="/david/cache/2022/0a53d8dedc371884d16f45bcb349b418/" title="Accès à l’article dans le cache local : BALLAST • QUE FAIRE ?">BALLAST • QUE FAIRE ?</a> (<a href="https://www.revue-ballast.fr/que-faire/" title="Accès à l’article original distant : BALLAST • QUE FAIRE ?">original</a>)</li>
<li><a href="/david/cache/2022/ce69309198dcbdbcb1d5ff9f784c4925/" title="Accès à l’article dans le cache local : bearing witness">bearing witness</a> (<a href="https://winnielim.org/journal/bearing-witness/" title="Accès à l’article original distant : bearing witness">original</a>)</li>
<li><a href="/david/cache/2022/d97914db7d2e525edc27669adbc0f917/" title="Accès à l’article dans le cache local : A Tiny, Static, Full-Text Search Engine using Rust and WebAssembly">A Tiny, Static, Full-Text Search Engine using Rust and WebAssembly</a> (<a href="https://endler.dev/2019/tinysearch/" title="Accès à l’article original distant : A Tiny, Static, Full-Text Search Engine using Rust and WebAssembly">original</a>)</li>
<li><a href="/david/cache/2022/34e73243a6ed7e36a8348b98ea79e52b/" title="Accès à l’article dans le cache local : Du concept de « fracture(s) numérique(s) » à celui de capital numérique ?">Du concept de « fracture(s) numérique(s) » à celui de capital numérique ?</a> (<a href="https://louisderrac.com/2020/11/19/du-concept-de-fractures-numeriques-a-celui-de-capital-numerique/" title="Accès à l’article original distant : Du concept de « fracture(s) numérique(s) » à celui de capital numérique ?">original</a>)</li>
<li><a href="/david/cache/2022/65e0c481f692260299c53e9713339f53/" title="Accès à l’article dans le cache local : Ce dont nous avons (vraiment) besoin">Ce dont nous avons (vraiment) besoin</a> (<a href="https://www.monde-diplomatique.fr/2017/02/KEUCHEYAN/57134" title="Accès à l’article original distant : Ce dont nous avons (vraiment) besoin">original</a>)</li>
<li><a href="/david/cache/2022/66d9d4be64db7fe8324a4fdcbf3ef705/" title="Accès à l’article dans le cache local : Hope for the Future">Hope for the Future</a> (<a href="https://hackeducation.com/2022/03/08/hope" title="Accès à l’article original distant : Hope for the Future">original</a>)</li>
@@ -145,6 +153,8 @@
<li><a href="/david/cache/2022/2f3ed5cb927427fb834b4a9d657592be/" title="Accès à l’article dans le cache local : Ajout d’un module de recherche pour Hugo">Ajout d’un module de recherche pour Hugo</a> (<a href="https://lord.re/posts/206-recherche-pour-un-blog-statique/" title="Accès à l’article original distant : Ajout d’un module de recherche pour Hugo">original</a>)</li>
<li><a href="/david/cache/2022/2458bbc9f86af47ffffcd1b99f19743a/" title="Accès à l’article dans le cache local : Next Gen Static Blogging">Next Gen Static Blogging</a> (<a href="https://inoads.com/articles/2021-01-09-Next-Gen-Static-Blogging" title="Accès à l’article original distant : Next Gen Static Blogging">original</a>)</li>
<li><a href="/david/cache/2022/0d024905896d89f8bd499e2a6170b59e/" title="Accès à l’article dans le cache local : What’s Really Going On Inside Your node_modules Folder?">What’s Really Going On Inside Your node_modules Folder?</a> (<a href="https://socket.dev/blog/inside-node-modules" title="Accès à l’article original distant : What’s Really Going On Inside Your node_modules Folder?">original</a>)</li>
<li><a href="/david/cache/2022/bfc65237a09e49939b31ba887d7e3fc8/" title="Accès à l’article dans le cache local : Open-source - Open Time">Open-source - Open Time</a> (<a href="https://open-time.net/post/2022/03/23/Open-source" title="Accès à l’article original distant : Open-source - Open Time">original</a>)</li>
@@ -155,8 +165,14 @@
<li><a href="/david/cache/2022/0c0894907925eae954987d98c9e8136b/" title="Accès à l’article dans le cache local : Why I Quit Tech and Became a Therapist">Why I Quit Tech and Became a Therapist</a> (<a href="http://glench.com/WhyIQuitTechAndBecameATherapist/" title="Accès à l’article original distant : Why I Quit Tech and Became a Therapist">original</a>)</li>
<li><a href="/david/cache/2022/ce44e844633f17f25d53f44c1ebd35e7/" title="Accès à l’article dans le cache local : Add Responsive-Friendly Enhancements to `details` with `details-utils`-zachleat.com">Add Responsive-Friendly Enhancements to `details` with `details-utils`-zachleat.com</a> (<a href="https://www.zachleat.com/web/details-utils/" title="Accès à l’article original distant : Add Responsive-Friendly Enhancements to `details` with `details-utils`-zachleat.com">original</a>)</li>
<li><a href="/david/cache/2022/0195a7767c46de6bc21bb35b542911a6/" title="Accès à l’article dans le cache local : Un homme peut-il être un conjoint violent malgré lui ?">Un homme peut-il être un conjoint violent malgré lui ?</a> (<a href="https://centre-bertha-pappenheim.fr/2021/10/20/un-homme-peut-il-etre-un-conjoint-violent-malgre-lui/" title="Accès à l’article original distant : Un homme peut-il être un conjoint violent malgré lui ?">original</a>)</li>
<li><a href="/david/cache/2022/5eb0016b355ac4b358be367fe64f4c84/" title="Accès à l’article dans le cache local : Mourning Loss of a Team Member as a Remote Team">Mourning Loss of a Team Member as a Remote Team</a> (<a href="https://www.sofuckingagile.com/blog/mourning-loss-as-a-remote-team" title="Accès à l’article original distant : Mourning Loss of a Team Member as a Remote Team">original</a>)</li>
<li><a href="/david/cache/2022/7616326c2896e35714a26de5d2898736/" title="Accès à l’article dans le cache local : Considérations générales sur le vote en ligne">Considérations générales sur le vote en ligne</a> (<a href="https://voter.cliss21.org/consid%C3%A9rations-g%C3%A9n%C3%A9rales-sur-le-vote-en-ligne/" title="Accès à l’article original distant : Considérations générales sur le vote en ligne">original</a>)</li>
<li><a href="/david/cache/2022/9094f894455bccf9d9772fd5782ec782/" title="Accès à l’article dans le cache local : Shame. - Dirty Feed">Shame. - Dirty Feed</a> (<a href="http://www.dirtyfeed.org/2022/04/shame/" title="Accès à l’article original distant : Shame. - Dirty Feed">original</a>)</li>
<li><a href="/david/cache/2022/053b5d423df20fa4e7978174d91d41bb/" title="Accès à l’article dans le cache local : Making Gemini Easy">Making Gemini Easy</a> (<a href="https://proxy.vulpes.one/gemini/tilde.team/~tomasino/journal/20211103-making-gemini-easy.gmi" title="Accès à l’article original distant : Making Gemini Easy">original</a>)</li>
@@ -201,6 +217,8 @@
<li><a href="/david/cache/2022/9f2c19796746e6888e309647a49508bb/" title="Accès à l’article dans le cache local : How maps in the media make us more negative about migrants">How maps in the media make us more negative about migrants</a> (<a href="https://thecorrespondent.com/664/how-maps-in-the-media-make-us-more-negative-about-migrants" title="Accès à l’article original distant : How maps in the media make us more negative about migrants">original</a>)</li>
<li><a href="/david/cache/2022/f761b745c18906fa98046badd51231c2/" title="Accès à l’article dans le cache local : (Why) Some HTML is "optional"">(Why) Some HTML is "optional"</a> (<a href="https://remysharp.com/2019/09/12/why-some-html-is-optional" title="Accès à l’article original distant : (Why) Some HTML is "optional"">original</a>)</li>
<li><a href="/david/cache/2022/5fc3445b27f0ee637d66035734c6bea6/" title="Accès à l’article dans le cache local : Aperçu #02 - quaternum.net">Aperçu #02 - quaternum.net</a> (<a href="https://www.quaternum.net/2022/01/15/apercu-02/" title="Accès à l’article original distant : Aperçu #02 - quaternum.net">original</a>)</li>
<li><a href="/david/cache/2022/46d0b4daf67dbeb6a068f921c50076af/" title="Accès à l’article dans le cache local : Du gras - Carnets de routes">Du gras - Carnets de routes</a> (<a href="https://www.carnetsderoutes.me/Du-gras.html" title="Accès à l’article original distant : Du gras - Carnets de routes">original</a>)</li>
@@ -209,6 +227,8 @@
<li><a href="/david/cache/2022/df33a2f3d5f174aadda2a8311eebcafa/" title="Accès à l’article dans le cache local : Dunbar’s number and how speaking is 2.8x better than picking fleas">Dunbar’s number and how speaking is 2.8x better than picking fleas</a> (<a href="https://interconnected.org/home/2022/04/05/dunbar" title="Accès à l’article original distant : Dunbar’s number and how speaking is 2.8x better than picking fleas">original</a>)</li>
<li><a href="/david/cache/2022/0707aa459878d644f14b65e9e05e9537/" title="Accès à l’article dans le cache local : Progressively Enhanced Builds">Progressively Enhanced Builds</a> (<a href="https://blog.jim-nielsen.com/2022/progressively-enhanced-builds/" title="Accès à l’article original distant : Progressively Enhanced Builds">original</a>)</li>
<li><a href="/david/cache/2022/d9ff2d3ee678b7de12c1a4e6d521ca35/" title="Accès à l’article dans le cache local : That Wild Ask A Manager Story">That Wild Ask A Manager Story</a> (<a href="https://jacobian.org/2022/feb/14/that-wild-aam-story/" title="Accès à l’article original distant : That Wild Ask A Manager Story">original</a>)</li>
<li><a href="/david/cache/2022/ed0eff49e75f35733437d71da03b0af3/" title="Accès à l’article dans le cache local : Sustaining Maintaining">Sustaining Maintaining</a> (<a href="https://daverupert.com/2021/12/sustaining-maintaining/" title="Accès à l’article original distant : Sustaining Maintaining">original</a>)</li>
@@ -227,6 +247,8 @@
<li><a href="/david/cache/2022/31293aa75259e6e704ec714b5a4712cf/" title="Accès à l’article dans le cache local : Ukraine. Para Bellum Numericum. Chronique du versant numérique d'une guerre au 21ème siècle.">Ukraine. Para Bellum Numericum. Chronique du versant numérique d'une guerre au 21ème siècle.</a> (<a href="https://www.affordance.info/mon_weblog/2022/02/guerre-ukraine-numerique.html" title="Accès à l’article original distant : Ukraine. Para Bellum Numericum. Chronique du versant numérique d'une guerre au 21ème siècle.">original</a>)</li>
<li><a href="/david/cache/2022/4687697ee56ee244b7d9d17a4a328c6a/" title="Accès à l’article dans le cache local : La maison en A, plan B des « fauchés »">La maison en A, plan B des « fauchés »</a> (<a href="https://bag.fiat-tux.fr/share/6252865f762331.80369904" title="Accès à l’article original distant : La maison en A, plan B des « fauchés »">original</a>)</li>
<li><a href="/david/cache/2022/62f9f5083de61124ed4d9fe1b458d505/" title="Accès à l’article dans le cache local : Programming for kids">Programming for kids</a> (<a href="https://github.com/jackdoe/programming-for-kids" title="Accès à l’article original distant : Programming for kids">original</a>)</li>
<li><a href="/david/cache/2022/94210cf35e7b73fcf5d3ab3c20acc1c6/" title="Accès à l’article dans le cache local : cailloux n°96 : rêver sincèrement">cailloux n°96 : rêver sincèrement</a> (<a href="https://cailloux.substack.com/p/96-rever-sincerement" title="Accès à l’article original distant : cailloux n°96 : rêver sincèrement">original</a>)</li>
@@ -249,6 +271,8 @@
<li><a href="/david/cache/2022/1f0b2ca39bffe2d3551c7ea20dc315a1/" title="Accès à l’article dans le cache local : Lettre à Jean Grave, par Élisée Reclus (Voter c'est abdiquer)">Lettre à Jean Grave, par Élisée Reclus (Voter c'est abdiquer)</a> (<a href="http://www.homme-moderne.org/textes/classics/ereclus/jgrave.html" title="Accès à l’article original distant : Lettre à Jean Grave, par Élisée Reclus (Voter c'est abdiquer)">original</a>)</li>
<li><a href="/david/cache/2022/1dd0383e3a416109e4259144d7a67e2d/" title="Accès à l’article dans le cache local : Write plain text files">Write plain text files</a> (<a href="https://sive.rs/plaintext" title="Accès à l’article original distant : Write plain text files">original</a>)</li>
<li><a href="/david/cache/2022/87b3d4be1d7a1e72be8d411a0eb59249/" title="Accès à l’article dans le cache local : Les Jazzettes #20">Les Jazzettes #20</a> (<a href="https://jazzettes.substack.com/p/les-jazzettes-20" title="Accès à l’article original distant : Les Jazzettes #20">original</a>)</li>
<li><a href="/david/cache/2022/c0e7ed5590b520f176aacfd76ae03188/" title="Accès à l’article dans le cache local : Mechanical Ragger: Print typesetting for the web">Mechanical Ragger: Print typesetting for the web</a> (<a href="https://oak.is/thinking/mechanical-ragger/" title="Accès à l’article original distant : Mechanical Ragger: Print typesetting for the web">original</a>)</li>
@@ -259,6 +283,10 @@
<li><a href="/david/cache/2022/eafb714078643eddfcc2d7de9982bd3b/" title="Accès à l’article dans le cache local : Understanding UUIDs, ULIDs and String Representations">Understanding UUIDs, ULIDs and String Representations</a> (<a href="https://sudhir.io/uuids-ulids" title="Accès à l’article original distant : Understanding UUIDs, ULIDs and String Representations">original</a>)</li>
<li><a href="/david/cache/2022/4d01ca34a54c4be19535df17fdf0c9d2/" title="Accès à l’article dans le cache local : Creating a Nice-Looking PDF with pandoc">Creating a Nice-Looking PDF with pandoc</a> (<a href="https://plaintextproject.online/articles/2022/04/06/pdf.html" title="Accès à l’article original distant : Creating a Nice-Looking PDF with pandoc">original</a>)</li>
<li><a href="/david/cache/2022/7f62798239c75130d19c030a4c695027/" title="Accès à l’article dans le cache local : Blogging and the heat death of the universe">Blogging and the heat death of the universe</a> (<a href="https://www.robinrendle.com/notes/blogging-and-the-heat-death-of-the-universe/" title="Accès à l’article original distant : Blogging and the heat death of the universe">original</a>)</li>
<li><a href="/david/cache/2022/ae3792ebced6f8b2b12b04723d982462/" title="Accès à l’article dans le cache local : ☕️ Journal : Pluriversité">☕️ Journal : Pluriversité</a> (<a href="https://thom4.net/2022/03/06/pluriversite/" title="Accès à l’article original distant : ☕️ Journal : Pluriversité">original</a>)</li>
<li><a href="/david/cache/2022/7377c68e2b48f5c923542cefec391549/" title="Accès à l’article dans le cache local : Compte-rendu de voyage : Le samedi 5 février à Ottawa">Compte-rendu de voyage : Le samedi 5 février à Ottawa</a> (<a href="https://mtlcontreinfo.org/compte-rendu-de-voyage-le-samedi-5-fevrier-a-ottawa/" title="Accès à l’article original distant : Compte-rendu de voyage : Le samedi 5 février à Ottawa">original</a>)</li>

Loading…
Cancel
Save