Système de composants sans interface · Nouvelle ressource

Système de design Bits UI.

Bits UI fournit des composants Svelte sans interface prédéfinie, composés à l’aide d’éléments natifs et de l’état de Svelte 5. L’exemple associe une case à cocher à état mixte calculé, des sections d’accordéon dépliables indépendamment et une boîte de dialogue de révision basée sur un portail, avec la configuration de style complète.

Guide OpenDesign9 chapitres28 entrées de référenceGuide de l’application d’origine
01

Aperçu de l’interface du système de design Bits UI

Cochez un élément, examinez l’état mixte du contrôle global, vérifiez la progression incomplète, puis terminez et enregistrez la liste de contrôle locale.

Vérification manuelle de l’interfaceOuvrir l’exemple complet
Case à cocher, accordéon et boîte de dialogue de Bits UI 2.19.5 avec Svelte 5.57.1. Tous les styles visuels sont originaux. · Référence de mise en œuvre
02

Référence de conception du système de design Bits UI

Bits UI 2.19.5 avec Svelte 5.57.1. Bits UI est sans interface imposée : toutes les valeurs de couleur, de typographie et d’espacement --app-* sont des configurations originales explicites fournies avec cet exemple, et non des jetons de design officiels de Bits UI. Les attributs de données natifs et les propriétés des composants sont indiqués séparément.

Configuration sémantique originale de CSS

Source
Nom / règleValeur / configurationUtilisation
--app-canvas#f4f3f8 Arrière-plan de la page.
--app-surface#ffffff Surface du panneau et de la boîte de dialogue.
--app-ink#2d2938 Texte principal.
--app-muted#746d80 Texte d’accompagnement.
--app-line#e3dfeb Séparateurs et bordures.
--app-action#604c88 Commandes cochées et actions principales.
--app-on-action#fffTexte des actions.
--app-focus#9a80ce Indication visible du focus clavier.
--app-soft#eee8f7 Rôle facultatif de surface atténuée.

Espacement et géométrie d’origine

Source
Nom / règleValeur / configurationUtilisation
--app-space-14pxPlus petite unité d’espacement nommée.
--app-space-28pxEspacement compact.
--app-space-312pxEspace entre la commande et son libellé.
--app-space-416pxMarge intérieure étroite du panneau.
--app-space-624pxMarge intérieure du panneau et espace entre les colonnes sur ordinateur.
--app-space-832pxMarge intérieure de la page sur ordinateur.
Checkbox geometry22×22px; 5px radius; 1px borderStyle explicite des commandes d’origine.
Focus ring3px solid #9a80ce; 3px offsetAppliqué lorsque le bouton reçoit le focus visible au clavier.
Dialog widthmin(440px, 100% − 28px)Géométrie explicite et adaptative de la superposition.
Dialog maximum height100vh − 28px with overflow:autoContrainte de fenêtre réservée à la superposition ; aucune adaptation à la hauteur de la page.
Type hierarchy34px title / 29px mobile; 16px accordion; 13px checks; 12px guidanceHiérarchie typographique originale utilisant les polices système.

Contrats des composants natifs

Source
Nom / règleValeur / configurationUtilisation
Checkbox.Root checkedbooleanÉtat terminé ou incomplet.
Checkbox.Root indeterminatebooleanLe contrôle global indique un état mixte lorsque certaines cases sont cochées.
Checkbox data-statechecked / unchecked / indeterminateUtilisé directement par la feuille de style.
Accordion.Root typemultiplePlusieurs sections de vérification peuvent rester ouvertes.
Accordion valuestring[]Liste des identifiants de groupes développés, liée à Svelte.
Dialog.Root openboolean, two-way boundContrôle la visibilité de la vérification.
Dialog.Title / DescriptionNative title and description relationshipsAucun identifiant ARIA dupliqué à gérer manuellement.
Dialog.PortalOverlay and content rendered outside the normal panelÉvite le rognage grâce au flux de document du panneau.
03

Guide complet du système de design Bits UI

Un guide pratique pour choisir, appliquer et évaluer ce système dans une interface réelle.

DESIGN-bits-ui.md

Des conseils complets, un point de départ pour la mise en œuvre et des liens vers les sources.

Télécharger le guide

Système de design Bits UI : composer des parties natives avec l’état de Svelte 5

