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

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 (169) hide show
  1. package/README.md +3 -0
  2. package/dist/adapter-BSKx9WQ7.mjs +4 -0
  3. package/dist/{index-CT5SCLzW.d.mts → adapter-C6JmOyYo.d.mts} +6 -9
  4. package/dist/{adapter-gQ2SNKZq.mjs → adapter-C9cR4AcY.mjs} +248 -5
  5. package/dist/adapter-Chznb9Ju.mjs +4 -0
  6. package/dist/{adapter-DlX3FA3A.d.mts → adapter-Cr7Bl4la.d.mts} +3 -7
  7. package/dist/adapter-D8zizQVP.mjs +4 -0
  8. package/dist/adapter-DgBBe_BW.d.mts +17 -0
  9. package/dist/adapter-Dzyrlbz7.d.mts +98 -0
  10. package/dist/adapter-o8r-2vUn.d.mts +11 -0
  11. package/dist/adapters-B25KaYU4.mjs +2 -0
  12. package/dist/adapters-BcddLSNs.mjs +4 -0
  13. package/dist/adapters-D64TORDu.mjs +2 -0
  14. package/dist/adapters-Dv74Jk6A.mjs +5 -0
  15. package/dist/adapters-t6QC-zE8.mjs +3 -0
  16. package/dist/browser/index.js +1510 -388
  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-BWxMSWr7.mjs} +138 -90
  20. package/dist/composables/index.d.mts +19 -19
  21. package/dist/composables/index.mjs +31 -29
  22. package/dist/{consola-BdgyPEfx.d.mts → consola-Crr4qbeI.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-DDr2yY-A.mjs} +30 -29
  27. package/dist/{createGroup-CGk6hY_Y.mjs → createGroup-BSGtfBUE.mjs} +3 -3
  28. package/dist/{createRegistry-BXzdXAjq.mjs → createRegistry-Db_juawd.mjs} +78 -41
  29. package/dist/{createSelection-B3HJEPNg.mjs → createSelection-BeKZMxha.mjs} +3 -3
  30. package/dist/{createSingle-Dql8mRi-.mjs → createSingle-Dms2efxr.mjs} +1 -1
  31. package/dist/{createTokens-DgFYsOrv.mjs → createTokens-B1lwHZvO.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 +11 -4
  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/{flagsmith-Dbh1h8WF.mjs → flagsmith-Cu93hUIF.mjs} +6 -4
  53. package/dist/{index-BzFHTW59.d.mts → flagsmith-ygKMImos.d.mts} +4 -4
  54. package/dist/{globals-zEjWBKCr.mjs → globals-BAe6tA_x.mjs} +1 -1
  55. package/dist/{index-GOpjKzaJ.d.mts → index-B3-FstpY.d.mts} +25 -2
  56. package/dist/{index-BJGcVy7e.d.mts → index-BA7YU2xY.d.mts} +5 -5
  57. package/dist/{index-B76iGRE3.d.mts → index-BfpLkDR_.d.mts} +949 -59
  58. package/dist/{index-DE3bWw11.d.mts → index-Cw04PFVO.d.mts} +92 -48
  59. package/dist/index-DewYtDsc.d.mts +4 -0
  60. package/dist/{index-DNDuacmH.d.mts → index-jQPkwo3G.d.mts} +15 -5
  61. package/dist/index.d.mts +23 -23
  62. package/dist/index.mjs +35 -33
  63. package/dist/json/attributes.json +1 -1
  64. package/dist/json/web-types.json +2 -2
  65. package/dist/launchdarkly-BJR4vbbV.d.mts +13 -0
  66. package/dist/{launchdarkly-BKtW-idu.mjs → launchdarkly-CLGtJCsI.mjs} +6 -4
  67. package/dist/locale/adapters/index.d.mts +3 -3
  68. package/dist/locale/adapters/index.mjs +4 -3
  69. package/dist/locale/adapters/v0/index.d.mts +2 -2
  70. package/dist/locale/adapters/v0/index.mjs +2 -2
  71. package/dist/locale/adapters/vue-i18n/index.d.mts +3 -3
  72. package/dist/locale/adapters/vue-i18n/index.mjs +4 -2
  73. package/dist/locale/index.d.mts +4 -4
  74. package/dist/locale/index.mjs +4 -3
  75. package/dist/logger/adapters/consola/index.d.mts +1 -1
  76. package/dist/logger/adapters/consola/index.mjs +1 -1
  77. package/dist/logger/adapters/index.d.mts +5 -5
  78. package/dist/logger/adapters/index.mjs +6 -5
  79. package/dist/logger/adapters/pino/index.d.mts +1 -1
  80. package/dist/logger/adapters/pino/index.mjs +1 -1
  81. package/dist/logger/adapters/v0/index.d.mts +2 -2
  82. package/dist/logger/adapters/v0/index.mjs +2 -2
  83. package/dist/logger/index.d.mts +6 -6
  84. package/dist/logger/index.mjs +6 -5
  85. package/dist/{memory-CeSQE-QV.d.mts → memory-B0w39kno.d.mts} +9 -9
  86. package/dist/{memory-oYBvtkgx.mjs → memory-BMpJcQjQ.mjs} +13 -3
  87. package/dist/notifications/index.d.mts +30 -4
  88. package/dist/notifications/index.mjs +187 -126
  89. package/dist/palettes/ant/index.d.mts +1 -1
  90. package/dist/palettes/index.d.mts +3 -3
  91. package/dist/palettes/leonardo/generate/index.mjs +3 -0
  92. package/dist/palettes/material/index.d.mts +1 -1
  93. package/dist/palettes/md1/index.d.mts +1 -1
  94. package/dist/palettes/md2/index.d.mts +1 -1
  95. package/dist/palettes/radix/index.d.mts +1 -1
  96. package/dist/palettes/tailwind/index.d.mts +1 -1
  97. package/dist/permissions/adapters/index.d.mts +2 -2
  98. package/dist/permissions/adapters/index.mjs +3 -3
  99. package/dist/permissions/adapters/v0/index.d.mts +2 -2
  100. package/dist/permissions/adapters/v0/index.mjs +2 -2
  101. package/dist/permissions/index.d.mts +2 -2
  102. package/dist/permissions/index.mjs +3 -3
  103. package/dist/{pino-9L79n6y6.mjs → pino-CIcYlW3u.mjs} +3 -1
  104. package/dist/{pino-DNfCEb0p.d.mts → pino-NmR7X0s4.d.mts} +2 -2
  105. package/dist/{posthog-DmuyycaR.mjs → posthog-B3go2aCh.mjs} +7 -5
  106. package/dist/posthog-CQntUXFO.d.mts +13 -0
  107. package/dist/rules/index.d.mts +1 -1
  108. package/dist/rules/index.mjs +1 -1
  109. package/dist/{server-3ilWFwqe.d.mts → server-DQK305lc.d.mts} +5 -5
  110. package/dist/{server-y7zLSCSx.mjs → server-ZFXbgQoY.mjs} +4 -3
  111. package/dist/storage/adapters/index.d.mts +3 -3
  112. package/dist/storage/adapters/index.mjs +2 -2
  113. package/dist/storage/adapters/memory/index.d.mts +2 -2
  114. package/dist/storage/adapters/memory/index.mjs +2 -2
  115. package/dist/storage/index.d.mts +4 -4
  116. package/dist/storage/index.mjs +3 -3
  117. package/dist/theme/adapters/index.d.mts +2 -2
  118. package/dist/theme/adapters/index.mjs +4 -4
  119. package/dist/theme/adapters/unhead/index.d.mts +1 -1
  120. package/dist/theme/adapters/unhead/index.mjs +1 -1
  121. package/dist/theme/adapters/v0/index.d.mts +1 -1
  122. package/dist/theme/adapters/v0/index.mjs +1 -1
  123. package/dist/theme/index.d.mts +1 -1
  124. package/dist/theme/index.mjs +3 -3
  125. package/dist/types/index.d.mts +1 -1
  126. package/dist/{unhead-B-I2OS6i.mjs → unhead-dPyVkgiJ.mjs} +2 -2
  127. package/dist/{useClickOutside-CY4U2J9W.mjs → useClickOutside-B8naChaQ.mjs} +1224 -228
  128. package/dist/{useFeatures-BPOke6iP.mjs → useFeatures-x2iKp0C8.mjs} +7 -10
  129. package/dist/{useLocale-BV8e3imF.mjs → useLocale-BUms59Bw.mjs} +6 -6
  130. package/dist/{useLogger-DvdRTrqC.mjs → useLogger-DPSSa-YR.mjs} +4 -4
  131. package/dist/{useNotifications-vSJE6z6t.mjs → useNotifications-BPTmZWQy.mjs} +4 -4
  132. package/dist/{usePermissions-D3zPwKQc.mjs → usePermissions-CTi-3pBk.mjs} +6 -6
  133. package/dist/{useRules-BT6cgoTj.mjs → useRules-DNhljkyO.mjs} +2 -2
  134. package/dist/{useTheme-cUZb2A9O.mjs → useTheme-3vW3kFNg.mjs} +5 -5
  135. package/dist/utilities/index.d.mts +2 -2
  136. package/dist/utilities/index.mjs +26 -2
  137. package/dist/{v0-DrOub-e1.d.mts → v0-CRGArJim.d.mts} +4 -4
  138. package/dist/{v0-C49OI_wc.mjs → v0-CotC1PiS.mjs} +5 -3
  139. package/dist/{v0-Dq3zhexO.mjs → v0-DAlKpCR8.mjs} +3 -4
  140. package/dist/{v0-D7Fm2C3Y.d.mts → v0-DDELiSI6.d.mts} +3 -3
  141. package/dist/v0-DYsCJPIu.d.mts +8 -0
  142. package/dist/{v0-gpExNexS.mjs → v0-DadOcxFI.mjs} +2 -2
  143. package/dist/{v0-Bmow1q_x.mjs → v0-Dvu8fMl3.mjs} +3 -3
  144. package/dist/{v0-CHZpnMeP.mjs → v0-YJQoTLsp.mjs} +6 -4
  145. package/dist/virtual-BqCRw0ly.d.mts +8 -0
  146. package/dist/{virtual-C0yHf1DC.mjs → virtual-Dnno49F8.mjs} +3 -4
  147. package/package.json +1 -1
  148. package/dist/adapter-58IvIfAZ.d.mts +0 -96
  149. package/dist/adapter-BvWEd9w-.d.mts +0 -17
  150. package/dist/adapter-Dhq68tz0.d.mts +0 -11
  151. package/dist/adapters-BSiqsTZN.mjs +0 -3
  152. package/dist/adapters-C3QXhf4I.mjs +0 -2
  153. package/dist/adapters-CMJGA1k7.mjs +0 -2
  154. package/dist/adapters-Dse4bPxk.mjs +0 -5
  155. package/dist/adapters-_ZqxCD8f.mjs +0 -4
  156. package/dist/createPagination-CHF7SmmK.mjs +0 -247
  157. package/dist/index-1XdASTjp.d.mts +0 -13
  158. package/dist/index-C6rdXZ7j.d.mts +0 -11
  159. package/dist/index-Dp1HjBxJ.d.mts +0 -13
  160. package/dist/v0-CdusXjY_.d.mts +0 -8
  161. package/dist/virtual-D4fckewC.d.mts +0 -8
  162. /package/dist/{adapter-Be9zUc-n.mjs → adapter-oM18AdUc.mjs} +0 -0
  163. /package/dist/{htmlElements-D4oMQZPJ.mjs → htmlElements-CHXZfsZu.mjs} +0 -0
  164. /package/dist/{index-CFhUdAHM.d.mts → index-CKKoxA9V.d.mts} +0 -0
  165. /package/dist/{index-DuddF-NR.d.mts → index-CLR1QMM3.d.mts} +0 -0
  166. /package/dist/{index-BgCkepP_.d.mts → index-DJQwYeyx.d.mts} +0 -0
  167. /package/dist/{index-CROz1VSV.d.mts → index-DWfPppPU.d.mts} +0 -0
  168. /package/dist/{index-DTvqw22G.d.mts → index-H_hl6-4b.d.mts} +0 -0
  169. /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.4";
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
  /**
@@ -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;
@@ -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);
@@ -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);
@@ -4965,7 +5037,7 @@ var VirtualAdapter = class extends DataTableAdapter {
4965
5037
  * ```
4966
5038
  */
4967
5039
  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;
5040
+ 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 ClientDataTableAdapter() } = options;
4969
5041
  const _query = shallowRef("");
4970
5042
  function search(value) {
4971
5043
  _query.value = value;
@@ -5191,6 +5263,28 @@ function createDataTable(options) {
5191
5263
  });
5192
5264
  }
5193
5265
  }
5266
+ const grouping = {
5267
+ groups,
5268
+ toggle(groupKey) {
5269
+ if (opened.has(groupKey)) opened.delete(groupKey);
5270
+ else opened.add(groupKey);
5271
+ },
5272
+ isOpen(groupKey) {
5273
+ return opened.has(groupKey);
5274
+ },
5275
+ open(groupKey) {
5276
+ opened.add(groupKey);
5277
+ },
5278
+ close(groupKey) {
5279
+ opened.delete(groupKey);
5280
+ },
5281
+ openAll() {
5282
+ for (const group of groups.value) opened.add(group.key);
5283
+ },
5284
+ closeAll() {
5285
+ opened.clear();
5286
+ }
5287
+ };
5194
5288
  return {
5195
5289
  items: visible,
5196
5290
  allItems,
@@ -5200,33 +5294,12 @@ function createDataTable(options) {
5200
5294
  leaves,
5201
5295
  headers,
5202
5296
  search,
5203
- query: _query,
5297
+ query: shallowReadonly(_query),
5204
5298
  sort,
5205
5299
  pagination,
5206
5300
  selection,
5207
5301
  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
- },
5302
+ grouping,
5230
5303
  total,
5231
5304
  loading,
5232
5305
  error
@@ -5829,6 +5902,327 @@ function createInput(options) {
5829
5902
  };
5830
5903
  }
5831
5904
  //#endregion
