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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +1 -1
  2. package/dist/{adapter-D2ABPTpo.d.mts → adapter-BI-oyZCe.d.mts} +3 -2
  3. package/dist/{adapter-CQoi3rdC.d.mts → adapter-Butx_2UU.d.mts} +1 -1
  4. package/dist/{adapter-Cj7vxEdB.mjs → adapter-CJY6aQIS.mjs} +5 -1
  5. package/dist/browser/index.d.ts +25318 -0
  6. package/dist/browser/index.js +266 -161
  7. package/dist/components/index.d.mts +1 -1
  8. package/dist/components/index.mjs +1 -1
  9. package/dist/{components-Df1uIUcB.mjs → components-CQ570531.mjs} +114 -73
  10. package/dist/composables/index.d.mts +7 -7
  11. package/dist/composables/index.mjs +22 -22
  12. package/dist/{composables-C7MhsS5q.mjs → composables-Dp_S74ft.mjs} +11 -11
  13. package/dist/constants/index.mjs +1 -1
  14. package/dist/{createDataTable-DfggVqO1.mjs → createDataTable-xLtNGdr7.mjs} +3 -3
  15. package/dist/{createGroup-vfCXVfYV.mjs → createGroup-CBsJPLpN.mjs} +1 -1
  16. package/dist/{createRegistry-Ve2QNpZv.mjs → createRegistry-CRsG7t_g.mjs} +2 -2
  17. package/dist/{createSelection-CT2UG109.mjs → createSelection-DuaoHPSc.mjs} +8 -3
  18. package/dist/{createSingle-DTI4qvUd.mjs → createSingle-CiKU87Hj.mjs} +1 -1
  19. package/dist/{createTokens-C5bl_n6G.mjs → createTokens-4BZfgv9F.mjs} +6 -6
  20. package/dist/data-table/index.d.mts +1 -1
  21. package/dist/data-table/index.mjs +1 -1
  22. package/dist/date/index.mjs +1 -1
  23. package/dist/features/adapters/flagsmith/index.d.mts +1 -1
  24. package/dist/features/adapters/launchdarkly/index.d.mts +1 -1
  25. package/dist/features/adapters/posthog/index.d.mts +1 -1
  26. package/dist/features/adapters/posthog/index.mjs +1 -1
  27. package/dist/features/index.d.mts +2 -2
  28. package/dist/features/index.mjs +1 -1
  29. package/dist/{flagsmith-CXzNBqm3.d.mts → flagsmith-DA2GCyGv.d.mts} +1 -1
  30. package/dist/{globals-D78-6Zqq.mjs → globals-B0pQgO4u.mjs} +1 -1
  31. package/dist/{index-LMiCHwZl.d.mts → index-BBJnOUyA.d.mts} +2 -1
  32. package/dist/{index-Caq7DXRO.d.mts → index-BkTaCktP.d.mts} +7 -7
  33. package/dist/{index-B5OhvOR2.d.mts → index-CV7bOS7B.d.mts} +71 -14
  34. package/dist/{index-Bmz8PZMY.d.mts → index-CfHm03dg.d.mts} +1 -1
  35. package/dist/{index-B9YmdGZ3.d.mts → index-CyNk9FpR.d.mts} +3 -0
  36. package/dist/{index-DRrHHgE7.d.mts → index-DgPFPx_7.d.mts} +2 -2
  37. package/dist/{index-rJ_lhMYJ.d.mts → index-pM8UX1XI.d.mts} +2 -2
  38. package/dist/index.d.mts +10 -10
  39. package/dist/index.mjs +24 -24
  40. package/dist/json/attributes.json +4 -4
  41. package/dist/json/web-types.json +6 -6
  42. package/dist/{launchdarkly-DvhloBts.d.mts → launchdarkly-Bp8p9PMD.d.mts} +1 -1
  43. package/dist/locale/adapters/index.d.mts +2 -2
  44. package/dist/locale/adapters/index.mjs +1 -1
  45. package/dist/locale/adapters/v0/index.d.mts +1 -1
  46. package/dist/locale/adapters/v0/index.mjs +1 -1
  47. package/dist/locale/adapters/vue-i18n/index.d.mts +2 -1
  48. package/dist/locale/adapters/vue-i18n/index.mjs +3 -0
  49. package/dist/locale/index.d.mts +3 -3
  50. package/dist/locale/index.mjs +2 -2
  51. package/dist/locale/messages/en/index.d.mts +70 -0
  52. package/dist/locale/messages/en/index.mjs +56 -0
  53. package/dist/logger/adapters/index.mjs +1 -1
  54. package/dist/logger/adapters/v0/index.mjs +1 -1
  55. package/dist/logger/index.d.mts +1 -1
  56. package/dist/logger/index.mjs +2 -2
  57. package/dist/notifications/index.d.mts +1 -1
  58. package/dist/notifications/index.mjs +2 -2
  59. package/dist/palettes/ant/index.d.mts +1 -1
  60. package/dist/palettes/index.d.mts +3 -3
  61. package/dist/palettes/material/index.d.mts +1 -1
  62. package/dist/palettes/md1/index.d.mts +1 -1
  63. package/dist/palettes/md2/index.d.mts +1 -1
  64. package/dist/palettes/radix/index.d.mts +1 -1
  65. package/dist/palettes/tailwind/index.d.mts +1 -1
  66. package/dist/permissions/adapters/index.d.mts +1 -1
  67. package/dist/permissions/adapters/v0/index.d.mts +1 -1
  68. package/dist/permissions/index.d.mts +1 -1
  69. package/dist/permissions/index.mjs +1 -1
  70. package/dist/{posthog-BOT5W7Ds.d.mts → posthog-sFqk0bGy.d.mts} +1 -1
  71. package/dist/rules/index.d.mts +1 -1
  72. package/dist/rules/index.mjs +1 -1
  73. package/dist/storage/index.d.mts +1 -1
  74. package/dist/storage/index.mjs +1 -1
  75. package/dist/theme/adapters/index.d.mts +1 -1
  76. package/dist/theme/adapters/index.mjs +3 -3
  77. package/dist/theme/adapters/unhead/index.d.mts +1 -1
  78. package/dist/theme/adapters/unhead/index.mjs +1 -1
  79. package/dist/theme/adapters/v0/index.d.mts +1 -1
  80. package/dist/theme/adapters/v0/index.mjs +1 -1
  81. package/dist/theme/index.d.mts +1 -1
  82. package/dist/theme/index.mjs +4 -4
  83. package/dist/types/index.d.mts +1 -1
  84. package/dist/{unhead-t2_gsao2.mjs → unhead-Bn7eatWe.mjs} +10 -5
  85. package/dist/{useEventListener-BuETafFi.mjs → useEventListener-D1ETqQMm.mjs} +1 -1
  86. package/dist/{useFeatures-DyNG1_ge.mjs → useFeatures-D3DFBsYY.mjs} +3 -3
  87. package/dist/{useLocale-CYq4yT7b.mjs → useLocale-B44zLhFE.mjs} +9 -4
  88. package/dist/{useLogger-BEG9pAe8.mjs → useLogger-D7Fqcp_l.mjs} +2 -2
  89. package/dist/{useNotifications-BrZooK2S.mjs → useNotifications-DMHmr9C1.mjs} +4 -4
  90. package/dist/{usePermissions-BvaZwUe8.mjs → usePermissions-S0As54sf.mjs} +2 -2
  91. package/dist/{useRovingFocus-4F5-mWO7.mjs → useRovingFocus-u7uhPx2H.mjs} +106 -81
  92. package/dist/{useRules-B3vAa7tc.mjs → useRules-ByuxbMsA.mjs} +2 -2
  93. package/dist/{useStorage-lqTLed0e.mjs → useStorage-Fy5tWYkG.mjs} +3 -3
  94. package/dist/{useTheme-BGmROwu-.mjs → useTheme-DrR7HoLL.mjs} +4 -4
  95. package/dist/utilities/index.d.mts +1 -1
  96. package/dist/utilities/index.mjs +4 -3
  97. package/dist/{v0-4a_MJXIm.mjs → v0-BDdBMbzN.mjs} +1 -1
  98. package/dist/{v0-UJs1EiJ7.mjs → v0-BXjZknUK.mjs} +18 -5
  99. package/dist/{v0-D7NA38Vu.d.mts → v0-Cf5DZ4lw.d.mts} +3 -1
  100. package/dist/{v0-B08xQqj6.mjs → v0-DwKPTLJv.mjs} +16 -10
  101. package/package.json +4 -4