Composer des parties natives avec l’état de Svelte 5

La liste de contrôle utilise $state pour les réponses individuelles, les identifiants des sections développées et la visibilité de la boîte de dialogue. Un décompte de complétion calculé avec $derived alimente à la fois la progression affichée et la case à cocher globale. La source de vérité réside ainsi dans un modèle Svelte unique, tandis que Bits UI fournit les interactions natives de chaque composant.

Extrait de ce guide OpenDesign

La case à cocher, l’accordéon et la boîte de dialogue sont composés à partir de leurs propres parties. La boîte de dialogue de vérification n’a pas à gérer les réponses de la liste de contrôle, et l’accordéon n’a pas à les effacer lorsqu’il se ferme. Cette séparation constitue un bon point de départ pour un formulaire à plusieurs sections : le modèle reste intact même lorsque les parties visibles de l’interface changent.

Consultez la spécification associée

Système de design Bits UI : utiliser ensemble les sources des composants et des styles de Svelte 5

Utiliser ensemble les sources des composants et des styles de Svelte 5

L’exemple utilise les runes de Svelte 5 : $state pour les groupes, les sections développées, la visibilité de la boîte de dialogue et l’état enregistré ; $derived pour le décompte de complétion. Bits UI 2.19.5 est importé directement. Aucun plugin Tailwind, fournisseur de thème ni bibliothèque d’icônes n’est nécessaire pour ce traitement visuel original.

Les fichiers complets App.svelte et style.css fonctionnent dans un projet Svelte standard créé avec Vite. Le point d’entrée utilise mount de Svelte, plutôt que l’ancien constructeur new App. Lors du transfert de cet exemple, conservez la syntaxe runes du composant avec la dépendance Bits UI 2.19.5 : les liaisons et les rappels présentés ici ne correspondent pas à un ancien composant Svelte API.

Consultez la spécification associée

Système de design Bits UI Déduire un véritable état mixte à partir des cases individuelles

Déduire un véritable état mixte à partir des cases individuelles

Six cases booléennes sont réparties en trois groupes. Le contrôle global est coché uniquement lorsque les six cases le sont, et indéterminé lorsque le nombre de cases cochées est compris entre un et cinq. Son rappel onCheckedChange met à jour toutes les cases : l’état mixte est ainsi calculé, plutôt que stocké dans un indicateur distinct susceptible de se désynchroniser.

Les contrôles individuels appellent une petite fonction de modification qui met à jour leur modèle et invalide le retour de sauvegarde. La case à cocher globale native affichée expose aria-checked=mixed après la sélection d’une seule case. La feuille de style réagit à data-state=checked et data-state=indeterminate, afin que le comportement et la présentation reposent sur le même état natif.

  1. Cochez la première vérification de l’indicateur de focus et observez le tiret du contrôle global.
  2. Ouvrez la liste de vérification et confirmez que le bouton Enregistrer la vérification terminée est désactivé.
  3. Revenez en arrière, cochez toutes les cases et enregistrez l’instantané local complet.

Consultez la spécification associée

Système de design Bits UI Permettre d’ouvrir plusieurs sections sans perdre leurs réponses

Autoriser des sections indépendantes sans perdre leurs réponses

Accordion.Root utilise type=multiple et un tableau lié contenant les identifiants des groupes ouverts. La navigation au clavier commence avec les sections ouvertes, tandis que Form correction et Result feedback peuvent être ouverts indépendamment. Le repli d’une section n’efface pas ses cases, car leurs valeurs résident dans l’état parent.

Chaque déclencheur répète son propre décompte de cases terminées, de sorte que la progression reste visible lorsque le contenu est replié. Les éléments natifs Header, Trigger et Content préservent les relations attendues et le comportement au clavier. Le marqueur plus pivote en fonction de data-state du déclencheur et respecte les préférences de réduction des animations, sans piloter l’ouverture au moyen d’un gestionnaire de clic distinct.

Consultez la spécification associée

Système de design Bits UI Composer l’anatomie complète d’une boîte de dialogue et lui confier la gestion du focus

Composer l’anatomie complète de la boîte de dialogue et lui confier la gestion du focus

La vérification utilise Dialog.Root, Trigger, Portal, Overlay, Content, Title, Description et Close. Le titre et la description sont de véritables éléments natifs, ce qui permet à Bits UI d’établir leurs relations d’accessibilité. Le portail place la superposition en dehors du flux normal du panneau de vérification.

