origam 2.18.18 → 2.18.19

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/dist/src/assets/css/main.css +1 -1
  3. package/dist/src/assets/css/tokens/dark.css +124 -6
  4. package/dist/src/assets/css/tokens/light.css +62 -3
  5. package/dist/src/assets/scss/tokens/_dark.scss +124 -6
  6. package/dist/src/assets/scss/tokens/_light.scss +62 -3
  7. package/dist/src/components/Audio/OrigamAudio.vue +66 -2
  8. package/dist/src/components/Chip/OrigamChip.vue +34 -0
  9. package/dist/src/components/Field/OrigamField.vue +76 -3
  10. package/dist/src/components/List/OrigamList.vue +90 -3
  11. package/dist/src/components/Main/OrigamMain.vue +2 -2
  12. package/dist/src/components/Media/OrigamMediaScrubber.vue +11 -1
  13. package/dist/src/components/SliderField/OrigamSliderField.vue +138 -3
  14. package/dist/src/components/SliderField/OrigamSliderFieldTrack.vue +12 -1
  15. package/dist/src/components/Snackbar/OrigamSnackbar.vue +2 -2
  16. package/dist/src/components/Switch/OrigamSwitch.vue +32 -0
  17. package/dist/src/components/TextField/OrigamTextField.vue +3 -1
  18. package/dist/src/components/Video/OrigamVideo.vue +11 -1
  19. package/dist/src/composables/Commons/layout.composable.cjs +2 -2
  20. package/dist/src/composables/Commons/layout.composable.d.ts +16 -2
  21. package/dist/src/composables/Commons/layout.composable.js +1 -1
  22. package/dist/src/composables/Commons/theme-props-resolver.composable.cjs +44 -9
  23. package/dist/src/composables/Commons/theme-props-resolver.composable.d.ts +33 -1
  24. package/dist/src/composables/Commons/theme-props-resolver.composable.js +42 -10
  25. package/dist/src/consts/Commons/variant-preset.const.cjs +8 -0
  26. package/dist/src/consts/Commons/variant-preset.const.d.ts +60 -0
  27. package/dist/src/consts/Commons/variant-preset.const.js +2 -0
  28. package/dist/src/consts/index.cjs +11 -0
  29. package/dist/src/consts/index.d.ts +1 -0
  30. package/dist/src/consts/index.js +1 -0
  31. package/dist/src/interfaces/Commons/theme.interface.d.ts +33 -0
  32. package/dist/src/interfaces/Masonry/masonry.interface.d.ts +2 -2
  33. package/dist/src/origam.cjs +2 -1
  34. package/dist/src/origam.js +8 -2
  35. package/dist/src/types/Commons/variant-preset.type.cjs +1 -0
  36. package/dist/src/types/Commons/variant-preset.type.d.ts +73 -0
  37. package/dist/src/types/Commons/variant-preset.type.js +0 -0
  38. package/dist/src/types/index.cjs +11 -0
  39. package/dist/src/types/index.d.ts +1 -0
  40. package/dist/src/types/index.js +1 -0
  41. package/dist/src/types/tokens.type.d.ts +1 -1
  42. package/package.json +1 -1
@@ -426,6 +426,15 @@
426
426
  --origam-chip__filter---transition-property: transform, opacity;
427
427
  --origam-chip__filter---transition-duration: var(--origam-motion__duration---normal);
428
428
  --origam-chip__filter---transition-timing-function: var(--origam-motion__easing---standard);
429
+ /* #595 — canaux C2 ouverts : lus par OrigamChip, declares par personne. Valeurs = le repli deja rendu. Les hauteurs ne passent PAS par l echelle `space` : 38px et 44px n y ont aucun barreau. */
430
+ --origam-chip---height-xs: 20px;
431
+ --origam-chip---height-sm: 24px;
432
+ --origam-chip---height-md: 32px;
433
+ --origam-chip---height-lg: 38px;
434
+ --origam-chip---height-xl: 44px;
435
+ --origam-chip---border-radius-rounded: var(--origam-radius---xl);
436
+ --origam-chip__close---margin-inline-start: 6px;
437
+ --origam-chip__close---margin-inline-end: -4px;
429
438
  --origam-avatar---background-color: var(--origam-color__surface---overlay);
430
439
  --origam-avatar---color: var(--origam-color__text---secondary);
431
440
  --origam-avatar---border-color: currentColor;
@@ -1035,7 +1044,7 @@
1035
1044
  --origam-field---padding-top: var(--origam-space---2);
1036
1045
  --origam-field---padding-bottom: 6px;
1037
1046
  --origam-field---font-size: 16px;
1038
- --origam-field---letter-spacing: var(--origam-font__letterSpacing---wide);
1047
+ --origam-field---letter-spacing: 0.009375em; /* #595 — PAS `letterSpacing---wide` (0.0094em) : `.origam-field` et `.origam-field__input` livrent 0.009375em en dur depuis toujours. Le barreau de l echelle en differe de 0.000025em, assez pour deplacer la piste de tous les champs. Valeur reellement livree, barreau assume hors echelle — meme arbitrage que `--origam-input__details---padding-top: 6px` (#595). */
1039
1048
  --origam-field---border-radius: var(--origam-radius---sm);
