@zevra/ui 0.56.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/DECISIONS.md +30 -0
- package/dist/catalogue.d.ts.map +1 -1
- package/dist/catalogue.js +14 -0
- package/dist/catalogue.js.map +1 -1
- package/dist/css-inline.d.ts.map +1 -1
- package/dist/css-inline.js +1 -1
- package/dist/css-inline.js.map +1 -1
- package/dist/forms.d.ts +6 -1
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +2 -2
- package/dist/forms.js.map +1 -1
- package/package.json +1 -1
- package/react/catalogue.tsx +21 -0
- package/react/css-inline.ts +1 -1
- package/react/forms.tsx +7 -2
- package/src/forms.css +84 -0
package/react/forms.tsx
CHANGED
|
@@ -275,13 +275,18 @@ export interface SegGroupProps
|
|
|
275
275
|
/** Rangée qui défile au lieu de passer à la ligne. À poser explicitement :
|
|
276
276
|
* par défaut les puces s'enroulent. */
|
|
277
277
|
rail?: boolean
|
|
278
|
+
/** Sélecteur SEGMENTÉ : un rail qui contient deux à quatre choix
|
|
279
|
+
* exclusifs, le choix courant posé en relief dessus (« Recherche globale
|
|
280
|
+
* | Recherche textuelle »). Pour un MODE, jamais pour filtrer une
|
|
281
|
+
* collection : là, ce sont les puces. Une seule rangée, sans compte. */
|
|
282
|
+
segmente?: boolean
|
|
278
283
|
className?: string
|
|
279
284
|
}
|
|
280
285
|
|
|
281
|
-
export function SegGroup({ rail, className, ...reste }: SegGroupProps) {
|
|
286
|
+
export function SegGroup({ rail, segmente, className, ...reste }: SegGroupProps) {
|
|
282
287
|
return (
|
|
283
288
|
<div
|
|
284
|
-
className={cx('zv-seg-group', rail && 'zv-seg-group--rail', className)}
|
|
289
|
+
className={cx('zv-seg-group', rail && 'zv-seg-group--rail', segmente && 'zv-seg-group--segmente', className)}
|
|
285
290
|
{...reste}
|
|
286
291
|
/>
|
|
287
292
|
)
|
package/src/forms.css
CHANGED
|
@@ -840,6 +840,90 @@
|
|
|
840
840
|
overflow-x: auto;
|
|
841
841
|
}
|
|
842
842
|
|
|
843
|
+
/* Sélecteur SEGMENTÉ (DECISIONS, 12/11/2026, 0.57.0). HORS RELEVÉ : aucune
|
|
844
|
+
* planche ne le porte. Demandé par Tésope pour la palette de recherche
|
|
845
|
+
* (« Recherche globale | Recherche textuelle »), sur le modèle du sélecteur
|
|
846
|
+
* « Conversation | Cowork » de Claude : UN rail qui contient les choix, le
|
|
847
|
+
* choix courant posé en RELIEF dessus. Un mode, pas un filtre : la puce
|
|
848
|
+
* reste le seul mécanisme de filtrage.
|
|
849
|
+
* Dérivé : le rail est un aplat de --hairline cerné de --line (la surface
|
|
850
|
+
* en retrait du système), le choix courant le papier blanc et l'ombre de
|
|
851
|
+
* carte (ce qui est posé dessus). Le choix courant reste à l'ENCRE et non à
|
|
852
|
+
* l'accent : le relief dit déjà l'état, un second signal ferait un bouton
|
|
853
|
+
* plein de plus. Les rayons suivent --r-btn, donc `zv-arrondi`. */
|
|
854
|
+
.zv-seg-group--segmente {
|
|
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. */
|
|
870
|
+
gap: 0;
|
|
871
|
+
border: 1px solid var(--line);
|
|
872
|
+
border-radius: var(--r-btn);
|
|
873
|
+
background: var(--hairline);
|
|
874
|
+
}
|
|
875
|
+
|
|
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). */
|
|
908
|
+
.zv-seg-group--segmente > .zv-seg {
|
|
909
|
+
justify-content: center;
|
|
910
|
+
border-color: transparent;
|
|
911
|
+
background: transparent;
|
|
912
|
+
color: var(--ink-2);
|
|
913
|
+
transition: color 140ms cubic-bezier(0.2, 0.7, 0.2, 1);
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
.zv-seg-group--segmente > .zv-seg:hover {
|
|
917
|
+
color: var(--ink);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
.zv-seg-group--segmente > .zv-seg--on,
|
|
921
|
+
.zv-seg-group--segmente > .zv-seg[aria-pressed="true"] {
|
|
922
|
+
border-color: transparent;
|
|
923
|
+
background: transparent;
|
|
924
|
+
color: var(--ink);
|
|
925
|
+
}
|
|
926
|
+
|
|
843
927
|
.zv-seg {
|
|
844
928
|
border: 1px solid var(--line);
|
|
845
929
|
border-radius: var(--r-btn);
|