origam 2.20.0 → 2.22.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/dist/src/assets/css/main.css +1 -1
  3. package/dist/src/assets/css/tokens/dark.css +8 -16
  4. package/dist/src/assets/css/tokens/light.css +3 -8
  5. package/dist/src/assets/scss/tokens/_dark.scss +8 -16
  6. package/dist/src/assets/scss/tokens/_light.scss +3 -8
  7. package/dist/src/components/Blockquote/OrigamBlockquote.vue +15 -65
  8. package/dist/src/components/CommandPalette/OrigamCommandPalette.vue +8 -2
  9. package/dist/src/components/ContextualMenu/OrigamContextualMenu.vue +1 -1
  10. package/dist/src/components/Dialog/OrigamDialog.vue +1 -1
  11. package/dist/src/components/Dialog/OrigamDialogConfirmation.vue +1 -1
  12. package/dist/src/components/Drawer/OrigamDrawer.vue +12 -2
  13. package/dist/src/components/Menu/OrigamMenu.vue +1 -1
  14. package/dist/src/components/Overlay/OrigamOverlay.vue +2 -2
  15. package/dist/src/components/Snackbar/OrigamSnackbar.vue +1 -1
  16. package/dist/src/components/Snackbar/OrigamSnackbarGroup.vue +8 -2
  17. package/dist/src/components/Tooltip/OrigamTooltip.vue +1 -1
  18. package/dist/src/composables/Commons/hydration.composable.cjs +8 -3
  19. package/dist/src/composables/Commons/hydration.composable.d.ts +13 -5
  20. package/dist/src/composables/Commons/hydration.composable.js +6 -1
  21. package/dist/src/composables/Commons/teleport.composable.cjs +3 -0
  22. package/dist/src/composables/Commons/teleport.composable.d.ts +56 -0
  23. package/dist/src/composables/Commons/teleport.composable.js +3 -0
  24. package/dist/src/consts/Blockquote/blockquote.const.cjs +38 -1
  25. package/dist/src/consts/Blockquote/blockquote.const.d.ts +113 -0
  26. package/dist/src/consts/Blockquote/blockquote.const.js +37 -0
  27. package/dist/src/consts/Commons/variant-preset.const.cjs +2 -0
  28. package/dist/src/consts/Commons/variant-preset.const.d.ts +19 -8
  29. package/dist/src/consts/Commons/variant-preset.const.js +2 -0
  30. package/dist/src/interfaces/Blockquote/blockquote.interface.d.ts +59 -4
  31. package/dist/src/interfaces/CommandPalette/command-palette.interface.d.ts +2 -1
  32. package/dist/src/interfaces/Commons/attach.interface.cjs +1 -0
  33. package/dist/src/interfaces/Commons/attach.interface.d.ts +30 -0
  34. package/dist/src/interfaces/Commons/attach.interface.js +0 -0
  35. package/dist/src/interfaces/Drawer/drawer.interface.d.ts +24 -1
  36. package/dist/src/interfaces/Overlay/overlay.interface.d.ts +2 -2
  37. package/dist/src/interfaces/Snackbar/snackbar-group.interface.d.ts +2 -1
  38. package/dist/src/interfaces/index.cjs +11 -0
  39. package/dist/src/interfaces/index.d.ts +1 -0
  40. package/dist/src/interfaces/index.js +1 -0
  41. package/dist/src/themes/origam.theme.cjs +10 -1
  42. package/dist/src/themes/origam.theme.js +10 -1
  43. package/dist/src/types/tokens.type.d.ts +1 -1
  44. package/package.json +1 -1
@@ -15,6 +15,62 @@ import { Ref } from 'vue';
15
15
  * `teleportTarget` reste `undefined` — le composant appelant retombe
16
16
  * alors sur son rendu non-teleporte plutot que de crasher. En SSR
17
17
  * (`!IN_BROWSER`), toujours `undefined`, sans avertissement.
