ADR-063
`agtc-feature-card` component: editorial card V2
Date: 2026-06-25 Status: Accepted Decision-makers: Guilherme Negreiros (Principal Designer) Tags: component, v2, marketing, accessibility
Context
The V2 redesign introduces a "Value by role" section on the home page and editorial blocks on the secondary marketing pages. These elements require a reusable component with:
- A functional icon (a signal before the heading is read)
- A short heading
- A body of text
- A visual interactivity affordance (animated border-bottom on hover)
The .v2-role-card CSS class already existed in site/build.js but with no component encapsulation. The UX review confirmed the need for a formal Web Component.
Decision
Create agtc-feature-card (Lit) with:
headingattribute (title)heading-levelattribute 1-6, default 3 (P5 — hierarchical flexibility)variantattribute:"default"|"marketing"(P6 — contextual variant)- Named
iconslot for a 20×20 SVG (P1 — icon + title duo) - Default slot for the body
prefers-reduced-motionin the shadow CSS (P7 — priority)role="heading"+ dynamicaria-level(P8 — SR accessibility)
UX patterns applied (review 2026-06-25)
| # | Pattern | Source | Decision |
|---|---|---|---|
| P1 | Icon + title duo | NN/g — Icons & Indicators | ✅ Applied |
| P2 | Controlled interactivity affordance | IxDF — UI Patterns | ✅ Applied |
| P3 | Non-interactivity by default | Smashing — Card patterns | ✅ Applied |
| P4 | Touch targets ≥ 24×24px (WCAG 2.5.8) | IxDF — Touch Targets | ✅ Compliant |
| P5 | Flexible heading level | NN/g — Visual Hierarchy | ✅ heading-level attribute |
| P6 | Contextual variant | Dashboard Design Patterns | ✅ default / marketing |
| P7 | prefers-reduced-motion | IxDF — Accessibility | ✅ Priority — border visible from the start |
| P8 | Accessible markup | IF — Data Patterns | ✅ role + aria-level |
Alternatives considered
Option A — pure CSS (.v2-role-card class): rejected. No encapsulation, no attribute contract, no guarantee of correct usage by agents or teams.
Option B — Lit with a native <h3> heading: rejected. Hardcoded heading level — potential jump depending on the page context (P5).
Option C — Lit with flexible heading-level (chosen): role="heading" + dynamic aria-level. Compatible with any page context.
Consequences
agtc-feature-cardis registered incomponents/index.jsand bundled intoagtc.js- The guideline is at
guidelines/components/feature-card.md - The Storybook story is at
components/agtc-feature-card.stories.js - The
.v2-role-cardclass insite/build.jsremains for the home page (static HTML) —
migration to <agtc-feature-card> to be planned in a dedicated project
- Any modification of the variant or behavior requires a new UX review
Files affected
components/agtc-feature-card.js— newcomponents/agtc-feature-card.stories.js— newcomponents/index.js— import addedguidelines/components/feature-card.md— new guideline
Date : 2026-06-25 Statut : Accepté Décideurs : Guilherme Negreiros (Principal Designer) Tags : composant, v2, marketing, accessibilité
Contexte
Le redesign V2 introduit une section "Valeur par rôle" sur la home et des blocs éditoriaux sur les pages secondaires marketing. Ces éléments nécessitent un composant réutilisable avec :
- Une icône fonctionnelle (signal avant la lecture du titre)
- Un heading court
- Un corps de texte
- Une affordance d'interactivité visuelle (border-bottom animé au hover)
La classe CSS .v2-role-card existait déjà dans site/build.js mais sans encapsulation composant. La revue UX a confirmé le besoin d'un Web Component formel.
Décision
Créer agtc-feature-card (Lit) avec :
- Attribut
heading(titre) - Attribut
heading-level1-6, défaut 3 (P5 — flexibilité hiérarchique) - Attribut
variant:"default"|"marketing"(P6 — variante contextuelle) - Slot
iconnommé pour SVG 20×20 (P1 — duo icône + titre) - Slot défaut pour le corps
prefers-reduced-motiondans le shadow CSS (P7 — prioritaire)role="heading"+aria-leveldynamique (P8 — accessibilité SR)
Patterns UX appliqués (revue 2026-06-25)
| # | Pattern | Source | Décision |
|---|---|---|---|
| P1 | Icône + titre en duo | NN/g — Icons & Indicators | ✅ Appliqué |
| P2 | Affordance d'interactivité contrôlée | IxDF — UI Patterns | ✅ Appliqué |
| P3 | Non-interactivité par défaut | Smashing — Card patterns | ✅ Appliqué |
| P4 | Cibles tactiles ≥ 24×24px (WCAG 2.5.8) | IxDF — Touch Targets | ✅ Conforme |
| P5 | Heading niveau flexible | NN/g — Visual Hierarchy | ✅ Attribut heading-level |
| P6 | Variante contextuelle | Dashboard Design Patterns | ✅ default / marketing |
| P7 | prefers-reduced-motion | IxDF — Accessibilité | ✅ Prioritaire — border visible dès le départ |
| P8 | Markup accessible | IF — Data Patterns | ✅ role + aria-level |
Alternatives considérées
Option A — CSS pur (classe .v2-role-card) : rejetée. Pas d'encapsulation, pas de contrat attribut, pas de garantie d'usage correct par les agents ou les équipes.
Option B — Lit avec heading natif <h3> : rejetée. Niveau de heading hardcodé — saut potentiel selon le contexte de la page (P5).
Option C — Lit avec heading-level flexible (choisie) : role="heading" + aria-level dynamique. Compatible avec tout contexte de page.
Conséquences
agtc-feature-cardest enregistré danscomponents/index.jset bundlé dansagtc.js- La guideline est à
guidelines/components/feature-card.md - La Storybook story est à
components/agtc-feature-card.stories.js - La classe
.v2-role-carddanssite/build.jsreste pour la home (HTML statique) — migration vers<agtc-feature-card>à planifier lors d'un chantier dédié - Toute modification de variante ou de comportement requiert une nouvelle revue UX
Fichiers impactés
components/agtc-feature-card.js— nouveaucomponents/agtc-feature-card.stories.js— nouveaucomponents/index.js— import ajoutéguidelines/components/feature-card.md— nouvelle guideline