1040
1049
  --origam-field---border-color: var(--origam-color__border---default);
1041
1050
  --origam-field---border-width: var(--origam-border__width---thin);
@@ -1054,6 +1063,11 @@
1054
1063
  --origam-field---focus-ring-width: 0px;
1055
1064
  --origam-field---focus-ring-offset: 0px;
1056
1065
  --origam-field--variant-solo---box-shadow: var(--origam-shadow---sm);
1066
+ /* #595 — canaux C2 ouverts : lus par OrigamField, declares par personne. Valeurs = le repli deja rendu. `16px` et `4px` coincident EXACTEMENT avec `radius---xl` et `space---1` (verifie sur primitive.css), donc routes par leurs barreaux ; `0.42` n a aucun barreau (l echelle opacity va 0/12/26/32/50/60/70/87/100), litteral assume ; le `color-mix` est recopie VERBATIM — `currentColor` doit rester substitue sur l element consommateur, pas ici. */
1067
+ --origam-field---border-radius-rounded: var(--origam-radius---xl);
1068
+ --origam-field--inline---padding-inline: var(--origam-space---1);
1069
+ --origam-field--variant-filled---background-color: color-mix(in srgb, currentColor 12%, transparent);
1070
+ --origam-field--variant-filled---border-opacity: 0.42;
1057
1071
  --origam-field---variant-outlined-background-color: rgba(0, 0, 0, 0);
1058
1072
  --origam-field__overlay---background-color: var(--origam-color__overlay---scrim);
1059
1073
  --origam-field__overlay---opacity: var(--origam-opacity---0);
@@ -1723,8 +1737,10 @@
1723
1737
  --origam-list---pointer-events: auto;
1724
1738
  --origam-list---user-select: auto;
1725
1739
  --origam-list---indent-padding: 0px;
1740
+ --origam-list--nav---item-gap: 2px;
1741
+ --origam-list--nav---item-min-height: 44px;
1742
+ --origam-list--nav---item-padding-block: 6px;
1726
1743
  --origam-list---density: 0px;
1727
- --origam-list---indent-padding-nav: -8px;
1728
1744
  --origam-list---slim-prepend-width: 28px;
1729
1745
  --origam-list__overlay---background-color: var(--origam-color__overlay---scrim);
1730
1746
  --origam-list__overlay---border-radius: inherit;
@@ -2194,6 +2210,16 @@
2194
2210
  --origam-switch__label---font-size: var(--origam-font__size---md);
2195
2211
  --origam-switch__label---padding-inline: var(--origam-space---2);
2196
2212
  --origam-switch__input---opacity: 0;
2213
+ /* #595 — canaux C2 ouverts : ces neuf noms etaient lus par OrigamSwitch / OrigamSwitchTrack et declares par personne. Chaque valeur est le repli deja rendu, recopie a l identique. */
2214
+ --origam-switch__thumb---border-color: rgba(0, 0, 0, 0.18);
2215
+ --origam-switch__thumb---color: currentColor;
2216
+ --origam-switch__selection-control---min-height: 56px;
2217
+ --origam-switch__skeleton---width: 52px;
2218
+ --origam-switch__skeleton---height: 32px;
2219
+ --origam-switch__skeleton-track---background-color: color-mix(in srgb, currentColor 14%, transparent);
2220
+ --origam-switch__skeleton-thumb---background-color: color-mix(in srgb, currentColor 28%, transparent);
2221
+ --origam-switch__track--inset---height: 32px;
2222
+ --origam-switch__track--inset---width: 52px;
2197
2223
  --origam-switch---opacity-disabled: var(--origam-opacity---32);
2198
2224
  --origam-slider-field---padding-block: var(--origam-space---2);
2199
2225
  --origam-slider-field---transition-duration: var(--origam-motion__duration---fast);
@@ -2216,11 +2242,24 @@
2216
2242
  --origam-slider-field__tick---size: 4px;
2217
2243
  --origam-slider-field__tick---background-color: var(--origam-color__text---disabled);
2218
2244
  --origam-slider-field__tick---background-color-active: var(--origam-color__action--primary---fg);
2219
- --origam-slider-field__tick---border-radius: var(--origam-radius---full);
2245
+ --origam-slider-field__tick---border-radius: 2px; /* #595 — PAS `radius---full` (9999px) : `.origam-slider-field-track__tick` livre `border-radius: 2px` en dur. Valeur reellement livree. */
2220
2246
  --origam-slider-field__label---color: var(--origam-color__text---secondary);
2221
2247
  --origam-slider-field__label---font-size: var(--origam-font__size---sm);
2222
2248
  --origam-slider-field__label---padding: var(--origam-space---1);
2223
2249
  --origam-slider-field---opacity-disabled: var(--origam-opacity---32);
