|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- <!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>Dis tonton, c’est quoi les blocages d’instance sur Mastodon ? (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://n.survol.fr/n/dis-tonton-cest-quoi-les-blocages-dinstance-sur-mastodon">
-
- <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>Dis tonton, c’est quoi les blocages d’instance sur Mastodon ?</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://n.survol.fr/n/dis-tonton-cest-quoi-les-blocages-dinstance-sur-mastodon" title="Lien vers le contenu original">Source originale</a>
- </p>
- </nav>
- <hr>
- <p>Voilà qu’on reparle de modération de Mastodon. <a href="https://blog.infosec.exchange/2022/11/20/an-update-on-journa-host/">L’histoire de départ</a> c’est une instance (« <em>Infosec</em> ») qui a choisi d’en mettre une autre (« <em>Journa</em> ») sous silence pour ne pas subit les propos que cette dernière a choisi de laisser en ligne.</p>
-
- <blockquote class="wp-block-quote"><p><em>Hein ? Une instance ?</em></p></blockquote>
-
- <p>Mastodon fonctionne à travers un réseau fédéré. Son petit nom est le fédiverse. Les utilisateurs sont regroupés en ilots plus ou moins gros qu’on appelle les instances. Certains utilisateurs ont leur propre instance personnel. D’autres instances regroupent plusieurs dizaines de milliers de personnes. </p>
-
- <p>Si un Tom d’<em>Infosec</em> est abonné à Alice de <em>Journa</em>, alors les deux instances communiquent entre elles pour que <em>Journa</em> envoie les messages d’Alice à <em>Infosec</em>. <em>Infosec</em> fera ensuite en sorte de les présenter à Tom. </p>
-
- <figure class="wp-block-image aligncenter size-medium"><a href="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949.png"><img loading="lazy" src="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949-300x249.png" alt="Schéma représentant trois cercles avec des flèches allant dans les deux sens entre chaque couple de cercle.
-
- Dans le premier cercle, quatre noms : Tom, Tina, Titus, Tara.
-
- Dans le second cerce, quatre noms : Anna, Alice, Agnès, Albus.
-
- Dans le troisième cercle : Cédric, Clara, Cloé." class="wp-image-21761" srcset="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949-300x249.png 300w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949-1024x851.png 1024w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949-768x638.png 768w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949.png 1371w" sizes="(max-width: 300px) 100vw, 300px"></a><figcaption>Différentes instances</figcaption></figure>
-
- <p>Vous connaissez déjà ça avec les emails, qui fonctionnent sur le même principe. On a un îlot Gmail, un Outlook, un Yahoo, un Orange, un Free… et chaque entreprise créé le sien avec son propre nom.</p>
-
- <blockquote class="wp-block-quote"><p><em>Ok, mais c’est quoi le blocage d’une instance ?</em></p></blockquote>
-
- <p>Si <em>Infosec</em> choisit de bloquer entièrement <em>Journa</em>, alors elle ne traitera plus les nouveaux messages de cette dernière et n’y enverra plus les siens. On parle de défédérer une instance.</p>
-
- <p>Cette procédure n’influera que sur l’instance qui réalise qui le blocage (<em>Infosec</em>) et les utilisateurs de cette dernière. L’instance ciblée (<em>Journa</em>) continuera à converser avec toutes les milliers d’autres instances du réseau.</p>
-
- <figure class="wp-block-image aligncenter size-medium"><a href="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b.png"><img loading="lazy" src="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-300x249.png" alt="Schéma représentant trois cercles avec des flèches allant dans les deux sens entre chaque couple de cercle.
-
- La flèche qui va du cercle des A vers le cercle des T est bloqué par une croix rouge du côté du cercle des T.
- La flèche qui va du cercle des T vers le cercle des A est bloquée elle aussi au niveau du cercle des T, et est représentée en pointillés.
-
- Dans le premier cercle, quatre noms : Tom, Tina, Titus, Tara.
-
- Dans le second cerce, quatre noms : Anna, Alice, Agnès, Albus.
-
- Dans le troisième cercle : Cédric, Clara, Cloé." class="wp-image-21762" srcset="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-300x249.png 300w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-1024x851.png 1024w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-768x638.png 768w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b.png 1371w" sizes="(max-width: 300px) 100vw, 300px"></a><figcaption>Blocage d’une instance par une autre.</figcaption></figure>
-
- <p>En réalité il y a un niveau intermédiaire qu’on appelle la mise sous silence.</p>
-
- <p>Mastodon a trois flux : le flux personnel qui présente uniquement les abonnements, le flux local qui présente uniquement les messages locaux à l’instance, et le flux fédéré qui présente tous les messages reçus par l’instance.</p>
-
- <p>La mise sous silence masque les contenus concernés dans le flux fédéré mais permet de recevoir des messages dans le flux personnel à condition de s’y être explicitement abonné.</p>
-
- <p>C’est ce niveau de blocage intermédiaire (la mise sous silence) qui a été mis en œuvre par <em>Infosec</em>.</p>
-
- <blockquote class="wp-block-quote"><p><em>Mais pourquoi faire ça ?</em></p></blockquote>
-
- <p>La vraie réponse : Peu importe. Si tu choisis de ne pas écouter CNews chez toi, tu n’as pas à donner d’explication. C’est ton choix. </p>
-
- <p>C’est la même chose pour l’instance <em>Infosec</em> et ses utilisateurs : Ils font ce qu’ils veulent chez eux.</p>
-
- <p>Le plus souvent on bloque une instance quand elle est la source de spam, de harcèlements, ou de propos racistes, transphobes, handiphobes, pédopornographiques ou injurieux. </p>
-
- <p>Chaque instance a ses propres sensibilités. Certaines tiennent à une liberté d’expression très large, d’autres préfèrent exclure la pornographie ou certains sujets pour créer un espace qui leur convient. </p>
-
- <p>Certains préfèrent une modération légère quitte à subir parfois quelques contenus problématiques là où d’autres préfèrent une modération forte quitte à limiter certaines interactions externes légitimes. </p>
-
- <p>C’est un choix local, qui ne concerne qu’eux.</p>
-
- <p>Ici <em>Infosec</em> a jugé que certains propos venant de <em>Journa</em> étaient transphobes et les utilisateurs d’<em>Infosec</em> souhaitaient s’en protéger (c’est à dire ne plus les voir ni en assurer la transmission chez eux).</p>
-
- <blockquote class="wp-block-quote"><p><em>On bloque toute une instance et tous les utilisateurs pour </em>un<em> unique message problématique ?</em></p></blockquote>
-
- <p>Mastodon prévoit un moyen de signaler les propos gênants à l’instance d’origine. Le plus souvent les blocages d’instance interviennent quand l’instance d’origine (ici <em>Journa</em>) refuse d’agir, ou que le problème survient trop régulièrement.</p>
-
- <p>Pour faire un parallèle, si je sais que CNews invite régulièrement des invités que je ne supporte pas, je peux préférer ne plus du tout regarder CNews pour m’en protéger, quitte à ne plus entendre certains autres invités qui seraient eux acceptables à mes yeux. Je n’interdis pas CNews, je choisis juste de ne pas diffuser cette chaîne dans mon salon.</p>
-
- <p>J’avoue que sur ce sujet, si j’avais eu à modérer, avec une seule occurrence qui n’est qu’un partage d’un contenu d’un journal de référence, j’aurais mis sous silence uniquement l’utilisateur concerné et pas l’instance, mais ce n’est que mon choix lié à mes équilibres personnels.</p>
-
- <p><em>Infosec</em> a fait un autre choix, et il ne regarde qu’eux.</p>
-
- <blockquote class="wp-block-quote"><p><em>Pourquoi est-ce que Journa a refusé d’agir sur des propos transphobes ?</em></p></blockquote>
-
- <p>Les équilibres de liberté d’expression sont très subjectifs. Tous les pays n’ont déjà pas le même socle de base en interne. Les communautés peuvent en plus choisir d’aller au-delà de ce socle de base. Certaines le font, d’autres pas, et pas toujours sur les mêmes sujets.</p>
-
- <p>Enfin, parfois il y a simplement désaccord sur ce qui est ou pas injurieux, ce qui est ou pas transphobe, ce qui est ou pas raciste, ce qui est ou pas un constitutif d’un harcèlement, etc.</p>
-
- <p>Les communautés se regroupent autour de politiques, valeurs et cultures communes, mais n’ont pas forcément les mêmes que le voisin.</p>
-
- <p>C’est ce qu’il se passe ici. Soit <em>Journa</em> a considéré que l’article du New York Times relayé était suffisamment étayé avec des avis de docteurs et chercheurs à propos des effets indésirables de certains traitements, soit <em>Journa</em> n’a pas agit en pensant que ce n’est pas son rôle de trancher une telle question et remettre en cause le New York Times. </p>
-
- <p>D’autres personnes sur <em>Infosec</em> ont, elles, considéré que le contenu était transphobe et qu’il valait mieux bloquer l’instance si elle n’agissait pas pour empêcher la diffusion de contenus transphobes à l’avenir. <em>Infosec</em> a agit en fonction de ses propres utilisateurs, et ça ne regarde qu’eux (oui, je me répète mais c’est important).</p>
-
- <blockquote class="wp-block-quote"><p><em>Ça pose quand même un sacré problème de liberté d’expression, non ?</em></p></blockquote>
-
- <p>En fait, pas vraiment, pas beaucoup plus que tous les gens qui comme moi font le choix de ne jamais allumer la TV sur CNews.</p>
-
- <p>Personne n’empêche les membres de <em>Journa</em> de s’exprimer, ou d’être entendu, ou même d’être relayé sur la très grande majorité des instances Mastodon.</p>
-
- <p>Dans le schéma de tout à l’heure, le blocage est à la périphérie de l’instance <em>Infosec</em> et pas à la périphérie de l’instance <em>Journa</em>. Tant qu’<em>Infosec</em> n’est qu’un des très nombreux acteurs du réseau, ça ne pose pas de problème majeur.</p>
-
- <figure class="wp-block-image aligncenter size-medium"><a href="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b.png"><img loading="lazy" src="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-300x249.png" alt="Schéma représentant trois cercles avec des flèches allant dans les deux sens entre chaque couple de cercle.
-
- La flèche qui va du cercle des A vers le cercle des T est bloqué par une croix rouge du côté du cercle des T.
- La flèche qui va du cercle des T vers le cercle des A est bloquée elle aussi au niveau du cercle des T, et est représentée en pointillés.
-
- Dans le premier cercle, quatre noms : Tom, Tina, Titus, Tara.
-
- Dans le second cerce, quatre noms : Anna, Alice, Agnès, Albus.
-
- Dans le troisième cercle : Cédric, Clara, Cloé." class="wp-image-21762" srcset="https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-300x249.png 300w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-1024x851.png 1024w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b-768x638.png 768w, https://n.survol.fr/wp-content/uploads/2022/11/Sans-titre-2022-11-21-0949b.png 1371w" sizes="(max-width: 300px) 100vw, 300px"></a><figcaption>Blocage d’une instance par une autre.</figcaption></figure>
-
- <p>Les seuls pour qui il y aurait potentiellement un enjeu de liberté d’expression, ce sont les membres de l’instance d’<em>Infosec</em>.</p>
-
- <blockquote class="wp-block-quote"><p><em>Ahah ! Tu vois, tu le dis toi-même, il y a bien un problème pour eux !</em></p></blockquote>
-
- <p>Ça dépend. Si je participe à une association, qu’il y a une TV dans la salle de pause et qu’il a été décide que cette TV diffuserait Arte plutôt que CNews, est-ce une atteinte à la liberté d’expression parce que je ne peux pas y écouter les chroniqueurs de CNews ? </p>
-
- <p>Probablement pas : Je peux encore écouter CNews chez moi, ou dans une autre association, ou même monter ma propre association qui aura des règles différentes. Cela ne commencera à être un problème que si ma capacité à aller voir ailleurs est limitée ou complexe, ou si on donne à l’association d’origine une autorité quelconque.</p>
-
- <p>C’est exactement la même chose avec <em>Infosec</em>. Ses membres peuvent toujours aller lire <em>Journa</em> ailleurs avec un second compte, ou déménager leur compte principal sur une autre instance, ou même monter leur propre instance. Ajouter un second compte ou migrer ailleurs est facile, sans limite.</p>
-
- <p>Non seulement personne ne bride l’expression des membres de <em>Journa</em> mais en plus personne ne limite la capacité à aller les lire facilement.</p>
-
- <blockquote class="wp-block-quote"><p><em>Pourtant tu disais toi-même que…</em></p></blockquote>
-
- <p>La question surgirait différemment si <em>Infosec</em> avait une situation de quasi-monopole, ou que toutes les instances bloquant <em>Journa</em> avaient en se regroupant une situation de quasi-monopole limitant de fait la capacité à accéder au contenu dont on parle.</p>
-
- <p>Ce n’est pas le cas aujourd’hui.</p>
-
- <p>Ce serait aussi un sujet pour un blocage litigieux réalisé de façon cachée. Ici l’administrateur d’<em>Infosec</em> a publié un billet sur le sujet et le fait même que j’en parle ici montre qu’on est loin de ce cas.</p>
-
- <blockquote class="wp-block-quote"><p><em>Ça pose au moins une question de démocratie interne d’Infosec</em></p></blockquote>
-
- <p>Pas à mon avis. Tout fonctionnement interne n’a pas forcément à être démocratique. C’est important pour un pays ou une collectivité territoriale parce qu’on ne choisit pas son pays d’origine et qu’on ne change pas facilement de pays ou de territoire.</p>
-
- <p>La démocratie c’est « le pouvoir au peuple ». Sur Mastodon l’utilisateur a le pouvoir vu qu’il peut choisir à tout moment une instance avec des règles qui lui conviennent, sans avoir de conséquences négatives significatives.</p>
-
- <p>C’est d’autant moins un sujet que le message de l’administrateur d’<em>Infosec</em> laisse entendre que ce sont des utilisateurs de l’instance qui l’ont fait agir et pas lui qui a pris la décision unilatéralement.</p>
-
- <blockquote class="wp-block-quote"><p><em>Mais alors il n’y a aucun problème ?</em></p></blockquote>
-
- <p>Il y a <em>plein</em> de problèmes, mais pas forcément des questions de liberté d’expression ou de démocratie, et pas forcément sur le cas <em>Infosec</em> – <em>Journa</em>.</p>
-
- <p>Un premier problème est la transparence. <em>Infosec</em> a agi en transparence mais ce n’a pas toujours été lé cas de toutes les instances par le passé. Quand c’est transparent on fait nos choix, éventuellement on va voir ailleurs. Quand c’est caché ça veut dire manipuler l’information reçue et influencer des personnes sans qu’ils ne le sachent, et ça c’est déjà beaucoup plus litigieux. </p>
-
- <p>La contrainte est un second problème. Ce ne semble pas le cas ici mais par le passé la menace de défédérer a été utilisée comme une pression pour forcer une autre communauté à changer ses propres règles et valeurs (« si tu ne bloques pas l’instance xxx alors on bloque ton instance aussi »). On est là dans une démarche où l’outil a été détourné pour devenir une arme plutôt qu’un bouclier. </p>
-
- <p>Enfin, il y a un sujet si une instance ou un groupe d’instances peut avoir suffisamment de poids pour que ça devienne effectivement un sujet de liberté d’expression. C’est particulièrement le cas si on cumule avec le problème précédent. Là ça peut être aussi moche qu’un réseau centralisé, ou créer plusieurs sous-réseaux indépendants et qui ne communiquent pas entre eux.</p>
-
- <blockquote class="wp-block-quote"><p>Du coup le système de Mastodon est problématique ?</p></blockquote>
-
- <p>Oui, non, ça dépend de tes propres choix.</p>
-
- <p>C’est juste qu’il n’y a pas de système parfait ni de façon universelle de positionner les équilibres entre les différents enjeux.</p>
-
- <p>Le choix de Mastodon est un choix qui répond à des problèmes vus sur Twitter ou d’autres réseaux centralisés, qui ouvre d’autres possibilités et d’autres façons de penser les équilibres. C’est déjà pas mal.</p>
-
- <blockquote class="wp-block-quote"><p>Que peut-on améliorer ?</p></blockquote>
-
- <ol><li>Inciter à plus de transparence à l’intérieur d’une instance, sur ce qui est bloqué globalement et pourquoi.</li><li>Refuser globalement les guerres de modération entre instances et les instances qui veulent contraindre les règles des autres (le « si tu ne bloques pas l’instance xxx alors on bloque ton instance aussi ») </li><li>S’assurer qu’aucune instance ne représente plus de 20% des utilisateurs actifs, et qu’un groupe d’instances ne devienne majoritaire au point de pouvoir devenir un problème.</li><li>Faire en sorte que jamais la procédure de déménagement de compte ne soit limitée, même en cas de blocage d’instance.</li></ol>
- </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>
|