@vuetify/v0 0.1.8 → 0.1.9

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 (119) hide show
  1. package/SKILL.md +95 -0
  2. package/dist/adapter-CWp5eQ6R.d.mts +17 -0
  3. package/dist/{adapter-DIx4Rntl.d.mts → adapter-hDuQ9aNN.d.mts} +4 -4
  4. package/dist/browser/index.js +1352 -360
  5. package/dist/components/index.d.mts +2 -2
  6. package/dist/components/index.mjs +23 -23
  7. package/dist/{components-BbxKYAXs.mjs → components-mSy9az8x.mjs} +456 -231
  8. package/dist/composables/index.d.mts +16 -15
  9. package/dist/composables/index.mjs +22 -22
  10. package/dist/{consola-BVzYzeLH.d.mts → consola-C1OjyZVf.d.mts} +1 -1
  11. package/dist/constants/index.d.mts +1 -1
  12. package/dist/constants/index.mjs +1 -1
  13. package/dist/{createDataTable-DZouEhvH.mjs → createDataTable-DIl09siC.mjs} +5 -5
  14. package/dist/{createGroup-BpJFi41X.mjs → createGroup-PvzsLu9E.mjs} +1 -1
  15. package/dist/{createPagination-Bu8vE0JW.mjs → createPagination-DZSJ8aO5.mjs} +5 -5
  16. package/dist/{createSelection-8MX0OHXR.mjs → createSelection-DbWP6c7H.mjs} +1 -1
  17. package/dist/{createSingle-CbuOBb-E.mjs → createSingle-CeAJpbXs.mjs} +6 -6
  18. package/dist/{createTokens-CXlT0Vc6.mjs → createTokens-C1gIuKCK.mjs} +25 -4
  19. package/dist/data-table/adapters/client/index.d.mts +1 -1
  20. package/dist/data-table/adapters/client/index.mjs +3 -3
  21. package/dist/data-table/adapters/index.d.mts +4 -4
  22. package/dist/data-table/adapters/index.mjs +5 -5
  23. package/dist/data-table/adapters/server/index.d.mts +1 -1
  24. package/dist/data-table/adapters/server/index.mjs +3 -3
  25. package/dist/data-table/adapters/virtual/index.d.mts +1 -1
  26. package/dist/data-table/adapters/virtual/index.mjs +3 -3
  27. package/dist/data-table/index.d.mts +5 -5
  28. package/dist/data-table/index.mjs +14 -14
  29. package/dist/date/index.mjs +1 -1
  30. package/dist/features/adapters/posthog/index.mjs +2 -2
  31. package/dist/features/index.d.mts +1 -1
  32. package/dist/features/index.mjs +8 -8
  33. package/dist/{globals-ClSU6mqC.mjs → globals-3i9umzyz.mjs} +1 -1
  34. package/dist/{index-CxW4itj1.d.mts → index-BoK8Ln2f.d.mts} +1 -1
  35. package/dist/{index-B5NU2uB7.d.mts → index-C5XZRWlO.d.mts} +506 -166
  36. package/dist/{index-CmCMrlt3.d.mts → index-CLDBngUs.d.mts} +1 -1
  37. package/dist/{index-63-0oJS8.d.mts → index-D0qnkRbl.d.mts} +389 -183
  38. package/dist/index.d.mts +19 -18
  39. package/dist/index.mjs +23 -23
  40. package/dist/json/attributes.json +60 -0
  41. package/dist/json/importMap.json +24 -0
  42. package/dist/json/tags.json +40 -0
  43. package/dist/json/web-types.json +221 -1
  44. package/dist/locale/adapters/index.d.mts +3 -2
  45. package/dist/locale/adapters/index.mjs +2 -2
  46. package/dist/locale/adapters/v0/index.d.mts +1 -1
  47. package/dist/locale/adapters/v0/index.mjs +2 -2
  48. package/dist/locale/adapters/vue-i18n/index.d.mts +22 -0
  49. package/dist/locale/adapters/vue-i18n/index.mjs +26 -0
  50. package/dist/locale/index.d.mts +4 -3
  51. package/dist/locale/index.mjs +8 -9
  52. package/dist/logger/adapters/consola/index.d.mts +1 -1
  53. package/dist/logger/adapters/index.d.mts +4 -4
  54. package/dist/logger/adapters/index.mjs +2 -2
  55. package/dist/logger/adapters/pino/index.d.mts +1 -1
  56. package/dist/logger/adapters/pino/index.mjs +1 -1
  57. package/dist/logger/adapters/v0/index.d.mts +1 -1
  58. package/dist/logger/adapters/v0/index.mjs +2 -2
  59. package/dist/logger/index.d.mts +5 -5
  60. package/dist/logger/index.mjs +3 -3
  61. package/dist/notifications/index.d.mts +78 -0
  62. package/dist/notifications/index.mjs +215 -0
  63. package/dist/palettes/ant/index.d.mts +1 -1
  64. package/dist/palettes/index.d.mts +2 -2
  65. package/dist/palettes/material/index.d.mts +1 -1
  66. package/dist/palettes/md1/index.d.mts +1 -1
  67. package/dist/palettes/md2/index.d.mts +1 -1
  68. package/dist/palettes/radix/index.d.mts +1 -1
  69. package/dist/palettes/tailwind/index.d.mts +1 -1
  70. package/dist/permissions/adapters/index.d.mts +2 -2
  71. package/dist/permissions/adapters/index.mjs +1 -1
  72. package/dist/permissions/adapters/v0/index.d.mts +1 -1
  73. package/dist/permissions/adapters/v0/index.mjs +1 -1
  74. package/dist/permissions/index.d.mts +1 -1
  75. package/dist/permissions/index.mjs +5 -5
  76. package/dist/{pino-Bzighnkd.d.mts → pino-CM1iLXmi.d.mts} +1 -1
  77. package/dist/{posthog-BE7-t7cV.mjs → posthog-CCQFQ5XD.mjs} +1 -1
  78. package/dist/rules/index.d.mts +1 -1
  79. package/dist/rules/index.mjs +9 -10
  80. package/dist/{server-Ch9J86tb.d.mts → server-Ct-h4-OA.d.mts} +1 -1
  81. package/dist/{server-CZ6ahbEH.mjs → server-DHET3KNW.mjs} +1 -1
  82. package/dist/storage/adapters/index.d.mts +2 -2
  83. package/dist/storage/adapters/memory/index.d.mts +1 -1
  84. package/dist/storage/index.d.mts +3 -3
  85. package/dist/storage/index.mjs +21 -21
  86. package/dist/theme/adapters/index.d.mts +1 -1
  87. package/dist/theme/adapters/index.mjs +2 -2
  88. package/dist/theme/adapters/v0/index.d.mts +1 -1
  89. package/dist/theme/adapters/v0/index.mjs +2 -2
  90. package/dist/theme/index.d.mts +1 -1
  91. package/dist/theme/index.mjs +8 -8
  92. package/dist/{useClickOutside-W0Sur1rC.mjs → useClickOutside-hOhNk4eS.mjs} +860 -126
  93. package/dist/{useFeatures-CUicSI-E.mjs → useFeatures-CXRQvucQ.mjs} +3 -3
  94. package/dist/useLocale-BaufqE5Z.mjs +69 -0
  95. package/dist/{useLogger-DY1Hbcy1.mjs → useLogger-cGK00Ywd.mjs} +2 -2
  96. package/dist/{usePermissions-BSW59R4q.mjs → usePermissions-CR0HkjsF.mjs} +2 -2
  97. package/dist/{useRules-BbA6_gvs.mjs → useRules-LD-_-Hxt.mjs} +2 -2
  98. package/dist/{useTheme-Bdx2Lj5c.mjs → useTheme-Cs79AFNR.mjs} +5 -5
  99. package/dist/utilities/index.d.mts +1 -1
  100. package/dist/utilities/index.mjs +2 -1
  101. package/dist/{v0-BFseIsBi.mjs → v0-BJYwZgtp.mjs} +1 -1
  102. package/dist/v0-BdD1F6JK.d.mts +19 -0
  103. package/dist/{v0-YAqbXudL.mjs → v0-BoWQ8RK0.mjs} +1 -1
  104. package/dist/{v0-CdUL2eOn.d.mts → v0-CMeh39LQ.d.mts} +1 -1
  105. package/dist/v0-CehUknHv.mjs +62 -0
  106. package/dist/{v0-BZINNGoC.d.mts → v0-DFAgNbvC.d.mts} +1 -1
  107. package/dist/{v0-1xxC39wf.d.mts → v0-JPf99NKg.d.mts} +1 -1
  108. package/dist/{v0-2G2476h-.mjs → v0-Zu7neOYg.mjs} +1 -1
  109. package/dist/{virtual-DwBiFA25.d.mts → virtual-B1lRbO7Q.d.mts} +1 -1
  110. package/dist/{virtual-eDNVH1fz.mjs → virtual-D0_D5gkh.mjs} +1 -1
  111. package/package.json +11 -4
  112. package/dist/useLocale-cQlPxbpV.mjs +0 -87
  113. package/dist/v0-CAKa6tzG.d.mts +0 -22
  114. package/dist/v0-CHBrvw49.mjs +0 -35
  115. /package/dist/{adapter-JTFG3Jn8.d.mts → adapter-CJQav2JB.d.mts} +0 -0
  116. /package/dist/{index-MHkcqY_y.d.mts → index-BL4uTXWQ.d.mts} +0 -0
  117. /package/dist/{index-B5ZDDkXv.d.mts → index-BvTD7kU8.d.mts} +0 -0
  118. /package/dist/{index-NsE5nARK.d.mts → index-DSao7i57.d.mts} +0 -0
  119. /package/dist/{memory-BTtRdnNn.d.mts → memory-DyBabFV1.d.mts} +0 -0
@@ -81,7 +81,7 @@ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && "matchMedia" in window && typeof wind
81
81
  const SUPPORTS_OBSERVER = IN_BROWSER && "ResizeObserver" in window;
82
82
  const SUPPORTS_INTERSECTION_OBSERVER = IN_BROWSER && "IntersectionObserver" in window;
83
83
  const SUPPORTS_MUTATION_OBSERVER = IN_BROWSER && "MutationObserver" in window;
84
- const version = "0.1.8";
84
+ const version = "0.1.9";
85
85
  /* v8 ignore next -- build-time constant, __DEV__ short-circuits in tests */
86
86
  const __LOGGER_ENABLED__ = false;
87
87
  //#endregion