2250
+ /* #595 — canaux C2 ouverts : lus par OrigamSliderField / OrigamSliderFieldTrack, declares par personne. Valeurs = le repli deja rendu ; les `var()` internes sont recopies VERBATIM pour ne pas fermer le canal `--origam-color__*--inverse---*`, encore non declare. */
2251
+ --origam-slider-field-thumb__surface---border-color: rgba(0, 0, 0, 0.18);
2252
+ --origam-slider-field__buffered---background-color: color-mix(in srgb, currentColor 40%, transparent);
2253
+ --origam-slider-field__buffered---opacity: 0.5;
2254
+ --origam-slider-field__buffered--bare---background-color: color-mix(in srgb, currentColor 40%, transparent);
2255
+ --origam-slider-field__track---transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1);
2256
+ --origam-slider-field__hover-tooltip---background-color: var(--origam-color__surface---inverse);
2257
+ --origam-slider-field__hover-tooltip---color: var(--origam-color__text---inverse);
2258
+ --origam-slider-field--bare---accent-color: var(--origam-color__action--primary---bg);
2259
+ --origam-slider-field--bare---thumb-size: 12px;
2260
+ --origam-slider-field--bare---track-background-color: color-mix(in srgb, currentColor 25%, transparent);
2261
+ --origam-slider-field--bare---track-thickness: 2px;
2262
+ --origam-slider-field--bare---track-thickness-active: 4px;
2224
2263
  --origam-icon---color: currentColor;
2225
2264
  --origam-icon---transition-duration: var(--origam-motion__duration---fast);
2226
2265
  --origam-icon---transition-timing-function: var(--origam-motion__easing---standard);
@@ -2691,6 +2730,26 @@
2691
2730
  --origam-audio--error---padding: var(--origam-space---2) var(--origam-space---3);
2692
2731
  --origam-audio--error---gap: var(--origam-space---2);
2693
2732
  --origam-audio--error---icon-font-size: var(--origam-font__size---lg);
2733
+ /* #594 — canaux C2 ouverts : lus par OrigamAudio depuis des selecteurs VIVANTS, declares par personne. Valeurs = le repli deja rendu. */
2734
+ --origam-audio__header---margin-bottom: 12px;
2735
+ --origam-audio__btn---size: 28px;
2736
+ --origam-audio__btn---icon-size: 16px;
2737
+ --origam-audio__meta-separator---content: "\00B7"; /* #594 — U+00B7 ECHAPPE, et il DOIT le rester. Ecrit en litteral, ce seul caractere non-ASCII faisait emettre a dart-sass un BOM en tete de main.css (`--style=compressed` pose un BOM la ou le mode etendu poserait `@charset`). Un BOM n est PAS retire a l interieur d un `<style>` : il se collait au premier selecteur, qui ne matchait alors plus rien — les 156 declarations primitives mortes, tous les tokens semantiques et derives a vide. Mesure le 2026-09-30 : 7 echecs sur derived-tokens-subtree.spec.ts. L echappement rend le MEME glyphe (verifie en Chromium) et garde la feuille compilee en ASCII pur. Regle : aucune valeur de token ne doit contenir de caractere non-ASCII — utiliser la forme \XXXX. */
2738
+ --origam-audio__playlist---max-height: 220px;
2739
+ --origam-audio__playlist---padding-top: 8px;
2740
+ --origam-audio__playlist---margin-top: 12px;
2741
+ --origam-audio__playlist---border-color: color-mix(in srgb, currentColor 8%, transparent);
2742
+ /* Les deux lignes de meta de la playlist resolvaient `var(--origam-color__text---secondary)` par repli — exactement ce que `--origam-audio---secondary-color` declare deja. Les brancher dessus ouvre les deux canaux ET rend ce token atteignable, a valeur rendue identique. */
2743
+ --origam-audio__playlist-subtitle---color: var(--origam-audio---secondary-color);
2744
+ --origam-audio__playlist-duration---color: var(--origam-audio---secondary-color);
2745
+ --origam-audio__playlist-item__prepend---margin-inline-end: 12px;
2746
+ --origam-audio--compact---padding: 8px 12px;
2747
+ --origam-audio--compact__header---gap: 12px;
2748
+ --origam-audio--compact__btn---size: 24px;
2749
+ --origam-audio--compact__btn---icon-size: 14px;
2750
+ --origam-audio--compact__play-btn---size: 56px;
2751
+ --origam-audio--compact__play-btn---icon-size: 40px;
2752
+ --origam-audio--compact__progress---height: 3px;
2694
2753
  --origam-media-scrubber---color: var(--origam-color__action--primary---bg);
2695
2754
  --origam-media-scrubber---primary: var(--origam-color__action--primary---bg);
2696
2755
  --origam-media-scrubber---track-background-color: var(--origam-color__surface---overlay);
@@ -827,6 +827,27 @@ defineExpose({
827
827
  }
828
828
  }
829
829
 
