# Frontend — Patterns : Général > Extrait de la base de connaissance Lead_tech. Voir `knowledge/frontend/patterns/README.md` pour l'index complet. --- ## Pattern : Focus visible interne pour champs sous overflow clip ### Synthèse - **Objectif** : préserver le focus visible des champs `` / `` sans wrapper JS ### Synthèse - **Objectif** : aligner les inputs date HTML5 sur l'identité visuelle du thème via une règle CSS globale, sans wrapper JS custom. - **Contexte** : projet avec un thème dark/light custom où les inputs date natifs (icône calendrier blanche, placeholder gris OS, popover light par défaut) cassent le design. - **Quand l'utiliser** : 80 % des cas (audit log, formulaires admin, profils) où la datepicker custom serait du sur-engineering. - **Quand l'éviter** : - validation custom synchrone (range, dates blackout, format spécifique) - format d'affichage différent (DD/MM vs MM/DD vs ISO) - intégration profonde dans un design system ### Analyse - **Avantages** : - `color-scheme` + `accent-color` donnent un popover natif cohérent gratuitement - filtre SVG pour teinter l'icône calendrier - zéro JavaScript, zéro bundle additionnel - **Limites / vigilance** : - **Firefox** : `accent-color` respecté, mais pas de pseudo-element pour customiser le placeholder - **Safari iOS** : popover sheet OS, peu personnalisable. Acceptable car cohérent avec le reste des UI iOS natives - filtre `filter()` à calibrer pour matcher la couleur du thème — chaque thème nécessite son tuning ### Validation - Validé le : 27-04-2026 - Contexte technique : CSS / inputs date HTML5 — RL799_V2 ### Pattern minimal ```css /* Toutes les variantes de pickers HTML5 */ input[type='date'], input[type='datetime-local'], input[type='time'], input[type='month'], input[type='week'] { color-scheme: dark; /* ou 'light' selon le thème de l'app */ accent-color: var(--color-accent); } /* Place-holder OS (jj/mm/aaaa) — couleur soft */ input[type='date']::-webkit-datetime-edit-fields-wrapper, input[type='datetime-local']::-webkit-datetime-edit-fields-wrapper { color: var(--color-text-soft); } /* Une fois saisie, couleur normale */ input[type='date']:not(:placeholder-shown)::-webkit-datetime-edit-fields-wrapper { color: var(--color-text-primary); } /* Icône calendrier teintée (filtre SVG noir → couleur d'accent soft) */ input[type='date']::-webkit-calendar-picker-indicator, input[type='datetime-local']::-webkit-calendar-picker-indicator, input[type='time']::-webkit-calendar-picker-indicator, input[type='month']::-webkit-calendar-picker-indicator, input[type='week']::-webkit-calendar-picker-indicator { /* Calibrer pour matcher la couleur du thème */ filter: invert(70%) sepia(40%) saturate(450%) hue-rotate(5deg) brightness(95%); cursor: pointer; opacity: 0.85; transition: opacity 0.15s ease; } ``` ### Anti-patterns - Construire un mini calendrier JS custom pour gagner 5 % d'esthétique → effort énorme (a11y clavier, focus management, mobile, edge cases), bénéfice marginal - Hardcoder les couleurs `filter()` au lieu d'utiliser des tokens du thème - Restyler sans `color-scheme: dark/light` → le popover natif reste en mode clair sur thème sombre --- ## Pattern : UI pour journaux / audit logs / timelines ### Synthèse - **Objectif** : passer d'un rendu naïf en cards uniformes "acteur · code · cible (uuid) · metadata" à une lecture rapide pour l'admin en surveillance, sans toucher au backend. - **Contexte** : tout projet finit par afficher un journal d'événements (audit, activité, historique, timeline) avec metadata variable. - **Quand l'utiliser** : journal avec ≥ 10 types d'actions et besoin de scanner rapidement. - **Quand l'éviter** : log technique brut destiné aux devs (un `
` peut suffire).

### Analyse

- **Avantages** :
  - 5 patterns combinables qui améliorent radicalement la scanabilité
  - aucun changement backend (le DTO reste plat)
- **Limites / vigilance** :
  - reset de l'état d'expansion à chaque rechargement (l'expansion est éphémère, pas une préférence durable)

### Validation

- Validé le : 27-04-2026
- Contexte technique : Vue 3 / CSS — RL799_V2 (Journal d'audit admin, 45+ types d'actions)

### 1. `` dérivé du préfixe label

Quand l'API retourne un catalogue d'actions avec convention `Catégorie — Libellé` (ex : `Soirée — annulation`, `Tenue — création`), dériver les groupes côté front au lieu de modifier le DTO.

```typescript
const groupsFromLabels = computed(() => {
  const groups = new Map();
  for (const opt of catalog.value) {
    const sep = opt.label.indexOf(' — ');
    const category = sep > 0 ? opt.label.slice(0, sep) : 'Divers';
    groups.set(category, [...(groups.get(category) ?? []), opt]);
  }
  return Array.from(groups.entries())
    .sort(([a], [b]) => a.localeCompare(b, 'fr', { sensitivity: 'base' }));
});
```

```html

```

Bénéfice : 1 seul clic pour filtrer (vs cascade 2 selects), accessible natif, zéro modif backend.

### 2. Code couleur sémantique par catégorie

Barre de couleur de 3 px à gauche de chaque card de la liste, mappée sur la catégorie de l'événement. Transforme un mur de cards uniformes en lecture instantanée.

```css
.log-item {
  border-left: 3px solid var(--log-cat-color, var(--color-border));
}
.log-item--cat-soiree { --log-cat-color: var(--color-accent-primary); }
.log-item--cat-rgpd   { --log-cat-color: var(--color-accent-danger); }
```

Pourquoi pas le fond complet : trop bruyant, perd la sobriété d'un journal admin. La barre latérale signale sans crier.

### 3. UUIDs rétrogradés en monospace soft

Les UUIDs / IDs techniques affichés en plein texte cassent la lecture humaine. Les détecter via regex et les rendre en font monospace + couleur soft + taille réduite, sans les masquer (utiles pour forensics).

```typescript
const UUID_RE = /[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}/gi;
```

```css
.uuid {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 0.78em;
  color: var(--color-text-soft);
  word-break: break-all;
}
```

### 4. Date relative + absolue en tooltip

Pour la lecture humaine, "il y a 5 min" / "hier" / "il y a 3 j" bat toujours "27 avril 2026 à 08:37". La date absolue reste accessible en `title` du `