@@ -397,6 +397,7 @@ function mergeDeep(target, ...sources) {
397
397
  if (UNSAFE_KEYS.has(key)) continue;
398
398
  if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
399
399
  const sourceValue = source[key];
400
+ if (/* @__PURE__ */ isUndefined(sourceValue)) continue;
400
401
  const targetValue = target[key];
401
402
  if (/* @__PURE__ */ isObject(sourceValue)) {
402
403
  if (!/* @__PURE__ */ isObject(targetValue)) Object.assign(target, { [key]: {} });
@@ -1203,7 +1204,7 @@ function createRegistry(options) {
1203
1204
  function get(id) {
1204
1205
  return collection.get(id);
1205
1206
  }
1206
- function upsert(id, patch = {}) {
1207
+ function upsert(id, patch = {}, event) {
1207
1208
  const existing = get(id);
1208
1209
  if (!existing) return register({
1209
1210
  ...patch,
@@ -1238,6 +1239,7 @@ function createRegistry(options) {
1238
1239
  collection.set(id, updated);
1239
1240
  invalidate();
1240
1241
  emit("update:ticket", updated);
1242
+ if (event) emit(event, id);
1241
1243
  return updated;
1242
1244
  }
1243
1245
  function browse(value) {
@@ -1377,10 +1379,10 @@ function createRegistry(options) {
1377
1379
  unassign(ticket.value, ticket.id);
1378
1380
  const willReindex = indexDependentCount > 0 && ticket.index < collection.size;
1379
1381
  if (!willReindex) invalidate();
1380
- emit("unregister:ticket", ticket);
1381
1382
  minDirtyIndex = Math.min(minDirtyIndex, ticket.index);
1382
1383
  if (willReindex) reindex();
1383
1384
  else needsReindex = true;
1385
+ emit("unregister:ticket", ticket);
1384
1386
  }
1385
1387
  function offboard(ids) {
1386
1388
  batch(() => {
@@ -2153,10 +2155,10 @@ function createSingle(_options = {}) {
2153
2155
  mandatory,
2154
2156
  multiple
2155
2157
  });
2156
- const selectedId = computed(() => registry.selectedIds.values().next().value);
2157
- const selectedItem = computed(() => registry.selectedItems.value.values().next().value);
2158
- const selectedIndex = computed(() => selectedItem.value?.index ?? -1);
2159
- const selectedValue = computed(() => selectedItem.value?.value);
2158
+ const selectedId = toRef(() => registry.selectedIds.values().next().value);
2159
+ const selectedItem = toRef(() => registry.selectedItems.value.values().next().value);
2160
+ const selectedIndex = toRef(() => selectedItem.value?.index ?? -1);
2161
+ const selectedValue = toRef(() => selectedItem.value?.value);
2160
2162
  function unselect(id) {
2161
2163
  registry.unselect(id);
2162
2164
  }
@@ -3428,7 +3430,7 @@ function createTokens(tokens = {}, options = {}) {
3428
3430
  cache.set(cacheKey, result);
3429
3431
  return result;
3430
3432
  }
3431
- const { register: _register, upsert: _upsert, unregister: _unregister } = registry;
3433
+ const { register: _register, upsert: _upsert, unregister: _unregister, onboard: _onboard, offboard: _offboard, move: _move, clear: _clear } = registry;
3432
3434
  function register(registration) {
3433
3435
  cache.clear();
3434
3436
  return _register(registration);
@@ -3441,11 +3443,31 @@ function createTokens(tokens = {}, options = {}) {
3441
3443
  cache.clear();
3442
3444
  return _unregister(id);
3443
3445
  }
3446
+ function onboard(registrations) {
3447
+ cache.clear();
3448
+ return _onboard(registrations);
3449
+ }
3450
+ function offboard(ids) {
3451
+ cache.clear();
3452
+ return _offboard(ids);
3453
+ }
3454
+ function move(id, index) {
3455
+ cache.clear();
3456
+ return _move(id, index);
3457
+ }
3458
+ function clear() {
3459
+ cache.clear();
3460
+ return _clear();
3461
+ }
3444
3462
  return {
3445
3463
  ...registry,
3446
3464
  register,
3447
3465
  upsert,
3448
3466
  unregister,
3467
+ onboard,
3468
+ offboard,
3469
+ move,
3470
+ clear,
3449
3471
  resolve,
3450
3472
  isAlias,
3451
3473
  get size() {
@@ -3586,33 +3608,60 @@ function flatten(tokens, prefix = "", flat = false) {
3586
3608
  //#endregion
3587
3609
  //#region src/composables/useLocale/adapters/v0.ts
3588
3610
  /**
3589
- * Vuetify0.x locale adapter implementation
3611
+ * Default locale adapter for @vuetify/v0.
3590
3612
  *
3591
- * This adapter provides translation and number formatting
3592
- * capabilities using the Intl API and supports both
3593
- * numbered ({0}, {1}) and named ({name}) variables in translation strings.
3613
+ * Handles the full translation pipeline: key lookup via tokens,
3614
+ * fallback chain, token reference resolution, and placeholder interpolation.
3594
3615
  */
3595
3616
  var Vuetify0LocaleAdapter = class {
3596
- t(message, ...params) {
3597
- let resolvedMessage = message;
3598
- if (params.length > 0 && /* @__PURE__ */ isObject(params[0])) {
3599
- const variables = params[0];
3600
- resolvedMessage = resolvedMessage.replace(/{([a-zA-Z][a-zA-Z0-9_]*)}/g, (match, name) => {
3617
+ context;
3618
+ constructor(context) {
3619
+ this.context = context;
3620
+ }
3621
+ t(key, ...params) {
3622
+ const locale = this.context.selectedId.value;
3623
+ if (!locale) return this.interpolate(key, params);
3624
+ const message = this.context.tokens.get(`${locale}.${key}`)?.value;
3625
+ if (/* @__PURE__ */ isString(message)) return this.interpolate(this.resolve(locale, message), params);
3626
+ if (this.context.fallbackLocale) {
3627
+ const fbMessage = this.context.tokens.get(`${this.context.fallbackLocale}.${key}`)?.value;
3628
+ if (/* @__PURE__ */ isString(fbMessage)) return this.interpolate(this.resolve(this.context.fallbackLocale, fbMessage), params);
3629
+ }
3630
+ return this.interpolate(key, params);
3631
+ }
3632
+ n(value) {
3633
+ const locale = this.context.selectedId.value;
3634
+ if (!IN_BROWSER || !locale) return value.toString();
3635
+ return new Intl.NumberFormat(String(locale)).format(value);
3636
+ }
3637
+ resolve(locale, str, visited = /* @__PURE__ */ new Set()) {
3638
+ return str.replace(/{([a-zA-Z0-9.\-_]+)}/g, (match, key) => {
3639
+ const [prefix, ...rest] = key.split(".");
3640
+ const target = this.context.has(prefix) ? prefix : locale;
3641
+ const path = `${target}.${this.context.has(prefix) ? rest.join(".") : key}`;
3642
+ if (visited.has(path)) return match;
3643
+ visited.add(path);
3644
+ const resolved = this.context.tokens.get(path)?.value;
3645
+ if (/* @__PURE__ */ isString(resolved)) return this.resolve(target, resolved, visited);
3646
+ return match;
3647
+ });
3648
+ }
3649
+ interpolate(message, args) {
3650
+ let result = message;
3651
+ let rest = args;
3652
+ if (rest.length > 0 && /* @__PURE__ */ isObject(rest[0])) {
3653
+ const variables = rest[0];
3654
+ result = result.replace(/{([a-zA-Z][a-zA-Z0-9_]*)}/g, (match, name) => {
3601
3655
  return /* @__PURE__ */ isUndefined(variables[name]) ? match : String(variables[name]);
3602
3656
  });
3603
- params = params.slice(1);
3657
+ rest = rest.slice(1);
3604
3658
  }
3605
- resolvedMessage = resolvedMessage.replace(/\{(\d+)\}/g, (match, index) => {
3606
- const idx = Number.parseInt(index, 10);
3607
- if (!/* @__PURE__ */ isUndefined(params[idx])) return String(params[idx]);
3659
+ result = result.replace(/\{(\d+)\}/g, (match, index) => {
3660
+ const i = Number.parseInt(index, 10);
3661
+ if (!/* @__PURE__ */ isUndefined(rest[i])) return String(rest[i]);
3608
3662
  return match;
3609
3663
  });
3610
- return resolvedMessage;
3611
- }
3612
- n(value, locale, ...params) {
3613
- if (!IN_BROWSER || !locale) return value.toString();
3614
- const options = params[0];
3615
- return new Intl.NumberFormat(String(locale), options).format(value);
3664
+ return result;
3616
3665
  }
3617
3666
  };
3618
3667
  //#endregion
@@ -3643,40 +3692,24 @@ var Vuetify0LocaleAdapter = class {
3643
3692
  * @see https://0.vuetifyjs.com/composables/plugins/use-locale
3644
3693
  */
3645
3694
  function createLocale(_options = {}) {
3646
- const { adapter = new Vuetify0LocaleAdapter(), messages = {}, fallback: fallbackLocale, ...options } = _options;
3695
+ const { adapter: externalAdapter, messages = {}, fallback: fallbackLocale, ...options } = _options;
3647
3696
  const tokens = createTokens(messages);
3648
3697
  const registry = createSingle(options);
3649
3698
  for (const id in messages) {
3650
3699
  registry.register({ id });
3651
3700
  if (id === options.default && !registry.selectedId.value) registry.select(id);
3652
3701
  }
3653
- function t(key, params, fallback) {
3654
- const locale = registry.selectedId.value;
3655
- const args = toArray(params);
3656
- if (!locale) return adapter.t(fallback ?? key, ...args);
3657
- const path = `${locale}.${key}`;
3658
- const message = tokens.get(path)?.value;
3659
- if (/* @__PURE__ */ isString(message)) return adapter.t(resolve(locale, message), ...args);
3660
- if (fallbackLocale) {
3661
- const fbMessage = tokens.get(`${fallbackLocale}.${key}`)?.value;
3662
- if (/* @__PURE__ */ isString(fbMessage)) return adapter.t(resolve(fallbackLocale, fbMessage), ...args);
3663
- }
3664
- return adapter.t(fallback ?? key, ...args);
3702
+ const adapter = externalAdapter ?? new Vuetify0LocaleAdapter({
3703
+ tokens,
3704
+ selectedId: registry.selectedId,
3705
+ fallbackLocale,
3706
+ has: (id) => registry.has(id)
3707
+ });
3708
+ function t(key, ...params) {
3709
+ return adapter.t(key, ...params);
3665
3710
  }
3666
- function n(value, ...params) {
3667
- return adapter.n(value, registry.selectedId.value, ...params);
3668
- }
3669
- function resolve(locale, str, visited = /* @__PURE__ */ new Set()) {
3670
- return str.replace(/{([a-zA-Z0-9.-_]+)}/g, (match, key) => {
3671
- const [prefix, ...rest] = key.split(".");
3672
- const target = registry.has(prefix) ? prefix : locale;
3673
- const path = `${target}.${registry.has(prefix) ? rest.join(".") : key}`;
3674
- if (visited.has(path)) return match;
3675
- visited.add(path);
3676
- const resolved = tokens.get(path)?.value;
3677
- if (/* @__PURE__ */ isString(resolved)) return resolve(target, resolved, visited);
3678
- return match;
3679
- });
3711
+ function n(value) {
3712
+ return adapter.n(value);
3680
3713
  }
3681
3714
  return {
3682
3715
  ...registry,
@@ -3690,7 +3723,7 @@ function createLocale(_options = {}) {
3690
3723
  function createLocaleFallback() {
3691
3724
  return {
3692
3725
  size: 0,
3693
- t: (key, _params, fallback) => fallback ?? key,
3726
+ t: (key) => key,
3694
3727
  n: String
3695
3728
  };
3696
3729
  }
@@ -3821,7 +3854,7 @@ const _sfc_main$10 = /* @__PURE__ */ defineComponent({
3821
3854
  prev: breadcrumbs.prev,
3822
3855
  select: breadcrumbs.select,
3823
3856
  attrs: {
3824
- "aria-label": __props.label ?? locale.t("Breadcrumbs.label", void 0, "Breadcrumb"),
3857
+ "aria-label": __props.label ?? locale.t("Breadcrumbs.label"),
3825
3858
  "role": __props.as === "nav" ? void 0 : "navigation"
3826
3859
  }
3827
3860
  }));
@@ -4131,7 +4164,8 @@ function useProxyModel(context, model, options) {
4131
4164
  const modelAsArray = transformIn(model);
4132
4165
  const pending = new Set(modelAsArray);
4133
4166
  context.apply(modelAsArray, applyOptions);
4134
- for (const value of modelAsArray) if (Array.from(context.selectedValues.value).includes(value)) pending.delete(value);
4167
+ const selected = new Set(context.selectedValues.value);
4168
+ for (const value of modelAsArray) if (selected.has(value)) pending.delete(value);
4135
4169
  const contextWatch = watch(context.selectedValues, (val) => {
4136
4170
  modelWatch.pause();
4137
4171
  model.value = transformOut(Array.from(toValue(val)));
@@ -4729,10 +4763,10 @@ function createPagination(_options = {}) {
4729
4763
  else if (value > pages.value) page.value = Math.max(1, pages.value);
4730
4764
  else page.value = value;
4731
4765
  }
4732
- const isFirst = computed(() => page.value <= 1);
4733
- const isLast = computed(() => page.value >= pages.value);
4734
- const pageStart = computed(() => (page.value - 1) * toValue(_itemsPerPage));
4735
- const pageStop = computed(() => Math.min(pageStart.value + toValue(_itemsPerPage), toValue(_size)));
4766
+ const isFirst = toRef(() => page.value <= 1);
4767
+ const isLast = toRef(() => page.value >= pages.value);
4768
+ const pageStart = toRef(() => (page.value - 1) * toValue(_itemsPerPage));
4769
+ const pageStop = toRef(() => Math.min(pageStart.value + toValue(_itemsPerPage), toValue(_size)));
4736
4770
  function toPage(value) {
4737
4771
  return {
4738
4772
  type: "page",
@@ -5323,8 +5357,8 @@ function createDataTable(options) {
5323
5357
  function setNone() {
5324
5358
  group.unselect(key);
5325
5359
  group.unmix(key);
5326
- const idx = order.indexOf(key);
5327
- if (idx !== -1) order.splice(idx, 1);
5360
+ const index = order.indexOf(key);
5361
+ if (index !== -1) order.splice(index, 1);
5328
5362
  }
5329
5363
  if (!isAsc && !isDesc) {
5330
5364
  clearOthers();
@@ -5832,24 +5866,22 @@ function createBreakpoints(_options = {}) {
5832
5866
  const mdAndUp = shallowRef(initialIndex >= 2);
5833
5867
  const lgAndUp = shallowRef(initialIndex >= 3);
5834
5868
  const xlAndUp = shallowRef(initialIndex >= 4);
5835
- const xxlAndUp = shallowRef(initialIndex >= 5);
5836
5869
  const smAndDown = shallowRef(initialIndex <= 1);
5837
5870
  const mdAndDown = shallowRef(initialIndex <= 2);
5838
5871
  const lgAndDown = shallowRef(initialIndex <= 3);
5839
5872
  const xlAndDown = shallowRef(initialIndex <= 4);
5840
- const xxlAndDown = shallowRef(initialIndex <= 5);
5841
5873
  function update() {
5842
5874
  if (!IN_BROWSER) return;
5843
5875
  width.value = window.innerWidth;
5844
5876
  height.value = window.innerHeight;
5845
5877
  let current = "xs";
5846
- for (let i = sorted.length - 1; i >= 0; i--) if (width.value >= sorted[i][1]) {
5878
+ for (let i = sorted.length - 1; i >= 0; i--) if (window.matchMedia(`(min-width: ${sorted[i][1]}px)`).matches) {
5847
5879
  current = sorted[i][0];
5848
5880
  break;
5849
5881
  }
5850
5882
  name.value = current;
5851
5883
  const index = names.indexOf(current);
5852
- isMobile.value = width.value < mb;
5884
+ isMobile.value = /* @__PURE__ */ isNumber(mb) ? !window.matchMedia(`(min-width: ${mb}px)`).matches : index < names.indexOf(mobileBreakpoint);
5853
5885
  xs.value = index === 0;
5854
5886
  sm.value = index === 1;
5855
5887
  md.value = index === 2;
@@ -5860,12 +5892,10 @@ function createBreakpoints(_options = {}) {
5860
5892
  mdAndUp.value = index >= 2;
5861
5893
  lgAndUp.value = index >= 3;
5862
5894
  xlAndUp.value = index >= 4;
5863
- xxlAndUp.value = index >= 5;
5864
5895
  smAndDown.value = index <= 1;
5865
5896
  mdAndDown.value = index <= 2;
5866
5897
  lgAndDown.value = index <= 3;
5867
5898
  xlAndDown.value = index <= 4;
5868
- xxlAndDown.value = index <= 5;
5869
5899
  }
5870
5900
  return {
5871
5901
  breakpoints,
@@ -5884,12 +5914,10 @@ function createBreakpoints(_options = {}) {
5884
5914
  mdAndUp: readonly(mdAndUp),
5885
5915
  lgAndUp: readonly(lgAndUp),
5886
5916
  xlAndUp: readonly(xlAndUp),
5887
- xxlAndUp: readonly(xxlAndUp),
5888
5917
  smAndDown: readonly(smAndDown),
5889
5918
  mdAndDown: readonly(mdAndDown),
5890
5919
  lgAndDown: readonly(lgAndDown),
5891
5920
  xlAndDown: readonly(xlAndDown),
5892
- xxlAndDown: readonly(xxlAndDown),
5893
5921
  ssr: isSSR,
5894
5922
  update
5895
5923
  };
@@ -5903,8 +5931,8 @@ function createBreakpointsFallback(options = {}) {
5903
5931
  name: readonly(shallowRef("xs")),
5904
5932
  width: readonly(shallowRef(0)),
5905
5933
  height: readonly(shallowRef(0)),
5906
- isMobile: readonly(shallowRef(false)),
5907
- xs: readonly(shallowRef(false)),
5934
+ isMobile: readonly(shallowRef(true)),
5935
+ xs: readonly(shallowRef(true)),
5908
5936
  sm: readonly(shallowRef(false)),
5909
5937
  md: readonly(shallowRef(false)),
5910
5938
  lg: readonly(shallowRef(false)),
@@ -5914,12 +5942,10 @@ function createBreakpointsFallback(options = {}) {
5914
5942
  mdAndUp: readonly(shallowRef(false)),
5915
5943
  lgAndUp: readonly(shallowRef(false)),
5916
5944
  xlAndUp: readonly(shallowRef(false)),
5917
- xxlAndUp: readonly(shallowRef(false)),
5918
- smAndDown: readonly(shallowRef(false)),
5919
- mdAndDown: readonly(shallowRef(false)),
5920
- lgAndDown: readonly(shallowRef(false)),
5921
- xlAndDown: readonly(shallowRef(false)),
5922
- xxlAndDown: readonly(shallowRef(false)),
5945
+ smAndDown: readonly(shallowRef(true)),
5946
+ mdAndDown: readonly(shallowRef(true)),
5947
+ lgAndDown: readonly(shallowRef(true)),
5948
+ xlAndDown: readonly(shallowRef(true)),
5923
5949
  ssr: false,
5924
5950
  update: () => {}
5925
5951
  };
@@ -6951,6 +6977,132 @@ function useElementIntersection(target, options = {}) {
6951
6977
  };
6952
6978
  }
6953
6979
  //#endregion
6980
+ //#region src/composables/useTimer/index.ts
6981
+ /**
6982
+ * @module useTimer
6983
+ *
6984
+ * @remarks
6985
+ * A reactive timer composable with pause/resume support.
6986
+ *
6987
+ * Key features:
6988
+ * - Start/stop/pause/resume controls
6989
+ * - Reactive remaining time tracking
6990
+ * - One-shot (default) or repeating mode
6991
+ * - Automatic cleanup on scope disposal
6992
+ * - SSR-safe
6993
+ */
6994
+ /**
6995
+ * Creates a reactive timer with pause/resume support.
6996
+ *
6997
+ * @param handler Callback invoked when the timer fires.
6998
+ * @param options Timer configuration.
6999
+ * @returns Timer controls and reactive state.
7000
+ *
7001
+ * @see https://0.vuetifyjs.com/composables/system/use-timer
7002
+ *
7003
+ * @example
7004
+ * ```ts
7005
+ * const timer = useTimer(() => console.log('fired'), { duration: 5000 })
7006
+ *
7007
+ * timer.start()
7008
+ * timer.pause()
7009
+ * timer.resume()
7010
+ * timer.stop()
7011
+ * ```
7012
+ */
7013
+ function useTimer(handler, options = {}) {
7014
+ const { duration = 1e3, repeat = false } = options;
7015
+ const remaining = shallowRef(duration);
7016
+ const isActive = shallowRef(false);
7017
+ const isPaused = shallowRef(false);
7018
+ let timeoutId;
7019
+ let trackingId;
7020
+ let startedAt = 0;
7021
+ let budget = duration;
7022
+ function clearTimer() {
7023
+ if (!/* @__PURE__ */ isUndefined(timeoutId)) {
7024
+ globalThis.clearTimeout(timeoutId);
7025
+ timeoutId = void 0;
7026
+ }
7027
+ }
7028
+ function startTracking() {
7029
+ stopTracking();
7030
+ if (!IN_BROWSER) return;
7031
+ trackingId = globalThis.setInterval(() => {
7032
+ if (!isActive.value || isPaused.value) return;
7033
+ const elapsed = Date.now() - startedAt;
7034
+ remaining.value = Math.max(0, budget - elapsed);
7035
+ }, 100);
7036
+ }
7037
+ function stopTracking() {
7038
+ if (!/* @__PURE__ */ isUndefined(trackingId)) {
7039
+ globalThis.clearInterval(trackingId);
7040
+ trackingId = void 0;
7041
+ }
7042
+ }
7043
+ function fire() {
7044
+ clearTimer();
7045
+ stopTracking();
7046
+ handler();
7047
+ if (repeat) begin(duration);
7048
+ else {
7049
+ isActive.value = false;
7050
+ remaining.value = 0;
7051
+ }
7052
+ }
7053
+ function begin(ms) {
7054
+ clearTimer();
7055
+ stopTracking();
7056
+ budget = ms;
7057
+ startedAt = Date.now();
7058
+ remaining.value = ms;
7059
+ isActive.value = true;
7060
+ isPaused.value = false;
7061
+ timeoutId = globalThis.setTimeout(fire, ms);
7062
+ startTracking();
7063
+ }
7064
+ function start() {
7065
+ if (duration < 0) return;
7066
+ begin(duration);
7067
+ }
7068
+ function stop() {
7069
+ clearTimer();
7070
+ stopTracking();
7071
+ isActive.value = false;
7072
+ isPaused.value = false;
7073
+ remaining.value = duration;
7074
+ }
7075
+ function pause() {
7076
+ if (!isActive.value || isPaused.value) return;
7077
+ const elapsed = Date.now() - startedAt;
7078
+ budget = Math.max(0, budget - elapsed);
7079
+ remaining.value = budget;
7080
+ clearTimer();
7081
+ stopTracking();
7082
+ isPaused.value = true;
7083
+ }
7084
+ function resume() {
7085
+ if (!isPaused.value) return;
7086
+ isPaused.value = false;
7087
+ startedAt = Date.now();
7088
+ timeoutId = globalThis.setTimeout(fire, budget);
7089
+ startTracking();
7090
+ }
7091
+ onScopeDispose(() => {
7092
+ clearTimer();
7093
+ stopTracking();
7094
+ }, true);
7095
+ return {
7096
+ start,
7097
+ stop,
7098
+ pause,
7099
+ resume,
7100
+ remaining,
7101
+ isActive,
7102
+ isPaused
7103
+ };
7104
+ }
7105
+ //#endregion
6954
7106
  //#region src/composables/useLazy/index.ts
6955
7107
  /**
6956
7108
  * @module useLazy
@@ -7014,11 +7166,16 @@ function useElementIntersection(target, options = {}) {
7014
7166
  * ```
7015
7167
  */
7016
7168
  function useLazy(active, options = {}) {
7017
- const { eager = false } = options;
7169
+ const { eager = false, delay = 0 } = options;
7018
7170
  const isBooted = shallowRef(false);
7019
7171
  const hasContent = toRef(() => isBooted.value || toValue(eager) || toValue(active));
7172
+ const timer = delay > 0 ? useTimer(() => {
7173
+ isBooted.value = true;
7174
+ }, { duration: delay }) : void 0;
7020
7175
  const stop = watch(() => toValue(active), (value) => {
7021
- if (value) isBooted.value = true;
7176
+ if (value) if (timer) timer.start();
7177
+ else isBooted.value = true;
7178
+ else timer?.stop();
7022
7179
  }, { immediate: true });
7023
7180
  function reset() {
7024
7181
  isBooted.value = false;
@@ -7079,7 +7236,7 @@ function useLazy(active, options = {}) {
7079
7236
  function useMediaQuery(query) {
7080
7237
  const matches = shallowRef(false);
7081
7238
  const mediaQueryList = shallowRef(null);
7082
- const resolvedQuery = computed(() => toValue(query));
7239
+ const resolvedQuery = toRef(() => toValue(query));
7083
7240
  const hydration = useHydration();
7084
7241
  let cleanup = null;
7085
7242
  function update() {
@@ -7871,6 +8028,722 @@ function useNested(namespace = "v0:nested") {
7871
8028
  return useContext(namespace);
7872
8029
  }
7873
8030
  //#endregion
8031
+ //#region src/composables/createQueue/index.ts
8032
+ /**
8033
+ * @module createQueue
8034
+ *
8035
+ * @remarks
8036
+ * A queue composable for managing time-based collections with:
8037
+ * - Automatic timeout-based removal
8038
+ * - Pause/resume functionality
8039
+ * - FIFO (First In, First Out) ordering
8040
+ * - Manual dismissal support
8041
+ * - Queue progression management
8042
+ *
8043
+ * Built on top of createRegistry, the queue automatically manages timeouts for tickets,
8044
+ * ensuring only the first ticket in the queue is active at any time. When a ticket
8045
+ * expires or is removed, the next ticket in the queue automatically becomes active.
8046
+ */
8047
+ /**
8048
+ * Creates a new queue instance
8049
+ *
8050
+ * @param options The options for the queue instance
8051
+ * @template Z The type of queue ticket that extends QueueTicket. Use this to add custom properties to tickets.
8052
+ * @template E The type of queue context that extends QueueContext<Z>. Use this when extending the queue with additional methods.
8053
+ * @returns A new queue instance
8054
+ *
8055
+ * @see https://0.vuetifyjs.com/composables/registration/create-queue
8056
+ *
8057
+ * @example
8058
+ * ```ts
8059
+ * import { useQueue } from '@vuetify/v0'
8060
+ *
8061
+ * const queue = useQueue()
8062
+ *
8063
+ * // Register an ticket with default timeout (3000ms)
8064
+ * const ticket1 = queue.register({ value: 'Ticket 1' })
8065
+ *
8066
+ * // Register an ticket with custom timeout
8067
+ * const ticket2 = queue.register({ value: 'Ticket 2', timeout: 5000 })
8068
+ *
8069
+ * // Register a persistent ticket that must be manually dismissed
8070
+ * const ticket3 = queue.register({ value: 'Ticket 3', timeout: -1 })
8071
+ *
8072
+ * // Dismiss an ticket using the convenience method
8073
+ * ticket3.dismiss()
8074
+ *
8075
+ * console.log(queue.size) // 2
8076
+ * ```
8077
+ */
8078
+ function createQueue(_options = {}) {
8079
+ const { timeout: _timeout = 3e3, ...options } = _options;
8080
+ const registry = createRegistry({
8081
+ ...options,
8082
+ events: true
8083
+ });
8084
+ const timers = /* @__PURE__ */ new Map();
8085
+ function createTicketTimer(ticket) {
8086
+ if (/* @__PURE__ */ isUndefined(ticket.timeout) || ticket.timeout < 0 || ticket.isPaused) return;
8087
+ const timer = useTimer(() => {
8088
+ timers.delete(ticket.id);
8089
+ registry.unregister(ticket.id);
8090
+ resume();
8091
+ }, { duration: ticket.timeout });
8092
+ timers.set(ticket.id, timer);
8093
+ timer.start();
8094
+ }
8095
+ function stopTimer(id) {
8096
+ const timer = timers.get(id);
8097
+ if (timer) {
8098
+ timer.stop();
8099
+ timers.delete(id);
8100
+ }
8101
+ }
8102
+ function register(registration = {}) {
8103
+ const id = registration.id ?? /* @__PURE__ */ useId();
8104
+ const timeout = Object.prototype.hasOwnProperty.call(registration, "timeout") ? registration.timeout : _timeout;
8105
+ const ticket = {
8106
+ ...registration,
8107
+ id,
8108
+ timeout,
8109
+ isPaused: registry.size > 0,
8110
+ dismiss: () => unregister(id)
8111
+ };
8112
+ const registered = registry.register(ticket);
8113
+ createTicketTimer(registered);
8114
+ return registered;
8115
+ }
8116
+ function unregister(id) {
8117
+ const ticket = /* @__PURE__ */ isUndefined(id) ? registry.seek("first") : registry.get(id);
8118
+ if (!ticket) return void 0;
8119
+ const wasFirst = ticket.index === 0;
8120
+ stopTimer(ticket.id);
8121
+ registry.unregister(ticket.id);
8122
+ if (wasFirst) resume();
8123
+ return ticket;
8124
+ }
8125
+ function offboard(ids) {
8126
+ let hadFirst = false;
8127
+ for (const id of ids) {
8128
+ const ticket = registry.get(id);
8129
+ if (!ticket) continue;
8130
+ if (ticket.index === 0) hadFirst = true;
8131
+ stopTimer(ticket.id);
8132
+ }
8133
+ registry.offboard(ids);
8134
+ if (hadFirst) resume();
8135
+ }
8136
+ function pause() {
8137
+ const ticket = registry.seek("first");
8138
+ if (!ticket || ticket.isPaused) return void 0;
8139
+ timers.get(ticket.id)?.pause();
8140
+ return registry.upsert(ticket.id, { isPaused: true });
8141
+ }
8142
+ function resume() {
8143
+ const ticket = registry.seek("first");
8144
+ if (!ticket || ticket.index !== 0 || !ticket.isPaused) return void 0;
8145
+ const updated = registry.upsert(ticket.id, { isPaused: false });
8146
+ const timer = timers.get(updated.id);
8147
+ if (timer) timer.start();
8148
+ else createTicketTimer(updated);
8149
+ return updated;
8150
+ }
8151
+ function clear() {
8152
+ for (const timer of timers.values()) timer.stop();
8153
+ timers.clear();
8154
+ registry.clear();
8155
+ }
8156
+ function dispose() {
8157
+ clear();
8158
+ registry.dispose();
8159
+ }
8160
+ onScopeDispose(dispose, true);
8161
+ function onboard(registrations) {
8162
+ return registry.batch(() => registrations.map((registration) => register(registration)));
8163
+ }
8164
+ return {
8165
+ ...registry,
8166
+ register,
8167
+ unregister,
8168
+ onboard,
8169
+ offboard,
8170
+ pause,
8171
+ resume,
8172
+ clear,
8173
+ dispose,
8174
+ get size() {
8175
+ return registry.size;
8176
+ }
8177
+ };
8178
+ }
8179
+ /**
8180
+ * Creates a new queue context.
8181
+ *
8182
+ * @param options The options for the queue context.
8183
+ * @template Z The type of the queue ticket.
8184
+ * @template E The type of the queue context.
8185
+ * @returns A new queue context.
8186
+ *
8187
+ * @see https://0.vuetifyjs.com/composables/registration/create-queue
8188
+ *
8189
+ * @example
8190
+ * ```ts
8191
+ * import { createQueueContext } from '@vuetify/v0'
8192
+ *
8193
+ * export const [useQueue, provideQueue, context] = createQueueContext({
8194
+ * timeout: 5000,
8195
+ * })
8196
+ * ```
8197
+ */
8198
+ function createQueueContext(_options = {}) {
8199
+ const { namespace = "v0:queue", ...options } = _options;
8200
+ const [useQueueContext, _provideQueueContext] = createContext(namespace);
8201
+ const context = createQueue(options);
8202
+ function provideQueueContext(_context = context, app) {
8203
+ return _provideQueueContext(_context, app);
8204
+ }
8205
+ return createTrinity(useQueueContext, provideQueueContext, context);
8206
+ }
8207
+ /**
8208
+ * Returns the current queue instance.
8209
+ *
8210
+ * @param namespace The namespace for the queue context. Defaults to `'v0:queue'`.
8211
+ * @returns The current queue instance.
8212
+ *
8213
+ * @see https://0.vuetifyjs.com/composables/registration/create-queue
8214
+ *
8215
+ * @example
8216
+ * ```vue
8217
+ * <script setup lang="ts">
8218
+ * import { useQueue } from '@vuetify/v0'
8219
+ *
8220
+ * const queue = useQueue()
8221
+ * <\/script>
8222
+ * ```
8223
+ */
8224
+ function useQueue(namespace = "v0:queue") {
8225
+ return useContext(namespace);
8226
+ }
8227
+ //#endregion
8228
+ //#region src/composables/useNotifications/index.ts
8229
+ /**
8230
+ * @module useNotifications
8231
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications
8232
+ *
8233
+ * @remarks
8234
+ * Notification management composable built on createRegistry and createQueue.
8235
+ * Registry stores the full notification lifecycle (permanent record).
8236
+ * Queue manages the display surface (toasts) with FIFO ordering and auto-dismiss.
8237
+ *
8238
+ * Supports:
8239
+ * - Push notifications with severity levels and configurable timeouts
8240
+ * - State mutations: read, seen, archived, snoozed
8241
+ * - Bulk operations: readAll, archiveAll, clear
8242
+ * - Toast queue with pause/resume and auto-dismiss
8243
+ * - Adapter integration via event system
8244
+ * - Plugin installation via createNotificationsPlugin
8245
+ */
8246
+ function createNotifications(options = {}) {
8247
+ const { timeout = 3e3, ...registryOptions } = options;
8248
+ const registry = createRegistry({
8249
+ ...registryOptions,
8250
+ events: true,
8251
+ reactive: true
8252
+ });
8253
+ const queue = createQueue({
8254
+ timeout,
8255
+ events: true,
8256
+ reactive: true
8257
+ });
8258
+ registry.on("unregister:ticket", (ticket) => {
8259
+ if (queue.has(ticket.id)) queue.unregister(ticket.id);
8260
+ });
8261
+ /**
8262
+ * Build a full {@link NotificationTicket} from raw input
8263
+ *
8264
+ * @param input The notification input to hydrate.
8265
+ * @returns A partial ticket with timestamps, lifecycle methods, and an ID.
8266
+ * @internal Used by {@link send}, {@link register}, and {@link onboard}.
8267
+ */
8268
+ function hydrate(input) {
8269
+ const id = input.id ?? /* @__PURE__ */ useId();
8270
+ const now = /* @__PURE__ */ new Date();
8271
+ return {
8272
+ ...input,
8273
+ id,
8274
+ createdAt: now,
8275
+ readAt: null,
8276
+ seenAt: null,
8277
+ archivedAt: null,
8278
+ snoozedUntil: null,
8279
+ read: () => read(id),
8280
+ unread: () => unread(id),
8281
+ seen: () => seen(id),
8282
+ archive: () => archive(id),
8283
+ unarchive: () => unarchive(id),
8284
+ snooze: (until) => snooze(id, until),
8285
+ wake: () => wake(id),
8286
+ dismiss: () => queue.unregister(id)
8287
+ };
8288
+ }
8289
+ /**
8290
+ * Create a notification and enqueue it for toast display
8291
+ *
8292
+ * @param input The notification input to create.
8293
+ * @returns The hydrated notification ticket.
8294
+ * @remarks Hydrates the input with timestamps and lifecycle methods, registers
8295
+ * it in the registry, adds it to the display queue, and emits
8296
+ * `notification:received`. The ticket auto-dismisses after the configured
8297
+ * timeout unless paused.
8298
+ *
8299
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#send
8300
+ *
8301
+ * @example
8302
+ * ```ts
8303
+ * import { useNotifications } from '@vuetify/v0'
8304
+ *
8305
+ * const notifications = useNotifications()
8306
+ *
8307
+ * // Basic toast
8308
+ * notifications.send({ subject: 'Changes saved', severity: 'success' })
8309
+ *
8310
+ * // With custom timeout
8311
+ * const ticket = notifications.send({ subject: 'Connection lost', severity: 'error', timeout: 10000 })
8312
+ *
8313
+ * console.log(ticket.id) // 'generated-id'
8314
+ * console.log(ticket.createdAt) // Date
8315
+ * console.log(ticket.readAt) // null
8316
+ *
8317
+ * // Ticket convenience methods
8318
+ * ticket.read() // marks as read
8319
+ * ticket.dismiss() // removes from toast queue, keeps in registry
8320
+ * ```
8321
+ */
8322
+ function send(input) {
8323
+ const ticket = registry.register(hydrate(input));
8324
+ queue.register(/* @__PURE__ */ isUndefined(input.timeout) ? { id: ticket.id } : {
8325
+ id: ticket.id,
8326
+ timeout: input.timeout
8327
+ });
8328
+ registry.emit("notification:received", ticket);
8329
+ return ticket;
8330
+ }
8331
+ /**
8332
+ * Register a notification in the registry without adding it to the toast queue
8333
+ *
8334
+ * @param input The notification input to register.
8335
+ * @returns The hydrated notification ticket.
8336
+ * @remarks Overrides the base registry `register` to hydrate the input with
8337
+ * timestamps and lifecycle methods. Use for historical or pre-existing items
8338
+ * that should appear in an inbox but not pop up as toasts.
8339
+ *
8340
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#register
8341
+ *
8342
+ * @example
8343
+ * ```ts
8344
+ * import { useNotifications } from '@vuetify/v0'
8345
+ *
8346
+ * const notifications = useNotifications()
8347
+ *
8348
+ * // Register a historical item (appears in inbox, not as toast)
8349
+ * const ticket = notifications.register({ id: 'old-1', subject: 'Deployed v2.1' })
8350
+ *
8351
+ * console.log(ticket.createdAt) // Date
8352
+ * console.log(ticket.readAt) // null
8353
+ *
8354
+ * // Lifecycle methods work the same as send()
8355
+ * ticket.read()
8356
+ * ticket.archive()
8357
+ * ```
8358
+ */
8359
+ function register(input) {
8360
+ return registry.register(hydrate(input));
8361
+ }
8362
+ /**
8363
+ * Bulk version of {@link register}
8364
+ *
8365
+ * @param inputs Array of notification inputs to register.
8366
+ * @returns Array of hydrated notification tickets.
8367
+ * @remarks Registers multiple notifications into the registry without toast
8368
+ * display. Wraps all registrations in a single `registry.batch()` call so
8369
+ * reactive updates are deferred until the entire batch completes.
8370
+ *
8371
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#onboard
8372
+ *
8373
+ * @example
8374
+ * ```ts
8375
+ * import { useNotifications } from '@vuetify/v0'
8376
+ *
8377
+ * const notifications = useNotifications()
8378
+ *
8379
+ * // Load historical items on mount
8380
+ * const tickets = notifications.onboard([
8381
+ * { id: 'n1', subject: 'Welcome to the team' },
8382
+ * { id: 'n2', subject: 'Setup complete', severity: 'success' },
8383
+ * ])
8384
+ *
8385
+ * console.log(tickets.length) // 2
8386
+ * console.log(notifications.queue.values()) // [] (no toasts)
8387
+ * console.log(notifications.values().length) // 2 (in registry)
8388
+ * ```
8389
+ */
8390
+ function onboard(inputs) {
8391
+ return registry.batch(() => inputs.map((input) => register(input)));
8392
+ }
8393
+ /**
8394
+ * Mark a notification as read
8395
+ *
8396
+ * @param id The ID of the notification to mark as read.
8397
+ * @remarks Sets `readAt` to the current time and emits `notification:read`.
8398
+ * Adapters listen to this event for outbound sync.
8399
+ *
8400
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#read
8401
+ *
8402
+ * @example
8403
+ * ```ts
8404
+ * import { useNotifications } from '@vuetify/v0'
8405
+ *
8406
+ * const notifications = useNotifications()
8407
+ *
8408
+ * const ticket = notifications.send({ subject: 'New message' })
8409
+ *
8410
+ * notifications.read(ticket.id)
8411
+ * console.log(ticket.readAt) // Date
8412
+ *
8413
+ * // Or via ticket convenience method
8414
+ * ticket.read()
8415
+ * ```
8416
+ */
8417
+ function read(id) {
8418
+ registry.upsert(id, { readAt: /* @__PURE__ */ new Date() }, "notification:read");
8419
+ }
8420
+ /**
8421
+ * Mark a notification as unread
8422
+ *
8423
+ * @param id The ID of the notification to mark as unread.
8424
+ * @remarks Clears `readAt` and emits `notification:unread`.
8425
+ *
8426
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#unread
8427
+ *
8428
+ * @example
8429
+ * ```ts
8430
+ * import { useNotifications } from '@vuetify/v0'
8431
+ *
8432
+ * const notifications = useNotifications()
8433
+ *
8434
+ * notifications.unread('notif-1')
8435
+ * ```
8436
+ */
8437
+ function unread(id) {
8438
+ registry.upsert(id, { readAt: null }, "notification:unread");
8439
+ }
8440
+ /**
8441
+ * Mark a notification as seen
8442
+ *
8443
+ * @param id The ID of the notification to mark as seen.
8444
+ * @remarks Sets `seenAt` to the current time and emits `notification:seen`.
8445
+ * Distinct from read — seen tracks whether the notification appeared in the
8446
+ * user's viewport, while read indicates the user actively engaged with it.
8447
+ *
8448
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#seen
8449
+ *
8450
+ * @example
8451
+ * ```ts
8452
+ * import { useNotifications } from '@vuetify/v0'
8453
+ *
8454
+ * const notifications = useNotifications()
8455
+ *
8456
+ * // Mark as seen when visible in inbox viewport
8457
+ * notifications.seen('notif-1')
8458
+ * ```
8459
+ */
8460
+ function seen(id) {
8461
+ registry.upsert(id, { seenAt: /* @__PURE__ */ new Date() }, "notification:seen");
8462
+ }
8463
+ /**
8464
+ * Archive a notification
8465
+ *
8466
+ * @param id The ID of the notification to archive.
8467
+ * @remarks Sets `archivedAt` to the current time and emits `notification:archived`.
8468
+ *
8469
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#archive
8470
+ *
8471
+ * @example
8472
+ * ```ts
8473
+ * import { useNotifications } from '@vuetify/v0'
8474
+ *
8475
+ * const notifications = useNotifications()
8476
+ *
8477
+ * notifications.archive('notif-1')
8478
+ * ```
8479
+ */
8480
+ function archive(id) {
8481
+ registry.upsert(id, { archivedAt: /* @__PURE__ */ new Date() }, "notification:archived");
8482
+ }
8483
+ /**
8484
+ * Restore an archived notification
8485
+ *
8486
+ * @param id The ID of the notification to unarchive.
8487
+ * @remarks Clears `archivedAt` and emits `notification:unarchived`.
8488
+ *
8489
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#unarchive
8490
+ *
8491
+ * @example
8492
+ * ```ts
8493
+ * import { useNotifications } from '@vuetify/v0'
8494
+ *
8495
+ * const notifications = useNotifications()
8496
+ *
8497
+ * notifications.unarchive('notif-1')
8498
+ * ```
8499
+ */
8500
+ function unarchive(id) {
8501
+ registry.upsert(id, { archivedAt: null }, "notification:unarchived");
8502
+ }
8503
+ /**
8504
+ * Snooze a notification until a given time
8505
+ *
8506
+ * @param id The ID of the notification to snooze.
8507
+ * @param until The time at which the snooze expires.
8508
+ * @remarks Sets `snoozedUntil` and emits `notification:snoozed`. The composable
8509
+ * does not auto-wake — consumers are responsible for calling {@link wake} when
8510
+ * the snooze expires (e.g., via a timer or server push).
8511
+ *
8512
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#snooze
8513
+ *
8514
+ * @example
8515
+ * ```ts
8516
+ * import { useNotifications } from '@vuetify/v0'
8517
+ *
8518
+ * const notifications = useNotifications()
8519
+ *
8520
+ * const tomorrow = new Date(Date.now() + 86_400_000)
8521
+ * notifications.snooze('notif-1', tomorrow)
8522
+ * ```
8523
+ */
8524
+ function snooze(id, until) {
8525
+ registry.upsert(id, { snoozedUntil: until }, "notification:snoozed");
8526
+ }
8527
+ /**
8528
+ * Cancel a snooze
8529
+ *
8530
+ * @param id The ID of the notification to wake.
8531
+ * @remarks Clears `snoozedUntil` and emits `notification:unsnoozed`.
8532
+ *
8533
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#wake
8534
+ *
8535
+ * @example
8536
+ * ```ts
8537
+ * import { useNotifications } from '@vuetify/v0'
8538
+ *
8539
+ * const notifications = useNotifications()
8540
+ *
8541
+ * notifications.wake('notif-1')
8542
+ * ```
8543
+ */
8544
+ function wake(id) {
8545
+ registry.upsert(id, { snoozedUntil: null }, "notification:unsnoozed");
8546
+ }
8547
+ /**
8548
+ * Mark all unread notifications as read
8549
+ *
8550
+ * @remarks Iterates all notifications and marks unread ones as read in a single
8551
+ * batch. Skips already-read notifications to preserve their original `readAt`
8552
+ * timestamp. Emits `notification:read` for each affected notification.
8553
+ *
8554
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#readall
8555
+ *
8556
+ * @example
8557
+ * ```ts
8558
+ * import { useNotifications } from '@vuetify/v0'
8559
+ *
8560
+ * const notifications = useNotifications()
8561
+ *
8562
+ * notifications.send({ subject: 'Message 1' })
8563
+ * notifications.send({ subject: 'Message 2' })
8564
+ *
8565
+ * notifications.readAll()
8566
+ *
8567
+ * console.log(notifications.values().every(t => t.readAt !== null)) // true
8568
+ * ```
8569
+ */
8570
+ function readAll() {
8571
+ const now = /* @__PURE__ */ new Date();
8572
+ registry.batch(() => {
8573
+ for (const ticket of registry.values()) if (/* @__PURE__ */ isNull(ticket.readAt)) registry.upsert(ticket.id, { readAt: now }, "notification:read");
8574
+ });
8575
+ }
8576
+ /**
8577
+ * Archive all unarchived notifications
8578
+ *
8579
+ * @remarks Iterates all notifications and archives unarchived ones in a single
8580
+ * batch. Skips already-archived notifications to preserve their original
8581
+ * `archivedAt` timestamp. Emits `notification:archived` for each affected notification.
8582
+ *
8583
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications#archiveall
8584
+ *
8585
+ * @example
8586
+ * ```ts
8587
+ * import { useNotifications } from '@vuetify/v0'
8588
+ *
8589
+ * const notifications = useNotifications()
8590
+ *
8591
+ * notifications.send({ subject: 'Alert 1' })
8592
+ * notifications.send({ subject: 'Alert 2' })
8593
+ *
8594
+ * notifications.archiveAll()
8595
+ *
8596
+ * console.log(notifications.values().every(t => t.archivedAt !== null)) // true
8597
+ * ```
8598
+ */
8599
+ function archiveAll() {
8600
+ const now = /* @__PURE__ */ new Date();
8601
+ registry.batch(() => {
8602
+ for (const ticket of registry.values()) if (/* @__PURE__ */ isNull(ticket.archivedAt)) registry.upsert(ticket.id, { archivedAt: now }, "notification:archived");
8603
+ });
8604
+ }
8605
+ return {
8606
+ ...registry,
8607
+ send,
8608
+ register,
8609
+ onboard,
8610
+ queue,
8611
+ read,
8612
+ unread,
8613
+ seen,
8614
+ archive,
8615
+ unarchive,
8616
+ snooze,
8617
+ wake,
8618
+ readAll,
8619
+ archiveAll,
8620
+ get size() {
8621
+ return registry.size;
8622
+ }
8623
+ };
8624
+ }
8625
+ function noop() {}
8626
+ const EMPTY = [];
8627
+ function createNotificationsFallback() {
8628
+ const stub = {
8629
+ id: "",
8630
+ index: 0,
8631
+ value: 0,
8632
+ valueIsIndex: true,
8633
+ createdAt: /* @__PURE__ */ new Date(0),
8634
+ readAt: null,
8635
+ seenAt: null,
8636
+ archivedAt: null,
8637
+ snoozedUntil: null,
8638
+ read: noop,
8639
+ unread: noop,
8640
+ seen: noop,
8641
+ archive: noop,
8642
+ unarchive: noop,
8643
+ snooze: noop,
8644
+ wake: noop,
8645
+ dismiss: noop,
8646
+ unregister: noop
8647
+ };
8648
+ return {
8649
+ collection: /* @__PURE__ */ new Map(),
8650
+ size: 0,
8651
+ send: () => stub,
8652
+ queue: {
8653
+ collection: /* @__PURE__ */ new Map(),
8654
+ size: 0,
8655
+ register: () => ({}),
8656
+ unregister: () => void 0,
8657
+ has: () => false,
8658
+ get: () => void 0,
8659
+ keys: () => EMPTY,
8660
+ values: () => EMPTY,
8661
+ entries: () => EMPTY,
8662
+ browse: () => void 0,
8663
+ lookup: () => void 0,
8664
+ upsert: () => ({}),
8665
+ seek: () => void 0,
8666
+ move: () => void 0,
8667
+ on: noop,
8668
+ off: noop,
8669
+ emit: noop,
8670
+ dispose: noop,
8671
+ clear: noop,
8672
+ reindex: noop,
8673
+ batch: (fn) => fn(),
8674
+ onboard: () => EMPTY,
8675
+ offboard: noop,
8676
+ pause: () => void 0,
8677
+ resume: () => void 0
8678
+ },
8679
+ read: noop,
8680
+ unread: noop,
8681
+ seen: noop,
8682
+ archive: noop,
8683
+ unarchive: noop,
8684
+ snooze: noop,
8685
+ wake: noop,
8686
+ readAll: noop,
8687
+ archiveAll: noop,
8688
+ clear: noop,
8689
+ has: () => false,
8690
+ get: () => void 0,
8691
+ keys: () => EMPTY,
8692
+ values: () => EMPTY,
8693
+ entries: () => EMPTY,
8694
+ browse: () => void 0,
8695
+ lookup: () => void 0,
8696
+ upsert: () => stub,
8697
+ register: () => stub,
8698
+ unregister: noop,
8699
+ reindex: noop,
8700
+ move: () => void 0,
8701
+ seek: () => void 0,
8702
+ on: noop,
8703
+ off: noop,
8704
+ emit: noop,
8705
+ dispose: noop,
8706
+ batch: (fn) => fn(),
8707
+ onboard: () => EMPTY,
8708
+ offboard: noop
8709
+ };
8710
+ }
8711
+ /**
8712
+ * Notification management with registry, event system, and optional adapters.
8713
+ *
8714
+ * @see https://0.vuetifyjs.com/composables/plugins/use-notifications
8715
+ *
8716
+ * @example
8717
+ * ```ts
8718
+ * import { createNotificationsPlugin, useNotifications } from '@vuetify/v0'
8719
+ *
8720
+ * // Install as plugin
8721
+ * app.use(createNotificationsPlugin())
8722
+ *
8723
+ * // Use in components
8724
+ * const notifications = useNotifications()
8725
+ * notifications.send({ subject: 'Saved', severity: 'success' })
8726
+ * ```
8727
+ */
8728
+ const [createNotificationsContext, createNotificationsPlugin, useNotifications] = createPluginContext("v0:notifications", (options) => createNotifications(options), {
8729
+ fallback: () => createNotificationsFallback(),
8730
+ setup: (context, app, options) => {
8731
+ app.onUnmount(() => {
8732
+ context.dispose();
8733
+ context.queue.dispose();
8734
+ });
8735
+ const { adapter } = options;
8736
+ if (!adapter) return;
8737
+ adapter.setup({
8738
+ send: context.send,
8739
+ register: context.register,
8740
+ on: context.on,
8741
+ off: context.off
8742
+ });
8743
+ if (/* @__PURE__ */ isFunction(adapter.dispose)) app.onUnmount(() => adapter.dispose());
8744
+ }
8745
+ });
8746
+ //#endregion
7874
8747
  //#region src/composables/usePermissions/adapters/adapter.ts
7875
8748
  var PermissionAdapter = class {};
7876
8749
  //#endregion
@@ -8028,17 +8901,28 @@ const [createPermissionsContext, createPermissionsPlugin, usePermissions] = crea
8028
8901
  * without wrapping the Popover compound component.
8029
8902
  */
8030
8903
  function usePopover(options = {}) {
8031
- const { id: _id, positionArea = "bottom", positionTry = "most-width bottom" } = options;
8904
+ const { id: _id, positionArea = "bottom", positionTry = "most-width bottom", showDelay = 0, hideDelay = 0 } = options;
8032
8905
  const id = _id ?? /* @__PURE__ */ useId();
8033
8906
  const isOpen = options.isOpen ?? shallowRef(false);
8034
- function open() {
8907
+ const showTimer = showDelay > 0 ? useTimer(() => {
8035
8908
  isOpen.value = true;
8909
+ }, { duration: showDelay }) : void 0;
8910
+ const hideTimer = hideDelay > 0 ? useTimer(() => {
8911
+ isOpen.value = false;
8912
+ }, { duration: hideDelay }) : void 0;
8913
+ function open() {
8914
+ hideTimer?.stop();
8915
+ if (showTimer) showTimer.start();
8916
+ else isOpen.value = true;
8036
8917
  }
8037
8918
  function close() {
8038
- isOpen.value = false;
8919
+ showTimer?.stop();
8920
+ if (hideTimer) hideTimer.start();
8921
+ else isOpen.value = false;
8039
8922
  }
8040
8923
  function toggle() {
8041
- isOpen.value = !isOpen.value;
8924
+ if (isOpen.value) close();
8925
+ else open();
8042
8926
  }
8043
8927
  const anchorStyles = toRef(() => ({ anchorName: `--${id}` }));
8044
8928
  const contentAttrs = toRef(() => ({
@@ -8054,228 +8938,101 @@ function usePopover(options = {}) {
8054
8938
  "position-try-fallbacks": positionTry
8055
8939
  }));
8056
8940
  /* v8 ignore start -- browser popover API */
8057
- function attach(el) {
8058
- onMounted(() => {
8059
- const element = toValue(el);
8060
- if (isOpen.value) element?.showPopover();
8061
- });
8062
- watch(isOpen, (value) => {
8063
- const element = toValue(el);
8064
- if (!element?.isConnected) return;
8065
- if (value === element.matches?.(":popover-open")) return;
8066
- if (value) element.showPopover?.();
8067
- else element.hidePopover?.();
8068
- });
8069
- useEventListener(el, "toggle", (e) => {
8070
- if (!toValue(el)?.isConnected) return;
8071
- isOpen.value = e.newState === "open";
8072
- });
8073
- }
8074
- /* v8 ignore stop */
8075
- return {
8076
- isOpen,
8077
- id,
8078
- open,
8079
- close,
8080
- toggle,
8081
- anchorStyles,
8082
- contentAttrs,
8083
- contentStyles,
8084
- attach
8085
- };
8086
- }
8087
- //#endregion
8088
- //#region src/composables/createQueue/index.ts
8089
- /**
8090
- * @module createQueue
8091
- *
8092
- * @remarks
8093
- * A queue composable for managing time-based collections with:
8094
- * - Automatic timeout-based removal
8095
- * - Pause/resume functionality
8096
- * - FIFO (First In, First Out) ordering
8097
- * - Manual dismissal support
8098
- * - Queue progression management
8099
- *
8100
- * Built on top of createRegistry, the queue automatically manages timeouts for tickets,
8101
- * ensuring only the first ticket in the queue is active at any time. When a ticket
8102
- * expires or is removed, the next ticket in the queue automatically becomes active.
8103
- */
8104
- /**
8105
- * Creates a new queue instance
8106
- *
8107
- * @param options The options for the queue instance
8108
- * @template Z The type of queue ticket that extends QueueTicket. Use this to add custom properties to tickets.
8109
- * @template E The type of queue context that extends QueueContext<Z>. Use this when extending the queue with additional methods.
8110
- * @returns A new queue instance
8111
- *
8112
- * @see https://0.vuetifyjs.com/composables/registration/create-queue
8113
- *
8114
- * @example
8115
- * ```ts
8116
- * import { useQueue } from '@vuetify/v0'
8117
- *
8118
- * const queue = useQueue()
8119
- *
8120
- * // Register an ticket with default timeout (3000ms)
8121
- * const ticket1 = queue.register({ value: 'Ticket 1' })
8122
- *
8123
- * // Register an ticket with custom timeout
8124
- * const ticket2 = queue.register({ value: 'Ticket 2', timeout: 5000 })
8125
- *
8126
- * // Register a persistent ticket that must be manually dismissed
8127
- * const ticket3 = queue.register({ value: 'Ticket 3', timeout: -1 })
8128
- *
8129
- * // Dismiss an ticket using the convenience method
8130
- * ticket3.dismiss()
8131
- *
8132
- * console.log(queue.size) // 2
8133
- * ```
8134
- */
8135
- function createQueue(_options = {}) {
8136
- const { timeout: _timeout = 3e3, ...options } = _options;
8137
- const registry = createRegistry({
8138
- ...options,
8139
- events: true
8140
- });
8141
- const timeouts = /* @__PURE__ */ new Map();
8142
- function startTimeout(ticket) {
8143
- if (/* @__PURE__ */ isUndefined(ticket.timeout) || ticket.timeout < 0 || ticket.isPaused) return;
8144
- const timeout = setTimeout(() => {
8145
- timeouts.delete(ticket.id);
8146
- registry.unregister(ticket.id);
8147
- resume();
8148
- }, ticket.timeout);
8149
- timeouts.set(ticket.id, timeout);
8150
- }
8151
- function clearTimeout(id) {
8152
- const timeout = timeouts.get(id);
8153
- if (timeout) {
8154
- globalThis.clearTimeout(timeout);
8155
- timeouts.delete(id);
8156
- }
8157
- }
8158
- function register(registration = {}) {
8159
- const id = registration.id ?? /* @__PURE__ */ useId();
8160
- const timeout = Object.prototype.hasOwnProperty.call(registration, "timeout") ? registration.timeout : _timeout;
8161
- const ticket = {
8162
- ...registration,
8163
- id,
8164
- timeout,
8165
- isPaused: registry.size > 0,
8166
- dismiss: () => unregister(id)
8167
- };
8168
- const registered = registry.register(ticket);
8169
- startTimeout(registered);
8170
- return registered;
8171
- }
8172
- function unregister(id) {
8173
- const ticket = /* @__PURE__ */ isUndefined(id) ? registry.seek("first") : registry.get(id);
8174
- if (!ticket) return void 0;
8175
- const wasFirst = ticket.index === 0;
8176
- clearTimeout(ticket.id);
8177
- registry.unregister(ticket.id);
8178
- if (wasFirst) resume();
8179
- return ticket;
8180
- }
8181
- function offboard(ids) {
8182
- let hadFirst = false;
8183
- for (const id of ids) {
8184
- const ticket = registry.get(id);
8185
- if (!ticket) continue;
8186
- if (ticket.index === 0) hadFirst = true;
8187
- clearTimeout(ticket.id);
8188
- }
8189
- registry.offboard(ids);
8190
- if (hadFirst) resume();
8191
- }
8192
- function pause() {
8193
- const ticket = registry.seek("first");
8194
- if (!ticket || ticket.isPaused) return void 0;
8195
- clearTimeout(ticket.id);
8196
- return registry.upsert(ticket.id, { isPaused: true });
8197
- }
8198
- function resume() {
8199
- const ticket = registry.seek("first");
8200
- if (!ticket || ticket.index !== 0 || !ticket.isPaused) return void 0;
8201
- const updated = registry.upsert(ticket.id, { isPaused: false });
8202
- startTimeout(updated);
8203
- return updated;
8204
- }
8205
- function clear() {
8206
- for (const id of timeouts.keys()) clearTimeout(id);
8207
- registry.clear();
8208
- }
8209
- function dispose() {
8210
- clear();
8211
- registry.dispose();
8212
- }
8213
- onScopeDispose(dispose, true);
8214
- function onboard(registrations) {
8215
- return registry.batch(() => registrations.map((registration) => register(registration)));
8941
+ function attach(el) {
8942
+ onMounted(() => {
8943
+ const element = toValue(el);
8944
+ if (isOpen.value) element?.showPopover();
8945
+ });
8946
+ watch(isOpen, (value) => {
8947
+ const element = toValue(el);
8948
+ if (!element?.isConnected) return;
8949
+ if (value === element.matches?.(":popover-open")) return;
8950
+ if (value) element.showPopover?.();
8951
+ else element.hidePopover?.();
8952
+ });
8953
+ useEventListener(el, "toggle", (e) => {
8954
+ if (!toValue(el)?.isConnected) return;
8955
+ isOpen.value = e.newState === "open";
8956
+ });
8216
8957
  }
8958
+ /* v8 ignore stop */
8217
8959
  return {
8218
- ...registry,
8219
- register,
8220
- unregister,
8221
- onboard,
8222
- offboard,
8223
- pause,
8224
- resume,
8225
- clear,
8226
- dispose,
8227
- get size() {
8228
- return registry.size;
8229
- }
8960
+ isOpen,
8961
+ id,
8962
+ open,
8963
+ close,
8964
+ toggle,
8965
+ anchorStyles,
8966
+ contentAttrs,
8967
+ contentStyles,
8968
+ attach
8230
8969
  };
8231
8970
  }
8971
+ //#endregion
8972
+ //#region src/composables/useRaf/index.ts
8232
8973
  /**
8233
- * Creates a new queue context.
8974
+ * @module useRaf
8234
8975
  *
8235
- * @param options The options for the queue context.
8236
- * @template Z The type of the queue ticket.
8237
- * @template E The type of the queue context.
8238
- * @returns A new queue context.
8976
+ * @see https://0.vuetifyjs.com/composables/system/use-raf
8239
8977
  *
8240
- * @see https://0.vuetifyjs.com/composables/registration/create-queue
8978
+ * @remarks
8979
+ * Scope-disposed safe requestAnimationFrame composable.
8241
8980
  *
8242
- * @example
8243
- * ```ts
8244
- * import { createQueueContext } from '@vuetify/v0'
8981
+ * Key features:
8982
+ * - Cancel-then-request pattern (deduplicates rapid calls)
8983
+ * - Automatic cleanup on scope disposal
8984
+ * - SSR-safe (no-op in non-browser environments)
8985
+ * - Callable function with cancel method
8245
8986
  *
8246
- * export const [useQueue, provideQueue, context] = createQueueContext({
8247
- * timeout: 5000,
8248
- * })
8249
- * ```
8987
+ * Perfect for throttling updates to the next animation frame.
8250
8988
  */
8251
- function createQueueContext(_options = {}) {
8252
- const { namespace = "v0:queue", ...options } = _options;
8253
- const [useQueueContext, _provideQueueContext] = createContext(namespace);
8254
- const context = createQueue(options);
8255
- function provideQueueContext(_context = context, app) {
8256
- return _provideQueueContext(_context, app);
8257
- }
8258
- return createTrinity(useQueueContext, provideQueueContext, context);
8259
- }
8260
8989
  /**
8261
- * Returns the current queue instance.
8990
+ * Scope-disposed safe requestAnimationFrame.
8262
8991
  *
8263
- * @param namespace The namespace for the queue context. Defaults to `'v0:queue'`.
8264
- * @returns The current queue instance.
8992
+ * @param callback Function to call on animation frame.
8993
+ * @returns Callable that requests frame (canceling pending), with cancel method.
8265
8994
  *
8266
- * @see https://0.vuetifyjs.com/composables/registration/create-queue
8995
+ * @see https://0.vuetifyjs.com/composables/system/use-raf
8267
8996
  *
8268
8997
  * @example
8269
- * ```vue
8270
- * <script setup lang="ts">
8271
- * import { useQueue } from '@vuetify/v0'
8998
+ * ```ts
8999
+ * // Basic usage
9000
+ * const update = useRaf((timestamp) => {
9001
+ * // Runs on next animation frame
9002
+ * })
8272
9003
  *
8273
- * const queue = useQueue()
8274
- * <\/script>
9004
+ * update() // Request frame
9005
+ * update() // Cancels previous, requests new (deduplicated)
9006
+ *
9007
+ * // Manual cancel
9008
+ * update.cancel()
9009
+ *
9010
+ * // Check if pending
9011
+ * if (update.isActive.value) { ... }
8275
9012
  * ```
8276
9013
  */
8277
- function useQueue(namespace = "v0:queue") {
8278
- return useContext(namespace);
9014
+ function useRaf(callback) {
9015
+ const id = shallowRef();
9016
+ const isActive = toRef(() => !/* @__PURE__ */ isUndefined(id.value));
9017
+ function cancel() {
9018
+ if (!/* @__PURE__ */ isUndefined(id.value)) {
9019
+ cancelAnimationFrame(id.value);
9020
+ id.value = void 0;
9021
+ }
9022
+ }
9023
+ function request() {
9024
+ if (!IN_BROWSER) return;
9025
+ cancel();
9026
+ id.value = requestAnimationFrame((timestamp) => {
9027
+ id.value = void 0;
9028
+ callback(timestamp);
9029
+ });
9030
+ }
9031
+ onScopeDispose(cancel, true);
9032
+ return Object.assign(request, {
9033
+ cancel,
9034
+ isActive
9035
+ });
8279
9036
  }
8280
9037
  //#endregion
8281
9038
  //#region src/composables/useRules/adapters/standard.ts
@@ -8866,6 +9623,9 @@ function createSlider(options = {}) {
8866
9623
  function ceil(index) {
8867
9624
  set(index, max);
8868
9625
  }
9626
+ function onboard(registrations) {
9627
+ return model.batch(() => registrations.map((r) => register(r)));
9628
+ }
8869
9629
  return {
8870
9630
  ...model,
8871
9631
  values,
@@ -8882,6 +9642,7 @@ function createSlider(options = {}) {
8882
9642
  orientation,
8883
9643
  inverted,
8884
9644
  register,
9645
+ onboard,
8885
9646
  snap,
8886
9647
  fromValue,
8887
9648
  fromPercent,
@@ -8961,12 +9722,12 @@ function createStack(_options = {}) {
8961
9722
  const id = input.id ?? /* @__PURE__ */ useId();
8962
9723
  const blocking = input.blocking ?? false;
8963
9724
  const onDismiss = input.onDismiss;
8964
- const zIndex = computed(() => {
9725
+ const zIndex = toRef(() => {
8965
9726
  const position = ids().indexOf(id);
8966
9727
  if (position === -1) return baseZIndex;
8967
9728
  return baseZIndex + position * increment;
8968
9729
  });
8969
- const globalTop = computed(() => {
9730
+ const globalTop = toRef(() => {
8970
9731
  const list = ids();
8971
9732
  if (list.length === 0) return false;
8972
9733
  return list.at(-1) === id;
@@ -9633,7 +10394,7 @@ function createTheme(_options = {}) {
9633
10394
  });
9634
10395
  if (id === options.default && !registry.selectedId.value) registry.select(id);
9635
10396
  }
9636
- const names = computed(() => registry.keys());
10397
+ const names = toRef(() => registry.keys());
9637
10398
  const colors = computed(() => {
9638
10399
  const resolved = {};
9639
10400
  for (const theme of registry.values()) {
@@ -9767,6 +10528,12 @@ function createTimeline(_options = {}) {
9767
10528
  function redo() {
9768
10529
  if (stack.length === 0) return void 0;
9769
10530
  const item = stack.pop();
10531
+ if (registry.size >= size) {
10532
+ const oldest = registry.seek("first");
10533
+ if (overflow.length === size) overflow.shift();
10534
+ overflow.push(oldest);
10535
+ registry.unregister(oldest.id);
10536
+ }
9770
10537
  const ticket = registry.register(item);
9771
10538
  registry.reindex();
9772
10539
  return ticket;
@@ -11868,7 +12635,7 @@ const _sfc_main$40 = /* @__PURE__ */ defineComponent({
11868
12635
  prev: pagination.prev,
11869
12636
  select: pagination.select,
11870
12637
  attrs: {
11871
- "aria-label": locale.t("Pagination.label", void 0, "Pagination"),
12638
+ "aria-label": locale.t("Pagination.label"),
11872
12639
  "role": __props.as === "nav" ? void 0 : "navigation"
11873
12640
  }
11874
12641
  }));
@@ -11965,7 +12732,7 @@ const _sfc_main$35 = /* @__PURE__ */ defineComponent({
11965
12732
  isDisabled: isDisabled.value,
11966
12733
  first,
11967
12734
  attrs: {
11968
- "aria-label": locale.t("Pagination.first", void 0, "Go to first page"),
12735
+ "aria-label": locale.t("Pagination.first"),
11969
12736
  "aria-disabled": isDisabled.value,
11970
12737
  "data-disabled": isDisabled.value || void 0,
11971
12738
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -12019,7 +12786,7 @@ const _sfc_main$36 = /* @__PURE__ */ defineComponent({
12019
12786
  }, { immediate: true });
12020
12787
  const isSelected = toRef(() => pagination.page.value === __props.value);
12021
12788
  const ariaLabel = toRef(() => {
12022
- return isSelected.value ? locale.t("Pagination.currentPage", { page: __props.value }, `Page ${__props.value}, current page`) : locale.t("Pagination.goToPage", { page: __props.value }, `Go to page ${__props.value}`);
12789
+ return isSelected.value ? locale.t("Pagination.currentPage", { page: __props.value }) : locale.t("Pagination.goToPage", { page: __props.value });
12023
12790
  });
12024
12791
  function select() {
12025
12792
  if (__props.disabled) return;
@@ -12090,7 +12857,7 @@ const _sfc_main$37 = /* @__PURE__ */ defineComponent({
12090
12857
  isDisabled: isDisabled.value,
12091
12858
  last,
12092
12859
  attrs: {
12093
- "aria-label": locale.t("Pagination.last", void 0, "Go to last page"),
12860
+ "aria-label": locale.t("Pagination.last"),
12094
12861
  "aria-disabled": isDisabled.value,
12095
12862
  "data-disabled": isDisabled.value || void 0,
12096
12863
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -12147,7 +12914,7 @@ const _sfc_main$38 = /* @__PURE__ */ defineComponent({
12147
12914
  isDisabled: isDisabled.value,
12148
12915
  next,
12149
12916
  attrs: {
12150
- "aria-label": locale.t("Pagination.next", void 0, "Go to next page"),
12917
+ "aria-label": locale.t("Pagination.next"),
12151
12918
  "aria-disabled": isDisabled.value,
12152
12919
  "data-disabled": isDisabled.value || void 0,
12153
12920
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -12204,7 +12971,7 @@ const _sfc_main$39 = /* @__PURE__ */ defineComponent({
12204
12971
  isDisabled: isDisabled.value,
12205
12972
  prev,
12206
12973
  attrs: {
12207
- "aria-label": locale.t("Pagination.prev", void 0, "Go to previous page"),
12974
+ "aria-label": locale.t("Pagination.prev"),
12208
12975
  "aria-disabled": isDisabled.value,
12209
12976
  "data-disabled": isDisabled.value || void 0,
12210
12977
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -12249,7 +13016,7 @@ const _sfc_main$41 = /* @__PURE__ */ defineComponent({
12249
13016
  text.value = locale.t("Pagination.status", {
12250
13017
  page,
12251
13018
  pages: pagination.pages
12252
- }, `Page ${page} of ${pagination.pages}`);
13019
+ });
12253
13020
  }, 100);
12254
13021
  });
12255
13022
  /* v8 ignore stop */
@@ -12854,7 +13621,7 @@ const visuallyHiddenStyle$1 = {
12854
13621
  whiteSpace: "nowrap",
12855
13622
  border: "0"
12856
13623
  };
12857
- const _sfc_main$81 = /* @__PURE__ */ defineComponent({
13624
+ const _sfc_main$86 = /* @__PURE__ */ defineComponent({
12858
13625
  name: "SelectHiddenInput",
12859
13626
  __name: "SelectHiddenInput",
12860
13627
  props: { namespace: { default: "v0:select" } },
@@ -12927,10 +13694,7 @@ const _sfc_main$55 = /* @__PURE__ */ defineComponent({
12927
13694
  events: true
12928
13695
  });
12929
13696
  useProxyModel(selection, model, { multiple: __props.multiple });
12930
- const selectedId = toRef(() => {
12931
- const ids = Array.from(selection.selectedIds);
12932
- return ids.length > 0 ? ids[0] : void 0;
12933
- });
13697
+ const selectedId = toRef(() => selection.selectedIds.values().next().value);
12934
13698
  const popover = usePopover({ id });
12935
13699
  const isOpen = popover.isOpen;
12936
13700
  const activatorEl = shallowRef(null);
@@ -13003,7 +13767,7 @@ const _sfc_main$55 = /* @__PURE__ */ defineComponent({
13003
13767
  }, {
13004
13768
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
13005
13769
  _: 3
13006
- }, 8, ["as"]), __props.name ? (openBlock(), createBlock(_sfc_main$81, { key: 0 })) : createCommentVNode("v-if", true)], 64);
13770
+ }, 8, ["as"]), __props.name ? (openBlock(), createBlock(_sfc_main$86, { key: 0 })) : createCommentVNode("v-if", true)], 64);
13007
13771
  };
13008
13772
  }
13009
13773
  });
@@ -13425,6 +14189,231 @@ const Selection = {
13425
14189
  Item: _sfc_main$57
13426
14190
  };
13427
14191
  //#endregion
14192
+ //#region src/components/Snackbar/SnackbarPortal.vue
14193
+ const _sfc_main$68 = /* @__PURE__ */ defineComponent({
14194
+ name: "SnackbarPortal",
14195
+ inheritAttrs: false,
14196
+ __name: "SnackbarPortal",
14197
+ props: {
14198
+ teleport: {
14199
+ type: [String, Boolean],
14200
+ default: "body"
14201
+ },
14202
+ as: { default: "div" },
14203
+ renderless: { type: Boolean }
14204
+ },
14205
+ setup(__props) {
14206
+ const ticket = useStack().register();
14207
+ onUnmounted(() => ticket.unregister());
14208
+ const styles = toRef(() => ({ zIndex: ticket.zIndex.value }));
14209
+ const slotProps = toRef(() => ({ zIndex: ticket.zIndex.value }));
14210
+ return (_ctx, _cache) => {
14211
+ return __props.teleport ? (openBlock(), createBlock(Teleport, {
14212
+ key: 0,
14213
+ to: __props.teleport
14214
+ }, [createVNode(unref(_sfc_main), mergeProps({
14215
+ as: __props.as,
14216
+ style: styles.value
14217
+ }, _ctx.$attrs), {
14218
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14219
+ _: 3
14220
+ }, 16, ["as", "style"])], 8, ["to"])) : (openBlock(), createBlock(unref(_sfc_main), mergeProps({
14221
+ key: 1,
14222
+ as: __props.as,
14223
+ style: styles.value
14224
+ }, _ctx.$attrs), {
14225
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14226
+ _: 3
14227
+ }, 16, ["as", "style"]));
14228
+ };
14229
+ }
14230
+ });
14231
+ //#endregion
14232
+ //#region src/components/Snackbar/SnackbarQueue.vue
14233
+ const [useSnackbarQueueContext, provideSnackbarQueueContext] = createContext({ suffix: "queue" });
14234
+ const _sfc_main$69 = /* @__PURE__ */ defineComponent({
14235
+ name: "SnackbarQueue",
14236
+ __name: "SnackbarQueue",
14237
+ props: {
14238
+ namespace: { default: "v0:notifications" },
14239
+ as: { default: "div" },
14240
+ renderless: { type: Boolean }
14241
+ },
14242
+ setup(__props) {
14243
+ const notifications = useNotifications(__props.namespace);
14244
+ function dismiss(id) {
14245
+ notifications.unregister(id);
14246
+ if (reasons.size > 0) notifications.queue.pause();
14247
+ }
14248
+ provideSnackbarQueueContext(__props.namespace, { dismiss });
14249
+ const items = computed(() => notifications.queue.values().map((q) => notifications.get(q.id)).filter((n) => !/* @__PURE__ */ isUndefined(n)).toReversed());
14250
+ const container = useTemplateRef("container");
14251
+ const reasons = /* @__PURE__ */ new Set();
14252
+ function pause(reason) {
14253
+ reasons.add(reason);
14254
+ notifications.queue.pause();
14255
+ }
14256
+ function resume(reason) {
14257
+ reasons.delete(reason);
14258
+ if (reasons.size === 0) notifications.queue.resume();
14259
+ }
14260
+ function onEnter() {
14261
+ pause("hover");
14262
+ }
14263
+ function onLeave() {
14264
+ resume("hover");
14265
+ }
14266
+ function onFocusin() {
14267
+ pause("focus");
14268
+ }
14269
+ function onFocusout(e) {
14270
+ const el = container.value?.element ?? null;
14271
+ if (/* @__PURE__ */ isElement(el) && /* @__PURE__ */ isElement(e.relatedTarget) && el.contains(e.relatedTarget)) return;
14272
+ resume("focus");
14273
+ }
14274
+ onUnmounted(() => {
14275
+ if (reasons.size > 0) {
14276
+ reasons.clear();
14277
+ notifications.queue.resume();
14278
+ }
14279
+ });
14280
+ const slotProps = toRef(() => ({
14281
+ items: items.value,
14282
+ attrs: {
14283
+ onMouseenter: onEnter,
14284
+ onMouseleave: onLeave,
14285
+ onFocusin,
14286
+ onFocusout
14287
+ }
14288
+ }));
14289
+ return (_ctx, _cache) => {
14290
+ return openBlock(), createBlock(unref(_sfc_main), mergeProps({
14291
+ ref_key: "container",
14292
+ ref: container
14293
+ }, slotProps.value.attrs, { as: __props.as }), {
14294
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14295
+ _: 3
14296
+ }, 16, ["as"]);
14297
+ };
14298
+ }
14299
+ });
14300
+ //#endregion
14301
+ //#region src/components/Snackbar/SnackbarRoot.vue
14302
+ const [useSnackbarRootContext, provideSnackbarRootContext] = createContext({ suffix: "root" });
14303
+ const _sfc_main$70 = /* @__PURE__ */ defineComponent({
14304
+ name: "SnackbarRoot",
14305
+ __name: "SnackbarRoot",
14306
+ props: {
14307
+ namespace: { default: "v0:notifications" },
14308
+ id: { default: () => /* @__PURE__ */ useId() },
14309
+ as: { default: "div" },
14310
+ renderless: { type: Boolean }
14311
+ },
14312
+ emits: ["dismiss"],
14313
+ setup(__props, { emit: __emit }) {
14314
+ const emit = __emit;
14315
+ const queue = useSnackbarQueueContext(__props.namespace, null);
14316
+ function onDismiss() {
14317
+ if (queue) queue.dismiss(__props.id);
14318
+ else emit("dismiss", __props.id);
14319
+ }
14320
+ provideSnackbarRootContext(__props.namespace, {
14321
+ id: __props.id,
14322
+ onDismiss
14323
+ });
14324
+ const slotProps = toRef(() => ({
14325
+ id: __props.id,
14326
+ attrs: { role: "status" }
14327
+ }));
14328
+ return (_ctx, _cache) => {
14329
+ return openBlock(), createBlock(unref(_sfc_main), mergeProps(slotProps.value.attrs, { as: __props.as }), {
14330
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14331
+ _: 3
14332
+ }, 16, ["as"]);
14333
+ };
14334
+ }
14335
+ });
14336
+ //#endregion
14337
+ //#region src/components/Snackbar/SnackbarContent.vue
14338
+ const _sfc_main$67 = /* @__PURE__ */ defineComponent({
14339
+ name: "SnackbarContent",
14340
+ __name: "SnackbarContent",
14341
+ props: {
14342
+ as: { default: "div" },
14343
+ renderless: { type: Boolean }
14344
+ },
14345
+ setup(__props) {
14346
+ return (_ctx, _cache) => {
14347
+ return openBlock(), createBlock(unref(_sfc_main), { as: __props.as }, {
14348
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
14349
+ _: 3
14350
+ }, 8, ["as"]);
14351
+ };
14352
+ }
14353
+ });
14354
+ //#endregion
14355
+ //#region src/components/Snackbar/SnackbarClose.vue
14356
+ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
14357
+ name: "SnackbarClose",
14358
+ __name: "SnackbarClose",
14359
+ props: {
14360
+ namespace: { default: "v0:notifications" },
14361
+ as: { default: "button" },
14362
+ renderless: { type: Boolean }
14363
+ },
14364
+ setup(__props) {
14365
+ const context = useSnackbarRootContext(__props.namespace);
14366
+ function onClick() {
14367
+ context.onDismiss();
14368
+ }
14369
+ const slotProps = toRef(() => ({ attrs: {
14370
+ "type": __props.as === "button" ? "button" : void 0,
14371
+ "aria-label": "Close",
14372
+ "onClick": onClick
14373
+ } }));
14374
+ return (_ctx, _cache) => {
14375
+ return openBlock(), createBlock(unref(_sfc_main), mergeProps(slotProps.value.attrs, { as: __props.as }), {
14376
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14377
+ _: 3
14378
+ }, 16, ["as"]);
14379
+ };
14380
+ }
14381
+ });
14382
+ //#endregion
14383
+ //#region src/components/Snackbar/index.ts
14384
+ /**
14385
+ * Snackbar component with sub-components for building toast notifications.
14386
+ *
14387
+ * @see https://0.vuetifyjs.com/components/snackbar
14388
+ *
14389
+ * @example
14390
+ * ```vue
14391
+ * <script setup lang="ts">
14392
+ * import { Snackbar } from '@vuetify/v0'
14393
+ * <\/script>
14394
+ *
14395
+ * <template>
14396
+ * <Snackbar.Portal>
14397
+ * <Snackbar.Queue v-slot="{ items }">
14398
+ * <template v-for="item in items" :key="item.id">
14399
+ * <Snackbar.Root :id="item.id">
14400
+ * <Snackbar.Content>{{ item.subject }}</Snackbar.Content>
14401
+ * <Snackbar.Close />
14402
+ * </Snackbar.Root>
14403
+ * </template>
14404
+ * </Snackbar.Queue>
14405
+ * </Snackbar.Portal>
14406
+ * </template>
14407
+ * ```
14408
+ */
14409
+ const Snackbar = {
14410
+ Portal: _sfc_main$68,
14411
+ Queue: _sfc_main$69,
14412
+ Root: _sfc_main$70,
14413
+ Content: _sfc_main$67,
14414
+ Close: _sfc_main$66
14415
+ };
14416
+ //#endregion
13428
14417
  //#region src/components/Slider/SliderRoot.vue
13429
14418
  const [useSliderRoot, provideSliderRoot] = createContext();
13430
14419
  const _sfc_main$63 = /* @__PURE__ */ defineComponent({
@@ -13878,7 +14867,7 @@ const Slider = {
13878
14867
  //#endregion
13879
14868
  //#region src/components/Splitter/SplitterRoot.vue
13880
14869
  const [useSplitterRoot, provideSplitterRoot] = createContext("v0:splitter");
13881
- const _sfc_main$68 = /* @__PURE__ */ defineComponent({
14870
+ const _sfc_main$73 = /* @__PURE__ */ defineComponent({
13882
14871
  name: "SplitterRoot",
13883
14872
  inheritAttrs: false,
13884
14873
  __name: "SplitterRoot",
@@ -14043,10 +15032,10 @@ const _sfc_main$68 = /* @__PURE__ */ defineComponent({
14043
15032
  }, {
14044
15033
  as: __props.as,
14045
15034
  renderless: __props.renderless,
14046
- style: {
15035
+ style: [unref(attrs).style, {
14047
15036
  display: "flex",
14048
15037
  flexDirection: __props.orientation === "horizontal" ? "row" : "column"
14049
- }
15038
+ }]
14050
15039
  }), {
14051
15040
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14052
15041
  _: 3
@@ -14060,7 +15049,7 @@ const _sfc_main$68 = /* @__PURE__ */ defineComponent({
14060
15049
  });
14061
15050
  //#endregion
14062
15051
  //#region src/components/Splitter/SplitterPanel.vue
14063
- const _sfc_main$67 = /* @__PURE__ */ defineComponent({
15052
+ const _sfc_main$72 = /* @__PURE__ */ defineComponent({
14064
15053
  name: "SplitterPanel",
14065
15054
  inheritAttrs: false,
14066
15055
  __name: "SplitterPanel",
@@ -14154,12 +15143,12 @@ const _sfc_main$67 = /* @__PURE__ */ defineComponent({
14154
15143
  }, {
14155
15144
  as: __props.as,
14156
15145
  renderless: __props.renderless,
14157
- style: {
15146
+ style: [unref(attrs).style, {
14158
15147
  flexGrow: 0,
14159
15148
  flexShrink: 0,
14160
15149
  flexBasis: `${size.value}%`,
14161
15150
  overflow: "hidden"
14162
- }
15151
+ }]
14163
15152
  }), {
14164
15153
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14165
15154
  _: 3
@@ -14173,7 +15162,7 @@ const _sfc_main$67 = /* @__PURE__ */ defineComponent({
14173
15162
  });
14174
15163
  //#endregion
14175
15164
  //#region src/components/Splitter/SplitterHandle.vue
14176
- const _sfc_main$66 = /* @__PURE__ */ defineComponent({
15165
+ const _sfc_main$71 = /* @__PURE__ */ defineComponent({
14177
15166
  name: "SplitterHandle",
14178
15167
  inheritAttrs: false,
14179
15168
  __name: "SplitterHandle",
@@ -14197,7 +15186,6 @@ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
14197
15186
  });
14198
15187
  const hovering = shallowRef(false);
14199
15188
  const startPosition = shallowRef(0);
14200
- let rafId = 0;
14201
15189
  let latestPos = 0;
14202
15190
  const isDisabled = toRef(() => __props.disabled || splitter.disabled.value);
14203
15191
  const isHorizontal = toRef(() => splitter.orientation.value === "horizontal");
@@ -14230,23 +15218,21 @@ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
14230
15218
  splitter.onStartDrag(ticket.index);
14231
15219
  }
14232
15220
  useToggleScope(() => splitter.draggingHandle.value === ticket.index, () => {
15221
+ const update = useRaf(() => {
15222
+ const root = splitter.rootEl.value;
15223
+ if (!root) return;
15224
+ const rootSize = isHorizontal.value ? root.offsetWidth : root.offsetHeight;
15225
+ if (!rootSize) return;
15226
+ const delta = (latestPos - startPosition.value) / rootSize * 100;
15227
+ startPosition.value = latestPos;
15228
+ splitter.resize(ticket.index, delta);
15229
+ });
14233
15230
  useDocumentEventListener("pointermove", (e) => {
14234
15231
  latestPos = isHorizontal.value ? e.clientX : e.clientY;
14235
- if (rafId) return;
14236
- rafId = requestAnimationFrame(() => {
14237
- const root = splitter.rootEl.value;
14238
- if (!root) return;
14239
- const rootSize = isHorizontal.value ? root.offsetWidth : root.offsetHeight;
14240
- if (!rootSize) return;
14241
- const delta = (latestPos - startPosition.value) / rootSize * 100;
14242
- startPosition.value = latestPos;
14243
- splitter.resize(ticket.index, delta);
14244
- rafId = 0;
14245
- });
15232
+ update();
14246
15233
  });
14247
15234
  useDocumentEventListener("pointerup", () => {
14248
- if (rafId) cancelAnimationFrame(rafId);
14249
- rafId = 0;
15235
+ update.cancel();
14250
15236
  if (IN_BROWSER) {
14251
15237
  document.documentElement.style.userSelect = "";
14252
15238
  document.documentElement.style.touchAction = "";
@@ -14254,8 +15240,6 @@ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
14254
15240
  splitter.onEndDrag();
14255
15241
  });
14256
15242
  onScopeDispose(() => {
14257
- if (rafId) cancelAnimationFrame(rafId);
14258
- rafId = 0;
14259
15243
  splitter.onEndDrag();
14260
15244
  if (IN_BROWSER) {
14261
15245
  document.documentElement.style.userSelect = "";
@@ -14356,11 +15340,19 @@ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
14356
15340
  }, {
14357
15341
  as: __props.as,
14358
15342
  renderless: __props.renderless,
14359
- style: { flexShrink: 0 }
15343
+ style: [
15344
+ unref(attrs).style,
15345
+ slotProps.value.attrs.style,
15346
+ { flexShrink: 0 }
15347
+ ]
14360
15348
  }), {
14361
15349
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14362
15350
  _: 3
14363
- }, 16, ["as", "renderless"]);
15351
+ }, 16, [
15352
+ "as",
15353
+ "renderless",
15354
+ "style"
15355
+ ]);
14364
15356
  };
14365
15357
  }
14366
15358
  });
@@ -14393,14 +15385,14 @@ const _sfc_main$66 = /* @__PURE__ */ defineComponent({
14393
15385
  * ```
14394
15386
  */
14395
15387
  const Splitter = {
14396
- Root: _sfc_main$68,
14397
- Panel: _sfc_main$67,
14398
- Handle: _sfc_main$66
15388
+ Root: _sfc_main$73,
15389
+ Panel: _sfc_main$72,
15390
+ Handle: _sfc_main$71
14399
15391
  };
14400
15392
  //#endregion
14401
15393
  //#region src/components/Switch/SwitchGroup.vue
14402
15394
  const [useSwitchGroup, provideSwitchGroup] = createContext();
14403
- const _sfc_main$71 = /* @__PURE__ */ defineComponent({
15395
+ const _sfc_main$76 = /* @__PURE__ */ defineComponent({
14404
15396
  name: "SwitchGroup",
14405
15397
  __name: "SwitchGroup",
14406
15398
  props: /* @__PURE__ */ mergeModels({
@@ -14469,7 +15461,7 @@ const _sfc_main$71 = /* @__PURE__ */ defineComponent({
14469
15461
  //#endregion
14470
15462
  //#region src/components/Switch/SwitchRoot.vue
14471
15463
  const [useSwitchRoot, provideSwitchRoot] = createContext();
14472
- const _sfc_main$73 = /* @__PURE__ */ defineComponent({
15464
+ const _sfc_main$78 = /* @__PURE__ */ defineComponent({
14473
15465
  name: "SwitchRoot",
14474
15466
  inheritAttrs: false,
14475
15467
  __name: "SwitchRoot",
@@ -14599,7 +15591,7 @@ const _sfc_main$73 = /* @__PURE__ */ defineComponent({
14599
15591
  }), {
14600
15592
  default: withCtx(() => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))]),
14601
15593
  _: 3
14602
- }, 16, ["as", "renderless"]), __props.name ? (openBlock(), createBlock(_sfc_main$72, { key: 0 })) : createCommentVNode("v-if", true)], 64);
15594
+ }, 16, ["as", "renderless"]), __props.name ? (openBlock(), createBlock(_sfc_main$77, { key: 0 })) : createCommentVNode("v-if", true)], 64);
14603
15595
  };
14604
15596
  }
14605
15597
  });
@@ -14623,7 +15615,7 @@ const visuallyHiddenStyle = {
14623
15615
  whiteSpace: "nowrap",
14624
15616
  border: "0"
14625
15617
  };
14626
- const _sfc_main$72 = /* @__PURE__ */ defineComponent({
15618
+ const _sfc_main$77 = /* @__PURE__ */ defineComponent({
14627
15619
  name: "SwitchHiddenInput",
14628
15620
  __name: "SwitchHiddenInput",
14629
15621
  props: {
@@ -14661,7 +15653,7 @@ const _sfc_main$72 = /* @__PURE__ */ defineComponent({
14661
15653
  });
14662
15654
  //#endregion
14663
15655
  //#region src/components/Switch/SwitchSelectAll.vue
14664
- const _sfc_main$74 = /* @__PURE__ */ defineComponent({
15656
+ const _sfc_main$79 = /* @__PURE__ */ defineComponent({
14665
15657
  name: "SwitchSelectAll",
14666
15658
  inheritAttrs: false,
14667
15659
  __name: "SwitchSelectAll",
@@ -14749,7 +15741,7 @@ const _sfc_main$74 = /* @__PURE__ */ defineComponent({
14749
15741
  });
14750
15742
  //#endregion
14751
15743
  //#region src/components/Switch/SwitchThumb.vue
14752
- const _sfc_main$75 = /* @__PURE__ */ defineComponent({
15744
+ const _sfc_main$80 = /* @__PURE__ */ defineComponent({
14753
15745
  name: "SwitchThumb",
14754
15746
  __name: "SwitchThumb",
14755
15747
  props: {
@@ -14784,7 +15776,7 @@ const _sfc_main$75 = /* @__PURE__ */ defineComponent({
14784
15776
  });
14785
15777
  //#endregion
14786
15778
  //#region src/components/Switch/SwitchTrack.vue
14787
- const _sfc_main$76 = /* @__PURE__ */ defineComponent({
15779
+ const _sfc_main$81 = /* @__PURE__ */ defineComponent({
14788
15780
  name: "SwitchTrack",
14789
15781
  __name: "SwitchTrack",
14790
15782
  props: {
@@ -14843,12 +15835,12 @@ const _sfc_main$76 = /* @__PURE__ */ defineComponent({
14843
15835
  * ```
14844
15836
  */
14845
15837
  const Switch = {
14846
- Group: _sfc_main$71,
14847
- HiddenInput: _sfc_main$72,
14848
- Root: _sfc_main$73,
14849
- SelectAll: _sfc_main$74,
14850
- Thumb: _sfc_main$75,
14851
- Track: _sfc_main$76
15838
+ Group: _sfc_main$76,
15839
+ HiddenInput: _sfc_main$77,
15840
+ Root: _sfc_main$78,
15841
+ SelectAll: _sfc_main$79,
15842
+ Thumb: _sfc_main$80,
15843
+ Track: _sfc_main$81
14852
15844
  };
14853
15845
  //#endregion
14854
15846
  //#region src/components/Single/SingleRoot.vue
@@ -14955,7 +15947,7 @@ const Single = {
14955
15947
  //#endregion
14956
15948
  //#region src/components/Step/StepRoot.vue
14957
15949
  const [useStepRoot, provideStepRoot] = createContext();
14958
- const _sfc_main$70 = /* @__PURE__ */ defineComponent({
15950
+ const _sfc_main$75 = /* @__PURE__ */ defineComponent({
14959
15951
  name: "StepRoot",
14960
15952
  __name: "StepRoot",
14961
15953
  props: /* @__PURE__ */ mergeModels({
@@ -15006,7 +15998,7 @@ const _sfc_main$70 = /* @__PURE__ */ defineComponent({
15006
15998
  });
15007
15999
  //#endregion
15008
16000
  //#region src/components/Step/StepItem.vue
15009
- const _sfc_main$69 = /* @__PURE__ */ defineComponent({
16001
+ const _sfc_main$74 = /* @__PURE__ */ defineComponent({
15010
16002
  name: "StepItem",
15011
16003
  __name: "StepItem",
15012
16004
  props: {
@@ -15056,13 +16048,13 @@ const _sfc_main$69 = /* @__PURE__ */ defineComponent({
15056
16048
  * @see https://0.vuetifyjs.com/components/step
15057
16049
  */
15058
16050
  const Step = {
15059
- Root: _sfc_main$70,
15060
- Item: _sfc_main$69
16051
+ Root: _sfc_main$75,
16052
+ Item: _sfc_main$74
15061
16053
  };
15062
16054
  //#endregion
15063
16055
  //#region src/components/Tabs/TabsRoot.vue
15064
16056
  const [useTabsRoot, provideTabsRoot] = createContext();
15065
- const _sfc_main$80 = /* @__PURE__ */ defineComponent({
16057
+ const _sfc_main$85 = /* @__PURE__ */ defineComponent({
15066
16058
  name: "TabsRoot",
15067
16059
  __name: "TabsRoot",
15068
16060
  props: /* @__PURE__ */ mergeModels({
@@ -15130,7 +16122,7 @@ const _sfc_main$80 = /* @__PURE__ */ defineComponent({
15130
16122
  });
15131
16123
  //#endregion
15132
16124
  //#region src/components/Tabs/TabsList.vue
15133
- const _sfc_main$78 = /* @__PURE__ */ defineComponent({
16125
+ const _sfc_main$83 = /* @__PURE__ */ defineComponent({
15134
16126
  name: "TabsList",
15135
16127
  inheritAttrs: false,
15136
16128
  __name: "TabsList",
@@ -15171,7 +16163,7 @@ const _sfc_main$78 = /* @__PURE__ */ defineComponent({
15171
16163
  });
15172
16164
  //#endregion
15173
16165
  //#region src/components/Tabs/TabsItem.vue
15174
- const _sfc_main$77 = /* @__PURE__ */ defineComponent({
16166
+ const _sfc_main$82 = /* @__PURE__ */ defineComponent({
15175
16167
  name: "TabsItem",
15176
16168
  inheritAttrs: false,
15177
16169
  __name: "TabsItem",
@@ -15286,7 +16278,7 @@ const _sfc_main$77 = /* @__PURE__ */ defineComponent({
15286
16278
  });
15287
16279
  //#endregion
15288
16280
  //#region src/components/Tabs/TabsPanel.vue
15289
- const _sfc_main$79 = /* @__PURE__ */ defineComponent({
16281
+ const _sfc_main$84 = /* @__PURE__ */ defineComponent({
15290
16282
  name: "TabsPanel",
15291
16283
  inheritAttrs: false,
15292
16284
  __name: "TabsPanel",
@@ -15367,10 +16359,10 @@ const _sfc_main$79 = /* @__PURE__ */ defineComponent({
15367
16359
  * ```
15368
16360
  */
15369
16361
  const Tabs = {
15370
- Root: _sfc_main$80,
15371
- List: _sfc_main$78,
15372
- Item: _sfc_main$77,
15373
- Panel: _sfc_main$79
16362
+ Root: _sfc_main$85,
16363
+ List: _sfc_main$83,
16364
+ Item: _sfc_main$82,
16365
+ Panel: _sfc_main$84
15374
16366
  };
15375
16367
  //#endregion
15376
- export { _sfc_main as Atom, Avatar, _sfc_main$1 as AvatarFallback, _sfc_main$2 as AvatarImage, _sfc_main$3 as AvatarRoot, Breadcrumbs, _sfc_main$4 as BreadcrumbsDivider, _sfc_main$5 as BreadcrumbsEllipsis, _sfc_main$6 as BreadcrumbsItem, _sfc_main$7 as BreadcrumbsLink, _sfc_main$8 as BreadcrumbsList, _sfc_main$9 as BreadcrumbsPage, _sfc_main$10 as BreadcrumbsRoot, COMMON_ELEMENTS, Checkbox, _sfc_main$11 as CheckboxGroup, _sfc_main$12 as CheckboxHiddenInput, _sfc_main$13 as CheckboxIndicator, _sfc_main$14 as CheckboxRoot, _sfc_main$15 as CheckboxSelectAll, ClientAdapter, ConsolaLoggerAdapter, DataTableAdapter, Dialog, _sfc_main$16 as DialogActivator, _sfc_main$17 as DialogClose, _sfc_main$18 as DialogContent, _sfc_main$19 as DialogDescription, _sfc_main$20 as DialogRoot, _sfc_main$21 as DialogTitle, ExpansionPanel, _sfc_main$22 as ExpansionPanelActivator, _sfc_main$23 as ExpansionPanelContent, _sfc_main$24 as ExpansionPanelHeader, _sfc_main$25 as ExpansionPanelItem, _sfc_main$26 as ExpansionPanelRoot, FeaturesAdapter, _sfc_main$27 as Form, Group, _sfc_main$28 as GroupItem, _sfc_main$29 as GroupRoot, IN_BROWSER, Input, _sfc_main$30 as InputControl, _sfc_main$31 as InputDescription, _sfc_main$32 as InputError, _sfc_main$33 as InputRoot, MemoryAdapter, Pagination, _sfc_main$34 as PaginationEllipsis, _sfc_main$35 as PaginationFirst, _sfc_main$36 as PaginationItem, _sfc_main$37 as PaginationLast, _sfc_main$38 as PaginationNext, _sfc_main$39 as PaginationPrev, _sfc_main$40 as PaginationRoot, _sfc_main$41 as PaginationStatus, PermissionAdapter, PinoLoggerAdapter, Popover, _sfc_main$42 as PopoverActivator, _sfc_main$43 as PopoverContent, _sfc_main$44 as PopoverRoot, Radio, _sfc_main$45 as RadioGroup, _sfc_main$46 as RadioHiddenInput, _sfc_main$47 as RadioIndicator, _sfc_main$48 as RadioRoot, SELF_CLOSING_TAGS, SUPPORTS_INTERSECTION_OBSERVER, SUPPORTS_MATCH_MEDIA, SUPPORTS_MUTATION_OBSERVER, SUPPORTS_OBSERVER, SUPPORTS_TOUCH, _sfc_main$49 as Scrim, Select, _sfc_main$50 as SelectActivator, _sfc_main$51 as SelectContent, _sfc_main$52 as SelectCue, _sfc_main$53 as SelectItem, _sfc_main$54 as SelectPlaceholder, _sfc_main$55 as SelectRoot, _sfc_main$56 as SelectValue, Selection, _sfc_main$57 as SelectionItem, _sfc_main$58 as SelectionRoot, ServerAdapter, Single, _sfc_main$59 as SingleItem, _sfc_main$60 as SingleRoot, Slider, _sfc_main$61 as SliderHiddenInput, _sfc_main$62 as SliderRange, _sfc_main$63 as SliderRoot, _sfc_main$64 as SliderThumb, _sfc_main$65 as SliderTrack, Splitter, _sfc_main$66 as SplitterHandle, _sfc_main$67 as SplitterPanel, _sfc_main$68 as SplitterRoot, Step, _sfc_main$69 as StepItem, _sfc_main$70 as StepRoot, Switch, _sfc_main$71 as SwitchGroup, _sfc_main$72 as SwitchHiddenInput, _sfc_main$73 as SwitchRoot, _sfc_main$74 as SwitchSelectAll, _sfc_main$75 as SwitchThumb, _sfc_main$76 as SwitchTrack, Tabs, _sfc_main$77 as TabsItem, _sfc_main$78 as TabsList, _sfc_main$79 as TabsPanel, _sfc_main$80 as TabsRoot, VirtualAdapter, Vuetify0LocaleAdapter, Vuetify0LoggerAdapter, Vuetify0RtlAdapter, Vuetify0ThemeAdapter, __LOGGER_ENABLED__, clamp, createBreadcrumbs, createBreadcrumbsContext, createBreakpoints, createBreakpointsContext, createBreakpointsPlugin, createContext, createDataTable, createDataTableContext, createDate, createDateContext, createDatePlugin, createFallbackHydration, createFeatures, createFeaturesContext, createFeaturesPlugin, createFilter, createFilterContext, createForm, createFormContext, createGroup, createGroupContext, createHydration, createHydrationContext, createHydrationPlugin, createLocale, createLocaleContext, createLocaleFallback, createLocalePlugin, createLogger, createLoggerContext, createLoggerPlugin, createModel, createNested, createNestedContext, createOverflow, createOverflowContext, createPagination, createPaginationContext, createPermissions, createPermissionsContext, createPermissionsPlugin, createPlugin, createPluginContext, createQueue, createQueueContext, 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, debounce, instanceExists, instanceName, isArray, isBoolean, isElement, isFunction, isNaN, isNull, isNullOrUndefined, isNumber, isObject, isPrimitive, isSelfClosingTag, isStandardSchema, isString, isSymbol, isUndefined, mergeDeep, multipleOpenStrategy, provideAvatarRoot, provideBreadcrumbsRoot, provideCheckboxGroup, provideCheckboxRoot, provideContext, provideDialogContext, provideExpansionPanelItem, provideExpansionPanelRoot, provideGroupRoot, provideInputRoot, providePaginationControls, providePaginationItems, providePaginationRoot, providePopoverContext, provideRadioGroup, provideRadioRoot, provideSelectContext, provideSelectionRoot, provideSingleRoot, provideSliderRoot, provideSplitterRoot, provideStepRoot, provideSwitchGroup, provideSwitchRoot, provideTabsRoot, range, singleOpenStrategy, toArray, toElement, toReactive, useAvatarRoot, useBreadcrumbs, useBreadcrumbsRoot, useBreakpoints, useCheckboxGroup, useCheckboxRoot, useClickOutside, useContext, useDataTable, useDate, useDialogContext, useDocumentEventListener, useElementIntersection, useElementSize, useEventListener, useExpansionPanelItem, useExpansionPanelRoot, useFeatures, useFilter, useForm, useGroup, useGroupRoot, useHotkey, useHydration, useId, useInputRoot, useIntersectionObserver, useLazy, useLocale, useLogger, useMediaQuery, useMutationObserver, useNested, useOverflow, usePagination, usePaginationControls, usePaginationItems, usePaginationRoot, usePermissions, usePopover, usePopoverContext, usePrefersContrast, usePrefersDark, usePrefersReducedMotion, useProxyModel, useProxyRegistry, useQueue, useRadioGroup, useRadioRoot, useRegistry, useResizeObserver, useRovingFocus, useRtl, useRules, useSelectContext, useSelection, useSelectionRoot, useSingle, useSingleRoot, useSliderRoot, useSplitterRoot, useStack, useStep, useStepRoot, useStorage, useSwitchGroup, useSwitchRoot, useTabsRoot, useTheme, useTimeline, useToggleScope, useTokens, useVirtual, useVirtualFocus, useWindowEventListener, version };
16368
+ export { _sfc_main as Atom, Avatar, _sfc_main$1 as AvatarFallback, _sfc_main$2 as AvatarImage, _sfc_main$3 as AvatarRoot, Breadcrumbs, _sfc_main$4 as BreadcrumbsDivider, _sfc_main$5 as BreadcrumbsEllipsis, _sfc_main$6 as BreadcrumbsItem, _sfc_main$7 as BreadcrumbsLink, _sfc_main$8 as BreadcrumbsList, _sfc_main$9 as BreadcrumbsPage, _sfc_main$10 as BreadcrumbsRoot, COMMON_ELEMENTS, Checkbox, _sfc_main$11 as CheckboxGroup, _sfc_main$12 as CheckboxHiddenInput, _sfc_main$13 as CheckboxIndicator, _sfc_main$14 as CheckboxRoot, _sfc_main$15 as CheckboxSelectAll, ClientAdapter, ConsolaLoggerAdapter, DataTableAdapter, Dialog, _sfc_main$16 as DialogActivator, _sfc_main$17 as DialogClose, _sfc_main$18 as DialogContent, _sfc_main$19 as DialogDescription, _sfc_main$20 as DialogRoot, _sfc_main$21 as DialogTitle, ExpansionPanel, _sfc_main$22 as ExpansionPanelActivator, _sfc_main$23 as ExpansionPanelContent, _sfc_main$24 as ExpansionPanelHeader, _sfc_main$25 as ExpansionPanelItem, _sfc_main$26 as ExpansionPanelRoot, FeaturesAdapter, _sfc_main$27 as Form, Group, _sfc_main$28 as GroupItem, _sfc_main$29 as GroupRoot, IN_BROWSER, Input, _sfc_main$30 as InputControl, _sfc_main$31 as InputDescription, _sfc_main$32 as InputError, _sfc_main$33 as InputRoot, MemoryAdapter, Pagination, _sfc_main$34 as PaginationEllipsis, _sfc_main$35 as PaginationFirst, _sfc_main$36 as PaginationItem, _sfc_main$37 as PaginationLast, _sfc_main$38 as PaginationNext, _sfc_main$39 as PaginationPrev, _sfc_main$40 as PaginationRoot, _sfc_main$41 as PaginationStatus, PermissionAdapter, PinoLoggerAdapter, Popover, _sfc_main$42 as PopoverActivator, _sfc_main$43 as PopoverContent, _sfc_main$44 as PopoverRoot, Radio, _sfc_main$45 as RadioGroup, _sfc_main$46 as RadioHiddenInput, _sfc_main$47 as RadioIndicator, _sfc_main$48 as RadioRoot, SELF_CLOSING_TAGS, SUPPORTS_INTERSECTION_OBSERVER, SUPPORTS_MATCH_MEDIA, SUPPORTS_MUTATION_OBSERVER, SUPPORTS_OBSERVER, SUPPORTS_TOUCH, _sfc_main$49 as Scrim, Select, _sfc_main$50 as SelectActivator, _sfc_main$51 as SelectContent, _sfc_main$52 as SelectCue, _sfc_main$53 as SelectItem, _sfc_main$54 as SelectPlaceholder, _sfc_main$55 as SelectRoot, _sfc_main$56 as SelectValue, Selection, _sfc_main$57 as SelectionItem, _sfc_main$58 as SelectionRoot, ServerAdapter, Single, _sfc_main$59 as SingleItem, _sfc_main$60 as SingleRoot, Slider, _sfc_main$61 as SliderHiddenInput, _sfc_main$62 as SliderRange, _sfc_main$63 as SliderRoot, _sfc_main$64 as SliderThumb, _sfc_main$65 as SliderTrack, Snackbar, _sfc_main$66 as SnackbarClose, _sfc_main$67 as SnackbarContent, _sfc_main$68 as SnackbarPortal, _sfc_main$69 as SnackbarQueue, _sfc_main$70 as SnackbarRoot, Splitter, _sfc_main$71 as SplitterHandle, _sfc_main$72 as SplitterPanel, _sfc_main$73 as SplitterRoot, Step, _sfc_main$74 as StepItem, _sfc_main$75 as StepRoot, Switch, _sfc_main$76 as SwitchGroup, _sfc_main$77 as SwitchHiddenInput, _sfc_main$78 as SwitchRoot, _sfc_main$79 as SwitchSelectAll, _sfc_main$80 as SwitchThumb, _sfc_main$81 as SwitchTrack, Tabs, _sfc_main$82 as TabsItem, _sfc_main$83 as TabsList, _sfc_main$84 as TabsPanel, _sfc_main$85 as TabsRoot, VirtualAdapter, Vuetify0LocaleAdapter, Vuetify0LoggerAdapter, Vuetify0RtlAdapter, Vuetify0ThemeAdapter, __LOGGER_ENABLED__, clamp, createBreadcrumbs, createBreadcrumbsContext, createBreakpoints, createBreakpointsContext, createBreakpointsPlugin, createContext, createDataTable, createDataTableContext, createDate, createDateContext, createDatePlugin, createFallbackHydration, createFeatures, createFeaturesContext, createFeaturesPlugin, createFilter, createFilterContext, createForm, createFormContext, createGroup, createGroupContext, createHydration, createHydrationContext, createHydrationPlugin, createLocale, createLocaleContext, createLocaleFallback, createLocalePlugin, createLogger, createLoggerContext, createLoggerPlugin, createModel, createNested, createNestedContext, createNotifications, createNotificationsContext, createNotificationsPlugin, createOverflow, createOverflowContext, createPagination, createPaginationContext, createPermissions, createPermissionsContext, createPermissionsPlugin, createPlugin, createPluginContext, createQueue, createQueueContext, 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, debounce, instanceExists, instanceName, isArray, isBoolean, isElement, isFunction, isNaN, isNull, isNullOrUndefined, isNumber, isObject, isPrimitive, isSelfClosingTag, isStandardSchema, isString, isSymbol, isUndefined, mergeDeep, multipleOpenStrategy, provideAvatarRoot, provideBreadcrumbsRoot, provideCheckboxGroup, provideCheckboxRoot, provideContext, provideDialogContext, provideExpansionPanelItem, provideExpansionPanelRoot, provideGroupRoot, provideInputRoot, providePaginationControls, providePaginationItems, providePaginationRoot, providePopoverContext, provideRadioGroup, provideRadioRoot, provideSelectContext, provideSelectionRoot, provideSingleRoot, provideSliderRoot, provideSnackbarQueueContext, provideSnackbarRootContext, provideSplitterRoot, provideStepRoot, provideSwitchGroup, provideSwitchRoot, provideTabsRoot, range, singleOpenStrategy, toArray, toElement, toReactive, useAvatarRoot, useBreadcrumbs, useBreadcrumbsRoot, useBreakpoints, useCheckboxGroup, useCheckboxRoot, useClickOutside, useContext, useDataTable, useDate, useDialogContext, useDocumentEventListener, useElementIntersection, useElementSize, useEventListener, useExpansionPanelItem, useExpansionPanelRoot, useFeatures, useFilter, useForm, useGroup, useGroupRoot, useHotkey, useHydration, useId, useInputRoot, useIntersectionObserver, useLazy, useLocale, useLogger, useMediaQuery, useMutationObserver, useNested, useNotifications, useOverflow, usePagination, usePaginationControls, usePaginationItems, usePaginationRoot, usePermissions, usePopover, usePopoverContext, usePrefersContrast, usePrefersDark, usePrefersReducedMotion, useProxyModel, useProxyRegistry, useQueue, useRadioGroup, useRadioRoot, useRaf, useRegistry, useResizeObserver, useRovingFocus, useRtl, useRules, useSelectContext, useSelection, useSelectionRoot, useSingle, useSingleRoot, useSliderRoot, useSnackbarQueueContext, useSnackbarRootContext, useSplitterRoot, useStack, useStep, useStepRoot, useStorage, useSwitchGroup, useSwitchRoot, useTabsRoot, useTheme, useTimeline, useTimer, useToggleScope, useTokens, useVirtual, useVirtualFocus, useWindowEventListener, version };