A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 24KB

hace 1 año
hace 1 año
hace 1 año
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>TJM - le Taux Journalier Militant (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Is that even respected? Retrospectively? What a shAItshow…
  28. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  29. <meta name="robots" content="noai, noimageai">
  30. <!-- Documented, feel free to shoot an email. -->
  31. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  32. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  33. <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>
  34. <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>
  35. <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>
  36. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  37. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  38. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  39. <script>
  40. function toggleTheme(themeName) {
  41. document.documentElement.classList.toggle(
  42. 'forced-dark',
  43. themeName === 'dark'
  44. )
  45. document.documentElement.classList.toggle(
  46. 'forced-light',
  47. themeName === 'light'
  48. )
  49. }
  50. const selectedTheme = localStorage.getItem('theme')
  51. if (selectedTheme !== 'undefined') {
  52. toggleTheme(selectedTheme)
  53. }
  54. </script>
  55. <meta name="robots" content="noindex, nofollow">
  56. <meta content="origin-when-cross-origin" name="referrer">
  57. <!-- Canonical URL for SEO purposes -->
  58. <link rel="canonical" href="https://www.24joursdeweb.fr/2022/tjm-tarif-journalier-militant/">
  59. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  60. <article>
  61. <header>
  62. <h1>TJM - le Taux Journalier Militant</h1>
  63. </header>
  64. <nav>
  65. <p class="center">
  66. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  68. </svg> Accueil</a> •
  69. <a href="https://www.24joursdeweb.fr/2022/tjm-tarif-journalier-militant/" title="Lien vers le contenu original">Source originale</a>
  70. </p>
  71. </nav>
  72. <hr>
  73. <p><strong>L’argent a une place prépondérante dans nos vies</strong>.<br>
  74. On tâtonne avec de l’argent de poche. Parfois on choisit nos études en fonction — de ce qu’elles vont coûter, de ce que ça va rémunérer. On <i>négocie</i> notre salaire — étalon de nos compétences, échelon de comparaison. Parfois on en manque, parfois on a ce qu’il faut et parfois on le fait même <i>travailler</i><sup id="cite-ref-1"><a href="#cite-note-1">1</a></sup>.</p>
  75. <p>L’argent est un sujet tellement important… qu’on n’en parle pas.</p>
  76. <p>On « découvre » le salaire des autres au hasard d’un fichier mal rangé sur le <i>Drive</i>.<br>
  77. On réalise que pour un intitulé et une expérience de poste similaires, on gagne moins qu’un ou une camarade.<br>
  78. Au repas de famille, on angoisse d’avance du moment où Jean-Côme sortira nonchalamment qu’il dépense un <abbr title="Salaire Minimum de Croissance">SMIC</abbr> par mois en bouteilles de vin. Quand ce n’est pas au tour de Luc-André de se plaindre de l’annulation de sa retraite spirituelle en Inde, parce que le cours des cryptomonnaies s’est effondré.</p>
  79. <p>On fixe parfois notre <strong>taux journalier moyen</strong> (<abbr>TJM</abbr>) <i>en fonction</i> des autres<sup id="cite-ref-2"><a href="#cite-note-2">2</a></sup> : <i>au moins tant</i> (parce que ce sont les prix du marché) mais <i>moins que bidule</i> (parce qu’il est plus expérimenté). Et tant pis si on facture en quatre jours ce que notre maraichèr‧e gagne en vingt-cinq — <strong>on ne peut pas travailler et résoudre les problèmes du monde en même temps</strong>.</p>
  80. <p>Et bien… <em>pourquoi pas</em> ?</p>
  81. <p class="section">Je vous propose des <strong>actions concrètes pour rediriger une partie de nos privilèges</strong> en tant que personnes bien payées dans le domaine de la <i>tech</i>. Ces actions sont basées sur une dizaine d’années de mise en pratique : ce n’est ni exhaustif, ni universel, ni mieux-disant. Vous sentez que vous feriez différemment ? C’est sûrement une voie plus intéressante à suivre — entre autres, parce que c’est là que réside votre motivation.</p>
  82. <div>
  83. <h2>Militer avec de l’argent</h2>
  84. <p>Difficile d’envisager de <em>donner du temps</em> quand la semaine est suffisamment éprouvante avec les transports, cinq journées de travail, gérer les émotions des autres et prendre soin de soi ainsi que de personnes à charge.</p>
  85. <p>Voici quelques pistes pour se réapproprier la portée de notre facturation.</p>
  86. <h3>Dédier une fraction de son tarif-jour</h3>
  87. <p>Cela pourrait revenir à déterminer un petit montant de chaque journée facturée — par exemple 50€ de 600€ — et le reverser à un projet ou association qui vous tient à cœur. Vous avez facturé dix jours dans le mois et vous trouvez que donner 500€ c’est peu ? Et bien c’est déjà ça, commençons par ça. On verra bien le mois prochain.</p>
  88. <p>Vous êtes salarié‧e dans une équipe qui facture à la journée ? Et bien pourquoi ne pas appliquer ce principe à <em>chaque</em> journée facturée par <em>chaque</em> personne, disons sur <em>un</em> projet ? La discussion en équipe concernant le « à qui donner ? » crée également l’occasion de mieux se connaître :</p>
  89. <blockquote><p>Tu voudrais donner au <a href="https://www.alternativesforestieres.org/-Faire-un-don-">Réseau des Alternatives Forestières</a> ? Je n’avais aucune idée que la majorité des forêts étaient privées, ni qu’il y avait un enjeu climatique et de biodiversité les concernant.</p></blockquote>
  90. <p>Si un client vous demande de baisser votre tarif, vous pouvez lui proposer de le <em>maintenir</em> (et de donner la différence) ou, grand luxe, de le monter (et de donner la différence). Une belle occasion de l’associer à votre démarche.</p>
  91. <h3>Décider d’un montant en fin d’exercice annuel</h3>
  92. <p>La méthode d’attribution est à décider avec les personnes qui ont participé à créer ces richesses : un pourcentage (1% du chiffre d’affaires, 10% des bénéfices, etc.), un montant fixe (5 000€, deux fois 2 500€, etc.), une enveloppe par personne (500€, deux fois 250€, etc.).</p>
  93. <p>Imaginez que vous recevez des chèques cadeaux en fin d’année : au lieu de financer du déchet ou de la consommation pour notre confort individuel, ce même argent pourrait contribuer à <a href="https://terredeliens.org/national/hub-ferme/">financer l’achat de terrain agricole avec Terre de Liens</a>. Peut-être au bénéfice d’ancien‧nes dév en reconversion, d’ailleurs ?</p>
  94. <h3>Rémunérer d’autres au même tarif</h3>
  95. <p>J’ai participé à plusieurs formations où j’ai demandé à l’équipe organisatrice d’augmenter le prix final<sup id="cite-ref-3"><a href="#cite-note-3">3</a></sup>: le stage durait quatre jours et mon tarif-jour est de 600€? Alors ce sera 2 400€ sur la facture qu’iels m’adresseront. Ça nous donne à la fois un miroir de ce qu’on coûte et on transfère directement ce pouvoir sous forme de reconnaissance financière.</p>
  96. <p>Ça sera peut-être un non-événement dans une formation technologique… mais dans le milieu de <a href="https://fr.wikipedia.org/wiki/%C3%89ducation_populaire">l’éducation populaire</a>, ça surprendra de suite — et révèlera les disparités qui nous traversent. Les structures qui pratiquent le prix libre comprendront immédiatement l’impact : ça leur offre un précieux temps de qualité.</p>
  97. <p>Vous travaillez en binôme d’indépendant‧e sur un projet ? Facturez au même tarif-jour — surtout si votre camarade a l’habitude de facturer moins. C’est un bel endroit où des hommes cisgenres peuvent faire rejaillir leur privilège envers des camarades qui n’auraient pas osé demander, qui sont payé‧es 25% de moins, etc.</p>
  98. <h3>Réaliser des projets à prix libre<sup id="cite-ref-4"><a href="#cite-note-4">4</a></sup></h3>
  99. <p>En rapprochant le montant de ma trésorerie, mon besoin annuel de salaire et combien j’ai facturé dans l’année, arrive le <strong>jour du petit dépassement</strong> : celui où tout jour travaillé crée davantage de confort et épaissira un matelas sécurisant.</p>
  100. <p>Dit autrement : arrive un moment dans l’année où j’ai du temps professionnel (en journée, en semaine) que je ne suis pas obligé de facturer (mon salaire étant déjà payé).<br>
  101. Dis encore autrement : au lieu de me faire tout le temps payer au « prix du marché » (valeur marchande), je gagne en capacité à me faire payer à hauteur des moyens de la structure cliente (prix libre, valeur non-marchande).</p>
  102. <p>Je propose cette formule à des personnes avec qui j’ai envie de travailler, avec qui je suis accordé sur les valeurs (dans mon cas : environnement &amp; biodiversité, diffusion de connaissances libres, récits de vie) sans pour autant être du travail gratuit. On se met d’accord sur le périmètre de travail (par exemple : refaire un site web), la méthode (par exemple : simili-SCRUM), et on le fait ensemble, à notre rythme (pas de <i>date de mise à mort</i><sup id="cite-ref-5"><a href="#cite-note-5">5</a></sup>). Peut-être que ça se traduira par un mercredi sur deux pendant huit mois. Peut-être que ça se résumera à chaque vendredi pendant un trimestre.</p>
  103. <p>Si c’est notre budget temps, autant le dépenser sur ce qui leur apporte le plus de valeur.</p>
  104. <p><strong>On tient mutuellement les comptes du temps passé</strong> — une manière de montrer qu’on fait équipe et qu’il n’y a pas de rapport client/fournisseur. Et <strong>les discussions sur l’argent en fin de projet font grandir tout le monde</strong> : il y a peu d’intérêt à faire la conversion temps/argent, à part pour se remercier de s’être créé un cadre de travail idéal, de confiance et de qualité.</p>
  105. </div>
  106. <div class="section">
  107. <h2>Militer avec du temps</h2>
  108. <p>Qu’on soit indépendant‧e ou salarié‧e subordonné‧e, que faire si on est au maximum de nos capacités financières ? Ou qu’on n’a pas la main dessus, à part avec ses deniers personnels ? Et bien, <strong>travailler une journée de moins par semaine</strong><sup id="cite-ref-6"><a href="#cite-note-6">6</a></sup>. En se libérant du temps <em>en journée</em>, on préserve nos soirées pour être en compagnie de nos ami‧es (notre réseau de soutien affectif), ou pratiquer des activités <em>ressourçantes</em>, par exemple<em>.</em></p>
  109. <p>Et les 20% de salaire en moins me direz-vous ? C’est l’occasion de couper dans les dépenses les moins importantes (<em>ciao</em> Netflix, <em>hello</em> la médiathèque), de sortir la voiture une journée de moins par semaine, de s’éviter les transports en commun, de se cuisiner un repas de plus et… d’avoir besoin de moins de temps pour récupérer en fin de semaine.</p>
  110. <h3>S’accorder du répit, s’entraîner, s’exercer</h3>
  111. <blockquote><p>Thomas, tu es en train d’écrire que pour militer il faut d’abord « glandouiller sur le canapé »<sup id="cite-ref-7"><a href="#cite-note-7">7</a></sup> ?</p></blockquote>
  112. <p>Oh que oui : récupérer de l’espace dans la tête, reposer le corps de nos courses incessantes, prendre l’air, observer les choses autour de nous. Avoir tout loisir de se regarder dans un miroir en se demandant « qu’est-ce que j’ai envie de faire avec moi-même ? » — sans qu’une personne ne passe et nous dise quoi faire de <em>bien</em> (selon <em>son</em> référentiel).</p>
  113. <p>Dans un second temps, quand on a récupéré de l’énergie, s’offrir le plaisir de faire ces choses qui demandent de la pratique pour monter en aisance — dessin, peinture, course à pied, boulange, écriture, couture, etc. Des choses pour soi dont on garde une satisfaction lorsque l’écran d’ordinateur est éteint.</p>
  114. <p>Enfin seulement, <q>ton temps offrir tu pourras</q><sup id="cite-ref-8"><a href="#cite-note-8">8</a></sup>.</p>
  115. <h3>Résoudre un problème sur lequel on se sent à l’aise</h3>
  116. <p>Si je n’avais qu’une journée à passer dans les locaux d’une association qui attire ma curiosité, qu’est-ce que je leur proposerais ? Qu’est-ce qui me coûte peu d’efforts et qui leur ajoute de la légèreté ?</p>
  117. <p>C’est comme ça qu’une fois, j’ai contacté une revue pour leur proposer de leur offrir une journée de mon temps sur des sujets informatiques. On a convenu d’une date. Sur place, on a fait l’inventaire de ce qui leur posait problème. Il se trouve qu’iels perdaient beaucoup d’énergie à s’échanger des fichiers entre ordinateurs. Personne n’avait le temps ni acquis les compétences pour résoudre ce problème. C’est ainsi qu’en une heure, j’ai effectué des mises à jour système… et problème résolu !</p>
  118. <p>Parfois, retirer une épine du pied revient à débloquer un message d’erreur sur un logiciel d’envoi d’e-mail que personne n’a compris, à convertir un logo en vectoriel, à mettre à jour un logiciel de gestion (sauvegarde de base de données, clic sur un bouton, hop c’est fait). On baigne dans des outils numériques sans réaliser qu’ils représentent des obstacles, faute d’interlocuteur‧ice à même de dire « je t’écoute et je suis avec toi ».</p>
  119. <h3>Échanger du temps et une compétence</h3>
  120. <p>Une personne souhaite quitter Gmail et toi tu veux apprendre à travailler le bois ? C’est typiquement le genre de choses où on peut convenir que cinq heures de ton temps sont équivalentes à cinq heures de mon temps. Qu’une personne peut apprendre les mécanismes derrière les noms de domaine (« c’est comme un opérateur téléphonique avec portabilité de numéro ») tandis que ta table d’angle de cuisine en bois de récupération prend forme. <a href="https://www.youtube.com/watch?v=ARAQUgkdIvQ">Et de savoir <em>enfin</em> quel est le meilleur type de tournevis</a>.</p>
  121. <p>Cette réciprocité entre deux personnes n’est pas nécessaire. Ni même le fait de se connaître au préalable. Des <a href="https://fr.wikipedia.org/wiki/Syst%C3%A8me_d'%C3%A9change_local">Systèmes d’Échange Local</a> (<abbr>SEL</abbr>) servent d’intermédiaires pour annoncer et rechercher des compétences ou services.</p>
  122. <h3>Devenir bénévole autour d’une thématique qui nous porte</h3>
  123. <p>Maïtané et moi avons préparé une <a href="https://www.paris-web.fr/2022/conferences/on-se-leve-et-on-se-cassetour-dhorizon-dun-travail-sans-capital.php">présentation sur le rapport au travail pour Paris Web 2022</a>. Nous avons dû nous réfréner sur le nombre de réponses à apporter à la question <a href="https://onseleveetonsecasse.fr/fiches/temps-libre/">à quoi nous sert notre temps libre ?</a> Parce que quand on n’a pas à s’occuper de ces choses après le travail, on a tellement plus d’énergie à y apporter, sans se mettre en danger d’épuisement.</p>
  124. <p>Les crédos de Maïtané sont le <strong>design et les logiciels libres</strong> ? Alors elle contribue à la dimension design de l’<a href="https://framasoft.org/fr/">association Framasoft</a>.<br>
  125. Elle est <strong>en colère contre les violences sexistes et sexuelles</strong> ? Alors elle met son énergie à assembler des pages de qualité avec <a href="https://www.noustoutes.org/">#NousToutes</a>.<br>
  126. Ma préoccupation c’est la <strong>sécheresse dans mon lieu de vie</strong> ? Alors je me rends aux réunions de la <a href="https://www.riviere-drome.fr/">Commission Locale de l’Eau</a>.<br>
  127. Je vois un enjeu dans l’<strong>alimentation et une agriculture paysanne</strong> ? Alors j’apprends à y voir plus clair en participant aux enquêtes terrains d’un <a href="https://www.natureetprogres.org/comment-simpliquer/">groupe local de Nature &amp; Progrès</a>.</p>
  128. <p>D’autres personnes mettront leur énergie dans l’organisation d’un festival de thé, dans l’animation d’un calendrier de l’avent (<a href="/remerciements/">merci la belle équipe 👏🏻</a>), dans la préparation de repas dans un centre d’accueil de réfugié‧es, dans la mise en place d’un jardin thérapeutique, etc.</p>
  129. </div>
  130. <div>
  131. <h2>OK, et maintenant ?</h2>
  132. <p>J’encourage à débuter par un <em>petit</em> espace-temps pour <em>jouer</em> avec peu d’enjeux.<br>
  133. Se dire qu’on essaye un mois pour voir. Sur un petit sujet, rencontre entre les personnes à aider et ce qui vous enthousiasme. Ou de démarrer avec quelque chose de présent dans votre tête depuis longtemps — cette association au coin de la rue, celle dont on lit le journal avec intérêt ou cette étiquette qui attire notre attention au marché fermier.</p>
  134. <p>Indépendant‧e : on peut faire nos comptes et passer à l’action dès lundi.<br>
  135. Salarié‧e subordonné‧e : il n’y a plus besoin de patauger entre nos envies de monde désirable et le <em>statu quo</em> du coin baby-foot ou château-fort du bureau.</p>
  136. <p>Certes, on a le luxe de pouvoir facturer beaucoup — tarif journalier moyen.<br>
  137. Et maintenant, on a plein d’idées cadeaux pour redistribuer ces richesses — tarif journalier militant.</p>
  138. <div class="section">
  139. <h3>Remerciements</h3>
  140. <p>Au cas où ça ne serait pas évident : je ne suis pas arrivé là tout seul.<br>
  141. Je dois beaucoup de ces réflexions à des discussions passionnantes avec <a href="https://noemiegirard.co/">Noémie G</a>, David B, Stéphane L et Sofia B.</p>
  142. <p>Et au fait de travailler moins de quatre jours par semaine !</p>
  143. </div>
  144. </div>
  145. </article>
  146. <hr>
  147. <footer>
  148. <p>
  149. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  150. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  151. </svg> Accueil</a> •
  152. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  153. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  154. </svg> Suivre</a> •
  155. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  156. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  157. </svg> Pro</a> •
  158. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  159. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  160. </svg> Email</a> •
  161. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  162. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  163. </svg> Légal</abbr>
  164. </p>
  165. <template id="theme-selector">
  166. <form>
  167. <fieldset>
  168. <legend><svg class="icon icon-brightness-contrast">
  169. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  170. </svg> Thème</legend>
  171. <label>
  172. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  173. </label>
  174. <label>
  175. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  176. </label>
  177. <label>
  178. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  179. </label>
  180. </fieldset>
  181. </form>
  182. </template>
  183. </footer>
  184. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  185. <script>
  186. function loadThemeForm(templateName) {
  187. const themeSelectorTemplate = document.querySelector(templateName)
  188. const form = themeSelectorTemplate.content.firstElementChild
  189. themeSelectorTemplate.replaceWith(form)
  190. form.addEventListener('change', (e) => {
  191. const chosenColorScheme = e.target.value
  192. localStorage.setItem('theme', chosenColorScheme)
  193. toggleTheme(chosenColorScheme)
  194. })
  195. const selectedTheme = localStorage.getItem('theme')
  196. if (selectedTheme && selectedTheme !== 'undefined') {
  197. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  198. }
  199. }
  200. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  201. window.addEventListener('load', () => {
  202. let hasDarkRules = false
  203. for (const styleSheet of Array.from(document.styleSheets)) {
  204. let mediaRules = []
  205. for (const cssRule of styleSheet.cssRules) {
  206. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  207. continue
  208. }
  209. // WARNING: Safari does not have/supports `conditionText`.
  210. if (cssRule.conditionText) {
  211. if (cssRule.conditionText !== prefersColorSchemeDark) {
  212. continue
  213. }
  214. } else {
  215. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  216. continue
  217. }
  218. }
  219. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  220. }
  221. // WARNING: do not try to insert a Rule to a styleSheet you are
  222. // currently iterating on, otherwise the browser will be stuck
  223. // in a infinite loop…
  224. for (const mediaRule of mediaRules) {
  225. styleSheet.insertRule(mediaRule.cssText)
  226. hasDarkRules = true
  227. }
  228. }
  229. if (hasDarkRules) {
  230. loadThemeForm('#theme-selector')
  231. }
  232. })
  233. </script>
  234. </body>
  235. </html>