@zevra/ui 0.29.0 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/DECISIONS.md CHANGED
@@ -1403,3 +1403,27 @@ Le jour où la suite dépasse la douzaine, c'est une autre conversation.
1403
1403
  Ce qui n'a **pas** été repris de la maquette : les angles arrondis des
1404
1404
  tuiles. La suite est passée à l'angle vif le 25/08, partout, et un panneau
1405
1405
  d'applications n'est pas une exception.
1406
+
1407
+ ## Le drapeau qui se prenait pour un composant (28/08/2026, 0.29.1)
1408
+
1409
+ `rail.js` marquait « déjà armé » en posant `data-zv-rail` sur `<html>` —
1410
+ le nom même de l'attribut qui DÉSIGNE un rail. Son propre sélecteur,
1411
+ `[data-zv-rail]`, ramassait donc `<html>` : **la page entière devenait un
1412
+ rail**.
1413
+
1414
+ Sur une page qui a un vrai rail, cela ne se voyait pas. Sur une page qui
1415
+ n'en a pas — la seule où ça compte — `a[href^="#"]` ramassait tous les
1416
+ liens d'ancre, boutons compris, et le premier recevait
1417
+ `.zv-rail__item--on`. Or cette classe pose `color: var(--accent-deep)` :
1418
+ un appel à l'action indigo sur fond indigo, illisible.
1419
+
1420
+ Constaté sur `/bootcamp` : « Candidater pour octobre » était le premier
1421
+ lien d'ancre de la page.
1422
+
1423
+ Le drapeau s'appelle désormais `data-zv-rail-arme`, et `rails()` écarte
1424
+ explicitement `<html>` et `<body>` — ceinture et bretelles, parce qu'un
1425
+ consommateur peut écrire ce qu'il veut sur la racine.
1426
+
1427
+ Un test garde la classe entière de fautes : dans tout module livré, aucun
1428
+ drapeau posé sur `documentElement.dataset` ne peut porter le nom d'un
1429
+ attribut que le même module utilise comme sélecteur.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zevra/ui",
3
- "version": "0.29.0",
3
+ "version": "0.29.1",
4
4
  "description": "Design system Zevra « Encre & Papier » — tokens, CSS des composants et logos officiels.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
package/src/rail.js CHANGED
@@ -27,14 +27,26 @@
27
27
  */
28
28
  (() => {
29
29
  if (typeof document === 'undefined') return
30
- if (document.documentElement.dataset.zvRail === 'on') return
31
- document.documentElement.dataset.zvRail = 'on'
30
+ /* ⚠️ Le drapeau d'armement ne doit JAMAIS reprendre le nom de l'attribut
31
+ * qui désigne un rail. Il s'appelait `data-zv-rail`, comme le composant :
32
+ * posé sur <html>, il faisait de la PAGE ENTIÈRE un rail. Sur une page
33
+ * sans rail — la seule où ça se voit —, `a[href^="#"]` ramassait alors
34
+ * tous les liens d'ancre, boutons compris, et le premier d'entre eux
35
+ * recevait `.zv-rail__item--on` : un appel à l'action en indigo sur fond
36
+ * indigo, illisible. Constaté sur /bootcamp. */
37
+ if (document.documentElement.dataset.zvRailArme === 'on') return
38
+ document.documentElement.dataset.zvRailArme = 'on'
32
39
 
33
40
  /** Hauteur de la ligne de lecture, en fraction du viewport. 45 % : un peu
34
41
  * au-dessus du milieu, là où l'œil se pose vraiment. */
35
42
  const LIGNE = 0.45
36
43
 
37
- const rails = () => Array.from(document.querySelectorAll('[data-zv-rail]'))
44
+ /* Ceinture et bretelles : <html> et <body> ne sont jamais des rails, quoi
45
+ * qu'un consommateur écrive dessus. */
46
+ const rails = () =>
47
+ Array.from(document.querySelectorAll('[data-zv-rail]')).filter(
48
+ (el) => el !== document.documentElement && el !== document.body,
49
+ )
38
50
 
39
51
  const suivre = (rail) => {
40
52
  const entrees = Array.from(rail.querySelectorAll('a[href^="#"]'))