origam 2.17.1 → 2.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/CHANGELOG.md +895 -0
  2. package/dist/src/assets/css/main.css +1 -1
  3. package/dist/src/assets/css/tokens/dark.css +193 -26
  4. package/dist/src/assets/css/tokens/light.css +78 -11
  5. package/dist/src/assets/locales/en.json +21 -6
  6. package/dist/src/assets/locales/fr.json +21 -6
  7. package/dist/src/assets/scss/main.scss +10 -2
  8. package/dist/src/assets/scss/tokens/_dark.scss +2914 -13
  9. package/dist/src/assets/scss/tokens/_light.scss +78 -11
  10. package/dist/src/components/Alert/OrigamAlert.vue +6 -6
  11. package/dist/src/components/Avatar/OrigamAvatar.vue +15 -2
  12. package/dist/src/components/Badge/OrigamBadge.vue +7 -7
  13. package/dist/src/components/Breadcrumb/OrigamBreadcrumbItem.vue +23 -4
  14. package/dist/src/components/Btn/OrigamBtn.vue +22 -16
  15. package/dist/src/components/Btn/OrigamBtnGroup.vue +1 -1
  16. package/dist/src/components/Calendar/OrigamCalendar.vue +1 -1
  17. package/dist/src/components/Card/OrigamCard.vue +2 -0
  18. package/dist/src/components/Card/OrigamCardHeader.vue +7 -7
  19. package/dist/src/components/Carousel/OrigamCarousel.vue +14 -1
  20. package/dist/src/components/Chart/OrigamChartBoxPlot.vue +1 -1
  21. package/dist/src/components/Chart/OrigamChartBullet.vue +3 -2
  22. package/dist/src/components/Chart/OrigamChartCandlestick.vue +2 -2
  23. package/dist/src/components/Chart/OrigamChartCartesian.vue +49 -4
  24. package/dist/src/components/Chart/OrigamChartLegend.vue +39 -18
  25. package/dist/src/components/Chart/OrigamChartPareto.vue +7 -1
  26. package/dist/src/components/Chart/OrigamChartPictorial.vue +2 -2
  27. package/dist/src/components/Chart/OrigamChartRadar.vue +3 -1
  28. package/dist/src/components/Chart/OrigamChartSparkline.vue +3 -1
  29. package/dist/src/components/Chart/OrigamChartStreamgraph.vue +2 -1
  30. package/dist/src/components/Checkbox/OrigamCheckbox.vue +2 -0
  31. package/dist/src/components/Checkbox/OrigamCheckboxGroup.vue +36 -11
  32. package/dist/src/components/Chip/OrigamChip.vue +19 -4
  33. package/dist/src/components/Code/OrigamCode.vue +20 -3
  34. package/dist/src/components/ColorPickerField/OrigamColorPickerField.vue +30 -5
  35. package/dist/src/components/CommandPalette/OrigamCommandPalette.vue +3 -3
  36. package/dist/src/components/ConfirmWrapper/OrigamConfirmWrapper.vue +6 -6
  37. package/dist/src/components/ContextualMenu/OrigamContextualMenu.vue +0 -4
  38. package/dist/src/components/DataList/OrigamDataList.vue +2 -0
  39. package/dist/src/components/DataList/OrigamDataText.vue +6 -6
  40. package/dist/src/components/DataList/OrigamDataTitle.vue +6 -6
  41. package/dist/src/components/DataTable/OrigamDataTableHeaderCell.vue +1 -1
  42. package/dist/src/components/DataTable/OrigamDataTableHeadersCell.vue +4 -1
  43. package/dist/src/components/DatePicker/OrigamDatePicker.vue +2 -0
  44. package/dist/src/components/DatePicker/OrigamDatePickerHeader.vue +6 -6
  45. package/dist/src/components/DatePickerField/OrigamDatePickerField.vue +21 -1
  46. package/dist/src/components/Dialog/OrigamDialog.vue +25 -0
  47. package/dist/src/components/Dialog/OrigamDialogConfirmation.vue +6 -0
  48. package/dist/src/components/ExpansionPanel/OrigamExpansionPanel.vue +2 -0
  49. package/dist/src/components/ExpansionPanel/OrigamExpansionPanelHeader.vue +6 -6
  50. package/dist/src/components/Field/OrigamField.vue +47 -15
  51. package/dist/src/components/FileField/OrigamFileField.vue +5 -1
  52. package/dist/src/components/Icon/OrigamSvgIcon.vue +3 -1
  53. package/dist/src/components/Img/OrigamImg.vue +9 -2
  54. package/dist/src/components/InfiniteScroll/OrigamInfiniteScroll.vue +34 -18
  55. package/dist/src/components/InlineEdit/OrigamInlineEdit.vue +46 -5
  56. package/dist/src/components/Input/OrigamInput.vue +6 -6
  57. package/dist/src/components/List/OrigamListGroup.vue +4 -0
  58. package/dist/src/components/List/OrigamListItem.vue +68 -4
  59. package/dist/src/components/Masonry/OrigamMasonry.vue +18 -2
  60. package/dist/src/components/Menu/OrigamMenu.vue +79 -9
  61. package/dist/src/components/NumberField/OrigamNumberField.vue +13 -3
  62. package/dist/src/components/OtpInputField/OrigamOtpInputField.vue +35 -11
  63. package/dist/src/components/PasswordField/OrigamPasswordField.vue +5 -1
  64. package/dist/src/components/Radio/OrigamRadio.vue +2 -0
  65. package/dist/src/components/Radio/OrigamRadioGroup.vue +36 -11
  66. package/dist/src/components/RatingField/OrigamRatingField.vue +58 -7
  67. package/dist/src/components/RatingField/OrigamRatingFieldItem.vue +78 -30
  68. package/dist/src/components/Select/OrigamSelect.vue +44 -21
  69. package/dist/src/components/SliderField/OrigamSliderField.vue +20 -10
  70. package/dist/src/components/Snackbar/OrigamSnackbarGroup.vue +1 -1
  71. package/dist/src/components/Switch/OrigamSwitch.vue +2 -0
  72. package/dist/src/components/Tabs/OrigamTab.vue +7 -4
  73. package/dist/src/components/Tabs/OrigamTabPanel.vue +4 -2
  74. package/dist/src/components/Tabs/OrigamTabs.vue +7 -5
  75. package/dist/src/components/TextField/OrigamTextField.vue +5 -1
  76. package/dist/src/components/TextareaField/OrigamTextareaField.vue +5 -1
  77. package/dist/src/components/Transition/OrigamExpandX.vue +19 -3
  78. package/dist/src/components/Transition/OrigamExpandY.vue +19 -3
  79. package/dist/src/components/Transition/OrigamTranslateScale.vue +26 -4
  80. package/dist/src/components/Video/OrigamVideo.vue +3 -2
  81. package/dist/src/components/Window/OrigamWindow.vue +20 -3
  82. package/dist/src/composables/Commons/accessibleCommand.composable.cjs +26 -0
  83. package/dist/src/composables/Commons/accessibleCommand.composable.d.ts +78 -0
  84. package/dist/src/composables/Commons/accessibleCommand.composable.js +20 -0
  85. package/dist/src/composables/Commons/activator.composable.cjs +10 -1
  86. package/dist/src/composables/Commons/activator.composable.js +11 -2
  87. package/dist/src/composables/Commons/adjacent.composable.cjs +17 -0
  88. package/dist/src/composables/Commons/adjacent.composable.d.ts +12 -0
  89. package/dist/src/composables/Commons/adjacent.composable.js +17 -0
  90. package/dist/src/composables/Commons/adjacentInner.composable.cjs +20 -0
  91. package/dist/src/composables/Commons/adjacentInner.composable.d.ts +24 -5
  92. package/dist/src/composables/Commons/adjacentInner.composable.js +20 -0
  93. package/dist/src/composables/Commons/audio.composable.cjs +14 -1
  94. package/dist/src/composables/Commons/audio.composable.js +14 -1
  95. package/dist/src/composables/Commons/backButton.composable.cjs +3 -1
  96. package/dist/src/composables/Commons/backButton.composable.js +3 -1
  97. package/dist/src/composables/Commons/border.composable.d.ts +13 -0
  98. package/dist/src/composables/Commons/colorEffect.composable.cjs +58 -46
  99. package/dist/src/composables/Commons/colorEffect.composable.d.ts +10 -5
  100. package/dist/src/composables/Commons/colorEffect.composable.js +70 -46
  101. package/dist/src/composables/Commons/createLayout.composable.cjs +21 -12
  102. package/dist/src/composables/Commons/createLayout.composable.js +21 -12
  103. package/dist/src/composables/Commons/delay.composable.d.ts +16 -0
  104. package/dist/src/composables/Commons/dimension.composable.d.ts +11 -0
  105. package/dist/src/composables/Commons/elevation.composable.cjs +6 -2
  106. package/dist/src/composables/Commons/elevation.composable.d.ts +37 -1
  107. package/dist/src/composables/Commons/elevation.composable.js +7 -2
  108. package/dist/src/composables/Commons/goTo.composable.cjs +4 -2
  109. package/dist/src/composables/Commons/goTo.composable.js +5 -3
  110. package/dist/src/composables/Commons/group.composable.cjs +14 -14
  111. package/dist/src/composables/Commons/group.composable.js +14 -14
  112. package/dist/src/composables/Commons/hotkey.composable.d.ts +18 -7
  113. package/dist/src/composables/Commons/hydration.composable.d.ts +8 -0
  114. package/dist/src/composables/Commons/link.composable.d.ts +20 -0
  115. package/dist/src/composables/Commons/locationStrategies.composable.d.ts +17 -0
  116. package/dist/src/composables/Commons/message.composable.d.ts +19 -5
  117. package/dist/src/composables/Commons/position.composable.d.ts +17 -6
  118. package/dist/src/composables/Commons/refs.composable.d.ts +11 -5
  119. package/dist/src/composables/Commons/rounded.composable.d.ts +11 -1
  120. package/dist/src/composables/Commons/scrolling.composable.cjs +15 -12
  121. package/dist/src/composables/Commons/scrolling.composable.js +15 -12
  122. package/dist/src/composables/Commons/size.composable.d.ts +15 -0
  123. package/dist/src/composables/Commons/ssrBoot.composable.cjs +9 -1
  124. package/dist/src/composables/Commons/ssrBoot.composable.js +10 -2
  125. package/dist/src/composables/Commons/stack.composable.cjs +13 -1
  126. package/dist/src/composables/Commons/stack.composable.js +13 -1
  127. package/dist/src/composables/Commons/theme-props-resolver.composable.cjs +41 -32
  128. package/dist/src/composables/Commons/theme-props-resolver.composable.js +41 -32
  129. package/dist/src/composables/Commons/validation.composable.cjs +3 -3
  130. package/dist/src/composables/Commons/validation.composable.js +3 -3
  131. package/dist/src/composables/Commons/virtual.composable.cjs +24 -8
  132. package/dist/src/composables/Commons/virtual.composable.js +24 -8
  133. package/dist/src/composables/Masonry/masonry.composable.cjs +18 -11
  134. package/dist/src/composables/Masonry/masonry.composable.js +18 -11
  135. package/dist/src/composables/Parallax/parallax.composable.cjs +1 -1
  136. package/dist/src/composables/Parallax/parallax.composable.js +1 -1
  137. package/dist/src/composables/index.cjs +36 -0
  138. package/dist/src/composables/index.d.ts +3 -0
  139. package/dist/src/composables/index.js +3 -0
  140. package/dist/src/consts/Chart/chart-cartesian.const.cjs +5 -2
  141. package/dist/src/consts/Chart/chart-cartesian.const.d.ts +42 -0
  142. package/dist/src/consts/Chart/chart-cartesian.const.js +3 -0
  143. package/dist/src/consts/Commons/elevation.const.cjs +5 -1
  144. package/dist/src/consts/Commons/elevation.const.d.ts +52 -2
  145. package/dist/src/consts/Commons/elevation.const.js +4 -0
  146. package/dist/src/consts/Commons/ripple.const.cjs +13 -3
  147. package/dist/src/consts/Commons/ripple.const.js +13 -3
  148. package/dist/src/consts/RatingField/rating-field.const.cjs +10 -0
  149. package/dist/src/consts/RatingField/rating-field.const.d.ts +36 -0
  150. package/dist/src/consts/RatingField/rating-field.const.js +12 -0
  151. package/dist/src/consts/index.cjs +11 -0
  152. package/dist/src/consts/index.d.ts +1 -0
  153. package/dist/src/consts/index.js +1 -0
  154. package/dist/src/directives/ClickOutside/clickOutside.directive.cjs +2 -0
  155. package/dist/src/directives/ClickOutside/clickOutside.directive.js +2 -0
  156. package/dist/src/directives/Ripple/ripple.directive.cjs +2 -0
  157. package/dist/src/directives/Ripple/ripple.directive.js +2 -0
  158. package/dist/src/enums/Commons/color.enum.cjs +0 -1
  159. package/dist/src/enums/Commons/color.enum.d.ts +14 -5
  160. package/dist/src/enums/Commons/color.enum.js +0 -1
  161. package/dist/src/enums/Sheet/sheet.enum.d.ts +1 -1
  162. package/dist/src/interfaces/Btn/btn.interface.d.ts +7 -10
  163. package/dist/src/interfaces/Chart/chart-cartesian.interface.d.ts +6 -2
  164. package/dist/src/interfaces/Commons/activator.interface.d.ts +3 -2
  165. package/dist/src/interfaces/Commons/adjacent.interface.d.ts +29 -0
  166. package/dist/src/interfaces/Commons/group.interface.d.ts +13 -2
  167. package/dist/src/interfaces/Commons/ripple.interface.d.ts +16 -0
  168. package/dist/src/interfaces/Commons/scroll.interface.d.ts +3 -2
  169. package/dist/src/interfaces/DataTable/data-table-header.interface.d.ts +2 -2
  170. package/dist/src/interfaces/DatePicker/date-picker-month.interface.d.ts +2 -1
  171. package/dist/src/interfaces/Menu/menu.interface.d.ts +28 -1
  172. package/dist/src/interfaces/OtpInputField/otp-input-field.interface.d.ts +21 -1
  173. package/dist/src/interfaces/RatingField/rating-field-item.interface.d.ts +16 -1
  174. package/dist/src/interfaces/index.cjs +11 -0
  175. package/dist/src/interfaces/index.d.ts +1 -0
  176. package/dist/src/interfaces/index.js +1 -0
  177. package/dist/src/nuxt/module.cjs +2 -1
  178. package/dist/src/nuxt/module.js +2 -1
  179. package/dist/src/origam.cjs +1 -2
  180. package/dist/src/origam.js +1 -2
  181. package/dist/src/themes/origam.theme.cjs +8 -14
  182. package/dist/src/themes/origam.theme.js +6 -8
  183. package/dist/src/types/Commons/color.type.d.ts +4 -3
  184. package/dist/src/types/Commons/commons.type.d.ts +33 -0
  185. package/dist/src/types/Commons/theme.type.d.ts +2 -1
  186. package/dist/src/types/Sheet/sheet.type.d.ts +2 -1
  187. package/dist/src/types/index.cjs +22 -0
  188. package/dist/src/types/index.d.ts +2 -0
  189. package/dist/src/types/index.js +2 -0
  190. package/dist/src/types/tokens.type.d.ts +1 -1
  191. package/dist/src/utils/Commons/a11y.util.cjs +35 -0
  192. package/dist/src/utils/Commons/a11y.util.d.ts +63 -0
  193. package/dist/src/utils/Commons/a11y.util.js +33 -0
  194. package/dist/src/utils/Commons/clickOutside.util.cjs +5 -1
  195. package/dist/src/utils/Commons/clickOutside.util.js +5 -1
  196. package/dist/src/utils/Commons/color.util.cjs +10 -15
  197. package/dist/src/utils/Commons/color.util.d.ts +34 -28
  198. package/dist/src/utils/Commons/color.util.js +9 -16
  199. package/dist/src/utils/Commons/goTo.util.cjs +31 -14
  200. package/dist/src/utils/Commons/goTo.util.d.ts +1 -1
  201. package/dist/src/utils/Commons/goTo.util.js +31 -16
  202. package/dist/src/utils/Commons/location.util.cjs +18 -3
  203. package/dist/src/utils/Commons/location.util.js +18 -3
  204. package/dist/src/utils/Commons/ripple.util.cjs +5 -1
  205. package/dist/src/utils/Commons/ripple.util.js +5 -1
  206. package/dist/src/utils/index.cjs +11 -0
  207. package/dist/src/utils/index.d.ts +1 -0
  208. package/dist/src/utils/index.js +1 -0
  209. package/package.json +13 -2
  210. package/dist/src/consts/Btn/btn.const.cjs +0 -7
  211. package/dist/src/consts/Btn/btn.const.d.ts +0 -32
  212. package/dist/src/consts/Btn/btn.const.js +0 -1
  213. package/dist/src/types/Commons/locale.type.cjs +0 -1
  214. package/dist/src/types/Commons/locale.type.d.ts +0 -0
  215. package/dist/src/types/Commons/locale.type.js +0 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.warnMissingAccessibleName = warnMissingAccessibleName;