5905
+ //#region src/composables/createSortable/index.ts
5906
+ /**
5907
+ * @module createSortable
5908
+ *
5909
+ * @see https://0.vuetifyjs.com/composables/data/create-sortable
5910
+ *
5911
+ * @remarks
5912
+ * Headless ordered-list primitive. Extends `createModel` with mutation primitives
5913
+ * (`swap`, `reorder`) and an enriched `move:ticket` event on the registry event
5914
+ * bus. Honors `disabled` as a real mutation gate at both root and per-ticket scope.
5915
+ *
5916
+ * Pure logical composable — no DnD, no DOM, no keyboard. Drag-and-drop integration
5917
+ * composes with `useDragDrop`; keyboard reorder composes with `useVirtualFocus`.
5918
+ *
5919
+ * @example
5920
+ * ```ts
5921
+ * import { createSortable } from '@vuetify/v0'
5922
+ * import type { SortableTicketInput } from '@vuetify/v0'
5923
+ *
5924
+ * interface TaskTicket extends SortableTicketInput {
5925
+ * value: { id: number; label: string }
5926
+ * }
5927
+ *
5928
+ * const sortable = createSortable<TaskTicket>()
5929
+ * const a = sortable.register({ value: { id: 1, label: 'A' } })
5930
+ * const b = sortable.register({ value: { id: 2, label: 'B' } })
5931
+ *
5932
+ * sortable.move(a.id, 1)
5933
+ * sortable.on('move:ticket', ({ ticket, from, to }) => {
5934
+ * console.log(`${ticket.value.label} moved ${from} → ${to}`)
5935
+ * })
5936
+ * ```
5937
+ */
5938
+ /**
5939
+ * Create an ordered-list state primitive.
5940
+ *
5941
+ * @param options Sortable options.
5942
+ * @returns A {@link SortableContext} that extends {@link ModelContext}.
5943
+ *
5944
+ * @example
5945
+ * ```ts
5946
+ * const sortable = createSortable<Todo>()
5947
+ * sortable.onboard(todos.value.map(value => ({ value })))
5948
+ * ```
5949
+ */
5950
+ function createSortable(_options = {}) {
5951
+ const { disabled, ...options } = _options;
5952
+ const model = createModel({
5953
+ ...options,
5954
+ events: true,
5955
+ disabled
5956
+ });
5957
+ const logger = useLogger();
5958
+ function move(id, toIndex) {
5959
+ if (toValue(disabled)) return void 0;
5960
+ const ticket = model.get(id);
5961
+ if (!ticket) return void 0;
5962
+ if (toValue(ticket.disabled)) return void 0;
5963
+ const from = ticket.index;
5964
+ const result = model.move(id, toIndex);
5965
+ if (result && result.index !== from) model.emit("move:ticket", {
5966
+ ticket: result,
5967
+ from,
5968
+ to: result.index
5969
+ });
5970
+ return result;
5971
+ }
5972
+ function swap(a, b) {
5973
+ if (toValue(disabled)) return;
5974
+ if (a === b) return;
5975
+ const ta = model.get(a);
5976
+ const tb = model.get(b);
5977
+ if (!ta || !tb) return;
5978
+ if (toValue(ta.disabled) || toValue(tb.disabled)) return;
5979
+ const indexA = ta.index;
5980
+ const indexB = tb.index;
5981
+ model.batch(() => {
5982
+ const ra = model.move(a, indexB);
5983
+ if (ra && ra.index !== indexA) model.emit("move:ticket", {
5984
+ ticket: ra,
5985
+ from: indexA,
5986
+ to: ra.index
5987
+ });
5988
+ const rb = model.move(b, indexA);
5989
+ if (rb && rb.index !== indexB) model.emit("move:ticket", {
5990
+ ticket: rb,
5991
+ from: indexB,
5992
+ to: rb.index
5993
+ });
5994
+ });
5995
+ }
5996
+ function reorder(ids) {
5997
+ if (toValue(disabled)) return;
5998
+ const currentSize = model.size;
5999
+ if (ids.length !== currentSize) {
6000
+ logger.warn(`Reorder expected ${currentSize} ids, got ${ids.length}.`);
6001
+ return;
6002
+ }
6003
+ const known = new Set(model.keys());
6004
+ const seen = /* @__PURE__ */ new Set();
6005
+ for (const id of ids) {
6006
+ if (!known.has(id)) {
6007
+ logger.warn(`Reorder contains unknown id "${String(id)}".`);
6008
+ return;
6009
+ }
6010
+ if (seen.has(id)) {
6011
+ logger.warn(`Reorder contains duplicate id "${String(id)}".`);
6012
+ return;
6013
+ }
6014
+ seen.add(id);
6015
+ }
6016
+ const froms = /* @__PURE__ */ new Map();
6017
+ for (const id of ids) {
6018
+ const ticket = model.get(id);
6019
+ if (ticket) froms.set(id, ticket.index);
6020
+ }
6021
+ model.batch(() => {
6022
+ model.reorder(ids);
6023
+ for (const [index, id] of ids.entries()) {
6024
+ const from = froms.get(id);
6025
+ if (from === index) continue;
6026
+ const ticket = model.get(id);
6027
+ if (ticket) model.emit("move:ticket", {
6028
+ ticket,
6029
+ from,
6030
+ to: index
6031
+ });
6032
+ }
6033
+ });
6034
+ }
6035
+ return {
6036
+ ...model,
6037
+ move,
6038
+ swap,
6039
+ reorder,
6040
+ get size() {
6041
+ return model.size;
6042
+ }
6043
+ };
6044
+ }
6045
+ //#endregion
6046
+ //#region src/composables/createKanban/index.ts
6047
+ /**
6048
+ * @module createKanban
6049
+ *
6050
+ * @see https://0.vuetifyjs.com/composables/data/create-kanban
6051
+ *
6052
+ * @remarks
6053
+ * Headless data-flow management for two-level sortable boards. Wraps a column
6054
+ * sortable; each column ticket carries its own inner sortable on `column.items`.
6055
+ * Adds a `transfer` primitive for cross-column moves with reused `disabled`
6056
+ * gating and a destination-side `accept` predicate. Pure logic — no DnD, no DOM.
6057
+ *
6058
+ * @example
6059
+ * ```ts
6060
+ * import { createKanban } from '@vuetify/v0'
6061
+ * import type { SortableTicketInput } from '@vuetify/v0'
6062
+ *
6063
+ * interface CardTicket extends SortableTicketInput {
6064
+ * value: { title: string }
6065
+ * }
6066
+ *
6067
+ * const kanban = createKanban<CardTicket>()
6068
+ *
6069
+ * const todo = kanban.columns.register({ value: { title: 'Todo' } })
6070
+ * const done = kanban.columns.register({ value: { title: 'Done' } })
6071
+ *
6072
+ * const card = todo.items.register({ value: { title: 'Write spec' } })
6073
+ *
6074
+ * kanban.on('transfer:ticket', ({ ticket, from, to }) => {
6075
+ * console.log(ticket.value.title, from, '→', to)
6076
+ * })
6077
+ *
6078
+ * kanban.transfer(card.id, done.id, 0)
6079
+ * ```
6080
+ */
6081
+ /**
6082
+ * Create a headless two-level sortable orchestrator.
6083
+ *
6084
+ * @param options Kanban options (currently only `disabled`).
6085
+ * @returns A {@link KanbanContext}.
6086
+ *
6087
+ * @example
6088
+ * ```ts
6089
+ * import { createKanban } from '@vuetify/v0'
6090
+ * import type { KanbanColumnTicketInput, SortableTicketInput } from '@vuetify/v0'
6091
+ *
6092
+ * interface CardTicket extends SortableTicketInput {
6093
+ * value: { title: string }
6094
+ * }
6095
+ *
6096
+ * interface BoardColumn extends KanbanColumnTicketInput<CardTicket> {
6097
+ * value: { title: string }
6098
+ * }
6099
+ *
6100
+ * const kanban = createKanban<CardTicket, BoardColumn>()
6101
+ *
6102
+ * const todo = kanban.columns.register({ value: { title: 'Todo' } })
6103
+ * const review = kanban.columns.register({
6104
+ * value: { title: 'Review' },
6105
+ * accept: card => card.value.title.length > 0,
6106
+ * })
6107
+ *
6108
+ * const spec = todo.items.register({ value: { title: 'Write spec' } })
6109
+ * kanban.transfer(spec.id, review.id, 0)
6110
+ * ```
6111
+ */
6112
+ function createKanban(_options = {}) {
6113
+ const { disabled, ...options } = _options;
6114
+ const logger = useLogger();
6115
+ const _columns = createSortable({
6116
+ ...options,
6117
+ disabled
6118
+ });
6119
+ const lookup = createRegistry({ events: true });
6120
+ const bus = createRegistry({ events: true });
6121
+ const on = bus.on;
6122
+ const off = bus.off;
6123
+ const columns = {
6124
+ ..._columns,
6125
+ register(registration) {
6126
+ let ticket;
6127
+ const items = createSortable({ disabled: () => !!toValue(disabled) || !!toValue(ticket?.disabled) });
6128
+ items.on("register:ticket", (t) => {
6129
+ lookup.upsert(t.id, { value: ticket.id });
6130
+ });
6131
+ items.on("unregister:ticket", (t) => {
6132
+ lookup.get(t.id)?.unregister();
6133
+ });
6134
+ ticket = _columns.register({
6135
+ ...registration,
6136
+ items
6137
+ });
6138
+ return ticket;
6139
+ },
6140
+ onboard(registrations) {
6141
+ return _columns.batch(() => registrations.map((reg) => columns.register(reg)));
6142
+ },
6143
+ upsert(id, patch = {}, event) {
6144
+ return /* @__PURE__ */ isUndefined(_columns.get(id)) ? columns.register({
6145
+ ...patch,
6146
+ id
6147
+ }) : _columns.upsert(id, patch, event);
6148
+ },
6149
+ get size() {
6150
+ return _columns.size;
6151
+ }
6152
+ };
6153
+ function isAccepted(accept, ticket, from, toIndex) {
6154
+ if (/* @__PURE__ */ isUndefined(accept)) return true;
6155
+ try {
6156
+ const result = accept(ticket, from, toIndex);
6157
+ if (/* @__PURE__ */ isThenable(result)) {
6158
+ logger.warn("accept predicate returned a thenable; async predicates are not supported — treating as reject");
6159
+ return false;
6160
+ }
6161
+ return Boolean(result);
6162
+ } catch (error) {
6163
+ logger.error("accept predicate threw; treating as reject", error);
6164
+ return false;
6165
+ }
6166
+ }
6167
+ columns.on("unregister:ticket", (column) => {
6168
+ column.items.dispose();
6169
+ for (const t of lookup.values()) if (t.value === column.id) t.unregister();
6170
+ });
6171
+ function transfer(id, toColumnId, toIndex) {
6172
+ const fromColumnId = lookup.get(id)?.value;
6173
+ if (/* @__PURE__ */ isUndefined(fromColumnId)) {
6174
+ logger.warn(`unknown ticket id "${String(id)}"`);
6175
+ return;
6176
+ }
6177
+ const source = columns.get(fromColumnId);
6178
+ if (!source) {
6179
+ logger.warn(`unknown source column id "${String(fromColumnId)}"`);
6180
+ return;
6181
+ }
6182
+ const destination = columns.get(toColumnId);
6183
+ if (!destination) {
6184
+ logger.warn(`unknown destination column id "${String(toColumnId)}"`);
6185
+ return;
6186
+ }
6187
+ const ticket = source.items.get(id);
6188
+ if (!ticket) {
6189
+ logger.warn(`ticket "${String(id)}" missing from source column "${String(fromColumnId)}"`);
6190
+ return;
6191
+ }
6192
+ const fromIndex = ticket.index;
6193
+ if (toColumnId === fromColumnId) return source.items.move(id, toIndex);
6194
+ if (toValue(disabled) || toValue(source.disabled) || toValue(destination.disabled) || toValue(ticket.disabled)) return;
6195
+ if (!isAccepted(destination.accept, ticket, fromColumnId, toIndex)) return void 0;
6196
+ if (!/* @__PURE__ */ isUndefined(destination.items.get(id))) {
6197
+ logger.warn(`id "${String(id)}" already exists in destination column "${String(toColumnId)}"`);
6198
+ return;
6199
+ }
6200
+ let registered;
6201
+ let moved;
6202
+ destination.items.batch(() => {
6203
+ const [input] = source.items.offboard([id]);
6204
+ if (/* @__PURE__ */ isUndefined(input)) return;
6205
+ registered = destination.items.register(input);
6206
+ moved = registered.index === toIndex ? registered : destination.items.move(registered.id, toIndex);
6207
+ });
6208
+ const final = moved ?? registered;
6209
+ if (final) bus.emit("transfer:ticket", {
6210
+ ticket: final,
6211
+ from: fromColumnId,
6212
+ to: toColumnId,
6213
+ fromIndex,
6214
+ toIndex: final.index
6215
+ });
6216
+ return final;
6217
+ }
6218
+ return {
6219
+ columns,
6220
+ transfer,
6221
+ on,
6222
+ off
6223
+ };
6224
+ }
6225
+ //#endregion
5832
6226
  //#region src/composables/createNested/index.ts
5833
6227
  /**
5834
6228
  * @module createNested
@@ -7082,6 +7476,7 @@ function useElementSize(target) {
7082
7476
  const height = shallowRef(0);
7083
7477
  const { pause: _pause, resume, stop, isActive, isPaused } = useResizeObserver(target, (entries) => {
7084
7478
  const entry = entries[0];
7479
+ /* v8 ignore next 4 -- defensive: ResizeObserver always passes an entry array with at least one entry */
7085
7480
  if (entry) {
7086
7481
  width.value = entry.contentRect.width;
7087
7482
  height.value = entry.contentRect.height;
@@ -7240,6 +7635,7 @@ function createOverflow(options = {}) {
7240
7635
  }),
7241
7636
  total,
7242
7637
  isOverflowing: toRef(() => {
7638
+ if (width.value === 0) return false;
7243
7639
  return total.value > width.value - toValue(reserved);
7244
7640
  }),
7245
7641
  measure,
@@ -7392,7 +7788,7 @@ function createProgress(options = {}) {
7392
7788
  }
7393
7789
  for (const [index, element] of clamped.entries()) {
7394
7790
  const ticket = segments.value[index];
7395
- if (!ticket || !isRef(ticket.value)) continue;
7791
+ if (!ticket || !isRef(ticket.value) || isReadonly(ticket.value)) continue;
7396
7792
  ticket.value.value = element;
7397
7793
  }
7398
7794
  }
@@ -7554,7 +7950,7 @@ function createQueue(_options = {}) {
7554
7950
  if (!ticket || ticket.index !== 0 || !ticket.isPaused) return void 0;
7555
7951
  const updated = registry.upsert(ticket.id, { isPaused: false });
7556
7952
  const timer = timers.get(updated.id);
7557
- if (timer) timer.start();
7953
+ if (timer) timer.resume();
7558
7954
  else createTicketTimer(updated);
7559
7955
  return updated;
7560
7956
  }
@@ -8449,6 +8845,7 @@ function createVirtual(items, _options = {}) {
8449
8845
  /* v8 ignore stop */
8450
8846
  });