830
+ /*
831
+ * ⛔ #594 — SEPT tokens `--origam-audio*` que les feuilles declarent et
832
+ * que ce SCSS ne lit pas. Ils restent en baseline
833
+ * `token-var-channels-dormant.json` :
834
+ *
835
+ * · `__cover---border-radius` (radius---md = 8px) — la pochette est un
836
+ * DISQUE : `border-radius: 50%` ci-dessous, sillons concentriques et
837
+ * trou de broche compris. Cabler par le nom transformerait le vinyle
838
+ * en carre arrondi. Exemple type du « ne jamais cabler un orphelin
839
+ * sur la foi de son nom » ;
840
+ * · `__artist---color`, `__album---color`, `__duration---color`
841
+ * (text---secondary) — les trois elements existent, mais leur
842
+ * couleur vient de `.origam-audio__meta`, en
843
+ * `color-mix(in srgb, currentColor 60%, transparent)`. La valeur
844
+ * declaree est une AUTRE couleur ;
845
+ * · `__body---gap` (space---3), `__compact---body-gap` (space---2) —
846
+ * aucune classe `.origam-audio__body` dans le template ;
847
+ * · `__transport---btn-icon-size` (20px) — la taille livree pour les
848
+ * boutons de la rangee est 16px (`__btn---icon-size`, cable), et le
849
+ * bloc `&__transport` est de toute facon un selecteur mort.
850
+ */
830
851
  &__cover {
831
852
  margin: 0;
832
853
  display: flex;
@@ -1028,6 +1049,27 @@ defineExpose({
1028
1049
  color: var(--origam-audio__waveform---color, color-mix(in srgb, currentColor 50%, transparent));
1029
1050
  }
1030
1051
 
1052
+ /*
1053
+ * ⛔ #594 — SELECTEURS MORTS, mesure du 2026-09-27. Ni
1054
+ * `.origam-audio__transport`, ni `__nav-btn`, ni `__play-btn`, ni
1055
+ * `__time`, ni `__spacer`, ni `__volume`, ni `__cast`, ni `__config`
1056
+ * n existent dans le template : la barre de transport a ete remplacee
1057
+ * par `OrigamMediaController` (`.origam-audio__controller`, ligne 65),
1058
+ * et ces blocs sont restes. Verifie sur les 45 variants de la story
1059
+ * dans Chromium — `document.querySelector` renvoie `null` partout.
1060
+ *
1061
+ * Consequence pour la campagne C2 : les tokens que ces regles lisent
1062
+ * (`__transport---min-height`, les quatre `__nav-btn---*`,
1063
+ * `__play-btn---color`, `__play-btn---icon-size`, `__time---color`)
1064
+ * sont LAISSES non declares a dessein. Les declarer ne deplacerait
1065
+ * aucun pixel — precisement parce que rien ne matche — mais graverait
1066
+ * dans le canal public des noms qu un theme pourrait regler sans
1067
+ * jamais rien voir changer. Ils restent en baseline
1068
+ * `token-var-channels.json` jusqu a ce que ces blocs soient soit
1069
+ * supprimes, soit recables sur le controleur (cf. #578).
1070
+ *
1071
+ * Meme cas une trentaine de lignes plus bas pour `&__playlist-artist`.
1072
+ */
1031
1073
  &__transport {
1032
1074
  display: flex;
1033
1075
  align-items: center;
@@ -1120,8 +1162,22 @@ defineExpose({
1120
1162
  align-items: center;
1121
1163
  gap: var(--origam-audio--error---gap, 6px);
1122
1164
  padding: var(--origam-audio--error---padding, 8px 12px);
1123
- background-color: var(--origam-audio--error---background-color, var(--origam-color__status--error--bg, transparent));
1124
- color: var(--origam-audio--error---color, var(--origam-color__status--error---color, inherit));
1165
+ /*
1166
+ * #594 — EFFONDREMENT de deux replis fantomes. Les deux lignes
1167
+ * lisaient `var(RUNG1, var(--origam-color__status--error---*, T))`.
1168
+ * Mesure : la famille `--origam-color__status--*` n est declaree
1169
+ * NULLE PART (zero occurrence en partie gauche dans
1170
+ * `assets/css/tokens/*` ni `assets/scss/tokens/*`) — c est une
1171
+ * grammaire fantome, et `--error--bg` y ecrivait meme `--bg` au
1172
+ * lieu de `---bg`. Les deux RUNG1 sont eux declares light ET dark
1173
+ * (`--origam-color__feedback--danger---bgSubtle` / `---fgSubtle`),
1174
+ * donc l echelon fantome etait INATTEIGNABLE par construction : il
1175
+ * ne peignait rien et ne pouvait rien peindre. Retire du site de
1176
+ * lecture — zero pixel deplace, deux canaux morts en moins, et pas
1177
+ * un nom faux grave dans le canal public.
1178
+ */
1179
+ background-color: var(--origam-audio--error---background-color, transparent);
1180
+ color: var(--origam-audio--error---color, inherit);
1125
1181
  border-radius: var(--origam-audio--error---border-radius, var(--origam-radius---sm, 4px));
1126
1182
  font-size: var(--origam-audio--error---font-size, 0.875rem);
1127
1183
  grid-column: 1 / -1;
@@ -1260,6 +1316,14 @@ defineExpose({
1260
1316
  }
1261
1317
  }
1262
1318
 
1319
+ /*
1320
+ * ⛔ #594 — SELECTEUR MORT : aucune `.origam-audio__playlist-artist`
1321
+ * dans le template (la ligne de playlist rend un `OrigamListItem`,
1322
+ * dont le sous-titre porte `.origam-list-item__subtitle`, cable juste
1323
+ * au-dessus). `--origam-audio__playlist-artist---color` reste donc non
1324
+ * declare, pour la meme raison que le bloc `&__transport` : un canal
1325
+ * qui ne peint rien ne doit pas entrer dans la feuille publique.
1326
+ */
1263
1327
  &__playlist-artist {
1264
1328
  color: var(--origam-audio__playlist-artist---color, var(--origam-color__text---secondary));
1265
1329
  font-size: 12px;
@@ -539,6 +539,18 @@ defineExpose({
539
539
  color: var(--origam-chip--selected---color);
540
540
  }
541
541
 
542
+ /*
543
+ * ⛔ #595 — `--origam-chip---font-size` est lu par les cinq paliers et
544
+ * DOIT rester non declare. C est le premier maillon d une chaine de
545
+ * replis dont le second est par-palier : le declarer a `:root` figerait
546
+ * la meme taille de police pour `x-small` comme pour `x-large` et
547
+ * rendrait `--origam-chip---font-size-{xs..xl}` inatteignables — la
548
+ * prop `size` perdrait son canal typographique. Meme piege que la
549
+ * cascade de replis de Card (#593).
550
+ *
551
+ * Les cinq `---height-{xs..xl}`, eux, sont un niveau unique : ils
552
+ * viennent d etre declares a leur valeur livree (20/24/32/38/44px).
553
+ */
542
554
  &--size-x-small {
543
555
  font-size: var(--origam-chip---font-size, var(--origam-chip---font-size-xs, 0.625rem));
544
556
  line-height: 1;
@@ -574,6 +586,28 @@ defineExpose({
574
586
  padding: 0 var(--origam-chip---padding-xl, 17px);
575
587
  }
576
588
 
589
+ /*
590
+ * ⛔ #595 — QUINZE tokens `--origam-chip--*` que les feuilles declarent
591
+ * et que ce SCSS ne lit PAS. Ils restent en baseline
592
+ * `token-var-channels-dormant.json`, voici pourquoi :
593
+ *
594
+ * · les douze `--{success,warning,danger,info}---{background-color,
595
+ * color,border-color}` et les deux `--outlined---{background-color,
596
+ * border-color}` supposent des regles `&--danger` / `&--outlined`
597
+ * que le composant n a pas et ne doit pas avoir : l intention est
598
+ * peinte par `useColorEffect` (style INLINE) et par les classes
599
+ * utilitaires `.origam--bg-*`. Une regle de variante au selecteur
600
+ * perdrait de toute facon contre l inline, ou — pire, avec un
601
+ * `!important` — empecherait la prop de peindre : c est exactement
602
+ * l incident qui a produit l ADR-005 et le garde `no-variant-css`.
603
+ * La classe emise reste un point d accroche CONSOMMATEUR ;
604
+ * · `---density` (0px) est ECRIT juste en dessous par les deux
605
+ * modificateurs de densite et LU par personne. C est un defaut
606
+ * distinct de C2 — la prop `density` de Chip est inerte, aucune
607
+ * hauteur ni marge ne consomme la variable — et le corriger
608
+ * changerait le rendu de `density="compact"`. Hors perimetre de ce
609
+ * lot, signale sans ticket ouvert (consigne du lot).
610
+ */
577
611
  &--density-default {
578
612
  --origam-chip---density: 0px;
579
613
  }
@@ -572,8 +572,41 @@ defineExpose({
572
572
  display: grid;
573
573
  grid-template-areas: "prepend-inner field clear append-inner";
574
574
  grid-template-columns: min-content minmax(0, 1fr) min-content min-content;
575
+ /*
576
+ * ⛔ #595 — NEUF tokens `--origam-field*` (plus un `--origam-input*`)
577
+ * que les feuilles declarent et que ce SCSS ne lit pas. Ils restent en
578
+ * baseline `token-var-channels-dormant.json` :
579
+ *
580
+ * · les quatre `__overlay---{background-color,opacity,
581
+ * pointer-events,position}` — l element `.origam-field__overlay`
582
+ * EXISTE dans le template (ligne 10) mais AUCUNE regle ne le style :
583
+ * il est aujourd hui sans position, sans fond, sans opacite. Les
584
+ * cabler ajouterait quatre proprietes absentes du rendu. C est le
585
+ * raisonnement « visuellement inerte » qu un lot de #550 a tenu
586
+ * avant de devoir tout reverter (hypothese de containment non
587
+ * verifiee en navigateur) : on ne le rejoue pas ;
588
+ * · `---color` (text---primary) — la racine ne declare aucun `color`,
589
+ * la couleur du champ est heritee ;
590
+ * · `---transition-duration`, `---transition-easing` — la racine ne
591
+ * declare aucune `transition` ; celles qui existent sont portees par
592
+ * `__label` / `__clearable` / `__outline`, chacune avec son propre
593
+ * couple de tokens deja cable ;
594
+ * · `---prepend-inner-icon-opacity-focused`,
595
+ * `---append-inner-icon-opacity-focused` (opacity---100) — au focus,
596
+ * `opacity: 1` est pose sur les CONTENEURS `__prepend-inner` /
597
+ * `__append-inner`, pas sur l icone : l icone garde son 0.7. Cabler
598
+ * par le nom la ferait passer a 1 (changement de rendu) ; cabler le
599
+ * conteneur graverait un nom faux ;
600
+ * · `--origam-input---icon-opacity-active` (opacity---100) — le seul
601
+ * `opacity: 1` d icone vit dans `OrigamInput` sous
602
+ * `&--disabled, &--error`. La valeur coinciderait, le nom
603
+ * « active » non.
604
+ *
605
+ * `---letter-spacing`, lui, vient d etre cable : la valeur livree en dur
606
+ * est identique aux deux sites, et la feuille a ete realignee sur elle.
607
+ */
575
608
  font-size: var(--origam-field---font-size, 16px);
576
- letter-spacing: 0.009375em;
609
+ letter-spacing: var(--origam-field---letter-spacing, 0.009375em);
577
610
  max-width: 100%;
578
611
  border-radius: var(--origam-field---border-radius, 8px);
579
612
  contain: layout;
@@ -608,6 +641,18 @@ defineExpose({
608
641
 
609
642
  &__skeleton {
610
643
  width: 100%;
644
+ /*
645
+ * ⛔ #595 — FAUX POSITIF de `token-var-channels`, a laisser en
646
+ * baseline. Le repli est `var(--origam-input__control---height, 36px)`,
647
+ * et ce token-la est ECRIT PAR INSTANCE : les quatre modificateurs
648
+ * de taille de ce composant (~l.1532-1550) comme ceux d `OrigamInput`
649
+ * et d `OrigamTextareaField` le posent sur l element
650
+ * (`sm`=28 / `md`=36 / `lg`=44 / `xl`=52px). Declarer
651
+ * `--origam-field__skeleton---min-height` a `:root` avec ce repli
652
+ * substituerait la valeur RACINE (36px) une fois pour toutes : le
653
+ * squelette cesserait de suivre la taille du champ. Meme piege que
654
+ * `---hover-x` sur SliderField.
655
+ */
611
656
  min-height: var(--origam-field__skeleton---min-height, var(--origam-input__control---height, 36px));
612
657
  border-radius: var(--origam-field---border-radius, 8px);
613
658
  grid-column: 1 / -1;
@@ -635,9 +680,24 @@ defineExpose({
635
680
  column-gap: 2px;
636
681
  display: flex;
637
682
  flex-wrap: wrap;
638
- letter-spacing: 0.009375em;
683
+ letter-spacing: var(--origam-field---letter-spacing, 0.009375em);
639
684
  opacity: var(--origam-field__input---opacity, 0.7);
640
685
  box-sizing: border-box;
686
+ /*
687
+ * ⛔ #595 — FAUX POSITIF de `token-var-channels`, a laisser en
688
+ * baseline (5 lectures ici, 1 dans OrigamSwitch, 1 dans
689
+ * OrigamCheckbox). `--origam-input---density` est ECRIT PAR
690
+ * INSTANCE par les trois modificateurs de densite d `OrigamInput`
691
+ * (~l.424-432 : `default`=0px, `compact`=-8px,
692
+ * `comfortable`=+8px) — ce sont eux, et non une feuille, qui
693
+ * portent la valeur. Ce que les feuilles declarent, c est l ECHELLE
694
+ * (`--origam-input---density-{default,compact,comfortable}-density`),
695
+ * qui est bien atteignable par un theme ; le token agrege ne doit
696
+ * pas l etre. La declarer a `:root` figerait la densite racine pour
697
+ * tout champ dont le modificateur ne serait pas un ancetre du
698
+ * lecteur — et le lot ne peut pas le verifier sur les trois
699
+ * composants sans changer de perimetre.
700
+ */
641
701
  min-height: max(calc(var(--origam-input__control---height, 36px) + var(--origam-input---density, 0px)), 1.5rem + var(--origam-field__input---padding-top) + var(--origam-field__input---padding-bottom));
642
702
  min-width: 0;
643
703
  padding-inline: var(--origam-field__input---padding-start) var(--origam-field__input---padding-end);
@@ -1011,7 +1071,20 @@ defineExpose({
1011
1071
 
1012
1072
  &--variant {
1013
1073
  &-solo {
1014
- box-shadow: var(--origam-theme---elevation, var(--origam-field--variant-solo---box-shadow, var(--origam-shadow---sm)));
1074
+ /*
1075
+ * #595 — EFFONDREMENT d un repli fantome. Cette ligne lisait
1076
+ * `var(--origam-theme---elevation, var(RUNG2, ...))`. Mesure du
1077
+ * 2026-09-29 : `--origam-theme---elevation` a UNE SEULE
1078
+ * occurrence dans tout le depot — ce site de lecture. Aucune
1079
+ * feuille ne la declare, aucun composant ne l ecrit, et la
1080
+ * matrice runtime (`apply-theme.util.ts`) ne l emet pas non
1081
+ * plus. Le nom n est d ailleurs pas grammatical : `--origam-theme`
1082
+ * n est pas un bloc de composant. RUNG2
1083
+ * (`--origam-field--variant-solo---box-shadow`) est lui declare
1084
+ * light ET dark a `var(--origam-shadow---sm)` : c est lui qui
1085
+ * peignait, et qui peint toujours. Zero pixel deplace.
1086
+ */
1087
+ box-shadow: var(--origam-field--variant-solo---box-shadow, var(--origam-shadow---sm));
1015
1088
  border-color: transparent;
1016
1089
  --origam-field__input---padding-top: var(--origam-field__input---padding-block-solo);
1017
1090
  }
@@ -372,10 +372,97 @@ defineExpose({
372
372
  // padding `0px/0px`, so the rows ran edge-to-edge inside the menu
373
373
  // and their hover surface was clipped by the menu's own corner
374
374
  // radius. The two longhands are the names the base rule reads.
375
- --origam-list---padding-inline-start: var(--origam-space---2, 8px);
376
- --origam-list---padding-inline-end: var(--origam-space---2, 8px);
375
+ --origam-list---padding-inline-start: var(--origam-space---1, 4px);
376
+ --origam-list---padding-inline-end: var(--origam-space---1, 4px);
377
+
378
+ // ⛔ L'AXE VERTICAL DOIT ETRE DECLARE ICI AUSSI, et pas seulement dans
379
+ // la feuille. Mesure du 2026-09-30, menu nav de la barre marketing sur
380
+ // les 8 identites : `--origam-list---padding-block-start/end` valait
381
+ // `0` sur SEPT d'entre elles, et `var(--origam-space---2)` sur la seule
382
+ // `origam`. La feuille (`light.css:1716`) donne bien 8px, mais la
383
+ // matrice de theme runtime emet `0` pour chaque marque, et `origam`
384
+ // n'y echappe que parce qu'elle porte encore le reset genere
385
+ // (`origam-reset.generated.ts`, cf. #609) qui le re-declare.
386
+ //
387
+ // Une declaration SUR L'ELEMENT bat celle de `:root` : la poser ici
388
+ // neutralise l'ecart entre identites sans toucher aux 7 themes. Le
389
+ // rendu passait de 5-7px en vertical contre 13-27px en inline — un
390
+ // facteur 4 sur cartoon et glass — a des gouttieres du meme ordre.
391
+ --origam-list---padding-block-start: var(--origam-space---1, 4px);
392
+ --origam-list---padding-block-end: var(--origam-space---1, 4px);
393
+
377
394
  --origam-list-subheader---font-size: var(--origam-list__subheader---nav-font-size, 0.75rem);
378
- --origam-list---indent-padding: var(--origam-list---indent-padding-nav, -8px);
395
+
396
+ // ⛔ INDENT A ZERO EN MODE NAV — il rendait les items ASYMETRIQUES.
397
+ // `OrigamListItem` calcule
398
+ // `padding-inline-start: calc(base + indent + density)` mais
399
+ // `padding-inline-end: calc(base + density)` : l'indent ne s'applique
400
+ // QU'AU COTE START. Avec -8px, un item de menu recevait donc 8px de
401
+ // moins a gauche qu'a droite. Mesure : du bord du menu au texte,
402
+ // `origam` 12px a gauche contre 20px a droite, `apple` 14/18,
403
+ // `ecom`/`editorial`/`geek` 13/17 — cinq identites sur huit
404
+ // desequilibrees.
405
+ //
406
+ // L'indent sert a decaler les niveaux IMBRIQUES ; un menu de
407
+ // navigation est plat, il n'a rien a indenter. Les listes imbriquees
408
+ // gardent `--origam-list---indent-padding` intact hors mode nav.
409
+ --origam-list---indent-padding: 0px;
410
+
411
+ // ⛔ HAUTEUR DE RANGEE RESSERREE — 48px -> 36px, decision de
412
+ // l'utilisateur (2026-09-30), et elle a un COUT qu'il a accepte en
413
+ // connaissance de cause.
414
+ //
415
+ // `OrigamListItem` calcule
416
+ // `min-height: max(calc(base + densite), 1.5rem)`. Avec la base de
417
+ // feuille a 56px et la densite compacte a -8px, une rangee de menu
418
+ // faisait 48px : les libelles restaient a 50px les uns des autres
419
+ // alors que les gouttieres venaient d'etre resserrees a 8-11px. C'est
420
+ // la hauteur de rangee, PAS une gouttiere, qui portait le reste du
421
+ // desequilibre signale.
422
+ //
423
+ // ⚠️ 36px passe SOUS la cible tactile de 44x44 recommandee par WCAG
424
+ // 2.5.5. Le compromis est assume pour un menu de navigation d'en-tete,
425
+ // dense et pointe a la souris. ⛔ NE PAS propager cette valeur aux
426
+ // listes hors mode `nav` : une liste de contenu garde 48px, et c'est
427
+ // pour cela que la declaration vit dans `&--nav` et nulle part
428
+ // ailleurs. La base ajoute la densite, donc on vise 44 pour obtenir 36
429
+ // en densite compacte.
430
+ --origam-list-item---min-height: var(--origam-list--nav---item-min-height, 44px);
431
+
432
+ // Le `min-height` seul ne suffit pas : mesure, la rangee rendait 40px
433
+ // et non 36, parce que le CONTENU la depassait — texte plus les 8px de
434
+ // padding haut et bas de l'item. On resserre donc aussi ce padding en
435
+ // mode nav, sinon la hauteur demandee reste theorique.
436
+ :deep(.origam-list-item) {
437
+ --origam-list-item---padding-block-start: var(--origam-list--nav---item-padding-block, 6px);
438
+ --origam-list-item---padding-block-end: var(--origam-list--nav---item-padding-block, 6px);
439
+ }
440
+
441
+ // ⛔ L'ECART ENTRE PASTILLES ETAIT NUL — le desequilibre signale.
442
+ // Mesure du 2026-09-30 sur le menu « Features » (10 items), 8
443
+ // identites : la pastille d'un item est en retrait de 12 a 15px a
444
+ // gauche ET a droite, mais l'ecart VERTICAL entre deux pastilles
445
+ // valait `0` sur SEPT identites sur huit (geek : 5px). Les rangees se
446
+ // touchent donc bord a bord pendant que les cotes respirent — un
447
+ // rapport infini, pas seulement desequilibre.
448
+ //
449
+ // La liste est un conteneur BLOC : pas de `gap` disponible sans la
450
+ // passer en flex, ce qui toucherait les ~200 consommateurs de
451
+ // `origam-list`. La marge entre freres adjacents obtient le meme
452
+ // resultat sans changer le mode de disposition, et ne s'applique qu'au
453
+ // mode nav.
454
+ // ⛔ `:deep()` EST OBLIGATOIRE ICI, et une regle scopee nue ne marche
455
+ // PAS. Mesure : l'item porte `data-v-5f5f508b` (OrigamListItem) et le
456
+ // scope de l'appelant, mais PAS `data-v-05b52ddf` (OrigamList) — les
457
+ // items arrivent par le SLOT, donc ils appartiennent au scope de celui
458
+ // qui les ecrit, pas a celui de la liste qui les recoit. Une regle
459
+ // scopee nue compile en `… .origam-list-item[data-v-05b52ddf]` et ne
460
+ // matche jamais : le premier essai a rendu un ecart de 0px, identique
461
+ // a l'etat d'avant. `:deep()` pose l'attribut sur l'ANCETRE, qui lui
462
+ // le porte.
463
+ :deep(.origam-list-item + .origam-list-item) {
464
+ margin-block-start: var(--origam-list--nav---item-gap, 2px);
465
+ }
379
466
  }
380
467
 
381
468
  &--rounded {
@@ -20,7 +20,7 @@ import { useDimension } from "../../composables/Commons/dimension.composable";
20
20
  import { useBorder } from "../../composables/Commons/border.composable";
21
21
  import { useBothColor } from "../../composables/Commons/bothColor.composable";
22
22
  import { useElevation } from "../../composables/Commons/elevation.composable";
23
- import { useLayout } from "../../composables/Commons/layout.composable";
23
+ import { useLayoutMain } from "../../composables/Commons/layout.composable";
24
24
  import { useMargin } from "../../composables/Commons/margin.composable";
25
25
  import { usePadding } from "../../composables/Commons/padding.composable";
26
26
  import { useProps } from "../../composables/Commons/props.composable";
@@ -78,7 +78,7 @@ const props = defineProps({
78
78
  const { filterProps } = useProps(props);
79
79
  defineEmits([]);
80
80
  defineSlots();
81
- const { mainStyles: mainLayoutStyles } = useLayout();
81
+ const { mainStyles: mainLayoutStyles } = useLayoutMain();
82
82
  const { ssrBootStyles } = useSsrBoot();
83
83
  const { colorClasses, colorStyles } = useBothColor(toRef(props, "bgColor"), toRef(props, "color"));
84
84
  const { elevationClasses } = useElevation(props);
@@ -428,7 +428,17 @@ defineExpose({
428
428
  color: var(--origam-media-scrubber__tooltip---color, #ffffff);
429
429
  font-size: 11px;
430
430
  font-weight: 600;
431
- font-family: var(--origam-font---family, system-ui, sans-serif);
431
+ /*
432
+ * #595 — REFERENCE CORRIGEE : lisait `var(--origam-font---family, …)`,
433
+ * un nom que AUCUNE feuille ne declare (zero occurrence en partie
434
+ * gauche dans `assets/`). Ce composant retombait donc toujours sur
435
+ * `system-ui` et ignorait la police du DS. Le barreau reel est
436
+ * `--origam-font__family---sans` (primitive.css) = `Inter, 'Helvetica
437
+ * Neue', Arial, sans-serif`. ⚠️ Change le rendu, volontairement. Le
438
+ * repli `system-ui, sans-serif` reste en ceinture de securite si la
439
+ * feuille de primitives n est pas chargee.
440
+ */
441
+ font-family: var(--origam-font__family---sans, system-ui, sans-serif);
432
442
  border-radius: 3px;
433
443
  white-space: nowrap;
434
444
  pointer-events: none;