Table

Table de données en lecture seule, lisible et accessible. Le composant le plus utilisé du système (tables de tokens). Deux formes — composant piloté par données et classe sur un <table> statique — partageant les mêmes tokens. Read-only, scannable, accessible data table. The system's most-used component (token tables). Two forms — data-driven component and a class on a static <table> — sharing the same tokens.

Aperçu — séparateurs (défaut)Preview — dividers (default)

Exemple de tokens d'espacementSpacing token example
ÉchelonStep RôleRole ValeurValue
space-1Espacement minimalMinimal spacing4px
space-2Contrôles densesDense controls8px
space-3Padding standardStandard padding12px
space-4Espacement de contrôleControl spacing16px

Zébrage (option)Striped (option)

Exemple de tokens d'espacementSpacing token example
ÉchelonStep RôleRole ValeurValue
space-1Espacement minimalMinimal spacing4px
space-2Contrôles densesDense controls8px
space-3Padding standardStandard padding12px
space-4Espacement de contrôleControl spacing16px

Règles absoluesAbsolute rules

  • <table> sémantique réel — jamais des <div> en grilleReal semantic <table> — never grid <div>s
  • scope="col" sur chaque <th> + <caption> (visible ou masqué)scope="col" on every <th> + <caption> (visible or hidden)
  • Valeurs numériques alignées à droiteNumeric values right-aligned
  • Jamais de table pour faire de la mise en pageNever a table for layout
  • Jamais de couleur/espacement codé en durNever hardcoded color/spacing

Tokens de composantComponent tokens

Token CSSRéférenceReferenceValeurValue
--agtc-component-table-default-header-backgroundsemantic.color.background.subtle#f0f0f0
--agtc-component-table-default-header-textsemantic.color.text.secondary#646464
--agtc-component-table-default-cell-textsemantic.color.text.primary#202020
--agtc-component-table-default-bordersemantic.color.border.default#e8e8e8
--agtc-component-table-default-row-hoversemantic.color.background.hover#fafafa
--agtc-component-table-default-stripesemantic.color.background.subtle#f0f0f0
--agtc-component-table-default-caption-textsemantic.color.text.secondary#646464
--agtc-component-table-default-radiussemantic.radius.card10px
--agtc-component-table-default-font-sizesemantic.typography.label.size0.875rem
--agtc-component-table-padding-xprimitive.space.312px
--agtc-component-table-padding-y-compactprimitive.space.28px
--agtc-component-table-padding-y-comfortableprimitive.space.312px

AccessibilitéAccessibility

  • Structure <table>/<thead>/<tbody> sémantique réelleReal semantic <table>/<thead>/<tbody> structure
  • scope="col" — association cellule↔en-têtescope="col" — cell↔header association
  • <caption> décrit la table (WCAG 1.3.1) — masquable via caption-hidden<caption> describes the table (WCAG 1.3.1) — hideable via caption-hidden
  • Conteneur de scroll focalisable au clavier, indicateur d'overflow visibleKeyboard-focusable scroll container, visible overflow indicator
  • Contraste 4.5:1 vérifié (texte gris.12 sur blanc/gris.3)4.5:1 contrast verified (gray.12 text on white/gray.3)

ImplémentationImplementation

<!-- Composant piloté par données -->
<agtc-table caption="Tokens du badge" caption-hidden></agtc-table>
<script>
  const t = document.querySelector('agtc-table');
  t.columns = [
    { label: 'Token CSS', align: 'start', width: '46%' },
    { label: 'Référence', align: 'start' },
    { label: 'Valeur',    align: 'end' },
  ];
  t.rows = [
    ['--agtc-badge-neutral-background', 'semantic.color.background.subtle', '#f0f0f0'],
  ];
</script>

<!-- Classe sur un table statique (light DOM, sans JS) -->
<table class="agtc-table striped">
  <caption class="visually-hidden">Tokens du badge</caption>
  <thead><tr><th scope="col">Token</th><th scope="col" class="num">Value</th></tr></thead>
  <tbody><tr><td><code>--agtc-badge-neutral-text</code></td><td class="num">#646464</td></tr></tbody>
</table>

DOs et DON'TsDOs and DON'Ts

À faireDo

  • Toujours une <caption> (masquée si besoin) et scopeAlways a <caption> (hidden if needed) and scope
  • Aligner les valeurs numériques à droite (class="num")Right-align numeric values (class="num")
  • 1ʳᵉ colonne = identifiant lisible, colonnes ordonnées par importance1st column = readable identifier, columns ordered by importance

À éviterDon't

  • Des <div> simulant une table — inaccessible<div>s faking a table — inaccessible
  • Une table pour disposer des éléments non tabulairesA table to lay out non-tabular elements
  • Croire que la v1 trie/filtre — c'est en lecture seule (porte ouverte)Expecting v1 to sort/filter — it's read-only (door open)

UX Patterns Reference

Patterns approved via the ux-pattern-review workflow (ADR-036/040). Decision: T1–T10 all approved.

PatternSourceAppliedJustification
Semantic HTML + scope="col"Smashing — Table PatternsCell↔header association (missing from the site's original HTML)
<caption> describing the tableSmashingHideable via caption-hidden (WCAG 1.3.1)
Text alignment left, numeric rightNN/g — Data Tablesalign per column, default start
Row separators (zebra striping optional)NN/gSeparators by default, striped optional — user choice
Row hoverNN/grow-hover
Sticky headerNN/g · SmashingOptional via sticky-header
Horizontal scroll + overflow indicatorSmashingoverflow-x container + edge shadows (long token names)
1st column = readable identifier, order = importanceNN/gToken table convention
compact density by defaultDashboard Design Patternsdensity="comfortable" available
Sort / filter / paginationNN/g✅ (open door)Out of v1: static docs tables; columns/rows API designed to accommodate them without breaking changes (future column.sortable + @sort)
Contribuer à ce projet Contribute to this project

Ce système est ouvert aux contributions — tokens, composants, décisions architecturales, corrections d'accessibilité ou documentation. Toute amélioration est bienvenue. This system welcomes contributions — tokens, components, architectural decisions, accessibility fixes, or documentation. Every improvement counts.

Voir sur GitHub View on GitHub