@zevra/ui 0.57.0 → 0.57.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/src/forms.css CHANGED
@@ -852,24 +852,65 @@
852
852
  * l'accent : le relief dit déjà l'état, un second signal ferait un bouton
853
853
  * plein de plus. Les rayons suivent --r-btn, donc `zv-arrondi`. */
854
854
  .zv-seg-group--segmente {
855
- display: inline-flex;
856
- flex-wrap: nowrap;
855
+ /* Le nombre de choix et le rang du choix courant, lus dans le balisage
856
+ * par :has() plus bas : l'indicateur s'en sert pour sa largeur et sa
857
+ * position. Deux à quatre choix. */
858
+ --zv-segments: 2;
859
+ --zv-segment: 0;
860
+ position: relative;
861
+ isolation: isolate;
862
+ /* Colonnes ÉGALES : c'est ce qui permet à un seul indicateur de glisser
863
+ * d'un choix à l'autre par un simple décalage. Chaque choix prend la
864
+ * largeur du plus long, comme tout sélecteur segmenté. */
865
+ display: inline-grid;
866
+ grid-auto-flow: column;
867
+ grid-auto-columns: 1fr;
868
+ /* Sans écart : celui des puces (6px) décalerait chaque colonne par
869
+ * rapport à l'indicateur, qui avance d'une colonne pleine. */
857
870
  gap: 0;
858
871
  border: 1px solid var(--line);
859
872
  border-radius: var(--r-btn);
860
873
  background: var(--hairline);
861
874
  }
862
875
 
863
- /* Bord à bord : le rail n'a pas de marge intérieure, et chaque choix
864
- * déborde d'un pixel sur son filet. Le choix courant occupe donc toute la
865
- * hauteur du rail et son filet se pose EXACTEMENT sur celui du rail, sans
866
- * couture ni double trait (demande de Joachim, 12/11/2026 : un écart entre
867
- * le bord et la pastille la faisait flotter). */
876
+ .zv-seg-group--segmente:has(> .zv-seg:nth-child(3)) { --zv-segments: 3; }
877
+ .zv-seg-group--segmente:has(> .zv-seg:nth-child(4)) { --zv-segments: 4; }
878
+ .zv-seg-group--segmente:has(> .zv-seg:nth-child(2)[aria-pressed="true"], > .zv-seg--on:nth-child(2)) { --zv-segment: 1; }
879
+ .zv-seg-group--segmente:has(> .zv-seg:nth-child(3)[aria-pressed="true"], > .zv-seg--on:nth-child(3)) { --zv-segment: 2; }
880
+ .zv-seg-group--segmente:has(> .zv-seg:nth-child(4)[aria-pressed="true"], > .zv-seg--on:nth-child(4)) { --zv-segment: 3; }
881
+
882
+ /* L'indicateur : UNE pastille, sous les libellés, qui GLISSE vers le
883
+ * choix courant (demande de Joachim, 12/11/2026 : un relief qui saute d'un
884
+ * bouton à l'autre ne dit pas qu'on a basculé). Bord à bord : elle déborde
885
+ * d'un pixel sur le filet du rail, de chaque côté, et se pose exactement
886
+ * dessus. Sa largeur vaut une colonne plus ces deux pixels ; décalée de
887
+ * (100 % - 2px) par rang, elle avance donc d'une colonne exactement.
888
+ * La courbe maison ; coupée par prefers-reduced-motion (base.css), où
889
+ * l'état final reste lisible sans. */
890
+ .zv-seg-group--segmente::before {
891
+ content: "";
892
+ position: absolute;
893
+ z-index: -1;
894
+ top: -1px;
895
+ bottom: -1px;
896
+ left: -1px;
897
+ width: calc(100% / var(--zv-segments) + 2px);
898
+ border: 1px solid var(--line);
899
+ border-radius: var(--r-btn);
900
+ background: var(--white);
901
+ box-shadow: var(--shadow-card);
902
+ transform: translateX(calc(var(--zv-segment) * (100% - 2px)));
903
+ transition: transform 220ms cubic-bezier(0.2, 0.7, 0.2, 1);
904
+ }
905
+
906
+ /* Les choix ne peignent rien : c'est l'indicateur qui porte le relief.
907
+ * Le libellé du choix courant passe à l'encre (graisse 600 de la puce). */
868
908
  .zv-seg-group--segmente > .zv-seg {
869
- margin: -1px;
909
+ justify-content: center;
870
910
  border-color: transparent;
871
911
  background: transparent;
872
912
  color: var(--ink-2);
913
+ transition: color 140ms cubic-bezier(0.2, 0.7, 0.2, 1);
873
914
  }
874
915
 
875
916
  .zv-seg-group--segmente > .zv-seg:hover {
@@ -878,9 +919,8 @@
878
919
 
879
920
  .zv-seg-group--segmente > .zv-seg--on,
880
921
  .zv-seg-group--segmente > .zv-seg[aria-pressed="true"] {
881
- border-color: var(--line);
882
- background: var(--white);
883
- box-shadow: var(--shadow-card);
922
+ border-color: transparent;
923
+ background: transparent;
884
924
  color: var(--ink);
885
925
  }
886
926