@@ -135,7 +135,7 @@ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && "matchMedia" in window && typeof wind
135
135
  const SUPPORTS_OBSERVER = IN_BROWSER && "ResizeObserver" in window;
136
136
  const SUPPORTS_INTERSECTION_OBSERVER = IN_BROWSER && "IntersectionObserver" in window;
137
137
  const SUPPORTS_MUTATION_OBSERVER = IN_BROWSER && "MutationObserver" in window;
138
- const version = "1.0.0-beta.3";
138
+ const version = "1.0.0-beta.4";
139
139
  /* v8 ignore next -- build-time constant, __DEV__ short-circuits in tests */
140
140
  const __LOGGER_ENABLED__ = false;
141
141
  //#endregion
@@ -478,12 +478,12 @@ function isPlainObject(value) {
478
478
  /* @__NO_SIDE_EFFECTS__ */
479
479
  function mergeDeep(target, ...sources) {
480
480
  const out = {};
481
- for (const key in target) if (Object.prototype.hasOwnProperty.call(target, key)) out[key] = target[key];
481
+ for (const key in target) if (Object.hasOwn(target, key)) out[key] = target[key];
482
482
  for (const source of sources) {
483
483
  if (!/* @__PURE__ */ isObject(source)) continue;
484
484
  for (const key in source) {
485
485
  if (UNSAFE_KEYS.has(key)) continue;
486
- if (!Object.prototype.hasOwnProperty.call(source, key)) continue;
486
+ if (!Object.hasOwn(source, key)) continue;
487
487
  const sourceValue = source[key];
488
488
  if (/* @__PURE__ */ isUndefined(sourceValue)) continue;
489
489
  const targetValue = out[key];
@@ -649,6 +649,7 @@ var V0Error = class extends Error {
649
649
  seed;
650
650
  variant;
651
651
  adapter;
652
+ prefix;
652
653
  constructor(message, details) {
653
654
  const { cause, ...rest } = details;
654
655
  super(message, /* @__PURE__ */ isUndefined(cause) ? void 0 : { cause });
@@ -1702,7 +1703,7 @@ function createRegistry(options) {
1702
1703
  ...patch,
1703
1704
  id
1704
1705
  });
1705
- const hasValue = Object.prototype.hasOwnProperty.call(patch, "value");
1706
+ const hasValue = Object.hasOwn(patch, "value");
1706
1707
  let value = existing.value;
1707
1708
  let valueIsIndex = existing.valueIsIndex;
1708
1709
  if (hasValue) {
@@ -2187,7 +2188,7 @@ function createModel(_options = {}) {
2187
2188
  if (!toValue(multiple)) selectedIds.clear();
2188
2189
  if (/* @__PURE__ */ isUndefined(value)) return;
2189
2190
  const id = registry.browse(toRaw(value))?.values().next().value;
2190
- if (!/* @__PURE__ */ isUndefined(id)) selectedIds.add(id);
2191
+ if (!/* @__PURE__ */ isUndefined(id)) select(id);
2191
2192
  }
2192
2193
  function register(registration = {}) {
2193
2194
  const id = registration.id ?? /* @__PURE__ */ useId();
@@ -2380,7 +2381,12 @@ function createSelection(_options = {}) {
2380
2381
  }
2381
2382
  if (isMultiple) {
2382
2383
  for (const id of currentIds) if (!targetIds.has(id)) unselect(id);
2383
- for (const id of targetIds) if (!currentIds.has(id)) model.selectedIds.add(id);
2384
+ for (const id of targetIds) {
2385
+ if (currentIds.has(id)) continue;
2386
+ const ticket = model.get(id);
2387
+ if (ticket && toValue(ticket.disabled)) continue;
2388
+ model.selectedIds.add(id);
2389
+ }
2384
2390
  } else {
2385
2391
  const next = targetIds.values().next().value;
2386
2392
  const last = currentIds.values().next().value;
@@ -2770,7 +2776,7 @@ function createTokens(tokens = {}, options = {}) {
2770
2776
  if (segments.length > 0) {
2771
2777
  if (isTokenAlias(current)) current = current.$value;
2772
2778
  for (const segment of segments) {
2773
- if (!/* @__PURE__ */ isObject(current) || !(segment in current)) {
2779
+ if (!/* @__PURE__ */ isObject(current) || UNSAFE_KEYS.has(segment) || !Object.prototype.hasOwnProperty.call(current, segment)) {
2774
2780
  current = void 0;
2775
2781
  break;
2776
2782
  }
@@ -2905,7 +2911,7 @@ function flatten(tokens, prefix = "", flat = false) {
2905
2911
  const { tokens: currentTokens, prefix: currentPrefix, flat } = stack.pop();
2906
2912
  const meta = {};
2907
2913
  for (const k in currentTokens) {
2908
- if (!Object.prototype.hasOwnProperty.call(currentTokens, k)) continue;
2914
+ if (!Object.hasOwn(currentTokens, k)) continue;
2909
2915
  if (k.startsWith("$")) meta[k] = currentTokens[k];
2910
2916
  }
2911
2917
  if (Object.keys(meta).length > 0 && currentPrefix) flattened.push({
@@ -2913,7 +2919,7 @@ function flatten(tokens, prefix = "", flat = false) {
2913
2919
  value: meta
2914
2920
  });
2915
2921
  for (const key in currentTokens) {
2916
- if (!Object.prototype.hasOwnProperty.call(currentTokens, key)) continue;
2922
+ if (!Object.hasOwn(currentTokens, key)) continue;
2917
2923
  if (UNSAFE_KEYS.has(key)) continue;
2918
2924
  if (key.startsWith("$")) continue;
2919
2925
  const value = currentTokens[key];
@@ -2932,7 +2938,7 @@ function flatten(tokens, prefix = "", flat = false) {
2932
2938
  });
2933
2939
  const inner = value.$value;
2934
2940
  if (/* @__PURE__ */ isObject(inner) && !flat) for (const innerKey in inner) {
2935
- if (!Object.prototype.hasOwnProperty.call(inner, innerKey)) continue;
2941
+ if (!Object.hasOwn(inner, innerKey)) continue;
2936
2942
  if (UNSAFE_KEYS.has(innerKey)) continue;
2937
2943
  if (innerKey.startsWith("$")) continue;
2938
2944
  const child = inner[innerKey];
@@ -2987,21 +2993,27 @@ var V0LocaleAdapter = class extends LocaleAdapter {
2987
2993
  this.context = context;
2988
2994
  }
2989
2995
  t(key, ...params) {
2990
- const locale = this.context.selectedId.value;
2991
- if (!locale) return this.interpolate(key, params);
2992
- const message = this.context.tokens.get(`${locale}.${key}`)?.value;
2993
- if (/* @__PURE__ */ isString(message)) return this.interpolate(this.resolve(locale, message), params);
2994
- if (this.context.fallbackLocale) {
2995
- const fbMessage = this.context.tokens.get(`${this.context.fallbackLocale}.${key}`)?.value;
2996
- if (/* @__PURE__ */ isString(fbMessage)) return this.interpolate(this.resolve(this.context.fallbackLocale, fbMessage), params);
2997
- }
2998
- return this.interpolate(key, params);
2996
+ const found = this.lookup(key, params);
2997
+ return /* @__PURE__ */ isUndefined(found) ? this.interpolate(key, params) : found;
2998
+ }
2999
+ ti(key, ...params) {
3000
+ return this.lookup(key, params);
2999
3001
  }
3000
3002
  n(value) {
3001
3003
  const locale = this.context.selectedId.value;
3002
3004
  if (!IN_BROWSER || !locale) return value.toString();
3003
3005
  return new Intl.NumberFormat(String(locale)).format(value);
3004
3006
  }
3007
+ lookup(key, params) {
3008
+ const locale = this.context.selectedId.value;
3009
+ if (!locale) return void 0;
3010
+ const message = this.context.tokens.get(`${locale}.${key}`)?.value;
3011
+ if (/* @__PURE__ */ isString(message)) return this.interpolate(this.resolve(locale, message), params);
3012
+ if (this.context.fallbackLocale) {
3013
+ const fb = this.context.tokens.get(`${this.context.fallbackLocale}.${key}`)?.value;
3014
+ if (/* @__PURE__ */ isString(fb)) return this.interpolate(this.resolve(this.context.fallbackLocale, fb), params);
3015
+ }
3016
+ }
3005
3017
  resolve(locale, str, visited = /* @__PURE__ */ new Set()) {
3006
3018
  return str.replace(/{([a-zA-Z0-9.\-_]+)}/g, (match, key) => {
3007
3019
  const [prefix, ...rest] = key.split(".");
@@ -3087,6 +3099,9 @@ function createLocale(_options = {}) {
3087
3099
  function t(key, ...params) {
3088
3100
  return adapter.t(key, ...params);
3089
3101
  }
3102
+ function ti(key, ...params) {
3103
+ return adapter.ti(key, ...params);
3104
+ }
3090
3105
  function n(value) {
3091
3106
  return adapter.n(value);
3092
3107
  }
@@ -3098,6 +3113,7 @@ function createLocale(_options = {}) {
3098
3113
  return {
3099
3114
  ...registry,
3100
3115
  t,
3116
+ ti,
3101
3117
  n,
3102
3118
  register,
3103
3119
  get size() {
@@ -3109,6 +3125,7 @@ function createLocaleFallback() {
3109
3125
  return {
3110
3126
  size: 0,
3111
3127
  t: (key) => key,
3128
+ ti: () => void 0,
3112
3129
  n: String
3113
3130
  };
3114
3131
  }
@@ -3137,7 +3154,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
3137
3154
  isOpen: context.isOpen.value,
3138
3155
  attrs: {
3139
3156
  "type": __props.as === "button" ? "button" : void 0,
3140
- "aria-label": locale.t("AlertDialog.close"),
3157
+ "aria-label": locale.ti("AlertDialog.close") ?? "Close",
3141
3158
  "onClick": onClick
3142
3159
  }
3143
3160
  }));
@@ -3478,6 +3495,19 @@ function useClickOutside(target, handler, options = {}) {
3478
3495
  });
3479
3496
  }
3480
3497
  /**
3498
+ * Check if the event target is a strict descendant of any target element.
3499
+ *
3500
+ * @remarks Used by bounds mode so content rendered *inside* the element but
3501
+ * positioned outside its box (e.g. a top-layer overlay teleported into a
3502
+ * native `<dialog>`) is not treated as an outside click. A backdrop click has
3503
+ * `target === el`, so it is not a strict descendant and still counts as outside.
3504
+ */
3505
+ function isDescendant(eventTarget) {
3506
+ /* v8 ignore next -- defensive guard, callers always pass an Element */
3507
+ if (!(eventTarget instanceof Node)) return false;
3508
+ return getTargets().some((el) => el !== eventTarget && el.contains(eventTarget));
3509
+ }
3510
+ /**
3481
3511
  * Validate that the target is still in the DOM.
3482
3512
  */
3483
3513
  function isValidTarget(eventTarget) {
@@ -3517,7 +3547,7 @@ function useClickOutside(target, handler, options = {}) {
3517
3547
  const dy = Math.abs(event.clientY - startPosition.y);
3518
3548
  if (dx >= touchScrollThreshold || dy >= touchScrollThreshold) return;
3519
3549
  }
3520
- if ((bounds ? startedOutsideBounds && isOutsideBounds(event.clientX, event.clientY) : isOutside(pointerdownTarget) && isOutside(pointerupTarget)) && !shouldIgnore(path)) handler(event);
3550
+ if ((bounds ? startedOutsideBounds && isOutsideBounds(event.clientX, event.clientY) && !isDescendant(pointerdownTarget) && !isDescendant(pointerupTarget) : isOutside(pointerdownTarget) && isOutside(pointerupTarget)) && !shouldIgnore(path)) handler(event);
3521
3551
  }
3522
3552
  /**
3523
3553
  * Handle window blur - detect focus moving to iframe.
@@ -3574,6 +3604,63 @@ function useClickOutside(target, handler, options = {}) {
3574
3604
  };
3575
3605
  }
3576
3606
  //#endregion
3607
+ //#region src/composables/toElement/index.ts
3608
+ /**
3609
+ * @module toElement
3610
+ *
3611
+ * @see https://0.vuetifyjs.com/composables/transformers/to-element
3612
+ *
3613
+ * @remarks
3614
+ * Resolves various element reference types to a DOM Element.
3615
+ *
3616
+ * Accepts refs, getters, raw DOM elements, or Vue component instances
3617
+ * and normalizes them to a plain Element. Uses structural typing to
3618
+ * avoid cross-version Vue Ref incompatibilities.
3619
+ *
3620
+ * @example
3621
+ * ```ts
3622
+ * import { shallowRef } from 'vue'
3623
+ * import { toElement } from '@vuetify/v0'
3624
+ *
3625
+ * const el = shallowRef<HTMLElement | null>(null)
3626
+ * const resolved = toElement(el) // HTMLElement | undefined
3627
+ * ```
3628
+ */
3629
+ /**
3630
+ * Resolves a {@link MaybeElementRef} to a DOM Element or undefined.
3631
+ *
3632
+ * Handles:
3633
+ * - `Ref<Element>`, `ShallowRef<HTMLElement>`, getter functions
3634
+ * - Vue component instances (extracts `$el`)
3635
+ * - Raw DOM elements (pass-through)
3636
+ * - null/undefined (returns undefined)
3637
+ *
3638
+ * @param target The element ref, getter, or raw value to resolve
3639
+ * @returns The resolved DOM Element, or undefined if not available
3640
+ *
3641
+ * @see https://0.vuetifyjs.com/composables/transformers/to-element
3642
+ *
3643
+ * @example
3644
+ * ```ts
3645
+ * import { toElement } from '@vuetify/v0'
3646
+ *
3647
+ * const el = shallowRef<HTMLElement | null>(null)
3648
+ * toElement(el) // HTMLElement | undefined
3649
+ *
3650
+ * const component = ref<ComponentPublicInstance>()
3651
+ * toElement(component) // Element | undefined (from $el)
3652
+ * ```
3653
+ */
3654
+ /* @__NO_SIDE_EFFECTS__ */
3655
+ function toElement(target) {
3656
+ if (!target) return void 0;
3657
+ if (/* @__PURE__ */ isElement(target)) return target;
3658
+ const raw = /* @__PURE__ */ isFunction(target) ? target() : /* @__PURE__ */ isObject(target) && "value" in target ? target.value : target;
3659
+ if (!raw) return void 0;
3660
+ if (/* @__PURE__ */ isElement(raw)) return raw;
3661
+ if (/* @__PURE__ */ isObject(raw) && "$el" in raw) return raw.$el;
3662
+ }
3663
+ //#endregion
3577
3664
  //#region src/composables/useStack/index.ts
3578
3665
  /**
3579
3666
  * @module useStack
@@ -3631,7 +3718,7 @@ function createStack(_options = {}) {
3631
3718
  multiple: true
3632
3719
  });
3633
3720
  function selectedScrims() {
3634
- return Array.from(selection.selectedIds).map((id) => selection.get(id)).filter((ticket) => !!ticket && ticket.scrim !== false);
3721
+ return Array.from(selection.selectedIds).map((id) => selection.get(id)).filter((ticket) => !!ticket && ticket.scrim.value !== false);
3635
3722
  }
3636
3723
  const isActive = toRef(() => selectedScrims().length > 0);
3637
3724
  const top = toRef(() => selectedScrims().at(-1));
@@ -3639,14 +3726,22 @@ function createStack(_options = {}) {
3639
3726
  const ticket = top.value;
3640
3727
  return ticket ? ticket.zIndex.value - 1 : 0;
3641
3728
  });
3642
- const isBlocking = toRef(() => top.value?.blocking ?? false);
3729
+ const isBlocking = toRef(() => toValue(top.value?.blocking) ?? false);
3730
+ const topElement = toRef(() => {
3731
+ const scrims = selectedScrims();
3732
+ for (let i = scrims.length - 1; i >= 0; i--) {
3733
+ const el = /* @__PURE__ */ toElement(toValue(scrims[i].el));
3734
+ if (el) return el;
3735
+ }
3736
+ return null;
3737
+ });
3643
3738
  function ids() {
3644
3739
  return Array.from(selection.selectedIds);
3645
3740
  }
3646
3741
  function register(input = {}) {
3647
3742
  const id = input.id ?? /* @__PURE__ */ useId();
3648
- const blocking = input.blocking ?? false;
3649
- const scrim = input.scrim ?? true;
3743
+ const blocking = toRef(() => toValue(input.blocking) ?? false);
3744
+ const scrim = toRef(() => toValue(input.scrim) ?? true);
3650
3745
  const onDismiss = input.onDismiss;
3651
3746
  const zIndex = toRef(() => {
3652
3747
  const position = ids().indexOf(id);
@@ -3659,18 +3754,18 @@ function createStack(_options = {}) {
3659
3754
  return list.at(-1) === id;
3660
3755
  });
3661
3756
  function dismiss() {
3662
- if (blocking) return;
3757
+ if (blocking.value) return;
3663
3758
  onDismiss?.();
3664
3759
  selection.unselect(id);
3665
3760
  }
3666
3761
  const ticket = selection.register({
3762
+ ...input,
3667
3763
  blocking,
3668
3764
  scrim,
3669
3765
  onDismiss,
3670
3766
  zIndex,
3671
3767
  globalTop,
3672
3768
  dismiss,
3673
- ...input,
3674
3769
  id
3675
3770
  });
3676
3771
  if (/* @__PURE__ */ instanceExists()) onScopeDispose(() => {
@@ -3685,6 +3780,7 @@ function createStack(_options = {}) {
3685
3780
  top,
3686
3781
  scrimZIndex,
3687
3782
  isBlocking,
3783
+ topElement,
3688
3784
  get size() {
3689
3785
  return selection.size;
3690
3786
  }
@@ -3751,6 +3847,7 @@ function createStackPlugin(_options = {}) {
3751
3847
  }
3752
3848
  let fallbackStack;
3753
3849
  function getStackFallback() {
3850
+ if (!IN_BROWSER) return createStack();
3754
3851
  if (!fallbackStack) fallbackStack = createStack();
3755
3852
  return fallbackStack;
3756
3853
  }
@@ -3942,7 +4039,8 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
3942
4039
  const contentRef = useTemplateRef("content");
3943
4040
  const ticket = useStack().register({
3944
4041
  onDismiss: () => context.close(),
3945
- blocking: __props.blocking
4042
+ blocking: () => __props.blocking,
4043
+ el: () => contentRef.value?.element
3946
4044
  });
3947
4045
  watch(context.isOpen, (isOpen) => {
3948
4046
  if (isOpen) ticket.select();
@@ -4368,63 +4466,6 @@ const [createHydrationContext, createHydrationPlugin, useHydration] = createPlug
4368
4466
  }
4369
4467
  });
4370
4468
  //#endregion
4371
- //#region src/composables/toElement/index.ts
4372
- /**
4373
- * @module toElement
4374
- *
4375
- * @see https://0.vuetifyjs.com/composables/transformers/to-element
4376
- *
4377
- * @remarks
4378
- * Resolves various element reference types to a DOM Element.
4379
- *
4380
- * Accepts refs, getters, raw DOM elements, or Vue component instances
4381
- * and normalizes them to a plain Element. Uses structural typing to
4382
- * avoid cross-version Vue Ref incompatibilities.
4383
- *
4384
- * @example
4385
- * ```ts
4386
- * import { shallowRef } from 'vue'
4387
- * import { toElement } from '@vuetify/v0'
4388
- *
4389
- * const el = shallowRef<HTMLElement | null>(null)
4390
- * const resolved = toElement(el) // HTMLElement | undefined
4391
- * ```
4392
- */
4393
- /**
4394
- * Resolves a {@link MaybeElementRef} to a DOM Element or undefined.
4395
- *
4396
- * Handles:
4397
- * - `Ref<Element>`, `ShallowRef<HTMLElement>`, getter functions
4398
- * - Vue component instances (extracts `$el`)
4399
- * - Raw DOM elements (pass-through)
4400
- * - null/undefined (returns undefined)
4401
- *
4402
- * @param target The element ref, getter, or raw value to resolve
4403
- * @returns The resolved DOM Element, or undefined if not available
4404
- *
4405
- * @see https://0.vuetifyjs.com/composables/transformers/to-element
4406
- *
4407
- * @example
4408
- * ```ts
4409
- * import { toElement } from '@vuetify/v0'
4410
- *
4411
- * const el = shallowRef<HTMLElement | null>(null)
4412
- * toElement(el) // HTMLElement | undefined
4413
- *
4414
- * const component = ref<ComponentPublicInstance>()
4415
- * toElement(component) // Element | undefined (from $el)
4416
- * ```
4417
- */
4418
- /* @__NO_SIDE_EFFECTS__ */
4419
- function toElement(target) {
4420
- if (!target) return void 0;
4421
- if (/* @__PURE__ */ isElement(target)) return target;
4422
- const raw = /* @__PURE__ */ isFunction(target) ? target() : /* @__PURE__ */ isObject(target) && "value" in target ? target.value : target;
4423
- if (!raw) return void 0;
4424
- if (/* @__PURE__ */ isElement(raw)) return raw;
4425
- if (/* @__PURE__ */ isObject(raw) && "$el" in raw) return raw.$el;
4426
- }
4427
- //#endregion
4428
4469
  //#region src/composables/createObserver/index.ts
4429
4470
  /**
4430
4471
  * @module createObserver
@@ -5352,8 +5393,7 @@ const _sfc_main$13 = /* @__PURE__ */ defineComponent({
5352
5393
  });
5353
5394
  const count = toRef(() => hidden.value.length);
5354
5395
  const slotProps = toRef(() => {
5355
- const translated = locale.t(LABEL_KEY, { count: count.value });
5356
- const ariaLabel = translated === LABEL_KEY ? `+${count.value}` : translated;
5396
+ const ariaLabel = locale.ti(LABEL_KEY, { count: count.value }) ?? `+${count.value} more`;
5357
5397
  return {
5358
5398
  count: count.value,
5359
5399
  hidden: hidden.value,
@@ -6117,7 +6157,7 @@ const _sfc_main$21 = /* @__PURE__ */ defineComponent({
6117
6157
  prev: breadcrumbs.prev,
6118
6158
  select: breadcrumbs.select,
6119
6159
  attrs: {
6120
- "aria-label": __props.label ?? locale.t("Breadcrumbs.label"),
6160
+ "aria-label": __props.label ?? locale.ti("Breadcrumbs.label") ?? "Breadcrumbs",
6121
6161
  "role": __props.as === "nav" ? void 0 : "navigation"
6122
6162
  }
6123
6163
  }));
@@ -7001,7 +7041,7 @@ const _sfc_main$27 = /* @__PURE__ */ defineComponent({
7001
7041
  "aria-disabled": isDisabled.value || isPassive.value,
7002
7042
  "aria-busy": isLoading.value ? true : void 0,
7003
7043
  "aria-pressed": group ? isSelected.value : void 0,
7004
- "aria-label": __props.ariaLabel || (isSolo.value ? locale.t("Button.label") : void 0),
7044
+ "aria-label": __props.ariaLabel || (!__props.renderless && isSolo.value ? locale.ti("Button.label") ?? "Button" : void 0),
7005
7045
  "tabindex": isDisabled.value ? -1 : 0,
7006
7046
  "data-loading": isLoading.value ? true : void 0,
7007
7047
  "data-passive": isPassive.value ? true : void 0,
@@ -7594,7 +7634,7 @@ const _sfc_main$34 = /* @__PURE__ */ defineComponent({
7594
7634
  attrs: {
7595
7635
  "role": "region",
7596
7636
  "aria-roledescription": "carousel",
7597
- "aria-label": __props.label ?? locale.t("Carousel.label"),
7637
+ "aria-label": __props.label ?? locale.ti("Carousel.label") ?? "Carousel",
7598
7638
  "aria-disabled": toValue(step.disabled),
7599
7639
  "data-disabled": toValue(step.disabled) || void 0
7600
7640
  }
@@ -7853,10 +7893,10 @@ const _sfc_main$29 = /* @__PURE__ */ defineComponent({
7853
7893
  "id": `${carousel.rootId}-slide-${ticket.index}`,
7854
7894
  "role": "group",
7855
7895
  "aria-roledescription": "slide",
7856
- "aria-label": locale.t("Carousel.slide", {
7896
+ "aria-label": locale.ti("Carousel.slide", {
7857
7897
  current: ticket.index + 1,
7858
7898
  size: carousel.size
7859
- }),
7899
+ }) ?? `Slide ${ticket.index + 1} of ${carousel.size}`,
7860
7900
  "aria-hidden": isActive.value ? void 0 : true,
7861
7901
  "data-selected": toValue(ticket.isSelected) || void 0,
7862
7902
  "data-active": isActive.value || void 0,
@@ -7914,7 +7954,7 @@ const _sfc_main$32 = /* @__PURE__ */ defineComponent({
7914
7954
  isAtEdge: isAtEdge.value,
7915
7955
  attrs: {
7916
7956
  "type": __props.as === "button" ? "button" : void 0,
7917
- "aria-label": locale.t("Carousel.prev"),
7957
+ "aria-label": locale.ti("Carousel.prev") ?? "Previous slide",
7918
7958
  "aria-controls": viewportId,
7919
7959
  "aria-disabled": isDisabled.value,
7920
7960
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -7970,7 +8010,7 @@ const _sfc_main$31 = /* @__PURE__ */ defineComponent({
7970
8010
  isAtEdge: isAtEdge.value,
7971
8011
  attrs: {
7972
8012
  "type": __props.as === "button" ? "button" : void 0,
7973
- "aria-label": locale.t("Carousel.next"),
8013
+ "aria-label": locale.ti("Carousel.next") ?? "Next slide",
7974
8014
  "aria-controls": viewportId,
7975
8015
  "aria-disabled": isDisabled.value,
7976
8016
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -8073,10 +8113,10 @@ const _sfc_main$28 = /* @__PURE__ */ defineComponent({
8073
8113
  "tabindex": isSelected ? 0 : -1,
8074
8114
  "aria-selected": isSelected,
8075
8115
  "aria-controls": `${carousel.rootId}-slide-${i}`,
8076
- "aria-label": locale.t("Carousel.indicator", {
8116
+ "aria-label": locale.ti("Carousel.indicator", {
8077
8117
  current: i + 1,
8078
8118
  size
8079
- }),
8119
+ }) ?? `Go to slide ${i + 1} of ${size}`,
8080
8120
  "data-selected": isSelected || void 0,
8081
8121
  "data-active": isActive || void 0,
8082
8122
  "onClick"() {
@@ -8088,7 +8128,7 @@ const _sfc_main$28 = /* @__PURE__ */ defineComponent({
8088
8128
  }),
8089
8129
  attrs: {
8090
8130
  "role": "tablist",
8091
- "aria-label": __props.label ?? locale.t("Carousel.indicators"),
8131
+ "aria-label": __props.label ?? locale.ti("Carousel.indicators") ?? "Carousel indicators",
8092
8132
  "aria-orientation": carousel.orientation.value
8093
8133
  }
8094
8134
  };
@@ -8147,8 +8187,8 @@ const _sfc_main$33 = /* @__PURE__ */ defineComponent({
8147
8187
  "aria-valuenow": percent,
8148
8188
  "aria-valuemin": 0,
8149
8189
  "aria-valuemax": 100,
8150
- "aria-valuetext": locale.t("Carousel.progress", { percent }),
8151
- "aria-label": locale.t("Carousel.progressLabel"),
8190
+ "aria-valuetext": locale.ti("Carousel.progress", { percent }) ?? `${percent}% complete`,
8191
+ "aria-label": locale.ti("Carousel.progressLabel") ?? "Carousel progress",
8152
8192
  "data-state": state.value,
8153
8193
  "style": { width: `${percent}%` }
8154
8194
  }
@@ -8199,10 +8239,10 @@ const _sfc_main$30 = /* @__PURE__ */ defineComponent({
8199
8239
  if (/* @__PURE__ */ isUndefined(prevIndex)) return;
8200
8240
  clearTimeout(pending);
8201
8241
  pending = setTimeout(() => {
8202
- text.value = locale.t("Carousel.liveRegion", {
8242
+ text.value = locale.ti("Carousel.liveRegion", {
8203
8243
  current: index + 1,
8204
8244
  size: carousel.size
8205
- });
8245
+ }) ?? `Slide ${index + 1} of ${carousel.size}`;
8206
8246
  }, 100);
8207
8247
  });
8208
8248
  onBeforeUnmount(() => clearTimeout(pending));
@@ -9416,6 +9456,7 @@ function useDelay(callback, options = {}) {
9416
9456
  function usePopover(options = {}) {
9417
9457
  const { id: _id, positionArea = "bottom", positionTry = "most-width bottom", openDelay, closeDelay } = options;
9418
9458
  const id = _id ?? /* @__PURE__ */ useId();
9459
+ const anchor = `--${String(id).replace(/[^a-zA-Z0-9_-]/g, "")}`;
9419
9460
  const isOpen = options.isOpen ?? shallowRef(false);
9420
9461
  const delay = useDelay((direction) => {
9421
9462
  isOpen.value = direction;
@@ -9436,7 +9477,7 @@ function usePopover(options = {}) {
9436
9477
  function cancel() {
9437
9478
  delay.stop();
9438
9479
  }
9439
- const anchorStyles = toRef(() => ({ anchorName: `--${id}` }));
9480
+ const anchorStyles = toRef(() => ({ anchorName: anchor }));
9440
9481
  const contentAttrs = toRef(() => ({
9441
9482
  id,
9442
9483
  popover: ""
@@ -9446,7 +9487,7 @@ function usePopover(options = {}) {
9446
9487
  "margin": "unset",
9447
9488
  "inset-area": positionArea,
9448
9489
  "position-area": positionArea,
9449
- "position-anchor": `--${id}`,
9490
+ "position-anchor": anchor,
9450
9491
  "position-try-fallbacks": positionTry
9451
9492
  }));
9452
9493
  /* v8 ignore start -- browser popover API */
@@ -11017,7 +11058,7 @@ const _sfc_main$55 = /* @__PURE__ */ defineComponent({
11017
11058
  isOpen: context.isOpen.value,
11018
11059
  attrs: {
11019
11060
  "type": __props.as === "button" ? "button" : void 0,
11020
- "aria-label": locale.t("Dialog.close"),
11061
+ "aria-label": locale.ti("Dialog.close") ?? "Close",
11021
11062
  "onClick": onClick
11022
11063
  }
11023
11064
  }));
@@ -11057,7 +11098,8 @@ const _sfc_main$56 = /* @__PURE__ */ defineComponent({
11057
11098
  const contentRef = useTemplateRef("content");
11058
11099
  const ticket = useStack().register({
11059
11100
  onDismiss: () => context.close(),
11060
- blocking: __props.blocking
11101
+ blocking: () => __props.blocking,
11102
+ el: () => contentRef.value?.element
11061
11103
  });
11062
11104
  watch(context.isOpen, (isOpen) => {
11063
11105
  if (isOpen) ticket.select();
@@ -13616,16 +13658,17 @@ function createNumberField(options = {}) {
13616
13658
  const result = Number(cleaned);
13617
13659
  return Number.isNaN(result) ? null : result;
13618
13660
  }
13619
- function commit() {
13620
- if (/* @__PURE__ */ isNull(value.value)) return;
13621
- if (!shouldClamp && (value.value < numeric.min || value.value > numeric.max)) {
13661
+ function commit(next) {
13662
+ const val = arguments.length === 0 ? value.value : next;
13663
+ if (/* @__PURE__ */ isNull(val)) return;
13664
+ if (!shouldClamp && (val < numeric.min || val > numeric.max)) {
13622
13665
  if (numeric.step > 0 && Number.isFinite(numeric.min)) {
13623
- const steps = Math.round((value.value - numeric.min) / numeric.step);
13666
+ const steps = Math.round((val - numeric.min) / numeric.step);
13624
13667
  value.value = numeric.min + steps * numeric.step;
13625
13668
  }
13626
13669
  return;
13627
13670
  }
13628
- value.value = numeric.snap(value.value);
13671
+ value.value = numeric.snap(val);
13629
13672
  }
13630
13673
  return {
13631
13674
  value,
@@ -13851,7 +13894,7 @@ const _sfc_main$78 = /* @__PURE__ */ defineComponent({
13851
13894
  function onBlur() {
13852
13895
  const parsed = root.parse(text.value);
13853
13896
  root.value.value = parsed;
13854
- root.commit();
13897
+ root.commit(parsed);
13855
13898
  root.isFocused.value = false;
13856
13899
  syncText();
13857
13900
  }
@@ -13874,7 +13917,7 @@ const _sfc_main$78 = /* @__PURE__ */ defineComponent({
13874
13917
  Enter: () => {
13875
13918
  const parsed = root.parse(text.value);
13876
13919
  root.value.value = parsed;
13877
- root.commit();
13920
+ root.commit(parsed);
13878
13921
  }
13879
13922
  }[e.key];
13880
13923
  if (!action) return;
@@ -14003,7 +14046,7 @@ const _sfc_main$79 = /* @__PURE__ */ defineComponent({
14003
14046
  return {
14004
14047
  "type": "button",
14005
14048
  "tabindex": -1,
14006
- "aria-label": locale.t("NumberField.decrement"),
14049
+ "aria-label": locale.ti("NumberField.decrement") ?? "Decrement",
14007
14050
  "disabled": disabled || void 0,
14008
14051
  "data-disabled": disabled ? true : void 0,
14009
14052
  onBlur,
@@ -14144,7 +14187,7 @@ const _sfc_main$82 = /* @__PURE__ */ defineComponent({
14144
14187
  return {
14145
14188
  "type": "button",
14146
14189
  "tabindex": -1,
14147
- "aria-label": locale.t("NumberField.increment"),
14190
+ "aria-label": locale.ti("NumberField.increment") ?? "Increment",
14148
14191
  "disabled": disabled || void 0,
14149
14192
  "data-disabled": disabled ? true : void 0,
14150
14193
  onBlur,
@@ -14495,23 +14538,20 @@ const _sfc_main$87 = /* @__PURE__ */ defineComponent({
14495
14538
  reserved: indicatorWidth,
14496
14539
  reverse: () => __props.priority === "end"
14497
14540
  });
14498
- function isVisible(index) {
14499
- if (__props.disabled) return true;
14500
- const tickets = registry.values();
14501
- const ticket = tickets[index];
14502
- if (!ticket) return true;
14503
- if (toValue(ticket.disabled)) return true;
14541
+ const hidden = computed(() => {
14542
+ const set = /* @__PURE__ */ new Set();
14543
+ if (__props.disabled) return set;
14504
14544
  const cap = overflow.capacity.value;
14505
- if (cap === Infinity) return true;
14506
- let rank = 0;
14507
- let total = 0;
14508
- for (const [i, ticket_] of tickets.entries()) {
14509
- if (toValue(ticket_.disabled)) continue;
14510
- if (i === index) rank = total;
14511
- total++;
14512
- }
14513
- if (__props.priority === "end") return rank >= total - cap;
14514
- return rank < cap;
14545
+ if (cap === Infinity) return set;
14546
+ const tickets = registry.values();
14547
+ const enabled = [];
14548
+ for (const [i, ticket] of tickets.entries()) if (!toValue(ticket.disabled)) enabled.push(i);
14549
+ const total = enabled.length;
14550
+ for (let rank = 0; rank < total; rank++) if (!(__props.priority === "end" ? rank >= total - cap : rank < cap)) set.add(enabled[rank]);
14551
+ return set;
14552
+ });
14553
+ function isVisible(index) {
14554
+ return !hidden.value.has(index);
14515
14555
  }
14516
14556
  provideOverflowRoot(__props.namespace, {
14517
14557
  overflow,
@@ -15086,7 +15126,7 @@ const _sfc_main$94 = /* @__PURE__ */ defineComponent({
15086
15126
  prev: pagination.prev,
15087
15127
  select: pagination.select,
15088
15128
  attrs: {
15089
- "aria-label": locale.t("Pagination.label"),
15129
+ "aria-label": locale.ti("Pagination.label") ?? "Pagination",
15090
15130
  "role": __props.as === "nav" ? void 0 : "navigation"
15091
15131
  }
15092
15132
  }));
@@ -15183,7 +15223,7 @@ const _sfc_main$89 = /* @__PURE__ */ defineComponent({
15183
15223
  isDisabled: isDisabled.value,
15184
15224
  first,
15185
15225
  attrs: {
15186
- "aria-label": locale.t("Pagination.first"),
15226
+ "aria-label": locale.ti("Pagination.first") ?? "First page",
15187
15227
  "aria-disabled": isDisabled.value,
15188
15228
  "data-disabled": isDisabled.value || void 0,
15189
15229
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -15237,7 +15277,7 @@ const _sfc_main$90 = /* @__PURE__ */ defineComponent({
15237
15277
  }, { immediate: true });
15238
15278
  const isSelected = toRef(() => pagination.page.value === __props.value);
15239
15279
  const ariaLabel = toRef(() => {
15240
- return isSelected.value ? locale.t("Pagination.currentPage", { page: __props.value }) : locale.t("Pagination.goToPage", { page: __props.value });
15280
+ return isSelected.value ? locale.ti("Pagination.currentPage", { page: __props.value }) ?? `Page ${__props.value}, current` : locale.ti("Pagination.goToPage", { page: __props.value }) ?? `Go to page ${__props.value}`;
15241
15281
  });
15242
15282
  function select() {
15243
15283
  if (__props.disabled) return;
@@ -15308,7 +15348,7 @@ const _sfc_main$91 = /* @__PURE__ */ defineComponent({
15308
15348
  isDisabled: isDisabled.value,
15309
15349
  last,
15310
15350
  attrs: {
15311
- "aria-label": locale.t("Pagination.last"),
15351
+ "aria-label": locale.ti("Pagination.last") ?? "Last page",
15312
15352
  "aria-disabled": isDisabled.value,
15313
15353
  "data-disabled": isDisabled.value || void 0,
15314
15354
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -15365,7 +15405,7 @@ const _sfc_main$92 = /* @__PURE__ */ defineComponent({
15365
15405
  isDisabled: isDisabled.value,
15366
15406
  next,
15367
15407
  attrs: {
15368
- "aria-label": locale.t("Pagination.next"),
15408
+ "aria-label": locale.ti("Pagination.next") ?? "Next page",
15369
15409
  "aria-disabled": isDisabled.value,
15370
15410
  "data-disabled": isDisabled.value || void 0,
15371
15411
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -15422,7 +15462,7 @@ const _sfc_main$93 = /* @__PURE__ */ defineComponent({
15422
15462
  isDisabled: isDisabled.value,
15423
15463
  prev,
15424
15464
  attrs: {
15425
- "aria-label": locale.t("Pagination.prev"),
15465
+ "aria-label": locale.ti("Pagination.prev") ?? "Previous page",
15426
15466
  "aria-disabled": isDisabled.value,
15427
15467
  "data-disabled": isDisabled.value || void 0,
15428
15468
  "disabled": __props.as === "button" ? isDisabled.value : void 0,
@@ -15466,10 +15506,10 @@ const _sfc_main$95 = /* @__PURE__ */ defineComponent({
15466
15506
  if (/* @__PURE__ */ isUndefined(prevPage)) return;
15467
15507
  clearTimeout(pending);
15468
15508
  pending = setTimeout(() => {
15469
- text.value = locale.t("Pagination.status", {
15509
+ text.value = locale.ti("Pagination.status", {
15470
15510
  page,
15471
15511
  pages: pagination.pages
15472
- });
15512
+ }) ?? `Page ${page} of ${pagination.pages}`;
15473
15513
  }, 100);
15474
15514
  });
15475
15515
  onBeforeUnmount(() => clearTimeout(pending));
@@ -15768,7 +15808,7 @@ const _sfc_main$96 = /* @__PURE__ */ defineComponent({
15768
15808
  const context = usePopoverContext();
15769
15809
  const popovertarget = toRef(() => __props.target ?? context.id);
15770
15810
  const style = toRef(() => {
15771
- if (__props.target) return { anchorName: `--${__props.target}` };
15811
+ if (__props.target) return { anchorName: `--${String(__props.target).replace(/[^a-zA-Z0-9_-]/g, "")}` };
15772
15812
  return context.anchorStyles.value;
15773
15813
  });
15774
15814
  const slotProps = toRef(() => ({
@@ -15815,7 +15855,7 @@ const _sfc_main$97 = /* @__PURE__ */ defineComponent({
15815
15855
  "margin": "unset",
15816
15856
  "inset-area": __props.positionArea ?? "bottom",
15817
15857
  "position-area": __props.positionArea ?? "bottom",
15818
- "position-anchor": `--${__props.id}`,
15858
+ "position-anchor": `--${String(__props.id).replace(/[^a-zA-Z0-9_-]/g, "")}`,
15819
15859
  "position-try-fallbacks": __props.positionTry ?? "most-width bottom"
15820
15860
  };
15821
15861
  return context.contentStyles.value;
@@ -15953,12 +15993,14 @@ const _sfc_main$99 = /* @__PURE__ */ defineComponent({
15953
15993
  emits: ["close"],
15954
15994
  setup(__props, { emit: __emit }) {
15955
15995
  const emit = __emit;
15956
- const ticket = useStack().register({
15957
- blocking: __props.blocking,
15958
- scrim: __props.scrim,
15996
+ const stack = useStack();
15997
+ const ticket = stack.register({
15998
+ blocking: () => __props.blocking,
15999
+ scrim: () => __props.scrim,
15959
16000
  onDismiss: () => emit("close")
15960
16001
  });
15961
16002
  ticket.select();
16003
+ const target = toRef(() => __props.to === "top-layer" ? stack.topElement.value ?? "body" : __props.to);
15962
16004
  const slotProps = toRef(() => ({
15963
16005
  zIndex: ticket.zIndex.value,
15964
16006
  close: ticket.dismiss
@@ -15966,7 +16008,7 @@ const _sfc_main$99 = /* @__PURE__ */ defineComponent({
15966
16008
  return (_ctx, _cache) => {
15967
16009
  return openBlock(), createBlock(Teleport, {
15968
16010
  disabled: __props.disabled,
15969
- to: __props.to
16011
+ to: target.value
15970
16012
  }, [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(slotProps.value)))], 8, ["disabled", "to"]);
15971
16013
  };
15972
16014
  }
@@ -17447,10 +17489,10 @@ const _sfc_main$114 = /* @__PURE__ */ defineComponent({
17447
17489
  "aria-valuenow": rating.value.value,
17448
17490
  "aria-valuemin": 0,
17449
17491
  "aria-valuemax": rating.size,
17450
- "aria-valuetext": locale.t("Rating.valueText", {
17492
+ "aria-valuetext": locale.ti("Rating.valueText", {
17451
17493
  value: rating.value.value,
17452
17494
  size: rating.size
17453
- }),
17495
+ }) ?? `${rating.value.value} of ${rating.size} stars`,
17454
17496
  "aria-disabled": isDisabled.value ? true : void 0,
17455
17497
  "aria-readonly": isReadonly.value ? true : void 0,
17456
17498
  "data-disabled": isDisabled.value ? true : void 0,
@@ -17722,16 +17764,16 @@ const _sfc_main$115 = /* @__PURE__ */ defineComponent({
17722
17764
  setup(__props) {
17723
17765
  const attrs = useAttrs();
17724
17766
  const stack = useStack();
17725
- const tickets = computed(() => Array.from(stack.selectedItems.value).filter((ticket) => ticket.scrim !== false));
17767
+ const tickets = computed(() => Array.from(stack.selectedItems.value).filter((ticket) => ticket.scrim.value !== false));
17726
17768
  function onDismiss(ticket) {
17727
- if (!ticket.blocking) ticket.dismiss();
17769
+ if (!ticket.blocking.value) ticket.dismiss();
17728
17770
  }
17729
17771
  function getSlotProps(ticket) {
17730
17772
  const zIndex = ticket.zIndex.value - 1;
17731
17773
  return {
17732
17774
  ticket,
17733
17775
  zIndex,
17734
- isBlocking: ticket.blocking,
17776
+ isBlocking: ticket.blocking.value,
17735
17777
  dismiss: () => onDismiss(ticket),
17736
17778
  attrs: {
17737
17779
  style: { zIndex },
@@ -19483,8 +19525,12 @@ const _sfc_main$134 = /* @__PURE__ */ defineComponent({
19483
19525
  __name: "SnackbarPortal",
19484
19526
  props: {
19485
19527
  teleport: {
19486
- type: [String, Boolean],
19487
- default: "body"
19528
+ type: [
19529
+ String,
19530
+ Object,
19531
+ Boolean
19532
+ ],
19533
+ default: "top-layer"
19488
19534
  },
19489
19535
  as: { default: "div" },
19490
19536
  renderless: { type: Boolean }
@@ -19597,7 +19643,7 @@ function createQueue(_options = {}) {
19597
19643
  }
19598
19644
  function register(registration = {}) {
19599
19645
  const id = registration.id ?? /* @__PURE__ */ useId();
19600
- const timeout = Object.prototype.hasOwnProperty.call(registration, "timeout") ? registration.timeout : _timeout;
19646
+ const timeout = Object.hasOwn(registration, "timeout") ? registration.timeout : _timeout;
19601
19647
  const ticket = {
19602
19648
  ...registration,
19603
19649
  id,
@@ -20396,7 +20442,7 @@ const _sfc_main$132 = /* @__PURE__ */ defineComponent({
20396
20442
  }
20397
20443
  const slotProps = toRef(() => ({ attrs: {
20398
20444
  "type": __props.as === "button" ? "button" : void 0,
20399
- "aria-label": locale.t("Snackbar.close"),
20445
+ "aria-label": locale.ti("Snackbar.close") ?? "Dismiss",
20400
20446
  "onClick": onClick
20401
20447
  } }));
20402
20448
  return (_ctx, _cache) => {
@@ -22317,6 +22363,10 @@ var ThemeAdapter = class ThemeAdapter {
22317
22363
  */
22318
22364
  dispose;
22319
22365
  constructor(prefix) {
22366
+ if (!ThemeAdapter.SAFE_IDENT.test(prefix)) throw new V0Error(`Invalid theme prefix: "${prefix}". Expected an identifier matching ${ThemeAdapter.SAFE_IDENT}.`, {
22367
+ code: "V0_THEME_INVALID_PREFIX",
22368
+ prefix
22369
+ });
22320
22370
  this.prefix = prefix;
22321
22371
  }
22322
22372
  generate(colors, isDark) {
@@ -22357,12 +22407,18 @@ var V0StyleSheetThemeAdapter = class extends ThemeAdapter {
22357
22407
  this.update(colors, isDark);
22358
22408
  });
22359
22409
  if (/* @__PURE__ */ isNull(target)) {
22360
- this.dispose = stopWatch;
22410
+ this.dispose = () => {
22411
+ stopWatch();
22412
+ this.detach();
22413
+ };
22361
22414
  return;
22362
22415
  }
22363
22416
  const targetEl = target instanceof HTMLElement ? target : /* @__PURE__ */ isString(target) ? document.querySelector(target) : app._container || document.querySelector("#app") || document.body;
22364
22417
  if (!targetEl) {
22365
- this.dispose = stopWatch;
22418
+ this.dispose = () => {
22419
+ stopWatch();
22420
+ this.detach();
22421
+ };
22366
22422
  return;
22367
22423
  }
22368
22424
  if (context.selectedId.value) targetEl.dataset.theme = String(context.selectedId.value);
@@ -22373,6 +22429,7 @@ var V0StyleSheetThemeAdapter = class extends ThemeAdapter {
22373
22429
  this.dispose = () => {
22374
22430
  stopWatch();
22375
22431
  stopTheme();
22432
+ this.detach();
22376
22433
  };
22377
22434
  } else {
22378
22435
  const head = app._context?.provides?.usehead ?? app._context?.provides?.head;
@@ -22382,7 +22439,8 @@ var V0StyleSheetThemeAdapter = class extends ThemeAdapter {
22382
22439
  htmlAttrs: { "data-theme": id ? String(id) : "" },
22383
22440
  style: [{
22384
22441
  innerHTML: this.generate(context.colors.value, context.isDark.value),
22385
- id: this.stylesheetId
22442
+ id: this.stylesheetId,
22443
+ ...this.cspNonce ? { nonce: this.cspNonce } : {}
22386
22444
  }]
22387
22445
  });
22388
22446
  if (entry?.dispose) this.dispose = entry.dispose;
@@ -22401,6 +22459,11 @@ var V0StyleSheetThemeAdapter = class extends ThemeAdapter {
22401
22459
  }
22402
22460
  this.sheet.replaceSync(styles);
22403
22461
  }
22462
+ detach() {
22463
+ if (!IN_BROWSER) return;
22464
+ document.adoptedStyleSheets = document.adoptedStyleSheets.filter((s) => s !== this.sheet);
22465
+ this.sheet = void 0;
22466
+ }
22404
22467
  };
22405
22468
  //#endregion
22406
22469
  //#region src/composables/useTheme/adapters/unhead.ts
@@ -22416,8 +22479,10 @@ var V0StyleSheetThemeAdapter = class extends ThemeAdapter {
22416
22479
  */
22417
22480
  var V0UnheadThemeAdapter = class extends ThemeAdapter {
22418
22481
  entry;
22482
+ cspNonce;
22419
22483
  constructor(options = {}) {
22420
22484
  super(options.prefix ?? "v0");
22485
+ this.cspNonce = options.cspNonce;
22421
22486
  this.stylesheetId = options.stylesheetId ?? this.stylesheetId;
22422
22487
  }
22423
22488
  setup(app, context, target) {
@@ -22428,7 +22493,8 @@ var V0UnheadThemeAdapter = class extends ThemeAdapter {
22428
22493
  htmlAttrs: { "data-theme": id ? String(id) : "" },
22429
22494
  style: [{
22430
22495
  innerHTML: this.generate(context.colors.value, context.isDark.value),
22431
- id: this.stylesheetId
22496
+ id: this.stylesheetId,
22497
+ ...this.cspNonce ? { nonce: this.cspNonce } : {}
22432
22498
  }]
22433
22499
  });
22434
22500
  }
@@ -22447,7 +22513,8 @@ var V0UnheadThemeAdapter = class extends ThemeAdapter {
22447
22513
  htmlAttrs: { "data-theme": themeStr },
22448
22514
  style: [{
22449
22515
  innerHTML: this.generate(colors, isDark),
22450
- id: this.stylesheetId
22516
+ id: this.stylesheetId,
22517
+ ...this.cspNonce ? { nonce: this.cspNonce } : {}
22451
22518
  }]
22452
22519
  });
22453
22520
  });
@@ -22461,7 +22528,8 @@ var V0UnheadThemeAdapter = class extends ThemeAdapter {
22461
22528
  if (!this.entry) return;
22462
22529
  this.entry.patch?.({ style: [{
22463
22530
  innerHTML: this.generate(colors, isDark),
22464
- id: this.stylesheetId
22531
+ id: this.stylesheetId,
22532
+ ...this.cspNonce ? { nonce: this.cspNonce } : {}
22465
22533
  }] });
22466
22534
  }
22467
22535
  };
@@ -24166,6 +24234,7 @@ function useRovingFocus(items, options = {}) {
24166
24234
  }
24167
24235
  //#endregion
24168
24236
  //#region src/components/Treeview/TreeviewList.vue
24237
+ const FOCUSABLE = "a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]";
24169
24238
  const [useTreeviewList, provideTreeviewList] = createContext({ suffix: "list" });
24170
24239
  const _sfc_main$166 = /* @__PURE__ */ defineComponent({
24171
24240
  name: "TreeviewList",
@@ -24214,7 +24283,43 @@ const _sfc_main$166 = /* @__PURE__ */ defineComponent({
24214
24283
  if (toValue(ticket.isOpen) && expandable(ticket)) nested.close(ticket.id);
24215
24284
  else if (!/* @__PURE__ */ isNullOrUndefined(ticket.parentId)) roving.focus(ticket.parentId);
24216
24285
  }
24286
+ function focusableChildren(el) {
24287
+ return Array.from(el.querySelectorAll(FOCUSABLE)).filter((child) => child.getAttribute("tabindex") !== "-1" && child.getAttribute("aria-disabled") !== "true" && child.closest("[role=\"treeitem\"]") === el);
24288
+ }
24289
+ function nextItemId(id) {
24290
+ /* v8 ignore next -- defensive: source is always a registered visible item */
24291
+ if (/* @__PURE__ */ isNullOrUndefined(id)) return void 0;
24292
+ const visible = nested.visibleItems();
24293
+ const index = visible.findIndex((item) => item.id === id);
24294
+ /* v8 ignore next -- defensive: a registered item is always found in visibleItems */
24295
+ if (index === -1) return void 0;
24296
+ return visible.slice(index + 1).find((item) => !toValue(item.disabled))?.id;
24297
+ }
24217
24298
  function onKeydown(e) {
24299
+ const target = e.target;
24300
+ const itemEl = target.closest("[role=\"treeitem\"]");
24301
+ const onItem = target === e.currentTarget || target.getAttribute("role") === "treeitem";
24302
+ if (e.key === "Tab") {
24303
+ if (!itemEl) return;
24304
+ const controls = focusableChildren(itemEl);
24305
+ if (controls.length === 0) return;
24306
+ if (!e.shiftKey && onItem) {
24307
+ e.preventDefault();
24308
+ controls[0].focus();
24309
+ } else if (!e.shiftKey && target === controls.at(-1)) {
24310
+ const source = nested.visibleItems().find((item) => toValue(item.el) === itemEl)?.id;
24311
+ const next = nextItemId(source);
24312
+ if (!/* @__PURE__ */ isNullOrUndefined(next)) {
24313
+ e.preventDefault();
24314
+ roving.focus(next);
24315
+ }
24316
+ } else if (e.shiftKey && target === controls[0]) {
24317
+ e.preventDefault();
24318
+ itemEl.focus();
24319
+ }
24320
+ return;
24321
+ }
24322
+ if (!onItem) return;
24218
24323
  const id = roving.focusedId.value;
24219
24324
  const ticket = /* @__PURE__ */ isNullOrUndefined(id) ? void 0 : nested.get(id);
24220
24325
  const rtl = isRtl(e);
@@ -27574,7 +27679,7 @@ function createMapProxy(refObject) {
27574
27679
  mapHandlers[Symbol.iterator] = mapHandlers.entries;
27575
27680
  mapProxy = new Proxy(/* @__PURE__ */ new Map(), { get(_, p) {
27576
27681
  if (p === "size") return refObject.value.size;
27577
- if (Object.prototype.hasOwnProperty.call(mapHandlers, p)) return mapHandlers[p];
27682
+ if (Object.hasOwn(mapHandlers, p)) return mapHandlers[p];
27578
27683
  const map = refObject.value;
27579
27684
  const value = Reflect.get(map, p);
27580
27685
  return /* @__PURE__ */ isFunction(value) ? value.bind(map) : value;
@@ -27613,7 +27718,7 @@ function createSetProxy(refObject) {
27613
27718
  setHandlers[Symbol.iterator] = setHandlers.values;
27614
27719
  setProxy = new Proxy(/* @__PURE__ */ new Set(), { get(_, p) {
27615
27720
  if (p === "size") return refObject.value.size;
27616
- if (Object.prototype.hasOwnProperty.call(setHandlers, p)) return setHandlers[p];
27721
+ if (Object.hasOwn(setHandlers, p)) return setHandlers[p];
27617
27722
  const set = refObject.value;
27618
27723
  const value = Reflect.get(set, p);
27619
27724
  return /* @__PURE__ */ isFunction(value) ? value.bind(set) : value;