@vuetify/v0 1.1.0 → 1.2.1
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 +13 -0
- package/dist/{adapter-Butx_2UU.d.mts → adapter-BXunW_mw.d.mts} +1 -1
- package/dist/{createPagination-B5dfqY-a.mjs → adapter-BiQV5j8B.mjs} +98 -3
- package/dist/adapter-ClB-53_F.d.mts +62 -0
- package/dist/adapter-CrRJuxRk.mjs +21 -0
- package/dist/{adapter-hq9YlPOF.d.mts → adapter-FckJSz_o.d.mts} +2 -2
- package/dist/{adapter-_srNCBEi.d.mts → adapter-PDTe5nFT.d.mts} +6 -7
- package/dist/browser/index.d.ts +15918 -13714
- package/dist/browser/index.js +16708 -14105
- package/dist/components/index.d.mts +2 -2
- package/dist/components/index.mjs +2 -2
- package/dist/{components-B2BZ1B3K.mjs → components-MCFhfNlt.mjs} +8234 -6307
- package/dist/composables/index.d.mts +22 -20
- package/dist/composables/index.mjs +37 -34
- package/dist/{composables-DONBl_c9.mjs → composables-8xtFVviy.mjs} +32 -1061
- package/dist/{consola-BPGkJp_q.d.mts → consola-CdMU53rU.d.mts} +1 -1
- package/dist/constants/index.d.mts +1 -1
- package/dist/constants/index.mjs +1 -1
- package/dist/{createDataTable-DgyHBfAr.mjs → createDataTable-OCGnpy-N.mjs} +24 -8
- package/dist/{createGroup-BXKKcb9-.mjs → createGroup-DtVYu-VY.mjs} +14 -3
- package/dist/createPlugin-Oo6t-vBw.mjs +157 -0
- package/dist/{createRegistry-B9cOWny2.mjs → createRegistry-DSQiALGi.mjs} +3 -3
- package/dist/{createSelection-CWE554_g.mjs → createSelection-TB5oK1FG.mjs} +2 -1
- package/dist/{createSingle-Dz-1Iv7u.mjs → createSingle-CV1qigP2.mjs} +1 -1
- package/dist/{createTokens-C4qcW2Kv.mjs → createTokens-B0CqJEL6.mjs} +2 -2
- package/dist/data-table/adapters/client/index.d.mts +1 -1
- package/dist/data-table/adapters/client/index.mjs +1 -1
- package/dist/data-table/adapters/index.d.mts +4 -4
- package/dist/data-table/adapters/index.mjs +4 -4
- package/dist/data-table/adapters/server/index.d.mts +1 -1
- package/dist/data-table/adapters/server/index.mjs +1 -1
- package/dist/data-table/adapters/virtual/index.d.mts +1 -1
- package/dist/data-table/adapters/virtual/index.mjs +1 -1
- package/dist/data-table/index.d.mts +5 -5
- package/dist/data-table/index.mjs +5 -5
- package/dist/date/index.d.mts +1 -1
- package/dist/date/index.mjs +2 -2
- package/dist/features/adapters/flagsmith/index.d.mts +1 -1
- package/dist/features/adapters/flagsmith/index.mjs +1 -1
- package/dist/features/adapters/launchdarkly/index.d.mts +1 -1
- package/dist/features/adapters/launchdarkly/index.mjs +1 -1
- package/dist/features/adapters/posthog/index.d.mts +1 -1
- package/dist/features/adapters/posthog/index.mjs +2 -2
- package/dist/features/index.d.mts +2 -2
- package/dist/features/index.mjs +2 -2
- package/dist/{flagsmith-DA2GCyGv.d.mts → flagsmith-DcIDrI7_.d.mts} +1 -1
- package/dist/{globals-CtaXlEOI.mjs → globals-wvVdMRFF.mjs} +1 -1
- package/dist/{index-DCtHbY0a.d.mts → index-3bThcqCN.d.mts} +25 -20
- package/dist/{index-QnpcDsV7.d.mts → index-3vvA76pZ.d.mts} +2 -2
- package/dist/{index-RGiSdjYt.d.mts → index-4Z38WhA9.d.mts} +9 -3
- package/dist/{index-CTl0cGH6.d.mts → index-BTdCsSz0.d.mts} +7264 -5608
- package/dist/{index-DF0tMI2_.d.mts → index-CORslci7.d.mts} +121 -2
- package/dist/{index-Dc7lKT6q.d.mts → index-Dgkt7Ve9.d.mts} +494 -131
- package/dist/index.d.mts +25 -24
- package/dist/index.mjs +40 -37
- package/dist/json/attributes.json +500 -0
- package/dist/json/importMap.json +92 -0
- package/dist/json/tags.json +237 -0
- package/dist/json/web-types.json +1553 -97
- package/dist/{launchdarkly-Bp8p9PMD.d.mts → launchdarkly-CUzunYol.d.mts} +1 -1
- package/dist/locale/adapters/index.d.mts +2 -2
- package/dist/locale/adapters/index.mjs +2 -2
- package/dist/locale/adapters/v0/index.d.mts +1 -1
- package/dist/locale/adapters/v0/index.mjs +1 -1
- package/dist/locale/adapters/vue-i18n/index.d.mts +1 -1
- package/dist/locale/adapters/vue-i18n/index.mjs +1 -1
- package/dist/locale/index.d.mts +3 -3
- package/dist/locale/index.mjs +3 -3
- package/dist/locale/messages/en/index.d.mts +6 -0
- package/dist/locale/messages/en/index.mjs +2 -0
- package/dist/logger/adapters/consola/index.d.mts +1 -1
- package/dist/logger/adapters/index.d.mts +4 -4
- package/dist/logger/adapters/index.mjs +1 -1
- package/dist/logger/adapters/pino/index.d.mts +1 -1
- package/dist/logger/adapters/v0/index.d.mts +1 -1
- package/dist/logger/adapters/v0/index.mjs +1 -1
- package/dist/logger/index.d.mts +5 -5
- package/dist/logger/index.mjs +2 -2
- package/dist/notifications/index.d.mts +1 -1
- package/dist/notifications/index.mjs +2 -2
- package/dist/palettes/ant/index.d.mts +1 -1
- package/dist/palettes/index.d.mts +3 -3
- 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 +1 -1
- package/dist/permissions/adapters/index.mjs +1 -1
- package/dist/permissions/adapters/v0/index.d.mts +1 -1
- package/dist/permissions/adapters/v0/index.mjs +1 -1
- package/dist/permissions/index.d.mts +1 -1
- package/dist/permissions/index.mjs +2 -2
- package/dist/{pino-B6BI1AOK.d.mts → pino-DjeWBFnj.d.mts} +1 -1
- package/dist/popover/adapters/floating-ui/index.d.mts +25 -0
- package/dist/popover/adapters/floating-ui/index.mjs +98 -0
- package/dist/popover/index.d.mts +3 -0
- package/dist/popover/index.mjs +3 -0
- package/dist/{posthog-sFqk0bGy.d.mts → posthog-CJAYssdr.d.mts} +1 -1
- package/dist/rules/index.d.mts +1 -1
- package/dist/rules/index.mjs +1 -1
- package/dist/{server-DbtTGb67.d.mts → server-5vbJ7GGs.d.mts} +2 -2
- package/dist/{server-D5BJBjB0.mjs → server-m7iD1vOr.mjs} +1 -2
- package/dist/storage/adapters/index.d.mts +2 -2
- package/dist/storage/adapters/index.mjs +1 -1
- package/dist/storage/adapters/memory/index.d.mts +1 -1
- package/dist/storage/adapters/memory/index.mjs +1 -1
- package/dist/storage/index.d.mts +3 -3
- package/dist/storage/index.mjs +2 -2
- package/dist/theme/adapters/index.d.mts +1 -1
- package/dist/theme/adapters/index.mjs +3 -3
- 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 +2 -2
- package/dist/theme/index.mjs +4 -4
- package/dist/types/index.d.mts +1 -1
- package/dist/{unhead-BAWCwNOF.mjs → unhead-SyU953Pt.mjs} +2 -2
- package/dist/{useEventListener-DSOeDtC-.mjs → useEventListener-hF6R2p6X.mjs} +2 -2
- package/dist/useFeatures-CTpkM6hV.mjs +221 -0
- package/dist/{useLocale-D-V0DENN.mjs → useLocale-D-iWu08b.mjs} +4 -4
- package/dist/{useLogger-CbvzXCWb.mjs → useLogger-CDsgHbzO.mjs} +5 -159
- package/dist/{useNotifications-Cqg3uDz0.mjs → useNotifications-DhNjvRt1.mjs} +57 -154
- package/dist/{usePermissions-BTdUVyQe.mjs → usePermissions-CKe8xcvz.mjs} +4 -4
- package/dist/usePopover-DyAdne_S.mjs +421 -0
- package/dist/{useRovingFocus-g6ifibLg.mjs → useRovingFocus-D0OOozbe.mjs} +1169 -553
- package/dist/{useRules-DEiHd_eY.mjs → useRules-DA8bNhNq.mjs} +3 -2
- package/dist/{useStorage-BSfQfDbg.mjs → useStorage-D9c6xx4N.mjs} +5 -4
- package/dist/useTheme-BrXA5VBp.mjs +445 -0
- package/dist/useTimer-DLtkRCHw.mjs +151 -0
- package/dist/utilities/index.d.mts +2 -2
- package/dist/utilities/index.mjs +204 -2
- package/dist/{v0-BnUwMaOv.d.mts → v0-C09lR5fc.d.mts} +1 -1
- package/dist/{v0-CveVV6On.mjs → v0-CaTmC7C4.mjs} +2 -2
- package/dist/{v0-rSxMW8FJ.d.mts → v0-DfFK-p4X.d.mts} +1 -1
- package/dist/{v0-CCWHeKJM.mjs → v0-DpFVF6pD.mjs} +1 -1
- package/dist/{v0-DotXXGXU.d.mts → v0-GI9U-rPA.d.mts} +2 -2
- package/dist/{v0-CZBkpQjr.mjs → v0-cC-WxCLd.mjs} +2 -2
- package/dist/{v0-A4GLojAr.mjs → v0-yZ2ZUtVF.mjs} +1 -2
- package/dist/{virtual-DFvOoeG6.mjs → virtual-Bbu26O_h.mjs} +1 -2
- package/dist/{virtual-C-NsLue0.d.mts → virtual-JIdFLpTQ.d.mts} +2 -2
- package/package.json +8 -1
- package/dist/adapter-CVoWg0sw.mjs +0 -99
- package/dist/useFeatures-YJmONiU7.mjs +0 -124
- package/dist/useTheme-C0_i__N6.mjs +0 -162
- /package/dist/{adapter-CTsckKAR.mjs → adapter-8UADsA3-.mjs} +0 -0
- /package/dist/{adapter-BCtceV3b.mjs → adapter-BuSfpxur.mjs} +0 -0
- /package/dist/{adapter-Bc0yPSfo.d.mts → adapter-D5nT3bLw.d.mts} +0 -0
- /package/dist/{adapter-bwZo7b5p.mjs → adapter-D8zizQVP.mjs} +0 -0
- /package/dist/{adapter-q1sRACUc.mjs → adapter-TiGrumDi.mjs} +0 -0
- /package/dist/{adapter-BYzU4Ey5.d.mts → adapter-ryk5H6YZ.d.mts} +0 -0
- /package/dist/{index-CROz1VSV.d.mts → index-CX869wwk.d.mts} +0 -0
- /package/dist/{index-FtE8MXJ_.d.mts → index-CsuikFeJ.d.mts} +0 -0
- /package/dist/{index-DidZKN6S.d.mts → index-Djhiy3nS.d.mts} +0 -0
- /package/dist/{index-CyNk9FpR.d.mts → index-DtiaWx5U.d.mts} +0 -0
- /package/dist/{index-DXMlYoiQ.d.mts → index-H_hl6-4b.d.mts} +0 -0
- /package/dist/{index-BgCkepP_.d.mts → index-u_qSc2xS.d.mts} +0 -0
- /package/dist/{memory-DbyZeNjg.d.mts → memory-B7z1RR9r.d.mts} +0 -0
- /package/dist/{memory-BJjkQzxs.mjs → memory-CR6zvuaP.mjs} +0 -0
- /package/dist/{toArray-C89ZaEuF.mjs → toArray-MY9Kb1Qy.mjs} +0 -0
- /package/dist/{v0-UNyykD27.mjs → v0-Ch0yBKEj.mjs} +0 -0
package/dist/utilities/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as IN_BROWSER } from "../globals-
|
|
1
|
+
import { t as IN_BROWSER } from "../globals-wvVdMRFF.mjs";
|
|
2
2
|
import * as Vue from "vue";
|
|
3
3
|
import { useId as useId$1 } from "vue";
|
|
4
4
|
//#region src/utilities/color.ts
|
|
@@ -102,6 +102,149 @@ function foreground(hex) {
|
|
|
102
102
|
return Math.abs(/* @__PURE__ */ apca(BLACK, rgb)) > Math.abs(/* @__PURE__ */ apca(WHITE, rgb)) ? "#000000" : "#ffffff";
|
|
103
103
|
}
|
|
104
104
|
//#endregion
|
|
105
|
+
//#region src/utilities/diacritics.ts
|
|
106
|
+
const COMBINING_MARKS = /[\u0300-\u036F]/g;
|
|
107
|
+
const FINAL_SIGMA = /ς/g;
|
|
108
|
+
function lower(str) {
|
|
109
|
+
return str.toLowerCase().replace(FINAL_SIGMA, "σ");
|
|
110
|
+
}
|
|
111
|
+
const SPECIAL_LETTERS = {
|
|
112
|
+
ł: "l",
|
|
113
|
+
ø: "o",
|
|
114
|
+
đ: "d",
|
|
115
|
+
ð: "d",
|
|
116
|
+
þ: "th",
|
|
117
|
+
ħ: "h",
|
|
118
|
+
ŧ: "t",
|
|
119
|
+
ŋ: "n",
|
|
120
|
+
ß: "ss",
|
|
121
|
+
æ: "ae",
|
|
122
|
+
œ: "oe",
|
|
123
|
+
ı: "i",
|
|
124
|
+
Ł: "L",
|
|
125
|
+
Ø: "O",
|
|
126
|
+
Đ: "D",
|
|
127
|
+
Ð: "D",
|
|
128
|
+
Þ: "Th",
|
|
129
|
+
Ħ: "H",
|
|
130
|
+
Ŧ: "T",
|
|
131
|
+
Ŋ: "N",
|
|
132
|
+
ẞ: "Ss",
|
|
133
|
+
Æ: "Ae",
|
|
134
|
+
Œ: "Oe"
|
|
135
|
+
};
|
|
136
|
+
const SPECIAL_LETTER = /* @__PURE__ */ new RegExp(`[${Object.keys(SPECIAL_LETTERS).join("")}]`, "g");
|
|
137
|
+
function fold(str) {
|
|
138
|
+
return str.normalize("NFD").replace(COMBINING_MARKS, "").replace(SPECIAL_LETTER, (char) => SPECIAL_LETTERS[char]);
|
|
139
|
+
}
|
|
140
|
+
function foldWithMap(str, ignoreCase, foldAccents) {
|
|
141
|
+
let folded = "";
|
|
142
|
+
const map = [];
|
|
143
|
+
let index = 0;
|
|
144
|
+
for (const char of str) {
|
|
145
|
+
const raw = ignoreCase ? lower(char) : char;
|
|
146
|
+
const chunk = foldAccents ? fold(raw) : raw;
|
|
147
|
+
folded += chunk;
|
|
148
|
+
for (let unit = 0; unit < chunk.length; unit++) map.push(index);
|
|
149
|
+
index += char.length;
|
|
150
|
+
}
|
|
151
|
+
map.push(str.length);
|
|
152
|
+
return {
|
|
153
|
+
folded,
|
|
154
|
+
map
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function collect(haystack, needle, matchAll) {
|
|
158
|
+
const ranges = [];
|
|
159
|
+
let index = haystack.indexOf(needle);
|
|
160
|
+
while (index !== -1) {
|
|
161
|
+
ranges.push([index, index + needle.length]);
|
|
162
|
+
if (!matchAll) break;
|
|
163
|
+
index = haystack.indexOf(needle, index + needle.length);
|
|
164
|
+
}
|
|
165
|
+
return ranges;
|
|
166
|
+
}
|
|
167
|
+
function remap(map, start, end) {
|
|
168
|
+
const sourceStart = map[start];
|
|
169
|
+
let sourceEnd = map[end];
|
|
170
|
+
if (end > 0 && map[end] === map[end - 1]) {
|
|
171
|
+
let index = end;
|
|
172
|
+
const current = map[end];
|
|
173
|
+
while (index < map.length && map[index] === current) index++;
|
|
174
|
+
sourceEnd = map[index];
|
|
175
|
+
}
|
|
176
|
+
return [sourceStart, sourceEnd];
|
|
177
|
+
}
|
|
178
|
+
function project(ranges, map) {
|
|
179
|
+
const projected = [];
|
|
180
|
+
for (const [start, end] of ranges) {
|
|
181
|
+
const span = remap(map, start, end);
|
|
182
|
+
const last = projected.at(-1);
|
|
183
|
+
if (!last || last[0] !== span[0] || last[1] !== span[1]) projected.push(span);
|
|
184
|
+
}
|
|
185
|
+
return projected;
|
|
186
|
+
}
|
|
187
|
+
function search(text, query, ignoreCase, foldQuery, foldTarget, matchAll) {
|
|
188
|
+
const folded = foldQuery ? fold(query) : query;
|
|
189
|
+
const needle = ignoreCase ? lower(folded) : folded;
|
|
190
|
+
if (needle.length === 0) return [];
|
|
191
|
+
if (!foldTarget) {
|
|
192
|
+
if (!ignoreCase) return collect(text, needle, matchAll);
|
|
193
|
+
const lowered = lower(text);
|
|
194
|
+
if (lowered.length === text.length) return collect(lowered, needle, matchAll);
|
|
195
|
+
}
|
|
196
|
+
const { folded: haystack, map } = foldWithMap(text, ignoreCase, foldTarget);
|
|
197
|
+
return project(collect(haystack, needle, matchAll), map);
|
|
198
|
+
}
|
|
199
|
+
function mergeRanges(a, b) {
|
|
200
|
+
const combined = [...a, ...b].toSorted((x, y) => x[0] - y[0] || x[1] - y[1]);
|
|
201
|
+
const merged = [];
|
|
202
|
+
for (const range of combined) {
|
|
203
|
+
const last = merged.at(-1);
|
|
204
|
+
if (last && range[0] < last[1]) continue;
|
|
205
|
+
merged.push(range);
|
|
206
|
+
}
|
|
207
|
+
return merged;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Finds `[start, end]` index pairs where `query` occurs in `text`, optionally
|
|
211
|
+
* folding accents on either side. Returned indices always address the original
|
|
212
|
+
* `text`, even when folding or case-conversion changed its length.
|
|
213
|
+
*
|
|
214
|
+
* Directional folding (`'query'` or `'target'`) only transforms one side, but
|
|
215
|
+
* a spelling that's already identical on both sides — accents and all — is
|
|
216
|
+
* merged in verbatim, so folding one side never hides a match the other side
|
|
217
|
+
* already has.
|
|
218
|
+
*
|
|
219
|
+
* @param text The string to search.
|
|
220
|
+
* @param query The term to look for. An empty query yields no ranges.
|
|
221
|
+
* @param options Optional `ignoreCase`, `ignoreAccents`, `matchAll`.
|
|
222
|
+
* @returns Ranges into `text`, where `end` is exclusive.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```ts
|
|
226
|
+
* import { findMatchRanges } from '@vuetify/v0'
|
|
227
|
+
*
|
|
228
|
+
* findMatchRanges('Zürich', 'zurich', { ignoreCase: true, ignoreAccents: true })
|
|
229
|
+
* // [[0, 6]]
|
|
230
|
+
*
|
|
231
|
+
* findMatchRanges('Łódź', 'Lo', { ignoreAccents: 'target' })
|
|
232
|
+
* // [[0, 2]]
|
|
233
|
+
*
|
|
234
|
+
* findMatchRanges('… Kraków …', 'Kraków', { ignoreAccents: 'query' })
|
|
235
|
+
* // [[2, 8]] — typing the exact accented name always finds itself
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
239
|
+
function findMatchRanges(text, query, options = {}) {
|
|
240
|
+
const { ignoreCase = false, ignoreAccents = false, matchAll = false } = options;
|
|
241
|
+
const foldQuery = ignoreAccents === true || ignoreAccents === "query";
|
|
242
|
+
const foldTarget = ignoreAccents === true || ignoreAccents === "target";
|
|
243
|
+
if (foldQuery === foldTarget) return search(text, query, ignoreCase, foldQuery, foldTarget, matchAll);
|
|
244
|
+
const merged = mergeRanges(search(text, query, ignoreCase, false, false, true), search(text, query, ignoreCase, foldQuery, foldTarget, true));
|
|
245
|
+
return matchAll ? merged : merged.slice(0, 1);
|
|
246
|
+
}
|
|
247
|
+
//#endregion
|
|
105
248
|
//#region src/utilities/instance.ts
|
|
106
249
|
/**
|
|
107
250
|
* Vue 3.6+ exposes `currentInstance` for Vapor mode compatibility.
|
|
@@ -308,6 +451,27 @@ function isElement(item) {
|
|
|
308
451
|
return typeof Element !== "undefined" && item instanceof Element;
|
|
309
452
|
}
|
|
310
453
|
/**
|
|
454
|
+
* Resolve the deepest focused element, piercing open shadow roots.
|
|
455
|
+
*
|
|
456
|
+
* `document.activeElement` returns the shadow *host* when focus is inside an
|
|
457
|
+
* open shadow root — walk down through open roots so focus/keyboard logic
|
|
458
|
+
* resolves the real focused element (e.g. a control inside a custom element).
|
|
459
|
+
* Returns the same value as `document.activeElement` in light DOM, and `null`
|
|
460
|
+
* under SSR. Closed shadow roots can't be traversed.
|
|
461
|
+
*
|
|
462
|
+
* @example
|
|
463
|
+
* ```ts
|
|
464
|
+
* const active = getActiveElement()
|
|
465
|
+
* ```
|
|
466
|
+
*/
|
|
467
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
468
|
+
function getActiveElement() {
|
|
469
|
+
if (!IN_BROWSER) return null;
|
|
470
|
+
let active = document.activeElement;
|
|
471
|
+
while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
|
|
472
|
+
return active;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
311
475
|
* Checks if a value is null
|
|
312
476
|
*
|
|
313
477
|
* @param item The value to check
|
|
@@ -550,6 +714,44 @@ function range(length, start = 0) {
|
|
|
550
714
|
return Array.from({ length }, (_, index) => start + index);
|
|
551
715
|
}
|
|
552
716
|
/**
|
|
717
|
+
* Parses a CSS pixel length into a number
|
|
718
|
+
*
|
|
719
|
+
* @param value The resolved CSS length, e.g. `getComputedStyle(el).marginLeft`
|
|
720
|
+
* @param fallback The value to return when `value` does not parse (default: 0)
|
|
721
|
+
* @returns The parsed number, or `fallback`
|
|
722
|
+
*
|
|
723
|
+
* @remarks
|
|
724
|
+
* Built for reading `getComputedStyle` output, where a length that does not
|
|
725
|
+
* apply resolves to `''` or `'auto'` rather than to a number. An unparseable
|
|
726
|
+
* length returns `fallback`; a length that legitimately parses to `0` returns
|
|
727
|
+
* `0`. That distinction is why this exists — `Number.parseFloat(v) || 0`
|
|
728
|
+
* collapses both cases onto `0`, which is only correct when the fallback is
|
|
729
|
+
* itself `0`.
|
|
730
|
+
*
|
|
731
|
+
* Only the leading number is read, matching `Number.parseFloat`, so any unit
|
|
732
|
+
* suffix is ignored. Values `getComputedStyle` never returns — percentages,
|
|
733
|
+
* `calc()` expressions, multi-value shorthands — are out of scope.
|
|
734
|
+
*
|
|
735
|
+
* @example
|
|
736
|
+
* ```ts
|
|
737
|
+
* pxToNumber('16px') // 16
|
|
738
|
+
* pxToNumber('0px') // 0
|
|
739
|
+
* pxToNumber('-4.5px') // -4.5
|
|
740
|
+
* pxToNumber('auto') // 0
|
|
741
|
+
* pxToNumber(undefined) // 0
|
|
742
|
+
*
|
|
743
|
+
* // A non-zero fallback is the case `|| 0` cannot express
|
|
744
|
+
* pxToNumber('auto', 100) // 100
|
|
745
|
+
* pxToNumber('0px', 100) // 0
|
|
746
|
+
* ```
|
|
747
|
+
*/
|
|
748
|
+
/* @__NO_SIDE_EFFECTS__ */
|
|
749
|
+
function pxToNumber(value, fallback = 0) {
|
|
750
|
+
if (!/* @__PURE__ */ isString(value)) return fallback;
|
|
751
|
+
const parsed = Number.parseFloat(value);
|
|
752
|
+
return /* @__PURE__ */ isNaN(parsed) ? fallback : parsed;
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
553
755
|
* Resolves an iterable of IDs to their items via a getter,
|
|
554
756
|
* filtering out any that return undefined.
|
|
555
757
|
*
|
|
@@ -697,4 +899,4 @@ function isV0Error(value, code) {
|
|
|
697
899
|
return /* @__PURE__ */ isUndefined(code) || value.code === code;
|
|
698
900
|
}
|
|
699
901
|
//#endregion
|
|
700
|
-
export { UNSAFE_KEYS, V0Error, apca, clamp, foreground, hexToRgb, instanceExists, instanceName, isArray, isBoolean, isElement, isFunction, isNaN, isNull, isNullOrUndefined, isNumber, isObject, isPrimitive, isString, isSymbol, isThenable, isUndefined, isV0Error, mergeDeep, range, resolveIds, resolveIndexes, rgbToHex, useId };
|
|
902
|
+
export { UNSAFE_KEYS, V0Error, apca, clamp, findMatchRanges, foreground, getActiveElement, hexToRgb, instanceExists, instanceName, isArray, isBoolean, isElement, isFunction, isNaN, isNull, isNullOrUndefined, isNumber, isObject, isPrimitive, isString, isSymbol, isThenable, isUndefined, isV0Error, mergeDeep, pxToNumber, range, resolveIds, resolveIndexes, rgbToHex, useId };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as IN_BROWSER } from "./globals-
|
|
1
|
+
import { t as IN_BROWSER } from "./globals-wvVdMRFF.mjs";
|
|
2
2
|
import { isNull, isString } from "./utilities/index.mjs";
|
|
3
|
-
import { t as ThemeAdapter } from "./adapter-
|
|
3
|
+
import { t as ThemeAdapter } from "./adapter-TiGrumDi.mjs";
|
|
4
4
|
import { watch } from "vue";
|
|
5
5
|
//#region src/composables/useTheme/adapters/v0.ts
|
|
6
6
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as IN_BROWSER } from "./globals-
|
|
1
|
+
import { t as IN_BROWSER } from "./globals-wvVdMRFF.mjs";
|
|
2
2
|
import { isFunction } from "./utilities/index.mjs";
|
|
3
3
|
import { t as LoggerAdapter } from "./adapter-Chznb9Ju.mjs";
|
|
4
4
|
//#region src/composables/useLogger/adapters/v0.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "./adapter-
|
|
1
|
+
import { n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "./adapter-PDTe5nFT.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/composables/createDataTable/adapters/v0.d.ts
|
|
4
|
-
declare class ClientDataTableAdapter<T extends
|
|
4
|
+
declare class ClientDataTableAdapter<T extends object> extends DataTableAdapter<T> {
|
|
5
5
|
setup(context: DataTableAdapterContext<T>): DataTableAdapterResult<T>;
|
|
6
6
|
}
|
|
7
7
|
//#endregion
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as IN_BROWSER } from "./globals-
|
|
1
|
+
import { t as IN_BROWSER } from "./globals-wvVdMRFF.mjs";
|
|
2
2
|
import { isObject, isString, isUndefined } from "./utilities/index.mjs";
|
|
3
|
-
import { t as LocaleAdapter } from "./adapter-
|
|
3
|
+
import { t as LocaleAdapter } from "./adapter-D8zizQVP.mjs";
|
|
4
4
|
//#region src/composables/useLocale/adapters/v0.ts
|
|
5
5
|
/**
|
|
6
6
|
* Default locale adapter for @vuetify/v0.
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as DataTableAdapter } from "./adapter-CVoWg0sw.mjs";
|
|
1
|
+
import { n as createPagination, t as DataTableAdapter } from "./adapter-BiQV5j8B.mjs";
|
|
3
2
|
import { computed, toRef, watch } from "vue";
|
|
4
3
|
//#region src/composables/createDataTable/adapters/v0.ts
|
|
5
4
|
/**
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as DataTableAdapter } from "./adapter-CVoWg0sw.mjs";
|
|
1
|
+
import { n as createPagination, t as DataTableAdapter } from "./adapter-BiQV5j8B.mjs";
|
|
3
2
|
import { toRef, watch } from "vue";
|
|
4
3
|
//#region src/composables/createDataTable/adapters/virtual.ts
|
|
5
4
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "./adapter-
|
|
1
|
+
import { n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "./adapter-PDTe5nFT.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/composables/createDataTable/adapters/virtual.d.ts
|
|
4
|
-
declare class VirtualDataTableAdapter<T extends
|
|
4
|
+
declare class VirtualDataTableAdapter<T extends object> extends DataTableAdapter<T> {
|
|
5
5
|
setup(context: DataTableAdapterContext<T>): DataTableAdapterResult<T>;
|
|
6
6
|
}
|
|
7
7
|
//#endregion
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vuetify/v0",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Headless, unstyled, accessible Vue 3 primitives and composables — a meta UI framework for building applications, component libraries, and design systems",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vue",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"@adobe/leonardo-contrast-colors": ">=1.0.0",
|
|
51
51
|
"@ant-design/colors": ">=7.0.0",
|
|
52
52
|
"@flagsmith/flagsmith": ">=11.0.0",
|
|
53
|
+
"@floating-ui/dom": ">=1.8.0",
|
|
53
54
|
"@js-temporal/polyfill": ">=0.5.0",
|
|
54
55
|
"@material/material-color-utilities": ">=0.3.0",
|
|
55
56
|
"launchdarkly-js-client-sdk": "^3.0.0",
|
|
@@ -61,6 +62,9 @@
|
|
|
61
62
|
"@flagsmith/flagsmith": {
|
|
62
63
|
"optional": true
|
|
63
64
|
},
|
|
65
|
+
"@floating-ui/dom": {
|
|
66
|
+
"optional": true
|
|
67
|
+
},
|
|
64
68
|
"@js-temporal/polyfill": {
|
|
65
69
|
"optional": true
|
|
66
70
|
},
|
|
@@ -87,6 +91,7 @@
|
|
|
87
91
|
"@adobe/leonardo-contrast-colors": "^1.1.0",
|
|
88
92
|
"@ant-design/colors": "^8.0.1",
|
|
89
93
|
"@flagsmith/flagsmith": "^11.0.0",
|
|
94
|
+
"@floating-ui/dom": "^1.8.0",
|
|
90
95
|
"@js-temporal/polyfill": "0.5.1",
|
|
91
96
|
"@material/material-color-utilities": "^0.4.0",
|
|
92
97
|
"@testing-library/vue": "^8.1.0",
|
|
@@ -148,6 +153,8 @@
|
|
|
148
153
|
"./permissions": "./dist/permissions/index.mjs",
|
|
149
154
|
"./permissions/adapters": "./dist/permissions/adapters/index.mjs",
|
|
150
155
|
"./permissions/adapters/v0": "./dist/permissions/adapters/v0/index.mjs",
|
|
156
|
+
"./popover": "./dist/popover/index.mjs",
|
|
157
|
+
"./popover/adapters/floating-ui": "./dist/popover/adapters/floating-ui/index.mjs",
|
|
151
158
|
"./rules": "./dist/rules/index.mjs",
|
|
152
159
|
"./storage": "./dist/storage/index.mjs",
|
|
153
160
|
"./storage/adapters": "./dist/storage/adapters/index.mjs",
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { isArray, isNaN, isNullOrUndefined, isNumber, isObject, isString } from "./utilities/index.mjs";
|
|
2
|
-
import { i as createFilter } from "./createPagination-B5dfqY-a.mjs";
|
|
3
|
-
import { computed, toRef, toValue } from "vue";
|
|
4
|
-
//#region src/composables/createDataTable/adapters/adapter.ts
|
|
5
|
-
/**
|
|
6
|
-
* @module createDataTable/adapters
|
|
7
|
-
*
|
|
8
|
-
* @remarks
|
|
9
|
-
* Defines the adapter interface and abstract base class for data table
|
|
10
|
-
* pipeline strategies. Adapters control how raw items are filtered, sorted,
|
|
11
|
-
* and sliced into visible items.
|
|
12
|
-
*
|
|
13
|
-
* The abstract DataTableAdapter provides shared filter and sort pipelines
|
|
14
|
-
* used by client-side adapters. Server adapters that delegate pipeline
|
|
15
|
-
* operations externally subclass DataTableAdapter directly.
|
|
16
|
-
*/
|
|
17
|
-
function getNestedValue(obj, parts) {
|
|
18
|
-
let result = obj;
|
|
19
|
-
for (const k of parts) {
|
|
20
|
-
if (/* @__PURE__ */ isNullOrUndefined(result)) return void 0;
|
|
21
|
-
result = result[k];
|
|
22
|
-
}
|
|
23
|
-
return result;
|
|
24
|
-
}
|
|
25
|
-
function compareValues(a, b, collator) {
|
|
26
|
-
if (a === b) return 0;
|
|
27
|
-
const aNil = /* @__PURE__ */ isNullOrUndefined(a);
|
|
28
|
-
const bNil = /* @__PURE__ */ isNullOrUndefined(b);
|
|
29
|
-
if (aNil && bNil) return 0;
|
|
30
|
-
if (aNil) return 1;
|
|
31
|
-
if (bNil) return -1;
|
|
32
|
-
if (/* @__PURE__ */ isString(a) && /* @__PURE__ */ isString(b)) return collator ? collator.compare(a, b) : a.localeCompare(b);
|
|
33
|
-
if (/* @__PURE__ */ isNumber(a) && /* @__PURE__ */ isNumber(b)) {
|
|
34
|
-
if (/* @__PURE__ */ isNaN(a)) return 1;
|
|
35
|
-
if (/* @__PURE__ */ isNaN(b)) return -1;
|
|
36
|
-
return a - b;
|
|
37
|
-
}
|
|
38
|
-
const sa = String(a);
|
|
39
|
-
const sb = String(b);
|
|
40
|
-
return collator ? collator.compare(sa, sb) : sa.localeCompare(sb);
|
|
41
|
-
}
|
|
42
|
-
var DataTableAdapter = class {
|
|
43
|
-
/** Create the filter pipeline stage */
|
|
44
|
-
filter(context) {
|
|
45
|
-
const filter = createFilter({
|
|
46
|
-
...context.filterOptions,
|
|
47
|
-
keys: [...toValue(context.filterableKeys)],
|
|
48
|
-
customFilter: context.filterOptions.customFilter ?? ((query, item) => {
|
|
49
|
-
const columnFilters = toValue(context.customColumnFilters);
|
|
50
|
-
const keys = toValue(context.filterableKeys);
|
|
51
|
-
if (!/* @__PURE__ */ isObject(item)) return false;
|
|
52
|
-
const q = String(/* @__PURE__ */ isArray(query) ? query[0] : query).toLowerCase();
|
|
53
|
-
if (!q) return true;
|
|
54
|
-
const obj = item;
|
|
55
|
-
for (const key of keys) {
|
|
56
|
-
const customFn = columnFilters[key];
|
|
57
|
-
if (customFn) {
|
|
58
|
-
if (customFn(obj[key], q)) return true;
|
|
59
|
-
} else {
|
|
60
|
-
const val = obj[key];
|
|
61
|
-
if (!/* @__PURE__ */ isNullOrUndefined(val) && String(val).toLowerCase().includes(q)) return true;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return false;
|
|
65
|
-
})
|
|
66
|
-
});
|
|
67
|
-
const allItems = toRef(() => toValue(context.items));
|
|
68
|
-
const { items: filteredItems } = filter.apply(context.search, allItems);
|
|
69
|
-
return {
|
|
70
|
-
allItems,
|
|
71
|
-
filteredItems
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
/** Create the sort pipeline stage */
|
|
75
|
-
sort(filteredItems, sortBy, locale, customSorts) {
|
|
76
|
-
return computed(() => {
|
|
77
|
-
const entries = sortBy.value;
|
|
78
|
-
if (entries.length === 0) return filteredItems.value;
|
|
79
|
-
const sorts = toValue(customSorts) ?? {};
|
|
80
|
-
const collator = new Intl.Collator(locale?.value);
|
|
81
|
-
const resolved = entries.map(({ key, direction }) => ({
|
|
82
|
-
parts: key.split("."),
|
|
83
|
-
direction,
|
|
84
|
-
custom: sorts[key]
|
|
85
|
-
}));
|
|
86
|
-
return filteredItems.value.toSorted((a, b) => {
|
|
87
|
-
for (const { parts, direction, custom } of resolved) {
|
|
88
|
-
const aVal = parts.length === 1 ? a[parts[0]] : getNestedValue(a, parts);
|
|
89
|
-
const bVal = parts.length === 1 ? b[parts[0]] : getNestedValue(b, parts);
|
|
90
|
-
const cmp = custom ? custom(aVal, bVal) : compareValues(aVal, bVal, collator);
|
|
91
|
-
if (cmp !== 0) return direction === "desc" ? -cmp : cmp;
|
|
92
|
-
}
|
|
93
|
-
return 0;
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
//#endregion
|
|
99
|
-
export { DataTableAdapter as t };
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { isArray, isBoolean, isFunction, isObject } from "./utilities/index.mjs";
|
|
2
|
-
import { o as createPluginContext } from "./useLogger-CbvzXCWb.mjs";
|
|
3
|
-
import { t as createTokens } from "./createTokens-C4qcW2Kv.mjs";
|
|
4
|
-
import { t as createGroup } from "./createGroup-BXKKcb9-.mjs";
|
|
5
|
-
//#region src/composables/useFeatures/index.ts
|
|
6
|
-
/**
|
|
7
|
-
* @module useFeatures
|
|
8
|
-
*
|
|
9
|
-
* @see https://0.vuetifyjs.com/composables/plugins/use-features
|
|
10
|
-
*
|
|
11
|
-
* @remarks
|
|
12
|
-
* Feature flag system with boolean and token-based features.
|
|
13
|
-
*
|
|
14
|
-
* Key features:
|
|
15
|
-
* - Boolean features (true/false activation)
|
|
16
|
-
* - Token features with $variation support
|
|
17
|
-
* - Auto-selection of enabled features
|
|
18
|
-
* - Multi-select support for feature combinations
|
|
19
|
-
* - Perfect for A/B testing, progressive rollout, feature toggles
|
|
20
|
-
* - Adapter pattern for external feature flag services (Generic, LaunchDarkly, Flagsmith)
|
|
21
|
-
*
|
|
22
|
-
* Inheritance chain: createRegistry → createSelection → createGroup → createFeatures
|
|
23
|
-
* Integrates with createTokens for token-based features.
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```ts
|
|
27
|
-
* import { useFeatures } from '@vuetify/v0'
|
|
28
|
-
*
|
|
29
|
-
* const features = useFeatures()
|
|
30
|
-
* features.register({ id: 'new-checkout', value: true })
|
|
31
|
-
* console.log(features.variation('new-checkout'))
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
/**
|
|
35
|
-
* Creates a new features instance.
|
|
36
|
-
*
|
|
37
|
-
* @param options The options for the features instance.
|
|
38
|
-
* @returns A new features instance.
|
|
39
|
-
*
|
|
40
|
-
* @see https://0.vuetifyjs.com/composables/plugins/use-features
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* ```ts
|
|
44
|
-
* import { createFeatures } from '@vuetify/v0'
|
|
45
|
-
*
|
|
46
|
-
* const features = createFeatures({
|
|
47
|
-
* features: {
|
|
48
|
-
* 'dark-mode': true,
|
|
49
|
-
* 'theme-color': { $variation: 'blue' },
|
|
50
|
-
* },
|
|
51
|
-
* })
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
function createFeatures(_options = {}) {
|
|
55
|
-
const { features, ...options } = _options;
|
|
56
|
-
const tokens = createTokens(features, { flat: true });
|
|
57
|
-
const registry = createGroup({
|
|
58
|
-
...options,
|
|
59
|
-
events: true,
|
|
60
|
-
reactive: true
|
|
61
|
-
});
|
|
62
|
-
for (const [id, { value }] of tokens.entries()) register({
|
|
63
|
-
id,
|
|
64
|
-
value
|
|
65
|
-
});
|
|
66
|
-
function variation(id, fallback = null) {
|
|
67
|
-
const ticket = registry.get(id);
|
|
68
|
-
if (!ticket) return fallback;
|
|
69
|
-
return /* @__PURE__ */ isObject(ticket.value) ? ticket.value.$variation ?? fallback : ticket.value ?? fallback;
|
|
70
|
-
}
|
|
71
|
-
function register(registration = {}) {
|
|
72
|
-
const item = {
|
|
73
|
-
value: false,
|
|
74
|
-
...registration
|
|
75
|
-
};
|
|
76
|
-
const ticket = registry.register(item);
|
|
77
|
-
if (/* @__PURE__ */ isBoolean(ticket.value) && ticket.value === true || /* @__PURE__ */ isObject(ticket.value) && /* @__PURE__ */ isBoolean(ticket.value.$value) && ticket.value.$value === true) registry.select(ticket.id);
|
|
78
|
-
return ticket;
|
|
79
|
-
}
|
|
80
|
-
function sync(flags) {
|
|
81
|
-
for (const [id, value] of Object.entries(flags)) if (registry.get(id)) {
|
|
82
|
-
const shouldSelect = /* @__PURE__ */ isBoolean(value) ? value === true : /* @__PURE__ */ isObject(value) && /* @__PURE__ */ isBoolean(value.$value) && value.$value === true;
|
|
83
|
-
registry.upsert(id, { value });
|
|
84
|
-
if (shouldSelect) registry.select(id);
|
|
85
|
-
else registry.selectedIds.delete(id);
|
|
86
|
-
} else register({
|
|
87
|
-
id,
|
|
88
|
-
value
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
function onboard(registrations) {
|
|
92
|
-
return registry.batch(() => registrations.map((registration) => register(registration)));
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
...registry,
|
|
96
|
-
variation,
|
|
97
|
-
register,
|
|
98
|
-
onboard,
|
|
99
|
-
sync,
|
|
100
|
-
get size() {
|
|
101
|
-
return registry.size;
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
function createFeaturesFallback() {
|
|
106
|
-
return {
|
|
107
|
-
size: 0,
|
|
108
|
-
variation: (_id, fallback = null) => fallback,
|
|
109
|
-
sync: () => {},
|
|
110
|
-
onboard: () => []
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
const [createFeaturesContext, createFeaturesPlugin, useFeatures] = createPluginContext("v0:features", (options) => createFeatures(options), {
|
|
114
|
-
fallback: () => createFeaturesFallback(),
|
|
115
|
-
setup: (context, app, { adapter }) => {
|
|
116
|
-
if (!adapter) return;
|
|
117
|
-
for (const a of /* @__PURE__ */ isArray(adapter) ? adapter : [adapter]) {
|
|
118
|
-
context.sync(a.setup((flags) => context.sync(flags)));
|
|
119
|
-
if (/* @__PURE__ */ isFunction(a.dispose)) app.onUnmount(() => a.dispose());
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
//#endregion
|
|
124
|
-
export { useFeatures as i, createFeaturesContext as n, createFeaturesPlugin as r, createFeatures as t };
|