origam 2.32.0 → 2.32.2

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/CHANGELOG.md CHANGED
@@ -18,6 +18,26 @@ This project follows [Semantic Versioning](https://semver.org).
18
18
 
19
19
  ## [Unreleased]
20
20
 
21
+ ## [2.32.2] - 2026-10-17
22
+
23
+ ### Fixed — `OrigamBtn` : libellé collé en haut au lieu d'être centré (#1168)
24
+
25
+ Régression publiée de 2.29.1 à 2.32.1, introduite par #1094. La hauteur du bouton est devenue `height: auto` + `min-height`, et le `height: 100%` de la grille interne `.origam-btn__loader` ne se résolvait plus contre une hauteur automatique. La racine était `inline-block`, donc son `align-items: center` restait sans effet. Résultat : un bouton rendu en `<a>` (`href` / `to`) affichait son contenu d'une ligne collé en haut de la boîte. Mesuré en Chromium : écart de 4 à 21 px entre le centre du contenu et le centre du bouton, 35 boutons `<a>` d'une ligne décentrés sur les 40 de la matrice. Les 5 autres avaient une hauteur fixe (`icon`, prop `height`), étaient en `block` (déjà en flex), ou avaient un contenu aussi haut que le minimum (x-small compact). Un `<button>` natif masquait le défaut, puisque le navigateur centre lui-même son contenu.
26
+
27
+ - La racine passe de `inline-block` à `inline-flex`, et son `align-items: center` prend enfin effet. Elle reste de niveau inline (#933). Dans un parent flex ou grid, elle est blockifiée en `flex` au lieu de `block`. `block` (`display: flex`, #1095) et `wrap` (le bouton grandit avec son contenu, #1094) sont inchangés.
28
+ - `inline-flex` plutôt que `inline-grid`, d'après la mesure : la directive ripple ajoute un `origam-ripple__container` dans le flux pendant l'appui. Avec une racine en grille, ce conteneur prend une rangée implicite et le libellé saute de 4 px à chaque clic.
29
+ - Effet de bord mesuré : les boutons perdent environ 1 px de largeur (0,9 à 1,6 px). Ce pixel venait du `letter-spacing` ajouté après la grille interne quand elle était posée dans une ligne inline. Le libellé est maintenant à égale distance des deux bords (12 px / 12 px au lieu de 13,1 px / 12 px). Aucune hauteur ne change.
30
+
31
+ ## [2.32.1] - 2026-10-16
32
+
33
+ ### Fixed — trois avertissements console en dev (#1152)
34
+
35
+ Relevés pendant les e2e du playground, tous trois venaient de `packages/ds/src`, donc de tous les consommateurs en mode dev :
36
+
37
+ - **`update:hover` émis sans être déclaré** par `OrigamBtn`, `OrigamBreadcrumbItem`, `OrigamBracketMatch`, `OrigamBracketCompetitor` et `OrigamSheet`. `useStateFlag(props, {state: 'hover'})` écrit dans le v-model `hover` à chaque `mouseenter` / `mouseleave`. Vue avertissait donc à chaque survol, et le handler `onUpdate:hover` restait dans `$attrs`. Les cinq interfaces d'emits étendent maintenant `IHoverEmits`, et chaque story a sa Variant `Events - update:hover`, rangée dans la section EMITS. Les index positionnels des specs qui suivent sont recalés : `btn`, `btn-wrap-height`, `btn-block-flex`, `btn-border`, `btn-cascade-layer-probe`, `vrt/btn-variant` et `breadcrumb`.
38
+ - **`[Origam] A clickable icon is a button…`** au montage de chaque `OrigamSelect`, deux fois (sur `OrigamIcon` et sur l'`OrigamClassIcon` où l'écouteur retombait). En cause, le chevron du menu, qui portait un `@click="noop"` hérité de Vuetify. Ce handler sans effet faisait aussi passer le chevron à `aria-hidden="false"` : un glyphe décoratif était exposé aux technologies d'assistance, sans nom ni chemin clavier. Le handler est retiré. Le chevron redevient `aria-hidden="true"`, et le curseur `pointer` est conservé par une règle scopée sur `.origam-select__menu-icon`. Avant, il venait de `.origam-icon--clickable`. Sans la règle, le curseur mesuré passe à `auto`, et avec elle à `pointer`. L'ouverture du menu à la souris passe toujours par `@mousedown`.
39
+ - **`onUnmounted is called when there is no active component instance`** venait de `OrigamTextareaField`, qui appelait `useDragResizer` depuis un `watch`. Le nettoyage des écouteurs `window` n'était donc jamais enregistré, et chaque changement de `rows` / `maxRows` ajoutait un `mousedown` de plus sur la poignée (3 écouteurs mesurés après deux changements). `useDragResizer` accepte maintenant un `Ref` pour `el` et des `Ref` / getters pour `min` / `max`, s'appelle une seule fois dans `setup()` et nettoie via `tryOnScopeDispose`. La signature est élargie, sans rupture : les valeurs brutes restent acceptées.
40
+
21
41
  ## [2.32.0] - 2026-10-15
22
42
 
23
43
  ### Added — `OrigamCard` : `contentDisplay`, `hover` en objet (#1100)
@@ -151,7 +151,7 @@ const props = defineProps({
151
151
  fontSize: { type: null, required: false },
152
152
  fontWeight: { type: null, required: false }
153
153
  });
154
- const emit = defineEmits(["click", "update:active"]);
154
+ const emit = defineEmits(["click", "update:active", "update:hover"]);
155
155
  defineSlots();
156
156
  const { filterProps } = useProps(props);
157
157
  const { typographyStyles: competitorTypographyStyles } = useTypography(props, "bracket-competitor");
@@ -176,7 +176,7 @@ const props = defineProps({
176
176
  marginBlockStart: { type: [Boolean, Number, String], required: false },
177
177
  marginBlockEnd: { type: [Boolean, Number, String], required: false }
178
178
  });
179
- const emit = defineEmits(["click", "competitor-click", "winner-click", "update:active"]);
179
+ const emit = defineEmits(["click", "competitor-click", "winner-click", "update:active", "update:hover"]);
180
180
  defineSlots();
181
181
  const { filterProps } = useProps(props);
182
182
  const resolvedStatus = computed(() => props.status ?? props.match.status);
@@ -158,7 +158,7 @@ const props = defineProps({
158
158
  active: { type: [Boolean, Object], required: false },
159
159
  activeClass: { type: String, required: false }
160
160
  });
161
- defineEmits(["click:append", "click:prepend"]);
161
+ defineEmits(["click:append", "click:prepend", "update:hover"]);
162
162
  defineSlots();
163
163
  const { filterProps } = useProps(props);
164
164
  const attrs = useAttrs();
@@ -249,7 +249,7 @@ const props = defineProps({
249
249
  letterSpacing: { type: null, required: false }
250
250
  });
251
251
  const colorLocked = computed(() => props.color ? "true" : void 0);
252
- defineEmits(["group:selected"]);
252
+ defineEmits(["group:selected", "update:hover"]);
253
253
  defineSlots();
254
254
  const { filterProps } = useProps(props);
255
255
  const origamProgressRef = ref();
@@ -455,15 +455,25 @@ defineExpose({
455
455
  // Btn roots computed `display: block` with a `display: flex` parent,
456
456
  // and the single Btn inside a `<p>` computed `inline` at 984px wide.
457
457
  //
458
- // `inline-block` is the value the rest of this rule already assumed —
459
- // `vertical-align: middle` right below only has meaning on an
460
- // inline-level box. It is also the safest: inside a flex/grid parent it
461
- // blockifies to `block`, i.e. byte-for-byte today's computed value, so
462
- // no existing layout moves. `&--block` still overrides it with `flex`.
463
- display: inline-block;
464
- // #1094 — inoperant tant que la racine est `inline-block` ; prend effet
465
- // sur `&--block` (`display: flex`), ou `height: auto` + `min-height`
466
- // laisseraient sinon le contenu colle en haut.
458
+ // The root must stay INLINE-LEVEL (#933) — `vertical-align: middle` right
459
+ // below only has meaning on an inline-level box, and a Btn in a `<p>`
460
+ // must shrink to its content. Inside a flex/grid parent it blockifies to
461
+ // `flex`; `&--block` declares `flex` explicitly.
462
+ //
463
+ // ⛔ #1168 — it is `inline-flex`, not `inline-block`. Since #1094 the
464
+ // height is `auto` + `min-height`, and `__loader`'s `height: 100%` no
465
+ // longer resolves against an auto height: on an `<a>` (`href` / `to`) the
466
+ // label sat at the TOP of the box — 12 px of content glued under the top
467
+ // edge of a 28 px button (published 2.29.1 → 2.32.1). A `<button>` hid
468
+ // it, because the UA centres a button's content on its own. A flex root
469
+ // centres `__loader` with `align-items: center` below, on every tag.
470
+ //
471
+ // `inline-flex` rather than `inline-grid`, measured: the ripple directive
472
+ // appends an in-flow `origam-ripple__container` to this root while the
473
+ // pointer is down. A grid root gives it an implicit row that takes half
474
+ // the free height, and the label jumps 4 px on every press; a flex row
475
+ // leaves the label where it is.
476
+ display: inline-flex;
467
477
  align-items: center;
468
478
 
469
479
  position: var(--origam-btn---position, relative);
@@ -246,7 +246,6 @@
246
246
  <origam-icon
247
247
  :icon="menuIcon"
248
248
  class="origam-select__menu-icon"
249
- @click="noop"
250
249
  @mousedown="handleMousedownMenuIcon"
251
250
  />
252
251
  </slot>
@@ -316,7 +315,7 @@ import { MDI_ICONS } from "../../enums/Commons/mdi.enum";
316
315
  import { SELECT_STRATEGY } from "../../enums/Commons/nested.enum";
317
316
  import { SIZES } from "../../enums/Commons/size.enum";
318
317
  import { TEXT_FIELD_TYPE } from "../../enums/TextField/text-field.enum";
319
- import { deepEqual, matchesSelector, noop, wrapInArray } from "../../utils/Commons/commons.util";
318
+ import { deepEqual, matchesSelector, wrapInArray } from "../../utils/Commons/commons.util";
320
319
  import { forwardRefs } from "../../utils/Commons/forwardRefs.util";
321
320
  import { getUid } from "../../utils/Commons/getCurrentInstance.util";
322
321
  const props = defineProps({
@@ -1066,6 +1065,7 @@ defineExpose(forwardRefs({
1066
1065
  }
1067
1066
 
1068
1067
  &__menu-icon {
1068
+ cursor: pointer;
1069
1069
  margin-inline-start: 4px;
1070
1070
  transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1071
1071
  }
@@ -123,7 +123,7 @@ const props = defineProps({
123
123
  hover: { type: [Boolean, Object], required: false },
124
124
  hoverClass: { type: String, required: false }
125
125
  });
126
- const emit = defineEmits(["update:snap", "update:open", "update:active"]);
126
+ const emit = defineEmits(["update:snap", "update:open", "update:active", "update:hover"]);
127
127
  defineSlots();
128
128
  const { filterProps } = useProps(props);
129
129
  const { colorClasses, colorStyles } = useBothColor(
@@ -611,10 +611,7 @@ watch([model, () => props.maxRows, () => props.density, () => props.rows, active
611
611
  watch(minHeight, () => {
612
612
  controlHeight.value = minHeight.value;
613
613
  });
614
- watch([verticalDragger, minHeight, maxHeight], () => {
615
- if (!verticalDragger.value) return;
616
- useDragResizer(verticalDragger.value, controlHeight, minHeight.value, maxHeight.value, AXIS.Y);
617
- });
614
+ useDragResizer(verticalDragger, controlHeight, minHeight, maxHeight, AXIS.Y);
618
615
  watch(controlHeight, (newHeight) => {
619
616
  nextTick(() => {
620
617
  if (!textareaRef.value) return;
@@ -12,7 +12,7 @@ function useDragResizer(el, value, min, max, axis) {
12
12
  const resizing = (0, _vue.ref)(false);
13
13
  const removeListeners = [];
14
14
  const onUnmountedCleanupFns = [];
15
- (0, _vue.onUnmounted)(() => {
15
+ (0, _commons.tryOnScopeDispose)(() => {
16
16
  onUnmountedCleanupFns.forEach(fn => fn());
17
17
  });
18
18
  const isHorizontal = (0, _vue.computed)(() => {
@@ -31,7 +31,7 @@ function useDragResizer(el, value, min, max, axis) {
31
31
  const onMouseMove = e2 => {
32
32
  const clickOffset = (0, _commons.getPosition)(e2, isHorizontal.value ? _enums.CLIENT_POSITION.X : _enums.CLIENT_POSITION.Y);
33
33
  const delta = clickOffset - start;
34
- value.value = (0, _commons.clamp)(initialStart + delta, min, max);
34
+ value.value = (0, _commons.clamp)(initialStart + delta, (0, _vue.toValue)(min), (0, _vue.toValue)(max));
35
35
  };
36
36
  const onMouseUp = onDragEnd;
37
37
  removeListeners.push(...[(0, _commons.addWindowListener)("mousemove", onMouseMove, onUnmountedCleanupFns), (0, _commons.addWindowListener)("mouseup", onMouseUp, onUnmountedCleanupFns)]);
@@ -45,7 +45,7 @@ function useDragResizer(el, value, min, max, axis) {
45
45
  const onTouchMove = e2 => {
46
46
  const clickOffset = (0, _commons.getPosition)(e2, isHorizontal.value ? _enums.CLIENT_POSITION.X : _enums.CLIENT_POSITION.Y);
47
47
  const delta = clickOffset - start;
48
- value.value = Math.max(min, Math.min(max, initialStart + delta));
48
+ value.value = (0, _commons.clamp)(initialStart + delta, (0, _vue.toValue)(min), (0, _vue.toValue)(max));
49
49
  };
50
50
  const onTouchEnd = onDragEnd;
51
51
  removeListeners.push(...[(0, _commons.addWindowListener)("touchmove", onTouchMove, onUnmountedCleanupFns), (0, _commons.addWindowListener)("touchend", onTouchEnd, onUnmountedCleanupFns), (0, _commons.addWindowListener)("touchcancel", onTouchEnd, onUnmountedCleanupFns)]);
@@ -1,4 +1,4 @@
1
- import { Ref } from 'vue';
1
+ import type { MaybeRef, MaybeRefOrGetter, Ref } from 'vue';
2
2
  import type { TAxis } from '../../types/Commons/axis.type';
3
3
  /*********************************************************
4
4
  * useDragResizer
@@ -15,5 +15,18 @@ import type { TAxis } from '../../types/Commons/axis.type';
15
15
  * commente en mort dans le code et un `// TODO - Rework for both axis`
16
16
  * l'annonce explicitement. Passer `AXIS.Y` fait juste tomber dans la
17
17
  * branche verticale de `getPosition` sans etre teste par ce composable.
18
+ *
19
+ * @description
20
+ * ⛔ #1152 — `el`, `min` et `max` acceptent un `Ref` (ou un getter pour
21
+ * les bornes) pour que le composable s'appelle UNE fois, dans `setup()`.
22
+ * Son seul consommateur, `OrigamTextareaField`, l'appelait depuis un
23
+ * `watch` sur `[poignee, minHeight, maxHeight]` parce que la poignee
24
+ * n'existe qu'apres le montage et que les bornes bougent. Deux defauts en
25
+ * decoulaient : `onUnmounted` hors instance (Vue avertissait, le nettoyage
26
+ * des listeners `window` n'etait JAMAIS enregistre), et un `mousedown`
27
+ * SUPPLEMENTAIRE a chaque changement de borne, chacun avec ses bornes
28
+ * figees. `useEventListener` suit deja une cible `Ref`, et les bornes sont
29
+ * lues a chaque geste : rien n'oblige plus a rappeler le composable. Le
30
+ * nettoyage passe par `tryOnScopeDispose`, comme `useEventListener`.
18
31
  ********************************************************/
19
- export declare function useDragResizer(el: HTMLElement | undefined, value: Ref<number>, min: number, max: number, axis: TAxis): void;
32
+ export declare function useDragResizer(el: MaybeRef<HTMLElement | undefined>, value: Ref<number>, min: MaybeRefOrGetter<number>, max: MaybeRefOrGetter<number>, axis: TAxis): void;
@@ -1,12 +1,12 @@
1
- import { computed, onUnmounted, ref } from "vue";
1
+ import { computed, ref, toValue } from "vue";
2
2
  import { useEventListener } from "./eventListener.composable.js";
3
3
  import { AXIS, CLIENT_POSITION } from "../../enums/index.js";
4
- import { addWindowListener, clamp, getPosition } from "../../utils/Commons/commons.util.js";
4
+ import { addWindowListener, clamp, getPosition, tryOnScopeDispose } from "../../utils/Commons/commons.util.js";
5
5
  export function useDragResizer(el, value, min, max, axis) {
6
6
  const resizing = ref(false);
7
7
  const removeListeners = [];
8
8
  const onUnmountedCleanupFns = [];
9
- onUnmounted(() => {
9
+ tryOnScopeDispose(() => {
10
10
  onUnmountedCleanupFns.forEach((fn) => fn());
11
11
  });
12
12
  const isHorizontal = computed(() => {
@@ -25,7 +25,7 @@ export function useDragResizer(el, value, min, max, axis) {
25
25
  const onMouseMove = (e2) => {
26
26
  const clickOffset = getPosition(e2, isHorizontal.value ? CLIENT_POSITION.X : CLIENT_POSITION.Y);
27
27
  const delta = clickOffset - start;
28
- value.value = clamp(initialStart + delta, min, max);
28
+ value.value = clamp(initialStart + delta, toValue(min), toValue(max));
29
29
  };
30
30
  const onMouseUp = onDragEnd;
31
31
  removeListeners.push(...[
@@ -42,7 +42,7 @@ export function useDragResizer(el, value, min, max, axis) {
42
42
  const onTouchMove = (e2) => {
43
43
  const clickOffset = getPosition(e2, isHorizontal.value ? CLIENT_POSITION.X : CLIENT_POSITION.Y);
44
44
  const delta = clickOffset - start;
45
- value.value = Math.max(min, Math.min(max, initialStart + delta));
45
+ value.value = clamp(initialStart + delta, toValue(min), toValue(max));
46
46
  };
47
47
  const onTouchEnd = onDragEnd;
48
48
  removeListeners.push(...[
@@ -5,7 +5,7 @@ import type { ICommonsComponentProps, ITagProps } from '../Commons/commons.inter
5
5
  import type { IDensityProps } from '../Commons/density.interface';
6
6
  import type { IDimensionProps } from '../Commons/dimension.interface';
7
7
  import type { IElevationProps } from '../Commons/elevation.interface';
8
- import type { IHoverProps } from '../Commons/hover.interface';
8
+ import type { IHoverEmits, IHoverProps } from '../Commons/hover.interface';
9
9
  import type { IMarginProps } from '../Commons/margin.interface';
10
10
  import type { IPaddingProps } from '../Commons/padding.interface';
11
11
  import type { IRoundedProps } from '../Commons/rounded.interface';
@@ -75,7 +75,7 @@ export interface IBracketCompetitorProps extends ICommonsComponentProps, ITagPro
75
75
  }
76
76
  /** Emits fired by `<OrigamBracketCompetitor>` — click (mouse) / activation
77
77
  * (Enter / Space when `interactive`) on the row. */
78
- export interface IBracketCompetitorEmits extends IActiveEmits {
78
+ export interface IBracketCompetitorEmits extends IActiveEmits, IHoverEmits {
79
79
  (e: 'click', event: MouseEvent | KeyboardEvent): void;
80
80
  }
81
81
  /*********************************************************
@@ -5,7 +5,7 @@ import type { ICommonsComponentProps, ITagProps } from '../Commons/commons.inter
5
5
  import type { IDensityProps } from '../Commons/density.interface';
6
6
  import type { IDimensionProps } from '../Commons/dimension.interface';
7
7
  import type { IElevationProps } from '../Commons/elevation.interface';
8
- import type { IHoverProps } from '../Commons/hover.interface';
8
+ import type { IHoverEmits, IHoverProps } from '../Commons/hover.interface';
9
9
  import type { IMarginProps } from '../Commons/margin.interface';
10
10
  import type { IPaddingProps } from '../Commons/padding.interface';
11
11
  import type { IRoundedProps } from '../Commons/rounded.interface';
@@ -64,7 +64,7 @@ export interface IBracketMatchProps extends ICommonsComponentProps, ITagProps, I
64
64
  /** Emits fired by `<OrigamBracketMatch>` — click on the card itself
65
65
  * (outside a competitor row), and the two per-competitor channels the
66
66
  * card re-emits on behalf of its `competitor` slot / default rows. */
67
- export interface IBracketMatchEmits extends IActiveEmits {
67
+ export interface IBracketMatchEmits extends IActiveEmits, IHoverEmits {
68
68
  (e: 'click', match: IBracketMatch, event: MouseEvent): void;
69
69
  (e: 'competitor-click', competitor: IBracketCompetitor, match: IBracketMatch, side: 'A' | 'B', event: MouseEvent | KeyboardEvent): void;
70
70
  (e: 'winner-click', competitor: IBracketCompetitor, match: IBracketMatch, event: MouseEvent | KeyboardEvent): void;
@@ -4,7 +4,7 @@ import type { IBorderProps } from '../Commons/border.interface';
4
4
  import type { IBgColorProps, IColorProps } from '../Commons/color.interface';
5
5
  import type { ICommonsComponentProps, ITagProps } from '../Commons/commons.interface';
6
6
  import type { IDensityProps } from '../Commons/density.interface';
7
- import type { IHoverProps } from '../Commons/hover.interface';
7
+ import type { IHoverEmits, IHoverProps } from '../Commons/hover.interface';
8
8
  import type { ILinkProps } from '../Commons/router.interface';
9
9
  import type { IMarginProps } from '../Commons/margin.interface';
10
10
  import type { IPaddingProps } from '../Commons/padding.interface';
@@ -13,8 +13,14 @@ export interface IBreadcrumbItemProps extends ICommonsComponentProps, ITagProps,
13
13
  title: string;
14
14
  disabled?: boolean;
15
15
  }
16
- /** Emits fired by `<OrigamBreadcrumbItem>` — clicks on prepend/append icons. */
17
- export interface IBreadcrumbItemEmits extends IAdjacentEmits {
16
+ /** Emits fired by `<OrigamBreadcrumbItem>` — clicks on prepend/append icons,
17
+ * plus `update:hover`.
18
+ *
19
+ * ⛔ #1152 — `update:hover` partait sans etre declare : `useStateFlag(props,
20
+ * {state: 'hover'})` ecrit dans le v-model `hover` depuis `set()` /
21
+ * `unset()`, cables sur `@mouseenter` / `@mouseleave`. Prouve dans
22
+ * `packages/tests/TU/origam/relay-emits-declaration.spec.ts`. */
23
+ export interface IBreadcrumbItemEmits extends IAdjacentEmits, IHoverEmits {
18
24
  }
19
25
  /** Slot signatures for `<OrigamBreadcrumbItem>`. */
20
26
  export interface IBreadcrumbItemSlots extends IAdjacentSlots {
@@ -7,7 +7,7 @@ import type { IDensityProps } from '../Commons/density.interface';
7
7
  import type { IDimensionProps } from '../Commons/dimension.interface';
8
8
  import type { IElevationProps } from '../Commons/elevation.interface';
9
9
  import type { IGroupEmits, IGroupItemProps } from '../Commons/group.interface';
10
- import type { IHoverProps } from '../Commons/hover.interface';
10
+ import type { IHoverEmits, IHoverProps } from '../Commons/hover.interface';
11
11
  import type { ILinkProps } from '../Commons/router.interface';
12
12
  import type { IControlLoaderProps } from '../Commons/loader.interface';
13
13
  import type { ILocationProps } from '../Commons/location.interface';
@@ -56,8 +56,15 @@ export interface IBtnProps extends ICommonsComponentProps, IColorProps, IBgColor
56
56
  *
57
57
  * Two actions are two buttons: compose them with `<origam-btn-group>`. The
58
58
  * `prepend` / `append` SLOTS are unaffected — see {@link IBtnSlots}.
59
+ *
60
+ * ⛔ #1152 — `update:hover` used to leave UNDECLARED: `useStateFlag(props,
61
+ * {state: 'hover'})` writes through the `hover` v-model from `set()` /
62
+ * `unset()`, wired on `@mouseenter` / `@mouseleave`. Vue warned on EVERY
63
+ * hover of every button ("neither declared in the emits option"), and the
64
+ * `onUpdate:hover` handler stayed in `$attrs`. Pinned by
65
+ * `packages/tests/TU/origam/relay-emits-declaration.spec.ts`.
59
66
  */
60
- export interface IBtnEmits extends IGroupEmits {
67
+ export interface IBtnEmits extends IGroupEmits, IHoverEmits {
61
68
  }
62
69
  /** Slot signatures for `<OrigamBtn>`. */
63
70
  export interface IBtnSlots extends IAdjacentSlots {
@@ -1,4 +1,5 @@
1
1
  import type { IActiveEmits } from '../Commons/active.interface';
2
+ import type { IHoverEmits } from '../Commons/hover.interface';
2
3
  import type { TSheetSnapId } from '../../types/Sheet/sheet.type';
3
4
  /**
4
5
  * Emit signature for `<OrigamSheet>`.
@@ -21,8 +22,12 @@ import type { TSheetSnapId } from '../../types/Sheet/sheet.type';
21
22
  * lie que `@click`, et son `tag` par défaut est `div` — donc aucun
22
23
  * élément natif ne convertit une touche en clic. Le chemin clavier
23
24
  * n'existe pas.
25
+ * - `update:hover` (⛔ #1152) vient de `useStateFlag(props, { state: 'hover' })` :
26
+ * `set()` / `unset()` cables sur `@mouseenter` / `@mouseleave`. Partait
27
+ * sans etre declare. Prouve dans
28
+ * `packages/tests/TU/origam/relay-emits-declaration.spec.ts`.
24
29
  */
25
- export interface ISheetEmits extends IActiveEmits {
30
+ export interface ISheetEmits extends IActiveEmits, IHoverEmits {
26
31
  (e: 'update:snap', id: TSheetSnapId): void;
27
32
  (e: 'update:open', value: boolean): void;
28
33
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "origam",
3
- "version": "2.32.0",
3
+ "version": "2.32.2",
4
4
  "type": "module",
5
5
  "description": "origam — a Vue 3 design system with multi-theme design tokens, CSS-first components and TypeScript types.",
6
6
  "keywords": [