18
+ *
19
+ * @description
20
+ * ⛔ `useHydration()` — #attach-harmonisation. Un selecteur `string` ciblant
21
+ * un NOEUD FRERE cree dans la MEME passe de rendu (ex: un conteneur local
22
+ * que le consommateur monte lui-meme juste avant le composant qui teleporte)
23
+ * peut ne pas encore etre connecte a `document` au moment ou ce `computed`
24
+ * s'evalue pour la PREMIERE fois — mesure concrete sous Histoire (dont
25
+ * `OrigamApp`/`OrigamLayout` englobent chaque story dans un `<Suspense>` :
26
+ * l'arbre entier, y compris les freres, n'est commit dans le vrai DOM
27
+ * qu'une fois la resolution async terminee). `document.querySelector` n'est
28
+ * PAS une dependance reactive : si le premier appel echoue, le `computed`
29
+ * reste bloque sur `undefined` pour toujours, meme apres que la cible soit
30
+ * reellement montee — rien ne le marque sale.
31
+ *
32
+ * @description
33
+ * ⛔ UN COMPTEUR LOCAL (`mountTick`, essaye d'abord) CASSE LE SSR MARKETING.
34
+ * Mesure, CI (#1043) : 4 e2e marketing (Nuxt, SSR) en echec sur « sans
35
+ * erreur JS console » / « pas d'erreur d'hydratation ». Cause reelle,
36
+ * independante de `mountTick` : la toute PREMIERE evaluation du computed
37
+ * divergeait DEJA entre serveur et client. Cote serveur, `!IN_BROWSER` est
38
+ * toujours vrai (pas de `window` en SSR) -> `undefined` (teleport
39
+ * desactive, rendu en place). Cote client, `IN_BROWSER` est vrai DES LE
40
+ * DEPART, y compris pendant la passe d'HYDRATATION (avant tout
41
+ * `onMounted`) -> la cible (souvent `document.body`, qui existe toujours)
42
+ * se resout avec SUCCES sur ce tout premier rendu -> teleport deja ACTIF.
43
+ * Vue compare les deux rendus pendant l'hydratation : desactive vs actif,
44
+ * d'ou le decalage. `mountTick` n'ajoutait qu'une DEUXIEME evaluation
45
+ * post-montage — elle n'a jamais ete la cause du decalage, qui existait
46
+ * deja sur la premiere.
47
+ *
48
+ * @description
49
+ * Le fix : `isHydrated.value` (vrai gate, pas une simple lecture de
50
+ * dependance) force EXACTEMENT le meme `undefined` cote client QUE cote
51
+ * serveur tant que l'hydratation n'est pas terminee — `useHydration()`
52
+ * (deja utilise par `OrigamOverlay.vue`) seede `isHydrated` a `false` sur
53
+ * les DEUX rendus compares (serveur ET premiere passe client) quand l'app
54
+ * est reellement en SSR (`ssr` vrai), et ne bascule a `true` que dans un
55
+ * `onMounted` — donc APRES que l'hydratation ait deja conclu. Reutilise,
56
+ * ne redeclare pas.
57
+ *
58
+ * @description
59
+ * ⚠️ Dans une app 100% client (pas de SSR — Histoire, Tauri…),
60
+ * `useHydration()` renvoie `isHydrated=true` DES LE DEPART (son
61
+ * optimisation deliberee : « pas de delai artificiel » — voir son propre
62
+ * commentaire de tete) : le gate ci-dessous ne retarde donc RIEN la ou il
63
+ * n'y a aucune hydratation a proteger. Consequence mesuree : une cible
64
+ * FRERE montee dans la MEME passe de rendu que le consommateur (ex: un
65
+ * conteneur local qu'une story Histoire monte juste avant le composant
66
+ * teleportant, sous un `<Suspense>` qui ne commit l'arbre qu'une fois
67
+ * resolu) peut encore echouer sur cette toute premiere resolution, pour la
68
+ * meme raison qu'avant : `document.querySelector` n'est pas reactif. Ce
69
+ * n'est PAS le defaut que ce correctif vise — c'est un defaut DIFFERENT,
70
+ * propre a la construction du test (une cible fraiche ne preexiste jamais
71
+ * en usage reel), traite cote story plutot qu'en reintroduisant un
72
+ * compteur local ici (voir les stories CommandPalette / SnackbarGroup /
73
+ * Drawer, variante « Prop - attach »).
18
74
  ********************************************************/
19
75
  export declare function useTeleport(target: Ref<boolean | string | Element>): {
20
76
  teleportTarget: import("vue").ComputedRef<Element | undefined>;
@@ -1,10 +1,13 @@
1
1
  import { IN_BROWSER } from "../../consts/Commons/commons.const.js";
2
2
  import { consoleWarn } from "../../utils/Commons/console.util.js";
3
3
  import { computed } from "vue";
4
+ import { useHydration } from "./hydration.composable.js";
4
5
  export function useTeleport(target) {
6
+ const isHydrated = useHydration();
5
7
  const teleportTarget = computed(() => {
6
8
  const _target = target.value;
7
9
  if (_target === true || !IN_BROWSER) return void 0;
10
+ if (!isHydrated.value) return void 0;
8
11
  const targetElement = _target === false ? document.body : typeof _target === "string" ? document.querySelector(_target) : _target;
9
12
  if (targetElement == null) {
10
13
  consoleWarn(`Unable to locate target ${_target}`);
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.QUOTE_MARKS_BY_LANG = exports.BLOCKQUOTE_VARIANTS = exports.BLOCKQUOTE_LANGS = exports.BLOCKQUOTE_DEFAULTS = exports.BLOCKQUOTE_ALIGNS = void 0;
6
+ exports.QUOTE_MARKS_BY_LANG = exports.BLOCKQUOTE_VARIANT_PRESETS = exports.BLOCKQUOTE_VARIANTS = exports.BLOCKQUOTE_LANGS = exports.BLOCKQUOTE_DEFAULTS = exports.BLOCKQUOTE_ALIGNS = void 0;
7
7
  var _enums = require("../../enums/index.cjs");
8
8
  const BLOCKQUOTE_VARIANTS = exports.BLOCKQUOTE_VARIANTS = Object.values(_enums.BLOCKQUOTE_VARIANT);
9
9
  const BLOCKQUOTE_LANGS = exports.BLOCKQUOTE_LANGS = Object.values(_enums.BLOCKQUOTE_LANG);
@@ -29,5 +29,42 @@ const QUOTE_MARKS_BY_LANG = exports.QUOTE_MARKS_BY_LANG = {
29
29
  const BLOCKQUOTE_DEFAULTS = exports.BLOCKQUOTE_DEFAULTS = {
30
30
  variant: "default",
31
31
  lang: "auto",
32
+ align: "left",
32
33
  tag: "blockquote"
34
+ };
35
+ const BLOCKQUOTE_VARIANT_PRESETS = exports.BLOCKQUOTE_VARIANT_PRESETS = {
36
+ default: {
37
+ borderInlineStart: "var(--origam-blockquote__accent---width, 4px) solid var(--origam-blockquote---resolved-accent-color, currentColor)",
38
+ paddingInlineStart: "calc(var(--origam-blockquote---padding-inline, 24px) + var(--origam-blockquote__accent---width, 4px))"
39
+ },
40
+ elegant: {
41
+ fontFamily: "serif",
42
+ fontSize: "xl",
43
+ fontStyle: "var(--origam-blockquote__elegant---font-style, italic)",
44
+ lineHeight: "loose",
45
+ paddingBlock: "var(--origam-blockquote__elegant---padding-block, 24px)",
46
+ borderInlineStart: "var(--origam-blockquote__accent---width, 4px) solid var(--origam-blockquote---resolved-accent-color, currentColor)",
47
+ paddingInlineStart: "calc(var(--origam-blockquote---padding-inline, 24px) + var(--origam-blockquote__accent---width, 4px))"
48
+ },
49
+ quoted: {
50
+ quoteMark: true,
51
+ paddingTop: "calc(var(--origam-blockquote---padding-block, 16px) + var(--origam-blockquote--quoted---glyph-padding-extra, 1rem))"
52
+ },
53
+ minimal: {
54
+ fontSize: "md",
55
+ fontStyle: "var(--origam-blockquote__minimal---font-style, italic)",
56
+ paddingBlock: 0,
57
+ paddingInline: "var(--origam-blockquote__minimal---padding-inline, 12px)",
58
+ borderInlineStart: "var(--origam-blockquote--minimal---accent-width, 2px) solid var(--origam-blockquote---resolved-accent-color, currentColor)",
59
+ paddingInlineStart: "calc(var(--origam-blockquote__minimal---padding-inline, 12px) + var(--origam-blockquote--minimal---accent-width, 2px))"
60
+ },
61
+ pull: {
62
+ fontFamily: "serif",
63
+ fontSize: "3xl",
64
+ fontWeight: "medium",
65
+ lineHeight: "snug",
66
+ align: "center",
67
+ paddingBlock: "var(--origam-blockquote__pull---padding-block, 24px)",
68
+ borderBlock: "var(--origam-blockquote__pull---rule-width, 2px) solid var(--origam-blockquote---resolved-accent-color, currentColor)"
69
+ }
33
70
  };
@@ -1,4 +1,6 @@
1
+ import type { IBlockquoteProps } from '../../interfaces/Blockquote/blockquote.interface';
1
2
  import type { TBlockquoteAlign, TBlockquoteLang, TBlockquoteVariant } from '../../types/Blockquote/blockquote.type';
3
+ import type { TVariantPresets } from '../../types/Commons/variant-preset.type';
2
4
  /**
3
5
  * Closed list of valid `variant` values for `<OrigamBlockquote>`.
4
6
  * Exposed so stories / consumers can iterate the matrix without
@@ -33,5 +35,116 @@ export declare const QUOTE_MARKS_BY_LANG: Record<Exclude<TBlockquoteLang, 'auto'
33
35
  export declare const BLOCKQUOTE_DEFAULTS: {
34
36
  readonly variant: TBlockquoteVariant;
35
37
  readonly lang: TBlockquoteLang;
38
+ readonly align: TBlockquoteAlign;
36
39
  readonly tag: "blockquote";
37
40
  };
41
+ /*********************************************************
42
+ * BLOCKQUOTE_VARIANT_PRESETS
43
+ *
44
+ * @description
45
+ * ADR-005 D7, lot #1015 — le deuxieme composant converti, apres le pilote
46
+ * `OrigamKbd`. Un variant de Blockquote n'est plus un bloc SCSS : c'est ce
47
+ * sac de props, resolu au rang le plus faible de la chaine (prop du site
48
+ * d'appel > defaut de theme > PRESET > `withDefaults`).
49
+ *
50
+ * @description
51
+ * ⛔ CE QUE LA CONVERSION REPARE, ET C'EST SA JUSTIFICATION. Les regles
52
+ * `--variant-elegant` / `--variant-minimal` / `--variant-pull` declaraient
53
+ * `font-size` / `font-family` / `font-weight` / `line-height`
54
+ * DIRECTEMENT, a specificite (0,2,0) — identique a celle de la regle de
55
+ * base — et plus loin dans l'ordre source. Or `useTypography` n'ecrit pas
56
+ * ces proprietes : il ecrit la propriete custom
57
+ * `--origam-blockquote---{propriete}` que la regle de base consomme via
58
+ * `--resolved-{propriete}`. Les cinq props typographiques etaient donc
59
+ * VIVANTES sur `default` et `quoted` et MORTES sur les trois autres, sans
60
+ * aucun diagnostic — alors que la story exposait les cinq controles et que
61
+ * la doc les documentait.
62
+ * @description
63
+ * Verdict navigateur, chromium, Histoire statique, lot #1015 :
64
+ * `variant="elegant" font-size="sm"` rendait **18px**, exactement comme
65
+ * `variant="elegant"` nu. Apres conversion la prop gagne. C'est l'une des
66
+ * deux assertions ROUGE-avant / VERT-apres de `e2e/blockquote.spec.ts`.
67
+ *
68
+ * @description
69
+ * ⛔ CHAQUE VALEUR PORTE LA CHAINE `var()` QUE LA REGLE PORTAIT, partout ou
70
+ * le canal peut la transporter. `resolveSpacingValue` rend verbatim toute
71
+ * valeur qui n'est pas un echelon de l'echelle, et
72
+ * `parseBorderPositionValue` prend `match.width` EN ENTIER — donc les
73
+ * `calc()` et les largeurs `var(--…, repli)` voyagent telles quelles, et le
74
+ * canal d'override des themes survit.
75
+ *
76
+ * @description
77
+ * ⛔ LES CINQ VALEURS TYPOGRAPHIQUES SONT L'EXCEPTION, ET ELLE EST
78
+ * STRUCTURELLE. `useTypography` n'a AUCUNE echappatoire pour une valeur
79
+ * custom (`typography.composable.ts:210-216`) : il enveloppe toujours en
80
+ * `var(--origam-font__{groupe}---{valeur})`. Poser
81
+ * `fontSize: 'var(--origam-blockquote__elegant---font-size, 1.125rem)'`
82
+ * produirait le nom imbrique
83
+ * `var(--origam-font__size---var(--origam-blockquote__elegant---font-size, 1.125rem))`,
84
+ * qu'aucune feuille ne declare, et la declaration serait jetee. La ruse du
85
+ * pilote Kbd est donc indisponible ici — c'est **#1018**, ouvert, et il
86
+ * n'est PAS corrige dans ce lot. Seul `fontStyle` echappe, via
87
+ * `TYPOGRAPHY_PASSTHROUGH_MAP`, et son preset porte donc bien la chaine.
88
+ * @description
89
+ * Le cout de cette exception est NUL, et c'est mesure, pas suppose : chacun
90
+ * des 8 tokens concernes etait un ALIAS byte-pour-byte de l'echelon
91
+ * semantique que le preset pose a sa place (`__elegant---font-size:
92
+ * var(--origam-font__size---xl)` -> `fontSize: 'xl'`, et ainsi de suite),
93
+ * et aucun des 8 themes n'en lisait un seul. Les 8 tokens sortent donc des
94
+ * 4 feuilles et de `tokens.type.ts`, ce que `token-var-channels` prescrit
95
+ * lui-meme pour un token que plus rien ne lit.
96
+ *
97
+ * @description
98
+ * ⛔ CE QUE LA TABLE NE POSE PAS EST AUSSI IMPORTANT QUE CE QU'ELLE POSE.
99
+ * `pull` declarait `padding-inline:
100
+ * var(--origam-blockquote---resolved-padding-inline)` — une REDONDANCE avec
101
+ * la regle de base, qui pose exactement la meme valeur. L'inscrire ici
102
+ * emettrait une declaration INLINE, qui passerait devant la classe
103
+ * utilitaire qu'un `padding` du consommateur produit : la table
104
+ * confisquerait le canal qu'elle est censee servir. Valeur calculee
105
+ * identique des deux cotes tant qu'aucun `padding` n'est passe ; quand il
106
+ * l'est, l'axe inline de `pull` lui OBEIT desormais, ce qui va dans le sens
107
+ * du lot.
108
+ *
109
+ * @description
110
+ * ⛔ LES INDIRECTIONS `---resolved-*` NE SORTENT PAS D'ICI quand le token
111
+ * PUBLIC suffit. Les regles supprimees lisaient
112
+ * `var(--origam-blockquote---resolved-padding-inline)` et
113
+ * `var(--origam-blockquote---resolved-padding-block)`, deux proprietes
114
+ * custom que le bloc `<style scoped>` du composant synthetise lui-meme
115
+ * (`OrigamBlockquote.vue`, regle `.origam-blockquote`) et qu'AUCUNE feuille
116
+ * ne declare. Le preset nomme donc directement le token public que ces
117
+ * indirections resolvent — `--origam-blockquote---padding-inline, 24px` et
118
+ * `---padding-block, 16px` — ce qui est strictement equivalent par
119
+ * substitution (verifie : une seule declaration de chacune des deux
120
+ * indirections dans tout `packages/ds/src`, aucun modificateur ne les
121
+ * redeclare) et met le preset sur le canal de theme PUBLIC plutot que sur
122
+ * un detail interne. Le garde `ts-token-refs` cesse par la meme de
123
+ * rougir sur deux des quatre noms.
124
+ * @description
125
+ * ⚠️ `--origam-blockquote---resolved-accent-color` ne PEUT PAS subir le
126
+ * meme traitement, et c'est la seule entree de baseline que ce lot ajoute :
127
+ * les huit modificateurs `.origam-blockquote--accent-{intent}` REDECLARENT
128
+ * cette indirection. Nommer le token sous-jacent
129
+ * (`--origam-blockquote__accent---color`) rendrait `accent-color="primary"`
130
+ * inoperant sur le filet — une regression reelle. L'indirection est le
131
+ * mecanisme meme de l'axe `accentColor`, donc elle reste, avec un repli
132
+ * `currentColor` plat. ⛔ Un repli IMBRIQUE est exclu : le groupe `color`
133
+ * de `BORDER_REGEX` s'arrete a la premiere parenthese fermante, donc une
134
+ * valeur a repli imbrique ne matche pas DU TOUT et rien ne serait emis.
135
+ *
136
+ * @description
137
+ * ⚠️ `--origam-blockquote--minimal---accent-width` n'est declare par AUCUNE
138
+ * feuille — grammaire divergente, double tiret la ou le reste du composant
139
+ * ecrit `__`. `minimal` tombe donc toujours sur son repli `2px`. Le preset
140
+ * porte la chaine TELLE QUELLE : la fidelite est le travail, pas la
141
+ * correction. C'est **#1014**, et il n'est PAS corrige ici.
142
+ *
143
+ * @description
144
+ * ⚠️ `quoteMark` et `align` sont les deux moities « famille B » de ce
145
+ * composant — un element monte et un defaut d'alignement. D7 exige qu'elles
146
+ * passent par une prop COMPORTEMENTALE et que l'exemption soit documentee
147
+ * SUR la prop : voir leurs JSDoc dans
148
+ * `interfaces/Blockquote/blockquote.interface.ts`.
149
+ ********************************************************/
150
+ export declare const BLOCKQUOTE_VARIANT_PRESETS: TVariantPresets<TBlockquoteVariant, IBlockquoteProps>;
@@ -15,5 +15,42 @@ export const QUOTE_MARKS_BY_LANG = {
15
15
  export const BLOCKQUOTE_DEFAULTS = {
16
16
  variant: "default",
17
17
  lang: "auto",
18
+ align: "left",
18
19
  tag: "blockquote"
19
20
  };
21
+ export const BLOCKQUOTE_VARIANT_PRESETS = {
22
+ default: {
23
+ borderInlineStart: "var(--origam-blockquote__accent---width, 4px) solid var(--origam-blockquote---resolved-accent-color, currentColor)",
24
+ paddingInlineStart: "calc(var(--origam-blockquote---padding-inline, 24px) + var(--origam-blockquote__accent---width, 4px))"
25
+ },
26
+ elegant: {
27
+ fontFamily: "serif",
28
+ fontSize: "xl",
29
+ fontStyle: "var(--origam-blockquote__elegant---font-style, italic)",
30
+ lineHeight: "loose",
31
+ paddingBlock: "var(--origam-blockquote__elegant---padding-block, 24px)",
32
+ borderInlineStart: "var(--origam-blockquote__accent---width, 4px) solid var(--origam-blockquote---resolved-accent-color, currentColor)",
33
+ paddingInlineStart: "calc(var(--origam-blockquote---padding-inline, 24px) + var(--origam-blockquote__accent---width, 4px))"
34
+ },
35
+ quoted: {
36
+ quoteMark: true,
37
+ paddingTop: "calc(var(--origam-blockquote---padding-block, 16px) + var(--origam-blockquote--quoted---glyph-padding-extra, 1rem))"
38
+ },
39
+ minimal: {
40
+ fontSize: "md",
41
+ fontStyle: "var(--origam-blockquote__minimal---font-style, italic)",
42
+ paddingBlock: 0,
43
+ paddingInline: "var(--origam-blockquote__minimal---padding-inline, 12px)",
44
+ borderInlineStart: "var(--origam-blockquote--minimal---accent-width, 2px) solid var(--origam-blockquote---resolved-accent-color, currentColor)",
45
+ paddingInlineStart: "calc(var(--origam-blockquote__minimal---padding-inline, 12px) + var(--origam-blockquote--minimal---accent-width, 2px))"
46
+ },
47
+ pull: {
48
+ fontFamily: "serif",
49
+ fontSize: "3xl",
50
+ fontWeight: "medium",
51
+ lineHeight: "snug",
52
+ align: "center",
53
+ paddingBlock: "var(--origam-blockquote__pull---padding-block, 24px)",
54
+ borderBlock: "var(--origam-blockquote__pull---rule-width, 2px) solid var(--origam-blockquote---resolved-accent-color, currentColor)"
55
+ }
56
+ };
@@ -4,8 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.VARIANT_PROP_KEY = exports.VARIANT_PRESETS = void 0;
7
+ var _blockquote = require("../Blockquote/blockquote.const.cjs");
7
8
  var _kbd = require("../Kbd/kbd.const.cjs");
8
9
  const VARIANT_PROP_KEY = exports.VARIANT_PROP_KEY = "variant";
9
10
  const VARIANT_PRESETS = exports.VARIANT_PRESETS = {
11
+ "origam-blockquote": _blockquote.BLOCKQUOTE_VARIANT_PRESETS,
10
12
  "origam-kbd": _kbd.KBD_VARIANT_PRESETS
11
13
  };
@@ -25,12 +25,13 @@ export declare const VARIANT_PROP_KEY = "variant";
25
25
  * constitue pas.
26
26
  *
27
27
  * @description
28
- * ⛔ UN SEUL COMPOSANT CONVERTI A CE JOUR — `OrigamKbd`, lot 2. Le lot 1
29
- * d'ADR-005 livre le MECANISME (type partage, rang dans le resolveur,
30
- * canal `theme.variants`) et aucune conversion : chaque composant arrive
31
- * avec son propre lot, parce qu'aucun ne se convertit mecaniquement.
32
- * Mesure a l'appui (2026-09-30), la taxonomie « famille A » de D5 est
33
- * optimiste sur trois des quatre composants qu'elle liste :
28
+ * ⛔ DEUX COMPOSANTS CONVERTIS A CE JOUR — `OrigamKbd` (lot 2) et
29
+ * `OrigamBlockquote` (lot #1015). Le lot 1 d'ADR-005 livre le MECANISME
30
+ * (type partage, rang dans le resolveur, canal `theme.variants`) et aucune
31
+ * conversion : chaque composant arrive avec son propre lot, parce
32
+ * qu'aucun ne se convertit mecaniquement. Mesure a l'appui (2026-09-30),
33
+ * la taxonomie « famille A » de D5 est optimiste sur trois des quatre
34
+ * composants qu'elle liste :
34
35
  * @description
35
36
  * - `OrigamKbd` — FAIT (lot 2). Ses regles de variant posaient des
36
37
  * PROPRIETES CUSTOM que `key-surface` consomme sur la racine ET sur les
@@ -45,8 +46,18 @@ export declare const VARIANT_PROP_KEY = "variant";
45
46
  * - `OrigamBtnGroup` — recopie `--origam-btn-group---border-width` dans
46
47
  * une propriete custom qui alimente un `calc()` de rayon interieur.
47
48
  * Inexprimable en prop de racine.
48
- * - `OrigamBlockquote` — `padding-inline-start: calc(var(--…) + var(--…))`
49
- * et des regles imbriquees sur `__body` / `__attribution`.
49
+ * - `OrigamBlockquote` — FAIT (lot #1015). Les deux reserves que ce
50
+ * paragraphe posait se sont reglees sans nouveau mecanisme. Le
51
+ * `calc(var(--…) + var(--…))` voyage verbatim : `resolveSpacingValue`
52
+ * rend telle quelle toute valeur qui n'est pas un echelon de l'echelle.
53
+ * Les regles imbriquees sur `__body` / `__attribution` ne dependaient
54
+ * pas du variant mais de la PRESENCE du glyphe, donc elles sont
55
+ * reecrites en selecteurs de VOISINAGE (`__mark--bg + __body`,
56
+ * `__mark--bg ~ __attribution`) : elles se declenchent sur la condition
57
+ * reelle, n'ajoutent aucun alias de classe que `no-variant-css`
58
+ * surveillerait, et laissent zero ecart de style calcule sur les quatre
59
+ * autres variants. Le vrai obstacle etait ailleurs — `useTypography` n'a
60
+ * aucune echappatoire pour une valeur custom (#1018).
50
61
  * @description
51
62
  * Seul `OrigamBtn` ne peint que des proprietes de racine — mais il depend
52
63
  * de `IOpacityProps` / `IBackdropProps` (Q1, absents) et son `ghost` porte
@@ -1,5 +1,7 @@
1
+ import { BLOCKQUOTE_VARIANT_PRESETS } from "../Blockquote/blockquote.const.js";
1
2
  import { KBD_VARIANT_PRESETS } from "../Kbd/kbd.const.js";
2
3
  export const VARIANT_PROP_KEY = "variant";
3
4
  export const VARIANT_PRESETS = {
5
+ "origam-blockquote": BLOCKQUOTE_VARIANT_PRESETS,
4
6
  "origam-kbd": KBD_VARIANT_PRESETS
5
7
  };
@@ -78,13 +78,68 @@ export interface IBlockquoteProps extends ICommonsComponentProps, ITagProps, ICo
78
78
  */
79
79
  lang?: TBlockquoteLang;
80
80
  /**
81
- * Horizontal alignment of the citation body and attribution. The
82
- * `pull` variant forces `'center'` when this prop is left empty;
83
- * other variants default to `'left'`.
81
+ * Horizontal alignment of the citation body and attribution.
84
82
  *
85
- * @default 'left'
83
+ * ## ADR-005 D7 — exemption « famille B », documentée ICI et non
84
+ * implicitement
85
+ *
86
+ * `'center'` sur `pull` n'est plus calculé par le composant : c'est
87
+ * `BLOCKQUOTE_VARIANT_PRESETS.pull.align`, résolu au rang PRESET de la
88
+ * chaîne. La sémantique est identique à celle du `computed`
89
+ * `effectiveAlign` qu'il remplace — un `align` écrit au site d'appel
90
+ * gagne, parce que le rang 1 du résolveur (`if (wasPassed) return
91
+ * fallback`) précède le rang preset.
92
+ *
93
+ * ⚠️ **Rupture, assumée.** Le centrage de `pull` dépend désormais du
94
+ * résolveur, que seul `createOrigam()` installe. Un consommateur qui
95
+ * importe le composant sans installer le plugin obtient `'left'` (la
96
+ * valeur `withDefaults`, qui n'existe que comme plancher sans variant).
97
+ * Avant la conversion, le `computed` centrait sans plugin.
98
+ *
99
+ * @default 'left' — plancher `withDefaults`, que le preset de `pull` bat
86
100
  */
87
101
  align?: TBlockquoteAlign;
102
+ /*********************************************************
103
+ * quoteMark
104
+ *
105
+ * @description
106
+ * Monte le glyphe d'ouverture decoratif en filigrane de fond
107
+ * (`<span class="origam-blockquote__mark--bg">`), avec la paire de
108
+ * guillemets que `lang` selectionne.
109
+ *
110
+ * @description
111
+ * ⛔ ADR-005 D7 — EXEMPTION « FAMILLE B », DOCUMENTEE ICI ET NON
112
+ * IMPLICITEMENT. Ce prop existe parce que `quoted` ne se reduit PAS a
113
+ * des props de peinture : il MONTE UN ELEMENT. D7 interdit de laisser
114
+ * cet effet accroche au variant et exige que l'exemption soit ecrite
115
+ * sur la prop — c'est ce paragraphe.
116
+ *
117
+ * @description
118
+ * Le glyphe est donc pilote par `quoteMark`, et
119
+ * `BLOCKQUOTE_VARIANT_PRESETS.quoted` le pose a `true`. Deux
120
+ * consequences voulues : `quoted` reste le raccourci qu'il a toujours
121
+ * ete, et le glyphe devient atteignable sur N'IMPORTE QUEL variant
122
+ * (`<origam-blockquote variant="pull" quote-mark>`), ce que le modele
123
+ * SCSS rendait impossible.
124
+ *
125
+ * @description
126
+ * Les deux regles d'empilement que `quoted` portait (`position:
127
+ * relative; z-index: 1` sur `__body` et `__attribution`, pour que le
128
+ * texte passe devant le glyphe) suivent desormais la PRESENCE DU
129
+ * GLYPHE et non le variant : ce sont des selecteurs de voisinage
130
+ * (`__mark--bg + __body`, `__mark--bg ~ __attribution`), donc ils se
131
+ * declenchent exactement quand il y a quelque chose a surmonter, et
132
+ * laissent zero ecart de style calcule sur les quatre autres variants.
133
+ *
134
+ * @description
135
+ * ⚠️ Le sur-remplissage haut qui laisse de la place au glyphe
136
+ * (`paddingTop`) reste porte par le preset de `quoted`, pas par ce
137
+ * prop. `quote-mark` sur un autre variant rend donc le glyphe sans ce
138
+ * supplement — passer `padding-top` soi-meme le retablit.
139
+ *
140
+ * @default false
141
+ ********************************************************/
142
+ quoteMark?: boolean;
88
143
  }
89
144
  /**
90
145
  * Slot signatures for `<OrigamBlockquote>`. The `default` slot owns the
@@ -1,4 +1,5 @@
1
1
  import type { ICommand } from './command.interface';
2
+ import type { IAttachProps } from '../Commons/attach.interface';
2
3
  import type { ICommonsComponentProps } from '../Commons/commons.interface';
3
4
  import type { ITypographyProps } from '../Commons/typography.interface';
4
5
  /**
@@ -11,7 +12,7 @@ import type { ITypographyProps } from '../Commons/typography.interface';
11
12
  * the listeners so consumers can pass either form interchangeably.
12
13
  */
13
14
  export type TCommandPaletteHotkey = ReadonlyArray<string> | ReadonlyArray<ReadonlyArray<string>>;
14
- export interface ICommandPaletteProps extends ICommonsComponentProps, Pick<ITypographyProps, 'fontSize'> {
15
+ export interface ICommandPaletteProps extends ICommonsComponentProps, Pick<ITypographyProps, 'fontSize'>, IAttachProps {
15
16
  /** v-model — whether the palette is open. */
16
17
  modelValue?: boolean;
17
18
  /**
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `attach` — the teleport target for a component's floating / portal
3
+ * surface, resolved through `useTeleport()`
4
+ * (`composables/Commons/teleport.composable.ts`), the SINGLE consumption
5
+ * point for the whole DS. Extracted from `IOverlayProps` (#attach-
6
+ * harmonisation) so every component that teleports declares the exact
7
+ * same surface instead of a half-implemented, hand-rolled `to="body"`.
8
+ *
9
+ * • `true` → no teleport, render in place.
10
+ * • `false` / unset → `document.body`. Vue's boolean-prop casting
11
+ * defaults an ABSENT prop whose declared type
12
+ * includes `Boolean` to `false` when the
13
+ * component declares no `default` for it — so
14
+ * "not passed" and "passed `false`" resolve
15
+ * identically to `document.body` by design
16
+ * (see `OrigamOverlay`, `OrigamMenu`).
17
+ * • a CSS selector string → resolved against `document.querySelector`.
18
+ * • an `Element` → used directly as the teleport container.
19
+ * • `null` → reserved for a component whose OWN default
20
+ * is not `document.body` (`OrigamDrawer`
21
+ * teleports into its `<OrigamLayout>` wrapper
22
+ * by default) and therefore needs a THIRD
23
+ * state, distinguishable from an explicit
24
+ * `false`, to fall back to that non-body
25
+ * default instead. Same tri-state pattern as
26
+ * `IDrawerProps.push` / `.clipped`.
27
+ */
28
+ export interface IAttachProps {
29
+ attach?: boolean | string | Element | null;
30
+ }
@@ -1,5 +1,6 @@
1
1
  import type { IActiveProps } from '../Commons/active.interface';
2
2
  import type { IAdjacentSlots } from '../Commons/adjacent.interface';
3
+ import type { IAttachProps } from '../Commons/attach.interface';
3
4
  import type { IBgColorProps, IColorProps } from '../Commons/color.interface';
4
5
  import type { IBorderProps } from '../Commons/border.interface';
5
6
  import type { ICommonsComponentEmits, ICommonsComponentProps, ITagProps } from '../Commons/commons.interface';
@@ -12,7 +13,7 @@ import type { IPaddingProps } from '../Commons/padding.interface';
12
13
  import type { IRoundedProps } from '../Commons/rounded.interface';
13
14
  import type { IScrimProps } from '../Overlay/overlay-scrim.interface';
14
15
  import type { ITransitionComponentProps } from '../Commons/transition-component.interface';
15
- export interface IDrawerProps extends ITagProps, ICommonsComponentProps, IBorderProps, IElevationProps, ILayoutItemProps, IRoundedProps, IColorProps, IBgColorProps, IDensityProps, IPaddingProps, IMarginProps, ITransitionComponentProps, IScrimProps, IActiveProps, IHoverProps {
16
+ export interface IDrawerProps extends ITagProps, ICommonsComponentProps, IBorderProps, IElevationProps, ILayoutItemProps, IRoundedProps, IColorProps, IBgColorProps, IDensityProps, IPaddingProps, IMarginProps, ITransitionComponentProps, IScrimProps, IActiveProps, IHoverProps, IAttachProps {
16
17
  disableResizeWatcher?: boolean;
17
18
  disableRouteWatcher?: boolean;
18
19
  expandOnHover?: boolean;
@@ -60,6 +61,28 @@ export interface IDrawerProps extends ITagProps, ICommonsComponentProps, IBorder
60
61
  * Drawer before AppBar → drawer full-height.
61
62
  */
62
63
  clipped?: boolean | null;
64
+ /**
65
+ * `attach` — inherited from `IAttachProps`, re-documented here because
66
+ * `OrigamDrawer`'s DEFAULT target is not `document.body` like the rest
67
+ * of the Overlay family: it teleports into its `<OrigamLayout>`
68
+ * ancestor's `.origam-layout__wrapper` (by `id`, via `useLayoutItem`),
69
+ * or renders inline when no `<OrigamLayout>` ancestor exists (the
70
+ * "orphan" case).
71
+ *
72
+ * • `null` (default) → keep the layout-wrapper / orphan-inline
73
+ * behaviour described above. Declared as the explicit
74
+ * `withDefaults` value so Vue's boolean-prop casting —
75
+ * which would otherwise force an UNSET `attach` to
76
+ * `false` — never overrides it. Same device as `push` /
77
+ * `clipped` above.
78
+ * • `true` → render in place, bypassing BOTH the layout teleport
79
+ * AND the orphan fallback.
80
+ * • `false` → `document.body`, same as the rest of the Overlay
81
+ * family — escapes the layout wrapper entirely.
82
+ * • a CSS selector `string` / an `Element` → teleport there instead
83
+ * of the layout wrapper.
84
+ */
85
+ attach?: boolean | string | Element | null;
63
86
  }
64
87
  /**
65
88
  * Emits fired by `<OrigamDrawer>` — v-model on the open state, plus a
@@ -1,4 +1,5 @@
1
1
  import type { IActivatorProps } from '../Commons/activator.interface';
2
+ import type { IAttachProps } from '../Commons/attach.interface';
2
3
  import type { IClickOutsideEmits } from '../Commons/clickOutside.interface';
3
4
  import type { ICommonsComponentEmits, ICommonsComponentProps } from '../Commons/commons.interface';
4
5
  import type { IDimensionProps } from '../Commons/dimension.interface';
@@ -7,9 +8,8 @@ import type { ILocationStrategyProps } from '../Commons/location.interface';
7
8
  import type { IScrimProps } from './overlay-scrim.interface';
8
9
  import type { IScrollStrategyProps } from '../Commons/scroll.interface';
9
10
  import type { ITransitionComponentProps } from '../Commons/transition-component.interface';
10
- export interface IOverlayProps extends ICommonsComponentProps, IDimensionProps, IActivatorProps, ILocationStrategyProps, IScrollStrategyProps, ILazyProps, ITransitionComponentProps, IScrimProps {
11
+ export interface IOverlayProps extends ICommonsComponentProps, IDimensionProps, IActivatorProps, ILocationStrategyProps, IScrollStrategyProps, ILazyProps, ITransitionComponentProps, IScrimProps, IAttachProps {
11
12
  absolute?: boolean;
12
- attach?: boolean | string | Element;
13
13
  closeOnBack?: boolean;
14
14
  contentClass?: string | Array<string>;
15
15
  contentProps?: any;
@@ -1,4 +1,5 @@
1
1
  import type { Ref } from 'vue';
2
+ import type { IAttachProps } from '../Commons/attach.interface';
2
3
  import type { ICommonsComponentProps, ITagProps } from '../Commons/commons.interface';
3
4
  import type { ISnackbarGroupItem, ISnackbarGroupItemOptions } from './snackbar-group-item.interface';
4
5
  import type { TSnackbarGroupDirection, TSnackbarGroupLocation } from '../../types/Snackbar/snackbar-group.type';
@@ -12,7 +13,7 @@ import type { TSnackbarGroupDirection, TSnackbarGroupLocation } from '../../type
12
13
  * The component subscribes to its registered stack `id` and re-renders
13
14
  * when the underlying `items` ref changes.
14
15
  */
15
- export interface ISnackbarGroupProps extends ICommonsComponentProps, ITagProps {
16
+ export interface ISnackbarGroupProps extends ICommonsComponentProps, ITagProps, IAttachProps {
16
17
  /**
17
18
  * Identifier of the stack this container renders. Pair with
18
19
  * `useSnackbarGroup({ id })` to spawn items into the same stack.
@@ -520,6 +520,17 @@ Object.keys(_align).forEach(function (key) {
520
520
  }
521
521
  });
522
522
  });
523
+ var _attach = require("./Commons/attach.interface.cjs");
524
+ Object.keys(_attach).forEach(function (key) {
525
+ if (key === "default" || key === "__esModule") return;
526
+ if (key in exports && exports[key] === _attach[key]) return;
527
+ Object.defineProperty(exports, key, {
528
+ enumerable: true,
529
+ get: function () {
530
+ return _attach[key];
531
+ }
532
+ });
533
+ });
523
534
  var _audio = require("./Commons/audio.interface.cjs");
524
535
  Object.keys(_audio).forEach(function (key) {
525
536
  if (key === "default" || key === "__esModule") return;
@@ -45,6 +45,7 @@ export * from './Commons/activator.interface';
45
45
  export * from './Commons/active.interface';
46
46
  export * from './Commons/adjacent.interface';
47
47
  export * from './Commons/align.interface';
48
+ export * from './Commons/attach.interface';
48
49
  export * from './Commons/audio.interface';
49
50
  export * from './Commons/autocomplete.interface';
50
51
  export * from './Commons/backdrop.interface';
@@ -45,6 +45,7 @@ export * from "./Commons/activator.interface.js";
45
45
  export * from "./Commons/active.interface.js";
46
46
  export * from "./Commons/adjacent.interface.js";
47
47
  export * from "./Commons/align.interface.js";
48
+ export * from "./Commons/attach.interface.js";
48
49
  export * from "./Commons/audio.interface.js";
49
50
  export * from "./Commons/autocomplete.interface.js";
50
51
  export * from "./Commons/backdrop.interface.js";
@@ -525,7 +525,16 @@ const origamDarkTheme = exports.origamDarkTheme = {
525
525
  text: {
526
526
  primary: "#fafafa",
527
527
  secondary: "#a3a3a3",
528
- tertiary: "#737373",
528
+ /*********************************************************
529
+ * #1044 — tertiary corrigé
530
+ *
531
+ * @description
532
+ * Était '#737373' (neutral-500), copié du mode clair sans
533
+ * réadapter : 4.18:1 sur ce fond, sous AA (4.5:1). Aligné sur
534
+ * dark.css (neutral-400, 7.85:1) — voir sa note pour la
535
+ * mesure complète et pourquoi ce rung s'aplatit sur secondary.
536
+ ********************************************************/
537
+ tertiary: "#a3a3a3",
529
538
  disabled: "#525252",
530
539
  inverse: "#0a0a0a",
531
540
  onColor: "#ffffff",
@@ -253,7 +253,16 @@ export const origamDarkTheme = {
253
253
  text: {
254
254
  primary: "#fafafa",
255
255
  secondary: "#a3a3a3",
256
- tertiary: "#737373",
256
+ /*********************************************************
257
+ * #1044 — tertiary corrigé
258
+ *
259
+ * @description
260
+ * Était '#737373' (neutral-500), copié du mode clair sans
261
+ * réadapter : 4.18:1 sur ce fond, sous AA (4.5:1). Aligné sur
262
+ * dark.css (neutral-400, 7.85:1) — voir sa note pour la
263
+ * mesure complète et pourquoi ce rung s'aplatit sur secondary.
264
+ ********************************************************/
265
+ tertiary: "#a3a3a3",
257
266
  disabled: "#525252",
258
267
  inverse: "#0a0a0a",
259
268
  onColor: "#ffffff",