Le contenu a une largeur responsive limitée et une hauteur maximale qui ne s’applique qu’à la superposition, avec un défilement possible pour les vérifications plus longues. La touche Échap ferme la boîte de dialogue sans effacer la liste. Gardez le déclencheur disponible comme cible de retour du focus au lieu de le supprimer à l’ouverture de la superposition.

Consultez la spécification associée

Système de design Bits UI Rendre explicites et réutilisables les règles visuelles de l’application

Rendre explicites et réutilisables les règles visuelles de l’application

CSS associe les états natifs coché et indéterminé au même rôle d’action, mais utilise des glyphes différents pour chacun. Un rôle de focus distinct correspond à la position du clavier : un contrôle peut donc rester visiblement sélectionné tout en indiquant l’endroit où aura lieu la prochaine action au clavier.

L’échelle d’espacement nommée comprend quatre, huit, douze, seize, vingt-quatre et trente-deux pixels. Les panneaux utilisent la valeur de vingt-quatre pixels sur ordinateur et celle de seize pixels sur les écrans étroits. Le tableau de spécifications documente ces choix concrets comme une configuration d’origine, afin que les lecteurs puissent les reproduire ou les remplacer sans confondre le style de démonstration avec une garantie du package.

Consultez la spécification associée

Système de design Bits UI Distinguer une validation manuelle d’un résultat de test automatisé

Distinguer une validation manuelle du résultat d’un test automatisé

La liste de vérification consigne les éléments cochés par le lecteur. Elle n’inspecte pas une autre page, n’exécute pas de tests au clavier et ne certifie pas la conformité en matière d’accessibilité. Le texte d’introduction et la description de la vérification précisent tous deux cette portée, ce qui est nécessaire puisque les six éléments portent sur des comportements d’accessibilité réels.

Le bouton Enregistrer est désactivé tant que les six cases ne sont pas cochées. Le message de sauvegarde indique que le lecteur a coché les six cases et que le résultat est conservé localement. Il est toujours possible d’ouvrir une vérification partielle pour examiner les éléments manquants, mais elle ne peut pas afficher de message de vérification terminée. Cette distinction donne du sens aux transitions d’état de l’exemple.

Consultez la spécification associée

Système de design Bits UI Effacer les messages de confirmation dès que les éléments justificatifs changent

Effacer les messages de réussite dès que les éléments de preuve changent

Toute modification individuelle ou globale efface l’état de sauvegarde. Ainsi, une confirmation de fin ne reste pas affichée après le retrait d’une coche. L’action Tout effacer rétablit également la section initialement ouverte et ferme la boîte de dialogue de vérification, ramenant chaque état associé à un point de départ connu.

La région d’état se trouve en dehors de la superposition : le message de sauvegarde reste donc dans le document après la fermeture de la boîte de dialogue. Il décrit l’état local de la page et ne laisse pas entendre qu’un rapport a été envoyé. Un rechargement efface la liste de vérification, ce qui convient à cette démonstration autonome.

Consultez la spécification associée

Système de design Bits UI Relier les éléments du composant aux libellés visibles

Relier les éléments du composant aux libellés visibles

Chaque case à cocher possède un identifiant stable et un libellé visible associé. Son état coché ou indéterminé est représenté par le contrôle natif ; la coche et le tiret sont décoratifs. Reliez à la fois la valeur booléenne checked et la valeur indeterminate calculée au contrôle global, afin qu’une sélection partielle ne soit pas annoncée comme un simple élément non coché.

Dialog.Title et Dialog.Description fournissent le nom et l’explication de la vérification grâce à l’anatomie native. Le portail sépare la superposition de la mise en page de l’accordéon, tandis que Dialog.Close reste l’action explicite de fermeture. La région d’état située à l’extérieur conserve le résultat de la sauvegarde après la fermeture de la superposition, qui ne le fait donc pas disparaître avec le contenu de la boîte de dialogue.

  • Associez le libellé visible à son contrôle.
  • Conservez un anneau de focus bien visible après l’application de styles personnalisés.
  • Ne supprimez pas les éléments de titre ou de description lors de la personnalisation d’une boîte de dialogue.

Consultez la spécification associée

Système de design Bits UI Exemples de composants

Liste de vérification complète pour Svelte 5