8451
8847
  useResizeObserver(element, (entries) => {
8848
+ /* v8 ignore next -- defensive: ResizeObserver always emits at least one entry */
8452
8849
  if (!entries[0]) return;
8453
8850
  viewportHeight.value = entries[0].contentRect.height;
8454
8851
  update();
@@ -8461,6 +8858,7 @@ function createVirtual(items, _options = {}) {
8461
8858
  rebuild();
8462
8859
  }, { immediate: true });
8463
8860
  watch(element, () => {
8861
+ /* v8 ignore next -- defensive: watch fires only when element is present */
8464
8862
  if (!element.value) return;
8465
8863
  if (direction === "reverse" && items.value.length > 0) {
8466
8864
  const lastIndex = items.value.length - 1;
@@ -8479,6 +8877,7 @@ function createVirtual(items, _options = {}) {
8479
8877
  anchorOffset = 0;
8480
8878
  } else if (/* @__PURE__ */ isFunction(anchor)) {
8481
8879
  const result = anchor(items.value);
8880
+ /* v8 ignore next 4 -- function-anchor: tested with valid number return; non-number rejection branch is implicit */
8482
8881
  if (/* @__PURE__ */ isNumber(result)) {
8483
8882
  anchorIndex = result;
8484
8883
  anchorOffset = element.value.scrollTop - (offsets.value[result] || 0);
@@ -8562,8 +8961,10 @@ function createVirtual(items, _options = {}) {
8562
8961
  /* v8 ignore stop */
8563
8962
  }
8564
8963
  function resize(index, height) {
8964
+ /* v8 ignore next -- early bail when height is already correct */
8565
8965
  if (heights.value[index] === height) return;
8566
8966
  heights.value[index] = height;
8967
+ /* v8 ignore next -- first-call only: itemHeight bootstrapped from initial measurement */
8567
8968
  if (!itemHeight.value) itemHeight.value = height;
8568
8969
  if (IN_BROWSER) {
8569
8970
  cancelAnimationFrame(rebuildRaf);
@@ -8580,6 +8981,7 @@ function createVirtual(items, _options = {}) {
8580
8981
  /* v8 ignore stop */
8581
8982
  }
8582
8983
  function scrollTo(index, scrollOptions) {
8984
+ /* v8 ignore next -- defensive: scrollTo only invoked after element mounts */
8583
8985
  if (!element.value) return;
8584
8986
  const targetOffset = offsets.value[index] || 0;
8585
8987
  const behavior = scrollOptions?.behavior ?? "auto";
@@ -9099,11 +9501,11 @@ const [createBreakpointsContext, createBreakpointsPlugin, useBreakpoints] = crea
9099
9501
  *
9100
9502
  * @example Using the built-in Temporal adapter
9101
9503
  * ```ts
9102
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
9504
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9103
9505
  * import { createDatePlugin } from '@vuetify/v0'
9104
9506
  *
9105
9507
  * const app = createApp(App)
9106
- * app.use(createDatePlugin({ adapter: new Vuetify0DateAdapter() }))
9508
+ * app.use(createDatePlugin({ adapter: new V0DateAdapter() }))
9107
9509
  *
9108
9510
  * // In a component:
9109
9511
  * const { adapter } = useDate()
@@ -9113,9 +9515,9 @@ const [createBreakpointsContext, createBreakpointsPlugin, useBreakpoints] = crea
9113
9515
  *
9114
9516
  * @example Custom adapter
9115
9517
  * ```ts
9116
- * import type { DateAdapter } from '@vuetify/v0'
9518
+ * import { DateAdapter } from '@vuetify/v0'
9117
9519
  *
9118
- * class DateFnsAdapter implements DateAdapter<Date> {
9520
+ * class DateFnsAdapter extends DateAdapter<Date> {
9119
9521
  * // ... implementation
9120
9522
  * }
9121
9523
  *
@@ -9146,6 +9548,7 @@ const defaultLocales = {
9146
9548
  function deriveFirstDayOfWeek(locale) {
9147
9549
  try {
9148
9550
  const info = new Intl.Locale(locale).getWeekInfo?.();
9551
+ /* v8 ignore next -- defensive: getWeekInfo always returns info in Node 22+ */
9149
9552
  return info ? info.firstDay % 7 : 0;
9150
9553
  } catch {
9151
9554
  return 0;
@@ -9163,14 +9566,14 @@ function deriveFirstDayOfWeek(locale) {
9163
9566
  *
9164
9567
  * @example
9165
9568
  * ```ts
9166
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
9569
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9167
9570
  *
9168
- * const { adapter } = createDate({ adapter: new Vuetify0DateAdapter() })
9571
+ * const { adapter } = createDate({ adapter: new V0DateAdapter() })
9169
9572
  * const today = adapter.date()
9170
9573
  *
9171
9574
  * // With locale options
9172
9575
  * const { adapter } = createDate({
9173
- * adapter: new Vuetify0DateAdapter(),
9576
+ * adapter: new V0DateAdapter(),
9174
9577
  * locale: 'de-DE',
9175
9578
  * })
9176
9579
  * ```
@@ -9225,10 +9628,10 @@ function createDate(options) {
9225
9628
  *
9226
9629
  * @example
9227
9630
  * ```ts
9228
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
9631
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9229
9632
  *
9230
9633
  * const [useAppDate, provideAppDate] = createDateContext({
9231
- * adapter: new Vuetify0DateAdapter(),
9634
+ * adapter: new V0DateAdapter(),
9232
9635
  * namespace: 'app:date',
9233
9636
  * })
9234
9637
  * ```
@@ -9249,14 +9652,14 @@ function createDateContext(options) {
9249
9652
  *
9250
9653
  * @example
9251
9654
  * ```ts
9252
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
9655
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9253
9656
  *
9254
9657
  * const app = createApp(App)
9255
- * app.use(createDatePlugin({ adapter: new Vuetify0DateAdapter() }))
9658
+ * app.use(createDatePlugin({ adapter: new V0DateAdapter() }))
9256
9659
  *
9257
9660
  * // With locale options
9258
9661
  * app.use(createDatePlugin({
9259
- * adapter: new Vuetify0DateAdapter(),
9662
+ * adapter: new V0DateAdapter(),
9260
9663
  * locale: 'de-DE',
9261
9664
  * }))
9262
9665
  * ```
@@ -9290,10 +9693,10 @@ function createDatePlugin(options) {
9290
9693
  * @example
9291
9694
  * ```ts
9292
9695
  * // main.ts
9293
- * import { Vuetify0DateAdapter } from '@vuetify/v0/date'
9696
+ * import { V0DateAdapter } from '@vuetify/v0/date'
9294
9697
  * import { createDatePlugin } from '@vuetify/v0'
9295
9698
  *
9296
- * app.use(createDatePlugin({ adapter: new Vuetify0DateAdapter() }))
9699
+ * app.use(createDatePlugin({ adapter: new V0DateAdapter() }))
9297
9700
  * ```
9298
9701
  *
9299
9702
  * @example
@@ -9307,7 +9710,7 @@ function createDatePlugin(options) {
9307
9710
  * ```
9308
9711
  */
9309
9712
  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() }))");
9713
+ 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
9714
  return useContext(namespace);
9312
9715
  }
9313
9716
  //#endregion
@@ -9383,52 +9786,824 @@ function useDelay(callback, options = {}) {
9383
9786
  resolve?.(direction);
9384
9787
  callback?.(direction);
9385
9788
  }
9386
- function duration() {
9387
- const raw = isOpening.value ? toValue(openDelay) : toValue(closeDelay);
9388
- return Math.max(minDelay, raw ?? 0);
9789
+ function duration() {
9790
+ const raw = isOpening.value ? toValue(openDelay) : toValue(closeDelay);
9791
+ return Math.max(minDelay, raw ?? 0);
9792
+ }
9793
+ const timer = useTimer(fire, { duration });
9794
+ function start(direction, options = {}) {
9795
+ const previous = resolver;
9796
+ resolver = void 0;
9797
+ isOpening.value = direction;
9798
+ minDelay = options.minDelay ?? 0;
9799
+ previous?.(direction);
9800
+ const ms = duration();
9801
+ return new Promise((resolve) => {
9802
+ resolver = resolve;
9803
+ if (ms <= 0) {
9804
+ timer.stop();
9805
+ fire();
9806
+ return;
9807
+ }
9808
+ timer.start();
9809
+ });
9810
+ }
9811
+ function stop() {
9812
+ const resolve = resolver;
9813
+ resolver = void 0;
9814
+ timer.stop();
9815
+ resolve?.(isOpening.value);
9816
+ }
9817
+ onScopeDispose(() => {
9818
+ const resolve = resolver;
9819
+ resolver = void 0;
9820
+ resolve?.(isOpening.value);
9821
+ }, true);
9822
+ return {
9823
+ start,
9824
+ stop,
9825
+ pause: timer.pause,
9826
+ resume: timer.resume,
9827
+ isActive: shallowReadonly(timer.isActive),
9828
+ isPaused: shallowReadonly(timer.isPaused),
9829
+ remaining: shallowReadonly(timer.remaining),
9830
+ isOpening: shallowReadonly(isOpening)
9831
+ };
9832
+ }
9833
+ //#endregion
9834
+ //#region src/composables/useMutationObserver/index.ts
9835
+ /**
9836
+ * @module useMutationObserver
9837
+ *
9838
+ * @see https://0.vuetifyjs.com/composables/system/use-mutation-observer
9839
+ *
9840
+ * @remarks
9841
+ * MutationObserver composable with lifecycle management.
9842
+ *
9843
+ * Key features:
9844
+ * - MutationObserver API wrapper
9845
+ * - `isActive` reactive flag
9846
+ * - `once` option for single-fire observation
9847
+ * - Pause/resume/stop functionality
9848
+ * - Automatic cleanup on unmount
9849
+ * - SSR-safe (checks SUPPORTS_MUTATION_OBSERVER)
9850
+ * - Hydration-aware
9851
+ * - Configurable observation options (childList, attributes, characterData, etc.)
9852
+ *
9853
+ * Perfect for detecting DOM changes and responding to mutations.
9854
+ *
9855
+ * @example
9856
+ * ```ts
9857
+ * import { useTemplateRef } from 'vue'
9858
+ * import { useMutationObserver } from '@vuetify/v0'
9859
+ *
9860
+ * const target = useTemplateRef('target')
9861
+ * useMutationObserver(target, records => {
9862
+ * console.log(records)
9863
+ * }, { childList: true })
9864
+ * ```
9865
+ */
9866
+ /**
9867
+ * A composable that uses the Mutation Observer API to detect changes in the DOM.
9868
+ *
9869
+ * @param target The element to observe.
9870
+ * @param callback The callback to execute when a mutation is observed.
9871
+ * @param options The options for the Mutation Observer.
9872
+ * @returns An object with methods to control the observer.
9873
+ *
9874
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
9875
+ * @see https://0.vuetifyjs.com/composables/system/use-mutation-observer
9876
+ *
9877
+ * @example
9878
+ * ```ts
9879
+ * import { ref } from 'vue'
9880
+ * import { useMutationObserver } from '@vuetify/v0'
9881
+ *
9882
+ * const container = ref<HTMLElement>()
9883
+ *
9884
+ * const { pause, resume, isPaused } = useMutationObserver(
9885
+ * container,
9886
+ * (mutations) => {
9887
+ * mutations.forEach((mutation) => {
9888
+ * if (mutation.type === 'childList') {
9889
+ * console.log('Children changed:', mutation.addedNodes, mutation.removedNodes)
9890
+ * } else if (mutation.type === 'attributes') {
9891
+ * console.log('Attribute changed:', mutation.attributeName)
9892
+ * }
9893
+ * })
9894
+ * },
9895
+ * {
9896
+ * childList: true,
9897
+ * attributes: true,
9898
+ * subtree: true
9899
+ * }
9900
+ * )
9901
+ *
9902
+ * // Pause observation
9903
+ * pause()
9904
+ *
9905
+ * // Resume observation
9906
+ * resume()
9907
+ * ```
9908
+ */
9909
+ function useMutationObserver(target, callback, options = {}) {
9910
+ const observerOptions = {
9911
+ childList: options.childList ?? true,
9912
+ attributes: options.attributes ?? false,
9913
+ characterData: options.characterData ?? false,
9914
+ subtree: options.subtree ?? false,
9915
+ attributeOldValue: options.attributeOldValue ?? false,
9916
+ characterDataOldValue: options.characterDataOldValue ?? false,
9917
+ attributeFilter: options.attributeFilter
9918
+ };
9919
+ return createObserver(target, callback, {
9920
+ supports: SUPPORTS_MUTATION_OBSERVER,
9921
+ once: options.once,
9922
+ create: (cb) => new MutationObserver((mutations) => {
9923
+ cb(mutations.map((m) => ({
9924
+ type: m.type,
9925
+ target: m.target,
9926
+ addedNodes: m.addedNodes,
9927
+ removedNodes: m.removedNodes,
9928
+ previousSibling: m.previousSibling,
9929
+ nextSibling: m.nextSibling,
9930
+ attributeName: m.attributeName,
9931
+ attributeNamespace: m.attributeNamespace,
9932
+ oldValue: m.oldValue
9933
+ })));
9934
+ }),
9935
+ observe: (obs, el) => obs.observe(el, observerOptions),
9936
+ immediate: options.immediate ? (el) => {
9937
+ const emptyNodeList = {
9938
+ length: 0,
9939
+ item: () => null,
9940
+ forEach: () => {},
9941
+ *[Symbol.iterator]() {}
9942
+ };
9943
+ return [{
9944
+ type: "childList",
9945
+ target: el,
9946
+ addedNodes: emptyNodeList,
9947
+ removedNodes: emptyNodeList,
9948
+ previousSibling: null,
9949
+ nextSibling: null,
9950
+ attributeName: null,
9951
+ attributeNamespace: null,
9952
+ oldValue: null
9953
+ }];
9954
+ } : void 0,
9955
+ onceIncludesImmediate: true
9956
+ });
9957
+ }
9958
+ //#endregion
9959
+ //#region src/composables/useDragDrop/adapters/adapter.ts
9960
+ /**
9961
+ * @module useDragDrop/adapters/adapter
9962
+ *
9963
+ * @remarks
9964
+ * Adapter contract and abstract base for useDragDrop. Concrete adapters extend
9965
+ * `DragDropAdapter<Z>` to share the `cleanup` field, `dispose()` lifecycle, and
9966
+ * the `locate()` DOM-walk helper.
9967
+ */
9968
+ /**
9969
+ * Abstract base class for useDragDrop adapters. Provides a `cleanup` slot, a
9970
+ * `dispose()` lifecycle, and a `locate()` helper that walks the DOM to find the
9971
+ * draggable ticket whose `el` ancestors a given event target.
9972
+ *
9973
+ * @example
9974
+ * ```ts
9975
+ * import { DragDropAdapter, type DragDropAdapterContext } from '@vuetify/v0'
9976
+ *
9977
+ * class MyAdapter extends DragDropAdapter {
9978
+ * setup (context: DragDropAdapterContext) {
9979
+ * const stop = useEventListener(document, 'mousedown', event => {
9980
+ * const ticket = this.locate(event.target, context)
9981
+ * if (ticket) context.emit.start(ticket, { x: event.clientX, y: event.clientY }, 'pointer')
9982
+ * })
9983
+ * this.cleanup = () => stop()
9984
+ * }
9985
+ * }
9986
+ * ```
9987
+ */
9988
+ var DragDropAdapter = class {
9989
+ cleanup = null;
9990
+ dispose() {
9991
+ this.cleanup?.();
9992
+ this.cleanup = null;
9993
+ }
9994
+ locate(target, context) {
9995
+ let element = /* @__PURE__ */ isElement(target) ? target : null;
9996
+ while (element) {
9997
+ for (const ticket of context.draggables.values()) if (ticket.el.value === element) return ticket;
9998
+ element = element.parentElement;
9999
+ }
10000
+ return null;
10001
+ }
10002
+ };
10003
+ //#endregion
10004
+ //#region src/composables/useDragDrop/adapters/pointer.ts
10005
+ /**
10006
+ * @module useDragDrop/adapters/pointer
10007
+ *
10008
+ * @remarks
10009
+ * Default pointer adapter for useDragDrop. Listens for `pointerdown` /
10010
+ * `pointermove` / `pointerup` / `pointercancel` on the document and emits the
10011
+ * drag lifecycle. Activation distance is configurable via `threshold`.
10012
+ */
10013
+ /**
10014
+ * Default pointer adapter. Wires `pointerdown` / `pointermove` / `pointerup` /
10015
+ * `pointercancel` on the document and converts them into drag lifecycle calls.
10016
+ *
10017
+ * @example
10018
+ * ```ts
10019
+ * import { PointerAdapter, useDragDrop } from '@vuetify/v0'
10020
+ *
10021
+ * useDragDrop({ adapters: [new PointerAdapter({ threshold: 10 })] })
10022
+ * ```
10023
+ */
10024
+ var PointerAdapter = class extends DragDropAdapter {
10025
+ threshold;
10026
+ constructor(options = {}) {
10027
+ super();
10028
+ this.threshold = options.threshold ?? 0;
10029
+ }
10030
+ setup(context) {
10031
+ const logger = useLogger();
10032
+ if (this.cleanup) {
10033
+ logger.warn("PointerAdapter setup called twice; previous registration will be replaced");
10034
+ this.dispose();
10035
+ }
10036
+ if (!IN_BROWSER) return;
10037
+ let downSource = null;
10038
+ let downOrigin = null;
10039
+ let downId = null;
10040
+ let started = false;
10041
+ function reset() {
10042
+ downSource = null;
10043
+ downOrigin = null;
10044
+ downId = null;
10045
+ started = false;
10046
+ }
10047
+ const onDown = (event) => {
10048
+ if (event.button !== 0) return;
10049
+ if (downSource) return;
10050
+ const ticket = this.locate(event.target, context);
10051
+ if (!ticket) return;
10052
+ downSource = ticket;
10053
+ downOrigin = {
10054
+ x: event.clientX,
10055
+ y: event.clientY
10056
+ };
10057
+ downId = event.pointerId;
10058
+ started = false;
10059
+ };
10060
+ const onMove = (event) => {
10061
+ if (!downSource || !downOrigin || event.pointerId !== downId) return;
10062
+ const point = {
10063
+ x: event.clientX,
10064
+ y: event.clientY
10065
+ };
10066
+ if (!started) {
10067
+ const dx = point.x - downOrigin.x;
10068
+ const dy = point.y - downOrigin.y;
10069
+ if (this.threshold > 0 && Math.hypot(dx, dy) < this.threshold) return;
10070
+ context.emit.start(downSource, downOrigin, "pointer");
10071
+ started = true;
10072
+ }
10073
+ context.emit.move(point);
10074
+ };
10075
+ function onUp(event) {
10076
+ if (event.pointerId !== downId) return;
10077
+ if (downSource && started) context.emit.drop();
10078
+ reset();
10079
+ }
10080
+ function onCancel(event) {
10081
+ if (event.pointerId !== downId) return;
10082
+ if (downSource && started) context.emit.cancel();
10083
+ reset();
10084
+ }
10085
+ const stopDown = useEventListener(document, "pointerdown", onDown);
10086
+ const stopMove = useEventListener(document, "pointermove", onMove);
10087
+ const stopUp = useEventListener(document, "pointerup", onUp);
10088
+ const stopCancel = useEventListener(document, "pointercancel", onCancel);
10089
+ this.cleanup = () => {
10090
+ stopDown();
10091
+ stopMove();
10092
+ stopUp();
10093
+ stopCancel();
10094
+ };
10095
+ }
10096
+ };
10097
+ //#endregion
10098
+ //#region src/composables/useDragDrop/adapters/keyboard.ts
10099
+ /**
10100
+ * @module useDragDrop/adapters/keyboard
10101
+ *
10102
+ * @remarks
10103
+ * Default keyboard adapter for useDragDrop. Listens for `keydown` on the
10104
+ * document. Activation keys (default Space and Enter) start and drop drags;
10105
+ * arrow keys nudge the drag point by `step` px; Escape cancels.
10106
+ */
10107
+ function isEditable(element) {
10108
+ if (/* @__PURE__ */ isNull(element)) return false;
10109
+ const tag = element.tagName;
10110
+ if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT") return true;
10111
+ if (element.isContentEditable) return true;
10112
+ const role = element.getAttribute("role");
10113
+ return role === "textbox" || role === "searchbox" || role === "combobox" || role === "spinbutton";
10114
+ }
10115
+ /**
10116
+ * Default keyboard adapter. Listens for `keydown` on the document; activation
10117
+ * keys start/drop drags, arrow keys nudge the drag point, Escape cancels.
10118
+ *
10119
+ * @example
10120
+ * ```ts
10121
+ * import { KeyboardAdapter, useDragDrop } from '@vuetify/v0'
10122
+ *
10123
+ * useDragDrop({ adapters: [new KeyboardAdapter({ activate: ['x'], step: 32 })] })
10124
+ * ```
10125
+ */
10126
+ var KeyboardAdapter = class extends DragDropAdapter {
10127
+ activate;
10128
+ step;
10129
+ constructor(options = {}) {
10130
+ super();
10131
+ this.activate = options.activate ?? [" ", "Enter"];
10132
+ this.step = options.step ?? 16;
10133
+ }
10134
+ setup(context) {
10135
+ const logger = useLogger();
10136
+ if (this.cleanup) {
10137
+ logger.warn("KeyboardAdapter setup called twice; previous registration will be replaced");
10138
+ this.dispose();
10139
+ }
10140
+ if (!IN_BROWSER) return;
10141
+ const onKeyDown = (event) => {
10142
+ const focused = document.activeElement;
10143
+ if (event.ctrlKey || event.metaKey || event.altKey || event.shiftKey) return;
10144
+ if (isEditable(focused)) return;
10145
+ const ticket = this.locate(focused, context);
10146
+ const isActive = !/* @__PURE__ */ isNull(context.active.value);
10147
+ if (this.activate.includes(event.key)) {
10148
+ if (isActive) {
10149
+ event.preventDefault();
10150
+ context.emit.drop();
10151
+ } else if (ticket) {
10152
+ const el = ticket.el.value;
10153
+ if (!el) {
10154
+ logger.warn("KeyboardAdapter: cannot start drag — element is not mounted");
10155
+ return;
10156
+ }
10157
+ event.preventDefault();
10158
+ const rect = el.getBoundingClientRect();
10159
+ context.emit.start(ticket, {
10160
+ x: rect.left + rect.width / 2,
10161
+ y: rect.top + rect.height / 2
10162
+ }, "keyboard");
10163
+ }
10164
+ return;
10165
+ }
10166
+ if (event.key === "Escape" && isActive) {
10167
+ event.preventDefault();
10168
+ context.emit.cancel();
10169
+ return;
10170
+ }
10171
+ if (isActive && event.key.startsWith("Arrow")) {
10172
+ const active = context.active.value;
10173
+ if (/* @__PURE__ */ isNull(active)) return;
10174
+ const current = active.current;
10175
+ let point = null;
10176
+ switch (event.key) {
10177
+ case "ArrowUp":
10178
+ point = {
10179
+ x: current.x,
10180
+ y: current.y - this.step
10181
+ };
10182
+ break;
10183
+ case "ArrowDown":
10184
+ point = {
10185
+ x: current.x,
10186
+ y: current.y + this.step
10187
+ };
10188
+ break;
10189
+ case "ArrowLeft":
10190
+ point = {
10191
+ x: current.x - this.step,
10192
+ y: current.y
10193
+ };
10194
+ break;
10195
+ case "ArrowRight":
10196
+ point = {
10197
+ x: current.x + this.step,
10198
+ y: current.y
10199
+ };
10200
+ break;
10201
+ }
10202
+ if (point) {
10203
+ event.preventDefault();
10204
+ context.emit.move(point);
10205
+ }
10206
+ }
10207
+ };
10208
+ const stop = useEventListener(document, "keydown", onKeyDown);
10209
+ this.cleanup = () => stop();
10210
+ }
10211
+ };
10212
+ //#endregion
10213
+ //#region src/composables/useDragDrop/index.ts
10214
+ /**
10215
+ * @module useDragDrop
10216
+ *
10217
+ * @see https://0.vuetifyjs.com/composables/system/use-drag-drop
10218
+ *
10219
+ * @remarks
10220
+ * Headless drag-and-drop primitive. Owns two registries (draggables and zones)
10221
+ * plus the active-drag state. Pointer and keyboard adapters ship by default;
10222
+ * lifecycle hooks and a plugin array provide extension points.
10223
+ *
10224
+ * @example
10225
+ * ```ts
10226
+ * import { useDragDrop } from '@vuetify/v0'
10227
+ *
10228
+ * const dnd = useDragDrop()
10229
+ * ```
10230
+ */
10231
+ /**
10232
+ * Pure math for resolving where in an oriented zone a pointer would drop.
10233
+ * Internal — consumers rely on the `position.index` / `position.indicator`
10234
+ * fields delivered to `onDrop`.
10235
+ */
10236
+ function resolveDropPosition(point, rects, orientation) {
10237
+ if (rects.length === 0) return null;
10238
+ const axis = orientation === "vertical" ? "y" : "x";
10239
+ const start = orientation === "vertical" ? "top" : "left";
10240
+ const end = orientation === "vertical" ? "bottom" : "right";
10241
+ const coord = point[axis];
10242
+ if (coord < rects[0][start]) return {
10243
+ index: 0,
10244
+ edge: "before",
10245
+ rect: rects[0]
10246
+ };
10247
+ const last = rects.at(-1);
10248
+ if (coord > last[end]) return {
10249
+ index: rects.length,
10250
+ edge: "after",
10251
+ rect: last
10252
+ };
10253
+ for (const [index, rect] of rects.entries()) if (coord >= rect[start] && coord <= rect[end]) {
10254
+ if (coord < rect[start] + (rect[end] - rect[start]) / 2) return {
10255
+ index,
10256
+ edge: "before",
10257
+ rect
10258
+ };
10259
+ return {
10260
+ index: index + 1,
10261
+ edge: "after",
10262
+ rect
10263
+ };
10264
+ }
10265
+ for (let index = 0; index < rects.length - 1; index++) {
10266
+ const a = rects[index];
10267
+ const b = rects[index + 1];
10268
+ if (coord > a[end] && coord < b[start]) {
10269
+ if (coord <= (a[end] + b[start]) / 2) return {
10270
+ index: index + 1,
10271
+ edge: "after",
10272
+ rect: a
10273
+ };
10274
+ return {
10275
+ index: index + 1,
10276
+ edge: "before",
10277
+ rect: b
10278
+ };
10279
+ }
10280
+ }
10281
+ return {
10282
+ index: rects.length,
10283
+ edge: "after",
10284
+ rect: last
10285
+ };
10286
+ }
10287
+ /**
10288
+ * Create a headless drag-and-drop context.
10289
+ *
10290
+ * @param options - Adapters, plugins, and lifecycle hooks. All optional.
10291
+ * @returns A `DragDropContext<Z>` exposing `draggables` / `zones` registries,
10292
+ * the `active` drag, the `isDragging` boolean, and a programmatic `cancel()`.
10293
+ *
10294
+ * @see https://0.vuetifyjs.com/composables/system/use-drag-drop
10295
+ *
10296
+ * @example
10297
+ * ```ts
10298
+ * import { useDragDrop } from '@vuetify/v0'
10299
+ * import { useTemplateRef } from 'vue'
10300
+ *
10301
+ * const dnd = useDragDrop<{ type: 'card', value: string }>()
10302
+ *
10303
+ * const draggable = useTemplateRef<HTMLElement>('draggable')
10304
+ * const dropzone = useTemplateRef<HTMLElement>('dropzone')
10305
+ *
10306
+ * dnd.draggables.register({ el: draggable, type: 'card', value: 'card-1' })
10307
+ * dnd.zones.register({
10308
+ * el: dropzone,
10309
+ * accept: ['card'],
10310
+ * onDrop: (drag, position) => console.log(drag.value, position.index),
10311
+ * })
10312
+ * ```
10313
+ */
10314
+ function useDragDrop(options = {}) {
10315
+ const { plugins = [] } = options;
10316
+ const logger = useLogger();
10317
+ const _draggables = createRegistry({ events: true });
10318
+ const _zones = createRegistry({ events: true });
10319
+ const active = shallowRef(null);
10320
+ const isDragging = toRef(() => !/* @__PURE__ */ isNull(active.value));
10321
+ const scopes = /* @__PURE__ */ new Map();
10322
+ const nodes = /* @__PURE__ */ new Map();
10323
+ function next(fn, ...args) {
10324
+ if (/* @__PURE__ */ isUndefined(fn)) return;
10325
+ try {
10326
+ fn(...args);
10327
+ } catch (error) {
10328
+ logger.error("useDragDrop hook threw", error);
10329
+ }
10330
+ }
10331
+ function safeAccept(accept, drag) {
10332
+ try {
10333
+ if (/* @__PURE__ */ isNull(drag)) return false;
10334
+ if (/* @__PURE__ */ isUndefined(accept)) return true;
10335
+ if (/* @__PURE__ */ isArray(accept)) return accept.includes(drag.type);
10336
+ const result = accept(drag);
10337
+ if (/* @__PURE__ */ isThenable(result)) {
10338
+ logger.warn("useDragDrop accept predicate returned a thenable; async predicates are not supported — treating as reject");
10339
+ return false;
10340
+ }
10341
+ return Boolean(result);
10342
+ } catch (error) {
10343
+ logger.error("useDragDrop accept predicate threw; treating as reject", error);
10344
+ return false;
10345
+ }
10346
+ }
10347
+ const draggables = {
10348
+ ..._draggables,
10349
+ register(registration) {
10350
+ const id = registration.id ?? /* @__PURE__ */ useId();
10351
+ const el = toRef(() => toValue(registration.el));
10352
+ const dragging = toRef(() => active.value?.id === id);
10353
+ const input = {
10354
+ ...registration,
10355
+ id,
10356
+ el,
10357
+ isDragging: dragging
10358
+ };
10359
+ return _draggables.register(input);
10360
+ }
10361
+ };
10362
+ const zones = {
10363
+ ..._zones,
10364
+ register(registration) {
10365
+ const id = registration.id ?? /* @__PURE__ */ useId();
10366
+ const el = toRef(() => toValue(registration.el));
10367
+ const isOver = toRef(() => active.value?.over === id);
10368
+ const willAccept = toRef(() => safeAccept(registration.accept, active.value));
10369
+ const rects = shallowRef([]);
10370
+ function refresh() {
10371
+ const zoneEl = el.value;
10372
+ rects.value = zoneEl ? Array.from(zoneEl.children).map((child) => child.getBoundingClientRect()) : [];
10373
+ }
10374
+ const scope = effectScope();
10375
+ scopes.set(id, scope);
10376
+ scope.run(() => {
10377
+ if (registration.orientation) {
10378
+ watch(el, refresh, {
10379
+ immediate: true,
10380
+ flush: "post"
10381
+ });
10382
+ useResizeObserver(el, refresh);
10383
+ useMutationObserver(el, refresh, { childList: true });
10384
+ watch(() => active.value?.id, (id) => {
10385
+ if (id) refresh();
10386
+ });
10387
+ }
10388
+ watch(el, (current) => {
10389
+ if (/* @__PURE__ */ isNull(current)) return;
10390
+ nodes.set(current, id);
10391
+ onWatcherCleanup(() => nodes.delete(current));
10392
+ }, { immediate: true });
10393
+ });
10394
+ const indicator = computed(() => {
10395
+ if (!registration.orientation || !isOver.value || !active.value) return null;
10396
+ return resolveDropPosition(active.value.current, rects.value, registration.orientation);
10397
+ });
10398
+ const input = {
10399
+ ...registration,
10400
+ id,
10401
+ el,
10402
+ isOver,
10403
+ willAccept,
10404
+ indicator
10405
+ };
10406
+ return _zones.register(input);
10407
+ }
10408
+ };
10409
+ function at(point) {
10410
+ if (!IN_BROWSER) return null;
10411
+ let element = document.elementFromPoint(point.x, point.y);
10412
+ while (element) {
10413
+ const id = nodes.get(element);
10414
+ if (!/* @__PURE__ */ isUndefined(id)) {
10415
+ const zone = _zones.get(id);
10416
+ if (zone && !toValue(zone.disabled)) return id;
10417
+ }
10418
+ element = element.parentElement;
10419
+ }
10420
+ return null;
10421
+ }
10422
+ function position(zoneId, drag) {
10423
+ const zone = _zones.get(zoneId);
10424
+ const out = { pointer: drag.current };
10425
+ if (zone?.orientation) {
10426
+ const resolved = zone.indicator?.value ?? null;
10427
+ if (resolved) {
10428
+ out.index = resolved.index;
10429
+ out.indicator = resolved;
10430
+ } else out.index = 0;
10431
+ }
10432
+ return out;
10433
+ }
10434
+ function bail(drag, reason = "cancel") {
10435
+ active.value = null;
10436
+ if (!/* @__PURE__ */ isNull(drag.over)) next(_zones.get(drag.over)?.onLeave, drag);
10437
+ next(_draggables.get(drag.id)?.onCancel, drag, reason);
10438
+ next(options.onCancel, drag, reason);
10439
+ }
10440
+ function onStart(source, origin, via) {
10441
+ if (toValue(_draggables.get(source.id)?.disabled)) return;
10442
+ const draft = {
10443
+ id: source.id,
10444
+ type: source.type,
10445
+ value: source.value,
10446
+ origin,
10447
+ current: origin,
10448
+ delta: {
10449
+ x: 0,
10450
+ y: 0
10451
+ },
10452
+ over: null,
10453
+ willAccept: false,
10454
+ via
10455
+ };
10456
+ try {
10457
+ if (_draggables.get(source.id)?.onBeforeStart?.(draft) === false) return;
10458
+ } catch (error) {
10459
+ logger.error("useDragDrop onBeforeStart threw; treating as veto", error);
10460
+ return;
10461
+ }
10462
+ try {
10463
+ if (options.onBeforeStart?.(draft) === false) return;
10464
+ } catch (error) {
10465
+ logger.error("useDragDrop onBeforeStart threw; treating as veto", error);
10466
+ return;
10467
+ }
10468
+ active.value = draft;
10469
+ }
10470
+ function onMove(point) {
10471
+ if (!active.value) return;
10472
+ const over = at(point);
10473
+ const draft = {
10474
+ ...active.value,
10475
+ current: point,
10476
+ delta: {
10477
+ x: point.x - active.value.origin.x,
10478
+ y: point.y - active.value.origin.y
10479
+ },
10480
+ over,
10481
+ willAccept: false
10482
+ };
10483
+ draft.willAccept = !/* @__PURE__ */ isNull(over) && safeAccept(_zones.get(over)?.accept, draft);
10484
+ const previous = active.value.over;
10485
+ active.value = draft;
10486
+ if (previous !== over) {
10487
+ if (!/* @__PURE__ */ isNull(previous)) next(_zones.get(previous)?.onLeave, draft);
10488
+ if (!/* @__PURE__ */ isNull(over)) next(_zones.get(over)?.onEnter, draft);
10489
+ }
10490
+ next(_draggables.get(draft.id)?.onMove, draft);
10491
+ next(options.onMove, draft);
10492
+ }
10493
+ function onDrop() {
10494
+ if (!active.value) return;
10495
+ const drag = active.value;
10496
+ const zoneId = drag.over;
10497
+ if (/* @__PURE__ */ isNull(zoneId)) {
10498
+ bail(drag);
10499
+ return;
10500
+ }
10501
+ const dropAt = position(zoneId, drag);
10502
+ const zone = _zones.get(zoneId);
10503
+ function vetoed(fn, label) {
10504
+ if (!fn) return false;
10505
+ try {
10506
+ return fn(drag, dropAt) === false;
10507
+ } catch (error) {
10508
+ logger.error(`useDragDrop ${label} threw; treating as veto`, error);
10509
+ return true;
10510
+ }
10511
+ }
10512
+ if (vetoed(zone?.onBeforeDrop, "zone onBeforeDrop") || vetoed(options.onBeforeDrop, "options onBeforeDrop")) {
10513
+ bail(drag, "reject");
10514
+ return;
10515
+ }
10516
+ active.value = null;
10517
+ next(zone?.onDrop, drag, dropAt);
10518
+ next(options.onDrop, drag, dropAt);
10519
+ }
10520
+ function cancel() {
10521
+ if (!active.value) return;
10522
+ bail(active.value);
9389
10523
  }
9390
- const timer = useTimer(fire, { duration });
9391
- function start(direction, options = {}) {
9392
- const previous = resolver;
9393
- resolver = void 0;
9394
- isOpening.value = direction;
9395
- minDelay = options.minDelay ?? 0;
9396
- previous?.(direction);
9397
- const ms = duration();
9398
- return new Promise((resolve) => {
9399
- resolver = resolve;
9400
- if (ms <= 0) {
9401
- timer.stop();
9402
- fire();
9403
- return;
9404
- }
9405
- timer.start();
9406
- });
10524
+ const context = {
10525
+ draggables,
10526
+ zones,
10527
+ active: shallowReadonly(active),
10528
+ isDragging,
10529
+ cancel
10530
+ };
10531
+ const disposers = [];
10532
+ const adapters = options.adapters ?? [new PointerAdapter(), new KeyboardAdapter()];
10533
+ const emit = {
10534
+ start: (source, origin, via) => onStart(source, origin, via),
10535
+ move: (point) => onMove(point),
10536
+ drop: () => onDrop(),
10537
+ cancel: () => cancel()
10538
+ };
10539
+ const adapterContext = {
10540
+ ...context,
10541
+ emit
10542
+ };
10543
+ for (const adapter of adapters) try {
10544
+ adapter.setup(adapterContext);
10545
+ disposers.push(() => adapter.dispose());
10546
+ } catch (error) {
10547
+ logger.error("useDragDrop adapter setup threw; skipping adapter", error);
10548
+ try {
10549
+ adapter.dispose();
10550
+ } catch (disposeError) {
10551
+ logger.error("useDragDrop adapter dispose threw after setup failure", disposeError);
10552
+ }
9407
10553
  }
9408
- function stop() {
9409
- const resolve = resolver;
9410
- resolver = void 0;
9411
- timer.stop();
9412
- resolve?.(isOpening.value);
10554
+ for (const plugin of plugins) try {
10555
+ const dispose = plugin(context);
10556
+ if (/* @__PURE__ */ isFunction(dispose)) disposers.push(dispose);
10557
+ } catch (error) {
10558
+ logger.error("useDragDrop plugin install threw; skipping plugin", error);
9413
10559
  }
10560
+ _draggables.on("unregister:ticket", (ticket) => {
10561
+ if (active.value?.id === ticket.id) cancel();
10562
+ });
10563
+ _zones.on("unregister:ticket", (ticket) => {
10564
+ const scope = scopes.get(ticket.id);
10565
+ if (scope) {
10566
+ scope.stop();
10567
+ scopes.delete(ticket.id);
10568
+ }
10569
+ if (active.value?.over === ticket.id) {
10570
+ next(ticket.onLeave, active.value);
10571
+ active.value = {
10572
+ ...active.value,
10573
+ over: null,
10574
+ willAccept: false
10575
+ };
10576
+ }
10577
+ });
9414
10578
  onScopeDispose(() => {
9415
- const resolve = resolver;
9416
- resolver = void 0;
9417
- resolve?.(isOpening.value);
10579
+ if (!/* @__PURE__ */ isNull(active.value)) cancel();
10580
+ for (const dispose of disposers.toReversed()) try {
10581
+ dispose();
10582
+ } catch (error) {
10583
+ logger.error("useDragDrop disposer threw", error);
10584
+ }
10585
+ for (const scope of scopes.values()) try {
10586
+ scope.stop();
10587
+ } catch (error) {
10588
+ logger.error("useDragDrop zone scope dispose threw", error);
10589
+ }
10590
+ scopes.clear();
10591
+ nodes.clear();
10592
+ try {
10593
+ _draggables.dispose();
10594
+ } catch (error) {
10595
+ logger.error("useDragDrop draggables dispose threw", error);
10596
+ }
10597
+ try {
10598
+ _zones.dispose();
10599
+ } catch (error) {
10600
+ logger.error("useDragDrop zones dispose threw", error);
10601
+ }
9418
10602
  }, 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
- };
10603
+ return context;
9429
10604
  }
9430
10605
  //#endregion
9431
- //#region src/composables/useFeatures/adapters/generic/index.ts
10606
+ //#region src/composables/useFeatures/adapters/adapter.ts
9432
10607
  var FeaturesAdapter = class {};
9433
10608
  //#endregion
9434
10609
  //#region src/composables/useFeatures/index.ts
@@ -9811,9 +10986,11 @@ function useHotkey(keys, callback, options = {}, _platform) {
9811
10986
  let isSequence = false;
9812
10987
  let groupIndex = 0;
9813
10988
  function isInputFocused() {
10989
+ /* v8 ignore next -- IN_BROWSER always true in happy-dom test env */
9814
10990
  if (!IN_BROWSER) return false;
9815
10991
  if (toValue(inputs)) return false;
9816
10992
  const activeElement = document.activeElement;
10993
+ /* v8 ignore next -- defensive: document.activeElement is always set in happy-dom */
9817
10994
  if (!activeElement) return false;
9818
10995
  const role = activeElement.getAttribute("role");
9819
10996
  if (role === "textbox" || role === "searchbox" || role === "combobox" || role === "spinbutton") return true;
@@ -9867,6 +11044,7 @@ function useHotkey(keys, callback, options = {}, _platform) {
9867
11044
  const currentKeys = toValue(keys);
9868
11045
  if (!currentKeys) return;
9869
11046
  const groups = splitKeySequence(currentKeys.toLowerCase());
11047
+ /* v8 ignore next -- defensive: splitKeySequence rejects empty strings earlier */
9870
11048
  if (groups.length === 0) return;
9871
11049
  isSequence = groups.length > 1;
9872
11050
  keyGroups = groups;
@@ -9919,6 +11097,7 @@ function isModifier(key) {
9919
11097
  function parseKeyGroup(group) {
9920
11098
  const { keys: parts } = splitKeyCombination(group.toLowerCase());
9921
11099
  const modifiers = Object.fromEntries(MODIFIERS.map((m) => [m, false]));
11100
+ /* v8 ignore next 3 -- defensive: parseKeyGroup is not invoked with empty parts */
9922
11101
  if (parts.length === 0) return {
9923
11102
  modifiers,
9924
11103
  actualKey: void 0
@@ -10144,11 +11323,13 @@ function useIntersectionObserver(target, callback, options = {}) {
10144
11323
  observe: (obs, el) => obs.observe(el),
10145
11324
  onEntry: (entries) => {
10146
11325
  const latest = entries.at(-1);
11326
+ /* v8 ignore next -- defensive: IntersectionObserver always emits at least one entry */
10147
11327
  if (latest) isIntersecting.value = latest.isIntersecting;
10148
11328
  },
10149
11329
  onPause: () => {
10150
11330
  isIntersecting.value = false;
10151
11331
  },
11332
+ /* v8 ignore next -- defensive nullish coalesce: entries always populated when shouldStop fires */
10152
11333
  shouldStop: (entries) => entries.at(-1)?.isIntersecting ?? false,
10153
11334
  immediate: options.immediate ? (el) => {
10154
11335
  return [{
@@ -10198,6 +11379,7 @@ function useElementIntersection(target, options = {}) {
10198
11379
  const intersectionRatio = shallowRef(0);
10199
11380
  const { pause: _pause, resume, stop, isActive, isPaused } = useIntersectionObserver(target, (entries) => {
10200
11381
  const entry = entries.at(-1);
11382
+ /* v8 ignore next 4 -- defensive: IntersectionObserver always emits at least one entry */
10201
11383
  if (entry) {
10202
11384
  isIntersecting.value = entry.isIntersecting;
10203
11385
  intersectionRatio.value = entry.intersectionRatio;
@@ -10447,131 +11629,6 @@ function usePrefersContrast() {
10447
11629
  return useMediaQuery("(prefers-contrast: more)");
10448
11630
  }
10449
11631
  //#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
11632
  //#region src/composables/useNotifications/index.ts
10576
11633
  /**
10577
11634
  * @module useNotifications
@@ -11100,10 +12157,10 @@ const [createNotificationsContext, createNotificationsPlugin, useNotifications]
11100
12157
  });
11101
12158
  //#endregion
11102
12159
  //#region src/composables/usePermissions/adapters/adapter.ts
11103
- var PermissionAdapter = class {};
12160
+ var PermissionsAdapter = class {};
11104
12161
  //#endregion
11105
12162
  //#region src/composables/usePermissions/adapters/v0.ts
11106
- var Vuetify0PermissionAdapter = class extends PermissionAdapter {
12163
+ var V0PermissionsAdapter = class extends PermissionsAdapter {
11107
12164
  constructor() {
11108
12165
  super();
11109
12166
  }
@@ -11165,7 +12222,7 @@ var Vuetify0PermissionAdapter = class extends PermissionAdapter {
11165
12222
  * ```
11166
12223
  */
11167
12224
  function createPermissions(_options = {}) {
11168
- const { adapter = new Vuetify0PermissionAdapter(), permissions = {}, ...options } = _options;
12225
+ const { adapter = new V0PermissionsAdapter(), permissions = {}, ...options } = _options;
11169
12226
  const record = {};
11170
12227
  for (const role in permissions) {
11171
12228
  if (!record[role]) record[role] = {};
@@ -11627,8 +12684,11 @@ function useRovingFocus(items, options = {}) {
11627
12684
  };
11628
12685
  }
11629
12686
  //#endregion
12687
+ //#region src/composables/useRtl/adapters/adapter.ts
12688
+ var RtlAdapter = class {};
12689
+ //#endregion
11630
12690
  //#region src/composables/useRtl/adapters/v0.ts
11631
- var Vuetify0RtlAdapter = class {
12691
+ var V0RtlAdapter = class extends RtlAdapter {
11632
12692
  setup(app, context, target) {
11633
12693
  if (IN_BROWSER) {
11634
12694
  if (/* @__PURE__ */ isNull(target)) return;
@@ -11696,7 +12756,7 @@ function createRtlFallback() {
11696
12756
  }
11697
12757
  const [createRtlContext, createRtlPlugin, useRtl] = createPluginContext("v0:rtl", (options) => createRtl(options), {
11698
12758
  fallback: () => createRtlFallback(),
11699
- setup: (context, app, { adapter = new Vuetify0RtlAdapter(), target }) => {
12759
+ setup: (context, app, { adapter = new V0RtlAdapter(), target }) => {
11700
12760
  adapter.setup(app, context, target);
11701
12761
  },
11702
12762
  persist: (ctx) => ctx.isRtl.value,
@@ -11935,13 +12995,23 @@ function useStack(namespace = "v0:stack") {
11935
12995
  }
11936
12996
  }
11937
12997
  //#endregion
12998
+ //#region src/composables/useStorage/adapters/adapter.ts
12999
+ var StorageAdapter = class {
13000
+ get length() {
13001
+ return 0;
13002
+ }
13003
+ key(_index) {
13004
+ return null;
13005
+ }
13006
+ };
13007
+ //#endregion
11938
13008
  //#region src/composables/useStorage/adapters/memory.ts
11939
13009
  /**
11940
- * In-memory storage adapter that implements the StorageAdapter interface.
13010
+ * In-memory storage adapter that extends the StorageAdapter abstract class.
11941
13011
  * This adapter provides temporary storage that persists only for the current
11942
13012
  * session and is useful for testing or when persistent storage is not available.
11943
13013
  */
11944
- var MemoryAdapter = class {
13014
+ var MemoryStorageAdapter = class extends StorageAdapter {
11945
13015
  store = /* @__PURE__ */ new Map();
11946
13016
  get length() {
11947
13017
  return this.store.size;
@@ -12013,7 +13083,7 @@ var MemoryAdapter = class {
12013
13083
  * ```
12014
13084
  */
12015
13085
  function createStorage(options = {}) {
12016
- const { adapter = IN_BROWSER ? window.localStorage : new MemoryAdapter(), prefix = "v0:", serializer = {
13086
+ const { adapter = IN_BROWSER ? window.localStorage : new MemoryStorageAdapter(), prefix = "v0:", serializer = {
12017
13087
  read: JSON.parse,
12018
13088
  write: JSON.stringify
12019
13089
  }, ttl } = options;
@@ -12028,9 +13098,9 @@ function createStorage(options = {}) {
12028
13098
  if (/* @__PURE__ */ isNullOrUndefined(raw)) return void 0;
12029
13099
  try {
12030
13100
  const parsed = serializer.read(raw);
12031
- if (ttl && /* @__PURE__ */ isObject(parsed) && "__v0" in parsed && "__v" in parsed) {
13101
+ if (/* @__PURE__ */ isObject(parsed) && "__v0" in parsed && "__v" in parsed) {
12032
13102
  const envelope = parsed;
12033
- if (Date.now() - envelope.__t > ttl) {
13103
+ if (ttl && Date.now() - envelope.__t > ttl) {
12034
13104
  adapter?.removeItem(prefixedKey);
12035
13105
  return;
12036
13106
  }
@@ -12110,7 +13180,7 @@ function createStorage(options = {}) {
12110
13180
  };
12111
13181
  }
12112
13182
  function createStorageFallback() {
12113
- return createStorage({ adapter: new MemoryAdapter() });
13183
+ return createStorage({ adapter: new MemoryStorageAdapter() });
12114
13184
  }
12115
13185
  const [createStorageContext, createStoragePlugin, useStorage] = createPluginContext("v0:storage", (options) => createStorage(options), { fallback: () => createStorageFallback() });
12116
13186
  //#endregion
@@ -12750,6 +13820,7 @@ function useClickOutside(target, handler, options = {}) {
12750
13820
  * Check if an element matches resolved ignore targets.
12751
13821
  */
12752
13822
  function isIgnored(el, selectors, elements) {
13823
+ /* v8 ignore next -- defensive guard, callers always pass an Element */
12753
13824
  if (!el) return false;
12754
13825
  for (const selector of selectors) try {
12755
13826
  if (el.matches(selector) || !/* @__PURE__ */ isNull(el.closest(selector))) return true;
@@ -12776,6 +13847,7 @@ function useClickOutside(target, handler, options = {}) {
12776
13847
  const targets = getTargets();
12777
13848
  if (targets.length === 0) return false;
12778
13849
  return targets.every((el) => {
13850
+ /* v8 ignore next -- defensive: getTargets filters to Element-typed values */
12779
13851
  if (/* @__PURE__ */ isNullOrUndefined(el) || !/* @__PURE__ */ isFunction(el.contains)) return false;
12780
13852
  return el !== eventTarget && !el.contains(eventTarget);
12781
13853
  });
@@ -12785,6 +13857,7 @@ function useClickOutside(target, handler, options = {}) {
12785
13857
  */
12786
13858
  function isOutsideBounds(x, y) {
12787
13859
  const targets = getTargets();
13860
+ /* v8 ignore next -- edge case: bounds check only invoked when targets exist */
12788
13861
  if (targets.length === 0) return false;
12789
13862
  return targets.every((el) => {
12790
13863
  const { left, right, top, bottom } = el.getBoundingClientRect();
@@ -12795,6 +13868,7 @@ function useClickOutside(target, handler, options = {}) {
12795
13868
  * Validate that the target is still in the DOM.
12796
13869
  */
12797
13870
  function isValidTarget(eventTarget) {
13871
+ /* v8 ignore next -- type guard for non-Element targets (e.g., document, window) */
12798
13872
  if (!/* @__PURE__ */ isElement(eventTarget)) return false;
12799
13873
  if (!eventTarget.isConnected) return false;
12800
13874
  return true;
@@ -12923,6 +13997,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
12923
13997
  }, { immediate: true });
12924
13998
  watch(context.isOpen, (isOpen) => {
12925
13999
  const element = contentRef.value?.element;
14000
+ /* v8 ignore next -- defensive guard, element is always present after mount */
12926
14001
  if (!element) return;
12927
14002
  if (isOpen) element.showModal?.();
12928
14003
  else element.close?.();
@@ -14001,7 +15076,7 @@ const _sfc_main$21 = /* @__PURE__ */ defineComponent({
14001
15076
  const selection = createSelection({
14002
15077
  disabled: toRef(() => __props.disabled),
14003
15078
  multiple: toRef(() => __props.multiple),
14004
- mandatory: __props.mandatory,
15079
+ mandatory: toRef(() => __props.mandatory),
14005
15080
  events: true
14006
15081
  });
14007
15082
  useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
@@ -14123,7 +15198,7 @@ const _sfc_main$25 = /* @__PURE__ */ defineComponent({
14123
15198
  } catch {}
14124
15199
  const ticket = group?.register({
14125
15200
  value: __props.value,
14126
- disabled: __props.disabled
15201
+ disabled: () => toValue(__props.disabled) ?? false
14127
15202
  });
14128
15203
  const isDisabled = toRef(() => group && ticket ? toValue(ticket.disabled) || toValue(group.disabled) : __props.disabled);
14129
15204
  const isReadonly = toRef(() => __props.readonly);
@@ -14604,6 +15679,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14604
15679
  const scrollPaddingEnd = shallowRef();
14605
15680
  function syncScrollPadding() {
14606
15681
  const element = el.value;
15682
+ /* v8 ignore next 5 -- defensive: ResizeObserver only fires when element exists */
14607
15683
  if (!element) {
14608
15684
  scrollPaddingStart.value = void 0;
14609
15685
  scrollPaddingEnd.value = void 0;
@@ -14612,17 +15688,20 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14612
15688
  const cs = getComputedStyle(element);
14613
15689
  const start = isVertical.value ? cs.paddingBlockStart : cs.paddingInlineStart;
14614
15690
  const end = isVertical.value ? cs.paddingBlockEnd : cs.paddingInlineEnd;
15691
+ /* v8 ignore next 2 -- happy-dom returns no computed padding so '0px' branch always taken */
14615
15692
  scrollPaddingStart.value = start && start !== "0px" ? start : void 0;
14616
15693
  scrollPaddingEnd.value = end && end !== "0px" ? end : void 0;
14617
15694
  }
14618
15695
  useResizeObserver(el, syncScrollPadding, { immediate: true });
14619
15696
  watch(isVertical, syncScrollPadding);
14620
15697
  const slideStep = toRef(() => {
15698
+ /* v8 ignore next -- defensive: getter only invoked after viewport mounts */
14621
15699
  if (!el.value) return 0;
14622
15700
  if ((isVertical.value ? height.value : width.value) === 0) return 0;
14623
15701
  const first = toValue(carousel.seek("first")?.el);
14624
15702
  const second = toValue(carousel.seek("first", 1)?.el);
14625
15703
  if (!first) return 0;
15704
+ /* v8 ignore next 3 -- happy-dom returns 0 for offset* so layout-dependent branches never reach here */
14626
15705
  if (!second) return isVertical.value ? first.offsetHeight : first.offsetWidth;
14627
15706
  return isVertical.value ? second.offsetTop - first.offsetTop : second.offsetLeft - first.offsetLeft;
14628
15707
  });
@@ -14633,11 +15712,13 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14633
15712
  return;
14634
15713
  }
14635
15714
  const viewport = el.value;
15715
+ /* v8 ignore next -- defensive: scrollend fires only on attached element with measured slideStep */
14636
15716
  if (!viewport || slideStep.value === 0) return;
14637
15717
  isDragging.value = false;
14638
15718
  const scrollPos = isVertical.value ? viewport.scrollTop : viewport.scrollLeft;
14639
15719
  const snapIndex = Math.round(scrollPos / slideStep.value);
14640
15720
  const id = carousel.lookup(snapIndex);
15721
+ /* v8 ignore next 3 -- snapIndex resolution requires real layout, not exercised in happy-dom */
14641
15722
  if (!/* @__PURE__ */ isUndefined(id) && id !== carousel.selectedItem.value?.id) carousel.select(id);
14642
15723
  });
14643
15724
  useEventListener(el, "scroll", () => {
@@ -14660,6 +15741,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14660
15741
  useEventListener(el, "mousedown", (e) => {
14661
15742
  if (e.button !== 0) return;
14662
15743
  const viewport = el.value;
15744
+ /* v8 ignore next -- defensive: mousedown only fires on attached viewport */
14663
15745
  if (!viewport) return;
14664
15746
  carousel.pause();
14665
15747
  dragStart = isVertical.value ? e.clientY : e.clientX;
@@ -14669,6 +15751,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14669
15751
  useToggleScope(() => snapDisabled.value, () => {
14670
15752
  useDocumentEventListener("mousemove", (e) => {
14671
15753
  const viewport = el.value;
15754
+ /* v8 ignore next -- defensive: mousemove only fires within active drag scope */
14672
15755
  if (!viewport) return;
14673
15756
  e.preventDefault();
14674
15757
  const delta = (isVertical.value ? e.clientY : e.clientX) - dragStart;
@@ -14707,6 +15790,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14707
15790
  }
14708
15791
  watch(() => carousel.selectedIndex.value, (index) => {
14709
15792
  const viewport = el.value;
15793
+ /* v8 ignore next -- defensive: viewport always present when watch fires after mount */
14710
15794
  if (!viewport || slideStep.value === 0) return;
14711
15795
  syncing.value = true;
14712
15796
  const position = index * slideStep.value;
@@ -14724,6 +15808,7 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
14724
15808
  [isVertical.value ? "overflow-x" : "overflow-y"]: "hidden",
14725
15809
  "scroll-snap-type": snapDisabled.value ? "none" : `${isVertical.value ? "y" : "x"} mandatory`,
14726
15810
  "scrollbar-width": "none",
15811
+ /* v8 ignore next 3 -- happy-dom never sets computed padding so spreads always evaluate to {} */
14727
15812
  ...scrollPaddingStart.value ? { [`scroll-padding-${axis}-start`]: scrollPaddingStart.value } : {},
14728
15813
  ...scrollPaddingEnd.value ? { [`scroll-padding-${axis}-end`]: scrollPaddingEnd.value } : {},
14729
15814
  ...snapDisabled.value ? { "user-select": "none" } : {}
@@ -14777,7 +15862,7 @@ const _sfc_main$27 = /* @__PURE__ */ defineComponent({
14777
15862
  const ticket = carousel.register({
14778
15863
  id: __props.id,
14779
15864
  value: __props.value,
14780
- disabled: __props.disabled,
15865
+ disabled: () => toValue(__props.disabled) ?? false,
14781
15866
  el
14782
15867
  });
14783
15868
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(carousel.disabled));
@@ -15429,8 +16514,8 @@ const _sfc_main$34 = /* @__PURE__ */ defineComponent({
15429
16514
  const model = useModel(__props, "modelValue");
15430
16515
  const group = createGroup({
15431
16516
  disabled: toRef(() => __props.disabled),
15432
- enroll: __props.enroll,
15433
- mandatory: __props.mandatory,
16517
+ enroll: toRef(() => __props.enroll),
16518
+ mandatory: toRef(() => __props.mandatory),
15434
16519
  events: true
15435
16520
  });
15436
16521
  useProxyModel(group, model, { multiple: true });
@@ -15501,8 +16586,8 @@ const _sfc_main$37 = /* @__PURE__ */ defineComponent({
15501
16586
  const ticket = group?.register({
15502
16587
  id: __props.id,
15503
16588
  value: __props.value,
15504
- disabled: __props.disabled,
15505
- indeterminate: __props.indeterminate
16589
+ disabled: () => toValue(__props.disabled) ?? false,
16590
+ indeterminate: () => toValue(__props.indeterminate) ?? false
15506
16591
  });
15507
16592
  const isChecked = toRef(() => ticket ? toValue(ticket.isSelected) : model.value ?? false);
15508
16593
  const isMixed = toRef(() => ticket ? toValue(ticket.isMixed) : toValue(__props.indeterminate) ?? false);
@@ -15582,15 +16667,15 @@ const _sfc_main$37 = /* @__PURE__ */ defineComponent({
15582
16667
  "aria-invalid": __props.ariaInvalid || void 0,
15583
16668
  "tabindex": isDisabled.value ? void 0 : 0,
15584
16669
  "data-state": dataState.value,
15585
- "data-disabled": isDisabled.value ? true : void 0
16670
+ "data-disabled": isDisabled.value ? true : void 0,
16671
+ "onClick": onClick,
16672
+ "onKeydown": onKeydown
15586
16673
  }
15587
16674
  }));
15588
16675
  return (_ctx, _cache) => {
15589
16676
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(_sfc_main$9), mergeProps(mergeProps(unref(attrs), slotProps.value.attrs), {
15590
16677
  as: __props.as,
15591
- renderless: __props.renderless,
15592
- onClick,
15593
- onKeydown
16678
+ renderless: __props.renderless
15594
16679
  }), {
15595
16680
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
15596
16681
  _: 3
@@ -16261,10 +17346,10 @@ const _sfc_main$51 = /* @__PURE__ */ defineComponent({
16261
17346
  id: __props.id,
16262
17347
  name: __props.name,
16263
17348
  form: __props.form,
16264
- disabled: __props.disabled,
16265
- multiple: __props.multiple,
16266
- mandatory: __props.mandatory,
16267
- strict: __props.strict,
17349
+ disabled: toRef(() => __props.disabled),
17350
+ multiple: toRef(() => __props.multiple),
17351
+ mandatory: toRef(() => __props.mandatory),
17352
+ strict: toRef(() => __props.strict),
16268
17353
  error: () => __props.error,
16269
17354
  errorMessages: () => __props.errorMessages,
16270
17355
  adapter: __props.adapter,
@@ -16629,7 +17714,7 @@ const _sfc_main$50 = /* @__PURE__ */ defineComponent({
16629
17714
  const ticket = context.selection.register({
16630
17715
  id: __props.id,
16631
17716
  value: __props.value,
16632
- disabled: __props.disabled
17717
+ disabled: () => toValue(__props.disabled) ?? false
16633
17718
  });
16634
17719
  const elementId = `${context.id}-option-${ticket.id}`;
16635
17720
  const isSelected = toRef(() => toValue(ticket.isSelected));
@@ -16657,14 +17742,12 @@ const _sfc_main$50 = /* @__PURE__ */ defineComponent({
16657
17742
  "data-selected": isSelected.value || void 0,
16658
17743
  "data-highlighted": isHighlighted.value ? "" : void 0,
16659
17744
  "data-disabled": isDisabled.value || void 0,
16660
- "data-id": String(ticket.id)
17745
+ "data-id": String(ticket.id),
17746
+ "onClick": onClick
16661
17747
  }
16662
17748
  }));
16663
17749
  return (_ctx, _cache) => {
16664
- return withDirectives((openBlock(), createBlock(unref(_sfc_main$9), mergeProps(slotProps.value.attrs, {
16665
- as: __props.as,
16666
- onClick
16667
- }), {
17750
+ return withDirectives((openBlock(), createBlock(unref(_sfc_main$9), mergeProps(slotProps.value.attrs, { as: __props.as }), {
16668
17751
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
16669
17752
  _: 3
16670
17753
  }, 16, ["as"])), [[vShow, isFiltered.value]]);
@@ -16996,6 +18079,7 @@ const _sfc_main$54 = /* @__PURE__ */ defineComponent({
16996
18079
  }, { immediate: true });
16997
18080
  watch(context.isOpen, (isOpen) => {
16998
18081
  const element = contentRef.value?.element;
18082
+ /* v8 ignore next -- defensive guard, element is always present after mount */
16999
18083
  if (!element) return;
17000
18084
  if (isOpen) element.showModal?.();
17001
18085
  else element.close?.();
@@ -17306,12 +18390,12 @@ const _sfc_main$61 = /* @__PURE__ */ defineComponent({
17306
18390
  const isDisabled = toRef(() => __props.disabled);
17307
18391
  const selection = createSelection({
17308
18392
  disabled: isDisabled,
17309
- enroll: __props.enroll,
17310
- mandatory: __props.mandatory,
17311
- multiple: __props.multiple,
18393
+ enroll: toRef(() => __props.enroll),
18394
+ mandatory: toRef(() => __props.mandatory),
18395
+ multiple: toRef(() => __props.multiple),
17312
18396
  events: true
17313
18397
  });
17314
- useProxyModel(selection, model, { multiple: __props.multiple });
18398
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
17315
18399
  const slotProps = toRef(() => ({
17316
18400
  isDisabled,
17317
18401
  select: selection.select,
@@ -17349,7 +18433,7 @@ const _sfc_main$63 = /* @__PURE__ */ defineComponent({
17349
18433
  const ticket = selection.register({
17350
18434
  id: __props.id,
17351
18435
  value: __props.value,
17352
- disabled: __props.disabled
18436
+ disabled: () => toValue(__props.disabled) ?? false
17353
18437
  });
17354
18438
  const headerId = toRef(() => `${ticket.id}-header`);
17355
18439
  const contentId = toRef(() => `${ticket.id}-content`);
@@ -17755,8 +18839,8 @@ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
17755
18839
  const model = useModel(__props, "modelValue");
17756
18840
  const group = createGroup({
17757
18841
  disabled: toRef(() => __props.disabled),
17758
- enroll: __props.enroll,
17759
- mandatory: __props.mandatory,
18842
+ enroll: toRef(() => __props.enroll),
18843
+ mandatory: toRef(() => __props.mandatory),
17760
18844
  events: true
17761
18845
  });
17762
18846
  useProxyModel(group, model, { multiple: true });
@@ -17797,8 +18881,8 @@ const _sfc_main$65 = /* @__PURE__ */ defineComponent({
17797
18881
  const ticket = group.register({
17798
18882
  id: __props.id,
17799
18883
  value: __props.value,
17800
- disabled: __props.disabled,
17801
- indeterminate: __props.indeterminate
18884
+ disabled: () => toValue(__props.disabled) ?? false,
18885
+ indeterminate: () => toValue(__props.indeterminate) ?? false
17802
18886
  });
17803
18887
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(group.disabled));
17804
18888
  onBeforeUnmount(() => {
@@ -18939,6 +20023,8 @@ const _sfc_main$77 = /* @__PURE__ */ defineComponent({
18939
20023
  delay.stop();
18940
20024
  spin.stop();
18941
20025
  }
20026
+ useDocumentEventListener("pointerup", stop);
20027
+ useDocumentEventListener("pointercancel", stop);
18942
20028
  function onPointerdown(e) {
18943
20029
  if (isDisabled.value) return;
18944
20030
  if (e.button !== 0) return;
@@ -19078,6 +20164,8 @@ const _sfc_main$80 = /* @__PURE__ */ defineComponent({
19078
20164
  delay.stop();
19079
20165
  spin.stop();
19080
20166
  }
20167
+ useDocumentEventListener("pointerup", stop);
20168
+ useDocumentEventListener("pointercancel", stop);
19081
20169
  function onPointerdown(e) {
19082
20170
  if (isDisabled.value) return;
19083
20171
  if (e.button !== 0) return;
@@ -20735,7 +21823,9 @@ const _sfc_main$103 = /* @__PURE__ */ defineComponent({
20735
21823
  return /* @__PURE__ */ isArray(model.value) ? model.value : [model.value];
20736
21824
  },
20737
21825
  set: (arr) => {
21826
+ /* v8 ignore next -- defensive guard for null/undefined model with empty registry */
20738
21827
  if (/* @__PURE__ */ isNullOrUndefined(model.value) && arr.length === 0) return;
21828
+ /* v8 ignore next -- arr[0] always defined when scalar=true since model started as a number */
20739
21829
  model.value = scalar ? arr[0] ?? 0 : arr;
20740
21830
  }
20741
21831
  });
@@ -20847,10 +21937,11 @@ const _sfc_main$100 = /* @__PURE__ */ defineComponent({
20847
21937
  setup(__props) {
20848
21938
  const attrs = useAttrs();
20849
21939
  const root = useProgressRoot(__props.namespace);
20850
- const ticket = root.register({ value: toRef(() => __props.value ?? 0) });
21940
+ const ticket = /* @__PURE__ */ isUndefined(__props.value) ? root.register() : root.register({ value: toRef(() => __props.value) });
20851
21941
  onBeforeUnmount(() => {
20852
21942
  ticket.unregister();
20853
21943
  });
21944
+ /* v8 ignore next -- defensive: registered ticket.value always coalesces to number via toRef getter above */
20854
21945
  const current = toRef(() => toValue(ticket.value) ?? 0);
20855
21946
  const percent = toRef(() => root.fromValue(current.value));
20856
21947
  const slotProps = toRef(() => ({
@@ -21207,7 +22298,7 @@ const _sfc_main$106 = /* @__PURE__ */ defineComponent({
21207
22298
  const model = useModel(__props, "modelValue");
21208
22299
  const single = createSingle({
21209
22300
  disabled: toRef(() => __props.disabled),
21210
- mandatory: __props.mandatory,
22301
+ mandatory: toRef(() => __props.mandatory),
21211
22302
  events: true
21212
22303
  });
21213
22304
  useProxyModel(single, model, { multiple: false });
@@ -21270,7 +22361,7 @@ const _sfc_main$109 = /* @__PURE__ */ defineComponent({
21270
22361
  const ticket = group.register({
21271
22362
  id: __props.id,
21272
22363
  value: __props.value,
21273
- disabled: __props.disabled,
22364
+ disabled: () => toValue(__props.disabled) ?? false,
21274
22365
  el
21275
22366
  });
21276
22367
  const isChecked = toRef(() => toValue(ticket.isSelected));
@@ -21348,15 +22439,15 @@ const _sfc_main$109 = /* @__PURE__ */ defineComponent({
21348
22439
  "tabindex": isTabbable.value ? 0 : -1,
21349
22440
  "data-state": dataState.value,
21350
22441
  "data-disabled": isDisabled.value ? true : void 0,
21351
- "data-radio-id": __props.id
22442
+ "data-radio-id": __props.id,
22443
+ "onClick": onClick,
22444
+ "onKeydown": onKeydown
21352
22445
  }
21353
22446
  }));
21354
22447
  return (_ctx, _cache) => {
21355
22448
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(_sfc_main$9), mergeProps({ ref: "root" }, mergeProps(unref(attrs), slotProps.value.attrs), {
21356
22449
  as: __props.as,
21357
- renderless: __props.renderless,
21358
- onClick,
21359
- onKeydown
22450
+ renderless: __props.renderless
21360
22451
  }), {
21361
22452
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
21362
22453
  _: 3
@@ -22091,12 +23182,12 @@ const _sfc_main$119 = /* @__PURE__ */ defineComponent({
22091
23182
  const listboxId = `${id}-listbox`;
22092
23183
  const activatorId = `${id}-activator`;
22093
23184
  const selection = createSelection({
22094
- multiple: __props.multiple,
22095
- mandatory: __props.mandatory,
23185
+ multiple: toRef(() => __props.multiple),
23186
+ mandatory: toRef(() => __props.mandatory),
22096
23187
  disabled: toRef(() => __props.disabled),
22097
23188
  events: true
22098
23189
  });
22099
- useProxyModel(selection, model, { multiple: __props.multiple });
23190
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
22100
23191
  const selectedId = toRef(() => selection.selectedIds.values().next().value);
22101
23192
  const popover = usePopover({ id });
22102
23193
  const isOpen = popover.isOpen;
@@ -22342,7 +23433,7 @@ const _sfc_main$117 = /* @__PURE__ */ defineComponent({
22342
23433
  const ticket = context.selection.register({
22343
23434
  id: __props.id,
22344
23435
  value: __props.value,
22345
- disabled: __props.disabled
23436
+ disabled: () => toValue(__props.disabled) ?? false
22346
23437
  });
22347
23438
  const elementId = `${context.id}-option-${ticket.id}`;
22348
23439
  const isSelected = toRef(() => toValue(ticket.isSelected));
@@ -22368,11 +23459,12 @@ const _sfc_main$117 = /* @__PURE__ */ defineComponent({
22368
23459
  "data-selected": isSelected.value || void 0,
22369
23460
  "data-highlighted": isHighlighted.value ? "" : void 0,
22370
23461
  "data-disabled": isDisabled.value || void 0,
22371
- "data-id": String(ticket.id)
23462
+ "data-id": String(ticket.id),
23463
+ "onClick": onClick
22372
23464
  }
22373
23465
  }));
22374
23466
  return (_ctx, _cache) => {
22375
- return openBlock(), createBlock(unref(_sfc_main$9), mergeProps({ as: __props.as }, slotProps.value.attrs, { onClick }), {
23467
+ return openBlock(), createBlock(unref(_sfc_main$9), mergeProps({ as: __props.as }, slotProps.value.attrs), {
22376
23468
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
22377
23469
  _: 3
22378
23470
  }, 16, ["as"]);
@@ -22664,12 +23756,12 @@ const _sfc_main$122 = /* @__PURE__ */ defineComponent({
22664
23756
  const model = useModel(__props, "modelValue");
22665
23757
  const selection = createSelection({
22666
23758
  disabled: toRef(() => __props.disabled),
22667
- enroll: __props.enroll,
22668
- mandatory: __props.mandatory,
22669
- multiple: __props.multiple,
23759
+ enroll: toRef(() => __props.enroll),
23760
+ mandatory: toRef(() => __props.mandatory),
23761
+ multiple: toRef(() => __props.multiple),
22670
23762
  events: true
22671
23763
  });
22672
- useProxyModel(selection, model, { multiple: __props.multiple });
23764
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
22673
23765
  provideSelectionRoot(__props.namespace, selection);
22674
23766
  const slotProps = toRef(() => ({
22675
23767
  isDisabled: toValue(selection.disabled),
@@ -22701,7 +23793,7 @@ const _sfc_main$121 = /* @__PURE__ */ defineComponent({
22701
23793
  const ticket = selection.register({
22702
23794
  id: __props.id,
22703
23795
  value: __props.value,
22704
- disabled: __props.disabled
23796
+ disabled: () => toValue(__props.disabled) ?? false
22705
23797
  });
22706
23798
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(selection.disabled));
22707
23799
  onBeforeUnmount(() => {
@@ -22811,8 +23903,8 @@ const _sfc_main$124 = /* @__PURE__ */ defineComponent({
22811
23903
  const model = useModel(__props, "modelValue");
22812
23904
  const single = createSingle({
22813
23905
  disabled: toRef(() => __props.disabled),
22814
- enroll: __props.enroll,
22815
- mandatory: __props.mandatory,
23906
+ enroll: toRef(() => __props.enroll),
23907
+ mandatory: toRef(() => __props.mandatory),
22816
23908
  events: true
22817
23909
  });
22818
23910
  useProxyModel(single, model, { multiple: false });
@@ -22846,7 +23938,7 @@ const _sfc_main$123 = /* @__PURE__ */ defineComponent({
22846
23938
  const ticket = single.register({
22847
23939
  id: __props.id,
22848
23940
  value: __props.value,
22849
- disabled: __props.disabled
23941
+ disabled: () => toValue(__props.disabled) ?? false
22850
23942
  });
22851
23943
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(single.disabled));
22852
23944
  onBeforeUnmount(() => {
@@ -22975,6 +24067,7 @@ const _sfc_main$127 = /* @__PURE__ */ defineComponent({
22975
24067
  const internal = computed({
22976
24068
  get: () => /* @__PURE__ */ isArray(model.value) ? model.value : [model.value],
22977
24069
  set: (arr) => {
24070
+ /* v8 ignore next -- arr[0] always defined when scalar=true since model started with a number */
22978
24071
  model.value = scalar ? arr[0] ?? 0 : arr;
22979
24072
  }
22980
24073
  });
@@ -22995,20 +24088,25 @@ const _sfc_main$127 = /* @__PURE__ */ defineComponent({
22995
24088
  const dragOffset = shallowRef(0);
22996
24089
  function getPercent(e) {
22997
24090
  const el = track.value;
24091
+ /* v8 ignore next -- defensive: pointermove is gated to active drag, track is mounted by then */
22998
24092
  if (!el) return 0;
22999
24093
  const rect = el.getBoundingClientRect();
23000
24094
  return toValue(slider.orientation) === "vertical" ? (rect.bottom - e.clientY - dragOffset.value) / rect.height * 100 : (e.clientX - rect.left - dragOffset.value) / rect.width * 100;
23001
24095
  }
23002
24096
  useToggleScope(() => !/* @__PURE__ */ isNull(dragging.value), () => {
24097
+ /* v8 ignore next 3 -- IN_BROWSER always true in happy-dom test env */
23003
24098
  if (IN_BROWSER) document.documentElement.style.touchAction = "none";
23004
24099
  useDocumentEventListener("pointermove", (e) => {
24100
+ /* v8 ignore next -- defensive: dragging cleared on pointerup */
23005
24101
  if (/* @__PURE__ */ isNull(dragging.value)) return;
23006
24102
  const percent = getPercent(e);
23007
24103
  slider.set(dragging.value, slider.fromPercent(percent));
23008
24104
  });
23009
24105
  useDocumentEventListener("pointerup", () => {
24106
+ /* v8 ignore next 3 -- IN_BROWSER always true in happy-dom test env */
23010
24107
  if (IN_BROWSER) document.documentElement.style.touchAction = "";
23011
24108
  const values = [...slider.values.value];
24109
+ /* v8 ignore next -- end event scalar branch only fires for single-value drag, not exercised */
23012
24110
  emit("end", scalar ? values[0] ?? 0 : values);
23013
24111
  dragging.value = null;
23014
24112
  dragOffset.value = 0;
@@ -23025,6 +24123,7 @@ const _sfc_main$127 = /* @__PURE__ */ defineComponent({
23025
24123
  } else dragOffset.value = 0;
23026
24124
  dragging.value = index;
23027
24125
  const values = [...slider.values.value];
24126
+ /* v8 ignore next -- start event scalar branch only fires for single-value drag, not exercised */
23028
24127
  emit("start", scalar ? values[0] ?? 0 : values);
23029
24128
  }
23030
24129
  const context = {
@@ -23841,6 +24940,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23841
24940
  const handles = createRegistry();
23842
24941
  watch(() => panels.collection.size, (size, prev) => {
23843
24942
  const values = panels.values();
24943
+ /* v8 ignore next -- defensive: watch fires only when panel registry has at least one entry */
23844
24944
  if (values.length === 0) return;
23845
24945
  const total = values.reduce((sum, t) => sum + t.size, 0);
23846
24946
  if (total === 0 || total === 100) return;
@@ -23859,6 +24959,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23859
24959
  function resize(index, delta, options) {
23860
24960
  const before = panel(index);
23861
24961
  const after = panel(index + 1);
24962
+ /* v8 ignore next -- defensive: resize only invoked between adjacent panels */
23862
24963
  if (!before || !after) return;
23863
24964
  const total = before.size + after.size;
23864
24965
  const min1 = effectiveMin(before);
@@ -23901,8 +25002,10 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23901
25002
  }
23902
25003
  function collapse(index, neighborIndex) {
23903
25004
  const ticket = panel(index);
25005
+ /* v8 ignore next -- defensive: collapse called only on collapsible+selected panels */
23904
25006
  if (!ticket?.collapsible || !toValue(ticket.isSelected)) return;
23905
25007
  const neighbor = panel(neighborIndex ?? (index > 0 ? index - 1 : index + 1));
25008
+ /* v8 ignore next -- defensive: at least one neighbor exists when there are 2+ panels */
23906
25009
  if (!neighbor) return;
23907
25010
  const diff = ticket.size - ticket.collapsedSize;
23908
25011
  const absorbed = Math.min(diff, neighbor.maxSize - neighbor.size);
@@ -23922,12 +25025,15 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23922
25025
  }
23923
25026
  function expand(index, neighborIndex) {
23924
25027
  const ticket = panel(index);
25028
+ /* v8 ignore next -- defensive: expand called only on collapsible+collapsed panels */
23925
25029
  if (!ticket?.collapsible || toValue(ticket.isSelected)) return;
23926
25030
  const neighbor = panel(neighborIndex ?? (index > 0 ? index - 1 : index + 1));
25031
+ /* v8 ignore next -- defensive: at least one neighbor exists when there are 2+ panels */
23927
25032
  if (!neighbor) return;
23928
25033
  const diff = Math.min(ticket.defaultSize, ticket.maxSize) - ticket.collapsedSize;
23929
25034
  const available = neighbor.size - neighbor.minSize;
23930
25035
  const take = Math.min(diff, available);
25036
+ /* v8 ignore next -- defensive: only triggers when neighbor has insufficient space */
23931
25037
  if (ticket.collapsedSize + take < ticket.minSize) return;
23932
25038
  neighbor.size -= take;
23933
25039
  ticket.size = ticket.collapsedSize + take;
@@ -23951,6 +25057,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23951
25057
  remainder -= adjust;
23952
25058
  }
23953
25059
  for (const ticket of values) {
25060
+ /* v8 ignore next -- defensive: existing tests use collapsible panels */
23954
25061
  if (!ticket.collapsible) continue;
23955
25062
  const collapsed = !toValue(ticket.isSelected);
23956
25063
  if (!collapsed && ticket.size <= ticket.collapsedSize) ticket.unselect();
@@ -23962,6 +25069,7 @@ const _sfc_main$137 = /* @__PURE__ */ defineComponent({
23962
25069
  draggingHandle.value = index;
23963
25070
  }
23964
25071
  function onEndDrag() {
25072
+ if (/* @__PURE__ */ isNull(draggingHandle.value)) return;
23965
25073
  draggingHandle.value = null;
23966
25074
  expandAccum.clear();
23967
25075
  emitLayout();
@@ -24058,7 +25166,9 @@ const _sfc_main$136 = /* @__PURE__ */ defineComponent({
24058
25166
  function isPx(value) {
24059
25167
  return /* @__PURE__ */ isString(value) && value.endsWith("px");
24060
25168
  }
24061
- if (isPx(__props.defaultSize) || isPx(__props.minSize) || isPx(__props.maxSize) || isPx(__props.collapsedSize)) useResizeObserver(splitter.rootEl, (entries) => {
25169
+ if (isPx(__props.defaultSize) || isPx(__props.minSize) || isPx(__props.maxSize) || isPx(__props.collapsedSize))
25170
+ /* v8 ignore start -- px-mode panels not exercised in happy-dom (no real layout) */
25171
+ useResizeObserver(splitter.rootEl, (entries) => {
24062
25172
  const rect = entries[0]?.contentRect;
24063
25173
  rootSize.value = splitter.orientation.value === "horizontal" ? rect?.width ?? 0 : rect?.height ?? 0;
24064
25174
  });
@@ -24066,11 +25176,13 @@ const _sfc_main$136 = /* @__PURE__ */ defineComponent({
24066
25176
  if (!/* @__PURE__ */ isString(value)) return value;
24067
25177
  const num = Number.parseFloat(value);
24068
25178
  if (Number.isNaN(num)) return fallback;
25179
+ /* v8 ignore start -- px-mode conversion path not exercised in happy-dom (no real layout) */
24069
25180
  if (value.endsWith("px")) {
24070
25181
  const root = splitter.rootEl.value;
24071
25182
  const dimension = rootSize.value || (splitter.orientation.value === "horizontal" ? root?.offsetWidth : root?.offsetHeight) || 0;
24072
25183
  return dimension > 0 ? num / dimension * 100 : fallback;
24073
25184
  }
25185
+ /* v8 ignore stop */
24074
25186
  return num;
24075
25187
  }
24076
25188
  const ticket = splitter.panels.register({
@@ -24190,9 +25302,11 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24190
25302
  if (hovering.value) return "hover";
24191
25303
  return "inactive";
24192
25304
  });
25305
+ /* v8 ignore next -- defensive: the handle's index always points to a registered panel */
24193
25306
  const valuenow = toRef(() => Math.round(splitter.panel(ticket.index)?.size ?? 0));
24194
25307
  const valuemin = toRef(() => {
24195
25308
  const p = splitter.panel(ticket.index);
25309
+ /* v8 ignore next -- defensive: handle's index always resolves to a registered panel */
24196
25310
  if (!p) return 0;
24197
25311
  return p.collapsible ? p.collapsedSize : p.minSize;
24198
25312
  });
@@ -24216,8 +25330,10 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24216
25330
  useToggleScope(() => splitter.draggingHandle.value === ticket.index, () => {
24217
25331
  const update = useRaf(() => {
24218
25332
  const root = splitter.rootEl.value;
25333
+ /* v8 ignore next -- defensive: drag scope only enters with a mounted root */
24219
25334
  if (!root) return;
24220
25335
  const rootSize = isHorizontal.value ? root.offsetWidth : root.offsetHeight;
25336
+ /* v8 ignore next -- happy-dom returns 0 for offset dimensions; not exercised in tests */
24221
25337
  if (!rootSize) return;
24222
25338
  const delta = (latestPos - startPosition.value) / rootSize * 100;
24223
25339
  startPosition.value = latestPos;
@@ -24229,6 +25345,7 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24229
25345
  });
24230
25346
  useDocumentEventListener("pointerup", () => {
24231
25347
  update.cancel();
25348
+ /* v8 ignore next 4 -- IN_BROWSER always true in happy-dom test env */
24232
25349
  if (IN_BROWSER) {
24233
25350
  document.documentElement.style.userSelect = "";
24234
25351
  document.documentElement.style.touchAction = "";
@@ -24237,6 +25354,7 @@ const _sfc_main$135 = /* @__PURE__ */ defineComponent({
24237
25354
  });
24238
25355
  onScopeDispose(() => {
24239
25356
  splitter.onEndDrag();
25357
+ /* v8 ignore next 4 -- IN_BROWSER always true in happy-dom test env */
24240
25358
  if (IN_BROWSER) {
24241
25359
  document.documentElement.style.userSelect = "";
24242
25360
  document.documentElement.style.touchAction = "";
@@ -24459,8 +25577,8 @@ const _sfc_main$139 = /* @__PURE__ */ defineComponent({
24459
25577
  const model = useModel(__props, "modelValue");
24460
25578
  const step = createStep({
24461
25579
  disabled: toRef(() => __props.disabled),
24462
- enroll: __props.enroll,
24463
- mandatory: __props.mandatory,
25580
+ enroll: toRef(() => __props.enroll),
25581
+ mandatory: toRef(() => __props.mandatory),
24464
25582
  events: true
24465
25583
  });
24466
25584
  useProxyModel(step, model, { multiple: false });
@@ -24499,7 +25617,7 @@ const _sfc_main$138 = /* @__PURE__ */ defineComponent({
24499
25617
  const ticket = step.register({
24500
25618
  id: __props.id,
24501
25619
  value: __props.value,
24502
- disabled: __props.disabled
25620
+ disabled: () => toValue(__props.disabled) ?? false
24503
25621
  });
24504
25622
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(step.disabled));
24505
25623
  onBeforeUnmount(() => {
@@ -24612,8 +25730,8 @@ const _sfc_main$140 = /* @__PURE__ */ defineComponent({
24612
25730
  const model = useModel(__props, "modelValue");
24613
25731
  const group = createGroup({
24614
25732
  disabled: toRef(() => __props.disabled),
24615
- enroll: __props.enroll,
24616
- mandatory: __props.mandatory,
25733
+ enroll: toRef(() => __props.enroll),
25734
+ mandatory: toRef(() => __props.mandatory),
24617
25735
  events: true
24618
25736
  });
24619
25737
  useProxyModel(group, model, { multiple: true });
@@ -24684,8 +25802,8 @@ const _sfc_main$142 = /* @__PURE__ */ defineComponent({
24684
25802
  const ticket = group?.register({
24685
25803
  id: __props.id,
24686
25804
  value: __props.value,
24687
- disabled: __props.disabled,
24688
- indeterminate: __props.indeterminate
25805
+ disabled: () => toValue(__props.disabled) ?? false,
25806
+ indeterminate: () => toValue(__props.indeterminate) ?? false
24689
25807
  });
24690
25808
  const isChecked = toRef(() => ticket ? toValue(ticket.isSelected) : model.value ?? false);
24691
25809
  const isMixed = toRef(() => ticket ? toValue(ticket.isMixed) : toValue(__props.indeterminate) ?? false);
@@ -24765,15 +25883,15 @@ const _sfc_main$142 = /* @__PURE__ */ defineComponent({
24765
25883
  "aria-invalid": __props.ariaInvalid || void 0,
24766
25884
  "tabindex": isDisabled.value ? void 0 : 0,
24767
25885
  "data-state": dataState.value,
24768
- "data-disabled": isDisabled.value ? true : void 0
25886
+ "data-disabled": isDisabled.value ? true : void 0,
25887
+ "onClick": onClick,
25888
+ "onKeydown": onKeydown
24769
25889
  }
24770
25890
  }));
24771
25891
  return (_ctx, _cache) => {
24772
25892
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(_sfc_main$9), mergeProps(mergeProps(unref(attrs), slotProps.value.attrs), {
24773
25893
  as: __props.as,
24774
- renderless: __props.renderless,
24775
- onClick,
24776
- onKeydown
25894
+ renderless: __props.renderless
24777
25895
  }), {
24778
25896
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
24779
25897
  _: 3
@@ -25217,8 +26335,8 @@ const _sfc_main$149 = /* @__PURE__ */ defineComponent({
25217
26335
  const rootId = /* @__PURE__ */ useId();
25218
26336
  const step = createStep({
25219
26337
  disabled: toRef(() => __props.disabled),
25220
- enroll: __props.enroll,
25221
- mandatory: __props.mandatory,
26338
+ enroll: toRef(() => __props.enroll),
26339
+ mandatory: toRef(() => __props.mandatory),
25222
26340
  circular: __props.circular,
25223
26341
  events: true
25224
26342
  });
@@ -25313,7 +26431,7 @@ const _sfc_main$146 = /* @__PURE__ */ defineComponent({
25313
26431
  const ticket = tabs.register({
25314
26432
  id: __props.id,
25315
26433
  value: __props.value,
25316
- disabled: __props.disabled,
26434
+ disabled: () => toValue(__props.disabled) ?? false,
25317
26435
  el
25318
26436
  });
25319
26437
  const isDisabled = toRef(() => toValue(ticket.disabled) || toValue(tabs.disabled));
@@ -25632,14 +26750,14 @@ const _sfc_main$151 = /* @__PURE__ */ defineComponent({
25632
26750
  const model = useModel(__props, "modelValue");
25633
26751
  const selection = __props.multiple ? createGroup({
25634
26752
  disabled: toRef(() => __props.disabled),
25635
- mandatory: __props.mandatory,
26753
+ mandatory: toRef(() => __props.mandatory),
25636
26754
  events: true
25637
26755
  }) : createSingle({
25638
26756
  disabled: toRef(() => __props.disabled),
25639
- mandatory: __props.mandatory,
26757
+ mandatory: toRef(() => __props.mandatory),
25640
26758
  events: true
25641
26759
  });
25642
- useProxyModel(selection, model, { multiple: __props.multiple });
26760
+ useProxyModel(selection, model, { multiple: toRef(() => __props.multiple) });
25643
26761
  provideToggleGroup(__props.namespace, {
25644
26762
  disabled: toRef(() => __props.disabled),
25645
26763
  orientation: toRef(() => __props.orientation),
@@ -25703,7 +26821,7 @@ const _sfc_main$153 = /* @__PURE__ */ defineComponent({
25703
26821
  const ticket = group?.selection.register({
25704
26822
  id: __props.id,
25705
26823
  value: __props.value,
25706
- disabled: __props.disabled
26824
+ disabled: () => toValue(__props.disabled) ?? false
25707
26825
  });
25708
26826
  const isPressed = toRef(() => ticket ? toValue(ticket.isSelected) : pressed.value);
25709
26827
  const isDisabled = toRef(() => group && ticket ? toValue(ticket.disabled) || toValue(group.disabled) : __props.disabled);
@@ -25742,15 +26860,15 @@ const _sfc_main$153 = /* @__PURE__ */ defineComponent({
25742
26860
  "aria-disabled": isDisabled.value,
25743
26861
  "tabindex": isDisabled.value ? void 0 : 0,
25744
26862
  "data-state": isPressed.value ? "on" : "off",
25745
- "data-disabled": isDisabled.value ? true : void 0
26863
+ "data-disabled": isDisabled.value ? true : void 0,
26864
+ "onClick": onClick,
26865
+ "onKeydown": onKeydown
25746
26866
  }
25747
26867
  }));
25748
26868
  return (_ctx, _cache) => {
25749
26869
  return openBlock(), createBlock(unref(_sfc_main$9), mergeProps(mergeProps(unref(attrs), slotProps.value.attrs), {
25750
26870
  as: __props.as,
25751
- renderless: __props.renderless,
25752
- onClick,
25753
- onKeydown
26871
+ renderless: __props.renderless
25754
26872
  }), {
25755
26873
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
25756
26874
  _: 3
@@ -25925,9 +27043,9 @@ const _sfc_main$162 = /* @__PURE__ */ defineComponent({
25925
27043
  const model = useModel(__props, "modelValue");
25926
27044
  const nested = createNested({
25927
27045
  disabled: toRef(() => __props.disabled),
25928
- enroll: __props.enroll,
25929
- mandatory: __props.mandatory,
25930
- multiple: __props.multiple,
27046
+ enroll: toRef(() => __props.enroll),
27047
+ mandatory: toRef(() => __props.mandatory),
27048
+ multiple: toRef(() => __props.multiple),
25931
27049
  open: __props.open,
25932
27050
  openAll: __props.openAll,
25933
27051
  reveal: __props.reveal,
@@ -25983,12 +27101,15 @@ const _sfc_main$161 = /* @__PURE__ */ defineComponent({
25983
27101
  if (match && roving.focusedId.value !== match.id) roving.focusedId.value = match.id;
25984
27102
  }
25985
27103
  function expandable(ticket) {
27104
+ /* v8 ignore next -- defensive: callers always pass a registered ticket */
25986
27105
  if (!ticket) return false;
25987
27106
  return (toValue(ticket.el)?.hasAttribute("aria-expanded") ?? false) || !toValue(ticket.isLeaf);
25988
27107
  }
25989
27108
  function isRtl(e) {
27109
+ /* v8 ignore next -- IN_BROWSER always true in happy-dom test env */
25990
27110
  if (!IN_BROWSER) return false;
25991
27111
  const el = e.currentTarget;
27112
+ /* v8 ignore next -- defensive: keydown handlers always have a currentTarget */
25992
27113
  return el ? getComputedStyle(el).direction === "rtl" : false;
25993
27114
  }
25994
27115
  function openOrChild(ticket) {
@@ -26057,6 +27178,7 @@ const _sfc_main$161 = /* @__PURE__ */ defineComponent({
26057
27178
  }
26058
27179
  const slotProps = toRef(() => ({ attrs: {
26059
27180
  "role": "tree",
27181
+ /* v8 ignore next -- nested.multiple fallback used when multiselectable prop is undefined */
26060
27182
  "aria-multiselectable": __props.multiselectable ?? nested.multiple,
26061
27183
  "aria-label": __props.label || void 0,
26062
27184
  onKeydown,
@@ -26095,7 +27217,7 @@ const _sfc_main$160 = /* @__PURE__ */ defineComponent({
26095
27217
  const ticket = nested.register({
26096
27218
  id: __props.id,
26097
27219
  value: __props.value,
26098
- disabled: __props.disabled,
27220
+ disabled: () => toValue(__props.disabled) ?? false,
26099
27221
  parentId,
26100
27222
  el
26101
27223
  });
@@ -26661,4 +27783,4 @@ const Treeview = {
26661
27783
  SelectAll: _sfc_main$163
26662
27784
  };
26663
27785
  //#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 };
27786
+ 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, 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, 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 };