@vuetify/v0 1.0.0-alpha.3 → 1.0.0-alpha.5

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 (171) hide show
  1. package/README.md +5 -0
  2. package/dist/adapter-B6IrPwib.d.mts +98 -0
  3. package/dist/adapter-BEJXp-ie.d.mts +11 -0
  4. package/dist/adapter-BFSJsyv7.mjs +481 -0
  5. package/dist/{adapter-DlX3FA3A.d.mts → adapter-BO75n0Cn.d.mts} +10 -14
  6. package/dist/adapter-BSKx9WQ7.mjs +4 -0
  7. package/dist/adapter-Chznb9Ju.mjs +4 -0
  8. package/dist/{index-CT5SCLzW.d.mts → adapter-CspReV3g.d.mts} +6 -9
  9. package/dist/adapter-D8zizQVP.mjs +4 -0
  10. package/dist/adapter-DDJHLC8K.d.mts +17 -0
  11. package/dist/adapters-4t-NhR11.mjs +5 -0
  12. package/dist/adapters-BcoA0zCS.mjs +4 -0
  13. package/dist/adapters-BjaPK635.mjs +2 -0
  14. package/dist/adapters-D64TORDu.mjs +2 -0
  15. package/dist/adapters-DvG-9z9q.mjs +3 -0
  16. package/dist/browser/index.js +2074 -561
  17. package/dist/components/index.d.mts +2 -2
  18. package/dist/components/index.mjs +1 -1
  19. package/dist/{components-C4jI-78d.mjs → components-Dn4Kbi0i.mjs} +149 -101
  20. package/dist/composables/index.d.mts +20 -19
  21. package/dist/composables/index.mjs +31 -29
  22. package/dist/{consola-BdgyPEfx.d.mts → consola-CUNHyu8J.d.mts} +2 -2
  23. package/dist/{consola-Ceox8BWi.mjs → consola-DYvbPNbF.mjs} +3 -1
  24. package/dist/constants/index.d.mts +1 -1
  25. package/dist/constants/index.mjs +2 -2
  26. package/dist/{createDataTable-iODP6aKB.mjs → createDataTable-H-PuVigU.mjs} +216 -124
  27. package/dist/{createGroup-CGk6hY_Y.mjs → createGroup-aHt_kvtU.mjs} +3 -3
  28. package/dist/{createRegistry-BXzdXAjq.mjs → createRegistry-CWpvSbCe.mjs} +78 -41
  29. package/dist/{createSelection-B3HJEPNg.mjs → createSelection-MRyUZyW2.mjs} +3 -3
  30. package/dist/{createSingle-Dql8mRi-.mjs → createSingle-BSciC9EJ.mjs} +1 -1
  31. package/dist/{createTokens-DgFYsOrv.mjs → createTokens-CQ9C7GTV.mjs} +2 -2
  32. package/dist/data-table/adapters/client/index.d.mts +2 -2
  33. package/dist/data-table/adapters/client/index.mjs +2 -2
  34. package/dist/data-table/adapters/index.d.mts +5 -5
  35. package/dist/data-table/adapters/index.mjs +6 -6
  36. package/dist/data-table/adapters/server/index.d.mts +2 -2
  37. package/dist/data-table/adapters/server/index.mjs +2 -2
  38. package/dist/data-table/adapters/virtual/index.d.mts +2 -2
  39. package/dist/data-table/adapters/virtual/index.mjs +2 -2
  40. package/dist/data-table/index.d.mts +6 -6
  41. package/dist/data-table/index.mjs +6 -6
  42. package/dist/date/index.d.mts +3 -3
  43. package/dist/date/index.mjs +12 -5
  44. package/dist/features/adapters/flagsmith/index.d.mts +2 -2
  45. package/dist/features/adapters/flagsmith/index.mjs +2 -2
  46. package/dist/features/adapters/launchdarkly/index.d.mts +2 -2
  47. package/dist/features/adapters/launchdarkly/index.mjs +2 -2
  48. package/dist/features/adapters/posthog/index.d.mts +2 -2
  49. package/dist/features/adapters/posthog/index.mjs +2 -2
  50. package/dist/features/index.d.mts +3 -3
  51. package/dist/features/index.mjs +2 -1
  52. package/dist/{index-BzFHTW59.d.mts → flagsmith-Cd44vxff.d.mts} +4 -4
  53. package/dist/{flagsmith-Dbh1h8WF.mjs → flagsmith-Cu93hUIF.mjs} +6 -4
  54. package/dist/{globals-zEjWBKCr.mjs → globals-BRdxsC2M.mjs} +1 -1
  55. package/dist/{index-GOpjKzaJ.d.mts → index-BLaKZq0Y.d.mts} +25 -2
  56. package/dist/{index-BJGcVy7e.d.mts → index-BmEu85PI.d.mts} +126 -65
  57. package/dist/{index-DE3bWw11.d.mts → index-C0ewabdY.d.mts} +93 -215
  58. package/dist/index-C6NnIuDv.d.mts +4 -0
  59. package/dist/{index-DNDuacmH.d.mts → index-CJdG9yY1.d.mts} +116 -106
  60. package/dist/index-C_t6t0Z-.d.mts +170 -0
  61. package/dist/{index-B76iGRE3.d.mts → index-CyUCELZC.d.mts} +1149 -61
  62. package/dist/index.d.mts +24 -23
  63. package/dist/index.mjs +35 -33
  64. package/dist/json/attributes.json +1 -1
  65. package/dist/json/web-types.json +2 -2
  66. package/dist/{launchdarkly-BKtW-idu.mjs → launchdarkly-CLGtJCsI.mjs} +6 -4
  67. package/dist/launchdarkly-De701hkf.d.mts +13 -0
  68. package/dist/locale/adapters/index.d.mts +3 -3
  69. package/dist/locale/adapters/index.mjs +4 -3
  70. package/dist/locale/adapters/v0/index.d.mts +2 -2
  71. package/dist/locale/adapters/v0/index.mjs +2 -2
  72. package/dist/locale/adapters/vue-i18n/index.d.mts +3 -3
  73. package/dist/locale/adapters/vue-i18n/index.mjs +4 -2
  74. package/dist/locale/index.d.mts +4 -4
  75. package/dist/locale/index.mjs +4 -3
  76. package/dist/logger/adapters/consola/index.d.mts +1 -1
  77. package/dist/logger/adapters/consola/index.mjs +1 -1
  78. package/dist/logger/adapters/index.d.mts +5 -5
  79. package/dist/logger/adapters/index.mjs +6 -5
  80. package/dist/logger/adapters/pino/index.d.mts +1 -1
  81. package/dist/logger/adapters/pino/index.mjs +1 -1
  82. package/dist/logger/adapters/v0/index.d.mts +2 -2
  83. package/dist/logger/adapters/v0/index.mjs +2 -2
  84. package/dist/logger/index.d.mts +6 -6
  85. package/dist/logger/index.mjs +6 -5
  86. package/dist/{memory-oYBvtkgx.mjs → memory-BMpJcQjQ.mjs} +13 -3
  87. package/dist/{memory-CeSQE-QV.d.mts → memory-D-JbdKXg.d.mts} +9 -9
  88. package/dist/notifications/index.d.mts +30 -4
  89. package/dist/notifications/index.mjs +187 -126
  90. package/dist/palettes/ant/index.d.mts +1 -1
  91. package/dist/palettes/index.d.mts +3 -3
  92. package/dist/palettes/leonardo/generate/index.mjs +3 -0
  93. package/dist/palettes/material/index.d.mts +1 -1
  94. package/dist/palettes/md1/index.d.mts +1 -1
  95. package/dist/palettes/md2/index.d.mts +1 -1
  96. package/dist/palettes/radix/index.d.mts +1 -1
  97. package/dist/palettes/tailwind/index.d.mts +1 -1
  98. package/dist/permissions/adapters/index.d.mts +2 -2
  99. package/dist/permissions/adapters/index.mjs +3 -3
  100. package/dist/permissions/adapters/v0/index.d.mts +2 -2
  101. package/dist/permissions/adapters/v0/index.mjs +2 -2
  102. package/dist/permissions/index.d.mts +2 -2
  103. package/dist/permissions/index.mjs +3 -3
  104. package/dist/{pino-DNfCEb0p.d.mts → pino-BaYY_KIN.d.mts} +2 -2
  105. package/dist/{pino-9L79n6y6.mjs → pino-CIcYlW3u.mjs} +3 -1
  106. package/dist/{posthog-DmuyycaR.mjs → posthog-0umvvA48.mjs} +7 -5
  107. package/dist/posthog-CIrmvke4.d.mts +13 -0
  108. package/dist/rules/index.d.mts +1 -1
  109. package/dist/rules/index.mjs +1 -1
  110. package/dist/{server-3ilWFwqe.d.mts → server-7vjHxjNc.d.mts} +5 -5
  111. package/dist/{server-y7zLSCSx.mjs → server-BNSiVoMe.mjs} +4 -3
  112. package/dist/storage/adapters/index.d.mts +3 -3
  113. package/dist/storage/adapters/index.mjs +2 -2
  114. package/dist/storage/adapters/memory/index.d.mts +2 -2
  115. package/dist/storage/adapters/memory/index.mjs +2 -2
  116. package/dist/storage/index.d.mts +4 -4
  117. package/dist/storage/index.mjs +3 -3
  118. package/dist/theme/adapters/index.d.mts +2 -2
  119. package/dist/theme/adapters/index.mjs +4 -4
  120. package/dist/theme/adapters/unhead/index.d.mts +1 -1
  121. package/dist/theme/adapters/unhead/index.mjs +1 -1
  122. package/dist/theme/adapters/v0/index.d.mts +1 -1
  123. package/dist/theme/adapters/v0/index.mjs +1 -1
  124. package/dist/theme/index.d.mts +1 -1
  125. package/dist/theme/index.mjs +3 -3
  126. package/dist/types/index.d.mts +1 -1
  127. package/dist/{unhead-B-I2OS6i.mjs → unhead-_cXZcx0j.mjs} +2 -2
  128. package/dist/{useClickOutside-CY4U2J9W.mjs → useClickOutside-DbOLg1uw.mjs} +1483 -182
  129. package/dist/{useFeatures-BPOke6iP.mjs → useFeatures-Dhnr-Lg2.mjs} +7 -10
  130. package/dist/{useLocale-BV8e3imF.mjs → useLocale-Sh-2sNiG.mjs} +6 -6
  131. package/dist/{useLogger-DvdRTrqC.mjs → useLogger-1_ZeBY12.mjs} +5 -5
  132. package/dist/{useNotifications-vSJE6z6t.mjs → useNotifications-CAVQ7hK6.mjs} +6 -6
  133. package/dist/{usePermissions-D3zPwKQc.mjs → usePermissions-D9Oituwy.mjs} +6 -6
  134. package/dist/{useRules-BT6cgoTj.mjs → useRules-DK4AeNeC.mjs} +4 -3
  135. package/dist/{useTheme-cUZb2A9O.mjs → useTheme-FMDQC81h.mjs} +5 -5
  136. package/dist/utilities/index.d.mts +2 -2
  137. package/dist/utilities/index.mjs +26 -2
  138. package/dist/{v0-CHZpnMeP.mjs → v0-C42ssNIy.mjs} +6 -4
  139. package/dist/{v0-Dq3zhexO.mjs → v0-CEfbyyp2.mjs} +3 -4
  140. package/dist/{v0-C49OI_wc.mjs → v0-Ch-O6YVd.mjs} +5 -3
  141. package/dist/{v0-gpExNexS.mjs → v0-D0imQlSD.mjs} +2 -2
  142. package/dist/{v0-DrOub-e1.d.mts → v0-DWZ_N2GG.d.mts} +4 -4
  143. package/dist/{v0-Bmow1q_x.mjs → v0-Dvu8fMl3.mjs} +3 -3
  144. package/dist/v0-QIjffi4E.d.mts +8 -0
  145. package/dist/{v0-D7Fm2C3Y.d.mts → v0-aYLq6qmT.d.mts} +3 -3
  146. package/dist/{virtual-C0yHf1DC.mjs → virtual-Cq5aRp7m.mjs} +3 -4
  147. package/dist/virtual-CrgGA-o6.d.mts +8 -0
  148. package/package.json +1 -1
  149. package/dist/adapter-58IvIfAZ.d.mts +0 -96
  150. package/dist/adapter-BvWEd9w-.d.mts +0 -17
  151. package/dist/adapter-Dhq68tz0.d.mts +0 -11
  152. package/dist/adapter-gQ2SNKZq.mjs +0 -238
  153. package/dist/adapters-BSiqsTZN.mjs +0 -3
  154. package/dist/adapters-C3QXhf4I.mjs +0 -2
  155. package/dist/adapters-CMJGA1k7.mjs +0 -2
  156. package/dist/adapters-Dse4bPxk.mjs +0 -5
  157. package/dist/adapters-_ZqxCD8f.mjs +0 -4
  158. package/dist/createPagination-CHF7SmmK.mjs +0 -247
  159. package/dist/index-1XdASTjp.d.mts +0 -13
  160. package/dist/index-C6rdXZ7j.d.mts +0 -11
  161. package/dist/index-Dp1HjBxJ.d.mts +0 -13
  162. package/dist/v0-CdusXjY_.d.mts +0 -8
  163. package/dist/virtual-D4fckewC.d.mts +0 -8
  164. /package/dist/{adapter-Be9zUc-n.mjs → adapter-oM18AdUc.mjs} +0 -0
  165. /package/dist/{htmlElements-D4oMQZPJ.mjs → htmlElements-CHXZfsZu.mjs} +0 -0
  166. /package/dist/{index-CFhUdAHM.d.mts → index-BOn0AAue.d.mts} +0 -0
  167. /package/dist/{index-CROz1VSV.d.mts → index-CKKoxA9V.d.mts} +0 -0
  168. /package/dist/{index-DuddF-NR.d.mts → index-CLR1QMM3.d.mts} +0 -0
  169. /package/dist/{index-DTvqw22G.d.mts → index-H_hl6-4b.d.mts} +0 -0
  170. /package/dist/{index-BgCkepP_.d.mts → index-PvkxPev3.d.mts} +0 -0
  171. /package/dist/{toArray-as9BWxBK.mjs → toArray-CD2-OxAz.mjs} +0 -0
@@ -1,5 +1,32 @@
1
1
  import * as Vue from "vue";
2
- import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, effectScope, guardReactiveProps, hasInjectionContext, inject, isRef, mergeModels, mergeProps, nextTick, normalizeProps, normalizeStyle, onActivated, onBeforeUnmount, onDeactivated, onMounted, onScopeDispose, openBlock, provide, reactive, readonly, ref, renderList, renderSlot, resolveDynamicComponent, shallowReactive, shallowReadonly, shallowRef, toDisplayString, toRaw, toRef, toValue, unref, useAttrs, useId as useId$1, useModel, useTemplateRef, vShow, watch, watchEffect, withCtx, withDirectives } from "vue";
2
+ import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, effectScope, guardReactiveProps, hasInjectionContext, inject, isReadonly, isRef, mergeModels, mergeProps, nextTick, normalizeProps, normalizeStyle, onActivated, onBeforeUnmount, onDeactivated, onMounted, onScopeDispose, onWatcherCleanup, openBlock, provide, reactive, readonly, ref, renderList, renderSlot, resolveDynamicComponent, shallowReactive, shallowReadonly, shallowRef, toDisplayString, toRaw, toRef, toValue, unref, useAttrs, useId as useId$1, useModel, useTemplateRef, vShow, watch, watchEffect, withCtx, withDirectives } from "vue";
3
+ /**
4
+ * Set of HTML elements that are self-closing (void elements)
5
+ * These elements cannot have children and don't need closing tags
6
+ */
7
+ const SELF_CLOSING_TAGS = /* @__PURE__ */ new Set([
8
+ "area",
9
+ "base",
10
+ "br",
11
+ "col",
12
+ "embed",
13
+ "hr",
14
+ "img",
15
+ "input",
16
+ "link",
17
+ "meta",
18
+ "source",
19
+ "track",
20
+ "wbr"
21
+ ]);
22
+ /**
23
+ * Check if an element is self-closing
24
+ */
25
+ /* @__NO_SIDE_EFFECTS__ */
26
+ function isSelfClosingTag(tag) {
27
+ return SELF_CLOSING_TAGS.has(tag.toLowerCase());
28
+ }
29
+ //#endregion
3
30
  //#region src/utilities/color.ts
4
31
  /* @__NO_SIDE_EFFECTS__ */
5
32
  function hexToRgb(hex) {
@@ -108,7 +135,7 @@ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && "matchMedia" in window && typeof wind
108
135
  const SUPPORTS_OBSERVER = IN_BROWSER && "ResizeObserver" in window;
109
136
  const SUPPORTS_INTERSECTION_OBSERVER = IN_BROWSER && "IntersectionObserver" in window;
110
137
  const SUPPORTS_MUTATION_OBSERVER = IN_BROWSER && "MutationObserver" in window;
111
- const version = "1.0.0-alpha.3";
138
+ const version = "1.0.0-alpha.5";
112
139
  /* v8 ignore next -- build-time constant, __DEV__ short-circuits in tests */
113
140
  const __LOGGER_ENABLED__ = false;
114
141
  //#endregion
@@ -140,13 +167,6 @@ function instanceName() {
140
167
  //#endregion
141
168
  //#region src/utilities/helpers.ts
142
169
  /**
143
- * @module utilities/helpers
144
- *
145
- * @remarks
146
- * Collection of utility functions for type checking, object manipulation,
147
- * and common transformations. All exports are tree-shakeable.
148
- */
149
- /**
150
170
  * Checks if a value is a function
151
171
  *
152
172
  * @param item The value to check
@@ -240,6 +260,30 @@ function isObject(item) {
240
260
  return typeof item === "object" && item !== null && !Array.isArray(item);
241
261
  }
242
262
  /**
263
+ * Checks if a value is a thenable (any object with a `.then` method).
264
+ * Duck-typed — matches both native Promises and any Promise-like.
265
+ *
266
+ * @param item The value to check
267
+ * @returns True if the value has a callable `then` property
268
+ *
269
+ * @example
270
+ * ```ts
271
+ * isThenable(Promise.resolve()) // true
272
+ * isThenable({ then: () => {} }) // true
273
+ * isThenable({}) // false
274
+ * isThenable('string') // false
275
+ * ```
276
+ *
277
+ * @remarks Use this when duck-typing async behavior — for example, rejecting
278
+ * a callback that returned a Promise-like when only synchronous returns are
279
+ * supported. If you specifically want native Promise instances, use
280
+ * `instanceof Promise` directly.
281
+ */
282
+ /* @__NO_SIDE_EFFECTS__ */
283
+ function isThenable(item) {
284
+ return /* @__PURE__ */ isObject(item) && "then" in item && /* @__PURE__ */ isFunction(item.then);
285
+ }
286
+ /**
243
287
  * Checks if a value is an array
244
288
  *
245
289
  * @param item The value to check
@@ -527,32 +571,6 @@ function resolveIds(ids, getter) {
527
571
  function resolveIndexes(items) {
528
572
  return Array.from(items).map((item) => item?.index).filter((index) => !/* @__PURE__ */ isUndefined(index));
529
573
  }
530
- /**
531
- * Set of HTML elements that are self-closing (void elements)
532
- * These elements cannot have children and don't need closing tags
533
- */
534
- const SELF_CLOSING_TAGS = /* @__PURE__ */ new Set([
535
- "area",
536
- "base",
537
- "br",
538
- "col",
539
- "embed",
540
- "hr",
541
- "img",
542
- "input",
543
- "link",
544
- "meta",
545
- "source",
546
- "track",
547
- "wbr"
548
- ]);
549
- /**
550
- * Check if an element is self-closing
551
- */
552
- /* @__NO_SIDE_EFFECTS__ */
553
- function isSelfClosingTag(tag) {
554
- return SELF_CLOSING_TAGS.has(tag.toLowerCase());
555
- }
556
574
  //#endregion
557
575
  //#region src/components/Atom/Atom.vue
558
576
  /**
@@ -1025,7 +1043,7 @@ function getPersistedStorage() {
1025
1043
  * createPluginContext('v0:logger', options => createLogger(options), {
1026
1044
  * fallback: ns => createFallbackLogger(ns),
1027
1045
  * setup: (context) => {
1028
- * if (__DEV__ && IN_BROWSER) (window as any).__v0Logger__ = context
1046
+ * if (__DEV__ && IN_BROWSER) (window as Window & { __v0Logger__?: typeof context }).__v0Logger__ = context
1029
1047
  * },
1030
1048
  * })
1031
1049
  * ```
@@ -1082,10 +1100,14 @@ function createPluginContext(defaultNamespace, factory, config) {
1082
1100
  ];
1083
1101
  }
1084
1102
  //#endregion
1103
+ //#region src/composables/useLogger/adapters/adapter.ts
1104
+ var LoggerAdapter = class {};
1105
+ //#endregion
1085
1106
  //#region src/composables/useLogger/adapters/consola.ts
1086
- var ConsolaLoggerAdapter = class {
1107
+ var ConsolaLoggerAdapter = class extends LoggerAdapter {
1087
1108
  consola;
1088
1109
  constructor(consolaInstance) {
1110
+ super();
1089
1111
  if (!consolaInstance) throw new Error("Consola instance is required for ConsolaLoggerAdapter");
1090
1112
  this.consola = consolaInstance;
1091
1113
  }
@@ -1112,9 +1134,10 @@ var ConsolaLoggerAdapter = class {
1112
1134
  };
1113
1135
  //#endregion
1114
1136
  //#region src/composables/useLogger/adapters/pino.ts
1115
- var PinoLoggerAdapter = class {
1137
+ var PinoLoggerAdapter = class extends LoggerAdapter {
1116
1138
  pino;
1117
1139
  constructor(pinoInstance) {
1140
+ super();
1118
1141
  if (!pinoInstance) throw new Error("Pino instance is required for PinoLoggerAdapter");
1119
1142
  this.pino = pinoInstance;
1120
1143
  }
@@ -1151,17 +1174,18 @@ var PinoLoggerAdapter = class {
1151
1174
  //#endregion
1152
1175
  //#region src/composables/useLogger/adapters/v0.ts
1153
1176
  /**
1154
- * Vuetify0.x logger adapter implementation
1177
+ * V0 logger adapter implementation
1155
1178
  *
1156
1179
  * This adapter provides console-based logging with proper formatting,
1157
1180
  * color coding, timestamps, and log level filtering for development
1158
1181
  * and production environments.
1159
1182
  */