Composition native Bits UI avec modèles $state/$derived, cases à cocher contrôlées et boîte de dialogue de vérification utilisant un portail.

svelte
<script>
import {Accordion,Checkbox,Dialog} from 'bits-ui';
let groups=$state([{id:'keyboard',name:'Keyboard flow',description:'Move through the interface without a pointer.',checks:[{id:'focus',label:'Every action has a visible focus indicator.',done:false},{id:'order',label:'Focus follows the visual reading order.',done:false}]},{id:'forms',name:'Form correction',description:'Make a mistake and recover from it.',checks:[{id:'labels',label:'Each input has a persistent visible label.',done:false},{id:'errors',label:'Errors identify the field and explain the correction.',done:false}]},{id:'feedback',name:'Result feedback',description:'Confirm that the outcome is understandable.',checks:[{id:'status',label:'A status message describes the completed action.',done:false},{id:'color',label:'Meaning remains clear without color alone.',done:false}]}]);
let expanded=$state(['keyboard']),open=$state(false),saved=$state(false);
const complete=$derived(groups.reduce((sum,g)=>sum+g.checks.filter(c=>c.done).length,0));
function change(check,value){check.done=value;saved=false}
function all(value){groups.forEach(g=>g.checks.forEach(c=>c.done=value));saved=false}
function reset(){all(false);expanded=['keyboard'];open=false}
</script>
<main class="check-shell"><header><p class="eyebrow">INTERFACE REVIEW · MANUAL CHECKLIST</p><h1>Check the experience between the screens.</h1><p>Work through six practical checks, then review what you have marked. This is a personal checklist, not an automated accessibility test.</p></header><div class="check-layout"><section class="check-panel"><div class="bulk"><Checkbox.Root id="all-checks" checked={complete===6} indeterminate={complete>0&&complete<6} onCheckedChange={all} class="checkbox"><span aria-hidden="true">{complete===6?'✓':complete>0?'−':''}</span></Checkbox.Root><label for="all-checks">Mark all checks</label><span class="count">{complete}/6</span></div><Accordion.Root type="multiple" bind:value={expanded} class="accordion">{#each groups as group}<Accordion.Item value={group.id} class="accordion-item"><Accordion.Header class="accordion-heading"><Accordion.Trigger class="accordion-trigger"><span>{group.name}<small>{group.checks.filter(c=>c.done).length} of 2 checked</small></span><span class="plus" aria-hidden="true">+</span></Accordion.Trigger></Accordion.Header><Accordion.Content class="accordion-content"><p class="group-description">{group.description}</p>{#each group.checks as check}<div class="check-row"><Checkbox.Root id={check.id} checked={check.done} onCheckedChange={value=>change(check,value)} class="checkbox"><span aria-hidden="true">{check.done?'✓':''}</span></Checkbox.Root><label for={check.id}>{check.label}</label></div>{/each}</Accordion.Content></Accordion.Item>{/each}</Accordion.Root><Dialog.Root bind:open><Dialog.Trigger class="primary">Review checklist</Dialog.Trigger><Dialog.Portal><Dialog.Overlay class="overlay"/><Dialog.Content class="dialog"><Dialog.Title class="dialog-title">Your review snapshot</Dialog.Title><Dialog.Description class="dialog-description">{complete} of 6 checks are marked. Saving records your own review state; it does not certify the interface.</Dialog.Description><ul class="review-summary">{#each groups as group}<li><strong>{group.name}</strong><span>{group.checks.filter(c=>c.done).length} / 2</span></li>{/each}</ul>{#if complete<6}<p class="remaining">Return to the checklist to finish the remaining {6-complete} checks.</p>{/if}<div class="dialog-actions"><Dialog.Close class="secondary">Back to checks</Dialog.Close><button class="primary" disabled={complete<6} onclick={()=>{saved=true;open=false}}>Save completed review</button></div></Dialog.Content></Dialog.Portal></Dialog.Root><button class="reset" onclick={reset}>Clear all checks</button><p class="result" role="status">{saved?'Completed review saved locally. All six checks were marked by you.':'Progress stays in this preview until you reload.'}</p></section><aside class="check-notes"><div class="focus-art" aria-hidden="true"><span></span><i></i><b></b></div><p class="eyebrow">WHAT TO LOOK FOR</p><h2>Make the next action clear.</h2><p>A good check leaves evidence: where focus moved, what an error said, or how a result was announced.</p><dl><div><dt>Keyboard</dt><dd>Tab, Shift+Tab, Enter and Escape should support the relevant task.</dd></div><div><dt>Correction</dt><dd>Keep the user’s input and point to a specific next step.</dd></div><div><dt>Feedback</dt><dd>Describe the outcome in words as well as visual styling.</dd></div></dl></aside></div></main>

Référence du code

  • Le contrôle principal déduit les états coché et indéterminé à partir des six cases individuelles.
  • La sauvegarde est conditionnée à la vérification complète, et non à l’ouverture de la boîte de dialogue.
  • Cette fiche de travail manuelle n’effectue pas d’audit d’accessibilité.

Configuration visuelle d’origine complète

Couleurs sémantiques nommées, échelle d’espacement, sélecteurs natifs data-state et styles de superposition adaptatifs.

css
:root{--app-canvas:#f4f3f8;--app-surface:#ffffff;--app-ink:#2d2938;--app-muted:#746d80;--app-line:#e3dfeb;--app-action:#604c88;--app-on-action:#fff;--app-focus:#9a80ce;--app-soft:#eee8f7;--app-radius:12px;--app-space-1:4px;--app-space-2:8px;--app-space-3:12px;--app-space-4:16px;--app-space-6:24px;--app-space-8:32px}html,body,#app{height:auto;min-height:0;margin:0}*{box-sizing:border-box}body{font-family:system-ui,sans-serif;background:var(--app-canvas);color:var(--app-ink)}button{font:inherit;cursor:pointer}button:disabled{opacity:.45;cursor:default}button:focus-visible{outline:3px solid var(--app-focus);outline-offset:3px}.check-shell{max-width:1080px;margin:auto;padding:var(--app-space-8)}.eyebrow{font-size:10px;letter-spacing:.14em;font-weight:700;color:var(--app-muted)}h1{font-size:34px;line-height:1.15;max-width:710px;margin:12px 0}header>p:last-child{font-size:14px;line-height:1.7;max-width:640px;color:var(--app-muted)}.check-layout{display:grid;grid-template-columns:minmax(0,1fr) 270px;gap:var(--app-space-6);margin-top:28px}.check-panel{background:var(--app-surface);border:1px solid var(--app-line);border-radius:16px;padding:var(--app-space-6);min-width:0}.bulk{display:flex;align-items:center;gap:12px;font-size:14px;font-weight:600;padding-bottom:24px}.count{margin-left:auto;color:var(--app-muted);font-size:12px}.checkbox{width:22px;height:22px;flex-shrink:0;border:1px solid #aaa1ba;background:white;border-radius:5px;display:inline-flex;align-items:center;justify-content:center;padding:0;line-height:1}.checkbox[data-state=checked],.checkbox[data-state=indeterminate]{background:var(--app-action);border-color:var(--app-action);color:var(--app-on-action)}.accordion{margin-bottom:24px}.accordion-item{border-top:1px solid var(--app-line)}.accordion-item:last-child{border-bottom:1px solid var(--app-line)}.accordion-heading{margin:0;font-size:16px}.accordion-trigger{width:100%;border:0;background:transparent;display:flex;align-items:center;justify-content:space-between;text-align:left;padding:20px 0;color:var(--app-ink);font-weight:600}.accordion-trigger small{display:block;font-weight:400;font-size:11px;color:var(--app-muted);margin-top:6px}.plus{font-size:23px;font-weight:400;transition:transform .15s}.accordion-trigger[data-state=open] .plus{transform:rotate(45deg)}.accordion-content{padding:0 0 20px}.group-description{font-size:12px;line-height:1.6;color:var(--app-muted);margin:0 0 16px}.check-row{display:flex;align-items:flex-start;gap:12px;margin-top:14px}.check-row label{font-size:13px;line-height:1.6;cursor:pointer}.primary,.secondary{border:1px solid transparent;border-radius:8px;padding:12px 16px;font-size:13px;font-weight:600}.primary{background:var(--app-action);color:var(--app-on-action)}.secondary{background:white;color:var(--app-ink);border-color:var(--app-line)}.reset{border:0;background:transparent;color:var(--app-muted);font-size:12px;padding:12px}.result{font-size:12px;line-height:1.6;color:var(--app-muted);margin:18px 0 0}.check-notes{min-width:0;padding:0 4px}.check-notes h2{font:400 29px/1.2 Georgia,serif}.check-notes>p:not(.eyebrow){font-size:13px;line-height:1.7;color:var(--app-muted)}.check-notes dl>div{padding:14px 0;border-top:1px solid var(--app-line)}.check-notes dt{font-size:13px;font-weight:600}.check-notes dd{font-size:12px;line-height:1.7;color:var(--app-muted);margin:5px 0 0}.focus-art{height:165px;background:#e6e0ef;border-radius:12px;position:relative;overflow:hidden;margin-bottom:24px}.focus-art span{position:absolute;width:140px;height:85px;left:35px;top:44px;background:white;border-radius:8px;transform:rotate(-9deg);box-shadow:0 0 0 6px #b3a3cd}.focus-art i{position:absolute;width:75px;height:13px;background:#b7adc6;left:60px;top:61px;transform:rotate(-9deg)}.focus-art b{position:absolute;width:72px;height:28px;background:#695587;left:87px;top:91px;border-radius:5px;transform:rotate(-9deg)}.overlay{position:fixed;inset:0;background:#21193180;z-index:20}.dialog{position:fixed;z-index:21;left:50%;top:50%;transform:translate(-50%,-50%);width:min(440px,calc(100% - 28px));max-height:calc(100vh - 28px);overflow:auto;background:white;padding:24px;border-radius:14px;box-shadow:0 20px 80px #23193640}.dialog-title{font-size:23px;margin:0 0 12px}.dialog-description,.remaining{font-size:13px;line-height:1.7;color:var(--app-muted)}.review-summary{padding:0;list-style:none}.review-summary li{display:flex;justify-content:space-between;gap:12px;padding:12px 0;border-bottom:1px solid var(--app-line);font-size:13px}.dialog-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:22px}@media(max-width:740px){.check-layout{grid-template-columns:minmax(0,1fr)}.check-shell{padding:20px}h1{font-size:29px}}@media(max-width:360px){.check-shell{padding:14px}.check-panel,.dialog{padding:16px}.check-panel>.primary,.dialog-actions>*{width:100%}}@media(prefers-reduced-motion:reduce){.plus{transition:none}}

Référence du code

  • Il s’agit des variables d’origine --app-*, et non d’une palette officielle de Bits.
  • Les styles de focus et de réduction des animations sont inclus.
  • Seule la superposition utilise une hauteur maximale relative à la fenêtre d’affichage.
04

Configuration de l’agent du système de design Bits UI

Point de départ de l’implémentation

Vérifié avec Bits UI 2.19.5 et Svelte 5.57.1. La feuille de style d’origine complète est requise ; Bits UI ne fournit ni couleurs par défaut ni mise en page.

javascript
// npm create vite@latest bits-review -- --template svelte
// cd bits-review && npm install
// npm install [email protected] [email protected]
// Save the complete examples as src/App.svelte and src/style.css.
// src/main.js:
import {mount} from 'svelte';
import App from './App.svelte';
import './style.css';
mount(App, {target:document.querySelector('#app')});
// index.html: <div id="app"></div><script type="module" src="/src/main.js"></script>
// npm run dev

Un prompt pour votre projet

Prompt pour l’agent IA
Utilisez Bits UI 2.19.5 et Svelte 5 pour créer l’interface de vérification manuelle fournie. Répartissez six vérifications dans trois sections Accordion, calculez les états global coché et indéterminé à partir des réponses individuelles et conservez les réponses lorsque les sections sont repliées. Assemblez toutes les parties de Dialog pour la vérification, autorisez une inspection incomplète et désactivez Enregistrer tant que les six éléments ne sont pas cochés. Toute modification d’une réponse invalide les commentaires enregistrés ; Tout effacer rétablit l’état initial des sections et ferme la vérification. Incluez le CSS complet et présentez les résultats comme des vérifications locales cochées par le lecteur, et non comme une certification automatisée de l’accessibilité.
05

Sources et périmètre du système de design Bits UI

Bits UI 2.19.5 avec Svelte 5.57.1. Jetons d’application et illustrations d’origine. Il s’agit d’une liste de vérification manuelle avec état local, et non d’un audit ou d’une certification automatisés de l’accessibilité.