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