@zevra/ui 0.36.0 → 0.38.0

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
@@ -1655,3 +1655,84 @@ C'est exactement ce qu'il a fait au premier jet, et il avait raison.
1655
1655
  Il a aussi rendu un service immédiat : un `git checkout` d'essai avait
1656
1656
  annulé le nettoyage de `tokens.css`, encore non commité. Le garde a signalé
1657
1657
  la régression dans la minute.
1658
+
1659
+ ## L'infobulle se pose en bas de l'écran sur téléphone (29/08/2026, 0.37.0)
1660
+
1661
+ Le commentaire de `.zv-tooltip` annonçait la dette : « le centrage sur une
1662
+ cible collée au bord peut encore la décaler : limite connue, une variante
1663
+ d'ancrage latéral s'arbitrera si le cas se présente ». Le cas s'est présenté,
1664
+ et il est mesurable.
1665
+
1666
+ Sur le tableau de bord de mcp-factory, à 375 px, le document fait **416 px**
1667
+ de large : barre de défilement horizontale sur toute la page. En masquant les
1668
+ seules infobulles il retombe à 360. Elles sont la cause ENTIÈRE, le bloc de
1669
+ code n'y est pour rien.
1670
+
1671
+ Le mécanisme : `left: 50%; transform: translateX(-50%)` sur une cible proche
1672
+ du bord droit. Le plafond `max-width: calc(100vw - 40px)` ne corrigeait rien,
1673
+ puisque ce n'est pas la largeur qui déborde mais la POSITION.
1674
+
1675
+ ⚠️ Le débordement par la droite, lui, s'entend : il crée un défilement
1676
+ horizontal sur TOUTE la page, y compris là où l'infobulle n'est pas. C'est ce
1677
+ qui le rend cher, et facile à imputer au mauvais bloc.
1678
+
1679
+ **La variante d'ancrage latéral a été écartée.** Elle aurait obligé chaque
1680
+ app à choisir le bon côté pour chaque bulle (quarante et une sur ce seul
1681
+ tableau de bord) et à le refaire à chaque déplacement d'un bouton. Une
1682
+ correction qui se re-décide à chaque intégration n'est pas une correction.
1683
+
1684
+ Sous le point de rupture, la bulle CESSE DE FLOTTER au-dessus de sa cible :
1685
+ elle se pose en bas de l'écran, pleine largeur, en `position: fixed`. Le
1686
+ débordement devient impossible par construction, quelle que soit la place de
1687
+ la cible. C'est aussi le seul endroit où une bulle reste lisible sur 320 px
1688
+ sans se replier en cinq lignes au-dessus d'un bouton.
1689
+
1690
+ **Le desktop ne bouge pas d'un pixel** : tout est dans la requête média, et
1691
+ la règle hors média n'est pas touchée.
1692
+
1693
+ Ce que ça ne règle PAS, et qui reste vrai : le tactile ne survole pas. Une
1694
+ bulle ne s'ouvre au doigt que si sa cible prend le focus au tap, ce qui vaut
1695
+ d'un bouton et pas d'un texte. La doctrine du composant tient donc plus que
1696
+ jamais : l'infobulle est un COMPLÉMENT DISPENSABLE, et l'information
1697
+ nécessaire passe par `aria-describedby` et par le texte visible. Une app qui
1698
+ y met la raison d'un bouton grisé s'en remet à un geste que la moitié de ses
1699
+ visiteurs n'ont pas.
1700
+
1701
+ ## Les liens de la barre tombent avec le burger (29/08/2026, 0.38.0)
1702
+
1703
+ `.zv-nav__links` n'était masquée sous le point de rupture que pour
1704
+ `zv-nav--riche`, dont le seuil est 1150 px et qui vise les barres denses. Sur
1705
+ une barre normale, sous 768 px, le burger apparaissait ET les liens
1706
+ restaient : deux navigations pour une, et un débordement au premier libellé
1707
+ un peu long.
1708
+
1709
+ Le commentaire du module disait pourtant l'intention, deux règles plus haut :
1710
+ « le burger n'existe que là où les liens disparaissent ». C'était vrai dans un
1711
+ sens seulement.
1712
+
1713
+ **Ce que faisaient les consommateurs.** memoire, landing, lexform et
1714
+ mcp-factory posaient `zv-only-desktop` à la main sur `NavLinks` ; campus
1715
+ passait par `zv-nav--riche`. Quatre sur cinq collaient la même rustine, et
1716
+ memoire avait écrit le commentaire qui l'explique : « `.zv-nav__links` n'est
1717
+ pas masquée d'office ». Une rustine que tout le monde recopie est un défaut
1718
+ du paquet, pas un usage.
1719
+
1720
+ **Pourquoi ce n'était pas déjà fait, et pourquoi ça l'est maintenant.** Le
1721
+ commentaire d'origine donnait la raison : masquer d'office « casserait les
1722
+ pages sans burger ». C'est juste, et ça méritait mieux qu'une classe à poser
1723
+ partout. La règle est donc conditionnée par `:has(.zv-nav__burger)` : les
1724
+ liens ne disparaissent QUE là où un burger les remplace. L'objection tombe
1725
+ sans rien sacrifier, et la phrase écrite plus haut devient vraie dans les
1726
+ deux sens.
1727
+
1728
+ `:has()` est déjà employé neuf fois dans le paquet, dont `.zv-header:has(>
1729
+ .zv-nav)`. Ce n'est pas une nouveauté qu'on introduit ici.
1730
+
1731
+ **Ce qui a été écarté** : masquer d'office et documenter qu'il faut un
1732
+ burger. Ça déplace la charge sur l'intégrateur pour un cas que le CSS sait
1733
+ détecter lui-même, et ça casse toute barre existante sans burger le jour de
1734
+ la montée de version.
1735
+
1736
+ Aucun consommateur ne régresse : les quatre qui posaient `zv-only-desktop`
1737
+ obtiennent le même rendu (la classe devient redondante, elle peut partir),
1738
+ et campus masque déjà à 1150, ce qui contient 768.
@@ -1 +1 @@
1
- {"version":3,"file":"css-inline.d.ts","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAGA;;;iEAGiE;AACjE,eAAO,MAAM,WAAW,EAAE,MAAyvxR,CAAA;AAEnxxR;;;yBAGyB;AACzB,eAAO,MAAM,WAAW,EAAE,MAAk4B,CAAA"}
1
+ {"version":3,"file":"css-inline.d.ts","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAGA;;;iEAGiE;AACjE,eAAO,MAAM,WAAW,EAAE,MAAim1R,CAAA;AAE3n1R;;;yBAGyB;AACzB,eAAO,MAAM,WAAW,EAAE,MAAk4B,CAAA"}