7
+ exports.warnMissingLandmarkName = warnMissingLandmarkName;
8
+ exports.warnMissingNativeControlName = warnMissingNativeControlName;
9
+ const _warnedCommandNameKeys = /* @__PURE__ */new Set();
10
+ function warnMissingAccessibleName(component, zone, prop) {
11
+ if (typeof console === "undefined") return;
12
+ if (!process.env?.DEV) return;
13
+ const key = `${component}::${zone}`;
14
+ if (_warnedCommandNameKeys.has(key)) return;
15
+ _warnedCommandNameKeys.add(key);
16
+ console.warn(`[origam] <${component}> the "${zone}" zone has a click listener but no accessible name, so it is NOT exposed as a button and NOT reachable by keyboard \u2014 a screen reader would announce "button" and nothing else (WCAG 2.1 4.1.2). Set "${prop}" to an i18n key or a literal label to make it a real control.`);
17
+ }
18
+ const _warnedNativeCommandKeys = /* @__PURE__ */new Set();
19
+ function warnMissingNativeControlName(component, hint) {
20
+ if (typeof console === "undefined") return;
21
+ if (!process.env?.DEV) return;
22
+ const key = `${component}::${hint}`;
23
+ if (_warnedNativeCommandKeys.has(key)) return;
24
+ _warnedNativeCommandKeys.add(key);
25
+ console.warn(`[origam] <${component}> renders a control with no accessible name: ${hint}. Add aria-label (or aria-labelledby) \u2014 an unnamed button announces as "button" and nothing else (WCAG 2.1 4.1.2).`);
26
+ }
27
+ const _warnedLandmarkKeys = /* @__PURE__ */new Set();
28
+ function warnMissingLandmarkName(component, role, roleDescription) {
29
+ if (typeof console === "undefined") return;
30
+ if (!process.env?.DEV) return;
31
+ const key = `${component}::${role}`;
32
+ if (_warnedLandmarkKeys.has(key)) return;
33
+ _warnedLandmarkKeys.add(key);
34
+ console.warn(`[origam] <${component}> has no accessible name, so it does NOT declare role="${role}" / aria-roledescription="${roleDescription}". An unnamed "${role}" is not a navigable landmark (WAI-ARIA 1.2 \u2014 name required), and a roledescription with no name describes nothing. Pass aria-label (or aria-labelledby) to <${component}> \u2014 it falls through to the root element.`);
35
+ }
@@ -0,0 +1,63 @@
1
+ /*********************************************************
2
+ * a11y.util — dev-time accessibility warnings
3
+ *
4
+ * @description
5
+ * ⛔ issues #747 / #653 / #660. Same once-per-key, `import.meta.env.DEV`-gated
6
+ * shape as `warnUnsupportedProp` (`color.util.ts`), but filed here rather
7
+ * than grown as a fifth warning inside a colour utility — these two say
8
+ * nothing about colour.
9
+ *
10
+ * Both warnings are SILENT in production builds. They exist to tell the
11
+ * developer what to add, at the moment they can still add it; shipping the
12
+ * string to an end user's console would help nobody.
13
+ ********************************************************/
14
+ /*********************************************************
15
+ * warnMissingAccessibleName
16
+ *
17
+ * @description
18
+ * A zone the DS would have promoted to `role="button"` has no accessible
19
+ * name, so `useAccessibleCommand` emitted no role and no tab stop. Names
20
+ * the exact prop that restores it.
21
+ ********************************************************/
22
+ export declare function warnMissingAccessibleName(component: string, zone: string, prop: string): void;
23
+ /*********************************************************
24
+ * warnMissingNativeControlName
25
+ *
26
+ * @description
27
+ * A NATIVE control (`<button>`, `<a href>`) renders with no text and no
28
+ * `aria-label` / `aria-labelledby`. Unlike a `role="button"` the DS added
29
+ * itself, this one cannot be withdrawn — the element IS a control. All the
30
+ * DS can do is say so, loudly, in development.
31
+ *
32
+ * @description
33
+ * No label is fabricated: a guessed string would silence axe while telling
34
+ * the user nothing (#622 shipped exactly that once, an auto-label that
35
+ * overwrote a visible `<label for>`).
36
+ ********************************************************/
37
+ export declare function warnMissingNativeControlName(component: string, hint: string): void;
38
+ /*********************************************************
39
+ * warnMissingLandmarkName
40
+ *
41
+ * @description
42
+ * ⛔ issue #781 — same rule as `warnMissingAccessibleName`, one rung up: a
43
+ * LANDMARK the DS would have declared has no accessible name, so the DS
44
+ * declared nothing.
45
+ *
46
+ * @description
47
+ * `region` is one of the few roles whose ARIA definition marks the
48
+ * accessible name as REQUIRED (WAI-ARIA 1.2, role `region`: "Name Required:
49
+ * True"), and HTML-AAM says the same thing from the other side — a
50
+ * `<section>` maps to `region` only when it is named, and to `generic`
51
+ * otherwise. An unnamed `role="region"` is therefore not a landmark a user
52
+ * can usefully navigate to; it is an authoring error that puts a nameless
53
+ * entry in the landmark list. `aria-roledescription` riding along makes it
54
+ * worse, not better: it replaces the role name a screen reader would have
55
+ * announced with a description attached to nothing.
56
+ *
57
+ * @description
58
+ * No name is fabricated. "Carousel" as a default label would name every
59
+ * carousel on a page identically — exactly the defect `OrigamCode`'s
60
+ * scroller was corrected for (five homonymous regions in one landmark
61
+ * list). The consumer holds the only string that distinguishes them.
62
+ ********************************************************/
63
+ export declare function warnMissingLandmarkName(component: string, role: string, roleDescription: string): void;
@@ -0,0 +1,33 @@
1
+ const _warnedCommandNameKeys = /* @__PURE__ */ new Set();
2
+ export function warnMissingAccessibleName(component, zone, prop) {
3
+ if (typeof console === "undefined") return;
4
+ if (!import.meta.env?.DEV) return;
5
+ const key = `${component}::${zone}`;
6
+ if (_warnedCommandNameKeys.has(key)) return;
7
+ _warnedCommandNameKeys.add(key);
8
+ console.warn(
9
+ `[origam] <${component}> the "${zone}" zone has a click listener but no accessible name, so it is NOT exposed as a button and NOT reachable by keyboard \u2014 a screen reader would announce "button" and nothing else (WCAG 2.1 4.1.2). Set "${prop}" to an i18n key or a literal label to make it a real control.`
10
+ );
11
+ }
12
+ const _warnedNativeCommandKeys = /* @__PURE__ */ new Set();
13
+ export function warnMissingNativeControlName(component, hint) {
14
+ if (typeof console === "undefined") return;
15
+ if (!import.meta.env?.DEV) return;
16
+ const key = `${component}::${hint}`;
17
+ if (_warnedNativeCommandKeys.has(key)) return;
18
+ _warnedNativeCommandKeys.add(key);
19
+ console.warn(
20
+ `[origam] <${component}> renders a control with no accessible name: ${hint}. Add aria-label (or aria-labelledby) \u2014 an unnamed button announces as "button" and nothing else (WCAG 2.1 4.1.2).`
21
+ );
22
+ }
23
+ const _warnedLandmarkKeys = /* @__PURE__ */ new Set();
24
+ export function warnMissingLandmarkName(component, role, roleDescription) {
25
+ if (typeof console === "undefined") return;
26
+ if (!import.meta.env?.DEV) return;
27
+ const key = `${component}::${role}`;
28
+ if (_warnedLandmarkKeys.has(key)) return;
29
+ _warnedLandmarkKeys.add(key);
30
+ console.warn(
31
+ `[origam] <${component}> has no accessible name, so it does NOT declare role="${role}" / aria-roledescription="${roleDescription}". An unnamed "${role}" is not a navigable landmark (WAI-ARIA 1.2 \u2014 name required), and a roledescription with no name describes nothing. Pass aria-label (or aria-labelledby) to <${component}> \u2014 it falls through to the root element.`
32
+ );
33
+ }
@@ -26,11 +26,15 @@ function checkIsActive(e, binding) {
26
26
  function directive(e, el, binding) {
27
27
  const handler = typeof binding.value === "function" ? binding.value : binding.value.handler;
28
28
  if (el._clickOutside?.lastMousedownWasOutside && checkEvent(e, el, binding)) {
29
- setTimeout(() => {
29
+ const store = el._clickOutside;
30
+ const id = setTimeout(() => {
31
+ store.timers?.delete(id);
30
32
  if (checkIsActive(e, binding) && handler) {
31
33
  handler(e);
32
34
  }
33
35
  }, 0);
36
+ store.timers ??= /* @__PURE__ */new Set();
37
+ store.timers.add(id);
34
38
  }
35
39
  }
36
40
  function handleShadow(el, callback) {
@@ -17,11 +17,15 @@ export function checkIsActive(e, binding) {
17
17
  export function directive(e, el, binding) {
18
18
  const handler = typeof binding.value === "function" ? binding.value : binding.value.handler;
19
19
  if (el._clickOutside?.lastMousedownWasOutside && checkEvent(e, el, binding)) {
20
- setTimeout(() => {
20
+ const store = el._clickOutside;
21
+ const id = setTimeout(() => {
22
+ store.timers?.delete(id);
21
23
  if (checkIsActive(e, binding) && handler) {
22
24
  handler(e);
23
25
  }
24
26
  }, 0);
27
+ store.timers ??= /* @__PURE__ */ new Set();
28
+ store.timers.add(id);
25
29
  }
26
30
  }
27
31
  export function handleShadow(el, callback) {
@@ -27,6 +27,7 @@ exports.getLuma = getLuma;
27
27
  exports.intentBgExpr = intentBgExpr;
28
28
  exports.intentFgExpr = intentFgExpr;
29
29
  exports.intentTokenBase = intentTokenBase;
30
+ exports.isCompleteCssColor = isCompleteCssColor;
30
31
  exports.isCssColor = isCssColor;
31
32
  exports.isIntent = isIntent;
32
33
  exports.isParsableColor = isParsableColor;
@@ -39,7 +40,6 @@ exports.rawBgExprWithState = rawBgExprWithState;
39
40
  exports.toHex = toHex;
40
41
  exports.tokenForegroundForIntent = tokenForegroundForIntent;
41
42
  exports.tokenStylesForIntent = tokenStylesForIntent;
42
- exports.warnDeprecatedEmit = warnDeprecatedEmit;
43
43
  exports.warnDeprecatedProp = warnDeprecatedProp;
44
44
  exports.warnLegacyColor = warnLegacyColor;
45
45
  exports.warnUnsupportedProp = warnUnsupportedProp;
@@ -53,6 +53,13 @@ function isCssColor(color) {
53
53
  function isParsableColor(color) {
54
54
  return isCssColor(color) && !/^((rgb|hsl)a?\()?var\(--/.test(color) && !/^color-mix\(/i.test(color);
55
55
  }
56
+ function isCompleteCssColor(color) {
57
+ if (!color) return false;
58
+ if (color.startsWith("#")) {
59
+ return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color);
60
+ }
61
+ return isCssColor(color);
62
+ }
56
63
  function parseColor(color) {
57
64
  if (typeof color === "number") {
58
65
  if (isNaN(color) || color < 0 || color > 16777215) {
@@ -368,15 +375,13 @@ function intentBgExpr(intent, role) {
368
375
  const base = intentTokenBase(intent);
369
376
  const baseVar = `var(--origam-color__${base}---bg)`;
370
377
  if (role === "default") return baseVar;
371
- if (role === "disabled") return `var(--origam-color__${base}---bgDisabled)`;
372
378
  const pct = role === "hover" ? _color.COLOR_HOVER_MIX_PCT : _color.COLOR_ACTIVE_MIX_PCT;
373
379
  const slot = role === "hover" ? "bgHover" : "bgActive";
374
380
  return `var(--origam-color__${base}---${slot}, color-mix(in srgb, ${baseVar}, black ${pct}%))`;
375
381
  }
376
- function intentFgExpr(intent, role) {
382
+ function intentFgExpr(intent, _role) {
377
383
  const base = intentTokenBase(intent);
378
- const slot = role === "disabled" ? "fgDisabled" : "fg";
379
- return `var(--origam-color__${base}---${slot})`;
384
+ return `var(--origam-color__${base}---fg)`;
380
385
  }
381
386
  function tokenStylesForIntent(intent, role = _color2.BG_FG_ROLE.DEFAULT) {
382
387
  return {
@@ -386,7 +391,6 @@ function tokenStylesForIntent(intent, role = _color2.BG_FG_ROLE.DEFAULT) {
386
391
  }
387
392
  function rawBgExprWithState(raw, role) {
388
393
  if (role === "default") return raw;
389
- if (role === "disabled") return raw;
390
394
  const pct = role === "hover" ? _color.COLOR_HOVER_MIX_PCT : _color.COLOR_ACTIVE_MIX_PCT;
391
395
  return `color-mix(in srgb, ${raw}, black ${pct}%)`;
392
396
  }
@@ -426,13 +430,4 @@ function warnUnsupportedProp(component, prop, reason) {
426
430
  if (_warnedUnsupportedPropKeys.has(key)) return;
427
431
  _warnedUnsupportedPropKeys.add(key);
428
432
  console.warn(`[origam] <${component}> prop "${prop}" has no effect on this component: ${reason}`);
429
- }
430
- const _warnedDeprecatedEmitKeys = /* @__PURE__ */new Set();
431
- function warnDeprecatedEmit(component, emit, replacement, removalVersion = "v3.0.0") {
432
- if (typeof console === "undefined") return;
433
- if (!process.env?.DEV) return;
434
- const key = `${component}::${emit}`;
435
- if (_warnedDeprecatedEmitKeys.has(key)) return;
436
- _warnedDeprecatedEmitKeys.add(key);
437
- console.warn(`[origam] <${component}> emit "${emit}" is deprecated and will be removed in ${removalVersion}. ${replacement}`);
438
433
  }
@@ -49,6 +49,30 @@ export declare function isCssColor(color?: string | null | false): boolean;
49
49
  * @returns …
50
50
  ********************************************************/
51
51
  export declare function isParsableColor(color: string): boolean;
52
+ /*********************************************************
53
+ * isCompleteCssColor
54
+ *
55
+ * @description
56
+ * Is complete css color — a strictER sibling of `isCssColor`, meant to
57
+ * gate a COMMIT (a user's typed keystroke reaching the model), not a
58
+ * style-consumption path.
59
+ *
60
+ * @description
61
+ * `isCssColor`'s hex branch deliberately only checks the `#` prefix
62
+ * (`/^#/`) — a value that fails to paint at the CSS-consumption layer is
63
+ * harmless, so `#f`, `#ff`, `#fffff` (5 digits) all pass it today. That
64
+ * tolerance is wrong for a commit gate: a user mid-typing `#ff00aa`
65
+ * passes through `#f`, `#ff`, `#ff0`… and only a SYNTACTICALLY COMPLETE
66
+ * hex (3, 4, 6 or 8 digits) should actually reach `modelValue` — #859
67
+ * (`OrigamColorPickerField` / `OrigamDatePickerField` direct-typing
68
+ * wiring). Every other category (functional notation, named colors,
69
+ * `var()`) reuses `isCssColor` unchanged — its check is already exact
70
+ * there.
71
+ *
72
+ * @param color …
73
+ * @returns …
74
+ ********************************************************/
75
+ export declare function isCompleteCssColor(color: string): boolean;
52
76
  /*********************************************************
53
77
  * parseColor
54
78
  *
@@ -384,18 +408,23 @@ export declare function intentTokenBase(intent: TIntent): string;
384
408
  * • `default` → `var(--…-bg)`
385
409
  * • `hover` → `var(--…-bgHover, color-mix(in srgb, var(--…-bg), black 20%))`
386
410
  * • `active` → `var(--…-bgActive, color-mix(in srgb, var(--…-bg), black 30%))`
387
- * • `disabled` → `var(--…-bgDisabled)`
411
+ *
412
+ * @description
413
+ * There is no `disabled` rung — disabled is an opacity veil, not a token
414
+ * swap. See `BG_FG_ROLE` (#823) for why emitting one would erase the
415
+ * surface rather than repaint it.
388
416
  ********************************************************/
389
417
  export declare function intentBgExpr(intent: TIntent, role: TBgFgRole): string;
390
418
  /*********************************************************
391
419
  * intentFgExpr
392
420
  *
393
421
  * @description
394
- * Foreground stays the same hue across hover / active by design — we
395
- * darken the surface around the text, the text itself keeps the
396
- * WCAG-paired contrast token.
422
+ * Foreground stays the same hue across every role by design — we darken
423
+ * the surface around the text, the text itself keeps the WCAG-paired
424
+ * contrast token. `role` is therefore accepted for signature symmetry with
425
+ * `intentBgExpr` and does not branch (there is no `disabled` rung — #823).
397
426
  ********************************************************/
398
- export declare function intentFgExpr(intent: TIntent, role: TBgFgRole): string;
427
+ export declare function intentFgExpr(intent: TIntent, _role: TBgFgRole): string;
399
428
  /*********************************************************
400
429
  * tokenStylesForIntent
401
430
  *
@@ -463,26 +492,3 @@ export declare function warnDeprecatedProp(component: string, oldProp: string, n
463
492
  * bullishColor/bearishColor").
464
493
  ********************************************************/
465
494
  export declare function warnUnsupportedProp(component: string, prop: string, reason: string): void;
466
- /*********************************************************
467
- * warnDeprecatedEmit
468
- *
469
- * @description
470
- * Warn (once per component / emit, dev builds only) that the consumer
471
- * attached a listener to an emit scheduled for removal. The emit KEEPS
472
- * FIRING until the removal version — this announces the break instead of
473
- * shipping it. `replacement` should name what to do instead, not merely
474
- * say the emit is going away. Same once-per-key cache as the three
475
- * warnings above, but for a public EMIT rather than a prop.
476
- *
477
- * @description
478
- * First use case: `click:prepend` / `click:append` on `<OrigamBtn>` (#443).
479
- * Those two were reachable by MOUSE ONLY — the emit is bound to a
480
- * descendant span, while keyboard activation synthesises its click on the
481
- * button root. The `role="button"` + tab-stop remedy `useAdjacent` applies
482
- * on the other ten consumers is ILLEGAL here: Btn's root is a
483
- * `<button>`/`<a>`, whose content model forbids both an interactive
484
- * descendant and any descendant carrying `tabindex`. A control that already
485
- * owns one action cannot host a second — two actions are two buttons
486
- * (`origam-btn-group`).
487
- ********************************************************/
488
- export declare function warnDeprecatedEmit(component: string, emit: string, replacement: string, removalVersion?: string): void;
@@ -8,6 +8,13 @@ export function isCssColor(color) {
8
8
  export function isParsableColor(color) {
9
9
  return isCssColor(color) && !/^((rgb|hsl)a?\()?var\(--/.test(color) && !/^color-mix\(/i.test(color);
10
10
  }
11
+ export function isCompleteCssColor(color) {
12
+ if (!color) return false;
13
+ if (color.startsWith("#")) {
14
+ return /^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color);
15
+ }
16
+ return isCssColor(color);
17
+ }
11
18
  export function parseColor(color) {
12
19
  if (typeof color === "number") {
13
20
  if (isNaN(color) || color < 0 || color > 16777215) {
@@ -274,15 +281,13 @@ export function intentBgExpr(intent, role) {
274
281
  const base = intentTokenBase(intent);
275
282
  const baseVar = `var(--origam-color__${base}---bg)`;
276
283
  if (role === "default") return baseVar;
277
- if (role === "disabled") return `var(--origam-color__${base}---bgDisabled)`;
278
284
  const pct = role === "hover" ? COLOR_HOVER_MIX_PCT : COLOR_ACTIVE_MIX_PCT;
279
285
  const slot = role === "hover" ? "bgHover" : "bgActive";
280
286
  return `var(--origam-color__${base}---${slot}, color-mix(in srgb, ${baseVar}, black ${pct}%))`;
281
287
  }
282
- export function intentFgExpr(intent, role) {
288
+ export function intentFgExpr(intent, _role) {
283
289
  const base = intentTokenBase(intent);
284
- const slot = role === "disabled" ? "fgDisabled" : "fg";
285
- return `var(--origam-color__${base}---${slot})`;
290
+ return `var(--origam-color__${base}---fg)`;
286
291
  }
287
292
  export function tokenStylesForIntent(intent, role = BG_FG_ROLE.DEFAULT) {
288
293
  return {
@@ -292,7 +297,6 @@ export function tokenStylesForIntent(intent, role = BG_FG_ROLE.DEFAULT) {
292
297
  }
293
298
  export function rawBgExprWithState(raw, role) {
294
299
  if (role === "default") return raw;
295
- if (role === "disabled") return raw;
296
300
  const pct = role === "hover" ? COLOR_HOVER_MIX_PCT : COLOR_ACTIVE_MIX_PCT;
297
301
  return `color-mix(in srgb, ${raw}, black ${pct}%)`;
298
302
  }
@@ -339,14 +343,3 @@ export function warnUnsupportedProp(component, prop, reason) {
339
343
  `[origam] <${component}> prop "${prop}" has no effect on this component: ${reason}`
340
344
  );
341
345
  }
342
- const _warnedDeprecatedEmitKeys = /* @__PURE__ */ new Set();
343
- export function warnDeprecatedEmit(component, emit, replacement, removalVersion = "v3.0.0") {
344
- if (typeof console === "undefined") return;
345
- if (!import.meta.env?.DEV) return;
346
- const key = `${component}::${emit}`;
347
- if (_warnedDeprecatedEmitKeys.has(key)) return;
348
- _warnedDeprecatedEmitKeys.add(key);
349
- console.warn(
350
- `[origam] <${component}> emit "${emit}" is deprecated and will be removed in ${removalVersion}. ${replacement}`
351
- );
352
- }
@@ -68,7 +68,7 @@ function clampTarget(container, value, horizontal) {
68
68
  }
69
69
  return Math.max(Math.min(value, max), min);
70
70
  }
71
- async function scrollTo(_target, _options, horizontal, goTo) {
71
+ async function scrollTo(_target, _options, horizontal, goTo, signal) {
72
72
  const rtl = goTo?.rtl.value;
73
73
  const property = horizontal ? "scrollLeft" : "scrollTop";
74
74
  const options = (0, _commons.mergeDeep)(goTo?.options ?? genDefaults(), _options);
@@ -95,17 +95,34 @@ async function scrollTo(_target, _options, horizontal, goTo) {
95
95
  if (targetLocation === startLocation) return Promise.resolve(targetLocation);
96
96
  const startTime = performance.now();
97
97
  const duration = options.duration;
98
- return new Promise(resolve => requestAnimationFrame(function step(currentTime) {
99
- const timeElapsed = currentTime - startTime;
100
- const progress = timeElapsed / duration;
101
- const location = Math.floor(startLocation + (targetLocation - startLocation) * ease((0, _commons.clamp)(progress, 0, 1)));
102
- container[property] = location;
103
- if (progress >= 1 && Math.abs(location - container[property]) < 10) {
104
- return resolve(targetLocation);
105
- } else if (progress > 2) {
106
- (0, _console.consoleWarn)("Scroll target is not reachable");
107
- return resolve(container[property]);
108
- }
109
- requestAnimationFrame(step);
110
- }));
98
+ return new Promise(resolve => {
99
+ let frame = -1;
100
+ const onAbort = () => {
101
+ if (frame !== -1) {
102
+ cancelAnimationFrame(frame);
103
+ frame = -1;
104
+ }
105
+ resolve(container[property] ?? startLocation);
106
+ };
107
+ frame = requestAnimationFrame(function step(currentTime) {
108
+ frame = -1;
109
+ if (signal?.aborted) return;
110
+ const timeElapsed = currentTime - startTime;
111
+ const progress = timeElapsed / duration;
112
+ const location = Math.floor(startLocation + (targetLocation - startLocation) * ease((0, _commons.clamp)(progress, 0, 1)));
113
+ container[property] = location;
114
+ if (progress >= 1 && Math.abs(location - container[property]) < 10) {
115
+ signal?.removeEventListener("abort", onAbort);
116
+ return resolve(targetLocation);
117
+ } else if (progress > 2) {
118
+ (0, _console.consoleWarn)("Scroll target is not reachable");
119
+ signal?.removeEventListener("abort", onAbort);
120
+ return resolve(container[property]);
121
+ }
122
+ frame = requestAnimationFrame(step);
123
+ });
124
+ signal?.addEventListener("abort", onAbort, {
125
+ once: true
126
+ });
127
+ });
111
128
  }
@@ -40,4 +40,4 @@ export declare function clampTarget(container: HTMLElement, value: number, horiz
40
40
  * @param horizontal …
41
41
  * @param goTo …
42
42
  */
43
- export declare function scrollTo(_target: ComponentPublicInstance | HTMLElement | number | string, _options: Partial<IGoToOptions>, horizontal?: boolean, goTo?: IGoToInstance): Promise<unknown>;
43
+ export declare function scrollTo(_target: ComponentPublicInstance | HTMLElement | number | string, _options: Partial<IGoToOptions>, horizontal?: boolean, goTo?: IGoToInstance, signal?: AbortSignal): Promise<unknown>;
@@ -54,7 +54,7 @@ export function clampTarget(container, value, horizontal) {
54
54
  }
55
55
  return Math.max(Math.min(value, max), min);
56
56
  }
57
- export async function scrollTo(_target, _options, horizontal, goTo) {
57
+ export async function scrollTo(_target, _options, horizontal, goTo, signal) {
58
58
  const rtl = goTo?.rtl.value;
59
59
  const property = horizontal ? "scrollLeft" : "scrollTop";
60
60
  const options = mergeDeep(goTo?.options ?? genDefaults(), _options);
@@ -81,19 +81,34 @@ export async function scrollTo(_target, _options, horizontal, goTo) {
81
81
  if (targetLocation === startLocation) return Promise.resolve(targetLocation);
82
82
  const startTime = performance.now();
83
83
  const duration = options.duration;
84
- return new Promise((resolve) => requestAnimationFrame(function step(currentTime) {
85
- const timeElapsed = currentTime - startTime;
86
- const progress = timeElapsed / duration;
87
- const location = Math.floor(
88
- startLocation + (targetLocation - startLocation) * ease(clamp(progress, 0, 1))
89
- );
90
- container[property] = location;
91
- if (progress >= 1 && Math.abs(location - container[property]) < 10) {
92
- return resolve(targetLocation);
93
- } else if (progress > 2) {
94
- consoleWarn("Scroll target is not reachable");
95
- return resolve(container[property]);
96
- }
97
- requestAnimationFrame(step);
98
- }));
84
+ return new Promise((resolve) => {
85
+ let frame = -1;
86
+ const onAbort = () => {
87
+ if (frame !== -1) {
88
+ cancelAnimationFrame(frame);
89
+ frame = -1;
90
+ }
91
+ resolve(container[property] ?? startLocation);
92
+ };
93
+ frame = requestAnimationFrame(function step(currentTime) {
94
+ frame = -1;
95
+ if (signal?.aborted) return;
96
+ const timeElapsed = currentTime - startTime;
97
+ const progress = timeElapsed / duration;
98
+ const location = Math.floor(
99
+ startLocation + (targetLocation - startLocation) * ease(clamp(progress, 0, 1))
100
+ );
101
+ container[property] = location;
102
+ if (progress >= 1 && Math.abs(location - container[property]) < 10) {
103
+ signal?.removeEventListener("abort", onAbort);
104
+ return resolve(targetLocation);
105
+ } else if (progress > 2) {
106
+ consoleWarn("Scroll target is not reachable");
107
+ signal?.removeEventListener("abort", onAbort);
108
+ return resolve(container[property]);
109
+ }
110
+ frame = requestAnimationFrame(step);
111
+ });
112
+ signal?.addEventListener("abort", onAbort, { once: true });
113
+ });
99
114
  }
@@ -63,6 +63,17 @@ function connectedLocationStrategy(data, props, contentStyles) {
63
63
  }
64
64
  return typeof props.offset === "number" ? [props.offset, 0] : [0, 0];
65
65
  });
66
+ let disposed = false;
67
+ const frames = /* @__PURE__ */new Set();
68
+ const scheduleFrame = cb => {
69
+ if (disposed || typeof requestAnimationFrame === "undefined") return;
70
+ const id = requestAnimationFrame(() => {
71
+ frames.delete(id);
72
+ if (disposed) return;
73
+ cb();
74
+ });
75
+ frames.add(id);
76
+ };
66
77
  let observe = false;
67
78
  const observer = new ResizeObserver(() => {
68
79
  if (observe) updateLocation();
@@ -76,11 +87,14 @@ function connectedLocationStrategy(data, props, contentStyles) {
76
87
  immediate: true
77
88
  });
78
89
  (0, _vue.onScopeDispose)(() => {
90
+ disposed = true;
91
+ for (const id of frames) cancelAnimationFrame(id);
92
+ frames.clear();
79
93
  observer.disconnect();
80
94
  });
81
95
  const updateLocation = () => {
82
96
  observe = false;
83
- requestAnimationFrame(() => observe = true);
97
+ scheduleFrame(() => observe = true);
84
98
  if (!data.target.value || !data.contentEl.value) return;
85
99
  const targetBox = (0, _box2.getTargetBox)(data.target.value);
86
100
  const contentBox = getIntrinsicSize(data.contentEl.value);
@@ -265,6 +279,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
265
279
  };
266
280
  (0, _vue.watch)(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation());
267
281
  (0, _vue.nextTick)(() => {
282
+ if (disposed) return;
268
283
  const result = updateLocation();
269
284
  if (!result) return;
270
285
  const {
@@ -272,9 +287,9 @@ function connectedLocationStrategy(data, props, contentStyles) {
272
287
  contentBox
273
288
  } = result;
274
289
  if (contentBox.height > available.y) {
275
- requestAnimationFrame(() => {
290
+ scheduleFrame(() => {
276
291
  updateLocation();
277
- requestAnimationFrame(() => {
292
+ scheduleFrame(() => {
278
293
  updateLocation();
279
294
  });
280
295
  });
@@ -50,6 +50,17 @@ export function connectedLocationStrategy(data, props, contentStyles) {
50
50
  }
51
51
  return typeof props.offset === "number" ? [props.offset, 0] : [0, 0];
52
52
  });
53
+ let disposed = false;
54
+ const frames = /* @__PURE__ */ new Set();
55
+ const scheduleFrame = (cb) => {
56
+ if (disposed || typeof requestAnimationFrame === "undefined") return;
57
+ const id = requestAnimationFrame(() => {
58
+ frames.delete(id);
59
+ if (disposed) return;
60
+ cb();
61
+ });
62
+ frames.add(id);
63
+ };
53
64
  let observe = false;
54
65
  const observer = new ResizeObserver(() => {
55
66
  if (observe) updateLocation();
@@ -63,11 +74,14 @@ export function connectedLocationStrategy(data, props, contentStyles) {
63
74
  immediate: true
64
75
  });
65
76
  onScopeDispose(() => {
77
+ disposed = true;
78
+ for (const id of frames) cancelAnimationFrame(id);
79
+ frames.clear();
66
80
  observer.disconnect();
67
81
  });
68
82
  const updateLocation = () => {
69
83
  observe = false;
70
- requestAnimationFrame(() => observe = true);
84
+ scheduleFrame(() => observe = true);
71
85
  if (!data.target.value || !data.contentEl.value) return;
72
86
  const targetBox = getTargetBox(data.target.value);
73
87
  const contentBox = getIntrinsicSize(data.contentEl.value);
@@ -237,13 +251,14 @@ export function connectedLocationStrategy(data, props, contentStyles) {
237
251
  () => updateLocation()
238
252
  );
239
253
  nextTick(() => {
254
+ if (disposed) return;
240
255
  const result = updateLocation();
241
256
  if (!result) return;
242
257
  const { available, contentBox } = result;
243
258
  if (contentBox.height > available.y) {
244
- requestAnimationFrame(() => {
259
+ scheduleFrame(() => {
245
260
  updateLocation();
246
- requestAnimationFrame(() => {
261
+ scheduleFrame(() => {
247
262
  updateLocation();
248
263
  });
249
264
  });
@@ -149,11 +149,15 @@ function rippleHide(e) {
149
149
  });
150
150
  return;
151
151
  }
152
- window.setTimeout(() => {
152
+ const store = element._ripple;
153
+ const resetTouched = setTimeout(() => {
154
+ store.timers?.delete(resetTouched);
153
155
  if (element._ripple) {
154
156
  element._ripple.touched = false;
155
157
  }
156
158
  });
159
+ store.timers ??= /* @__PURE__ */new Set();
160
+ store.timers.add(resetTouched);
157
161
  _ripple.RIPPLES.hide(element);
158
162
  }
159
163
  function rippleCancelShow(e) {
@@ -110,11 +110,15 @@ export function rippleHide(e) {
110
110
  });
111
111
  return;
112
112
  }
113
- window.setTimeout(() => {
113
+ const store = element._ripple;
114
+ const resetTouched = setTimeout(() => {
115
+ store.timers?.delete(resetTouched);
114
116
  if (element._ripple) {
115
117
  element._ripple.touched = false;
116
118
  }
117
119
  });
120
+ store.timers ??= /* @__PURE__ */ new Set();
121
+ store.timers.add(resetTouched);
118
122
  RIPPLES.hide(element);
119
123
  }
120
124
  export function rippleCancelShow(e) {