1160
- var Vuetify0LoggerAdapter = class {
1183
+ var V0LoggerAdapter = class extends LoggerAdapter {
1161
1184
  prefix;
1162
1185
  colors;
1163
1186
  timestamps;
1164
1187
  constructor(options = {}) {
1188
+ super();
1165
1189
  this.prefix = options.prefix || "v0";
1166
1190
  this.colors = options.colors !== false;
1167
1191
  this.timestamps = options.timestamps !== false;
@@ -1269,7 +1293,7 @@ var Vuetify0LoggerAdapter = class {
1269
1293
  * ```
1270
1294
  */
1271
1295
  function createLogger(options = {}) {
1272
- const { adapter = new Vuetify0LoggerAdapter({ prefix: options.prefix }), level: initialLevel = "info", enabled: initialEnabled = false } = options;
1296
+ const { adapter = new V0LoggerAdapter({ prefix: options.prefix }), level: initialLevel = "info", enabled: initialEnabled = false } = options;
1273
1297
  let currentLevel = initialLevel;
1274
1298
  let isEnabled = initialEnabled;
1275
1299
  function value(level) {
@@ -1443,7 +1467,7 @@ function createRegistry(options) {
1443
1467
  let indexDependentCount = 0;
1444
1468
  let needsReindex = false;
1445
1469
  let minDirtyIndex = Infinity;
1446
- let batching = false;
1470
+ let isBatching = false;
1447
1471
  let batched = [];
1448
1472
  function dispatch(event, data) {
1449
1473
  const cbs = listeners.get(event);
@@ -1452,7 +1476,7 @@ function createRegistry(options) {
1452
1476
  }
1453
1477
  function emit(event, data = void 0) {
1454
1478
  if (!events) return;
1455
- if (batching) {
1479
+ if (isBatching) {
1456
1480
  batched.push({
1457
1481
  event,
1458
1482
  data
@@ -1484,6 +1508,7 @@ function createRegistry(options) {
1484
1508
  return collection.get(id);
1485
1509
  }
1486
1510
  function upsert(id, patch = {}, event) {
1511
+ if (needsReindex) reindex();
1487
1512
  const existing = get(id);
1488
1513
  if (!existing) return register({
1489
1514
  ...patch,
@@ -1507,23 +1532,22 @@ function createRegistry(options) {
1507
1532
  assign(value, id);
1508
1533
  }
1509
1534
  }
1510
- const updated = {
1511
- ...existing,
1512
- ...patch,
1535
+ Object.assign(existing, patch, {
1513
1536
  id,
1514
1537
  index: existing.index,
1515
1538
  value,
1516
1539
  valueIsIndex
1517
- };
1518
- collection.set(id, updated);
1540
+ });
1541
+ collection.set(id, existing);
1519
1542
  invalidate();
1520
- emit("update:ticket", updated);
1521
- if (event) emit(event, id);
1522
- return updated;
1543
+ emit("update:ticket", existing);
1544
+ if (event) emit(event, existing);
1545
+ return existing;
1523
1546
  }
1524
1547
  function browse(value) {
1525
1548
  if (needsReindex) reindex();
1526
- return catalog.get(value);
1549
+ const bucket = catalog.get(value);
1550
+ return bucket ? bucket.slice() : void 0;
1527
1551
  }
1528
1552
  function lookup(index) {
1529
1553
  if (needsReindex) reindex();
@@ -1549,25 +1573,25 @@ function createRegistry(options) {
1549
1573
  if (reactive) return Array.from(collection.keys());
1550
1574
  const cached = cache.get("keys");
1551
1575
  if (!/* @__PURE__ */ isUndefined(cached)) return cached;
1552
- const keys = Array.from(collection.keys());
1553
- cache.set("keys", keys);
1554
- return keys;
1576
+ const out = Array.from(collection.keys());
1577
+ cache.set("keys", out);
1578
+ return out;
1555
1579
  }
1556
1580
  function values() {
1557
1581
  if (reactive) return Array.from(collection.values());
1558
1582
  const cached = cache.get("values");
1559
1583
  if (!/* @__PURE__ */ isUndefined(cached)) return cached;
1560
- const values = Array.from(collection.values());
1561
- cache.set("values", values);
1562
- return values;
1584
+ const out = Array.from(collection.values());
1585
+ cache.set("values", out);
1586
+ return out;
1563
1587
  }
1564
1588
  function entries() {
1565
1589
  if (reactive) return Array.from(collection.entries());
1566
1590
  const cached = cache.get("entries");
1567
1591
  if (!/* @__PURE__ */ isUndefined(cached)) return cached;
1568
- const entries = Array.from(collection.entries());
1569
- cache.set("entries", entries);
1570
- return entries;
1592
+ const out = Array.from(collection.entries());
1593
+ cache.set("entries", out);
1594
+ return out;
1571
1595
  }
1572
1596
  function clear() {
1573
1597
  collection.clear();
@@ -1580,12 +1604,12 @@ function createRegistry(options) {
1580
1604
  emit("clear:registry");
1581
1605
  }
1582
1606
  function invalidate() {
1583
- if (batching) return;
1607
+ if (isBatching) return;
1584
1608
  cache.clear();
1585
1609
  }
1586
1610
  function batch(fn) {
1587
- if (batching) return fn();
1588
- batching = true;
1611
+ if (isBatching) return fn();
1612
+ isBatching = true;
1589
1613
  batched = [];
1590
1614
  try {
1591
1615
  const result = fn();
@@ -1593,7 +1617,7 @@ function createRegistry(options) {
1593
1617
  for (const { event, data } of batched) dispatch(event, data);
1594
1618
  return result;
1595
1619
  } finally {
1596
- batching = false;
1620
+ isBatching = false;
1597
1621
  batched = [];
1598
1622
  }
1599
1623
  }
@@ -1625,6 +1649,7 @@ function createRegistry(options) {
1625
1649
  emit("reindex:registry");
1626
1650
  }
1627
1651
  function register(registration = {}) {
1652
+ if (needsReindex) reindex();
1628
1653
  const size = collection.size;
1629
1654
  const id = registration.id ?? /* @__PURE__ */ useId();
1630
1655
  if (has(id)) {
@@ -1634,9 +1659,9 @@ function createRegistry(options) {
1634
1659
  const valueIsUndefined = /* @__PURE__ */ isUndefined(registration.value);
1635
1660
  const index = registration.index ?? size;
1636
1661
  const value = valueIsUndefined ? index : registration.value;
1637
- const valueIsIndex = valueIsUndefined;
1662
+ const valueIsIndex = registration.valueIsIndex ?? valueIsUndefined;
1638
1663
  if (valueIsIndex) indexDependentCount++;
1639
- const rawTicket = {
1664
+ const input = {
1640
1665
  ...registration,
1641
1666
  id,
1642
1667
  index,
@@ -1644,7 +1669,7 @@ function createRegistry(options) {
1644
1669
  valueIsIndex,
1645
1670
  unregister: () => unregister(id)
1646
1671
  };
1647
- const ticket = reactive ? shallowReactive(rawTicket) : rawTicket;
1672
+ const ticket = reactive ? shallowReactive(input) : input;
1648
1673
  collection.set(ticket.id, ticket);
1649
1674
  directory.set(ticket.index, ticket.id);
1650
1675
  assign(ticket.value, ticket.id);
@@ -1666,9 +1691,23 @@ function createRegistry(options) {
1666
1691
  else needsReindex = true;
1667
1692
  emit("unregister:ticket", ticket);
1668
1693
  }
1694
+ function onboard(registrations) {
1695
+ return batch(() => registrations.map((registration) => register(registration)));
1696
+ }
1697
+ function toInput(ticket) {
1698
+ const input = { ...ticket };
1699
+ delete input.index;
1700
+ delete input.valueIsIndex;
1701
+ delete input.unregister;
1702
+ if (ticket.valueIsIndex) {
1703
+ delete input.id;
1704
+ delete input.value;
1705
+ }
1706
+ return input;
1707
+ }
1669
1708
  function offboard(ids) {
1709
+ const removed = [];
1670
1710
  batch(() => {
1671
- const removed = [];
1672
1711
  for (const id of ids) {
1673
1712
  const ticket = collection.get(id);
1674
1713
  if (!ticket) continue;
@@ -1683,6 +1722,7 @@ function createRegistry(options) {
1683
1722
  for (const ticket of removed) emit("unregister:ticket", ticket);
1684
1723
  needsReindex = true;
1685
1724
  });
1725
+ return removed.map((ticket) => toInput(ticket));
1686
1726
  }
1687
1727
  function move(id, toIndex) {
1688
1728
  if (needsReindex) reindex();
@@ -1691,15 +1731,37 @@ function createRegistry(options) {
1691
1731
  const size = collection.size;
1692
1732
  const target = /* @__PURE__ */ clamp(toIndex, 0, size - 1);
1693
1733
  if (ticket.index === target) return ticket;
1694
- const items = Array.from(collection.entries());
1695
- const fromIndex = items.findIndex(([key]) => key === id);
1696
- const [entry] = items.splice(fromIndex, 1);
1697
- items.splice(target, 0, entry);
1698
- collection.clear();
1699
- for (const [key, value] of items) collection.set(key, value);
1700
- minDirtyIndex = Math.min(ticket.index, target);
1701
- reindex();
1702
- return ticket;
1734
+ return batch(() => {
1735
+ const items = Array.from(collection.entries());
1736
+ const fromIndex = items.findIndex(([key]) => key === id);
1737
+ const [entry] = items.splice(fromIndex, 1);
1738
+ items.splice(target, 0, entry);
1739
+ collection.clear();
1740
+ for (const [key, value] of items) collection.set(key, value);
1741
+ minDirtyIndex = Math.min(ticket.index, target);
1742
+ reindex();
1743
+ emit("update:ticket", ticket);
1744
+ return ticket;
1745
+ });
1746
+ }
1747
+ function reorder(ids) {
1748
+ if (needsReindex) reindex();
1749
+ if (ids.length !== collection.size) return;
1750
+ const seen = /* @__PURE__ */ new Set();
1751
+ const entries = [];
1752
+ for (const id of ids) {
1753
+ if (seen.has(id)) return;
1754
+ const ticket = collection.get(id);
1755
+ if (!ticket) return;
1756
+ seen.add(id);
1757
+ entries.push([id, ticket]);
1758
+ }
1759
+ batch(() => {
1760
+ collection.clear();
1761
+ for (const [id, ticket] of entries) collection.set(id, ticket);
1762
+ minDirtyIndex = 0;
1763
+ reindex();
1764
+ });
1703
1765
  }
1704
1766
  function seek(direction = "first", from, predicate) {
1705
1767
  if (collection.size === 0) return void 0;
@@ -1743,11 +1805,10 @@ function createRegistry(options) {
1743
1805
  unregister,
1744
1806
  reindex,
1745
1807
  move,
1808
+ reorder,
1746
1809
  seek,
1747
1810
  batch,
1748
- onboard(registrations) {
1749
- return batch(() => registrations.map((registration) => register(registration)));
1750
- },
1811
+ onboard,
1751
1812
  offboard,
1752
1813
  get size() {
1753
1814
  return collection.size;
@@ -1944,7 +2005,7 @@ function createModel(_options = {}) {
1944
2005
  }
1945
2006
  function offboard(ids) {
1946
2007
  for (const id of ids) selectedIds.delete(id);
1947
- registry.offboard(ids);
2008
+ return registry.offboard(ids);
1948
2009
  }
1949
2010
  function reset() {
1950
2011
  selectedIds.clear();
@@ -2113,7 +2174,7 @@ function createSelection(_options = {}) {
2113
2174
  if (ids) for (const id of ids) targetIds.add(id);
2114
2175
  }
2115
2176
  if (isMultiple) {
2116
- for (const id of currentIds.difference(targetIds)) model.selectedIds.delete(id);
2177
+ for (const id of currentIds.difference(targetIds)) unselect(id);
2117
2178
  for (const id of targetIds.difference(currentIds)) model.selectedIds.add(id);
2118
2179
  } else {
2119
2180
  const next = targetIds.values().next().value;
@@ -2698,6 +2759,9 @@ function flatten(tokens, prefix = "", flat = false) {
2698
2759
  return flattened;
2699
2760
  }
2700
2761
  //#endregion
2762
+ //#region src/composables/useLocale/adapters/adapter.ts
2763
+ var LocaleAdapter = class {};
2764
+ //#endregion
2701
2765
  //#region src/composables/useLocale/adapters/v0.ts
2702
2766
  /**
2703
2767
  * Default locale adapter for @vuetify/v0.
@@ -2705,9 +2769,10 @@ function flatten(tokens, prefix = "", flat = false) {
2705
2769
  * Handles the full translation pipeline: key lookup via tokens,
2706
2770
  * fallback chain, token reference resolution, and placeholder interpolation.
2707
2771
  */
2708
- var Vuetify0LocaleAdapter = class {
2772
+ var V0LocaleAdapter = class extends LocaleAdapter {
2709
2773
  context;
2710
2774
  constructor(context) {
2775
+ super();
2711
2776
  this.context = context;
2712
2777
  }
2713
2778
  t(key, ...params) {
@@ -2803,7 +2868,7 @@ function createLocale(_options = {}) {
2803
2868
  registry.register({ id });
2804
2869
  if (id === options.default && !registry.selectedId.value) registry.select(id);
2805
2870
  }
2806
- const adapter = externalAdapter ?? new Vuetify0LocaleAdapter({
2871
+ const adapter = externalAdapter ?? new V0LocaleAdapter({
2807
2872
  tokens,
2808
2873
  selectedId: registry.selectedId,
2809
2874
  fallbackLocale,
@@ -3353,6 +3418,7 @@ function createFocusTraversal(items, activate, options = {}) {
3353
3418
  }
3354
3419
  /** Focus first non-disabled item in the current row (grid mode) */
3355
3420
  function rowFirst() {
3421
+ /* v8 ignore next 2 -- defensive: rowFirst is only invoked in grid mode (cols > 0) */
3356
3422
  const cols = toValue(_columns) ?? 0;
3357
3423
  if (!cols) return first();
3358
3424
  const all = items();
@@ -3369,6 +3435,7 @@ function createFocusTraversal(items, activate, options = {}) {
3369
3435
  }
3370
3436
  /** Focus last non-disabled item in the current row (grid mode) */
3371
3437
  function rowLast() {
3438
+ /* v8 ignore next 2 -- defensive: rowLast is only invoked in grid mode (cols > 0) */
3372
3439
  const cols = toValue(_columns) ?? 0;
3373
3440
  if (!cols) return last();
3374
3441
  const all = items();
@@ -3540,6 +3607,9 @@ function useVirtualFocus(items, options) {
3540
3607
  };
3541
3608
  }
3542
3609
  //#endregion
3610
+ //#region src/composables/createCombobox/adapters/adapter.ts
3611
+ var ComboboxAdapter = class {};
3612
+ //#endregion
3543
3613
  //#region src/composables/toArray/index.ts
3544
3614
  /**
3545
3615
  * @module toArray
@@ -3732,9 +3802,10 @@ function useFilter(namespace = "v0:filter") {
3732
3802
  * Default combobox adapter. Filters items client-side using createFilter.
3733
3803
  * Synchronous, zero debounce — items update immediately as the user types.
3734
3804
  */
3735
- var ClientAdapter$1 = class {
3805
+ var ClientComboboxAdapter = class extends ComboboxAdapter {
3736
3806
  options;
3737
3807
  constructor(options = {}) {
3808
+ super();
3738
3809
  this.options = options;
3739
3810
  }
3740
3811
  setup(context) {
@@ -3774,7 +3845,7 @@ var ClientAdapter$1 = class {
3774
3845
  * The consumer watches `query` via useComboboxContext() or slot props
3775
3846
  * and provides filtered items reactively.
3776
3847
  */
3777
- var ServerAdapter = class {
3848
+ var ServerComboboxAdapter = class extends ComboboxAdapter {
3778
3849
  setup(context) {
3779
3850
  const isLoading = shallowRef(false);
3780
3851
  return {
@@ -3799,7 +3870,7 @@ var ServerAdapter = class {
3799
3870
  * chain — it composes existing primitives instead.
3800
3871
  *
3801
3872
  * Key features:
3802
- * - Adapter-based filtering (client-side or server-side via ClientAdapter/ServerAdapter)
3873
+ * - Adapter-based filtering (client-side or server-side via ClientComboboxAdapter/ServerComboboxAdapter)
3803
3874
  * - Single or multi-select mode
3804
3875
  * - Virtual focus keyboard navigation (aria-activedescendant pattern)
3805
3876
  * - Strict mode: reverts query to selected value on close if no match
@@ -3876,7 +3947,7 @@ function createCombobox(options = {}) {
3876
3947
  version.value;
3877
3948
  return [...selection.values()];
3878
3949
  });
3879
- const { filtered, isLoading, isEmpty } = (adapter ?? new ClientAdapter$1()).setup({
3950
+ const { filtered, isLoading, isEmpty } = (adapter ?? new ClientComboboxAdapter()).setup({
3880
3951
  query,
3881
3952
  items
3882
3953
  });
@@ -4251,7 +4322,7 @@ function createGroup(_options = {}) {
4251
4322
  }
4252
4323
  function offboard(ids) {
4253
4324
  for (const id of ids) mixedIds.delete(id);
4254
- selection.offboard(ids);
4325
+ return selection.offboard(ids);
4255
4326
  }
4256
4327
  function onboard(registrations) {
4257
4328
  const tickets = selection.batch(() => registrations.map((registration) => register(registration)));
@@ -4633,7 +4704,7 @@ function usePagination(namespace = "v0:pagination") {
4633
4704
  *
4634
4705
  * The abstract DataTableAdapter provides shared filter and sort pipelines
4635
4706
  * used by client-side adapters. Server adapters that delegate pipeline
4636
- * operations externally can implement DataTableAdapterInterface directly.
4707
+ * operations externally subclass DataTableAdapter directly.
4637
4708
  */
4638
4709
  function getNestedValue(obj, parts) {
4639
4710
  let result = obj;
@@ -4663,16 +4734,18 @@ function compareValues(a, b, collator) {
4663
4734
  var DataTableAdapter = class {
4664
4735
  /** Create the filter pipeline stage */
4665
4736
  filter(context) {
4666
- const filter = createFilter(Object.keys(context.customColumnFilters).length > 0 && !context.filterOptions.customFilter ? {
4737
+ const filter = createFilter({
4667
4738
  ...context.filterOptions,
4668
- keys: [...context.filterableKeys],
4669
- customFilter: (query, item) => {
4739
+ keys: [...toValue(context.filterableKeys)],
4740
+ customFilter: context.filterOptions.customFilter ?? ((query, item) => {
4741
+ const columnFilters = toValue(context.customColumnFilters);
4742
+ const keys = toValue(context.filterableKeys);
4670
4743
  if (!/* @__PURE__ */ isObject(item)) return false;
4671
4744
  const q = String(/* @__PURE__ */ isArray(query) ? query[0] : query).toLowerCase();
4672
4745
  if (!q) return true;
4673
4746
  const obj = item;
4674
- for (const key of context.filterableKeys) {
4675
- const customFn = context.customColumnFilters[key];
4747
+ for (const key of keys) {
4748
+ const customFn = columnFilters[key];
4676
4749
  if (customFn) {
4677
4750
  if (customFn(obj[key], q)) return true;
4678
4751
  } else {
@@ -4681,10 +4754,7 @@ var DataTableAdapter = class {
4681
4754
  }
4682
4755
  }
4683
4756
  return false;
4684
- }
4685
- } : {
4686
- ...context.filterOptions,
4687
- keys: [...context.filterableKeys]
4757
+ })
4688
4758
  });
4689
4759
  const allItems = toRef(() => toValue(context.items));
4690
4760
  const { items: filteredItems } = filter.apply(context.search, allItems);
@@ -4698,11 +4768,12 @@ var DataTableAdapter = class {
4698
4768
  return computed(() => {
4699
4769
  const entries = sortBy.value;
4700
4770
  if (entries.length === 0) return filteredItems.value;
4771
+ const sorts = toValue(customSorts) ?? {};
4701
4772
  const collator = new Intl.Collator(locale?.value);
4702
4773
  const resolved = entries.map(({ key, direction }) => ({
4703
4774
  parts: key.split("."),
4704
4775
  direction,
4705
- custom: customSorts?.[key]
4776
+ custom: sorts[key]
4706
4777
  }));
4707
4778
  return filteredItems.value.toSorted((a, b) => {
4708
4779
  for (const { parts, direction, custom } of resolved) {
@@ -4726,7 +4797,7 @@ var DataTableAdapter = class {
4726
4797
  * filtering via createFilter, sorting via computed comparisons, and pagination
4727
4798
  * via createPagination. Automatically resets to page 1 on filter/sort changes.
4728
4799
  */
4729
- var ClientAdapter = class extends DataTableAdapter {
4800
+ var ClientDataTableAdapter = class extends DataTableAdapter {
4730
4801
  setup(context) {
4731
4802
  const { search, sortBy, locale, paginationOptions, customSorts } = context;
4732
4803
  const { allItems, filteredItems } = this.filter(context);
@@ -4796,7 +4867,7 @@ function resolveHeaders(columns) {
4796
4867
  for (const col of cols) if (col.children?.length) {
4797
4868
  const leaves = /* @__PURE__ */ extractLeaves(col.children);
4798
4869
  rows[depth].push({
4799
- key: col.key,
4870
+ id: col.id,
4800
4871
  title: col.title ?? "",
4801
4872
  colspan: leaves.length,
4802
4873
  rowspan: 1,
@@ -4804,7 +4875,7 @@ function resolveHeaders(columns) {
4804
4875
  });
4805
4876
  walk(col.children, depth + 1);
4806
4877
  } else rows[depth].push({
4807
- key: col.key,
4878
+ id: col.id,
4808
4879
  title: col.title ?? "",
4809
4880
  colspan: 1,
4810
4881
  rowspan: maxDepth - depth + 1,
@@ -4827,9 +4898,10 @@ function resolveHeaders(columns) {
4827
4898
  * The consumer is responsible for watching `search`, `sortBy`, and
4828
4899
  * `pagination.page` to trigger API calls and update the `items` ref.
4829
4900
  */
4830
- var ServerAdapter$1 = class {
4901
+ var ServerDataTableAdapter = class extends DataTableAdapter {
4831
4902
  options;
4832
4903
  constructor(options) {
4904
+ super();
4833
4905
  this.options = options;
4834
4906
  }
4835
4907
  setup(context) {
@@ -4869,7 +4941,7 @@ var ServerAdapter$1 = class {
4869
4941
  * `table.items` (or `table.sortedItems`) with createVirtual to render
4870
4942
  * only the visible viewport.
4871
4943
  */
4872
- var VirtualAdapter = class extends DataTableAdapter {
4944
+ var VirtualDataTableAdapter = class extends DataTableAdapter {
4873
4945
  setup(context) {
4874
4946
  const { search, sortBy, locale, customSorts } = context;
4875
4947
  const { allItems, filteredItems } = this.filter(context);
@@ -4904,6 +4976,12 @@ var VirtualAdapter = class extends DataTableAdapter {
4904
4976
  * reimplementing their logic. Uses createGroup's tri-state for sort direction
4905
4977
  * and delegates the data pipeline (filter, sort, paginate) to an adapter.
4906
4978
  *
4979
+ * Rows and columns are both managed via internal registries. Call
4980
+ * `table.columns.onboard([...])` / `table.columns.register({...})` to add
4981
+ * columns and `table.onboard([...])` / `table.register({...})` for rows.
4982
+ * Row identity is the ticket id (caller-supplied or auto-generated); column
4983
+ * identity is the caller-supplied `id` (required — no auto-generation).
4984
+ *
4907
4985
  * Key features:
4908
4986
  * - Adapter pattern for pipeline strategy (client, server, virtual)
4909
4987
  * - Sort via createGroup tri-state: selected=asc, mixed=desc, unselected=none
@@ -4918,10 +4996,18 @@ var VirtualAdapter = class extends DataTableAdapter {
4918
4996
  * ```ts
4919
4997
  * import { createDataTable } from '@vuetify/v0'
4920
4998
  *
4921
- * const table = createDataTable({
4922
- * items: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }],
4923
- * columns: [{ key: 'name', title: 'Name', sortable: true }],
4924
- * })
4999
+ * const table = createDataTable<User>()
5000
+ *
5001
+ * table.columns.onboard([
5002
+ * { id: 'name', title: 'Name', sortable: true },
5003
+ * { id: 'email', title: 'Email', filterable: true },
5004
+ * ])
5005
+ *
5006
+ * table.onboard([
5007
+ * { id: 1, value: { id: 1, name: 'Alice', email: 'alice@test.com' } },
5008
+ * { id: 2, value: { id: 2, name: 'Bob', email: 'bob@test.com' } },
5009
+ * ])
5010
+ *
4925
5011
  * table.sort.toggle('name')
4926
5012
  * ```
4927
5013
  */
@@ -4929,43 +5015,53 @@ var VirtualAdapter = class extends DataTableAdapter {
4929
5015
  * Creates a data table instance with sort controls, selection, and an
4930
5016
  * adapter-driven data pipeline.
4931
5017
  *
5018
+ * Rows and columns are both managed via internal registries. Use
5019
+ * `table.columns.register({ id, ... })` / `table.columns.onboard([...])` to
5020
+ * add columns and `table.register({ id, value })` / `table.onboard([...])`
5021
+ * for rows. Removing entries from the column registry reactively updates
5022
+ * `leaves`, `headers`, the sort group, and the filter pipeline.
5023
+ *
4932
5024
  * Must be called inside a component `setup()` or a Vue effect scope.
4933
5025
  * Calling at module scope in SSR environments causes request state leakage.
4934
5026
  *
4935
- * @param options Data table options
4936
- * @returns Data table context with pipeline stages and controls
5027
+ * @param options Data table options (all optional)
5028
+ * @returns Data table context with pipeline stages, controls, and registry surface
4937
5029
  *
4938
5030
  * @example
4939
5031
  * ```ts
4940
5032
  * import { createDataTable } from '@vuetify/v0'
4941
5033
  *
4942
- * const table = createDataTable({
4943
- * items: users,
4944
- * columns: [
4945
- * { key: 'name', title: 'Name', sortable: true, filterable: true },
4946
- * { key: 'email', title: 'Email', sortable: true, filterable: true },
4947
- * { key: 'age', title: 'Age', sortable: true },
4948
- * ],
4949
- * })
5034
+ * const table = createDataTable<User>()
5035
+ *
5036
+ * table.columns.onboard([
5037
+ * { id: 'name', title: 'Name', sortable: true, filterable: true },
5038
+ * { id: 'email', title: 'Email', sortable: true, filterable: true },
5039
+ * { id: 'age', title: 'Age', sortable: true },
5040
+ * ])
5041
+ *
5042
+ * table.onboard(users.map(value => ({ id: value.id, value })))
4950
5043
  *
4951
- * // Search
4952
5044
  * table.search('john')
4953
5045
  *
4954
- * // Sort
4955
- * table.sort.toggle('name') // asc
4956
- * table.sort.toggle('name') // desc
4957
- * table.sort.toggle('name') // none
4958
- * console.log(table.sort.columns.value) // [{ key: 'name', direction: 'asc' }]
5046
+ * table.sort.toggle('name')
5047
+ * table.sort.toggle('name')
5048
+ * table.sort.toggle('name')
4959
5049
  *
4960
- * // Paginate
4961
5050
  * table.pagination.next()
4962
5051
  *
4963
- * // Select rows
4964
- * table.selection.toggle('user-1')
5052
+ * table.selection.toggle(1)
4965
5053
  * ```
4966
5054
  */
4967
- function createDataTable(options) {
4968
- const { items: _items, columns, itemValue = "id", filter: filterOptions = {}, pagination: paginationOptions = {}, sortMultiple = false, mandate = false, firstSortOrder = "asc", selectStrategy = "page", itemSelectable, groupBy, openAll = false, expandMultiple = true, locale: initialLocale, adapter = new ClientAdapter() } = options;
5055
+ function createDataTable(options = {}) {
5056
+ const { filter: filterOptions = {}, pagination: paginationOptions = {}, sortMultiple = false, mandate = false, firstSortOrder = "asc", selectStrategy = "page", itemSelectable, groupBy, openAll = false, expandMultiple = true, locale: initialLocale, adapter = new ClientDataTableAdapter() } = options;
5057
+ const registry = createRegistry({
5058
+ events: true,
5059
+ reactive: true
5060
+ });
5061
+ const columns = createRegistry({
5062
+ events: true,
5063
+ reactive: true
5064
+ });
4969
5065
  const _query = shallowRef("");
4970
5066
  function search(value) {
4971
5067
  _query.value = value;
@@ -4976,44 +5072,60 @@ function createDataTable(options) {
4976
5072
  if (!/* @__PURE__ */ isNullOrUndefined(selected)) return String(selected);
4977
5073
  return initialLocale;
4978
5074
  });
4979
- const leaves = /* @__PURE__ */ extractLeaves(columns);
4980
- const headers = toRef(() => /* @__PURE__ */ resolveHeaders(columns));
4981
- const sortable = leaves.filter((col) => col.sortable === true);
5075
+ const leaves = computed(() => /* @__PURE__ */ extractLeaves(columns.values()));
5076
+ const headers = computed(() => /* @__PURE__ */ resolveHeaders(columns.values()));
5077
+ const sortable = computed(() => leaves.value.filter((col) => col.sortable === true));
4982
5078
  const group = createGroup({ multiple: sortMultiple });
4983
- group.onboard(sortable.map((col) => ({
4984
- id: col.key,
4985
- value: col.key
4986
- })));
4987
5079
  const order = shallowReactive([]);
4988
- function toggle(key) {
4989
- if (!group.has(key)) return;
4990
- const isAsc = group.selectedIds.has(key);
4991
- const isDesc = group.mixed(key);
5080
+ watch(sortable, (next) => {
5081
+ const ids = /* @__PURE__ */ new Set();
5082
+ for (const col of next) ids.add(String(col.id));
5083
+ for (const id of group.keys()) {
5084
+ const key = String(id);
5085
+ if (!ids.has(key)) {
5086
+ group.unregister(id);
5087
+ const index = order.indexOf(key);
5088
+ if (index !== -1) order.splice(index, 1);
5089
+ }
5090
+ }
5091
+ for (const id of ids) if (!group.has(id)) group.register({
5092
+ id,
5093
+ value: id
5094
+ });
5095
+ }, {
5096
+ flush: "sync",
5097
+ immediate: true
5098
+ });
5099
+ function toggle(id) {
5100
+ if (!group.has(id)) return;
5101
+ const isAsc = group.selectedIds.has(id);
5102
+ const isDesc = group.mixed(id);
4992
5103
  function clearOthers() {
4993
5104
  if (!sortMultiple) {
5105
+ group.unselectAll();
4994
5106
  group.mixedIds.clear();
4995
5107
  order.length = 0;
4996
5108
  }
4997
5109
  }
4998
5110
  function setAsc() {
4999
- group.unmix(key);
5000
- group.select(key);
5111
+ group.unmix(id);
5112
+ group.select(id);
5001
5113
  }
5002
5114
  function setDesc() {
5003
- group.unselect(key);
5004
- group.mix(key);
5115
+ group.unselect(id);
5116
+ group.mix(id);
5005
5117
  }
5006
5118
  function setNone() {
5007
- group.unselect(key);
5008
- group.unmix(key);
5009
- const index = order.indexOf(key);
5119
+ group.unselect(id);
5120
+ group.unmix(id);
5121
+ const index = order.indexOf(id);
5010
5122
  if (index !== -1) order.splice(index, 1);
5011
5123
  }
5012
5124
  if (!isAsc && !isDesc) {
5013
5125
  clearOthers();
5014
5126
  if (firstSortOrder === "desc") setDesc();
5015
5127
  else setAsc();
5016
- order.push(key);
5128
+ order.push(id);
5017
5129
  } else if (isAsc) if (firstSortOrder === "desc" && !mandate) setNone();
5018
5130
  else setDesc();
5019
5131
  else if (firstSortOrder === "asc" && !mandate) setNone();
@@ -5021,23 +5133,23 @@ function createDataTable(options) {
5021
5133
  }
5022
5134
  const sortBy = computed(() => {
5023
5135
  const result = [];
5024
- for (const key of order) if (group.selectedIds.has(key)) result.push({
5025
- key,
5136
+ for (const id of order) if (group.selectedIds.has(id)) result.push({
5137
+ key: id,
5026
5138
  direction: "asc"
5027
5139
  });
5028
- else if (group.mixed(key)) result.push({
5029
- key,
5140
+ else if (group.mixed(id)) result.push({
5141
+ key: id,
5030
5142
  direction: "desc"
5031
5143
  });
5032
5144
  return result;
5033
5145
  });
5034
- function direction(key) {
5035
- if (group.selectedIds.has(key)) return "asc";
5036
- if (group.mixed(key)) return "desc";
5146
+ function direction(id) {
5147
+ if (group.selectedIds.has(id)) return "asc";
5148
+ if (group.mixed(id)) return "desc";
5037
5149
  return "none";
5038
5150
  }
5039
- function priority(key) {
5040
- return order.indexOf(key);
5151
+ function priority(id) {
5152
+ return order.indexOf(id);
5041
5153
  }
5042
5154
  function reset() {
5043
5155
  group.unselectAll();
@@ -5052,32 +5164,41 @@ function createDataTable(options) {
5052
5164
  priority,
5053
5165
  reset
5054
5166
  };
5055
- const filterable = leaves.filter((col) => col.filterable === true).map((col) => col.key);
5056
- const sorts = {};
5057
- for (const col of leaves) if (col.sort) sorts[col.key] = col.sort;
5058
- const filters = {};
5059
- for (const col of leaves) if (col.filter) filters[col.key] = col.filter;
5167
+ const filterable = computed(() => {
5168
+ const ids = [];
5169
+ for (const col of leaves.value) if (col.filterable === true) ids.push(String(col.id));
5170
+ return ids;
5171
+ });
5172
+ const customSorts = computed(() => {
5173
+ const sorts = {};
5174
+ for (const col of leaves.value) if (col.sort) sorts[String(col.id)] = col.sort;
5175
+ return sorts;
5176
+ });
5177
+ const customColumnFilters = computed(() => {
5178
+ const filters = {};
5179
+ for (const col of leaves.value) if (col.filter) filters[String(col.id)] = col.filter;
5180
+ return filters;
5181
+ });
5182
+ const source = computed(() => registry.values().map((t) => t.value));
5060
5183
  const { allItems, filteredItems, sortedItems, items: visible, pagination, total, loading = toRef(() => false), error = toRef(() => null) } = adapter.setup({
5061
- items: _items,
5184
+ items: source,
5062
5185
  search: _query,
5063
5186
  filterableKeys: filterable,
5064
5187
  sortBy,
5065
5188
  locale,
5066
5189
  filterOptions,
5067
5190
  paginationOptions,
5068
- customSorts: sorts,
5069
- customColumnFilters: filters
5191
+ customSorts,
5192
+ customColumnFilters
5070
5193
  });
5071
5194
  const selectedIds = shallowReactive(/* @__PURE__ */ new Set());
5072
- function rowId(item) {
5073
- const value = item[itemValue];
5074
- if (/* @__PURE__ */ isString(value) || /* @__PURE__ */ isNumber(value)) return value;
5075
- throw new Error(`[v0:data-table] itemValue "${itemValue}" must resolve to a string or number`);
5076
- }
5077
5195
  const selectableIds = computed(() => {
5078
5196
  if (!itemSelectable) return null;
5079
5197
  const ids = /* @__PURE__ */ new Set();
5080
- for (const item of allItems.value) if (item[itemSelectable]) ids.add(rowId(item));
5198
+ for (const ticket of registry.values()) {
5199
+ const value = ticket.value;
5200
+ if (!/* @__PURE__ */ isNullOrUndefined(value) && value[itemSelectable]) ids.add(ticket.id);
5201
+ }
5081
5202
  return ids;
5082
5203
  });
5083
5204
  function isSelectable(id) {
@@ -5087,9 +5208,18 @@ function createDataTable(options) {
5087
5208
  if (selectStrategy === "single") return [];
5088
5209
  return selectStrategy === "all" ? sortedItems.value : visible.value;
5089
5210
  });
5090
- const selectableScope = computed(() => {
5091
- if (!itemSelectable) return scopeItems.value;
5092
- return scopeItems.value.filter((item) => !!item[itemSelectable]);
5211
+ const scopedTickets = computed(() => {
5212
+ const scope = scopeItems.value;
5213
+ if (scope.length === 0) return [];
5214
+ const set = new Set(scope);
5215
+ const result = [];
5216
+ for (const ticket of registry.values()) {
5217
+ const value = ticket.value;
5218
+ if (/* @__PURE__ */ isNullOrUndefined(value) || !set.has(value)) continue;
5219
+ if (itemSelectable && !value[itemSelectable]) continue;
5220
+ result.push(ticket);
5221
+ }
5222
+ return result;
5093
5223
  });
5094
5224
  const selection = {
5095
5225
  selectedIds,
@@ -5110,28 +5240,39 @@ function createDataTable(options) {
5110
5240
  },
5111
5241
  isSelectable,
5112
5242
  selectAll() {
5113
- for (const item of selectableScope.value) selectedIds.add(rowId(item));
5243
+ for (const ticket of scopedTickets.value) selectedIds.add(ticket.id);
5114
5244
  },
5115
5245
  unselectAll() {
5116
5246
  selectedIds.clear();
5117
5247
  },
5118
5248
  toggleAll() {
5119
5249
  if (selectStrategy === "single") return;
5120
- if (selection.isAllSelected.value) for (const item of selectableScope.value) selectedIds.delete(rowId(item));
5250
+ if (selection.isAllSelected.value) for (const ticket of scopedTickets.value) selectedIds.delete(ticket.id);
5121
5251
  else selection.selectAll();
5122
5252
  },
5123
5253
  isAllSelected: computed(() => {
5124
- const items = selectableScope.value;
5125
- if (items.length === 0) return false;
5126
- return items.every((item) => selectedIds.has(rowId(item)));
5254
+ const tickets = scopedTickets.value;
5255
+ if (tickets.length === 0) return false;
5256
+ return tickets.every((ticket) => selectedIds.has(ticket.id));
5127
5257
  }),
5128
5258
  isMixed: computed(() => {
5129
- const items = selectableScope.value;
5130
- if (items.length === 0) return false;
5131
- return items.some((item) => selectedIds.has(rowId(item))) && !selection.isAllSelected.value;
5259
+ const tickets = scopedTickets.value;
5260
+ if (tickets.length === 0) return false;
5261
+ return tickets.some((ticket) => selectedIds.has(ticket.id)) && !selection.isAllSelected.value;
5132
5262
  })
5133
5263
  };
5134
5264
  const expandedIds = shallowReactive(/* @__PURE__ */ new Set());
5265
+ const visibleTickets = computed(() => {
5266
+ const scope = visible.value;
5267
+ if (scope.length === 0) return [];
5268
+ const set = new Set(scope);
5269
+ const result = [];
5270
+ for (const ticket of registry.values()) {
5271
+ const value = ticket.value;
5272
+ if (!/* @__PURE__ */ isNullOrUndefined(value) && set.has(value)) result.push(ticket);
5273
+ }
5274
+ return result;
5275
+ });
5135
5276
  const expansion = {
5136
5277
  expandedIds,
5137
5278
  expand(id) {
@@ -5150,12 +5291,20 @@ function createDataTable(options) {
5150
5291
  },
5151
5292
  expandAll() {
5152
5293
  if (!expandMultiple) return;
5153
- for (const item of visible.value) expandedIds.add(rowId(item));
5294
+ for (const ticket of visibleTickets.value) expandedIds.add(ticket.id);
5154
5295
  },
5155
5296
  collapseAll() {
5156
5297
  expandedIds.clear();
5157
5298
  }
5158
5299
  };
5300
+ registry.on("unregister:ticket", (ticket) => {
5301
+ selectedIds.delete(ticket.id);
5302
+ expandedIds.delete(ticket.id);
5303
+ });
5304
+ registry.on("clear:registry", () => {
5305
+ selectedIds.clear();
5306
+ expandedIds.clear();
5307
+ });
5159
5308
  const opened = shallowReactive(/* @__PURE__ */ new Set());
5160
5309
  const groups = computed(() => {
5161
5310
  if (!groupBy) return [];
@@ -5182,16 +5331,43 @@ function createDataTable(options) {
5182
5331
  return result;
5183
5332
  });
5184
5333
  if (openAll) {
5185
- for (const group of groups.value) opened.add(group.key);
5186
- if (groups.value.length === 0) {
5187
- const stop = watch(groups, (newGroups) => {
5188
- if (newGroups.length === 0) return;
5189
- for (const group of newGroups) opened.add(group.key);
5190
- stop();
5191
- });
5192
- }
5334
+ const autoOpened = /* @__PURE__ */ new Set();
5335
+ for (const group of groups.value) {
5336
+ opened.add(group.key);
5337
+ autoOpened.add(group.key);
5338
+ }
5339
+ watch(groups, (newGroups) => {
5340
+ for (const group of newGroups) {
5341
+ if (autoOpened.has(group.key)) continue;
5342
+ opened.add(group.key);
5343
+ autoOpened.add(group.key);
5344
+ }
5345
+ }, { flush: "sync" });
5193
5346
  }
5347
+ const grouping = {
5348
+ groups,
5349
+ toggle(groupKey) {
5350
+ if (opened.has(groupKey)) opened.delete(groupKey);
5351
+ else opened.add(groupKey);
5352
+ },
5353
+ isOpen(groupKey) {
5354
+ return opened.has(groupKey);
5355
+ },
5356
+ open(groupKey) {
5357
+ opened.add(groupKey);
5358
+ },
5359
+ close(groupKey) {
5360
+ opened.delete(groupKey);
5361
+ },
5362
+ openAll() {
5363
+ for (const group of groups.value) opened.add(group.key);
5364
+ },
5365
+ closeAll() {
5366
+ opened.clear();
5367
+ }
5368
+ };
5194
5369
  return {
5370
+ ...registry,
5195
5371
  items: visible,
5196
5372
  allItems,
5197
5373
  filteredItems,
@@ -5200,41 +5376,27 @@ function createDataTable(options) {
5200
5376
  leaves,
5201
5377
  headers,
5202
5378
  search,
5203
- query: _query,
5379
+ query: shallowReadonly(_query),
5204
5380
  sort,
5205
5381
  pagination,
5206
5382
  selection,
5207
5383
  expansion,
5208
- grouping: {
5209
- groups,
5210
- toggle(groupKey) {
5211
- if (opened.has(groupKey)) opened.delete(groupKey);
5212
- else opened.add(groupKey);
5213
- },
5214
- isOpen(groupKey) {
5215
- return opened.has(groupKey);
5216
- },
5217
- open(groupKey) {
5218
- opened.add(groupKey);
5219
- },
5220
- close(groupKey) {
5221
- opened.delete(groupKey);
5222
- },
5223
- openAll() {
5224
- for (const group of groups.value) opened.add(group.key);
5225
- },
5226
- closeAll() {
5227
- opened.clear();
5228
- }
5229
- },
5384
+ grouping,
5230
5385
  total,
5231
5386
  loading,
5232
- error
5387
+ error,
5388
+ get size() {
5389
+ return registry.size;
5390
+ }
5233
5391
  };
5234
5392
  }
5235
5393
  /**
5236
5394
  * Creates a data table context with dependency injection support.
5237
5395
  *
5396
+ * The returned context exposes both row and column registries. Columns must
5397
+ * be onboarded after construction — pass them via `context.columns.onboard`,
5398
+ * not in the factory options.
5399
+ *
5238
5400
  * @param options Data table context options including namespace
5239
5401
  * @returns A trinity tuple: [useDataTable, provideDataTable, defaultContext]
5240
5402
  *
@@ -5242,22 +5404,23 @@ function createDataTable(options) {
5242
5404
  * ```ts
5243
5405
  * import { createDataTableContext } from '@vuetify/v0'
5244
5406
  *
5245
- * const [useDataTable, provideDataTable, context] = createDataTableContext({
5407
+ * const [useDataTable, provideDataTable, context] = createDataTableContext<User>({
5246
5408
  * namespace: 'app:users',
5247
- * items: users,
5248
- * columns: [
5249
- * { key: 'name', title: 'Name', sortable: true },
5250
- * ],
5251
5409
  * })
5252
5410
  *
5411
+ * context.columns.onboard([
5412
+ * { id: 'name', title: 'Name', sortable: true },
5413
+ * ])
5414
+ *
5253
5415
  * // Parent component
5254
5416
  * provideDataTable()
5417
+ * context.onboard(users.map(value => ({ id: value.id, value })))
5255
5418
  *
5256
5419
  * // Child component
5257
5420
  * const table = useDataTable()
5258
5421
  * ```
5259
5422
  */
5260
- function createDataTableContext(_options) {
5423
+ function createDataTableContext(_options = {}) {
5261
5424
  const { namespace = "v0:data-table", ...options } = _options;
5262
5425
  return createTrinity(namespace, createDataTable(options));
5263
5426
  }
@@ -5523,6 +5686,7 @@ function resolveAlias(name, predicate, locale) {
5523
5686
  };
5524
5687
  }
5525
5688
  function createResolve(aliases, locale) {
5689
+ useLogger();
5526
5690
  return function resolve(rules) {
5527
5691
  const result = [];
5528
5692
  for (const rule of rules) {
@@ -5829,82 +5993,403 @@ function createInput(options) {
5829
5993
  };
5830
5994
  }
5831
5995
  //#endregion
5832
- //#region src/composables/createNested/index.ts
5996
+ //#region src/composables/createSortable/index.ts
5833
5997
  /**
5834
- * @module createNested
5998
+ * @module createSortable
5835
5999
  *
5836
- * @see https://0.vuetifyjs.com/composables/selection/create-nested
6000
+ * @see https://0.vuetifyjs.com/composables/data/create-sortable
5837
6001
  *
5838
6002
  * @remarks
5839
- * Hierarchical tree management composable extending createGroup with:
5840
- * - Parent-child relationship tracking (children/parents Maps)
5841
- * - Open/close state management
5842
- * - Tree traversal utilities (getPath, getDescendants, etc.)
5843
- * - Cascade selection propagation through nested registers
5844
- * - `rootIds` tracking for top-level item detection
6003
+ * Headless ordered-list primitive. Extends `createModel` with mutation primitives
6004
+ * (`swap`, `reorder`) and an enriched `move:ticket` event on the registry event
6005
+ * bus. Honors `disabled` as a real mutation gate at both root and per-ticket scope.
5845
6006
  *
5846
- * Inheritance chain: createSelection createGroup createNested
6007
+ * Pure logical composable no DnD, no DOM, no keyboard. Drag-and-drop integration
6008
+ * composes with `useDragDrop`; keyboard reorder composes with `useVirtualFocus`.
5847
6009
  *
5848
6010
  * @example
5849
6011
  * ```ts
5850
- * import { createNested } from '@vuetify/v0'
6012
+ * import { createSortable } from '@vuetify/v0'
6013
+ * import type { SortableTicketInput } from '@vuetify/v0'
5851
6014
  *
5852
- * const tree = createNested()
5853
- * const root = tree.register({ value: 'root' })
5854
- * tree.register({ value: 'child', parentId: root.id })
5855
- * tree.open(root.id)
6015
+ * interface TaskTicket extends SortableTicketInput {
6016
+ * value: { id: number; label: string }
6017
+ * }
6018
+ *
6019
+ * const sortable = createSortable<TaskTicket>()
6020
+ * const a = sortable.register({ value: { id: 1, label: 'A' } })
6021
+ * const b = sortable.register({ value: { id: 2, label: 'B' } })
6022
+ *
6023
+ * sortable.move(a.id, 1)
6024
+ * sortable.on('move:ticket', ({ ticket, from, to }) => {
6025
+ * console.log(`${ticket.value.label} moved ${from} → ${to}`)
6026
+ * })
5856
6027
  * ```
5857
6028
  */
5858
6029
  /**
5859
- * Creates a new nested tree instance with hierarchical management.
5860
- *
5861
- * Extends `createGroup` to support parent-child relationships, tree traversal,
5862
- * and open/close state management. Perfect for tree views, nested navigation,
5863
- * and hierarchical data structures.
5864
- *
5865
- * @param options The options for the nested instance.
5866
- * @returns A new nested instance with tree management capabilities.
5867
- *
5868
- * @remarks
5869
- * **Key Differences from `createGroup`:**
5870
- * - `register()` accepts `parentId` for establishing parent-child relationships
5871
- * - `unregister()` accepts optional `cascade` parameter for cascading deletions
5872
- * - Adds tree traversal methods: `getPath()`, `getAncestors()`, `getDescendants()`
5873
- * - Adds computed properties: `roots`, `leaves`, `isLeaf()`, `getDepth()`
5874
- * - Adds open state management: `open()`, `close()`, `flip()`, `opened()`
6030
+ * Create an ordered-list state primitive.
5875
6031
  *
5876
- * @see https://0.vuetifyjs.com/composables/selection/create-nested
6032
+ * @param options Sortable options.
6033
+ * @returns A {@link SortableContext} that extends {@link ModelContext}.
5877
6034
  *
5878
6035
  * @example
5879
6036
  * ```ts
5880
- * import { createNested } from '@vuetify/v0'
5881
- *
5882
- * const tree = createNested()
5883
- *
5884
- * const root = tree.register({ id: 'root', value: 'Root' })
5885
- * const child1 = tree.register({ id: 'child-1', value: 'Child 1', parentId: 'root' })
5886
- * const child2 = tree.register({ id: 'child-2', value: 'Child 2', parentId: 'root' })
5887
- *
5888
- * console.log(tree.getPath('child-1')) // ['root', 'child-1']
5889
- * console.log(tree.getDescendants('root')) // ['child-1', 'child-2']
5890
- * console.log(tree.isLeaf('child-2')) // true
5891
- *
5892
- * tree.open('root')
5893
- * console.log(tree.opened('root')) // true
6037
+ * const sortable = createSortable<Todo>()
6038
+ * sortable.onboard(todos.value.map(value => ({ value })))
5894
6039
  * ```
5895
6040
  */
5896
- function createNested(_options = {}) {
5897
- const { open: openMode = "multiple", openAll = false, reveal: revealOnOpen = false, selection: selectionMode = "cascade", active: activeMode = "single", ...options } = _options;
5898
- const mandatoryOption = _options.mandatory ?? false;
5899
- const multipleOption = _options.multiple ?? true;
5900
- const group = createGroup(options);
6041
+ function createSortable(_options = {}) {
6042
+ const { disabled, ...options } = _options;
6043
+ const model = createModel({
6044
+ ...options,
6045
+ events: true,
6046
+ disabled
6047
+ });
5901
6048
  const logger = useLogger();
5902
- const children = shallowReactive(/* @__PURE__ */ new Map());
5903
- const parents = shallowReactive(/* @__PURE__ */ new Map());
5904
- const openedIds = shallowReactive(/* @__PURE__ */ new Set());
5905
- const activeIds = shallowReactive(/* @__PURE__ */ new Set());
5906
- const rootIds = shallowReactive(/* @__PURE__ */ new Set());
5907
- let batching = false;
6049
+ function move(id, toIndex) {
6050
+ if (toValue(disabled)) return void 0;
6051
+ const ticket = model.get(id);
6052
+ if (!ticket) return void 0;
6053
+ if (toValue(ticket.disabled)) return void 0;
6054
+ const from = ticket.index;
6055
+ const result = model.move(id, toIndex);
6056
+ if (result && result.index !== from) model.emit("move:ticket", {
6057
+ ticket: result,
6058
+ from,
6059
+ to: result.index
6060
+ });
6061
+ return result;
6062
+ }
6063
+ function swap(a, b) {
6064
+ if (toValue(disabled)) return;
6065
+ if (a === b) return;
6066
+ const ta = model.get(a);
6067
+ const tb = model.get(b);
6068
+ if (!ta || !tb) return;
6069
+ if (toValue(ta.disabled) || toValue(tb.disabled)) return;
6070
+ const indexA = ta.index;
6071
+ const indexB = tb.index;
6072
+ model.batch(() => {
6073
+ const ra = model.move(a, indexB);
6074
+ if (ra && ra.index !== indexA) model.emit("move:ticket", {
6075
+ ticket: ra,
6076
+ from: indexA,
6077
+ to: ra.index
6078
+ });
6079
+ const rb = model.move(b, indexA);
6080
+ if (rb && rb.index !== indexB) model.emit("move:ticket", {
6081
+ ticket: rb,
6082
+ from: indexB,
6083
+ to: rb.index
6084
+ });
6085
+ });
6086
+ }
6087
+ function reorder(ids) {
6088
+ if (toValue(disabled)) return;
6089
+ const currentSize = model.size;
6090
+ if (ids.length !== currentSize) {
6091
+ logger.warn(`Reorder expected ${currentSize} ids, got ${ids.length}.`);
6092
+ return;
6093
+ }
6094
+ const known = new Set(model.keys());
6095
+ const seen = /* @__PURE__ */ new Set();
6096
+ for (const id of ids) {
6097
+ if (!known.has(id)) {
6098
+ logger.warn(`Reorder contains unknown id "${String(id)}".`);
6099
+ return;
6100
+ }
6101
+ if (seen.has(id)) {
6102
+ logger.warn(`Reorder contains duplicate id "${String(id)}".`);
6103
+ return;
6104
+ }
6105
+ seen.add(id);
6106
+ }
6107
+ const froms = /* @__PURE__ */ new Map();
6108
+ for (const id of ids) {
6109
+ const ticket = model.get(id);
6110
+ if (ticket) froms.set(id, ticket.index);
6111
+ }
6112
+ model.batch(() => {
6113
+ model.reorder(ids);
6114
+ for (const [index, id] of ids.entries()) {
6115
+ const from = froms.get(id);
6116
+ if (from === index) continue;
6117
+ const ticket = model.get(id);
6118
+ if (ticket) model.emit("move:ticket", {
6119
+ ticket,
6120
+ from,
6121
+ to: index
6122
+ });
6123
+ }
6124
+ });
6125
+ }
6126
+ return {
6127
+ ...model,
6128
+ move,
6129
+ swap,
6130
+ reorder,
6131
+ get size() {
6132
+ return model.size;
6133
+ }
6134
+ };
6135
+ }
6136
+ //#endregion
6137
+ //#region src/composables/createKanban/index.ts
6138
+ /**
6139
+ * @module createKanban
6140
+ *
6141
+ * @see https://0.vuetifyjs.com/composables/data/create-kanban
6142
+ *
6143
+ * @remarks
6144
+ * Headless data-flow management for two-level sortable boards. Wraps a column
6145
+ * sortable; each column ticket carries its own inner sortable on `column.items`.
6146
+ * Adds a `transfer` primitive for cross-column moves with reused `disabled`
6147
+ * gating and a destination-side `accept` predicate. Pure logic — no DnD, no DOM.
6148
+ *
6149
+ * @example
6150
+ * ```ts
6151
+ * import { createKanban } from '@vuetify/v0'
6152
+ * import type { SortableTicketInput } from '@vuetify/v0'
6153
+ *
6154
+ * interface CardTicket extends SortableTicketInput {
6155
+ * value: { title: string }
6156
+ * }
6157
+ *
6158
+ * const kanban = createKanban<CardTicket>()
6159
+ *
6160
+ * const todo = kanban.columns.register({ value: { title: 'Todo' } })
6161
+ * const done = kanban.columns.register({ value: { title: 'Done' } })
6162
+ *
6163
+ * const card = todo.items.register({ value: { title: 'Write spec' } })
6164
+ *
6165
+ * kanban.on('transfer:ticket', ({ ticket, from, to }) => {
6166
+ * console.log(ticket.value.title, from, '→', to)
6167
+ * })
6168
+ *
6169
+ * kanban.transfer(card.id, done.id, 0)
6170
+ * ```
6171
+ */
6172
+ /**
6173
+ * Create a headless two-level sortable orchestrator.
6174
+ *
6175
+ * @param options Kanban options (currently only `disabled`).
6176
+ * @returns A {@link KanbanContext}.
6177
+ *
6178
+ * @example
6179
+ * ```ts
6180
+ * import { createKanban } from '@vuetify/v0'
6181
+ * import type { KanbanColumnTicketInput, SortableTicketInput } from '@vuetify/v0'
6182
+ *
6183
+ * interface CardTicket extends SortableTicketInput {
6184
+ * value: { title: string }
6185
+ * }
6186
+ *
6187
+ * interface BoardColumn extends KanbanColumnTicketInput<CardTicket> {
6188
+ * value: { title: string }
6189
+ * }
6190
+ *
6191
+ * const kanban = createKanban<CardTicket, BoardColumn>()
6192
+ *
6193
+ * const todo = kanban.columns.register({ value: { title: 'Todo' } })
6194
+ * const review = kanban.columns.register({
6195
+ * value: { title: 'Review' },
6196
+ * accept: card => card.value.title.length > 0,
6197
+ * })
6198
+ *
6199
+ * const spec = todo.items.register({ value: { title: 'Write spec' } })
6200
+ * kanban.transfer(spec.id, review.id, 0)
6201
+ * ```
6202
+ */
6203
+ function createKanban(_options = {}) {
6204
+ const { disabled, ...options } = _options;
6205
+ const logger = useLogger();
6206
+ const _columns = createSortable({
6207
+ ...options,
6208
+ disabled
6209
+ });
6210
+ const lookup = createRegistry({ events: true });
6211
+ const bus = createRegistry({ events: true });
6212
+ const on = bus.on;
6213
+ const off = bus.off;
6214
+ const columns = {
6215
+ ..._columns,
6216
+ register(registration) {
6217
+ let ticket;
6218
+ const items = createSortable({ disabled: () => !!toValue(disabled) || !!toValue(ticket?.disabled) });
6219
+ items.on("register:ticket", (t) => {
6220
+ lookup.upsert(t.id, { value: ticket.id });
6221
+ });
6222
+ items.on("unregister:ticket", (t) => {
6223
+ lookup.get(t.id)?.unregister();
6224
+ });
6225
+ ticket = _columns.register({
6226
+ ...registration,
6227
+ items
6228
+ });
6229
+ return ticket;
6230
+ },
6231
+ onboard(registrations) {
6232
+ return _columns.batch(() => registrations.map((reg) => columns.register(reg)));
6233
+ },
6234
+ upsert(id, patch = {}, event) {
6235
+ return /* @__PURE__ */ isUndefined(_columns.get(id)) ? columns.register({
6236
+ ...patch,
6237
+ id
6238
+ }) : _columns.upsert(id, patch, event);
6239
+ },
6240
+ get size() {
6241
+ return _columns.size;
6242
+ }
6243
+ };
6244
+ function isAccepted(accept, ticket, from, toIndex) {
6245
+ if (/* @__PURE__ */ isUndefined(accept)) return true;
6246
+ try {
6247
+ const result = accept(ticket, from, toIndex);
6248
+ if (/* @__PURE__ */ isThenable(result)) {
6249
+ logger.warn("accept predicate returned a thenable; async predicates are not supported — treating as reject");
6250
+ return false;
6251
+ }
6252
+ return Boolean(result);
6253
+ } catch (error) {
6254
+ logger.error("accept predicate threw; treating as reject", error);
6255
+ return false;
6256
+ }
6257
+ }
6258
+ columns.on("unregister:ticket", (column) => {
6259
+ column.items.dispose();
6260
+ for (const t of lookup.values()) if (t.value === column.id) t.unregister();
6261
+ });
6262
+ function transfer(id, toColumnId, toIndex) {
6263
+ const fromColumnId = lookup.get(id)?.value;
6264
+ if (/* @__PURE__ */ isUndefined(fromColumnId)) {
6265
+ logger.warn(`unknown ticket id "${String(id)}"`);
6266
+ return;
6267
+ }
6268
+ const source = columns.get(fromColumnId);
6269
+ if (!source) {
6270
+ logger.warn(`unknown source column id "${String(fromColumnId)}"`);
6271
+ return;
6272
+ }
6273
+ const destination = columns.get(toColumnId);
6274
+ if (!destination) {
6275
+ logger.warn(`unknown destination column id "${String(toColumnId)}"`);
6276
+ return;
6277
+ }
6278
+ const ticket = source.items.get(id);
6279
+ if (!ticket) {
6280
+ logger.warn(`ticket "${String(id)}" missing from source column "${String(fromColumnId)}"`);
6281
+ return;
6282
+ }
6283
+ const fromIndex = ticket.index;
6284
+ if (toColumnId === fromColumnId) return source.items.move(id, toIndex);
6285
+ if (toValue(disabled) || toValue(source.disabled) || toValue(destination.disabled) || toValue(ticket.disabled)) return;
6286
+ if (!isAccepted(destination.accept, ticket, fromColumnId, toIndex)) return void 0;
6287
+ if (!/* @__PURE__ */ isUndefined(destination.items.get(id))) {
6288
+ logger.warn(`id "${String(id)}" already exists in destination column "${String(toColumnId)}"`);
6289
+ return;
6290
+ }
6291
+ let registered;
6292
+ let moved;
6293
+ destination.items.batch(() => {
6294
+ const [input] = source.items.offboard([id]);
6295
+ if (/* @__PURE__ */ isUndefined(input)) return;
6296
+ registered = destination.items.register(input);
6297
+ moved = registered.index === toIndex ? registered : destination.items.move(registered.id, toIndex);
6298
+ });
6299
+ const final = moved ?? registered;
6300
+ if (final) bus.emit("transfer:ticket", {
6301
+ ticket: final,
6302
+ from: fromColumnId,
6303
+ to: toColumnId,
6304
+ fromIndex,
6305
+ toIndex: final.index
6306
+ });
6307
+ return final;
6308
+ }
6309
+ return {
6310
+ columns,
6311
+ transfer,
6312
+ on,
6313
+ off
6314
+ };
6315
+ }
6316
+ //#endregion
6317
+ //#region src/composables/createNested/index.ts
6318
+ /**
6319
+ * @module createNested
6320
+ *
6321
+ * @see https://0.vuetifyjs.com/composables/selection/create-nested
6322
+ *
6323
+ * @remarks
6324
+ * Hierarchical tree management composable extending createGroup with:
6325
+ * - Parent-child relationship tracking (children/parents Maps)
6326
+ * - Open/close state management
6327
+ * - Tree traversal utilities (getPath, getDescendants, etc.)
6328
+ * - Cascade selection propagation through nested registers
6329
+ * - `rootIds` tracking for top-level item detection
6330
+ *
6331
+ * Inheritance chain: createSelection → createGroup → createNested
6332
+ *
6333
+ * @example
6334
+ * ```ts
6335
+ * import { createNested } from '@vuetify/v0'
6336
+ *
6337
+ * const tree = createNested()
6338
+ * const root = tree.register({ value: 'root' })
6339
+ * tree.register({ value: 'child', parentId: root.id })
6340
+ * tree.open(root.id)
6341
+ * ```
6342
+ */
6343
+ /**
6344
+ * Creates a new nested tree instance with hierarchical management.
6345
+ *
6346
+ * Extends `createGroup` to support parent-child relationships, tree traversal,
6347
+ * and open/close state management. Perfect for tree views, nested navigation,
6348
+ * and hierarchical data structures.
6349
+ *
6350
+ * @param options The options for the nested instance.
6351
+ * @returns A new nested instance with tree management capabilities.
6352
+ *
6353
+ * @remarks
6354
+ * **Key Differences from `createGroup`:**
6355
+ * - `register()` accepts `parentId` for establishing parent-child relationships
6356
+ * - `unregister()` accepts optional `cascade` parameter for cascading deletions
6357
+ * - Adds tree traversal methods: `getPath()`, `getAncestors()`, `getDescendants()`
6358
+ * - Adds computed properties: `roots`, `leaves`, `isLeaf()`, `getDepth()`
6359
+ * - Adds open state management: `open()`, `close()`, `flip()`, `opened()`
6360
+ *
6361
+ * @see https://0.vuetifyjs.com/composables/selection/create-nested
6362
+ *
6363
+ * @example
6364
+ * ```ts
6365
+ * import { createNested } from '@vuetify/v0'
6366
+ *
6367
+ * const tree = createNested()
6368
+ *
6369
+ * const root = tree.register({ id: 'root', value: 'Root' })
6370
+ * const child1 = tree.register({ id: 'child-1', value: 'Child 1', parentId: 'root' })
6371
+ * const child2 = tree.register({ id: 'child-2', value: 'Child 2', parentId: 'root' })
6372
+ *
6373
+ * console.log(tree.getPath('child-1')) // ['root', 'child-1']
6374
+ * console.log(tree.getDescendants('root')) // ['child-1', 'child-2']
6375
+ * console.log(tree.isLeaf('child-2')) // true
6376
+ *
6377
+ * tree.open('root')
6378
+ * console.log(tree.opened('root')) // true
6379
+ * ```
6380
+ */
6381
+ function createNested(_options = {}) {
6382
+ const { open: openMode = "multiple", openAll = false, reveal: revealOnOpen = false, selection: selectionMode = "cascade", active: activeMode = "single", ...options } = _options;
6383
+ const mandatoryOption = _options.mandatory ?? false;
6384
+ const multipleOption = _options.multiple ?? true;
6385
+ const group = createGroup(options);
6386
+ const logger = useLogger();
6387
+ const children = shallowReactive(/* @__PURE__ */ new Map());
6388
+ const parents = shallowReactive(/* @__PURE__ */ new Map());
6389
+ const openedIds = shallowReactive(/* @__PURE__ */ new Set());
6390
+ const activeIds = shallowReactive(/* @__PURE__ */ new Set());
6391
+ const rootIds = shallowReactive(/* @__PURE__ */ new Set());
6392
+ let batching = false;
5908
6393
  let pendingChildren;
5909
6394
  let pendingParents;
5910
6395
  let pendingRoots;
@@ -6693,6 +7178,188 @@ function createNumberField(options = {}) {
6693
7178
  };
6694
7179
  }
6695
7180
  //#endregion
7181
+ //#region src/composables/createOtp/index.ts
7182
+ /**
7183
+ * @module createOtp
7184
+ *
7185
+ * @see https://0.vuetifyjs.com/composables/forms/create-otp
7186
+ *
7187
+ * @remarks
7188
+ * Headless state for a fixed-length one-time-password / verification-code value.
7189
+ * Owns the joined string, per-character pattern matching, length contract,
7190
+ * completion edge detection with a decisional async `onComplete` hook, and
7191
+ * validation through `createInput`. Rendering, focus, and per-element event
7192
+ * wiring are the consumer's responsibility.
7193
+ *
7194
+ * @example
7195
+ * ```ts
7196
+ * import { createOtp } from '@vuetify/v0'
7197
+ *
7198
+ * const otp = createOtp({
7199
+ * length: 6,
7200
+ * pattern: 'numeric',
7201
+ * onComplete: async value => {
7202
+ * const ok = await verify(value)
7203
+ * return ok
7204
+ * },
7205
+ * })
7206
+ *
7207
+ * otp.write(0, '4')
7208
+ * otp.distribute('12345', 1) // returns 5; value becomes '412345'
7209
+ * otp.isComplete.value // true
7210
+ * ```
7211
+ */
7212
+ const PRESETS = {
7213
+ numeric: /^[0-9]$/,
7214
+ alphanumeric: /^[a-zA-Z0-9]$/,
7215
+ alphabetic: /^[a-zA-Z]$/
7216
+ };
7217
+ function createOtp(options = {}) {
7218
+ const { value = shallowRef(""), length = 6, pattern = "numeric", disabled = false, readonly: _readonly = false, onComplete, ...inputOptions } = options;
7219
+ const logger = useLogger();
7220
+ const errorRef = shallowRef(false);
7221
+ const errorMessagesRef = shallowRef(void 0);
7222
+ const input = createInput({
7223
+ ...inputOptions,
7224
+ value,
7225
+ disabled,
7226
+ readonly: _readonly,
7227
+ error: errorRef,
7228
+ errorMessages: errorMessagesRef
7229
+ });
7230
+ const lengthRef = toRef(() => toValue(length));
7231
+ let lastCompleted = "";
7232
+ function compile(resolved) {
7233
+ if (/* @__PURE__ */ isString(resolved)) return PRESETS[resolved];
7234
+ return resolved;
7235
+ }
7236
+ function accepts(char) {
7237
+ if (char.length !== 1) return false;
7238
+ return compile(toValue(pattern)).test(char);
7239
+ }
7240
+ function filterAccepted(text) {
7241
+ let out = "";
7242
+ for (const ch of text) if (accepts(ch)) out += ch;
7243
+ return out;
7244
+ }
7245
+ const isPending = shallowRef(false);
7246
+ function isLocked() {
7247
+ return toValue(disabled) || toValue(_readonly) || isPending.value;
7248
+ }
7249
+ function clearRejection() {
7250
+ if (errorRef.value || errorMessagesRef.value) {
7251
+ errorRef.value = false;
7252
+ errorMessagesRef.value = void 0;
7253
+ }
7254
+ }
7255
+ function write(index, char) {
7256
+ if (isLocked()) return;
7257
+ const max = toValue(lengthRef);
7258
+ if (index < 0 || index >= max) return;
7259
+ if (char === "") {
7260
+ clearRejection();
7261
+ value.value = value.value.slice(0, index);
7262
+ return;
7263
+ }
7264
+ const first = char[0];
7265
+ if (!accepts(first)) return;
7266
+ clearRejection();
7267
+ const current = value.value;
7268
+ const head = current.slice(0, index);
7269
+ const tail = current.slice(index + 1);
7270
+ value.value = (head + first + tail).slice(0, max);
7271
+ }
7272
+ function distribute(text, index = 0) {
7273
+ if (isLocked()) return 0;
7274
+ const max = toValue(lengthRef);
7275
+ const start = /* @__PURE__ */ clamp(index, 0, max);
7276
+ const filtered = filterAccepted(text);
7277
+ if (filtered.length === 0) return 0;
7278
+ clearRejection();
7279
+ const head = value.value.slice(0, start);
7280
+ const next = (head + filtered).slice(0, max);
7281
+ value.value = next;
7282
+ return next.length - head.length;
7283
+ }
7284
+ function clear() {
7285
+ if (isLocked()) return;
7286
+ clearRejection();
7287
+ lastCompleted = "";
7288
+ value.value = "";
7289
+ }
7290
+ function fill(text) {
7291
+ if (isLocked()) return;
7292
+ const max = toValue(lengthRef);
7293
+ const filtered = filterAccepted(text).slice(0, max);
7294
+ if (text.length === 0 || filtered.length > 0) clearRejection();
7295
+ value.value = filtered;
7296
+ }
7297
+ function reject() {
7298
+ errorRef.value = true;
7299
+ errorMessagesRef.value = ["Invalid code"];
7300
+ lastCompleted = "";
7301
+ value.value = "";
7302
+ }
7303
+ const isComplete = toRef(() => {
7304
+ const max = toValue(lengthRef);
7305
+ const v = value.value;
7306
+ if (v.length !== max) return false;
7307
+ const re = compile(toValue(pattern));
7308
+ for (const ch of v) if (!re.test(ch)) return false;
7309
+ return true;
7310
+ });
7311
+ watch(value, (next) => {
7312
+ if (!isComplete.value) {
7313
+ lastCompleted = "";
7314
+ return;
7315
+ }
7316
+ if (!onComplete) return;
7317
+ if (isLocked()) return;
7318
+ if (next === lastCompleted) return;
7319
+ lastCompleted = next;
7320
+ let result;
7321
+ try {
7322
+ result = onComplete(next);
7323
+ } catch (error) {
7324
+ logger.warn("createOtp: onComplete threw", error);
7325
+ reject();
7326
+ return;
7327
+ }
7328
+ if (/* @__PURE__ */ isThenable(result)) {
7329
+ isPending.value = true;
7330
+ result.then((ok) => {
7331
+ isPending.value = false;
7332
+ if (ok === false) reject();
7333
+ }, (error) => {
7334
+ isPending.value = false;
7335
+ logger.warn("createOtp: onComplete rejected", error);
7336
+ reject();
7337
+ });
7338
+ return;
7339
+ }
7340
+ if (result === false) reject();
7341
+ });
7342
+ return {
7343
+ value,
7344
+ length: lengthRef,
7345
+ input: {
7346
+ ...input,
7347
+ reset() {
7348
+ clearRejection();
7349
+ lastCompleted = "";
7350
+ input.reset();
7351
+ }
7352
+ },
7353
+ isComplete,
7354
+ isValidating: isPending,
7355
+ write,
7356
+ distribute,
7357
+ clear,
7358
+ fill,
7359
+ accepts
7360
+ };
7361
+ }
7362
+ //#endregion
6696
7363
  //#region src/composables/useHydration/index.ts
6697
7364
  /**
6698
7365
  * @module useHydration
@@ -7082,6 +7749,7 @@ function useElementSize(target) {
7082
7749
  const height = shallowRef(0);
7083
7750
  const { pause: _pause, resume, stop, isActive, isPaused } = useResizeObserver(target, (entries) => {
7084
7751
  const entry = entries[0];
7752
+ /* v8 ignore next 4 -- defensive: ResizeObserver always passes an entry array with at least one entry */
7085
7753
  if (entry) {
7086
7754
  width.value = entry.contentRect.width;
7087
7755
  height.value = entry.contentRect.height;
@@ -7095,7 +7763,7 @@ function useElementSize(target) {
7095
7763
  return {
7096
7764
  width: shallowReadonly(width),
7097
7765
  height: shallowReadonly(height),
7098
- isActive,
7766
+ isActive: shallowReadonly(isActive),
7099
7767
  isPaused: shallowReadonly(isPaused),
7100
7768
  pause,
7101
7769
  resume,
@@ -7240,6 +7908,7 @@ function createOverflow(options = {}) {
7240
7908
  }),
7241
7909
  total,
7242
7910
  isOverflowing: toRef(() => {
7911
+ if (width.value === 0) return false;
7243
7912
  return total.value > width.value - toValue(reserved);
7244
7913
  }),
7245
7914
  measure,
@@ -7392,7 +8061,7 @@ function createProgress(options = {}) {
7392
8061
  }
7393
8062
  for (const [index, element] of clamped.entries()) {
7394
8063
  const ticket = segments.value[index];
7395
- if (!ticket || !isRef(ticket.value)) continue;
8064
+ if (!ticket || !isRef(ticket.value) || isReadonly(ticket.value)) continue;
7396
8065
  ticket.value.value = element;
7397
8066
  }
7398
8067
  }
@@ -7554,7 +8223,7 @@ function createQueue(_options = {}) {
7554
8223
  if (!ticket || ticket.index !== 0 || !ticket.isPaused) return void 0;
7555
8224
  const updated = registry.upsert(ticket.id, { isPaused: false });
7556
8225
  const timer = timers.get(updated.id);
7557
- if (timer) timer.start();
8226
+ if (timer) timer.resume();
7558
8227
  else createTicketTimer(updated);
7559
8228
  return updated;
7560
8229
  }
@@ -8449,6 +9118,7 @@ function createVirtual(items, _options = {}) {
8449
9118
  /* v8 ignore stop */
8450
9119
  });
8451
9120
  useResizeObserver(element, (entries) => {
9121
+ /* v8 ignore next -- defensive: ResizeObserver always emits at least one entry */
8452
9122
  if (!entries[0]) return;
8453
9123
  viewportHeight.value = entries[0].contentRect.height;
8454
9124
  update();
@@ -8461,6 +9131,7 @@ function createVirtual(items, _options = {}) {
8461
9131
  rebuild();
8462
9132
  }, { immediate: true });
8463
9133
  watch(element, () => {
9134
+ /* v8 ignore next -- defensive: watch fires only when element is present */
8464
9135
  if (!element.value) return;
8465
9136
  if (direction === "reverse" && items.value.length > 0) {
8466
9137
  const lastIndex = items.value.length - 1;
@@ -8479,6 +9150,7 @@ function createVirtual(items, _options = {}) {
8479
9150
  anchorOffset = 0;
8480
9151
  } else if (/* @__PURE__ */ isFunction(anchor)) {
8481
9152
  const result = anchor(items.value);
9153
+ /* v8 ignore next 4 -- function-anchor: tested with valid number return; non-number rejection branch is implicit */
8482
9154
  if (/* @__PURE__ */ isNumber(result)) {
8483
9155
  anchorIndex = result;
8484
9156
  anchorOffset = element.value.scrollTop - (offsets.value[result] || 0);
@@ -8562,8 +9234,10 @@ function createVirtual(items, _options = {}) {
8562
9234
  /* v8 ignore stop */
8563
9235
  }
8564
9236
  function resize(index, height) {
9237
+ /* v8 ignore next -- early bail when height is already correct */
8565
9238
  if (heights.value[index] === height) return;
8566
9239
  heights.value[index] = height;
9240
+ /* v8 ignore next -- first-call only: itemHeight bootstrapped from initial measurement */
8567
9241
  if (!itemHeight.value) itemHeight.value = height;
8568
9242
  if (IN_BROWSER) {
8569
9243
  cancelAnimationFrame(rebuildRaf);
@@ -8580,6 +9254,7 @@ function createVirtual(items, _options = {}) {
8580
9254
  /* v8 ignore stop */
8581
9255
  }
8582
9256
  function scrollTo(index, scrollOptions) {
9257
+ /* v8 ignore next -- defensive: scrollTo only invoked after element mounts */
8583
9258
  if (!element.value) return;
8584
9259
  const targetOffset = offsets.value[index] || 0;
8585
9260
  const behavior = scrollOptions?.behavior ?? "auto";
@@ -8705,27 +9380,145 @@ function useVirtual(namespace = "v0:virtual") {
8705
9380
  return useContext(namespace);
8706
9381
  }
8707
9382
  //#endregion
8708
- //#region src/composables/toReactive/index.ts
9383
+ //#region src/composables/toHighlight/index.ts
8709
9384
  /**
8710
- * @module toReactive
9385
+ * @module toHighlight
8711
9386
  *
8712
- * @see https://0.vuetifyjs.com/composables/transformers/to-reactive
9387
+ * @see https://0.vuetifyjs.com/composables/transformers/to-highlight
8713
9388
  *
8714
9389
  * @remarks
8715
- * Utility function to convert values and refs into reactive proxies with ref unwrapping.
8716
- *
8717
- * Key features:
8718
- * - Automatic ref unwrapping
8719
- * - Deep reactive proxying
8720
- * - Map and Set support with ref unwrapping
8721
- * - Nested object/array reactivity
8722
- * - Type preservation
8723
- *
8724
- * Perfect for creating reactive versions of plain objects while automatically unwrapping refs.
9390
+ * Pure transformer no DOM, no state, no registry, no reactivity. Splits text
9391
+ * into matched and unmatched chunks given a query string, an array of query
9392
+ * strings, or pre-computed `[start, end]` match ranges (e.g., from createFilter).
9393
+ * Returns a plain array; wrap the call in `computed()` for reactive recomputation.
8725
9394
  *
8726
9395
  * @example
8727
9396
  * ```ts
8728
- * import { shallowRef } from 'vue'
9397
+ * import { toHighlight } from '@vuetify/v0'
9398
+ *
9399
+ * const chunks = toHighlight('Hello World', 'World')
9400
+ * // [{ text: 'Hello ', match: false }, { text: 'World', match: true }]
9401
+ * ```
9402
+ */
9403
+ function merge(ranges) {
9404
+ const sorted = ranges.filter((span) => span[0] < span[1]).toSorted((a, b) => a[0] - b[0]);
9405
+ const merged = [];
9406
+ for (const span of sorted) {
9407
+ const last = merged.at(-1);
9408
+ if (last && span[0] <= last[1]) last[1] = Math.max(last[1], span[1]);
9409
+ else merged.push([span[0], span[1]]);
9410
+ }
9411
+ return merged;
9412
+ }
9413
+ function chunk(text, ranges) {
9414
+ const chunks = [];
9415
+ let cursor = 0;
9416
+ for (const [start, end] of ranges) {
9417
+ if (cursor < start) chunks.push({
9418
+ text: text.slice(cursor, start),
9419
+ match: false
9420
+ });
9421
+ chunks.push({
9422
+ text: text.slice(start, end),
9423
+ match: true
9424
+ });
9425
+ cursor = end;
9426
+ }
9427
+ if (cursor < text.length) chunks.push({
9428
+ text: text.slice(cursor),
9429
+ match: false
9430
+ });
9431
+ return chunks;
9432
+ }
9433
+ function find(text, query, matchAll, ignoreCase) {
9434
+ const terms = (/* @__PURE__ */ toArray(query)).filter(Boolean);
9435
+ const haystack = ignoreCase ? text.toLocaleLowerCase() : text;
9436
+ const spans = [];
9437
+ for (const term of terms) {
9438
+ const needle = ignoreCase ? term.toLocaleLowerCase() : term;
9439
+ let index = haystack.indexOf(needle);
9440
+ if (index !== -1) {
9441
+ spans.push([index, index + term.length]);
9442
+ if (matchAll) {
9443
+ index = haystack.indexOf(needle, index + term.length);
9444
+ while (index !== -1) {
9445
+ spans.push([index, index + term.length]);
9446
+ index = haystack.indexOf(needle, index + term.length);
9447
+ }
9448
+ }
9449
+ }
9450
+ }
9451
+ return merge(spans);
9452
+ }
9453
+ /**
9454
+ * Splits text into matched and unmatched chunks.
9455
+ *
9456
+ * Pure transformer — returns a plain array. Wrap the call in `computed()` for
9457
+ * reactive recomputation.
9458
+ *
9459
+ * Priority: `options.matches` (when non-empty) → `query` → no-match fallback.
9460
+ *
9461
+ * @param text The source string to split.
9462
+ * @param query One or more search terms. Empty strings are ignored. Case sensitivity controlled by `options.ignoreCase`.
9463
+ * @param options Optional `matches`, `matchAll`, `ignoreCase`.
9464
+ * @returns A `HighlightChunk[]` array.
9465
+ *
9466
+ * @see https://0.vuetifyjs.com/composables/transformers/to-highlight
9467
+ *
9468
+ * @example
9469
+ * ```ts
9470
+ * import { computed, shallowRef } from 'vue'
9471
+ * import { toHighlight } from '@vuetify/v0'
9472
+ *
9473
+ * const query = shallowRef('World')
9474
+ * const chunks = computed(() => toHighlight('Hello World', query))
9475
+ *
9476
+ * console.log(chunks.value)
9477
+ * // [{ text: 'Hello ', match: false }, { text: 'World', match: true }]
9478
+ * ```
9479
+ */
9480
+ /* @__NO_SIDE_EFFECTS__ */
9481
+ function toHighlight(text, query, options = {}) {
9482
+ const _text = toValue(text);
9483
+ const _query = toValue(query);
9484
+ const _matches = toValue(options.matches);
9485
+ const matchAll = toValue(options.matchAll) ?? false;
9486
+ const ignoreCase = toValue(options.ignoreCase) ?? false;
9487
+ if (_matches?.length) return chunk(_text, merge(_matches));
9488
+ if (_query) {
9489
+ const ranges = find(_text, _query, matchAll, ignoreCase);
9490
+ return ranges.length > 0 ? chunk(_text, ranges) : [{
9491
+ text: _text,
9492
+ match: false
9493
+ }];
9494
+ }
9495
+ return [{
9496
+ text: _text,
9497
+ match: false
9498
+ }];
9499
+ }
9500
+ //#endregion
9501
+ //#region src/composables/toReactive/index.ts
9502
+ /**
9503
+ * @module toReactive
9504
+ *
9505
+ * @see https://0.vuetifyjs.com/composables/transformers/to-reactive
9506
+ *
9507
+ * @remarks
9508
+ * Utility function to convert values and refs into reactive proxies with ref unwrapping.
9509
+ *
9510
+ * Key features:
9511
+ * - Automatic ref unwrapping
9512
+ * - Deep reactive proxying
9513
+ * - Map and Set support with ref unwrapping
9514
+ * - Nested object/array reactivity
9515
+ * - Type preservation
9516
+ *
9517
+ * Perfect for creating reactive versions of plain objects while automatically unwrapping refs.
9518
+ *
9519
+ * @example
9520
+ * ```ts
9521
+ * import { shallowRef } from 'vue'
8729
9522
  * import { toReactive } from '@vuetify/v0'
8730
9523
  *
8731
9524
  * const source = { name: shallowRef('Alice'), age: 30 }
@@ -9099,11 +9892,11 @@ const [createBreakpointsContext, createBreakpointsPlugin, useBreakpoints] = crea
9099
9892
  *
9100
9893
  * @example Using the built-in Temporal adapter
9101
9894
  * ```ts
9102
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
9895
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9103
9896
  * import { createDatePlugin } from '@vuetify/v0'
9104
9897
  *
9105
9898
  * const app = createApp(App)
9106
- * app.use(createDatePlugin({ adapter: new Vuetify0DateAdapter() }))
9899
+ * app.use(createDatePlugin({ adapter: new V0DateAdapter() }))
9107
9900
  *
9108
9901
  * // In a component:
9109
9902
  * const { adapter } = useDate()
@@ -9113,9 +9906,9 @@ const [createBreakpointsContext, createBreakpointsPlugin, useBreakpoints] = crea
9113
9906
  *
9114
9907
  * @example Custom adapter
9115
9908
  * ```ts
9116
- * import type { DateAdapter } from '@vuetify/v0'
9909
+ * import { DateAdapter } from '@vuetify/v0'
9117
9910
  *
9118
- * class DateFnsAdapter implements DateAdapter<Date> {
9911
+ * class DateFnsAdapter extends DateAdapter<Date> {
9119
9912
  * // ... implementation
9120
9913
  * }
9121
9914
  *
@@ -9146,6 +9939,7 @@ const defaultLocales = {
9146
9939
  function deriveFirstDayOfWeek(locale) {
9147
9940
  try {
9148
9941
  const info = new Intl.Locale(locale).getWeekInfo?.();
9942
+ /* v8 ignore next -- defensive: getWeekInfo always returns info in Node 22+ */
9149
9943
  return info ? info.firstDay % 7 : 0;
9150
9944
  } catch {
9151
9945
  return 0;
@@ -9163,14 +9957,14 @@ function deriveFirstDayOfWeek(locale) {
9163
9957
  *
9164
9958
  * @example
9165
9959
  * ```ts
9166
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
9960
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9167
9961
  *
9168
- * const { adapter } = createDate({ adapter: new Vuetify0DateAdapter() })
9962
+ * const { adapter } = createDate({ adapter: new V0DateAdapter() })
9169
9963
  * const today = adapter.date()
9170
9964
  *
9171
9965
  * // With locale options
9172
9966
  * const { adapter } = createDate({
9173
- * adapter: new Vuetify0DateAdapter(),
9967
+ * adapter: new V0DateAdapter(),
9174
9968
  * locale: 'de-DE',
9175
9969
  * })
9176
9970
  * ```
@@ -9225,10 +10019,10 @@ function createDate(options) {
9225
10019
  *
9226
10020
  * @example
9227
10021
  * ```ts
9228
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
10022
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9229
10023
  *
9230
10024
  * const [useAppDate, provideAppDate] = createDateContext({
9231
- * adapter: new Vuetify0DateAdapter(),
10025
+ * adapter: new V0DateAdapter(),
9232
10026
  * namespace: 'app:date',
9233
10027
  * })
9234
10028
  * ```
@@ -9249,14 +10043,14 @@ function createDateContext(options) {
9249
10043
  *
9250
10044
  * @example
9251
10045
  * ```ts
9252
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
10046
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9253
10047
  *
9254
10048
  * const app = createApp(App)
9255
- * app.use(createDatePlugin({ adapter: new Vuetify0DateAdapter() }))
10049
+ * app.use(createDatePlugin({ adapter: new V0DateAdapter() }))
9256
10050
  *
9257
10051
  * // With locale options
9258
10052
  * app.use(createDatePlugin({
9259
- * adapter: new Vuetify0DateAdapter(),
10053
+ * adapter: new V0DateAdapter(),
9260
10054
  * locale: 'de-DE',
9261
10055
  * }))
9262
10056
  * ```
@@ -9290,10 +10084,10 @@ function createDatePlugin(options) {
9290
10084
  * @example
9291
10085
  * ```ts
9292
10086
  * // main.ts
9293
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
10087
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9294
10088
  * import { createDatePlugin } from '@vuetify/v0'
9295
10089
  *
9296
- * app.use(createDatePlugin({ adapter: new Vuetify0DateAdapter() }))
10090
+ * app.use(createDatePlugin({ adapter: new V0DateAdapter() }))
9297
10091
  * ```
9298
10092
  *
9299
10093
  * @example
@@ -9307,7 +10101,7 @@ function createDatePlugin(options) {
9307
10101
  * ```
9308
10102
  */
9309
10103
  function useDate(namespace = "v0:date") {
9310
- if (!/* @__PURE__ */ instanceExists()) throw new Error("[v0] useDate() must be called inside a Vue component with createDatePlugin installed.\n\nExample:\n import { Vuetify0DateAdapter } from '@vuetify/v0/date'\n import { createDatePlugin } from '@vuetify/v0'\n\n app.use(createDatePlugin({ adapter: new Vuetify0DateAdapter() }))");
10104
+ if (!/* @__PURE__ */ instanceExists()) throw new Error("[v0] useDate() must be called inside a Vue component with createDatePlugin installed.\n\nExample:\n import { V0DateAdapter } from '@vuetify/v0/date'\n import { createDatePlugin } from '@vuetify/v0'\n\n app.use(createDatePlugin({ adapter: new V0DateAdapter() }))");
9311
10105
  return useContext(namespace);
9312
10106
  }
9313
10107
  //#endregion
@@ -9402,33 +10196,805 @@ function useDelay(callback, options = {}) {
9402
10196
  fire();
9403
10197
  return;
9404
10198
  }
9405
- timer.start();
9406
- });
10199
+ timer.start();
10200
+ });
10201
+ }
10202
+ function stop() {
10203
+ const resolve = resolver;
10204
+ resolver = void 0;
10205
+ timer.stop();
10206
+ resolve?.(isOpening.value);
10207
+ }
10208
+ onScopeDispose(() => {
10209
+ const resolve = resolver;
10210
+ resolver = void 0;
10211
+ resolve?.(isOpening.value);
10212
+ }, true);
10213
+ return {
10214
+ start,
10215
+ stop,
10216
+ pause: timer.pause,
10217
+ resume: timer.resume,
10218
+ isActive: shallowReadonly(timer.isActive),
10219
+ isPaused: shallowReadonly(timer.isPaused),
10220
+ remaining: shallowReadonly(timer.remaining),
10221
+ isOpening: shallowReadonly(isOpening)
10222
+ };
10223
+ }
10224
+ //#endregion
10225
+ //#region src/composables/useMutationObserver/index.ts
10226
+ /**
10227
+ * @module useMutationObserver
10228
+ *
10229
+ * @see https://0.vuetifyjs.com/composables/system/use-mutation-observer
10230
+ *
10231
+ * @remarks
10232
+ * MutationObserver composable with lifecycle management.
10233
+ *
10234
+ * Key features:
10235
+ * - MutationObserver API wrapper
10236
+ * - `isActive` reactive flag
10237
+ * - `once` option for single-fire observation
10238
+ * - Pause/resume/stop functionality
10239
+ * - Automatic cleanup on unmount
10240
+ * - SSR-safe (checks SUPPORTS_MUTATION_OBSERVER)
10241
+ * - Hydration-aware
10242
+ * - Configurable observation options (childList, attributes, characterData, etc.)
10243
+ *
10244
+ * Perfect for detecting DOM changes and responding to mutations.
10245
+ *
10246
+ * @example
10247
+ * ```ts
10248
+ * import { useTemplateRef } from 'vue'
10249
+ * import { useMutationObserver } from '@vuetify/v0'
10250
+ *
10251
+ * const target = useTemplateRef('target')
10252
+ * useMutationObserver(target, records => {
10253
+ * console.log(records)
10254
+ * }, { childList: true })
10255
+ * ```
10256
+ */
10257
+ /**
10258
+ * A composable that uses the Mutation Observer API to detect changes in the DOM.
10259
+ *
10260
+ * @param target The element to observe.
10261
+ * @param callback The callback to execute when a mutation is observed.
10262
+ * @param options The options for the Mutation Observer.
10263
+ * @returns An object with methods to control the observer.
10264
+ *
10265
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
10266
+ * @see https://0.vuetifyjs.com/composables/system/use-mutation-observer
10267
+ *
10268
+ * @example
10269
+ * ```ts
10270
+ * import { ref } from 'vue'
10271
+ * import { useMutationObserver } from '@vuetify/v0'
10272
+ *
10273
+ * const container = ref<HTMLElement>()
10274
+ *
10275
+ * const { pause, resume, isPaused } = useMutationObserver(
10276
+ * container,
10277
+ * (mutations) => {
10278
+ * mutations.forEach((mutation) => {
10279
+ * if (mutation.type === 'childList') {
10280
+ * console.log('Children changed:', mutation.addedNodes, mutation.removedNodes)
10281
+ * } else if (mutation.type === 'attributes') {
10282
+ * console.log('Attribute changed:', mutation.attributeName)
10283
+ * }
10284
+ * })
10285
+ * },
10286
+ * {
10287
+ * childList: true,
10288
+ * attributes: true,
10289
+ * subtree: true
10290
+ * }
10291
+ * )
10292
+ *
10293
+ * // Pause observation
10294
+ * pause()
10295
+ *
10296
+ * // Resume observation
10297
+ * resume()
10298
+ * ```
10299
+ */
10300
+ function useMutationObserver(target, callback, options = {}) {
10301
+ const observerOptions = {
10302
+ childList: options.childList ?? true,
10303
+ attributes: options.attributes ?? false,
10304
+ characterData: options.characterData ?? false,
10305
+ subtree: options.subtree ?? false,
10306
+ attributeOldValue: options.attributeOldValue ?? false,
10307
+ characterDataOldValue: options.characterDataOldValue ?? false,
10308
+ attributeFilter: options.attributeFilter
10309
+ };
10310
+ return createObserver(target, callback, {
10311
+ supports: SUPPORTS_MUTATION_OBSERVER,
10312
+ once: options.once,
10313
+ create: (cb) => new MutationObserver((mutations) => {
10314
+ cb(mutations.map((m) => ({
10315
+ type: m.type,
10316
+ target: m.target,
10317
+ addedNodes: m.addedNodes,
10318
+ removedNodes: m.removedNodes,
10319
+ previousSibling: m.previousSibling,
10320
+ nextSibling: m.nextSibling,
10321
+ attributeName: m.attributeName,
10322
+ attributeNamespace: m.attributeNamespace,
10323
+ oldValue: m.oldValue
10324
+ })));
10325
+ }),
10326
+ observe: (obs, el) => obs.observe(el, observerOptions),
10327
+ immediate: options.immediate ? (el) => {
10328
+ const emptyNodeList = {
10329
+ length: 0,
10330
+ item: () => null,
10331
+ forEach: () => {},
10332
+ *[Symbol.iterator]() {}
10333
+ };
10334
+ return [{
10335
+ type: "childList",
10336
+ target: el,
10337
+ addedNodes: emptyNodeList,
10338
+ removedNodes: emptyNodeList,
10339
+ previousSibling: null,
10340
+ nextSibling: null,
10341
+ attributeName: null,
10342
+ attributeNamespace: null,
10343
+ oldValue: null
10344
+ }];
10345
+ } : void 0,
10346
+ onceIncludesImmediate: true
10347
+ });
10348
+ }
10349
+ //#endregion
10350
+ //#region src/composables/useDragDrop/adapters/adapter.ts
10351
+ /**
10352
+ * @module useDragDrop/adapters/adapter
10353
+ *
10354
+ * @remarks
10355
+ * Adapter contract and abstract base for useDragDrop. Concrete adapters extend
10356
+ * `DragDropAdapter<Z>` to share the `cleanup` field, `dispose()` lifecycle, and
10357
+ * the `locate()` DOM-walk helper.
10358
+ */
10359
+ /**
10360
+ * Abstract base class for useDragDrop adapters. Provides a `cleanup` slot, a
10361
+ * `dispose()` lifecycle, and a `locate()` helper that walks the DOM to find the
10362
+ * draggable ticket whose `el` ancestors a given event target.
10363
+ *
10364
+ * @example
10365
+ * ```ts
10366
+ * import { DragDropAdapter, type DragDropAdapterContext } from '@vuetify/v0'
10367
+ *
10368
+ * class MyAdapter extends DragDropAdapter {
10369
+ * setup (context: DragDropAdapterContext) {
10370
+ * const stop = useEventListener(document, 'mousedown', event => {
10371
+ * const ticket = this.locate(event.target, context)
10372
+ * if (ticket) context.emit.start(ticket, { x: event.clientX, y: event.clientY }, 'pointer')
10373
+ * })
10374
+ * this.cleanup = () => stop()
10375
+ * }
10376
+ * }
10377
+ * ```
10378
+ */
10379
+ var DragDropAdapter = class {
10380
+ cleanup = null;
10381
+ dispose() {
10382
+ this.cleanup?.();
10383
+ this.cleanup = null;
10384
+ }
10385
+ locate(target, context) {
10386
+ let element = /* @__PURE__ */ isElement(target) ? target : null;
10387
+ while (element) {
10388
+ for (const ticket of context.draggables.values()) if (ticket.el.value === element) return ticket;
10389
+ element = element.parentElement;
10390
+ }
10391
+ return null;
10392
+ }
10393
+ };
10394
+ //#endregion
10395
+ //#region src/composables/useDragDrop/adapters/pointer.ts
10396
+ /**
10397
+ * @module useDragDrop/adapters/pointer
10398
+ *
10399
+ * @remarks
10400
+ * Default pointer adapter for useDragDrop. Listens for `pointerdown` /
10401
+ * `pointermove` / `pointerup` / `pointercancel` on the document and emits the
10402
+ * drag lifecycle. Activation distance is configurable via `threshold`.
10403
+ */
10404
+ /**
10405
+ * Default pointer adapter. Wires `pointerdown` / `pointermove` / `pointerup` /
10406
+ * `pointercancel` on the document and converts them into drag lifecycle calls.
10407
+ *
10408
+ * @example
10409
+ * ```ts
10410
+ * import { PointerAdapter, useDragDrop } from '@vuetify/v0'
10411
+ *
10412
+ * useDragDrop({ adapters: [new PointerAdapter({ threshold: 10 })] })
10413
+ * ```
10414
+ */
10415
+ var PointerAdapter = class extends DragDropAdapter {
10416
+ threshold;
10417
+ constructor(options = {}) {
10418
+ super();
10419
+ this.threshold = options.threshold ?? 0;
10420
+ }
10421
+ setup(context) {
10422
+ const logger = useLogger();
10423
+ if (this.cleanup) {
10424
+ logger.warn("PointerAdapter setup called twice; previous registration will be replaced");
10425
+ this.dispose();
10426
+ }
10427
+ if (!IN_BROWSER) return;
10428
+ let downSource = null;
10429
+ let downOrigin = null;
10430
+ let downId = null;
10431
+ let started = false;
10432
+ function reset() {
10433
+ downSource = null;
10434
+ downOrigin = null;
10435
+ downId = null;
10436
+ started = false;
10437
+ }
10438
+ const onDown = (event) => {
10439
+ if (event.button !== 0) return;
10440
+ if (downSource) return;
10441
+ const ticket = this.locate(event.target, context);
10442
+ if (!ticket) return;
10443
+ downSource = ticket;
10444
+ downOrigin = {
10445
+ x: event.clientX,
10446
+ y: event.clientY
10447
+ };
10448
+ downId = event.pointerId;
10449
+ started = false;
10450
+ };
10451
+ const onMove = (event) => {
10452
+ if (!downSource || !downOrigin || event.pointerId !== downId) return;
10453
+ const point = {
10454
+ x: event.clientX,
10455
+ y: event.clientY
10456
+ };
10457
+ if (!started) {
10458
+ const dx = point.x - downOrigin.x;
10459
+ const dy = point.y - downOrigin.y;
10460
+ if (this.threshold > 0 && Math.hypot(dx, dy) < this.threshold) return;
10461
+ context.emit.start(downSource, downOrigin, "pointer");
10462
+ started = true;
10463
+ }
10464
+ context.emit.move(point);
10465
+ };
10466
+ function onUp(event) {
10467
+ if (event.pointerId !== downId) return;
10468
+ if (downSource && started) context.emit.drop();
10469
+ reset();
10470
+ }
10471
+ function onCancel(event) {
10472
+ if (event.pointerId !== downId) return;
10473
+ if (downSource && started) context.emit.cancel();
10474
+ reset();
10475
+ }
10476
+ const stopDown = useEventListener(document, "pointerdown", onDown);
10477
+ const stopMove = useEventListener(document, "pointermove", onMove);
10478
+ const stopUp = useEventListener(document, "pointerup", onUp);
10479
+ const stopCancel = useEventListener(document, "pointercancel", onCancel);
10480
+ this.cleanup = () => {
10481
+ stopDown();
10482
+ stopMove();
10483
+ stopUp();
10484
+ stopCancel();
10485
+ };
10486
+ }
10487
+ };
10488
+ //#endregion
10489
+ //#region src/composables/useDragDrop/adapters/keyboard.ts
10490
+ /**
10491
+ * @module useDragDrop/adapters/keyboard
10492
+ *
10493
+ * @remarks
10494
+ * Default keyboard adapter for useDragDrop. Listens for `keydown` on the
10495
+ * document. Activation keys (default Space and Enter) start and drop drags;
10496
+ * arrow keys nudge the drag point by `step` px; Escape cancels.
10497
+ */
10498
+ function isEditable(element) {
10499
+ if (/* @__PURE__ */ isNull(element)) return false;
10500
+ const tag = element.tagName;
10501
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return true;
10502
+ if (element.isContentEditable) return true;
10503
+ const role = element.getAttribute("role");
10504
+ return role === "textbox" || role === "searchbox" || role === "combobox" || role === "spinbutton";
10505
+ }
10506
+ /**
10507
+ * Default keyboard adapter. Listens for `keydown` on the document; activation
10508
+ * keys start/drop drags, arrow keys nudge the drag point, Escape cancels.
10509
+ *
10510
+ * @example
10511
+ * ```ts
10512
+ * import { KeyboardAdapter, useDragDrop } from '@vuetify/v0'
10513
+ *
10514
+ * useDragDrop({ adapters: [new KeyboardAdapter({ activate: ['x'], step: 32 })] })
10515
+ * ```
10516
+ */
10517
+ var KeyboardAdapter = class extends DragDropAdapter {
10518
+ activate;
10519
+ step;
10520
+ constructor(options = {}) {
10521
+ super();
10522
+ this.activate = options.activate ?? [" ", "Enter"];
10523
+ this.step = options.step ?? 16;
10524
+ }
10525
+ setup(context) {
10526
+ const logger = useLogger();
10527
+ if (this.cleanup) {
10528
+ logger.warn("KeyboardAdapter setup called twice; previous registration will be replaced");
10529
+ this.dispose();
10530
+ }
10531
+ if (!IN_BROWSER) return;
10532
+ const onKeyDown = (event) => {
10533
+ const focused = document.activeElement;
10534
+ if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return;
10535
+ if (isEditable(focused)) return;
10536
+ const ticket = this.locate(focused, context);
10537
+ const isActive = !/* @__PURE__ */ isNull(context.active.value);
10538
+ if (this.activate.includes(event.key)) {
10539
+ if (isActive) {
10540
+ event.preventDefault();
10541
+ context.emit.drop();
10542
+ } else if (ticket) {
10543
+ const el = ticket.el.value;
10544
+ if (!el) {
10545
+ logger.warn("KeyboardAdapter: cannot start drag — element is not mounted");
10546
+ return;
10547
+ }
10548
+ event.preventDefault();
10549
+ const rect = el.getBoundingClientRect();
10550
+ context.emit.start(ticket, {
10551
+ x: rect.left + rect.width / 2,
10552
+ y: rect.top + rect.height / 2
10553
+ }, "keyboard");
10554
+ }
10555
+ return;
10556
+ }
10557
+ if (event.key === "Escape" && isActive) {
10558
+ event.preventDefault();
10559
+ context.emit.cancel();
10560
+ return;
10561
+ }
10562
+ if (isActive && event.key.startsWith("Arrow")) {
10563
+ const active = context.active.value;
10564
+ if (/* @__PURE__ */ isNull(active)) return;
10565
+ const current = active.current;
10566
+ let point = null;
10567
+ switch (event.key) {
10568
+ case "ArrowUp":
10569
+ point = {
10570
+ x: current.x,
10571
+ y: current.y - this.step
10572
+ };
10573
+ break;
10574
+ case "ArrowDown":
10575
+ point = {
10576
+ x: current.x,
10577
+ y: current.y + this.step
10578
+ };
10579
+ break;
10580
+ case "ArrowLeft":
10581
+ point = {
10582
+ x: current.x - this.step,
10583
+ y: current.y
10584
+ };
10585
+ break;
10586
+ case "ArrowRight":
10587
+ point = {
10588
+ x: current.x + this.step,
10589
+ y: current.y
10590
+ };
10591
+ break;
10592
+ }
10593
+ if (point) {
10594
+ event.preventDefault();
10595
+ context.emit.move(point);
10596
+ }
10597
+ }
10598
+ };
10599
+ const stop = useEventListener(document, "keydown", onKeyDown);
10600
+ this.cleanup = () => stop();
10601
+ }
10602
+ };
10603
+ //#endregion
10604
+ //#region src/composables/useDragDrop/index.ts
10605
+ /**
10606
+ * @module useDragDrop
10607
+ *
10608
+ * @see https://0.vuetifyjs.com/composables/system/use-drag-drop
10609
+ *
10610
+ * @remarks
10611
+ * Headless drag-and-drop primitive. Owns two registries (draggables and zones)
10612
+ * plus the active-drag state. Pointer and keyboard adapters ship by default;
10613
+ * lifecycle hooks and a plugin array provide extension points.
10614
+ *
10615
+ * @example
10616
+ * ```ts
10617
+ * import { useDragDrop } from '@vuetify/v0'
10618
+ *
10619
+ * const dnd = useDragDrop()
10620
+ * ```
10621
+ */
10622
+ /**
10623
+ * Pure math for resolving where in an oriented zone a pointer would drop.
10624
+ * Internal — consumers rely on the `position.index` / `position.indicator`
10625
+ * fields delivered to `onDrop`.
10626
+ */
10627
+ function resolveDropPosition(point, rects, orientation) {
10628
+ if (rects.length === 0) return null;
10629
+ const axis = orientation === "vertical" ? "y" : "x";
10630
+ const start = orientation === "vertical" ? "top" : "left";
10631
+ const end = orientation === "vertical" ? "bottom" : "right";
10632
+ const coord = point[axis];
10633
+ if (coord < rects[0][start]) return {
10634
+ index: 0,
10635
+ edge: "before",
10636
+ rect: rects[0]
10637
+ };
10638
+ const last = rects.at(-1);
10639
+ if (coord > last[end]) return {
10640
+ index: rects.length,
10641
+ edge: "after",
10642
+ rect: last
10643
+ };
10644
+ for (const [index, rect] of rects.entries()) if (coord >= rect[start] && coord <= rect[end]) {
10645
+ if (coord < rect[start] + (rect[end] - rect[start]) / 2) return {
10646
+ index,
10647
+ edge: "before",
10648
+ rect
10649
+ };
10650
+ return {
10651
+ index: index + 1,
10652
+ edge: "after",
10653
+ rect
10654
+ };
10655
+ }
10656
+ for (let index = 0; index < rects.length - 1; index++) {
10657
+ const a = rects[index];
10658
+ const b = rects[index + 1];
10659
+ if (coord > a[end] && coord < b[start]) {
10660
+ if (coord <= (a[end] + b[start]) / 2) return {
10661
+ index: index + 1,
10662
+ edge: "after",
10663
+ rect: a
10664
+ };
10665
+ return {
10666
+ index: index + 1,
10667
+ edge: "before",
10668
+ rect: b
10669
+ };
10670
+ }
10671
+ }
10672
+ return {
10673
+ index: rects.length,
10674
+ edge: "after",
10675
+ rect: last
10676
+ };
10677
+ }
10678
+ /**
10679
+ * Create a headless drag-and-drop context.
10680
+ *
10681
+ * @param options - Adapters, plugins, and lifecycle hooks. All optional.
10682
+ * @returns A `DragDropContext<Z>` exposing `draggables` / `zones` registries,
10683
+ * the `active` drag, the `isDragging` boolean, and a programmatic `cancel()`.
10684
+ *
10685
+ * @see https://0.vuetifyjs.com/composables/system/use-drag-drop
10686
+ *
10687
+ * @example
10688
+ * ```ts
10689
+ * import { useDragDrop } from '@vuetify/v0'
10690
+ * import { useTemplateRef } from 'vue'
10691
+ *
10692
+ * const dnd = useDragDrop<{ type: 'card', value: string }>()
10693
+ *
10694
+ * const draggable = useTemplateRef<HTMLElement>('draggable')
10695
+ * const dropzone = useTemplateRef<HTMLElement>('dropzone')
10696
+ *
10697
+ * dnd.draggables.register({ el: draggable, type: 'card', value: 'card-1' })
10698
+ * dnd.zones.register({
10699
+ * el: dropzone,
10700
+ * accept: ['card'],
10701
+ * onDrop: (drag, position) => console.log(drag.value, position.index),
10702
+ * })
10703
+ * ```
10704
+ */
10705
+ function useDragDrop(options = {}) {
10706
+ const { plugins = [] } = options;
10707
+ const logger = useLogger();
10708
+ const _draggables = createRegistry({ events: true });
10709
+ const _zones = createRegistry({ events: true });
10710
+ const active = shallowRef(null);
10711
+ const isDragging = toRef(() => !/* @__PURE__ */ isNull(active.value));
10712
+ const scopes = /* @__PURE__ */ new Map();
10713
+ const nodes = /* @__PURE__ */ new Map();
10714
+ function next(fn, ...args) {
10715
+ if (/* @__PURE__ */ isUndefined(fn)) return;
10716
+ try {
10717
+ fn(...args);
10718
+ } catch (error) {
10719
+ logger.error("useDragDrop hook threw", error);
10720
+ }
10721
+ }
10722
+ function safeAccept(accept, drag) {
10723
+ try {
10724
+ if (/* @__PURE__ */ isNull(drag)) return false;
10725
+ if (/* @__PURE__ */ isUndefined(accept)) return true;
10726
+ if (/* @__PURE__ */ isArray(accept)) return accept.includes(drag.type);
10727
+ const result = accept(drag);
10728
+ if (/* @__PURE__ */ isThenable(result)) {
10729
+ logger.warn("useDragDrop accept predicate returned a thenable; async predicates are not supported — treating as reject");
10730
+ return false;
10731
+ }
10732
+ return Boolean(result);
10733
+ } catch (error) {
10734
+ logger.error("useDragDrop accept predicate threw; treating as reject", error);
10735
+ return false;
10736
+ }
10737
+ }
10738
+ const draggables = {
10739
+ ..._draggables,
10740
+ register(registration) {
10741
+ const id = registration.id ?? /* @__PURE__ */ useId();
10742
+ const el = toRef(() => toValue(registration.el));
10743
+ const dragging = toRef(() => active.value?.id === id);
10744
+ const input = {
10745
+ ...registration,
10746
+ id,
10747
+ el,
10748
+ isDragging: dragging
10749
+ };
10750
+ return _draggables.register(input);
10751
+ }
10752
+ };
10753
+ const zones = {
10754
+ ..._zones,
10755
+ register(registration) {
10756
+ const id = registration.id ?? /* @__PURE__ */ useId();
10757
+ const el = toRef(() => toValue(registration.el));
10758
+ const isOver = toRef(() => active.value?.over === id);
10759
+ const willAccept = toRef(() => safeAccept(registration.accept, active.value));
10760
+ const rects = shallowRef([]);
10761
+ function refresh() {
10762
+ const zoneEl = el.value;
10763
+ rects.value = zoneEl ? Array.from(zoneEl.children).map((child) => child.getBoundingClientRect()) : [];
10764
+ }
10765
+ const scope = effectScope();
10766
+ scopes.set(id, scope);
10767
+ scope.run(() => {
10768
+ if (registration.orientation) {
10769
+ watch(el, refresh, {
10770
+ immediate: true,
10771
+ flush: "post"
10772
+ });
10773
+ useResizeObserver(el, refresh);
10774
+ useMutationObserver(el, refresh, { childList: true });
10775
+ watch(() => active.value?.id, (id) => {
10776
+ if (id) refresh();
10777
+ });
10778
+ }
10779
+ watch(el, (current) => {
10780
+ if (/* @__PURE__ */ isNull(current)) return;
10781
+ nodes.set(current, id);
10782
+ onWatcherCleanup(() => nodes.delete(current));
10783
+ }, { immediate: true });
10784
+ });
10785
+ const indicator = computed(() => {
10786
+ if (!registration.orientation || !isOver.value || !active.value) return null;
10787
+ return resolveDropPosition(active.value.current, rects.value, registration.orientation);
10788
+ });
10789
+ const input = {
10790
+ ...registration,
10791
+ id,
10792
+ el,
10793
+ isOver,
10794
+ willAccept,
10795
+ indicator
10796
+ };
10797
+ return _zones.register(input);
10798
+ }
10799
+ };
10800
+ function at(point) {
10801
+ if (!IN_BROWSER) return null;
10802
+ let element = document.elementFromPoint(point.x, point.y);
10803
+ while (element) {
10804
+ const id = nodes.get(element);
10805
+ if (!/* @__PURE__ */ isUndefined(id)) {
10806
+ const zone = _zones.get(id);
10807
+ if (zone && !toValue(zone.disabled)) return id;
10808
+ }
10809
+ element = element.parentElement;
10810
+ }
10811
+ return null;
10812
+ }
10813
+ function position(zoneId, drag) {
10814
+ const zone = _zones.get(zoneId);
10815
+ const out = { pointer: drag.current };
10816
+ if (zone?.orientation) {
10817
+ const resolved = zone.indicator?.value ?? null;
10818
+ if (resolved) {
10819
+ out.index = resolved.index;
10820
+ out.indicator = resolved;
10821
+ } else out.index = 0;
10822
+ }
10823
+ return out;
10824
+ }
10825
+ function bail(drag, reason = "cancel") {
10826
+ active.value = null;
10827
+ if (!/* @__PURE__ */ isNull(drag.over)) next(_zones.get(drag.over)?.onLeave, drag);
10828
+ next(_draggables.get(drag.id)?.onCancel, drag, reason);
10829
+ next(options.onCancel, drag, reason);
10830
+ }
10831
+ function onStart(source, origin, via) {
10832
+ if (toValue(_draggables.get(source.id)?.disabled)) return;
10833
+ const draft = {
10834
+ id: source.id,
10835
+ type: source.type,
10836
+ value: source.value,
10837
+ origin,
10838
+ current: origin,
10839
+ delta: {
10840
+ x: 0,
10841
+ y: 0
10842
+ },
10843
+ over: null,
10844
+ willAccept: false,
10845
+ via
10846
+ };
10847
+ try {
10848
+ if (_draggables.get(source.id)?.onBeforeStart?.(draft) === false) return;
10849
+ } catch (error) {
10850
+ logger.error("useDragDrop onBeforeStart threw; treating as veto", error);
10851
+ return;
10852
+ }
10853
+ try {
10854
+ if (options.onBeforeStart?.(draft) === false) return;
10855
+ } catch (error) {
10856
+ logger.error("useDragDrop onBeforeStart threw; treating as veto", error);
10857
+ return;
10858
+ }
10859
+ active.value = draft;
10860
+ }
10861
+ function onMove(point) {
10862
+ if (!active.value) return;
10863
+ const over = at(point);
10864
+ const draft = {
10865
+ ...active.value,
10866
+ current: point,
10867
+ delta: {
10868
+ x: point.x - active.value.origin.x,
10869
+ y: point.y - active.value.origin.y
10870
+ },
10871
+ over,
10872
+ willAccept: false
10873
+ };
10874
+ draft.willAccept = !/* @__PURE__ */ isNull(over) && safeAccept(_zones.get(over)?.accept, draft);
10875
+ const previous = active.value.over;
10876
+ active.value = draft;
10877
+ if (previous !== over) {
10878
+ if (!/* @__PURE__ */ isNull(previous)) next(_zones.get(previous)?.onLeave, draft);
10879
+ if (!/* @__PURE__ */ isNull(over)) next(_zones.get(over)?.onEnter, draft);
10880
+ }
10881
+ next(_draggables.get(draft.id)?.onMove, draft);
10882
+ next(options.onMove, draft);
10883
+ }
10884
+ function onDrop() {
10885
+ if (!active.value) return;
10886
+ const drag = active.value;
10887
+ const zoneId = drag.over;
10888
+ if (/* @__PURE__ */ isNull(zoneId)) {
10889
+ bail(drag);
10890
+ return;
10891
+ }
10892
+ const dropAt = position(zoneId, drag);
10893
+ const zone = _zones.get(zoneId);
10894
+ function vetoed(fn, label) {
10895
+ if (!fn) return false;
10896
+ try {
10897
+ return fn(drag, dropAt) === false;
10898
+ } catch (error) {
10899
+ logger.error(`useDragDrop ${label} threw; treating as veto`, error);
10900
+ return true;
10901
+ }
10902
+ }
10903
+ if (vetoed(zone?.onBeforeDrop, "zone onBeforeDrop") || vetoed(options.onBeforeDrop, "options onBeforeDrop")) {
10904
+ bail(drag, "reject");
10905
+ return;
10906
+ }
10907
+ active.value = null;
10908
+ next(zone?.onDrop, drag, dropAt);
10909
+ next(options.onDrop, drag, dropAt);
9407
10910
  }
9408
- function stop() {
9409
- const resolve = resolver;
9410
- resolver = void 0;
9411
- timer.stop();
9412
- resolve?.(isOpening.value);
10911
+ function cancel() {
10912
+ if (!active.value) return;
10913
+ bail(active.value);
10914
+ }
10915
+ const context = {
10916
+ draggables,
10917
+ zones,
10918
+ active: shallowReadonly(active),
10919
+ isDragging,
10920
+ cancel
10921
+ };
10922
+ const disposers = [];
10923
+ const adapters = options.adapters ?? [new PointerAdapter(), new KeyboardAdapter()];
10924
+ const emit = {
10925
+ start: (source, origin, via) => onStart(source, origin, via),
10926
+ move: (point) => onMove(point),
10927
+ drop: () => onDrop(),
10928
+ cancel: () => cancel()
10929
+ };
10930
+ const adapterContext = {
10931
+ ...context,
10932
+ emit
10933
+ };
10934
+ for (const adapter of adapters) try {
10935
+ adapter.setup(adapterContext);
10936
+ disposers.push(() => adapter.dispose());
10937
+ } catch (error) {
10938
+ logger.error("useDragDrop adapter setup threw; skipping adapter", error);
10939
+ try {
10940
+ adapter.dispose();
10941
+ } catch (disposeError) {
10942
+ logger.error("useDragDrop adapter dispose threw after setup failure", disposeError);
10943
+ }
9413
10944
  }
10945
+ for (const plugin of plugins) try {
10946
+ const dispose = plugin(context);
10947
+ if (/* @__PURE__ */ isFunction(dispose)) disposers.push(dispose);
10948
+ } catch (error) {
10949
+ logger.error("useDragDrop plugin install threw; skipping plugin", error);
10950
+ }
10951
+ _draggables.on("unregister:ticket", (ticket) => {
10952
+ if (active.value?.id === ticket.id) cancel();
10953
+ });
10954
+ _zones.on("unregister:ticket", (ticket) => {
10955
+ const scope = scopes.get(ticket.id);
10956
+ if (scope) {
10957
+ scope.stop();
10958
+ scopes.delete(ticket.id);
10959
+ }
10960
+ if (active.value?.over === ticket.id) {
10961
+ next(ticket.onLeave, active.value);
10962
+ active.value = {
10963
+ ...active.value,
10964
+ over: null,
10965
+ willAccept: false
10966
+ };
10967
+ }
10968
+ });
9414
10969
  onScopeDispose(() => {
9415
- const resolve = resolver;
9416
- resolver = void 0;
9417
- resolve?.(isOpening.value);
10970
+ if (!/* @__PURE__ */ isNull(active.value)) cancel();
10971
+ for (const dispose of disposers.toReversed()) try {
10972
+ dispose();
10973
+ } catch (error) {
10974
+ logger.error("useDragDrop disposer threw", error);
10975
+ }
10976
+ for (const scope of scopes.values()) try {
10977
+ scope.stop();
10978
+ } catch (error) {
10979
+ logger.error("useDragDrop zone scope dispose threw", error);
10980
+ }
10981
+ scopes.clear();
10982
+ nodes.clear();
10983
+ try {
10984
+ _draggables.dispose();
10985
+ } catch (error) {
10986
+ logger.error("useDragDrop draggables dispose threw", error);
10987
+ }
10988
+ try {
10989
+ _zones.dispose();
10990
+ } catch (error) {
10991
+ logger.error("useDragDrop zones dispose threw", error);
10992
+ }
9418
10993
  }, true);
9419
- return {
9420
- start,
9421
- stop,
9422
- pause: timer.pause,
9423
- resume: timer.resume,
9424
- isActive: shallowReadonly(timer.isActive),
9425
- isPaused: shallowReadonly(timer.isPaused),
9426
- remaining: shallowReadonly(timer.remaining),
9427
- isOpening: shallowReadonly(isOpening)
9428
- };
10994
+ return context;
9429
10995
  }
9430
10996
  //#endregion
9431
- //#region src/composables/useFeatures/adapters/generic/index.ts
10997
+ //#region src/composables/useFeatures/adapters/adapter.ts
9432
10998
  var FeaturesAdapter = class {};
9433
10999
  //#endregion
9434
11000
  //#region src/composables/useFeatures/index.ts
@@ -9811,9 +11377,11 @@ function useHotkey(keys, callback, options = {}, _platform) {
9811
11377
  let isSequence = false;
9812
11378
  let groupIndex = 0;
9813
11379
  function isInputFocused() {
11380
+ /* v8 ignore next -- IN_BROWSER always true in happy-dom test env */
9814
11381
  if (!IN_BROWSER) return false;
9815
11382
  if (toValue(inputs)) return false;
9816
11383
  const activeElement = document.activeElement;
11384
+ /* v8 ignore next -- defensive: document.activeElement is always set in happy-dom */
9817
11385
  if (!activeElement) return false;
9818
11386
  const role = activeElement.getAttribute("role");
9819
11387
  if (role === "textbox" || role === "searchbox" || role === "combobox" || role === "spinbutton") return true;
@@ -9867,6 +11435,7 @@ function useHotkey(keys, callback, options = {}, _platform) {
9867
11435
  const currentKeys = toValue(keys);
9868
11436
  if (!currentKeys) return;
9869
11437
  const groups = splitKeySequence(currentKeys.toLowerCase());
11438
+ /* v8 ignore next -- defensive: splitKeySequence rejects empty strings earlier */
9870
11439
  if (groups.length === 0) return;
9871
11440
  isSequence = groups.length > 1;
9872
11441
  keyGroups = groups;
@@ -9919,6 +11488,7 @@ function isModifier(key) {
9919
11488
  function parseKeyGroup(group) {
9920
11489
  const { keys: parts } = splitKeyCombination(group.toLowerCase());
9921
11490
  const modifiers = Object.fromEntries(MODIFIERS.map((m) => [m, false]));
11491
+ /* v8 ignore next 3 -- defensive: parseKeyGroup is not invoked with empty parts */
9922
11492
  if (parts.length === 0) return {
9923
11493
  modifiers,
9924
11494
  actualKey: void 0
@@ -10144,11 +11714,13 @@ function useIntersectionObserver(target, callback, options = {}) {
10144
11714
  observe: (obs, el) => obs.observe(el),
10145
11715
  onEntry: (entries) => {
10146
11716
  const latest = entries.at(-1);
11717
+ /* v8 ignore next -- defensive: IntersectionObserver always emits at least one entry */
10147
11718
  if (latest) isIntersecting.value = latest.isIntersecting;
10148
11719
  },
10149
11720
  onPause: () => {
10150
11721
  isIntersecting.value = false;
10151
11722
  },
11723
+ /* v8 ignore next -- defensive nullish coalesce: entries always populated when shouldStop fires */
10152
11724
  shouldStop: (entries) => entries.at(-1)?.isIntersecting ?? false,
10153
11725
  immediate: options.immediate ? (el) => {
10154
11726
  return [{
@@ -10198,6 +11770,7 @@ function useElementIntersection(target, options = {}) {
10198
11770
  const intersectionRatio = shallowRef(0);
10199
11771
  const { pause: _pause, resume, stop, isActive, isPaused } = useIntersectionObserver(target, (entries) => {
10200
11772
  const entry = entries.at(-1);
11773
+ /* v8 ignore next 4 -- defensive: IntersectionObserver always emits at least one entry */
10201
11774
  if (entry) {
10202
11775
  isIntersecting.value = entry.isIntersecting;
10203
11776
  intersectionRatio.value = entry.intersectionRatio;
@@ -10447,131 +12020,6 @@ function usePrefersContrast() {
10447
12020
  return useMediaQuery("(prefers-contrast: more)");
10448
12021
  }
10449
12022
  //#endregion
10450
- //#region src/composables/useMutationObserver/index.ts
10451
- /**
10452
- * @module useMutationObserver
10453
- *
10454
- * @see https://0.vuetifyjs.com/composables/system/use-mutation-observer
10455
- *
10456
- * @remarks
10457
- * MutationObserver composable with lifecycle management.
10458
- *
10459
- * Key features:
10460
- * - MutationObserver API wrapper
10461
- * - `isActive` reactive flag
10462
- * - `once` option for single-fire observation
10463
- * - Pause/resume/stop functionality
10464
- * - Automatic cleanup on unmount
10465
- * - SSR-safe (checks SUPPORTS_MUTATION_OBSERVER)
10466
- * - Hydration-aware
10467
- * - Configurable observation options (childList, attributes, characterData, etc.)
10468
- *
10469
- * Perfect for detecting DOM changes and responding to mutations.
10470
- *
10471
- * @example
10472
- * ```ts
10473
- * import { useTemplateRef } from 'vue'
10474
- * import { useMutationObserver } from '@vuetify/v0'
10475
- *
10476
- * const target = useTemplateRef('target')
10477
- * useMutationObserver(target, records => {
10478
- * console.log(records)
10479
- * }, { childList: true })
10480
- * ```
10481
- */
10482
- /**
10483
- * A composable that uses the Mutation Observer API to detect changes in the DOM.
10484
- *
10485
- * @param target The element to observe.
10486
- * @param callback The callback to execute when a mutation is observed.
10487
- * @param options The options for the Mutation Observer.
10488
- * @returns An object with methods to control the observer.
10489
- *
10490
- * @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
10491
- * @see https://0.vuetifyjs.com/composables/system/use-mutation-observer
10492
- *
10493
- * @example
10494
- * ```ts
10495
- * import { ref } from 'vue'
10496
- * import { useMutationObserver } from '@vuetify/v0'
10497
- *
10498
- * const container = ref<HTMLElement>()
10499
- *
10500
- * const { pause, resume, isPaused } = useMutationObserver(
10501
- * container,
10502
- * (mutations) => {
10503
- * mutations.forEach((mutation) => {
10504
- * if (mutation.type === 'childList') {
10505
- * console.log('Children changed:', mutation.addedNodes, mutation.removedNodes)
10506
- * } else if (mutation.type === 'attributes') {
10507
- * console.log('Attribute changed:', mutation.attributeName)
10508
- * }
10509
- * })
10510
- * },
10511
- * {
10512
- * childList: true,
10513
- * attributes: true,
10514
- * subtree: true
10515
- * }
10516
- * )
10517
- *
10518
- * // Pause observation
10519
- * pause()
10520
- *
10521
- * // Resume observation
10522
- * resume()
10523
- * ```
10524
- */
10525
- function useMutationObserver(target, callback, options = {}) {
10526
- const observerOptions = {
10527
- childList: options.childList ?? true,
10528
- attributes: options.attributes ?? false,
10529
- characterData: options.characterData ?? false,
10530
- subtree: options.subtree ?? false,
10531
- attributeOldValue: options.attributeOldValue ?? false,
10532
- characterDataOldValue: options.characterDataOldValue ?? false,
10533
- attributeFilter: options.attributeFilter
10534
- };
10535
- return createObserver(target, callback, {
10536
- supports: SUPPORTS_MUTATION_OBSERVER,
10537
- once: options.once,
10538
- create: (cb) => new MutationObserver((mutations) => {
10539
- cb(mutations.map((m) => ({
10540
- type: m.type,
10541
- target: m.target,
10542
- addedNodes: m.addedNodes,
10543
- removedNodes: m.removedNodes,
10544
- previousSibling: m.previousSibling,
10545
- nextSibling: m.nextSibling,
10546
- attributeName: m.attributeName,
10547
- attributeNamespace: m.attributeNamespace,
10548
- oldValue: m.oldValue
10549
- })));
10550
- }),
10551
- observe: (obs, el) => obs.observe(el, observerOptions),
10552
- immediate: options.immediate ? (el) => {
10553
- const emptyNodeList = {
10554
- length: 0,
10555
- item: () => null,
10556
- forEach: () => {},
10557
- *[Symbol.iterator]() {}
10558
- };
10559
- return [{
10560
- type: "childList",
10561
- target: el,
10562
- addedNodes: emptyNodeList,
10563
- removedNodes: emptyNodeList,
10564
- previousSibling: null,
10565
- nextSibling: null,
10566
- attributeName: null,
10567
- attributeNamespace: null,
10568
- oldValue: null
10569
- }];
10570
- } : void 0,
10571
- onceIncludesImmediate: true
10572
- });
10573
- }
10574
- //#endregion
10575
12023
  //#region src/composables/useNotifications/index.ts
10576
12024
  /**
10577
12025
  * @module useNotifications
@@ -10919,7 +12367,7 @@ function createNotifications(options = {}) {
10919
12367
  *
10920
12368
  * notifications.readAll()
10921
12369
  *
10922
- * console.log(notifications.values().every(t => t.readAt !== null)) // true
12370
+ * console.log(notifications.values().every(t => !isNull(t.readAt))) // true
10923
12371
  * ```
10924
12372
  */
10925
12373
  function readAll() {
@@ -10948,7 +12396,7 @@ function createNotifications(options = {}) {
10948
12396
  *
10949
12397
  * notifications.archiveAll()
10950
12398
  *
10951
- * console.log(notifications.values().every(t => t.archivedAt !== null)) // true
12399
+ * console.log(notifications.values().every(t => !isNull(t.archivedAt))) // true
10952
12400
  * ```
10953
12401
  */
10954
12402
  function archiveAll() {
@@ -11100,10 +12548,10 @@ const [createNotificationsContext, createNotificationsPlugin, useNotifications]
11100
12548
  });
11101
12549
  //#endregion
11102
12550
  //#region src/composables/usePermissions/adapters/adapter.ts
11103
- var PermissionAdapter = class {};
12551
+ var PermissionsAdapter = class {};
11104
12552
  //#endregion
11105
12553
  //#region src/composables/usePermissions/adapters/v0.ts
11106
- var Vuetify0PermissionAdapter = class extends PermissionAdapter {
12554
+ var V0PermissionsAdapter = class extends PermissionsAdapter {
11107
12555
  constructor() {
11108
12556
  super();
11109
12557
  }
@@ -11165,7 +12613,7 @@ var Vuetify0PermissionAdapter = class extends PermissionAdapter {
11165
12613
  * ```
11166
12614
  */
11167
12615
  function createPermissions(_options = {}) {
11168
- const { adapter = new Vuetify0PermissionAdapter(), permissions = {}, ...options } = _options;
12616
+ const { adapter = new V0PermissionsAdapter(), permissions = {}, ...options } = _options;
11169
12617
  const record = {};
11170
12618
  for (const role in permissions) {
11171
12619
  if (!record[role]) record[role] = {};
@@ -11627,8 +13075,11 @@ function useRovingFocus(items, options = {}) {
11627
13075
  };
11628
13076
  }
11629
13077
  //#endregion
13078
+ //#region src/composables/useRtl/adapters/adapter.ts
13079
+ var RtlAdapter = class {};
13080
+ //#endregion
11630
13081
  //#region src/composables/useRtl/adapters/v0.ts
11631
- var Vuetify0RtlAdapter = class {
13082
+ var V0RtlAdapter = class extends RtlAdapter {
11632
13083
  setup(app, context, target) {
11633
13084
  if (IN_BROWSER) {
11634
13085
  if (/* @__PURE__ */ isNull(target)) return;
@@ -11696,7 +13147,7 @@ function createRtlFallback() {
11696
13147
  }
11697
13148
  const [createRtlContext, createRtlPlugin, useRtl] = createPluginContext("v0:rtl", (options) => createRtl(options), {
11698
13149
  fallback: () => createRtlFallback(),
11699
- setup: (context, app, { adapter = new Vuetify0RtlAdapter(), target }) => {
13150
+ setup: (context, app, { adapter = new V0RtlAdapter(), target }) => {
11700
13151
  adapter.setup(app, context, target);
11701
13152
  },
11702
13153
  persist: (ctx) => ctx.isRtl.value,
@@ -11935,13 +13386,23 @@ function useStack(namespace = "v0:stack") {
11935
13386
  }
11936
13387
  }
11937
13388
  //#endregion
13389
+ //#region src/composables/useStorage/adapters/adapter.ts
13390
+ var StorageAdapter = class {
13391
+ get length() {
13392
+ return 0;
13393
+ }
13394
+ key(_index) {
13395
+ return null;
13396
+ }
13397
+ };
13398
+ //#endregion
11938
13399
  //#region src/composables/useStorage/adapters/memory.ts
11939
13400
  /**
11940
- * In-memory storage adapter that implements the StorageAdapter interface.
13401
+ * In-memory storage adapter that extends the StorageAdapter abstract class.
11941
13402
  * This adapter provides temporary storage that persists only for the current
11942
13403
  * session and is useful for testing or when persistent storage is not available.
11943
13404
  */
11944
- var MemoryAdapter = class {
13405
+ var MemoryStorageAdapter = class extends StorageAdapter {
11945
13406
  store = /* @__PURE__ */ new Map();
11946
13407
  get length() {
11947
13408
  return this.store.size;
@@ -12013,7 +13474,7 @@ var MemoryAdapter = class {
12013
13474
  * ```
12014
13475
  */
12015
13476
  function createStorage(options = {}) {
12016
- const { adapter = IN_BROWSER ? window.localStorage : new MemoryAdapter(), prefix = "v0:", serializer = {
13477
+ const { adapter = IN_BROWSER ? window.localStorage : new MemoryStorageAdapter(), prefix = "v0:", serializer = {
12017
13478
  read: JSON.parse,
12018
13479
  write: JSON.stringify
12019
13480
  }, ttl } = options;
@@ -12028,9 +13489,9 @@ function createStorage(options = {}) {
12028
13489
  if (/* @__PURE__ */ isNullOrUndefined(raw)) return void 0;
12029
13490
  try {
12030
13491
  const parsed = serializer.read(raw);
12031
- if (ttl && /* @__PURE__ */ isObject(parsed) && "__v0" in parsed && "__v" in parsed) {
13492
+ if (/* @__PURE__ */ isObject(parsed) && "__v0" in parsed && "__v" in parsed) {
12032
13493
  const envelope = parsed;
12033
- if (Date.now() - envelope.__t > ttl) {
13494
+ if (ttl && Date.now() - envelope.__t > ttl) {
12034
13495
  adapter?.removeItem(prefixedKey);
12035
13496
  return;
12036
13497
  }
@@ -12110,7 +13571,7 @@ function createStorage(options = {}) {
12110
13571
  };
12111
13572
  }
12112
13573
  function createStorageFallback() {
12113
- return createStorage({ adapter: new MemoryAdapter() });
13574
+ return createStorage({ adapter: new MemoryStorageAdapter() });
12114
13575
  }
12115
13576
  const [createStorageContext, createStoragePlugin, useStorage] = createPluginContext("v0:storage", (options) => createStorage(options), { fallback: () => createStorageFallback() });
12116
13577
  //#endregion
@@ -12750,6 +14211,7 @@ function useClickOutside(target, handler, options = {}) {
12750
14211
  * Check if an element matches resolved ignore targets.
12751
14212
  */
12752
14213
  function isIgnored(el, selectors, elements) {
14214
+ /* v8 ignore next -- defensive guard, callers always pass an Element */
12753
14215
  if (!el) return false;
12754
14216
  for (const selector of selectors) try {
12755
14217
  if (el.matches(selector) || !/* @__PURE__ */ isNull(el.closest(selector))) return true;
@@ -12776,6 +14238,7 @@ function useClickOutside(target, handler, options = {}) {
12776
14238
  const targets = getTargets();
12777
14239
  if (targets.length === 0) return false;
12778
14240
  return targets.every((el) => {
14241
+ /* v8 ignore next -- defensive: getTargets filters to Element-typed values */
12779
14242
  if (/* @__PURE__ */ isNullOrUndefined(el) || !/* @__PURE__ */ isFunction(el.contains)) return false;
12780
14243
  return el !== eventTarget && !el.contains(eventTarget);
12781
14244
  });
@@ -12785,6 +14248,7 @@ function useClickOutside(target, handler, options = {}) {
12785
14248
  */
12786
14249
  function isOutsideBounds(x, y) {
12787
14250
  const targets = getTargets();
14251
+ /* v8 ignore next -- edge case: bounds check only invoked when targets exist */
12788
14252
  if (targets.length === 0) return false;
12789
14253
  return targets.every((el) => {
12790
14254
  const { left, right, top, bottom } = el.getBoundingClientRect();
@@ -12795,6 +14259,7 @@ function useClickOutside(target, handler, options = {}) {
12795
14259
  * Validate that the target is still in the DOM.
12796
14260
  */
12797
14261
  function isValidTarget(eventTarget) {
14262
+ /* v8 ignore next -- type guard for non-Element targets (e.g., document, window) */
12798
14263
  if (!/* @__PURE__ */ isElement(eventTarget)) return false;
12799
14264
  if (!eventTarget.isConnected) return false;
12800
14265
  return true;
@@ -12923,6 +14388,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
12923
14388
  }, { immediate: true });
12924
14389
  watch(context.isOpen, (isOpen) => {
12925
14390
  const element = contentRef.value?.element;
14391
+ /* v8 ignore next -- defensive guard, element is always present after mount */
12926
14392
  if (!element) return;
12927
14393
  if (isOpen) element.showModal?.();
12928
14394
  else element.close?.();
@@ -13451,7 +14917,7 @@ const _sfc_main$19 = /* @__PURE__ */ defineComponent({
13451
14917
  const firstDividerWidth = shallowRef(0);
13452
14918
  const overflow = createOverflow({
13453
14919
  container: () => containerRef.value?.element,
13454
- gap: __props.gap,
14920
+ gap: () => __props.gap,
13455
14921
  reserved: () => {
13456
14922
  let r = 0;
13457
14923
  if (firstItemWidth.value > 0) r += firstItemWidth.value + __props.gap;
@@ -14001,7 +15467,7 @@ const _sfc_main$21 = /* @__PURE__ */ defineComponent({
14001
15467
  const selection = createSelection({
14002
15468
  disabled: toRef(() => __props.disabled),
14003
15469
  multiple: toRef(() => __props.multiple),
14004
- mandatory: __props.mandatory,
15470
+ mandatory: toRef(() => __props.mandatory),
14005
15471
  events: true
14006
15472
  });
14007
15473
  useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
@@ -14123,7 +15589,7 @@ const _sfc_main$25 = /* @__PURE__ */ defineComponent({
14123
15589
  } catch {}
14124
15590
  const ticket = group?.register({
14125
15591
  value: __props.value,
14126
- disabled: __props.disabled
15592
+ disabled: () => toValue(__props.disabled) ?? false
14127
15593
  });
14128
15594
  const isDisabled = toRef(() => group && ticket ? toValue(ticket.disabled) || toValue(group.disabled) : __props.disabled);
14129
15595
  const isReadonly = toRef(() => __props.readonly);
@@ -14604,6 +16070,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14604
16070
  const scrollPaddingEnd = shallowRef();
14605
16071
  function syncScrollPadding() {
14606
16072
  const element = el.value;
16073
+ /* v8 ignore next 5 -- defensive: ResizeObserver only fires when element exists */
14607
16074
  if (!element) {
14608
16075
  scrollPaddingStart.value = void 0;
14609
16076
  scrollPaddingEnd.value = void 0;
@@ -14612,17 +16079,20 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14612
16079
  const cs = getComputedStyle(element);
14613
16080
  const start = isVertical.value ? cs.paddingBlockStart : cs.paddingInlineStart;
14614
16081
  const end = isVertical.value ? cs.paddingBlockEnd : cs.paddingInlineEnd;
16082
+ /* v8 ignore next 2 -- happy-dom returns no computed padding so '0px' branch always taken */
14615
16083
  scrollPaddingStart.value = start && start !== "0px" ? start : void 0;
14616
16084
  scrollPaddingEnd.value = end && end !== "0px" ? end : void 0;
14617
16085
  }
14618
16086
  useResizeObserver(el, syncScrollPadding, { immediate: true });
14619
16087
  watch(isVertical, syncScrollPadding);
14620
16088
  const slideStep = toRef(() => {
16089
+ /* v8 ignore next -- defensive: getter only invoked after viewport mounts */
14621
16090
  if (!el.value) return 0;
14622
16091
  if ((isVertical.value ? height.value : width.value) === 0) return 0;
14623
16092
  const first = toValue(carousel.seek("first")?.el);
14624
16093
  const second = toValue(carousel.seek("first", 1)?.el);
14625
16094
  if (!first) return 0;
16095
+ /* v8 ignore next 3 -- happy-dom returns 0 for offset* so layout-dependent branches never reach here */
14626
16096
  if (!second) return isVertical.value ? first.offsetHeight : first.offsetWidth;
14627
16097
  return isVertical.value ? second.offsetTop - first.offsetTop : second.offsetLeft - first.offsetLeft;
14628
16098
  });
@@ -14633,11 +16103,13 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14633
16103
  return;
14634
16104
  }
14635
16105
  const viewport = el.value;
16106
+ /* v8 ignore next -- defensive: scrollend fires only on attached element with measured slideStep */
14636
16107
  if (!viewport || slideStep.value === 0) return;
14637
16108
  isDragging.value = false;
14638
16109
  const scrollPos = isVertical.value ? viewport.scrollTop : viewport.scrollLeft;
14639
16110
  const snapIndex = Math.round(scrollPos / slideStep.value);
14640
16111
  const id = carousel.lookup(snapIndex);
16112
+ /* v8 ignore next 3 -- snapIndex resolution requires real layout, not exercised in happy-dom */
14641
16113
  if (!/* @__PURE__ */ isUndefined(id) && id !== carousel.selectedItem.value?.id) carousel.select(id);
14642
16114
  });
14643
16115
  useEventListener(el, "scroll", () => {
@@ -14660,6 +16132,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14660
16132
  useEventListener(el, "mousedown", (e) => {
14661
16133
  if (e.button !== 0) return;
14662
16134
  const viewport = el.value;
16135
+ /* v8 ignore next -- defensive: mousedown only fires on attached viewport */
14663
16136
  if (!viewport) return;
14664
16137
  carousel.pause();
14665
16138
  dragStart = isVertical.value ? e.clientY : e.clientX;
@@ -14669,6 +16142,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14669
16142
  useToggleScope(() => snapDisabled.value, () => {
14670
16143
  useDocumentEventListener("mousemove", (e) => {
14671
16144
  const viewport = el.value;
16145
+ /* v8 ignore next -- defensive: mousemove only fires within active drag scope */
14672
16146
  if (!viewport) return;
14673
16147
  e.preventDefault();
14674
16148
  const delta = (isVertical.value ? e.clientY : e.clientX) - dragStart;
@@ -14707,6 +16181,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14707
16181
  }
14708
16182
  watch(() => carousel.selectedIndex.value, (index) => {
14709
16183
  const viewport = el.value;
16184
+ /* v8 ignore next -- defensive: viewport always present when watch fires after mount */
14710
16185
  if (!viewport || slideStep.value === 0) return;
14711
16186
  syncing.value = true;
14712
16187
  const position = index * slideStep.value;
@@ -14724,6 +16199,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14724
16199
  [isVertical.value ? "overflow-x" : "overflow-y"]: "hidden",
14725
16200
  "scroll-snap-type": snapDisabled.value ? "none" : `${isVertical.value ? "y" : "x"} mandatory`,
14726
16201
  "scrollbar-width": "none",
16202
+ /* v8 ignore next 3 -- happy-dom never sets computed padding so spreads always evaluate to {} */
14727
16203
  ...scrollPaddingStart.value ? { [`scroll-padding-${axis}-start`]: scrollPaddingStart.value } : {},
14728
16204
  ...scrollPaddingEnd.value ? { [`scroll-padding-${axis}-end`]: scrollPaddingEnd.value } : {},
14729
16205
  ...snapDisabled.value ? { "user-select": "none" } : {}
@@ -14777,7 +16253,7 @@ const _sfc_main$27 = /* @__PURE__ */ defineComponent({
14777
16253
  const ticket = carousel.register({
14778
16254
  id: __props.id,
14779
16255
  value: __props.value,
14780
- disabled: __props.disabled,
16256
+ disabled: () => toValue(__props.disabled) ?? false,
14781
16257
  el
14782
16258
  });
14783
16259
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(carousel.disabled));
@@ -15429,8 +16905,8 @@ const _sfc_main$34 = /* @__PURE__ */ defineComponent({
15429
16905
  const model = useModel(__props, "modelValue");
15430
16906
  const group = createGroup({
15431
16907
  disabled: toRef(() => __props.disabled),
15432
- enroll: __props.enroll,
15433
- mandatory: __props.mandatory,
16908
+ enroll: toRef(() => __props.enroll),
16909
+ mandatory: toRef(() => __props.mandatory),
15434
16910
  events: true
15435
16911
  });
15436
16912
  useProxyModel(group, model, { multiple: true });
@@ -15501,8 +16977,8 @@ const _sfc_main$37 = /* @__PURE__ */ defineComponent({
15501
16977
  const ticket = group?.register({
15502
16978
  id: __props.id,
15503
16979
  value: __props.value,
15504
- disabled: __props.disabled,
15505
- indeterminate: __props.indeterminate
16980
+ disabled: () => toValue(__props.disabled) ?? false,
16981
+ indeterminate: () => toValue(__props.indeterminate) ?? false
15506
16982
  });
15507
16983
  const isChecked = toRef(() => ticket ? toValue(ticket.isSelected) : model.value ?? false);
15508
16984
  const isMixed = toRef(() => ticket ? toValue(ticket.isMixed) : toValue(__props.indeterminate) ?? false);
@@ -15582,15 +17058,15 @@ const _sfc_main$37 = /* @__PURE__ */ defineComponent({
15582
17058
  "aria-invalid": __props.ariaInvalid || void 0,
15583
17059
  "tabindex": isDisabled.value ? void 0 : 0,
15584
17060
  "data-state": dataState.value,
15585
- "data-disabled": isDisabled.value ? true : void 0
17061
+ "data-disabled": isDisabled.value ? true : void 0,
17062
+ "onClick": onClick,
17063
+ "onKeydown": onKeydown
15586
17064
  }
15587
17065
  }));
15588
17066
  return (_ctx, _cache) => {
15589
17067
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(_sfc_main$9), mergeProps(mergeProps(unref(attrs), slotProps.value.attrs), {
15590
17068
  as: __props.as,
15591
- renderless: __props.renderless,
15592
- onClick,
15593
- onKeydown
17069
+ renderless: __props.renderless
15594
17070
  }), {
15595
17071
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
15596
17072
  _: 3
@@ -16261,10 +17737,10 @@ const _sfc_main$51 = /* @__PURE__ */ defineComponent({
16261
17737
  id: __props.id,
16262
17738
  name: __props.name,
16263
17739
  form: __props.form,
16264
- disabled: __props.disabled,
16265
- multiple: __props.multiple,
16266
- mandatory: __props.mandatory,
16267
- strict: __props.strict,
17740
+ disabled: toRef(() => __props.disabled),
17741
+ multiple: toRef(() => __props.multiple),
17742
+ mandatory: toRef(() => __props.mandatory),
17743
+ strict: toRef(() => __props.strict),
16268
17744
  error: () => __props.error,
16269
17745
  errorMessages: () => __props.errorMessages,
16270
17746
  adapter: __props.adapter,
@@ -16629,7 +18105,7 @@ const _sfc_main$50 = /* @__PURE__ */ defineComponent({
16629
18105
  const ticket = context.selection.register({
16630
18106
  id: __props.id,
16631
18107
  value: __props.value,
16632
- disabled: __props.disabled
18108
+ disabled: () => toValue(__props.disabled) ?? false
16633
18109
  });
16634
18110
  const elementId = `${context.id}-option-${ticket.id}`;
16635
18111
  const isSelected = toRef(() => toValue(ticket.isSelected));
@@ -16657,14 +18133,12 @@ const _sfc_main$50 = /* @__PURE__ */ defineComponent({
16657
18133
  "data-selected": isSelected.value || void 0,
16658
18134
  "data-highlighted": isHighlighted.value ? "" : void 0,
16659
18135
  "data-disabled": isDisabled.value || void 0,
16660
- "data-id": String(ticket.id)
18136
+ "data-id": String(ticket.id),
18137
+ "onClick": onClick
16661
18138
  }
16662
18139
  }));
16663
18140
  return (_ctx, _cache) => {
16664
- return withDirectives((openBlock(), createBlock(unref(_sfc_main$9), mergeProps(slotProps.value.attrs, {
16665
- as: __props.as,
16666
- onClick
16667
- }), {
18141
+ return withDirectives((openBlock(), createBlock(unref(_sfc_main$9), mergeProps(slotProps.value.attrs, { as: __props.as }), {
16668
18142
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
16669
18143
  _: 3
16670
18144
  }, 16, ["as"])), [[vShow, isFiltered.value]]);
@@ -16996,6 +18470,7 @@ const _sfc_main$54 = /* @__PURE__ */ defineComponent({
16996
18470
  }, { immediate: true });
16997
18471
  watch(context.isOpen, (isOpen) => {
16998
18472
  const element = contentRef.value?.element;
18473
+ /* v8 ignore next -- defensive guard, element is always present after mount */
16999
18474
  if (!element) return;
17000
18475
  if (isOpen) element.showModal?.();
17001
18476
  else element.close?.();
@@ -17306,12 +18781,12 @@ const _sfc_main$61 = /* @__PURE__ */ defineComponent({
17306
18781
  const isDisabled = toRef(() => __props.disabled);
17307
18782
  const selection = createSelection({
17308
18783
  disabled: isDisabled,
17309
- enroll: __props.enroll,
17310
- mandatory: __props.mandatory,
17311
- multiple: __props.multiple,
18784
+ enroll: toRef(() => __props.enroll),
18785
+ mandatory: toRef(() => __props.mandatory),
18786
+ multiple: toRef(() => __props.multiple),
17312
18787
  events: true
17313
18788
  });
17314
- useProxyModel(selection, model, { multiple: __props.multiple });
18789
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
17315
18790
  const slotProps = toRef(() => ({
17316
18791
  isDisabled,
17317
18792
  select: selection.select,
@@ -17349,7 +18824,7 @@ const _sfc_main$63 = /* @__PURE__ */ defineComponent({
17349
18824
  const ticket = selection.register({
17350
18825
  id: __props.id,
17351
18826
  value: __props.value,
17352
- disabled: __props.disabled
18827
+ disabled: () => toValue(__props.disabled) ?? false
17353
18828
  });
17354
18829
  const headerId = toRef(() => `${ticket.id}-header`);
17355
18830
  const contentId = toRef(() => `${ticket.id}-content`);
@@ -17755,8 +19230,8 @@ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
17755
19230
  const model = useModel(__props, "modelValue");
17756
19231
  const group = createGroup({
17757
19232
  disabled: toRef(() => __props.disabled),
17758
- enroll: __props.enroll,
17759
- mandatory: __props.mandatory,
19233
+ enroll: toRef(() => __props.enroll),
19234
+ mandatory: toRef(() => __props.mandatory),
17760
19235
  events: true
17761
19236
  });
17762
19237
  useProxyModel(group, model, { multiple: true });
@@ -17797,8 +19272,8 @@ const _sfc_main$65 = /* @__PURE__ */ defineComponent({
17797
19272
  const ticket = group.register({
17798
19273
  id: __props.id,
17799
19274
  value: __props.value,
17800
- disabled: __props.disabled,
17801
- indeterminate: __props.indeterminate
19275
+ disabled: () => toValue(__props.disabled) ?? false,
19276
+ indeterminate: () => toValue(__props.indeterminate) ?? false
17802
19277
  });
17803
19278
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(group.disabled));
17804
19279
  onBeforeUnmount(() => {
@@ -18194,11 +19669,11 @@ const _sfc_main$74 = /* @__PURE__ */ defineComponent({
18194
19669
  name: __props.name,
18195
19670
  form: __props.form,
18196
19671
  required: __props.required,
18197
- disabled: __props.disabled,
18198
- readonly: __props.readonly,
19672
+ disabled: () => toValue(__props.disabled),
19673
+ readonly: () => toValue(__props.readonly),
18199
19674
  rules: __props.rules,
18200
- error: __props.error,
18201
- errorMessages: __props.errorMessages
19675
+ error: () => toValue(__props.error),
19676
+ errorMessages: () => toValue(__props.errorMessages)
18202
19677
  });
18203
19678
  const parsed = toRef(() => parseValidateOn$1(__props.validateOn));
18204
19679
  function shouldValidate(trigger) {
@@ -18672,8 +20147,8 @@ const _sfc_main$81 = /* @__PURE__ */ defineComponent({
18672
20147
  locale: __props.locale,
18673
20148
  format: __props.format,
18674
20149
  clamp: __props.clamp,
18675
- disabled: __props.disabled,
18676
- readonly: __props.readonly,
20150
+ disabled: () => toValue(__props.disabled),
20151
+ readonly: () => toValue(__props.readonly),
18677
20152
  min: __props.min,
18678
20153
  max: __props.max,
18679
20154
  step: __props.step,
@@ -18939,6 +20414,8 @@ const _sfc_main$77 = /* @__PURE__ */ defineComponent({
18939
20414
  delay.stop();
18940
20415
  spin.stop();
18941
20416
  }
20417
+ useDocumentEventListener("pointerup", stop);
20418
+ useDocumentEventListener("pointercancel", stop);
18942
20419
  function onPointerdown(e) {
18943
20420
  if (isDisabled.value) return;
18944
20421
  if (e.button !== 0) return;
@@ -19078,6 +20555,8 @@ const _sfc_main$80 = /* @__PURE__ */ defineComponent({
19078
20555
  delay.stop();
19079
20556
  spin.stop();
19080
20557
  }
20558
+ useDocumentEventListener("pointerup", stop);
20559
+ useDocumentEventListener("pointercancel", stop);
19081
20560
  function onPointerdown(e) {
19082
20561
  if (isDisabled.value) return;
19083
20562
  if (e.button !== 0) return;
@@ -20735,7 +22214,9 @@ const _sfc_main$103 = /* @__PURE__ */ defineComponent({
20735
22214
  return /* @__PURE__ */ isArray(model.value) ? model.value : [model.value];
20736
22215
  },
20737
22216
  set: (arr) => {
22217
+ /* v8 ignore next -- defensive guard for null/undefined model with empty registry */
20738
22218
  if (/* @__PURE__ */ isNullOrUndefined(model.value) && arr.length === 0) return;
22219
+ /* v8 ignore next -- arr[0] always defined when scalar=true since model started as a number */
20739
22220
  model.value = scalar ? arr[0] ?? 0 : arr;
20740
22221
  }
20741
22222
  });
@@ -20847,10 +22328,11 @@ const _sfc_main$100 = /* @__PURE__ */ defineComponent({
20847
22328
  setup(__props) {
20848
22329
  const attrs = useAttrs();
20849
22330
  const root = useProgressRoot(__props.namespace);
20850
- const ticket = root.register({ value: toRef(() => __props.value ?? 0) });
22331
+ const ticket = /* @__PURE__ */ isUndefined(__props.value) ? root.register() : root.register({ value: toRef(() => __props.value) });
20851
22332
  onBeforeUnmount(() => {
20852
22333
  ticket.unregister();
20853
22334
  });
22335
+ /* v8 ignore next -- defensive: registered ticket.value always coalesces to number via toRef getter above */
20854
22336
  const current = toRef(() => toValue(ticket.value) ?? 0);
20855
22337
  const percent = toRef(() => root.fromValue(current.value));
20856
22338
  const slotProps = toRef(() => ({
@@ -21207,7 +22689,7 @@ const _sfc_main$106 = /* @__PURE__ */ defineComponent({
21207
22689
  const model = useModel(__props, "modelValue");
21208
22690
  const single = createSingle({
21209
22691
  disabled: toRef(() => __props.disabled),
21210
- mandatory: __props.mandatory,
22692
+ mandatory: toRef(() => __props.mandatory),
21211
22693
  events: true
21212
22694
  });
21213
22695
  useProxyModel(single, model, { multiple: false });
@@ -21270,7 +22752,7 @@ const _sfc_main$109 = /* @__PURE__ */ defineComponent({
21270
22752
  const ticket = group.register({
21271
22753
  id: __props.id,
21272
22754
  value: __props.value,
21273
- disabled: __props.disabled,
22755
+ disabled: () => toValue(__props.disabled) ?? false,
21274
22756
  el
21275
22757
  });
21276
22758
  const isChecked = toRef(() => toValue(ticket.isSelected));
@@ -21348,15 +22830,15 @@ const _sfc_main$109 = /* @__PURE__ */ defineComponent({
21348
22830
  "tabindex": isTabbable.value ? 0 : -1,
21349
22831
  "data-state": dataState.value,
21350
22832
  "data-disabled": isDisabled.value ? true : void 0,
21351
- "data-radio-id": __props.id
22833
+ "data-radio-id": __props.id,
22834
+ "onClick": onClick,
22835
+ "onKeydown": onKeydown
21352
22836
  }
21353
22837
  }));
21354
22838
  return (_ctx, _cache) => {
21355
22839
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(_sfc_main$9), mergeProps({ ref: "root" }, mergeProps(unref(attrs), slotProps.value.attrs), {
21356
22840
  as: __props.as,
21357
- renderless: __props.renderless,
21358
- onClick,
21359
- onKeydown
22841
+ renderless: __props.renderless
21360
22842
  }), {
21361
22843
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
21362
22844
  _: 3
@@ -22091,12 +23573,12 @@ const _sfc_main$119 = /* @__PURE__ */ defineComponent({
22091
23573
  const listboxId = `${id}-listbox`;
22092
23574
  const activatorId = `${id}-activator`;
22093
23575
  const selection = createSelection({
22094
- multiple: __props.multiple,
22095
- mandatory: __props.mandatory,
23576
+ multiple: toRef(() => __props.multiple),
23577
+ mandatory: toRef(() => __props.mandatory),
22096
23578
  disabled: toRef(() => __props.disabled),
22097
23579
  events: true
22098
23580
  });
22099
- useProxyModel(selection, model, { multiple: __props.multiple });
23581
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
22100
23582
  const selectedId = toRef(() => selection.selectedIds.values().next().value);
22101
23583
  const popover = usePopover({ id });
22102
23584
  const isOpen = popover.isOpen;
@@ -22342,7 +23824,7 @@ const _sfc_main$117 = /* @__PURE__ */ defineComponent({
22342
23824
  const ticket = context.selection.register({
22343
23825
  id: __props.id,
22344
23826
  value: __props.value,
22345
- disabled: __props.disabled
23827
+ disabled: () => toValue(__props.disabled) ?? false
22346
23828
  });
22347
23829
  const elementId = `${context.id}-option-${ticket.id}`;
22348
23830
  const isSelected = toRef(() => toValue(ticket.isSelected));
@@ -22368,11 +23850,12 @@ const _sfc_main$117 = /* @__PURE__ */ defineComponent({
22368
23850
  "data-selected": isSelected.value || void 0,
22369
23851
  "data-highlighted": isHighlighted.value ? "" : void 0,
22370
23852
  "data-disabled": isDisabled.value || void 0,
22371
- "data-id": String(ticket.id)
23853
+ "data-id": String(ticket.id),
23854
+ "onClick": onClick
22372
23855
  }
22373
23856
  }));
22374
23857
  return (_ctx, _cache) => {
22375
- return openBlock(), createBlock(unref(_sfc_main$9), mergeProps({ as: __props.as }, slotProps.value.attrs, { onClick }), {
23858
+ return openBlock(), createBlock(unref(_sfc_main$9), mergeProps({ as: __props.as }, slotProps.value.attrs), {
22376
23859
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
22377
23860
  _: 3
22378
23861
  }, 16, ["as"]);
@@ -22664,12 +24147,12 @@ const _sfc_main$122 = /* @__PURE__ */ defineComponent({
22664
24147
  const model = useModel(__props, "modelValue");
22665
24148
  const selection = createSelection({
22666
24149
  disabled: toRef(() => __props.disabled),
22667
- enroll: __props.enroll,
22668
- mandatory: __props.mandatory,
22669
- multiple: __props.multiple,
24150
+ enroll: toRef(() => __props.enroll),
24151
+ mandatory: toRef(() => __props.mandatory),
24152
+ multiple: toRef(() => __props.multiple),
22670
24153
  events: true
22671
24154
  });
22672
- useProxyModel(selection, model, { multiple: __props.multiple });
24155
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
22673
24156
  provideSelectionRoot(__props.namespace, selection);
22674
24157
  const slotProps = toRef(() => ({
22675
24158
  isDisabled: toValue(selection.disabled),
@@ -22701,7 +24184,7 @@ const _sfc_main$121 = /* @__PURE__ */ defineComponent({
22701
24184
  const ticket = selection.register({
22702
24185
  id: __props.id,
22703
24186
  value: __props.value,
22704
- disabled: __props.disabled
24187
+ disabled: () => toValue(__props.disabled) ?? false
22705
24188
  });
22706
24189
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(selection.disabled));
22707
24190
  onBeforeUnmount(() => {
@@ -22811,8 +24294,8 @@ const _sfc_main$124 = /* @__PURE__ */ defineComponent({
22811
24294
  const model = useModel(__props, "modelValue");
22812
24295
  const single = createSingle({
22813
24296
  disabled: toRef(() => __props.disabled),
22814
- enroll: __props.enroll,
22815
- mandatory: __props.mandatory,
24297
+ enroll: toRef(() => __props.enroll),
24298
+ mandatory: toRef(() => __props.mandatory),
22816
24299
  events: true
22817
24300
  });
22818
24301
  useProxyModel(single, model, { multiple: false });
@@ -22846,7 +24329,7 @@ const _sfc_main$123 = /* @__PURE__ */ defineComponent({
22846
24329
  const ticket = single.register({
22847
24330
  id: __props.id,
22848
24331
  value: __props.value,
22849
- disabled: __props.disabled
24332
+ disabled: () => toValue(__props.disabled) ?? false
22850
24333
  });
22851
24334
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(single.disabled));
22852
24335
  onBeforeUnmount(() => {
@@ -22975,6 +24458,7 @@ const _sfc_main$127 = /* @__PURE__ */ defineComponent({
22975
24458
  const internal = computed({
22976
24459
  get: () => /* @__PURE__ */ isArray(model.value) ? model.value : [model.value],
22977
24460
  set: (arr) => {
24461
+ /* v8 ignore next -- arr[0] always defined when scalar=true since model started with a number */
22978
24462
  model.value = scalar ? arr[0] ?? 0 : arr;
22979
24463
  }
22980
24464
  });
@@ -22982,10 +24466,10 @@ const _sfc_main$127 = /* @__PURE__ */ defineComponent({
22982
24466
  min: __props.min,
22983
24467
  max: __props.max,
22984
24468
  step: __props.step,
22985
- disabled: __props.disabled,
22986
- readonly: __props.readonly,
22987
- orientation: __props.orientation,
22988
- inverted: __props.inverted,
24469
+ disabled: () => toValue(__props.disabled),
24470
+ readonly: () => toValue(__props.readonly),
24471
+ orientation: () => toValue(__props.orientation),
24472
+ inverted: () => toValue(__props.inverted),
22989
24473
  minStepsBetweenThumbs: __props.minStepsBetweenThumbs,
22990
24474
  crossover: __props.crossover
22991
24475
  });
@@ -22995,20 +24479,25 @@ const _sfc_main$127 = /* @__PURE__ */ defineComponent({
22995
24479
  const dragOffset = shallowRef(0);
22996
24480
  function getPercent(e) {
22997
24481
  const el = track.value;
24482
+ /* v8 ignore next -- defensive: pointermove is gated to active drag, track is mounted by then */
22998
24483
  if (!el) return 0;
22999
24484
  const rect = el.getBoundingClientRect();
23000
24485
  return toValue(slider.orientation) === "vertical" ? (rect.bottom - e.clientY - dragOffset.value) / rect.height * 100 : (e.clientX - rect.left - dragOffset.value) / rect.width * 100;
23001
24486
  }
23002
24487
  useToggleScope(() => !/* @__PURE__ */ isNull(dragging.value), () => {
24488
+ /* v8 ignore next 3 -- IN_BROWSER always true in happy-dom test env */
23003
24489
  if (IN_BROWSER) document.documentElement.style.touchAction = "none";
23004
24490
  useDocumentEventListener("pointermove", (e) => {
24491
+ /* v8 ignore next -- defensive: dragging cleared on pointerup */
23005
24492
  if (/* @__PURE__ */ isNull(dragging.value)) return;
23006
24493
  const percent = getPercent(e);
23007
24494
  slider.set(dragging.value, slider.fromPercent(percent));
23008
24495
  });
23009
24496
  useDocumentEventListener("pointerup", () => {
24497
+ /* v8 ignore next 3 -- IN_BROWSER always true in happy-dom test env */
23010
24498
  if (IN_BROWSER) document.documentElement.style.touchAction = "";
23011
24499
  const values = [...slider.values.value];
24500
+ /* v8 ignore next -- end event scalar branch only fires for single-value drag, not exercised */
23012
24501
  emit("end", scalar ? values[0] ?? 0 : values);
23013
24502
  dragging.value = null;
23014
24503
  dragOffset.value = 0;
@@ -23025,6 +24514,7 @@ const _sfc_main$127 = /* @__PURE__ */ defineComponent({
23025
24514
  } else dragOffset.value = 0;
23026
24515
  dragging.value = index;
23027
24516
  const values = [...slider.values.value];
24517
+ /* v8 ignore next -- start event scalar branch only fires for single-value drag, not exercised */
23028
24518
  emit("start", scalar ? values[0] ?? 0 : values);
23029
24519
  }
23030
24520
  const context = {
@@ -23841,6 +25331,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23841
25331
  const handles = createRegistry();
23842
25332
  watch(() => panels.collection.size, (size, prev) => {
23843
25333
  const values = panels.values();
25334
+ /* v8 ignore next -- defensive: watch fires only when panel registry has at least one entry */
23844
25335
  if (values.length === 0) return;
23845
25336
  const total = values.reduce((sum, t) => sum + t.size, 0);
23846
25337
  if (total === 0 || total === 100) return;
@@ -23859,6 +25350,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23859
25350
  function resize(index, delta, options) {
23860
25351
  const before = panel(index);
23861
25352
  const after = panel(index + 1);
25353
+ /* v8 ignore next -- defensive: resize only invoked between adjacent panels */
23862
25354
  if (!before || !after) return;
23863
25355
  const total = before.size + after.size;
23864
25356
  const min1 = effectiveMin(before);
@@ -23901,8 +25393,10 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23901
25393
  }
23902
25394
  function collapse(index, neighborIndex) {
23903
25395
  const ticket = panel(index);
25396
+ /* v8 ignore next -- defensive: collapse called only on collapsible+selected panels */
23904
25397
  if (!ticket?.collapsible || !toValue(ticket.isSelected)) return;
23905
25398
  const neighbor = panel(neighborIndex ?? (index > 0 ? index - 1 : index + 1));
25399
+ /* v8 ignore next -- defensive: at least one neighbor exists when there are 2+ panels */
23906
25400
  if (!neighbor) return;
23907
25401
  const diff = ticket.size - ticket.collapsedSize;
23908
25402
  const absorbed = Math.min(diff, neighbor.maxSize - neighbor.size);
@@ -23922,12 +25416,15 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23922
25416
  }
23923
25417
  function expand(index, neighborIndex) {
23924
25418
  const ticket = panel(index);
25419
+ /* v8 ignore next -- defensive: expand called only on collapsible+collapsed panels */
23925
25420
  if (!ticket?.collapsible || toValue(ticket.isSelected)) return;
23926
25421
  const neighbor = panel(neighborIndex ?? (index > 0 ? index - 1 : index + 1));
25422
+ /* v8 ignore next -- defensive: at least one neighbor exists when there are 2+ panels */
23927
25423
  if (!neighbor) return;
23928
25424
  const diff = Math.min(ticket.defaultSize, ticket.maxSize) - ticket.collapsedSize;
23929
25425
  const available = neighbor.size - neighbor.minSize;
23930
25426
  const take = Math.min(diff, available);
25427
+ /* v8 ignore next -- defensive: only triggers when neighbor has insufficient space */
23931
25428
  if (ticket.collapsedSize + take < ticket.minSize) return;
23932
25429
  neighbor.size -= take;
23933
25430
  ticket.size = ticket.collapsedSize + take;
@@ -23951,6 +25448,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23951
25448
  remainder -= adjust;
23952
25449
  }
23953
25450
  for (const ticket of values) {
25451
+ /* v8 ignore next -- defensive: existing tests use collapsible panels */
23954
25452
  if (!ticket.collapsible) continue;
23955
25453
  const collapsed = !toValue(ticket.isSelected);
23956
25454
  if (!collapsed && ticket.size <= ticket.collapsedSize) ticket.unselect();
@@ -23962,6 +25460,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23962
25460
  draggingHandle.value = index;
23963
25461
  }
23964
25462
  function onEndDrag() {
25463
+ if (/* @__PURE__ */ isNull(draggingHandle.value)) return;
23965
25464
  draggingHandle.value = null;
23966
25465
  expandAccum.clear();
23967
25466
  emitLayout();
@@ -24058,7 +25557,9 @@ const _sfc_main$136 = /* @__PURE__ */ defineComponent({
24058
25557
  function isPx(value) {
24059
25558
  return /* @__PURE__ */ isString(value) && value.endsWith("px");
24060
25559
  }
24061
- if (isPx(__props.defaultSize) || isPx(__props.minSize) || isPx(__props.maxSize) || isPx(__props.collapsedSize)) useResizeObserver(splitter.rootEl, (entries) => {
25560
+ if (isPx(__props.defaultSize) || isPx(__props.minSize) || isPx(__props.maxSize) || isPx(__props.collapsedSize))
25561
+ /* v8 ignore start -- px-mode panels not exercised in happy-dom (no real layout) */
25562
+ useResizeObserver(splitter.rootEl, (entries) => {
24062
25563
  const rect = entries[0]?.contentRect;
24063
25564
  rootSize.value = splitter.orientation.value === "horizontal" ? rect?.width ?? 0 : rect?.height ?? 0;
24064
25565
  });
@@ -24066,11 +25567,13 @@ const _sfc_main$136 = /* @__PURE__ */ defineComponent({
24066
25567
  if (!/* @__PURE__ */ isString(value)) return value;
24067
25568
  const num = Number.parseFloat(value);
24068
25569
  if (Number.isNaN(num)) return fallback;
25570
+ /* v8 ignore start -- px-mode conversion path not exercised in happy-dom (no real layout) */
24069
25571
  if (value.endsWith("px")) {
24070
25572
  const root = splitter.rootEl.value;
24071
25573
  const dimension = rootSize.value || (splitter.orientation.value === "horizontal" ? root?.offsetWidth : root?.offsetHeight) || 0;
24072
25574
  return dimension > 0 ? num / dimension * 100 : fallback;
24073
25575
  }
25576
+ /* v8 ignore stop */
24074
25577
  return num;
24075
25578
  }
24076
25579
  const ticket = splitter.panels.register({
@@ -24190,9 +25693,11 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24190
25693
  if (hovering.value) return "hover";
24191
25694
  return "inactive";
24192
25695
  });
25696
+ /* v8 ignore next -- defensive: the handle's index always points to a registered panel */
24193
25697
  const valuenow = toRef(() => Math.round(splitter.panel(ticket.index)?.size ?? 0));
24194
25698
  const valuemin = toRef(() => {
24195
25699
  const p = splitter.panel(ticket.index);
25700
+ /* v8 ignore next -- defensive: handle's index always resolves to a registered panel */
24196
25701
  if (!p) return 0;
24197
25702
  return p.collapsible ? p.collapsedSize : p.minSize;
24198
25703
  });
@@ -24216,8 +25721,10 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24216
25721
  useToggleScope(() => splitter.draggingHandle.value === ticket.index, () => {
24217
25722
  const update = useRaf(() => {
24218
25723
  const root = splitter.rootEl.value;
25724
+ /* v8 ignore next -- defensive: drag scope only enters with a mounted root */
24219
25725
  if (!root) return;
24220
25726
  const rootSize = isHorizontal.value ? root.offsetWidth : root.offsetHeight;
25727
+ /* v8 ignore next -- happy-dom returns 0 for offset dimensions; not exercised in tests */
24221
25728
  if (!rootSize) return;
24222
25729
  const delta = (latestPos - startPosition.value) / rootSize * 100;
24223
25730
  startPosition.value = latestPos;
@@ -24229,6 +25736,7 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24229
25736
  });
24230
25737
  useDocumentEventListener("pointerup", () => {
24231
25738
  update.cancel();
25739
+ /* v8 ignore next 4 -- IN_BROWSER always true in happy-dom test env */
24232
25740
  if (IN_BROWSER) {
24233
25741
  document.documentElement.style.userSelect = "";
24234
25742
  document.documentElement.style.touchAction = "";
@@ -24237,6 +25745,7 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24237
25745
  });
24238
25746
  onScopeDispose(() => {
24239
25747
  splitter.onEndDrag();
25748
+ /* v8 ignore next 4 -- IN_BROWSER always true in happy-dom test env */
24240
25749
  if (IN_BROWSER) {
24241
25750
  document.documentElement.style.userSelect = "";
24242
25751
  document.documentElement.style.touchAction = "";
@@ -24459,8 +25968,8 @@ const _sfc_main$139 = /* @__PURE__ */ defineComponent({
24459
25968
  const model = useModel(__props, "modelValue");
24460
25969
  const step = createStep({
24461
25970
  disabled: toRef(() => __props.disabled),
24462
- enroll: __props.enroll,
24463
- mandatory: __props.mandatory,
25971
+ enroll: toRef(() => __props.enroll),
25972
+ mandatory: toRef(() => __props.mandatory),
24464
25973
  events: true
24465
25974
  });
24466
25975
  useProxyModel(step, model, { multiple: false });
@@ -24499,7 +26008,7 @@ const _sfc_main$138 = /* @__PURE__ */ defineComponent({
24499
26008
  const ticket = step.register({
24500
26009
  id: __props.id,
24501
26010
  value: __props.value,
24502
- disabled: __props.disabled
26011
+ disabled: () => toValue(__props.disabled) ?? false
24503
26012
  });
24504
26013
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(step.disabled));
24505
26014
  onBeforeUnmount(() => {
@@ -24612,8 +26121,8 @@ const _sfc_main$140 = /* @__PURE__ */ defineComponent({
24612
26121
  const model = useModel(__props, "modelValue");
24613
26122
  const group = createGroup({
24614
26123
  disabled: toRef(() => __props.disabled),
24615
- enroll: __props.enroll,
24616
- mandatory: __props.mandatory,
26124
+ enroll: toRef(() => __props.enroll),
26125
+ mandatory: toRef(() => __props.mandatory),
24617
26126
  events: true
24618
26127
  });
24619
26128
  useProxyModel(group, model, { multiple: true });
@@ -24684,8 +26193,8 @@ const _sfc_main$142 = /* @__PURE__ */ defineComponent({
24684
26193
  const ticket = group?.register({
24685
26194
  id: __props.id,
24686
26195
  value: __props.value,
24687
- disabled: __props.disabled,
24688
- indeterminate: __props.indeterminate
26196
+ disabled: () => toValue(__props.disabled) ?? false,
26197
+ indeterminate: () => toValue(__props.indeterminate) ?? false
24689
26198
  });
24690
26199
  const isChecked = toRef(() => ticket ? toValue(ticket.isSelected) : model.value ?? false);
24691
26200
  const isMixed = toRef(() => ticket ? toValue(ticket.isMixed) : toValue(__props.indeterminate) ?? false);
@@ -24765,15 +26274,15 @@ const _sfc_main$142 = /* @__PURE__ */ defineComponent({
24765
26274
  "aria-invalid": __props.ariaInvalid || void 0,
24766
26275
  "tabindex": isDisabled.value ? void 0 : 0,
24767
26276
  "data-state": dataState.value,
24768
- "data-disabled": isDisabled.value ? true : void 0
26277
+ "data-disabled": isDisabled.value ? true : void 0,
26278
+ "onClick": onClick,
26279
+ "onKeydown": onKeydown
24769
26280
  }
24770
26281
  }));
24771
26282
  return (_ctx, _cache) => {
24772
26283
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(_sfc_main$9), mergeProps(mergeProps(unref(attrs), slotProps.value.attrs), {
24773
26284
  as: __props.as,
24774
- renderless: __props.renderless,
24775
- onClick,
24776
- onKeydown
26285
+ renderless: __props.renderless
24777
26286
  }), {
24778
26287
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
24779
26288
  _: 3
@@ -25217,8 +26726,8 @@ const _sfc_main$149 = /* @__PURE__ */ defineComponent({
25217
26726
  const rootId = /* @__PURE__ */ useId();
25218
26727
  const step = createStep({
25219
26728
  disabled: toRef(() => __props.disabled),
25220
- enroll: __props.enroll,
25221
- mandatory: __props.mandatory,
26729
+ enroll: toRef(() => __props.enroll),
26730
+ mandatory: toRef(() => __props.mandatory),
25222
26731
  circular: __props.circular,
25223
26732
  events: true
25224
26733
  });
@@ -25313,7 +26822,7 @@ const _sfc_main$146 = /* @__PURE__ */ defineComponent({
25313
26822
  const ticket = tabs.register({
25314
26823
  id: __props.id,
25315
26824
  value: __props.value,
25316
- disabled: __props.disabled,
26825
+ disabled: () => toValue(__props.disabled) ?? false,
25317
26826
  el
25318
26827
  });
25319
26828
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(tabs.disabled));
@@ -25632,14 +27141,14 @@ const _sfc_main$151 = /* @__PURE__ */ defineComponent({
25632
27141
  const model = useModel(__props, "modelValue");
25633
27142
  const selection = __props.multiple ? createGroup({
25634
27143
  disabled: toRef(() => __props.disabled),
25635
- mandatory: __props.mandatory,
27144
+ mandatory: toRef(() => __props.mandatory),
25636
27145
  events: true
25637
27146
  }) : createSingle({
25638
27147
  disabled: toRef(() => __props.disabled),
25639
- mandatory: __props.mandatory,
27148
+ mandatory: toRef(() => __props.mandatory),
25640
27149
  events: true
25641
27150
  });
25642
- useProxyModel(selection, model, { multiple: __props.multiple });
27151
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
25643
27152
  provideToggleGroup(__props.namespace, {
25644
27153
  disabled: toRef(() => __props.disabled),
25645
27154
  orientation: toRef(() => __props.orientation),
@@ -25703,7 +27212,7 @@ const _sfc_main$153 = /* @__PURE__ */ defineComponent({
25703
27212
  const ticket = group?.selection.register({
25704
27213
  id: __props.id,
25705
27214
  value: __props.value,
25706
- disabled: __props.disabled
27215
+ disabled: () => toValue(__props.disabled) ?? false
25707
27216
  });
25708
27217
  const isPressed = toRef(() => ticket ? toValue(ticket.isSelected) : pressed.value);
25709
27218
  const isDisabled = toRef(() => group && ticket ? toValue(ticket.disabled) || toValue(group.disabled) : __props.disabled);
@@ -25742,15 +27251,15 @@ const _sfc_main$153 = /* @__PURE__ */ defineComponent({
25742
27251
  "aria-disabled": isDisabled.value,
25743
27252
  "tabindex": isDisabled.value ? void 0 : 0,
25744
27253
  "data-state": isPressed.value ? "on" : "off",
25745
- "data-disabled": isDisabled.value ? true : void 0
27254
+ "data-disabled": isDisabled.value ? true : void 0,
27255
+ "onClick": onClick,
27256
+ "onKeydown": onKeydown
25746
27257
  }
25747
27258
  }));
25748
27259
  return (_ctx, _cache) => {
25749
27260
  return openBlock(), createBlock(unref(_sfc_main$9), mergeProps(mergeProps(unref(attrs), slotProps.value.attrs), {
25750
27261
  as: __props.as,
25751
- renderless: __props.renderless,
25752
- onClick,
25753
- onKeydown
27262
+ renderless: __props.renderless
25754
27263
  }), {
25755
27264
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
25756
27265
  _: 3
@@ -25925,9 +27434,9 @@ const _sfc_main$162 = /* @__PURE__ */ defineComponent({
25925
27434
  const model = useModel(__props, "modelValue");
25926
27435
  const nested = createNested({
25927
27436
  disabled: toRef(() => __props.disabled),
25928
- enroll: __props.enroll,
25929
- mandatory: __props.mandatory,
25930
- multiple: __props.multiple,
27437
+ enroll: toRef(() => __props.enroll),
27438
+ mandatory: toRef(() => __props.mandatory),
27439
+ multiple: toRef(() => __props.multiple),
25931
27440
  open: __props.open,
25932
27441
  openAll: __props.openAll,
25933
27442
  reveal: __props.reveal,
@@ -25983,12 +27492,15 @@ const _sfc_main$161 = /* @__PURE__ */ defineComponent({
25983
27492
  if (match && roving.focusedId.value !== match.id) roving.focusedId.value = match.id;
25984
27493
  }
25985
27494
  function expandable(ticket) {
27495
+ /* v8 ignore next -- defensive: callers always pass a registered ticket */
25986
27496
  if (!ticket) return false;
25987
27497
  return (toValue(ticket.el)?.hasAttribute("aria-expanded") ?? false) || !toValue(ticket.isLeaf);
25988
27498
  }
25989
27499
  function isRtl(e) {
27500
+ /* v8 ignore next -- IN_BROWSER always true in happy-dom test env */
25990
27501
  if (!IN_BROWSER) return false;
25991
27502
  const el = e.currentTarget;
27503
+ /* v8 ignore next -- defensive: keydown handlers always have a currentTarget */
25992
27504
  return el ? getComputedStyle(el).direction === "rtl" : false;
25993
27505
  }
25994
27506
  function openOrChild(ticket) {
@@ -26057,6 +27569,7 @@ const _sfc_main$161 = /* @__PURE__ */ defineComponent({
26057
27569
  }
26058
27570
  const slotProps = toRef(() => ({ attrs: {
26059
27571
  "role": "tree",
27572
+ /* v8 ignore next -- nested.multiple fallback used when multiselectable prop is undefined */
26060
27573
  "aria-multiselectable": __props.multiselectable ?? nested.multiple,
26061
27574
  "aria-label": __props.label || void 0,
26062
27575
  onKeydown,
@@ -26095,7 +27608,7 @@ const _sfc_main$160 = /* @__PURE__ */ defineComponent({
26095
27608
  const ticket = nested.register({
26096
27609
  id: __props.id,
26097
27610
  value: __props.value,
26098
- disabled: __props.disabled,
27611
+ disabled: () => toValue(__props.disabled) ?? false,
26099
27612
  parentId,
26100
27613
  el
26101
27614
  });
@@ -26661,4 +28174,4 @@ const Treeview = {
26661
28174
  SelectAll: _sfc_main$163
26662
28175
  };
26663
28176
  //#endregion
26664
- export { AlertDialog, _sfc_main as AlertDialogAction, _sfc_main$1 as AlertDialogActivator, _sfc_main$2 as AlertDialogCancel, _sfc_main$3 as AlertDialogClose, _sfc_main$4 as AlertDialogContent, _sfc_main$5 as AlertDialogDescription, _sfc_main$6 as AlertDialogRoot, _sfc_main$7 as AlertDialogTitle, _sfc_main$8 as AspectRatio, _sfc_main$9 as Atom, Avatar, _sfc_main$10 as AvatarFallback, _sfc_main$11 as AvatarImage, _sfc_main$12 as AvatarRoot, Breadcrumbs, _sfc_main$13 as BreadcrumbsDivider, _sfc_main$14 as BreadcrumbsEllipsis, _sfc_main$15 as BreadcrumbsItem, _sfc_main$16 as BreadcrumbsLink, _sfc_main$17 as BreadcrumbsList, _sfc_main$18 as BreadcrumbsPage, _sfc_main$19 as BreadcrumbsRoot, Button, _sfc_main$20 as ButtonContent, _sfc_main$21 as ButtonGroup, _sfc_main$22 as ButtonHiddenInput, _sfc_main$23 as ButtonIcon, _sfc_main$24 as ButtonLoading, _sfc_main$25 as ButtonRoot, Carousel, _sfc_main$26 as CarouselIndicator, _sfc_main$27 as CarouselItem, _sfc_main$28 as CarouselLiveRegion, _sfc_main$29 as CarouselNext, _sfc_main$30 as CarouselPrevious, _sfc_main$31 as CarouselProgress, _sfc_main$32 as CarouselRoot, _sfc_main$33 as CarouselViewport, Checkbox, _sfc_main$34 as CheckboxGroup, _sfc_main$35 as CheckboxHiddenInput, _sfc_main$36 as CheckboxIndicator, _sfc_main$37 as CheckboxRoot, _sfc_main$38 as CheckboxSelectAll, ClientAdapter, Collapsible, _sfc_main$39 as CollapsibleActivator, _sfc_main$40 as CollapsibleContent, _sfc_main$41 as CollapsibleCue, _sfc_main$42 as CollapsibleRoot, Combobox, _sfc_main$43 as ComboboxActivator, ClientAdapter$1 as ComboboxClientAdapter, _sfc_main$44 as ComboboxContent, _sfc_main$45 as ComboboxControl, _sfc_main$46 as ComboboxCue, _sfc_main$47 as ComboboxDescription, _sfc_main$48 as ComboboxEmpty, _sfc_main$49 as ComboboxError, _sfc_main$50 as ComboboxItem, _sfc_main$51 as ComboboxRoot, ServerAdapter as ComboboxServerAdapter, ConsolaLoggerAdapter, DataTableAdapter, Dialog, _sfc_main$52 as DialogActivator, _sfc_main$53 as DialogClose, _sfc_main$54 as DialogContent, _sfc_main$55 as DialogDescription, _sfc_main$56 as DialogRoot, _sfc_main$57 as DialogTitle, ExpansionPanel, _sfc_main$58 as ExpansionPanelActivator, _sfc_main$59 as ExpansionPanelContent, _sfc_main$60 as ExpansionPanelCue, _sfc_main$61 as ExpansionPanelGroup, _sfc_main$62 as ExpansionPanelHeader, _sfc_main$63 as ExpansionPanelRoot, FeaturesAdapter, _sfc_main$64 as Form, Group, _sfc_main$65 as GroupItem, _sfc_main$66 as GroupRoot, IN_BROWSER, Image, _sfc_main$67 as ImageFallback, _sfc_main$68 as ImageImg, _sfc_main$69 as ImagePlaceholder, _sfc_main$70 as ImageRoot, Input, _sfc_main$71 as InputControl, _sfc_main$72 as InputDescription, _sfc_main$73 as InputError, _sfc_main$74 as InputRoot, _sfc_main$75 as Locale, MemoryAdapter, NumberField, _sfc_main$76 as NumberFieldControl, _sfc_main$77 as NumberFieldDecrement, _sfc_main$78 as NumberFieldDescription, _sfc_main$79 as NumberFieldError, _sfc_main$80 as NumberFieldIncrement, _sfc_main$81 as NumberFieldRoot, _sfc_main$82 as NumberFieldScrub, Overflow, _sfc_main$83 as OverflowIndicator, _sfc_main$84 as OverflowItem, _sfc_main$85 as OverflowRoot, Pagination, _sfc_main$86 as PaginationEllipsis, _sfc_main$87 as PaginationFirst, _sfc_main$88 as PaginationItem, _sfc_main$89 as PaginationLast, _sfc_main$90 as PaginationNext, _sfc_main$91 as PaginationPrev, _sfc_main$92 as PaginationRoot, _sfc_main$93 as PaginationStatus, PermissionAdapter, PinoLoggerAdapter, Popover, _sfc_main$94 as PopoverActivator, _sfc_main$95 as PopoverContent, _sfc_main$96 as PopoverRoot, _sfc_main$97 as Portal, _sfc_main$98 as Presence, Progress, _sfc_main$99 as ProgressBuffer, _sfc_main$100 as ProgressFill, _sfc_main$101 as ProgressHiddenInput, _sfc_main$102 as ProgressLabel, _sfc_main$103 as ProgressRoot, _sfc_main$104 as ProgressTrack, _sfc_main$105 as ProgressValue, Radio, _sfc_main$106 as RadioGroup, _sfc_main$107 as RadioHiddenInput, _sfc_main$108 as RadioIndicator, _sfc_main$109 as RadioRoot, Rating, _sfc_main$110 as RatingHiddenInput, _sfc_main$111 as RatingItem, _sfc_main$112 as RatingRoot, SELF_CLOSING_TAGS, SUPPORTS_INTERSECTION_OBSERVER, SUPPORTS_MATCH_MEDIA, SUPPORTS_MUTATION_OBSERVER, SUPPORTS_OBSERVER, SUPPORTS_TOUCH, _sfc_main$113 as Scrim, Select, _sfc_main$114 as SelectActivator, _sfc_main$115 as SelectContent, _sfc_main$116 as SelectCue, _sfc_main$117 as SelectItem, _sfc_main$118 as SelectPlaceholder, _sfc_main$119 as SelectRoot, _sfc_main$120 as SelectValue, Selection, _sfc_main$121 as SelectionItem, _sfc_main$122 as SelectionRoot, ServerAdapter$1 as ServerAdapter, Single, _sfc_main$123 as SingleItem, _sfc_main$124 as SingleRoot, Slider, _sfc_main$125 as SliderHiddenInput, _sfc_main$126 as SliderRange, _sfc_main$127 as SliderRoot, _sfc_main$128 as SliderThumb, _sfc_main$129 as SliderTrack, Snackbar, _sfc_main$130 as SnackbarClose, _sfc_main$131 as SnackbarContent, _sfc_main$132 as SnackbarPortal, _sfc_main$133 as SnackbarQueue, _sfc_main$134 as SnackbarRoot, Splitter, _sfc_main$135 as SplitterHandle, _sfc_main$136 as SplitterPanel, _sfc_main$137 as SplitterRoot, Step, _sfc_main$138 as StepItem, _sfc_main$139 as StepRoot, Switch, _sfc_main$140 as SwitchGroup, _sfc_main$141 as SwitchHiddenInput, _sfc_main$142 as SwitchRoot, _sfc_main$143 as SwitchSelectAll, _sfc_main$144 as SwitchThumb, _sfc_main$145 as SwitchTrack, Tabs, _sfc_main$146 as TabsItem, _sfc_main$147 as TabsList, _sfc_main$148 as TabsPanel, _sfc_main$149 as TabsRoot, _sfc_main$150 as Theme, Toggle, _sfc_main$151 as ToggleGroup, _sfc_main$152 as ToggleIndicator, _sfc_main$153 as ToggleRoot, Treeview, _sfc_main$154 as TreeviewActivator, _sfc_main$155 as TreeviewCheckbox, _sfc_main$156 as TreeviewContent, _sfc_main$157 as TreeviewCue, _sfc_main$158 as TreeviewGroup, _sfc_main$159 as TreeviewIndicator, _sfc_main$160 as TreeviewItem, _sfc_main$161 as TreeviewList, _sfc_main$162 as TreeviewRoot, _sfc_main$163 as TreeviewSelectAll, V0StyleSheetThemeAdapter, V0UnheadThemeAdapter, VirtualAdapter, Vuetify0LocaleAdapter, Vuetify0LoggerAdapter, Vuetify0RtlAdapter, __LOGGER_ENABLED__, apca, clamp, computeDepth, createBreadcrumbs, createBreadcrumbsContext, createBreakpoints, createBreakpointsContext, createBreakpointsPlugin, createCombobox, createComboboxContext, createContext, createDataTable, createDataTableContext, createDate, createDateContext, createDatePlugin, createFallbackHydration, createFeatures, createFeaturesContext, createFeaturesPlugin, createFilter, createFilterContext, createForm, createFormContext, createGroup, createGroupContext, createHydration, createHydrationContext, createHydrationPlugin, createInput, createLocale, createLocaleContext, createLocaleFallback, createLocalePlugin, createLogger, createLoggerContext, createLoggerPlugin, createModel, createNested, createNestedContext, createNotifications, createNotificationsContext, createNotificationsPlugin, createNumberField, createNumeric, createOverflow, createOverflowContext, createPagination, createPaginationContext, createPermissions, createPermissionsContext, createPermissionsPlugin, createPlugin, createPluginContext, createProgress, createProgressContext, createQueue, createQueueContext, createRating, createRatingContext, createRegistry, createRegistryContext, createRtl, createRtlContext, createRtlFallback, createRtlPlugin, createRules, createRulesContext, createRulesFallback, createRulesPlugin, createSelection, createSelectionContext, createSingle, createSingleContext, createSlider, createStack, createStackContext, createStackPlugin, createStep, createStepContext, createStorage, createStorageContext, createStoragePlugin, createTheme, createThemeContext, createThemePlugin, createTimeline, createTimelineContext, createTokens, createTokensContext, createTrinity, createValidation, createVirtual, createVirtualContext, extractLeaves, flatten, foreground, hexToRgb, instanceExists, instanceName, isArray, isBoolean, isElement, isFunction, isNaN, isNull, isNullOrUndefined, isNumber, isObject, isPrimitive, isSelfClosingTag, isStandardSchema, isString, isSymbol, isUndefined, mergeDeep, provideAlertDialogContext, provideAvatarRoot, provideBreadcrumbsRoot, provideButtonGroup, provideButtonRoot, provideCarouselRoot, provideCheckboxGroup, provideCheckboxRoot, provideCollapsible, provideComboboxContext, provideContext, provideDialogContext, provideExpansionPanelGroup, provideExpansionPanelRoot, provideGroupRoot, provideImageRoot, provideInputRoot, provideNumberFieldRoot, provideOverflowRoot, providePaginationControls, providePaginationItems, providePaginationRoot, providePopoverContext, provideProgressRoot, provideRadioGroup, provideRadioRoot, provideRatingRoot, provideSelectContext, provideSelectionRoot, provideSingleRoot, provideSliderRoot, provideSnackbarQueueContext, provideSnackbarRootContext, provideSplitterRoot, provideStepRoot, provideSwitchGroup, provideSwitchRoot, provideTabsRoot, provideToggleGroup, provideToggleRoot, provideTreeviewItem, provideTreeviewList, provideTreeviewRoot, range, resolveHeaders, resolveIds, resolveIndexes, rgbToHex, toArray, toElement, toReactive, useAlertDialogContext, useAvatarRoot, useBreadcrumbs, useBreadcrumbsRoot, useBreakpoints, useButtonGroup, useButtonRoot, useCarouselRoot, useCheckboxGroup, useCheckboxRoot, useClickOutside, useCollapsible, useCombobox, useComboboxContext, useContext, useDataTable, useDate, useDelay, useDialogContext, useDocumentEventListener, useElementIntersection, useElementSize, useEventListener, useExpansionPanelGroup, useExpansionPanelRoot, useFeatures, useFilter, useForm, useGroup, useGroupRoot, useHotkey, useHydration, useId, useImage, useImageRoot, useInputRoot, useIntersectionObserver, useLazy, useLocale, useLogger, useMediaQuery, useMutationObserver, useNested, useNotifications, useNumberFieldRoot, useOverflow, useOverflowRoot, usePagination, usePaginationControls, usePaginationItems, usePaginationRoot, usePermissions, usePopover, usePopoverContext, usePrefersContrast, usePrefersDark, usePrefersReducedMotion, usePresence, useProgress, useProgressRoot, useProxyModel, useProxyRegistry, useQueue, useRadioGroup, useRadioRoot, useRaf, useRating, useRatingRoot, useRegistry, useResizeObserver, useRovingFocus, useRtl, useRules, useSelectContext, useSelection, useSelectionRoot, useSingle, useSingleRoot, useSliderRoot, useSnackbarQueueContext, useSnackbarRootContext, useSplitterRoot, useStack, useStep, useStepRoot, useStorage, useSwitchGroup, useSwitchRoot, useTabsRoot, useTheme, useTimeline, useTimer, useToggleGroup, useToggleRoot, useToggleScope, useTokens, useTreeviewItem, useTreeviewList, useTreeviewRoot, useVirtual, useVirtualFocus, useWindowEventListener, version };
28177
+ export { AlertDialog, _sfc_main as AlertDialogAction, _sfc_main$1 as AlertDialogActivator, _sfc_main$2 as AlertDialogCancel, _sfc_main$3 as AlertDialogClose, _sfc_main$4 as AlertDialogContent, _sfc_main$5 as AlertDialogDescription, _sfc_main$6 as AlertDialogRoot, _sfc_main$7 as AlertDialogTitle, _sfc_main$8 as AspectRatio, _sfc_main$9 as Atom, Avatar, _sfc_main$10 as AvatarFallback, _sfc_main$11 as AvatarImage, _sfc_main$12 as AvatarRoot, Breadcrumbs, _sfc_main$13 as BreadcrumbsDivider, _sfc_main$14 as BreadcrumbsEllipsis, _sfc_main$15 as BreadcrumbsItem, _sfc_main$16 as BreadcrumbsLink, _sfc_main$17 as BreadcrumbsList, _sfc_main$18 as BreadcrumbsPage, _sfc_main$19 as BreadcrumbsRoot, Button, _sfc_main$20 as ButtonContent, _sfc_main$21 as ButtonGroup, _sfc_main$22 as ButtonHiddenInput, _sfc_main$23 as ButtonIcon, _sfc_main$24 as ButtonLoading, _sfc_main$25 as ButtonRoot, Carousel, _sfc_main$26 as CarouselIndicator, _sfc_main$27 as CarouselItem, _sfc_main$28 as CarouselLiveRegion, _sfc_main$29 as CarouselNext, _sfc_main$30 as CarouselPrevious, _sfc_main$31 as CarouselProgress, _sfc_main$32 as CarouselRoot, _sfc_main$33 as CarouselViewport, Checkbox, _sfc_main$34 as CheckboxGroup, _sfc_main$35 as CheckboxHiddenInput, _sfc_main$36 as CheckboxIndicator, _sfc_main$37 as CheckboxRoot, _sfc_main$38 as CheckboxSelectAll, ClientComboboxAdapter, ClientDataTableAdapter, Collapsible, _sfc_main$39 as CollapsibleActivator, _sfc_main$40 as CollapsibleContent, _sfc_main$41 as CollapsibleCue, _sfc_main$42 as CollapsibleRoot, Combobox, _sfc_main$43 as ComboboxActivator, ComboboxAdapter, _sfc_main$44 as ComboboxContent, _sfc_main$45 as ComboboxControl, _sfc_main$46 as ComboboxCue, _sfc_main$47 as ComboboxDescription, _sfc_main$48 as ComboboxEmpty, _sfc_main$49 as ComboboxError, _sfc_main$50 as ComboboxItem, _sfc_main$51 as ComboboxRoot, ConsolaLoggerAdapter, DataTableAdapter, Dialog, _sfc_main$52 as DialogActivator, _sfc_main$53 as DialogClose, _sfc_main$54 as DialogContent, _sfc_main$55 as DialogDescription, _sfc_main$56 as DialogRoot, _sfc_main$57 as DialogTitle, DragDropAdapter, ExpansionPanel, _sfc_main$58 as ExpansionPanelActivator, _sfc_main$59 as ExpansionPanelContent, _sfc_main$60 as ExpansionPanelCue, _sfc_main$61 as ExpansionPanelGroup, _sfc_main$62 as ExpansionPanelHeader, _sfc_main$63 as ExpansionPanelRoot, FeaturesAdapter, _sfc_main$64 as Form, Group, _sfc_main$65 as GroupItem, _sfc_main$66 as GroupRoot, IN_BROWSER, Image, _sfc_main$67 as ImageFallback, _sfc_main$68 as ImageImg, _sfc_main$69 as ImagePlaceholder, _sfc_main$70 as ImageRoot, Input, _sfc_main$71 as InputControl, _sfc_main$72 as InputDescription, _sfc_main$73 as InputError, _sfc_main$74 as InputRoot, KeyboardAdapter, _sfc_main$75 as Locale, LocaleAdapter, LoggerAdapter, MemoryStorageAdapter, NumberField, _sfc_main$76 as NumberFieldControl, _sfc_main$77 as NumberFieldDecrement, _sfc_main$78 as NumberFieldDescription, _sfc_main$79 as NumberFieldError, _sfc_main$80 as NumberFieldIncrement, _sfc_main$81 as NumberFieldRoot, _sfc_main$82 as NumberFieldScrub, Overflow, _sfc_main$83 as OverflowIndicator, _sfc_main$84 as OverflowItem, _sfc_main$85 as OverflowRoot, Pagination, _sfc_main$86 as PaginationEllipsis, _sfc_main$87 as PaginationFirst, _sfc_main$88 as PaginationItem, _sfc_main$89 as PaginationLast, _sfc_main$90 as PaginationNext, _sfc_main$91 as PaginationPrev, _sfc_main$92 as PaginationRoot, _sfc_main$93 as PaginationStatus, PermissionsAdapter, PinoLoggerAdapter, PointerAdapter, Popover, _sfc_main$94 as PopoverActivator, _sfc_main$95 as PopoverContent, _sfc_main$96 as PopoverRoot, _sfc_main$97 as Portal, _sfc_main$98 as Presence, Progress, _sfc_main$99 as ProgressBuffer, _sfc_main$100 as ProgressFill, _sfc_main$101 as ProgressHiddenInput, _sfc_main$102 as ProgressLabel, _sfc_main$103 as ProgressRoot, _sfc_main$104 as ProgressTrack, _sfc_main$105 as ProgressValue, Radio, _sfc_main$106 as RadioGroup, _sfc_main$107 as RadioHiddenInput, _sfc_main$108 as RadioIndicator, _sfc_main$109 as RadioRoot, Rating, _sfc_main$110 as RatingHiddenInput, _sfc_main$111 as RatingItem, _sfc_main$112 as RatingRoot, SELF_CLOSING_TAGS, SUPPORTS_INTERSECTION_OBSERVER, SUPPORTS_MATCH_MEDIA, SUPPORTS_MUTATION_OBSERVER, SUPPORTS_OBSERVER, SUPPORTS_TOUCH, _sfc_main$113 as Scrim, Select, _sfc_main$114 as SelectActivator, _sfc_main$115 as SelectContent, _sfc_main$116 as SelectCue, _sfc_main$117 as SelectItem, _sfc_main$118 as SelectPlaceholder, _sfc_main$119 as SelectRoot, _sfc_main$120 as SelectValue, Selection, _sfc_main$121 as SelectionItem, _sfc_main$122 as SelectionRoot, ServerComboboxAdapter, ServerDataTableAdapter, Single, _sfc_main$123 as SingleItem, _sfc_main$124 as SingleRoot, Slider, _sfc_main$125 as SliderHiddenInput, _sfc_main$126 as SliderRange, _sfc_main$127 as SliderRoot, _sfc_main$128 as SliderThumb, _sfc_main$129 as SliderTrack, Snackbar, _sfc_main$130 as SnackbarClose, _sfc_main$131 as SnackbarContent, _sfc_main$132 as SnackbarPortal, _sfc_main$133 as SnackbarQueue, _sfc_main$134 as SnackbarRoot, Splitter, _sfc_main$135 as SplitterHandle, _sfc_main$136 as SplitterPanel, _sfc_main$137 as SplitterRoot, Step, _sfc_main$138 as StepItem, _sfc_main$139 as StepRoot, StorageAdapter, Switch, _sfc_main$140 as SwitchGroup, _sfc_main$141 as SwitchHiddenInput, _sfc_main$142 as SwitchRoot, _sfc_main$143 as SwitchSelectAll, _sfc_main$144 as SwitchThumb, _sfc_main$145 as SwitchTrack, Tabs, _sfc_main$146 as TabsItem, _sfc_main$147 as TabsList, _sfc_main$148 as TabsPanel, _sfc_main$149 as TabsRoot, _sfc_main$150 as Theme, Toggle, _sfc_main$151 as ToggleGroup, _sfc_main$152 as ToggleIndicator, _sfc_main$153 as ToggleRoot, Treeview, _sfc_main$154 as TreeviewActivator, _sfc_main$155 as TreeviewCheckbox, _sfc_main$156 as TreeviewContent, _sfc_main$157 as TreeviewCue, _sfc_main$158 as TreeviewGroup, _sfc_main$159 as TreeviewIndicator, _sfc_main$160 as TreeviewItem, _sfc_main$161 as TreeviewList, _sfc_main$162 as TreeviewRoot, _sfc_main$163 as TreeviewSelectAll, V0LocaleAdapter, V0LoggerAdapter, V0RtlAdapter, V0StyleSheetThemeAdapter, V0UnheadThemeAdapter, VirtualDataTableAdapter, __LOGGER_ENABLED__, apca, clamp, computeDepth, createBreadcrumbs, createBreadcrumbsContext, createBreakpoints, createBreakpointsContext, createBreakpointsPlugin, createCombobox, createComboboxContext, createContext, createDataTable, createDataTableContext, createDate, createDateContext, createDatePlugin, createFallbackHydration, createFeatures, createFeaturesContext, createFeaturesPlugin, createFilter, createFilterContext, createForm, createFormContext, createGroup, createGroupContext, createHydration, createHydrationContext, createHydrationPlugin, createInput, createKanban, createLocale, createLocaleContext, createLocaleFallback, createLocalePlugin, createLogger, createLoggerContext, createLoggerPlugin, createModel, createNested, createNestedContext, createNotifications, createNotificationsContext, createNotificationsPlugin, createNumberField, createNumeric, createOtp, createOverflow, createOverflowContext, createPagination, createPaginationContext, createPermissions, createPermissionsContext, createPermissionsPlugin, createPlugin, createPluginContext, createProgress, createProgressContext, createQueue, createQueueContext, createRating, createRatingContext, createRegistry, createRegistryContext, createRtl, createRtlContext, createRtlFallback, createRtlPlugin, createRules, createRulesContext, createRulesFallback, createRulesPlugin, createSelection, createSelectionContext, createSingle, createSingleContext, createSlider, createSortable, createStack, createStackContext, createStackPlugin, createStep, createStepContext, createStorage, createStorageContext, createStoragePlugin, createTheme, createThemeContext, createThemePlugin, createTimeline, createTimelineContext, createTokens, createTokensContext, createTrinity, createValidation, createVirtual, createVirtualContext, extractLeaves, flatten, foreground, hexToRgb, instanceExists, instanceName, isArray, isBoolean, isElement, isFunction, isNaN, isNull, isNullOrUndefined, isNumber, isObject, isPrimitive, isSelfClosingTag, isStandardSchema, isString, isSymbol, isThenable, isUndefined, mergeDeep, provideAlertDialogContext, provideAvatarRoot, provideBreadcrumbsRoot, provideButtonGroup, provideButtonRoot, provideCarouselRoot, provideCheckboxGroup, provideCheckboxRoot, provideCollapsible, provideComboboxContext, provideContext, provideDialogContext, provideExpansionPanelGroup, provideExpansionPanelRoot, provideGroupRoot, provideImageRoot, provideInputRoot, provideNumberFieldRoot, provideOverflowRoot, providePaginationControls, providePaginationItems, providePaginationRoot, providePopoverContext, provideProgressRoot, provideRadioGroup, provideRadioRoot, provideRatingRoot, provideSelectContext, provideSelectionRoot, provideSingleRoot, provideSliderRoot, provideSnackbarQueueContext, provideSnackbarRootContext, provideSplitterRoot, provideStepRoot, provideSwitchGroup, provideSwitchRoot, provideTabsRoot, provideToggleGroup, provideToggleRoot, provideTreeviewItem, provideTreeviewList, provideTreeviewRoot, range, resolveHeaders, resolveIds, resolveIndexes, rgbToHex, toArray, toElement, toHighlight, toReactive, useAlertDialogContext, useAvatarRoot, useBreadcrumbs, useBreadcrumbsRoot, useBreakpoints, useButtonGroup, useButtonRoot, useCarouselRoot, useCheckboxGroup, useCheckboxRoot, useClickOutside, useCollapsible, useCombobox, useComboboxContext, useContext, useDataTable, useDate, useDelay, useDialogContext, useDocumentEventListener, useDragDrop, useElementIntersection, useElementSize, useEventListener, useExpansionPanelGroup, useExpansionPanelRoot, useFeatures, useFilter, useForm, useGroup, useGroupRoot, useHotkey, useHydration, useId, useImage, useImageRoot, useInputRoot, useIntersectionObserver, useLazy, useLocale, useLogger, useMediaQuery, useMutationObserver, useNested, useNotifications, useNumberFieldRoot, useOverflow, useOverflowRoot, usePagination, usePaginationControls, usePaginationItems, usePaginationRoot, usePermissions, usePopover, usePopoverContext, usePrefersContrast, usePrefersDark, usePrefersReducedMotion, usePresence, useProgress, useProgressRoot, useProxyModel, useProxyRegistry, useQueue, useRadioGroup, useRadioRoot, useRaf, useRating, useRatingRoot, useRegistry, useResizeObserver, useRovingFocus, useRtl, useRules, useSelectContext, useSelection, useSelectionRoot, useSingle, useSingleRoot, useSliderRoot, useSnackbarQueueContext, useSnackbarRootContext, useSplitterRoot, useStack, useStep, useStepRoot, useStorage, useSwitchGroup, useSwitchRoot, useTabsRoot, useTheme, useTimeline, useTimer, useToggleGroup, useToggleRoot, useToggleScope, useTokens, useTreeviewItem, useTreeviewList, useTreeviewRoot, useVirtual, useVirtualFocus, useWindowEventListener, version };