docs(knowledge): capitalisation frontend — intégration du triage local (mai-juin 2026)

Triage et intégration des propositions frontend du buffer 95_a_capitaliser.md
(lot local RL799_V2/Vue3 + app-alexandrie/RN-Expo, mai-juin 2026).

~73 entrées intégrées sur knowledge/frontend/ + 1 nouveau fichier, dont :
- patterns/state.md : race-token partagé latest-wins (fusion 3 props), capture sync anti-race,
  event bus timestamp, clé cache composite, état dérivé = computed
- risques/state.md : 9 risques Zustand/store (fetchId reset, useRef remount, re-fetch infini
  sur [], flag optimiste écrasé, cache détail/liste stale, latch sans reset, :key index)
- patterns/navigation.md : Expo Router (tab bar, useFocusEffect, Href typé, routing pur fusionné)
- patterns/general.md : helpers temps purs, composants génériques + skeleton, fail-fast, touch target
- risques/general.md : 24 risques (sweep statique, filtre client liste paginée, hooks avant return,
  a11y VoiceOver/disabled, redirection allowlist, RangeError toISOString, section i18n...)
- design-tokens (cluster theming light/dark MD3), tests, performance, react-native, nextjs
- NOUVEAU risques/responsive.md (gating par capacité d'input + checklist régressions mobile)
- READMEs patterns/risques mis à jour

Doublons inter-fichiers évités (vérifié : aucune ancre dupliquée introduite).
Rejets (doublons 91/9/87), reciblages workflow (156/257) et bloc 32 (CLAUDE projet) non intégrés ici.
Source 95_a_capitaliser.md non purgée (purge en fin de capitalisation complète).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
MaksTinyWorkshop
2026-06-25 15:31:53 +02:00
parent f1b783407a
commit 5f5c87296e
15 changed files with 2439 additions and 12 deletions
+59
View File
@@ -320,3 +320,62 @@ const routes = [
- Contexte technique : Expo Router — app-alexandrie 25-06-2026
---
<a id="risque-icone-decouplee-destination-renommage-route"></a>
## Découplage icône / destination lors d'un renommage de route
### Risques
- Lors du renommage d'une route (ex. `/settings``/profile`), l'URL, l'`accessibilityLabel` et le texte visible sont mis à jour, mais **l'icône** est oubliée
- Le grep capte les `href=`/`router.push` mais pas les `<Icon name="..." />`, souvent rangés dans des constantes éloignées de la logique de nav
### Symptômes
- L'utilisateur voit une icône engrenage menant à un écran "Profil"
### Bonnes pratiques / mitigations
À chaque callsite d'une route renommée, auditer **4 dimensions**, pas seulement l'URL :
1. La destination (`href`, `router.push`, `<Redirect>`)
2. L'`accessibilityLabel`
3. Le texte visible (`label`, `title`)
4. **L'icône** (`<Ionicons name="..." />`, `<MaterialIcons name="..." />`)
```tsx
// ❌ engrenage vers un écran Profil
<Pressable onPress={() => router.push('/(tabs)/profile')} accessibilityLabel="Profil">
<Ionicons name="settings-outline" size={28} />
</Pressable>
// ✅
<Pressable onPress={() => router.push('/(tabs)/profile')} accessibilityLabel="Profil">
<Ionicons name="person-circle-outline" size={28} />
</Pressable>
```
- Penser aussi aux constantes de tabs (`TAB_CONFIG`, `TABS`) lors du grep
- Contexte technique : React Native / Expo Router — app-alexandrie review IA-v2.1, 27-05-2026
---
<a id="risque-nav-activation-path-vs-query"></a>
## Sous-items de nav partageant un path, distincts par la query → activation sur le path seul
### Risques
- Deux liens `/x?mode=a` et `/x?mode=b` dans une sidebar dont l'activation fait `route.path.startsWith(item.to)`
- Double piège : si `item.to` est le path pur (`/x`), les deux s'allument ; si `item.to` contient déjà la query (`/x?mode=a`), aucun ne s'allume (`route.path` vaut `/x` sans query)
### Symptômes
- Deux entrées de sidebar actives simultanément, ou aucune active, sur des routes qui ne diffèrent que par la query
### Bonnes pratiques / mitigations
1. Garder `item.to` comme **path pur** pour la cible router-link, OU splitter path/query avant de passer à router-link (Vue Router encode le `?` si on passe une string `path?query` → la route ne matche pas)
2. Passer `{ path, query }` séparés à router-link, pas une string concaténée
3. Ajouter un discriminant explicite `queryMatch: { key, value }` et tester `route.query[key] === value` pour l'activation
- Contexte technique : Vue 3 / Vue Router — RL799 (sidebar admin Surveillants, query `?office=`), revue adversariale de spec, 14-06-2026
---