slidytabs 0.1.0

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.
@@ -0,0 +1,25 @@
1
+ type RangeValue = [start: number, end: number];
2
+
3
+ type RefTarget = Element | {
4
+ $el: Element;
5
+ } | string | null;
6
+ type RefCallback = (node: RefTarget, refs?: unknown) => void;
7
+ interface TabOptions {
8
+ value?: number;
9
+ onValueChange?: (value: number) => void;
10
+ }
11
+ interface SliderOptions {
12
+ value?: number;
13
+ onValueChange?: (value: number) => void;
14
+ sticky?: number;
15
+ }
16
+ interface RangeOptions {
17
+ value: [number, number];
18
+ onValueChange?: (value: [number, number]) => void;
19
+ push?: boolean;
20
+ }
21
+ declare const tabs: ({ value, onValueChange }?: TabOptions) => RefCallback;
22
+ declare const slider: ({ value, onValueChange, sticky }?: SliderOptions) => RefCallback;
23
+ declare const range: ({ value, onValueChange, push }: RangeOptions) => RefCallback;
24
+
25
+ export { type RangeOptions, type RangeValue, type SliderOptions, type TabOptions, range, slider, tabs };
package/dist/index.js ADDED
@@ -0,0 +1,468 @@
1
+ // src/slidytabs.ts
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ // ../../node_modules/.pnpm/@unocss+core@66.5.12/node_modules/@unocss/core/dist/index.mjs
5
+ var LAYER_DEFAULT = "default";
6
+ var LAYER_PREFLIGHTS = "preflights";
7
+ var LAYER_SHORTCUTS = "shortcuts";
8
+ var LAYER_IMPORTS = "imports";
9
+ var DEFAULT_LAYERS = {
10
+ [LAYER_IMPORTS]: -200,
11
+ [LAYER_PREFLIGHTS]: -100,
12
+ [LAYER_SHORTCUTS]: -10,
13
+ [LAYER_DEFAULT]: 0
14
+ };
15
+ function escapeSelector(str) {
16
+ const length = str.length;
17
+ let index = -1;
18
+ let codeUnit;
19
+ let result = "";
20
+ const firstCodeUnit = str.charCodeAt(0);
21
+ while (++index < length) {
22
+ codeUnit = str.charCodeAt(index);
23
+ if (codeUnit === 0) {
24
+ result += "\uFFFD";
25
+ continue;
26
+ }
27
+ if (codeUnit === 37) {
28
+ result += "\\%";
29
+ continue;
30
+ }
31
+ if (codeUnit === 44) {
32
+ result += "\\,";
33
+ continue;
34
+ }
35
+ if (codeUnit >= 1 && codeUnit <= 31 || codeUnit === 127 || index === 0 && codeUnit >= 48 && codeUnit <= 57 || index === 1 && codeUnit >= 48 && codeUnit <= 57 && firstCodeUnit === 45) {
36
+ result += `\\${codeUnit.toString(16)} `;
37
+ continue;
38
+ }
39
+ if (index === 0 && length === 1 && codeUnit === 45) {
40
+ result += `\\${str.charAt(index)}`;
41
+ continue;
42
+ }
43
+ if (codeUnit >= 128 || codeUnit === 45 || codeUnit === 95 || codeUnit >= 48 && codeUnit <= 57 || codeUnit >= 65 && codeUnit <= 90 || codeUnit >= 97 && codeUnit <= 122) {
44
+ result += str.charAt(index);
45
+ continue;
46
+ }
47
+ result += `\\${str.charAt(index)}`;
48
+ }
49
+ return result;
50
+ }
51
+ var e = escapeSelector;
52
+ var attributifyRe = /^\[(.+?)(~?=)"(.*)"\]$/;
53
+ function toEscapedSelector(raw) {
54
+ if (attributifyRe.test(raw)) return raw.replace(attributifyRe, (_, n, s, i) => `[${e(n)}${s}"${e(i)}"]`);
55
+ return `.${e(raw)}`;
56
+ }
57
+
58
+ // src/util.ts
59
+ var categorizeClasses = (triggers) => {
60
+ const textClasses = /(^|:)(text|font|color|tracking|leading|decoration|underline|line-through|overline|uppercase|lowercase|capitalize)\b/;
61
+ const activeVariant = "data-[state=active]:";
62
+ const triggerClasses = [];
63
+ for (const trigger of triggers) {
64
+ const classList = [...trigger.classList];
65
+ const activeIndicator = classList.filter((item) => item.includes(activeVariant)).map((item) => item.replace(activeVariant, ""));
66
+ const base = classList.filter(
67
+ (item) => !item.includes(activeVariant) || item.match(textClasses)
68
+ );
69
+ triggerClasses.push({ activeIndicator, base });
70
+ }
71
+ return triggerClasses;
72
+ };
73
+ var inserted = /* @__PURE__ */ new Set();
74
+ var safelistGeneralizedClasses = (el) => {
75
+ const activeSelector = '[data-state="active"]';
76
+ const activePrefix = "data-[state=active]:";
77
+ const classes = [...el.classList].filter((item) => item.startsWith(activePrefix)).map(toEscapedSelector);
78
+ if (typeof document !== "undefined") {
79
+ try {
80
+ [...document.styleSheets].forEach((styleSheet) => {
81
+ [...styleSheet.cssRules].filter(
82
+ (item) => (
83
+ // for firefox
84
+ item instanceof CSSStyleRule && activeSelector !== item.selectorText.trim() && classes.some((prefix) => item.selectorText.startsWith(prefix))
85
+ )
86
+ ).forEach(({ cssText }) => {
87
+ const newRule = cssText.replaceAll(escapeSelector(activePrefix), "").replaceAll(activeSelector, "");
88
+ if (!inserted.has(newRule)) {
89
+ inserted.add(newRule);
90
+ globalThis.sheet.insertRule(newRule);
91
+ }
92
+ });
93
+ });
94
+ } catch {
95
+ }
96
+ }
97
+ };
98
+ var getCurrentTargetX = (e2) => e2.clientX - e2.currentTarget.getBoundingClientRect().left;
99
+
100
+ // src/slidytabs.ts
101
+ var defaultTransitionDuration = 0.2 * 1e3;
102
+ var instances = /* @__PURE__ */ new WeakMap();
103
+ var Slidytabs = class {
104
+ #push = false;
105
+ #root;
106
+ #swipe;
107
+ #slidytab;
108
+ value;
109
+ #onValueChange;
110
+ #resizeObserver;
111
+ #dataStateObserver;
112
+ down = null;
113
+ #classes;
114
+ #_transitionDuration = defaultTransitionDuration;
115
+ #orientation;
116
+ #list;
117
+ #triggers;
118
+ #slideToken = false;
119
+ constructor(root) {
120
+ this.#root = root;
121
+ this.#extractFromDOM();
122
+ this.#classes = categorizeClasses(this.#triggers);
123
+ for (const trigger of this.#triggers) {
124
+ safelistGeneralizedClasses(trigger);
125
+ }
126
+ this.#slidytab = this.#setupSlidytab();
127
+ this.#list.addEventListener("pointerdown", this.#onpointerdown, true);
128
+ this.#list.addEventListener("pointerup", this.#onpointerup);
129
+ this.#list.addEventListener("pointermove", this.#onpointermove, true);
130
+ this.#resizeObserver = this.#setupResizeObserver();
131
+ const triggerStyles = {
132
+ zIndex: "10",
133
+ touchAction: "none",
134
+ outline: "unset"
135
+ };
136
+ for (const trigger of this.#triggers) {
137
+ Object.assign(trigger.style, triggerStyles);
138
+ }
139
+ for (let i = 0; i < this.#triggers.length; i++) {
140
+ this.#triggers[i].className = twMerge(this.#classes[i].base);
141
+ }
142
+ this.#list.append(this.#slidytab);
143
+ this.#dataStateObserver = this.#setupDataStateObserver();
144
+ }
145
+ setOptions = ({ value, onValueChange, swipe, push }) => {
146
+ this.#onValueChange = onValueChange;
147
+ this.#swipe = swipe;
148
+ this.#push = push;
149
+ if (!value) {
150
+ onValueChange == null ? void 0 : onValueChange(
151
+ {
152
+ index: this.activeIndex,
153
+ activeEdge: null,
154
+ value: [this.activeIndex, this.activeIndex]
155
+ },
156
+ this
157
+ );
158
+ } else {
159
+ this.updateValue(value);
160
+ }
161
+ };
162
+ #extractFromDOM = () => {
163
+ this.#triggers = [...this.#root.querySelectorAll("button")];
164
+ const list = this.#root.querySelector(
165
+ "div[role=tablist]"
166
+ );
167
+ if (!list) {
168
+ throw new Error("No list element");
169
+ }
170
+ this.#list = list;
171
+ const orientation = this.#root.dataset.orientation ?? "horizontal";
172
+ if (orientation !== "horizontal" && orientation !== "vertical") {
173
+ throw new Error("Invalid orientation");
174
+ }
175
+ this.#orientation = orientation;
176
+ };
177
+ #onpointerdown = (e2) => {
178
+ this.#slideToken = true;
179
+ this.#extractFromDOM();
180
+ const { index, trigger } = this.#triggerFromEvent(e2);
181
+ if (index === void 0) {
182
+ return;
183
+ }
184
+ const tabListX = getCurrentTargetX(e2);
185
+ const [x0, x1] = this.#getEndpoints();
186
+ this.down = Math.abs(tabListX - x0) < Math.abs(tabListX - x1) ? 0 : 1;
187
+ this.#list.setPointerCapture(e2.pointerId);
188
+ };
189
+ #onpointerup = () => {
190
+ this.down = null;
191
+ };
192
+ #triggerFromEvent = (e2) => {
193
+ var _a;
194
+ const { x, y, width, height } = this.#list.getBoundingClientRect();
195
+ const point = {
196
+ horizontal: [e2.clientX, y + height / 2],
197
+ vertical: [x + width / 2, e2.clientY]
198
+ }[this.#orientation];
199
+ const button = (_a = document.elementFromPoint(...point)) == null ? void 0 : _a.closest("button");
200
+ if (button) {
201
+ const index2 = this.#triggers.indexOf(button);
202
+ return { index: index2, trigger: button };
203
+ }
204
+ const trigger = {
205
+ horizontal: e2.clientX > x + width / 2 ? this.#triggers[this.#triggers.length - 1] : this.#triggers[0],
206
+ vertical: e2.clientY > y + height / 2 ? this.#triggers[this.#triggers.length - 1] : this.#triggers[0]
207
+ }[this.#orientation];
208
+ const index = this.#triggers.indexOf(trigger);
209
+ return { index, trigger };
210
+ };
211
+ #onpointermove = (e2) => {
212
+ if (e2.buttons === 0) {
213
+ this.down = null;
214
+ }
215
+ const { trigger, index } = this.#triggerFromEvent(e2);
216
+ if (!this.#swipe || this.down === null || (this.down === 0 && index > this.value[1] || this.down === 1 && index < this.value[0]) && !this.#push) {
217
+ return;
218
+ }
219
+ trigger.focus();
220
+ };
221
+ updateValue = (value) => {
222
+ if (this.value && value[0] === this.value[0] && value[1] === this.value[1]) {
223
+ return;
224
+ }
225
+ if (value[0] > value[1] && !this.#push) {
226
+ return;
227
+ }
228
+ let adjustedValue = value;
229
+ if (value[0] > value[1] && this.#push && this.down !== null) {
230
+ adjustedValue = value.with(
231
+ (this.down + 1) % 2,
232
+ value[this.down]
233
+ );
234
+ }
235
+ this.#slidytab.style.transitionDuration = this.down !== null && this.#slideToken ? this.transitionDuration : "0ms";
236
+ this.value = adjustedValue;
237
+ this.#slideToken = false;
238
+ this.#updateTriggersUI();
239
+ this.#updateIndicatorUI();
240
+ };
241
+ #updateIndicatorUI = () => {
242
+ var _a, _b;
243
+ if (!this.value) {
244
+ return;
245
+ }
246
+ this.#slidytab.className = twMerge(
247
+ this.#classes[((_a = this.value) == null ? void 0 : _a[0]) ?? 0].base,
248
+ this.#classes[((_b = this.value) == null ? void 0 : _b[0]) ?? 0].activeIndicator
249
+ );
250
+ const leftRect = this.#triggers[this.value[0]].getBoundingClientRect();
251
+ const rightRect = this.#triggers[this.value[1]].getBoundingClientRect();
252
+ const parentRect = this.#list.getBoundingClientRect();
253
+ const left = `${leftRect.left - parentRect.left}px`;
254
+ const top = `${leftRect.top - parentRect.top}px`;
255
+ const bottom = `${parentRect.bottom - leftRect.bottom}px`;
256
+ const right = `${parentRect.right - rightRect.right}px`;
257
+ Object.assign(this.#slidytab.style, { left, top, bottom, right });
258
+ };
259
+ #updateTriggersUI = async () => {
260
+ this.#list.tabIndex = -1;
261
+ this.#dataStateObserver.disconnect();
262
+ let firedTrigger;
263
+ for (let i = 0; i < this.#triggers.length; i++) {
264
+ const inRange = i >= this.value[0] && i <= this.value[1];
265
+ const trigger = this.#triggers[i];
266
+ if (inRange) {
267
+ trigger.dispatchEvent(new MouseEvent("mousedown", { bubbles: true }));
268
+ firedTrigger = trigger;
269
+ if (this.#triggers.filter((item) => item !== trigger).some((item) => item.tabIndex === 0)) {
270
+ trigger.tabIndex = -1;
271
+ }
272
+ break;
273
+ }
274
+ }
275
+ await new Promise(requestAnimationFrame);
276
+ for (let i = 0; i < this.#triggers.length; i++) {
277
+ const inRange = i >= this.value[0] && i <= this.value[1];
278
+ const targetState = inRange ? "active" : "inactive";
279
+ const trigger = this.#triggers[i];
280
+ if (trigger.dataset.state !== targetState) {
281
+ trigger.dataset.state = targetState;
282
+ }
283
+ }
284
+ this.#dataStateObserver.observe(this.#list, {
285
+ subtree: true,
286
+ attributes: true,
287
+ attributeFilter: ["data-state"]
288
+ });
289
+ };
290
+ get transitionDuration() {
291
+ return `${this.#_transitionDuration}ms`;
292
+ }
293
+ set transitionDuration(duration) {
294
+ this.#_transitionDuration = duration;
295
+ }
296
+ get activeIndex() {
297
+ const activeElement = this.#root.querySelector(
298
+ "button[data-state=active]"
299
+ );
300
+ if (!activeElement) {
301
+ return -1;
302
+ }
303
+ return this.#triggers.indexOf(activeElement);
304
+ }
305
+ #setupSlidytab = () => {
306
+ const slidytab = document.createElement("div");
307
+ const slidytabStyles = {
308
+ transitionProperty: "all",
309
+ position: "absolute",
310
+ height: "unset",
311
+ outlineColor: "transparent"
312
+ };
313
+ Object.assign(slidytab.style, slidytabStyles);
314
+ this.#list.style.position = "relative";
315
+ return slidytab;
316
+ };
317
+ #setupResizeObserver = () => {
318
+ const resizeObserver = new ResizeObserver(() => {
319
+ this.#slidytab.style.transitionDuration = "0ms";
320
+ this.updateValue(this.value);
321
+ });
322
+ resizeObserver.observe(this.#list);
323
+ return resizeObserver;
324
+ };
325
+ #getEndpoints = () => {
326
+ const [x0, x1] = this.value;
327
+ return [
328
+ this.#triggers[x0].offsetLeft,
329
+ this.#triggers[x1].offsetLeft + this.#triggers[x1].offsetWidth
330
+ ];
331
+ };
332
+ #tabSolo = (index) => {
333
+ for (let i = 0; i < this.#triggers.length; i++) {
334
+ if (i !== index) {
335
+ this.#triggers[i].tabIndex = -1;
336
+ }
337
+ }
338
+ };
339
+ #setupDataStateObserver = () => {
340
+ const dataStateObserver = new MutationObserver(
341
+ async (mutationList) => {
342
+ var _a, _b, _c;
343
+ for (const observation of mutationList) {
344
+ if (observation.target instanceof HTMLButtonElement && observation.target.dataset.state === "active") {
345
+ const index = this.#triggers.indexOf(observation.target);
346
+ this.#slidytab.className = twMerge(
347
+ this.#classes[((_a = this.value) == null ? void 0 : _a[index]) ?? 0].base,
348
+ this.#classes[((_b = this.value) == null ? void 0 : _b[index]) ?? 0].activeIndicator
349
+ );
350
+ (_c = this.#onValueChange) == null ? void 0 : _c.call(
351
+ this,
352
+ {
353
+ index,
354
+ activeEdge: this.down,
355
+ trigger: observation.target,
356
+ value: this.value
357
+ },
358
+ this
359
+ );
360
+ }
361
+ }
362
+ this.#updateTriggersUI();
363
+ }
364
+ );
365
+ return dataStateObserver;
366
+ };
367
+ destroyIfDisconnected() {
368
+ var _a;
369
+ if (this.#root.isConnected) {
370
+ return;
371
+ }
372
+ console.log("really destroying");
373
+ this.#list.removeEventListener("pointerdown", this.#onpointerdown);
374
+ this.#list.removeEventListener("pointermove", this.#onpointermove);
375
+ this.#resizeObserver.disconnect();
376
+ (_a = this.#dataStateObserver) == null ? void 0 : _a.disconnect();
377
+ instances.delete(this.#root);
378
+ }
379
+ };
380
+
381
+ // src/index.ts
382
+ var setupWithOptions = (ref, options) => {
383
+ const elements = typeof ref === "string" ? (
384
+ // For adding in a <script> e.g. starwind
385
+ document.querySelectorAll(ref)
386
+ ) : ref instanceof Element ? [ref] : (ref == null ? void 0 : ref.$el) instanceof Element ? [ref.$el] : [];
387
+ if (typeof ref === "string" && elements.length === 0) {
388
+ throw new Error(`Selector "${ref}" yielded no elements`);
389
+ }
390
+ const instances2 = [];
391
+ for (const el of elements) {
392
+ if (!(el instanceof HTMLElement)) {
393
+ continue;
394
+ }
395
+ const instance = getInstance(el);
396
+ instance.setOptions(options);
397
+ instances2.push(instance);
398
+ }
399
+ return () => {
400
+ for (const instance of instances2) {
401
+ instance.destroyIfDisconnected();
402
+ }
403
+ };
404
+ };
405
+ var getInstance = (el) => {
406
+ let instance = instances.get(el);
407
+ if (instance === void 0) {
408
+ instance = new Slidytabs(el);
409
+ instances.set(el, instance);
410
+ }
411
+ return instance;
412
+ };
413
+ var tabs = ({ value, onValueChange } = {}) => (root) => {
414
+ const controlled = value != null || onValueChange != null;
415
+ return setupWithOptions(root, {
416
+ push: false,
417
+ swipe: false,
418
+ value: value != null ? [value, value] : void 0,
419
+ onValueChange: ({ index }, instance) => {
420
+ if (controlled) {
421
+ onValueChange == null ? void 0 : onValueChange(index);
422
+ } else {
423
+ instance.updateValue([index, index]);
424
+ }
425
+ }
426
+ });
427
+ };
428
+ var slider = ({ value, onValueChange, sticky } = {}) => (root) => {
429
+ const controlled = value != null || onValueChange != null;
430
+ const stickyValue = (value2) => [sticky ?? value2, value2].toSorted((a, b) => a - b);
431
+ return setupWithOptions(root, {
432
+ push: true,
433
+ swipe: true,
434
+ value: value != null ? stickyValue(value) : void 0,
435
+ onValueChange: ({ index }, instance) => {
436
+ if (controlled) {
437
+ onValueChange == null ? void 0 : onValueChange(index);
438
+ } else {
439
+ instance.updateValue(stickyValue(index));
440
+ }
441
+ }
442
+ });
443
+ };
444
+ var range = ({ value, onValueChange, push = false }) => (root) => {
445
+ return setupWithOptions(root, {
446
+ push,
447
+ swipe: true,
448
+ value,
449
+ onValueChange: ({ index, activeEdge, value: value2 }, instance) => {
450
+ if (activeEdge === null) {
451
+ return;
452
+ }
453
+ const newValue = value2.with(activeEdge, index);
454
+ onValueChange == null ? void 0 : onValueChange(newValue);
455
+ }
456
+ });
457
+ };
458
+ if (typeof document !== "undefined" && !globalThis.sheet) {
459
+ const sheet = new CSSStyleSheet();
460
+ globalThis.sheet = sheet;
461
+ document.adoptedStyleSheets.push(sheet);
462
+ }
463
+ export {
464
+ range,
465
+ slider,
466
+ tabs
467
+ };
468
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/slidytabs.ts","../../../node_modules/.pnpm/@unocss+core@66.5.12/node_modules/@unocss/core/dist/index.mjs","../src/util.ts","../src/index.ts"],"sourcesContent":["import { twMerge } from \"tailwind-merge\";\nimport {\n categorizeClasses,\n safelistGeneralizedClasses,\n getCurrentTargetX,\n} from \"./util.js\";\n\nconst defaultTransitionDuration = 0.2 * 1000;\n// const defaultTransitionDuration = 1500;\n\nexport const instances = new WeakMap<HTMLElement, Slidytabs>();\nexport type RangeValue = [start: number, end: number];\nexport interface SlidytabOptions {\n value?: RangeValue;\n swipe: boolean;\n onValueChange?: (update: Update, instance: Slidytabs) => void;\n push: boolean;\n}\nexport interface Update {\n activeEdge: number | null;\n index: number;\n trigger?: HTMLElement;\n value: RangeValue;\n}\n\nexport class Slidytabs {\n #push = false;\n #root;\n #swipe!: boolean;\n #slidytab!: HTMLDivElement;\n value!: [number, number];\n #onValueChange?: (update: Update, instance: Slidytabs) => void;\n #resizeObserver;\n #dataStateObserver;\n down: number | null = null;\n #classes!: {\n activeIndicator: string[];\n base: string[];\n }[];\n #_transitionDuration = defaultTransitionDuration;\n #orientation!: \"horizontal\" | \"vertical\";\n #list!: HTMLDivElement;\n #triggers!: HTMLButtonElement[];\n #slideToken = false;\n\n constructor(root: HTMLElement) {\n this.#root = root;\n this.#extractFromDOM();\n this.#classes = categorizeClasses(this.#triggers);\n for (const trigger of this.#triggers) {\n safelistGeneralizedClasses(trigger);\n }\n this.#slidytab = this.#setupSlidytab();\n this.#list.addEventListener(\"pointerdown\", this.#onpointerdown, true);\n this.#list.addEventListener(\"pointerup\", this.#onpointerup);\n this.#list.addEventListener(\"pointermove\", this.#onpointermove, true);\n this.#resizeObserver = this.#setupResizeObserver();\n const triggerStyles: Partial<CSSStyleDeclaration> = {\n zIndex: \"10\",\n touchAction: \"none\",\n outline: \"unset\",\n };\n for (const trigger of this.#triggers) {\n Object.assign(trigger.style, triggerStyles);\n }\n for (let i = 0; i < this.#triggers.length; i++) {\n this.#triggers[i].className = twMerge(this.#classes[i].base);\n }\n this.#list.append(this.#slidytab);\n this.#dataStateObserver = this.#setupDataStateObserver();\n }\n\n setOptions = ({ value, onValueChange, swipe, push }: SlidytabOptions) => {\n this.#onValueChange = onValueChange;\n this.#swipe = swipe;\n this.#push = push;\n if (!value) {\n onValueChange?.(\n {\n index: this.activeIndex,\n activeEdge: null,\n value: [this.activeIndex, this.activeIndex],\n },\n this\n );\n } else {\n this.updateValue(value);\n }\n };\n\n #extractFromDOM = () => {\n this.#triggers = [...this.#root.querySelectorAll(\"button\")];\n const list = this.#root.querySelector(\n \"div[role=tablist]\"\n ) as HTMLDivElement | null;\n if (!list) {\n throw new Error(\"No list element\");\n }\n this.#list = list;\n // const { orientation } = this.#root.dataset\n const orientation = this.#root.dataset.orientation ?? \"horizontal\";\n if (orientation !== \"horizontal\" && orientation !== \"vertical\") {\n throw new Error(\"Invalid orientation\");\n }\n this.#orientation = orientation;\n };\n\n #onpointerdown = (e: PointerEvent) => {\n this.#slideToken = true;\n // must be a better place for this if we really care\n // mutation observer?\n this.#extractFromDOM();\n const { index, trigger } = this.#triggerFromEvent(e);\n if (index === undefined) {\n return;\n }\n const tabListX = getCurrentTargetX(e);\n const [x0, x1] = this.#getEndpoints();\n // TODO does this work for vertical\n this.down = Math.abs(tabListX - x0) < Math.abs(tabListX - x1) ? 0 : 1;\n // keep getting events when pointer leaves tabs:\n this.#list.setPointerCapture(e.pointerId);\n };\n\n #onpointerup = () => {\n this.down = null;\n };\n\n #triggerFromEvent = (e: PointerEvent) => {\n const { x, y, width, height } = this.#list.getBoundingClientRect();\n const point = {\n horizontal: [e.clientX, y + height / 2] as const,\n vertical: [x + width / 2, e.clientY] as const,\n }[this.#orientation];\n const button = document.elementFromPoint(...point)?.closest(\"button\");\n if (button) {\n const index = this.#triggers.indexOf(button);\n return { index, trigger: button };\n }\n // clamp in case events aren't firing as quickly as the user is moving\n const trigger = {\n horizontal:\n e.clientX > x + width / 2\n ? this.#triggers[this.#triggers.length - 1]\n : this.#triggers[0],\n vertical:\n e.clientY > y + height / 2\n ? this.#triggers[this.#triggers.length - 1]\n : this.#triggers[0],\n }[this.#orientation];\n\n const index = this.#triggers.indexOf(trigger);\n return { index, trigger };\n };\n\n #onpointermove = (e: PointerEvent) => {\n if (e.buttons === 0) {\n this.down = null;\n }\n const { trigger, index } = this.#triggerFromEvent(e);\n if (\n !this.#swipe ||\n this.down === null ||\n (((this.down === 0 && index > this.value[1]) ||\n (this.down === 1 && index < this.value[0])) &&\n !this.#push)\n ) {\n return;\n }\n trigger.focus();\n };\n\n updateValue = (value: RangeValue) => {\n if (\n this.value &&\n value[0] === this.value[0] &&\n value[1] === this.value[1]\n ) {\n return;\n }\n\n if (value[0] > value[1] && !this.#push) {\n return;\n }\n let adjustedValue = value;\n if (value[0] > value[1] && this.#push && this.down !== null) {\n adjustedValue = value.with(\n (this.down + 1) % 2,\n value[this.down]\n ) as RangeValue;\n }\n this.#slidytab.style.transitionDuration =\n this.down !== null && this.#slideToken ? this.transitionDuration : \"0ms\";\n this.value = adjustedValue;\n this.#slideToken = false;\n this.#updateTriggersUI();\n this.#updateIndicatorUI();\n };\n\n #updateIndicatorUI = () => {\n if (!this.value) {\n return;\n }\n this.#slidytab.className = twMerge(\n this.#classes[this.value?.[0] ?? 0].base,\n this.#classes[this.value?.[0] ?? 0].activeIndicator\n );\n const leftRect = this.#triggers[this.value[0]].getBoundingClientRect();\n const rightRect = this.#triggers[this.value[1]].getBoundingClientRect();\n const parentRect = this.#list.getBoundingClientRect();\n const left = `${leftRect.left - parentRect.left}px`;\n const top = `${leftRect.top - parentRect.top}px`;\n const bottom = `${parentRect.bottom - leftRect.bottom}px`;\n const right = `${parentRect.right - rightRect.right}px`;\n Object.assign(this.#slidytab.style, { left, top, bottom, right });\n };\n\n #updateTriggersUI = async () => {\n this.#list.tabIndex = -1;\n this.#dataStateObserver.disconnect();\n\n let firedTrigger: HTMLElement | undefined;\n for (let i = 0; i < this.#triggers.length; i++) {\n const inRange = i >= this.value[0] && i <= this.value[1];\n const trigger = this.#triggers[i];\n if (inRange) {\n trigger.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true }));\n firedTrigger = trigger;\n if (\n this.#triggers\n .filter((item) => item !== trigger)\n .some((item) => item.tabIndex === 0)\n ) {\n trigger.tabIndex = -1;\n }\n break;\n }\n }\n await new Promise(requestAnimationFrame);\n // if (\n // firedTrigger != null &&\n // this.#triggers\n // .filter((item) => item !== firedTrigger)\n // .some((item) => item.tabIndex === 0)\n // ) {\n // firedTrigger.tabIndex = -1;\n // }\n for (let i = 0; i < this.#triggers.length; i++) {\n const inRange = i >= this.value[0] && i <= this.value[1];\n const targetState = inRange ? \"active\" : \"inactive\";\n const trigger = this.#triggers[i];\n if (trigger.dataset.state !== targetState) {\n trigger.dataset.state = targetState;\n }\n }\n this.#dataStateObserver.observe(this.#list, {\n subtree: true,\n attributes: true,\n attributeFilter: [\"data-state\"],\n });\n };\n\n get transitionDuration(): string {\n return `${this.#_transitionDuration}ms`;\n }\n\n set transitionDuration(duration: number) {\n this.#_transitionDuration = duration;\n }\n\n get activeIndex() {\n const activeElement = this.#root.querySelector<HTMLButtonElement>(\n \"button[data-state=active]\"\n );\n if (!activeElement) {\n return -1;\n }\n return this.#triggers.indexOf(activeElement);\n }\n\n #setupSlidytab = () => {\n const slidytab = document.createElement(\"div\");\n const slidytabStyles: Partial<CSSStyleDeclaration> = {\n transitionProperty: \"all\",\n position: \"absolute\",\n height: \"unset\",\n outlineColor: \"transparent\",\n };\n Object.assign(slidytab.style, slidytabStyles);\n this.#list.style.position = \"relative\";\n return slidytab;\n };\n\n #setupResizeObserver = () => {\n const resizeObserver = new ResizeObserver(() => {\n this.#slidytab.style.transitionDuration = \"0ms\";\n this.updateValue(this.value);\n // this.value = this.value;\n });\n resizeObserver.observe(this.#list);\n return resizeObserver;\n };\n\n #getEndpoints = () => {\n const [x0, x1] = this.value;\n return [\n this.#triggers[x0].offsetLeft,\n this.#triggers[x1].offsetLeft + this.#triggers[x1].offsetWidth,\n ];\n };\n\n #tabSolo = (index: number) => {\n for (let i = 0; i < this.#triggers.length; i++) {\n if (i !== index) {\n this.#triggers[i].tabIndex = -1;\n }\n }\n };\n\n #setupDataStateObserver = () => {\n const dataStateObserver = new MutationObserver(\n async (mutationList: MutationRecord[]) => {\n for (const observation of mutationList) {\n if (\n observation.target instanceof HTMLButtonElement &&\n observation.target.dataset.state === \"active\"\n ) {\n const index = this.#triggers.indexOf(observation.target);\n this.#slidytab.className = twMerge(\n this.#classes[this.value?.[index] ?? 0].base,\n this.#classes[this.value?.[index] ?? 0].activeIndicator\n );\n this.#onValueChange?.(\n {\n index,\n activeEdge: this.down,\n trigger: observation.target,\n value: this.value,\n },\n this\n );\n }\n }\n this.#updateTriggersUI();\n }\n );\n return dataStateObserver;\n };\n\n destroyIfDisconnected() {\n // verify lifecycle stuff\n // console.log(\"destroying\");\n if (this.#root.isConnected) {\n return;\n }\n console.log(\"really destroying\");\n this.#list.removeEventListener(\"pointerdown\", this.#onpointerdown);\n this.#list.removeEventListener(\"pointermove\", this.#onpointermove);\n this.#resizeObserver.disconnect();\n this.#dataStateObserver?.disconnect();\n instances.delete(this.#root);\n }\n}\n\n// if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n// document.addEventListener(\"focusin\", (e) => {\n// const el = e.target;\n// console.log(\"FOCUS →\", el.tagName, el.getAttribute(\"role\"), el.tabIndex);\n// });\n// }\n\n// const orig = HTMLElement.prototype.focus;\n// HTMLElement.prototype.focus = function () {\n// console.trace(\"focus() called on\", this);\n// return orig.apply(this);\n// };\n","//#region src/constants.ts\nconst LAYER_DEFAULT = \"default\";\nconst LAYER_PREFLIGHTS = \"preflights\";\nconst LAYER_SHORTCUTS = \"shortcuts\";\nconst LAYER_IMPORTS = \"imports\";\nconst DEFAULT_LAYERS = {\n\t[LAYER_IMPORTS]: -200,\n\t[LAYER_PREFLIGHTS]: -100,\n\t[LAYER_SHORTCUTS]: -10,\n\t[LAYER_DEFAULT]: 0\n};\n\n//#endregion\n//#region src/extractors/split.ts\nconst defaultSplitRE = /[\\\\:]?[\\s'\"`;{}]+/g;\nconst splitWithVariantGroupRE = /([\\\\:]?[\\s\"'`;<>]|:\\(|\\)\"|\\)\\s)/g;\nfunction splitCode(code) {\n\treturn code.split(defaultSplitRE);\n}\nconst extractorSplit = {\n\tname: \"@unocss/core/extractor-split\",\n\torder: 0,\n\textract({ code }) {\n\t\treturn splitCode(code);\n\t}\n};\n\n//#endregion\n//#region src/utils/basic.ts\nfunction toArray(value = []) {\n\treturn Array.isArray(value) ? value : [value];\n}\nfunction uniq(value) {\n\treturn Array.from(new Set(value));\n}\nfunction uniqueBy(array, equalFn) {\n\treturn array.reduce((acc, cur) => {\n\t\tif (acc.findIndex((item) => equalFn(cur, item)) === -1) acc.push(cur);\n\t\treturn acc;\n\t}, []);\n}\nfunction isString(s) {\n\treturn typeof s === \"string\";\n}\n\n//#endregion\n//#region src/utils/countable-set.ts\nvar CountableSet = class extends Set {\n\tconstructor(values) {\n\t\tsuper();\n\t\tthis._map = /* @__PURE__ */ new Map();\n\t\tif (values) for (const key of values) this.add(key);\n\t}\n\tadd(key) {\n\t\tthis._map.set(key, (this._map.get(key) ?? 0) + 1);\n\t\treturn super.add(key);\n\t}\n\tdelete(key) {\n\t\tif (!this._map.has(key)) return false;\n\t\tthis._map.delete(key);\n\t\treturn super.delete(key);\n\t}\n\tclear() {\n\t\tthis._map.clear();\n\t\tsuper.clear();\n\t}\n\tgetCount(key) {\n\t\treturn this._map.get(key) ?? 0;\n\t}\n\tsetCount(key, count) {\n\t\tthis._map.set(key, count);\n\t\treturn super.add(key);\n\t}\n};\nfunction isCountableSet(value) {\n\treturn value instanceof CountableSet;\n}\n\n//#endregion\n//#region src/utils/escape.ts\nfunction escapeRegExp(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n/**\n* CSS Selector Escape\n*/\nfunction escapeSelector(str) {\n\tconst length = str.length;\n\tlet index = -1;\n\tlet codeUnit;\n\tlet result = \"\";\n\tconst firstCodeUnit = str.charCodeAt(0);\n\twhile (++index < length) {\n\t\tcodeUnit = str.charCodeAt(index);\n\t\tif (codeUnit === 0) {\n\t\t\tresult += \"�\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (codeUnit === 37) {\n\t\t\tresult += \"\\\\%\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (codeUnit === 44) {\n\t\t\tresult += \"\\\\,\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (codeUnit >= 1 && codeUnit <= 31 || codeUnit === 127 || index === 0 && codeUnit >= 48 && codeUnit <= 57 || index === 1 && codeUnit >= 48 && codeUnit <= 57 && firstCodeUnit === 45) {\n\t\t\tresult += `\\\\${codeUnit.toString(16)} `;\n\t\t\tcontinue;\n\t\t}\n\t\tif (index === 0 && length === 1 && codeUnit === 45) {\n\t\t\tresult += `\\\\${str.charAt(index)}`;\n\t\t\tcontinue;\n\t\t}\n\t\tif (codeUnit >= 128 || codeUnit === 45 || codeUnit === 95 || codeUnit >= 48 && codeUnit <= 57 || codeUnit >= 65 && codeUnit <= 90 || codeUnit >= 97 && codeUnit <= 122) {\n\t\t\tresult += str.charAt(index);\n\t\t\tcontinue;\n\t\t}\n\t\tresult += `\\\\${str.charAt(index)}`;\n\t}\n\treturn result;\n}\nconst e = escapeSelector;\n\n//#endregion\n//#region src/utils/events.ts\n/**\n* Create event emitter.\n*\n* ```js\n* import { createNanoEvents } from 'nanoevents'\n*\n* class Ticker {\n* constructor() {\n* this.emitter = createNanoEvents()\n* }\n* on(...args) {\n* return this.emitter.on(...args)\n* }\n* tick() {\n* this.emitter.emit('tick')\n* }\n* }\n* ```\n*/\nfunction createNanoEvents() {\n\treturn {\n\t\tevents: {},\n\t\temit(event, ...args) {\n\t\t\t(this.events[event] || []).forEach((i) => i(...args));\n\t\t},\n\t\ton(event, cb) {\n\t\t\t(this.events[event] = this.events[event] || []).push(cb);\n\t\t\treturn () => this.events[event] = (this.events[event] || []).filter((i) => i !== cb);\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/utils/helpers.ts\nconst attributifyRE = /^\\[(.+?)~?=\"(.*)\"\\]$/;\nconst cssIdRE = /\\.(css|postcss|sass|scss|less|stylus|styl)($|\\?)/;\nconst validateFilterRE = /[\\w\\u00A0-\\uFFFF%-?]/;\nfunction isAttributifySelector(selector) {\n\treturn selector.match(attributifyRE);\n}\nfunction isValidSelector(selector = \"\") {\n\treturn validateFilterRE.test(selector);\n}\nfunction normalizeVariant(variant) {\n\treturn typeof variant === \"function\" ? { match: variant } : variant;\n}\nfunction isRawUtil(util) {\n\treturn util.length === 3;\n}\nfunction notNull(value) {\n\treturn value != null;\n}\nfunction noop() {}\n\n//#endregion\n//#region src/utils/layer.ts\nfunction withLayer(layer, rules) {\n\trules.forEach((r) => {\n\t\tif (!r[2]) r[2] = { layer };\n\t\telse r[2].layer = layer;\n\t});\n\treturn rules;\n}\n\n//#endregion\n//#region src/utils/map.ts\nvar TwoKeyMap = class {\n\tconstructor() {\n\t\tthis._map = /* @__PURE__ */ new Map();\n\t}\n\tget(key1, key2) {\n\t\tconst m2 = this._map.get(key1);\n\t\tif (m2) return m2.get(key2);\n\t}\n\tgetFallback(key1, key2, fallback) {\n\t\tlet m2 = this._map.get(key1);\n\t\tif (!m2) {\n\t\t\tm2 = /* @__PURE__ */ new Map();\n\t\t\tthis._map.set(key1, m2);\n\t\t}\n\t\tif (!m2.has(key2)) m2.set(key2, fallback);\n\t\treturn m2.get(key2);\n\t}\n\tset(key1, key2, value) {\n\t\tlet m2 = this._map.get(key1);\n\t\tif (!m2) {\n\t\t\tm2 = /* @__PURE__ */ new Map();\n\t\t\tthis._map.set(key1, m2);\n\t\t}\n\t\tm2.set(key2, value);\n\t\treturn this;\n\t}\n\thas(key1, key2) {\n\t\treturn this._map.get(key1)?.has(key2);\n\t}\n\tdelete(key1, key2) {\n\t\treturn this._map.get(key1)?.delete(key2) || false;\n\t}\n\tdeleteTop(key1) {\n\t\treturn this._map.delete(key1);\n\t}\n\tmap(fn) {\n\t\treturn Array.from(this._map.entries()).flatMap(([k1, m2]) => Array.from(m2.entries()).map(([k2, v]) => {\n\t\t\treturn fn(v, k1, k2);\n\t\t}));\n\t}\n};\nvar BetterMap = class extends Map {\n\tgetFallback(key, fallback) {\n\t\tconst v = this.get(key);\n\t\tif (v === void 0) {\n\t\t\tthis.set(key, fallback);\n\t\t\treturn fallback;\n\t\t}\n\t\treturn v;\n\t}\n\tmap(mapFn) {\n\t\tconst result = [];\n\t\tthis.forEach((v, k) => {\n\t\t\tresult.push(mapFn(v, k));\n\t\t});\n\t\treturn result;\n\t}\n\tflatMap(mapFn) {\n\t\tconst result = [];\n\t\tthis.forEach((v, k) => {\n\t\t\tresult.push(...mapFn(v, k));\n\t\t});\n\t\treturn result;\n\t}\n};\n\n//#endregion\n//#region src/utils/object.ts\nfunction normalizeCSSEntries(obj) {\n\tif (isString(obj)) return obj;\n\treturn (!Array.isArray(obj) ? Object.entries(obj) : obj).filter((i) => i[1] != null);\n}\nfunction normalizeCSSValues(obj) {\n\tif (Array.isArray(obj)) if (obj.find((i) => !Array.isArray(i) || Array.isArray(i[0]))) return obj.map((i) => normalizeCSSEntries(i));\n\telse return [obj];\n\telse return [normalizeCSSEntries(obj)];\n}\nfunction clearIdenticalEntries(entry) {\n\treturn entry.filter(([k, v], idx) => {\n\t\tif (k.startsWith(\"$$\")) return false;\n\t\tfor (let i = idx - 1; i >= 0; i--) if (entry[i][0] === k && entry[i][1] === v) return false;\n\t\treturn true;\n\t});\n}\nconst VirtualKey = \"__virtual_key__\";\nfunction entriesToCss(arr) {\n\tif (arr == null) return \"\";\n\treturn clearIdenticalEntries(arr).map(([key, value]) => value != null && typeof value !== \"function\" ? key !== VirtualKey ? `${key}:${value};` : value : void 0).filter(Boolean).join(\"\");\n}\nfunction isObject(item) {\n\treturn item && typeof item === \"object\" && !Array.isArray(item);\n}\n/**\n* Deep merge two objects\n*/\nfunction mergeDeep(original, patch, mergeArray = false) {\n\tconst o = original;\n\tconst p = patch;\n\tif (Array.isArray(p)) if (mergeArray && Array.isArray(p)) return [...o, ...p];\n\telse return [...p];\n\tconst output = { ...o };\n\tif (isObject(o) && isObject(p)) Object.keys(p).forEach((key) => {\n\t\tif (isObject(o[key]) && isObject(p[key]) || Array.isArray(o[key]) && Array.isArray(p[key])) output[key] = mergeDeep(o[key], p[key], mergeArray);\n\t\telse Object.assign(output, { [key]: p[key] });\n\t});\n\treturn output;\n}\nfunction clone(val) {\n\tlet k, out, tmp;\n\tif (Array.isArray(val)) {\n\t\tout = Array.from({ length: k = val.length });\n\t\twhile (k--) out[k] = (tmp = val[k]) && typeof tmp === \"object\" ? clone(tmp) : tmp;\n\t\treturn out;\n\t}\n\tif (Object.prototype.toString.call(val) === \"[object Object]\") {\n\t\tout = {};\n\t\tfor (k in val) if (k === \"__proto__\") Object.defineProperty(out, k, {\n\t\t\tvalue: clone(val[k]),\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\twritable: true\n\t\t});\n\t\telse out[k] = (tmp = val[k]) && typeof tmp === \"object\" ? clone(tmp) : tmp;\n\t\treturn out;\n\t}\n\treturn val;\n}\nfunction isStaticRule(rule) {\n\treturn isString(rule[0]);\n}\nfunction isStaticShortcut(sc) {\n\treturn isString(sc[0]);\n}\n\n//#endregion\n//#region src/utils/variant-group.ts\nconst regexCache = {};\nfunction makeRegexClassGroup(separators = [\"-\", \":\"]) {\n\tconst key = separators.join(\"|\");\n\tif (!regexCache[key]) regexCache[key] = new RegExp(`((?:[!@<~\\\\w+:_-]|\\\\[&?>?:?\\\\S*\\\\])+?)(${key})\\\\(((?:[~!<>\\\\w\\\\s:/\\\\\\\\,%#.$?-]|\\\\[[^\\\\]]*?\\\\])+?)\\\\)(?!\\\\s*?=>)`, \"gm\");\n\tregexCache[key].lastIndex = 0;\n\treturn regexCache[key];\n}\nfunction parseVariantGroup(str, separators = [\"-\", \":\"], depth = 5) {\n\tconst regexClassGroup = makeRegexClassGroup(separators);\n\tlet hasChanged;\n\tlet content = str.toString();\n\tconst prefixes = /* @__PURE__ */ new Set();\n\tconst groupsByOffset = /* @__PURE__ */ new Map();\n\tdo {\n\t\thasChanged = false;\n\t\tcontent = content.replace(regexClassGroup, (from, pre, sep, body, groupOffset) => {\n\t\t\tif (!separators.includes(sep)) return from;\n\t\t\thasChanged = true;\n\t\t\tprefixes.add(pre + sep);\n\t\t\tconst bodyOffset = groupOffset + pre.length + sep.length + 1;\n\t\t\tconst group = {\n\t\t\t\tlength: from.length,\n\t\t\t\titems: []\n\t\t\t};\n\t\t\tgroupsByOffset.set(groupOffset, group);\n\t\t\tfor (const itemMatch of [...body.matchAll(/\\S+/g)]) {\n\t\t\t\tconst itemOffset = bodyOffset + itemMatch.index;\n\t\t\t\tlet innerItems = groupsByOffset.get(itemOffset)?.items;\n\t\t\t\tif (innerItems) groupsByOffset.delete(itemOffset);\n\t\t\t\telse innerItems = [{\n\t\t\t\t\toffset: itemOffset,\n\t\t\t\t\tlength: itemMatch[0].length,\n\t\t\t\t\tclassName: itemMatch[0]\n\t\t\t\t}];\n\t\t\t\tfor (const item of innerItems) {\n\t\t\t\t\titem.className = item.className === \"~\" ? pre : item.className.replace(/^(!?)(.*)/, `$1${pre}${sep}$2`);\n\t\t\t\t\tgroup.items.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn \"$\".repeat(from.length);\n\t\t});\n\t\tdepth -= 1;\n\t} while (hasChanged && depth);\n\tlet expanded;\n\tif (typeof str === \"string\") {\n\t\texpanded = \"\";\n\t\tlet prevOffset = 0;\n\t\tfor (const [offset, group] of groupsByOffset) {\n\t\t\texpanded += str.slice(prevOffset, offset);\n\t\t\texpanded += group.items.map((item) => item.className).join(\" \");\n\t\t\tprevOffset = offset + group.length;\n\t\t}\n\t\texpanded += str.slice(prevOffset);\n\t} else {\n\t\texpanded = str;\n\t\tfor (const [offset, group] of groupsByOffset) expanded.overwrite(offset, offset + group.length, group.items.map((item) => item.className).join(\" \"));\n\t}\n\treturn {\n\t\tprefixes: Array.from(prefixes),\n\t\thasChanged,\n\t\tgroupsByOffset,\n\t\tget expanded() {\n\t\t\treturn expanded.toString();\n\t\t}\n\t};\n}\nfunction collapseVariantGroup(str, prefixes) {\n\tconst collection = /* @__PURE__ */ new Map();\n\tconst sortedPrefix = prefixes.sort((a, b) => b.length - a.length);\n\treturn str.split(/\\s+/g).map((part) => {\n\t\tconst prefix = sortedPrefix.find((prefix$1) => part.startsWith(prefix$1));\n\t\tif (!prefix) return part;\n\t\tconst body = part.slice(prefix.length);\n\t\tif (collection.has(prefix)) {\n\t\t\tcollection.get(prefix).push(body);\n\t\t\treturn null;\n\t\t} else {\n\t\t\tconst items = [body];\n\t\t\tcollection.set(prefix, items);\n\t\t\treturn {\n\t\t\t\tprefix,\n\t\t\t\titems\n\t\t\t};\n\t\t}\n\t}).filter(notNull).map((i) => {\n\t\tif (typeof i === \"string\") return i;\n\t\treturn `${i.prefix}(${i.items.join(\" \")})`;\n\t}).join(\" \");\n}\nfunction expandVariantGroup(str, separators = [\"-\", \":\"], depth = 5) {\n\tconst res = parseVariantGroup(str, separators, depth);\n\treturn typeof str === \"string\" ? res.expanded : str;\n}\n\n//#endregion\n//#region src/utils/warn.ts\nconst warned = /* @__PURE__ */ new Set();\nfunction warnOnce(msg) {\n\tif (warned.has(msg)) return;\n\tconsole.warn(\"[unocss]\", msg);\n\twarned.add(msg);\n}\n\n//#endregion\n//#region src/config.ts\nfunction resolveShortcuts(shortcuts) {\n\treturn toArray(shortcuts).flatMap((s) => {\n\t\tif (Array.isArray(s)) return [s];\n\t\treturn Object.entries(s);\n\t});\n}\nconst __RESOLVED = \"_uno_resolved\";\n/**\n* Resolve a single preset, nested presets are ignored\n*/\nasync function resolvePreset(presetInput) {\n\tlet preset = typeof presetInput === \"function\" ? await presetInput() : await presetInput;\n\tif (__RESOLVED in preset) return preset;\n\tpreset = { ...preset };\n\tObject.defineProperty(preset, __RESOLVED, {\n\t\tvalue: true,\n\t\tenumerable: false\n\t});\n\tconst shortcuts = preset.shortcuts ? resolveShortcuts(preset.shortcuts) : void 0;\n\tpreset.shortcuts = shortcuts;\n\tif (preset.prefix || preset.layer) {\n\t\tconst apply = (i) => {\n\t\t\tif (!i[2]) i[2] = {};\n\t\t\tconst meta = i[2];\n\t\t\tif (meta.prefix == null && preset.prefix) meta.prefix = toArray(preset.prefix);\n\t\t\tif (meta.layer == null && preset.layer) meta.layer = preset.layer;\n\t\t};\n\t\tshortcuts?.forEach(apply);\n\t\tpreset.rules?.forEach(apply);\n\t}\n\treturn preset;\n}\n/**\n* Resolve presets with nested presets\n*/\nasync function resolvePresets(preset) {\n\tconst root = await resolvePreset(preset);\n\tif (!root.presets) return [root];\n\treturn [root, ...(await Promise.all((root.presets || []).flatMap(toArray).flatMap(resolvePresets))).flat()];\n}\nfunction mergeContentOptions(optionsArray) {\n\tif (optionsArray.length === 0) return {};\n\tconst pipelineIncludes = [];\n\tconst pipelineExcludes = [];\n\tlet pipelineDisabled = false;\n\tconst filesystem = [];\n\tconst inline = [];\n\tfor (const options of optionsArray) {\n\t\tif (options.pipeline === false) {\n\t\t\tpipelineDisabled = true;\n\t\t\tbreak;\n\t\t} else {\n\t\t\tif (options.pipeline?.include) pipelineIncludes.push(options.pipeline.include);\n\t\t\tif (options.pipeline?.exclude) pipelineExcludes.push(options.pipeline.exclude);\n\t\t}\n\t\tif (options.filesystem) filesystem.push(options.filesystem);\n\t\tif (options.inline) inline.push(options.inline);\n\t}\n\tconst mergedContent = { pipeline: pipelineDisabled ? false : {\n\t\tinclude: uniq(mergeFilterPatterns(...pipelineIncludes)),\n\t\texclude: uniq(mergeFilterPatterns(...pipelineExcludes))\n\t} };\n\tif (filesystem.length) mergedContent.filesystem = uniq(filesystem.flat());\n\tif (inline.length) mergedContent.inline = uniq(inline.flat());\n\treturn mergedContent;\n}\nasync function resolveConfig(userConfig = {}, defaults = {}) {\n\tconst config = Object.assign({}, defaults, userConfig);\n\tconst rawPresets = uniqueBy((await Promise.all((config.presets || []).flatMap(toArray).flatMap(resolvePresets))).flat(), (a, b) => a.name === b.name);\n\tconst sortedPresets = [\n\t\t...rawPresets.filter((p) => p.enforce === \"pre\"),\n\t\t...rawPresets.filter((p) => !p.enforce),\n\t\t...rawPresets.filter((p) => p.enforce === \"post\")\n\t];\n\tconst sources = [...sortedPresets, config];\n\tconst sourcesReversed = [...sources].reverse();\n\tconst layers = Object.assign({}, DEFAULT_LAYERS, ...sources.map((i) => i.layers));\n\tfunction getMerged(key) {\n\t\treturn uniq(sources.flatMap((p) => toArray(p[key] || [])));\n\t}\n\tconst extractors = getMerged(\"extractors\");\n\tlet extractorDefault = sourcesReversed.find((i) => i.extractorDefault !== void 0)?.extractorDefault;\n\tif (extractorDefault === void 0) extractorDefault = extractorSplit;\n\tif (extractorDefault && !extractors.includes(extractorDefault)) extractors.unshift(extractorDefault);\n\textractors.sort((a, b) => (a.order || 0) - (b.order || 0));\n\tconst rules = getMerged(\"rules\");\n\tconst rulesSize = rules.length;\n\tconst rulesStaticMap = {};\n\tconst rulesDynamic = [];\n\tfor (const [index, rule] of rules.entries()) {\n\t\tconst meta = rule[2] ?? (rule[2] = {});\n\t\tmeta.__index = index;\n\t\tif (isStaticRule(rule)) toArray(meta.prefix ?? \"\").forEach((prefix) => {\n\t\t\trulesStaticMap[prefix + rule[0]] = rule;\n\t\t});\n\t\telse rulesDynamic.unshift(rule);\n\t}\n\tconst autocomplete = {\n\t\ttemplates: uniq(sources.flatMap((p) => toArray(p.autocomplete?.templates))),\n\t\textractors: sources.flatMap((p) => toArray(p.autocomplete?.extractors)).sort((a, b) => (a.order || 0) - (b.order || 0)),\n\t\tshorthands: mergeAutocompleteShorthands(sources.map((p) => p.autocomplete?.shorthands || {}))\n\t};\n\tlet separators = getMerged(\"separators\");\n\tif (!separators.length) separators = [\":\", \"-\"];\n\tconst content = mergeContentOptions(getMerged(\"content\"));\n\tconst resolved = {\n\t\tmergeSelectors: true,\n\t\twarn: true,\n\t\tsortLayers: (layers$1) => layers$1,\n\t\t...config,\n\t\tblocklist: getMerged(\"blocklist\"),\n\t\tpresets: sortedPresets,\n\t\tenvMode: config.envMode || \"build\",\n\t\tshortcutsLayer: config.shortcutsLayer || \"shortcuts\",\n\t\tlayers,\n\t\ttheme: mergeThemes(sources.map((p) => p.theme)),\n\t\trules,\n\t\trulesSize,\n\t\trulesDynamic,\n\t\trulesStaticMap,\n\t\tpreprocess: getMerged(\"preprocess\"),\n\t\tpostprocess: getMerged(\"postprocess\"),\n\t\tpreflights: getMerged(\"preflights\"),\n\t\tautocomplete,\n\t\tvariants: getMerged(\"variants\").map(normalizeVariant).sort((a, b) => (a.order || 0) - (b.order || 0)),\n\t\tshortcuts: resolveShortcuts(getMerged(\"shortcuts\")).reverse(),\n\t\textractors,\n\t\tsafelist: getMerged(\"safelist\"),\n\t\tseparators,\n\t\tdetails: config.details ?? config.envMode === \"dev\",\n\t\tcontent,\n\t\ttransformers: uniqueBy(getMerged(\"transformers\"), (a, b) => a.name === b.name)\n\t};\n\tconst extendThemes = getMerged(\"extendTheme\");\n\tfor (const extendTheme of extendThemes) resolved.theme = extendTheme(resolved.theme, resolved) || resolved.theme;\n\tfor (const p of sources) p?.configResolved?.(resolved);\n\treturn resolved;\n}\n/**\n* Merge multiple configs into one, later ones have higher priority\n*/\nfunction mergeConfigs(configs) {\n\tconst maybeArrays = [\n\t\t\"shortcuts\",\n\t\t\"preprocess\",\n\t\t\"postprocess\"\n\t];\n\treturn configs.map((config) => Object.entries(config).reduce((acc, [key, value]) => ({\n\t\t...acc,\n\t\t[key]: maybeArrays.includes(key) ? toArray(value) : value\n\t}), {})).reduce(({ theme: themeA, content: contentA, ...a }, { theme: themeB, content: contentB, ...b }) => {\n\t\tconst c = mergeDeep(a, b, true);\n\t\tif (themeA || themeB) c.theme = mergeThemes([themeA, themeB]);\n\t\tif (contentA || contentB) c.content = mergeContentOptions([contentA || {}, contentB || {}]);\n\t\treturn c;\n\t}, {});\n}\nfunction mergeThemes(themes) {\n\treturn themes.map((theme) => theme ? clone(theme) : {}).reduce((a, b) => mergeDeep(a, b), {});\n}\nfunction mergeAutocompleteShorthands(shorthands) {\n\treturn shorthands.reduce((a, b) => {\n\t\tconst rs = {};\n\t\tfor (const key in b) {\n\t\t\tconst value = b[key];\n\t\t\tif (Array.isArray(value)) rs[key] = `(${value.join(\"|\")})`;\n\t\t\telse rs[key] = value;\n\t\t}\n\t\treturn {\n\t\t\t...a,\n\t\t\t...rs\n\t\t};\n\t}, {});\n}\nfunction mergeFilterPatterns(...filterPatterns) {\n\treturn filterPatterns.flatMap(flatternFilterPattern);\n}\nfunction flatternFilterPattern(pattern) {\n\treturn Array.isArray(pattern) ? pattern : pattern ? [pattern] : [];\n}\nfunction definePreset(preset) {\n\treturn preset;\n}\n\n//#endregion\n//#region package.json\nvar version = \"66.5.12\";\n\n//#endregion\n//#region src/generator.ts\nconst symbols = {\n\tshortcutsNoMerge: \"$$symbol-shortcut-no-merge\",\n\tnoMerge: \"$$symbol-no-merge\",\n\tvariants: \"$$symbol-variants\",\n\tparent: \"$$symbol-parent\",\n\tselector: \"$$symbol-selector\",\n\tlayer: \"$$symbol-layer\",\n\tsort: \"$$symbol-sort\",\n\tbody: \"$$symbol-body\"\n};\nvar UnoGeneratorInternal = class UnoGeneratorInternal {\n\tconstructor(userConfig = {}, defaults = {}) {\n\t\tthis.userConfig = userConfig;\n\t\tthis.defaults = defaults;\n\t\tthis.version = version;\n\t\tthis.events = createNanoEvents();\n\t\tthis.config = void 0;\n\t\tthis.cache = /* @__PURE__ */ new Map();\n\t\tthis.blocked = /* @__PURE__ */ new Set();\n\t\tthis.parentOrders = /* @__PURE__ */ new Map();\n\t\tthis.activatedRules = /* @__PURE__ */ new Set();\n\t\tthis.resolveCSSResult = (raw, result, rule, context) => {\n\t\t\tconst entries = normalizeCSSValues(result).filter((i) => i.length);\n\t\t\tif (entries.length) {\n\t\t\t\tif (this.config.details) context.rules.push(rule);\n\t\t\t\tcontext.generator.activatedRules.add(rule);\n\t\t\t\tconst meta = rule[2];\n\t\t\t\treturn entries.map((css) => {\n\t\t\t\t\tif (isString(css)) return [\n\t\t\t\t\t\tmeta.__index,\n\t\t\t\t\t\tcss,\n\t\t\t\t\t\tmeta\n\t\t\t\t\t];\n\t\t\t\t\tlet variants = context.variantHandlers;\n\t\t\t\t\tlet entryMeta = meta;\n\t\t\t\t\tfor (const entry of css) if (entry[0] === symbols.variants) if (typeof entry[1] === \"function\") variants = entry[1](variants) || variants;\n\t\t\t\t\telse variants = [...toArray(entry[1]), ...variants];\n\t\t\t\t\telse if (entry[0] === symbols.parent) variants = [{ parent: entry[1] }, ...variants];\n\t\t\t\t\telse if (entry[0] === symbols.selector) variants = [{ selector: entry[1] }, ...variants];\n\t\t\t\t\telse if (entry[0] === symbols.layer) variants = [{ layer: entry[1] }, ...variants];\n\t\t\t\t\telse if (entry[0] === symbols.sort) entryMeta = {\n\t\t\t\t\t\t...entryMeta,\n\t\t\t\t\t\tsort: entry[1]\n\t\t\t\t\t};\n\t\t\t\t\telse if (entry[0] === symbols.noMerge) entryMeta = {\n\t\t\t\t\t\t...entryMeta,\n\t\t\t\t\t\tnoMerge: entry[1]\n\t\t\t\t\t};\n\t\t\t\t\telse if (entry[0] === symbols.body) entry[0] = VirtualKey;\n\t\t\t\t\treturn [\n\t\t\t\t\t\tmeta.__index,\n\t\t\t\t\t\traw,\n\t\t\t\t\t\tcss,\n\t\t\t\t\t\tentryMeta,\n\t\t\t\t\t\tvariants\n\t\t\t\t\t];\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\tstatic async create(userConfig = {}, defaults = {}) {\n\t\tconst uno = new UnoGeneratorInternal(userConfig, defaults);\n\t\tuno.config = await resolveConfig(uno.userConfig, uno.defaults);\n\t\tuno.events.emit(\"config\", uno.config);\n\t\treturn uno;\n\t}\n\tasync setConfig(userConfig, defaults) {\n\t\tif (!userConfig) return;\n\t\tif (defaults) this.defaults = defaults;\n\t\tthis.userConfig = userConfig;\n\t\tthis.blocked.clear();\n\t\tthis.parentOrders.clear();\n\t\tthis.activatedRules.clear();\n\t\tthis.cache.clear();\n\t\tthis.config = await resolveConfig(userConfig, this.defaults);\n\t\tthis.events.emit(\"config\", this.config);\n\t}\n\tasync applyExtractors(code, id, extracted = /* @__PURE__ */ new Set()) {\n\t\tconst context = {\n\t\t\toriginal: code,\n\t\t\tcode,\n\t\t\tid,\n\t\t\textracted,\n\t\t\tenvMode: this.config.envMode\n\t\t};\n\t\tfor (const extractor of this.config.extractors) {\n\t\t\tconst result = await extractor.extract?.(context);\n\t\t\tif (!result) continue;\n\t\t\tif (isCountableSet(result) && isCountableSet(extracted)) for (const token of result) extracted.setCount(token, extracted.getCount(token) + result.getCount(token));\n\t\t\telse for (const token of result) extracted.add(token);\n\t\t}\n\t\treturn extracted;\n\t}\n\tmakeContext(raw, applied) {\n\t\tconst context = {\n\t\t\trawSelector: raw,\n\t\t\tcurrentSelector: applied[1],\n\t\t\ttheme: this.config.theme,\n\t\t\tgenerator: this,\n\t\t\tsymbols,\n\t\t\tvariantHandlers: applied[2],\n\t\t\tconstructCSS: (...args) => this.constructCustomCSS(context, ...args),\n\t\t\tvariantMatch: applied\n\t\t};\n\t\treturn context;\n\t}\n\tasync parseToken(raw, alias) {\n\t\tif (this.blocked.has(raw)) return;\n\t\tconst cacheKey = `${raw}${alias ? ` ${alias}` : \"\"}`;\n\t\tif (this.cache.has(cacheKey)) return this.cache.get(cacheKey);\n\t\tconst current = this.config.preprocess.reduce((acc, p) => p(acc) ?? acc, raw);\n\t\tif (this.isBlocked(current)) {\n\t\t\tthis.blocked.add(raw);\n\t\t\tthis.cache.set(cacheKey, null);\n\t\t\treturn;\n\t\t}\n\t\tconst variantResults = await this.matchVariants(raw, current);\n\t\tif (variantResults.every((i) => !i || this.isBlocked(i[1]))) {\n\t\t\tthis.blocked.add(raw);\n\t\t\tthis.cache.set(cacheKey, null);\n\t\t\treturn;\n\t\t}\n\t\tconst handleVariantResult = async (matched) => {\n\t\t\tconst context = this.makeContext(raw, [\n\t\t\t\talias || matched[0],\n\t\t\t\tmatched[1],\n\t\t\t\tmatched[2],\n\t\t\t\tmatched[3]\n\t\t\t]);\n\t\t\tif (this.config.details) context.variants = [...matched[3]];\n\t\t\tconst expanded = await this.expandShortcut(context.currentSelector, context);\n\t\t\treturn expanded ? await this.stringifyShortcuts(context.variantMatch, context, expanded[0], expanded[1]) : (await this.parseUtil(context.variantMatch, context))?.flatMap((i) => this.stringifyUtil(i, context)).filter(notNull);\n\t\t};\n\t\tconst result = (await Promise.all(variantResults.map((i) => handleVariantResult(i)))).flat().filter((x) => !!x);\n\t\tif (result?.length) {\n\t\t\tthis.cache.set(cacheKey, result);\n\t\t\treturn result;\n\t\t}\n\t\tthis.cache.set(cacheKey, null);\n\t}\n\tasync generate(input, options = {}) {\n\t\tconst { id, scope, preflights = true, safelist = true, minify = false, extendedInfo = false } = options;\n\t\tconst tokens = isString(input) ? await this.applyExtractors(input, id, extendedInfo ? new CountableSet() : /* @__PURE__ */ new Set()) : Array.isArray(input) ? new Set(input) : input;\n\t\tif (safelist) {\n\t\t\tconst safelistContext = {\n\t\t\t\tgenerator: this,\n\t\t\t\ttheme: this.config.theme\n\t\t\t};\n\t\t\tthis.config.safelist.flatMap((s) => typeof s === \"function\" ? s(safelistContext) : s).forEach((s) => {\n\t\t\t\tconst trimedS = s.trim();\n\t\t\t\tif (trimedS && !tokens.has(trimedS)) tokens.add(trimedS);\n\t\t\t});\n\t\t}\n\t\tconst nl = minify ? \"\" : \"\\n\";\n\t\tconst layerSet = new Set([LAYER_DEFAULT]);\n\t\tconst matched = extendedInfo ? /* @__PURE__ */ new Map() : /* @__PURE__ */ new Set();\n\t\tconst sheet = /* @__PURE__ */ new Map();\n\t\tlet preflightsMap = {};\n\t\tconst tokenPromises = Array.from(tokens).map(async (raw) => {\n\t\t\tif (matched.has(raw)) return;\n\t\t\tconst payload = await this.parseToken(raw);\n\t\t\tif (payload == null) return;\n\t\t\tif (matched instanceof Map) matched.set(raw, {\n\t\t\t\tdata: payload,\n\t\t\t\tcount: isCountableSet(tokens) ? tokens.getCount(raw) : -1\n\t\t\t});\n\t\t\telse matched.add(raw);\n\t\t\tfor (const item of payload) {\n\t\t\t\tconst parent = item[3] || \"\";\n\t\t\t\tconst layer = item[4]?.layer;\n\t\t\t\tif (!sheet.has(parent)) sheet.set(parent, []);\n\t\t\t\tsheet.get(parent).push(item);\n\t\t\t\tif (layer) layerSet.add(layer);\n\t\t\t}\n\t\t});\n\t\tawait Promise.all(tokenPromises);\n\t\tawait (async () => {\n\t\t\tif (!preflights) return;\n\t\t\tconst preflightContext = {\n\t\t\t\tgenerator: this,\n\t\t\t\ttheme: this.config.theme\n\t\t\t};\n\t\t\tconst preflightLayerSet = /* @__PURE__ */ new Set([]);\n\t\t\tthis.config.preflights.forEach(({ layer = LAYER_PREFLIGHTS }) => {\n\t\t\t\tlayerSet.add(layer);\n\t\t\t\tpreflightLayerSet.add(layer);\n\t\t\t});\n\t\t\tpreflightsMap = Object.fromEntries(await Promise.all(Array.from(preflightLayerSet).map(async (layer) => {\n\t\t\t\treturn [layer, (await Promise.all(this.config.preflights.filter((i) => (i.layer || LAYER_PREFLIGHTS) === layer).map(async (i) => await i.getCSS(preflightContext)))).filter(Boolean).join(nl)];\n\t\t\t})));\n\t\t})();\n\t\tconst layers = this.config.sortLayers(Array.from(layerSet).sort((a, b) => (this.config.layers[a] ?? 0) - (this.config.layers[b] ?? 0) || a.localeCompare(b)));\n\t\tconst layerCache = {};\n\t\tconst outputCssLayers = this.config.outputToCssLayers;\n\t\tconst getLayerAlias = (layer) => {\n\t\t\tlet alias = layer;\n\t\t\tif (typeof outputCssLayers === \"object\") alias = outputCssLayers.cssLayerName?.(layer);\n\t\t\treturn alias === null ? null : alias ?? layer;\n\t\t};\n\t\tconst getLayer = (layer = LAYER_DEFAULT) => {\n\t\t\tif (layerCache[layer]) return layerCache[layer];\n\t\t\tlet css = Array.from(sheet).sort((a, b) => (this.parentOrders.get(a[0]) ?? 0) - (this.parentOrders.get(b[0]) ?? 0) || a[0]?.localeCompare(b[0] || \"\") || 0).map(([parent, items]) => {\n\t\t\t\tconst size = items.length;\n\t\t\t\tconst sorted = items.filter((i) => (i[4]?.layer || LAYER_DEFAULT) === layer).sort((a, b) => {\n\t\t\t\t\treturn a[0] - b[0] || (a[4]?.sort || 0) - (b[4]?.sort || 0) || a[5]?.currentSelector?.localeCompare(b[5]?.currentSelector ?? \"\") || a[1]?.localeCompare(b[1] || \"\") || a[2]?.localeCompare(b[2] || \"\") || 0;\n\t\t\t\t}).map(([, selector, body, , meta, , variantNoMerge]) => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t[[(selector ? applyScope(selector, scope) : selector) ?? \"\", meta?.sort ?? 0]],\n\t\t\t\t\t\tbody,\n\t\t\t\t\t\t!!(variantNoMerge ?? meta?.noMerge)\n\t\t\t\t\t];\n\t\t\t\t});\n\t\t\t\tif (!sorted.length) return void 0;\n\t\t\t\tconst ruleLines = sorted.reverse().map(([selectorSortPair, body, noMerge], idx) => {\n\t\t\t\t\tif (!noMerge && this.config.mergeSelectors) for (let i = idx + 1; i < size; i++) {\n\t\t\t\t\t\tconst current = sorted[i];\n\t\t\t\t\t\tif (current && !current[2] && (selectorSortPair && current[0] || selectorSortPair == null && current[0] == null) && current[1] === body) {\n\t\t\t\t\t\t\tif (selectorSortPair && current[0]) current[0].push(...selectorSortPair);\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst selectors = selectorSortPair ? uniq(selectorSortPair.sort((a, b) => a[1] - b[1] || a[0]?.localeCompare(b[0] || \"\") || 0).map((pair) => pair[0]).filter(Boolean)) : [];\n\t\t\t\t\treturn selectors.length ? `${selectors.join(`,${nl}`)}{${body}}` : body;\n\t\t\t\t}).filter(Boolean);\n\t\t\t\tconst rules = Array.from(new Set(ruleLines)).reverse().join(nl);\n\t\t\t\tif (!parent) return rules;\n\t\t\t\tconst parents = parent.split(\" $$ \");\n\t\t\t\treturn `${parents.join(\"{\")}{${nl}${rules}${nl}${\"}\".repeat(parents.length)}`;\n\t\t\t}).filter(Boolean).join(nl);\n\t\t\tif (preflights) css = [preflightsMap[layer], css].filter(Boolean).join(nl);\n\t\t\tlet alias;\n\t\t\tif (outputCssLayers && css) {\n\t\t\t\talias = getLayerAlias(layer);\n\t\t\t\tif (alias !== null) css = `@layer ${alias}{${nl}${css}${nl}}`;\n\t\t\t}\n\t\t\tconst layerMark = minify ? \"\" : `/* layer: ${layer}${alias && alias !== layer ? `, alias: ${alias}` : \"\"} */${nl}`;\n\t\t\treturn layerCache[layer] = css ? layerMark + css : \"\";\n\t\t};\n\t\tconst getLayers = (includes = layers, excludes) => {\n\t\t\tconst layers$1 = includes.filter((i) => !excludes?.includes(i));\n\t\t\treturn [outputCssLayers && layers$1.length > 0 ? `@layer ${layers$1.map(getLayerAlias).filter(notNull).join(\", \")};` : void 0, ...layers$1.map((i) => getLayer(i) || \"\")].filter(Boolean).join(nl);\n\t\t};\n\t\tconst setLayer = async (layer, callback) => {\n\t\t\tconst content = await callback(getLayer(layer));\n\t\t\tlayerCache[layer] = content;\n\t\t\treturn content;\n\t\t};\n\t\treturn {\n\t\t\tget css() {\n\t\t\t\treturn getLayers();\n\t\t\t},\n\t\t\tlayers,\n\t\t\tmatched,\n\t\t\tgetLayers,\n\t\t\tgetLayer,\n\t\t\tsetLayer\n\t\t};\n\t}\n\tasync matchVariants(raw, current) {\n\t\tconst context = {\n\t\t\trawSelector: raw,\n\t\t\ttheme: this.config.theme,\n\t\t\tgenerator: this\n\t\t};\n\t\tconst match = async (result) => {\n\t\t\tlet applied = true;\n\t\t\tconst [, , handlers, variants] = result;\n\t\t\twhile (applied) {\n\t\t\t\tapplied = false;\n\t\t\t\tconst processed = result[1];\n\t\t\t\tfor (const v of this.config.variants) {\n\t\t\t\t\tif (!v.multiPass && variants.has(v)) continue;\n\t\t\t\t\tlet handler = await v.match(processed, context);\n\t\t\t\t\tif (!handler) continue;\n\t\t\t\t\tif (isString(handler)) {\n\t\t\t\t\t\tif (handler === processed) continue;\n\t\t\t\t\t\thandler = { matcher: handler };\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(handler)) {\n\t\t\t\t\t\tif (!handler.length) continue;\n\t\t\t\t\t\tif (handler.length === 1) handler = handler[0];\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (v.multiPass) throw new Error(\"multiPass can not be used together with array return variants\");\n\t\t\t\t\t\t\tconst clones = handler.map((h) => {\n\t\t\t\t\t\t\t\tconst _processed = h.matcher ?? processed;\n\t\t\t\t\t\t\t\tconst _handlers = [h, ...handlers];\n\t\t\t\t\t\t\t\tconst _variants = new Set(variants);\n\t\t\t\t\t\t\t\t_variants.add(v);\n\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\tresult[0],\n\t\t\t\t\t\t\t\t\t_processed,\n\t\t\t\t\t\t\t\t\t_handlers,\n\t\t\t\t\t\t\t\t\t_variants\n\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn (await Promise.all(clones.map((c) => match(c)))).flat();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tresult[1] = handler.matcher ?? processed;\n\t\t\t\t\thandlers.unshift(handler);\n\t\t\t\t\tvariants.add(v);\n\t\t\t\t\tapplied = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!applied) break;\n\t\t\t\tif (handlers.length > 500) throw new Error(`Too many variants applied to \"${raw}\"`);\n\t\t\t}\n\t\t\treturn [result];\n\t\t};\n\t\treturn await match([\n\t\t\traw,\n\t\t\tcurrent || raw,\n\t\t\t[],\n\t\t\t/* @__PURE__ */ new Set()\n\t\t]);\n\t}\n\tapplyVariants(parsed, variantHandlers = parsed[4], raw = parsed[1]) {\n\t\tconst variantContextResult = variantHandlers.slice().sort((a, b) => (a.order || 0) - (b.order || 0)).reduceRight((previous, v) => (input) => {\n\t\t\tconst entries = v.body?.(input.entries) || input.entries;\n\t\t\tconst parents = Array.isArray(v.parent) ? v.parent : [v.parent, void 0];\n\t\t\tconst selector = v.selector?.(input.selector, entries);\n\t\t\treturn (v.handle ?? defaultVariantHandler)({\n\t\t\t\t...input,\n\t\t\t\tentries,\n\t\t\t\tselector: selector || input.selector,\n\t\t\t\tparent: parents[0] || input.parent,\n\t\t\t\tparentOrder: parents[1] || input.parentOrder,\n\t\t\t\tlayer: v.layer || input.layer,\n\t\t\t\tsort: v.sort || input.sort\n\t\t\t}, previous);\n\t\t}, (input) => input)({\n\t\t\tprefix: \"\",\n\t\t\tselector: toEscapedSelector(raw),\n\t\t\tpseudo: \"\",\n\t\t\tentries: parsed[2]\n\t\t});\n\t\tconst { parent, parentOrder } = variantContextResult;\n\t\tif (parent != null && parentOrder != null) this.parentOrders.set(parent, parentOrder);\n\t\tconst obj = {\n\t\t\tselector: [\n\t\t\t\tvariantContextResult.prefix,\n\t\t\t\tvariantContextResult.selector,\n\t\t\t\tvariantContextResult.pseudo\n\t\t\t].join(\"\"),\n\t\t\tentries: variantContextResult.entries,\n\t\t\tparent,\n\t\t\tlayer: variantContextResult.layer,\n\t\t\tsort: variantContextResult.sort,\n\t\t\tnoMerge: variantContextResult.noMerge\n\t\t};\n\t\treturn this.config.postprocess.reduce((utilities, p) => {\n\t\t\tconst result = [];\n\t\t\tfor (const util of utilities) {\n\t\t\t\tconst processed = p(util);\n\t\t\t\tif (Array.isArray(processed)) result.push(...processed.filter(notNull));\n\t\t\t\telse result.push(processed || util);\n\t\t\t}\n\t\t\treturn result;\n\t\t}, [obj]);\n\t}\n\tconstructCustomCSS(context, body, overrideSelector) {\n\t\tconst normalizedBody = normalizeCSSEntries(body);\n\t\tif (isString(normalizedBody)) return normalizedBody;\n\t\treturn this.applyVariants([\n\t\t\t0,\n\t\t\toverrideSelector || context.rawSelector,\n\t\t\tnormalizedBody,\n\t\t\tvoid 0,\n\t\t\tcontext.variantHandlers\n\t\t]).map(({ selector, entries, parent }) => {\n\t\t\tconst cssBody = `${selector}{${entriesToCss(entries)}}`;\n\t\t\tif (parent) return `${parent}{${cssBody}}`;\n\t\t\treturn cssBody;\n\t\t}).join(\"\");\n\t}\n\tasync parseUtil(input, context, internal = false, shortcutPrefix) {\n\t\tconst variantResults = isString(input) ? await this.matchVariants(input) : [input];\n\t\tconst parse = async ([raw, processed, variantHandlers]) => {\n\t\t\tif (this.config.details) context.rules = context.rules ?? [];\n\t\t\tconst scopeContext = {\n\t\t\t\t...context,\n\t\t\t\tvariantHandlers\n\t\t\t};\n\t\t\tconst staticMatch = this.config.rulesStaticMap[processed];\n\t\t\tif (staticMatch) {\n\t\t\t\tif (staticMatch[1] && (internal || !staticMatch[2]?.internal)) return this.resolveCSSResult(raw, staticMatch[1], staticMatch, scopeContext);\n\t\t\t}\n\t\t\tfor (const rule of this.config.rulesDynamic) {\n\t\t\t\tconst [matcher, handler, meta] = rule;\n\t\t\t\tif (meta?.internal && !internal) continue;\n\t\t\t\tlet unprefixed = processed;\n\t\t\t\tif (meta?.prefix) {\n\t\t\t\t\tconst prefixes = toArray(meta.prefix);\n\t\t\t\t\tif (shortcutPrefix) {\n\t\t\t\t\t\tconst shortcutPrefixes = toArray(shortcutPrefix);\n\t\t\t\t\t\tif (!prefixes.some((i) => shortcutPrefixes.includes(i))) continue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst prefix = prefixes.find((i) => processed.startsWith(i));\n\t\t\t\t\t\tif (prefix == null) continue;\n\t\t\t\t\t\tunprefixed = processed.slice(prefix.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst match = unprefixed.match(matcher);\n\t\t\t\tif (!match) continue;\n\t\t\t\tlet result = await handler(match, scopeContext);\n\t\t\t\tif (!result) continue;\n\t\t\t\tif (typeof result !== \"string\") {\n\t\t\t\t\tif (Symbol.asyncIterator in result) {\n\t\t\t\t\t\tconst entries = [];\n\t\t\t\t\t\tfor await (const r of result) if (r) entries.push(r);\n\t\t\t\t\t\tresult = entries;\n\t\t\t\t\t} else if (Symbol.iterator in result && !Array.isArray(result)) result = Array.from(result).filter(notNull);\n\t\t\t\t}\n\t\t\t\tconst resolvedResult = this.resolveCSSResult(raw, result, rule, scopeContext);\n\t\t\t\tif (resolvedResult) return resolvedResult;\n\t\t\t}\n\t\t};\n\t\tconst parsed = (await Promise.all(variantResults.map((i) => parse(i)))).flat().filter((x) => !!x);\n\t\tif (!parsed.length) return void 0;\n\t\treturn parsed;\n\t}\n\tstringifyUtil(parsed, context) {\n\t\tif (!parsed) return;\n\t\tif (isRawUtil(parsed)) return [[\n\t\t\tparsed[0],\n\t\t\tvoid 0,\n\t\t\tparsed[1],\n\t\t\tvoid 0,\n\t\t\tparsed[2],\n\t\t\tthis.config.details ? context : void 0,\n\t\t\tvoid 0\n\t\t]];\n\t\tconst utilities = this.applyVariants(parsed);\n\t\tconst result = [];\n\t\tfor (const util of utilities) {\n\t\t\tconst { selector, entries, parent, layer: variantLayer, sort: variantSort, noMerge } = util;\n\t\t\tconst body = entriesToCss(entries);\n\t\t\tif (!body) continue;\n\t\t\tconst { layer: metaLayer, sort: metaSort, ...meta } = parsed[3] ?? {};\n\t\t\tconst ruleMeta = {\n\t\t\t\t...meta,\n\t\t\t\tlayer: variantLayer ?? metaLayer,\n\t\t\t\tsort: variantSort ?? metaSort\n\t\t\t};\n\t\t\tresult.push([\n\t\t\t\tparsed[0],\n\t\t\t\tselector,\n\t\t\t\tbody,\n\t\t\t\tparent,\n\t\t\t\truleMeta,\n\t\t\t\tthis.config.details ? context : void 0,\n\t\t\t\tnoMerge\n\t\t\t]);\n\t\t}\n\t\treturn result;\n\t}\n\tasync expandShortcut(input, context, depth = 5) {\n\t\tif (depth === 0) return;\n\t\tconst recordShortcut = this.config.details ? (s) => {\n\t\t\tcontext.shortcuts = context.shortcuts ?? [];\n\t\t\tcontext.shortcuts.push(s);\n\t\t} : noop;\n\t\tlet meta;\n\t\tlet result;\n\t\tlet stringResult;\n\t\tlet inlineResult;\n\t\tfor (const s of this.config.shortcuts) {\n\t\t\tlet unprefixed = input;\n\t\t\tif (s[2]?.prefix) {\n\t\t\t\tconst prefix = toArray(s[2].prefix).find((i) => input.startsWith(i));\n\t\t\t\tif (prefix == null) continue;\n\t\t\t\tunprefixed = input.slice(prefix.length);\n\t\t\t}\n\t\t\tif (isStaticShortcut(s)) {\n\t\t\t\tif (s[0] === unprefixed) {\n\t\t\t\t\tmeta = meta || s[2];\n\t\t\t\t\tresult = s[1];\n\t\t\t\t\trecordShortcut(s);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst match = unprefixed.match(s[0]);\n\t\t\t\tif (match) result = s[1](match, context);\n\t\t\t\tif (result) {\n\t\t\t\t\tmeta = meta || s[2];\n\t\t\t\t\trecordShortcut(s);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (result) {\n\t\t\tstringResult = uniq(toArray(result).filter(isString).map((s) => expandVariantGroup(s.trim()).split(/\\s+/g)).flat());\n\t\t\tinlineResult = toArray(result).filter((i) => !isString(i)).map((i) => ({\n\t\t\t\thandles: [],\n\t\t\t\tvalue: i\n\t\t\t}));\n\t\t}\n\t\tif (!result) {\n\t\t\tconst matched = isString(input) ? await this.matchVariants(input) : [input];\n\t\t\tfor (const match of matched) {\n\t\t\t\tconst [raw, inputWithoutVariant, handles] = match;\n\t\t\t\tif (raw !== inputWithoutVariant) {\n\t\t\t\t\tconst expanded = await this.expandShortcut(inputWithoutVariant, context, depth - 1);\n\t\t\t\t\tif (expanded) {\n\t\t\t\t\t\tstringResult = expanded[0].filter(isString).map((item) => raw.replace(inputWithoutVariant, item));\n\t\t\t\t\t\tinlineResult = expanded[0].filter((i) => !isString(i)).map((item) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\thandles: [...item.handles, ...handles],\n\t\t\t\t\t\t\t\tvalue: item.value\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!stringResult?.length && !inlineResult?.length) return;\n\t\treturn [[await Promise.all(toArray(stringResult).map(async (s) => (await this.expandShortcut(s, context, depth - 1))?.[0] || [s])), inlineResult].flat(2).filter((x) => !!x), meta];\n\t}\n\tasync stringifyShortcuts(parent, context, expanded, meta = { layer: this.config.shortcutsLayer }) {\n\t\tconst layerMap = new BetterMap();\n\t\tconst parsed = (await Promise.all(uniq(expanded).map(async (i) => {\n\t\t\tconst result = isString(i) ? await this.parseUtil(i, context, true, meta.prefix) : [[\n\t\t\t\tNumber.POSITIVE_INFINITY,\n\t\t\t\t\"{inline}\",\n\t\t\t\tnormalizeCSSEntries(i.value),\n\t\t\t\tvoid 0,\n\t\t\t\ti.handles\n\t\t\t]];\n\t\t\tif (!result && this.config.warn) warnOnce(`unmatched utility \"${i}\" in shortcut \"${parent[1]}\"`);\n\t\t\treturn result || [];\n\t\t}))).flat(1).filter(Boolean).sort((a, b) => a[0] - b[0]);\n\t\tconst [raw, , parentVariants] = parent;\n\t\tconst rawStringifiedUtil = [];\n\t\tfor (const item of parsed) {\n\t\t\tif (isRawUtil(item)) {\n\t\t\t\trawStringifiedUtil.push([\n\t\t\t\t\titem[0],\n\t\t\t\t\tvoid 0,\n\t\t\t\t\titem[1],\n\t\t\t\t\tvoid 0,\n\t\t\t\t\titem[2],\n\t\t\t\t\tcontext,\n\t\t\t\t\tvoid 0\n\t\t\t\t]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isNoMerge = Object.fromEntries(item[2])[symbols.shortcutsNoMerge];\n\t\t\tconst variants = [...item[4], ...!isNoMerge ? parentVariants : []];\n\t\t\tfor (const { selector, entries, parent: parent$1, sort, noMerge, layer } of this.applyVariants(item, variants, raw)) layerMap.getFallback(layer ?? meta.layer, new TwoKeyMap()).getFallback(selector, parent$1, [[], item[0]])[0].push([\n\t\t\t\tentries,\n\t\t\t\t!!(noMerge ?? item[3]?.noMerge),\n\t\t\t\tsort ?? 0\n\t\t\t]);\n\t\t}\n\t\treturn rawStringifiedUtil.concat(layerMap.flatMap((selectorMap, layer) => selectorMap.map(([e$1, index], selector, joinedParents) => {\n\t\t\tconst stringify = (flatten, noMerge, entrySortPair) => {\n\t\t\t\tconst maxSort = Math.max(...entrySortPair.map((e$2) => e$2[1]));\n\t\t\t\tconst entriesList = entrySortPair.map((e$2) => e$2[0]);\n\t\t\t\treturn (flatten ? [entriesList.flat(1)] : entriesList).map((entries) => {\n\t\t\t\t\tconst body = entriesToCss(entries);\n\t\t\t\t\tif (body) return [\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tselector,\n\t\t\t\t\t\tbody,\n\t\t\t\t\t\tjoinedParents,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...meta,\n\t\t\t\t\t\t\tnoMerge,\n\t\t\t\t\t\t\tsort: maxSort,\n\t\t\t\t\t\t\tlayer\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tvoid 0\n\t\t\t\t\t];\n\t\t\t\t});\n\t\t\t};\n\t\t\treturn [[e$1.filter(([, noMerge]) => noMerge).map(([entries, , sort]) => [entries, sort]), true], [e$1.filter(([, noMerge]) => !noMerge).map(([entries, , sort]) => [entries, sort]), false]].map(([e$2, noMerge]) => [...stringify(false, noMerge, e$2.filter(([entries]) => entries.some((entry) => entry[0] === symbols.shortcutsNoMerge))), ...stringify(true, noMerge, e$2.filter(([entries]) => entries.every((entry) => entry[0] !== symbols.shortcutsNoMerge)))]);\n\t\t}).flat(2).filter(Boolean)));\n\t}\n\tisBlocked(raw) {\n\t\treturn !raw || this.config.blocklist.map((e$1) => Array.isArray(e$1) ? e$1[0] : e$1).some((e$1) => typeof e$1 === \"function\" ? e$1(raw) : isString(e$1) ? e$1 === raw : e$1.test(raw));\n\t}\n\tgetBlocked(raw) {\n\t\tconst rule = this.config.blocklist.find((e$1) => {\n\t\t\tconst v = Array.isArray(e$1) ? e$1[0] : e$1;\n\t\t\treturn typeof v === \"function\" ? v(raw) : isString(v) ? v === raw : v.test(raw);\n\t\t});\n\t\treturn rule ? Array.isArray(rule) ? rule : [rule, void 0] : void 0;\n\t}\n};\nvar UnoGenerator = class extends UnoGeneratorInternal {\n\t/**\n\t* @deprecated `new UnoGenerator` is deprecated, please use `createGenerator()` instead\n\t*/\n\tconstructor(userConfig = {}, defaults = {}) {\n\t\tsuper(userConfig, defaults);\n\t\tconsole.warn(\"`new UnoGenerator()` is deprecated, please use `createGenerator()` instead\");\n\t}\n};\nasync function createGenerator(config, defaults) {\n\treturn await UnoGeneratorInternal.create(config, defaults);\n}\nconst regexScopePlaceholder = /\\s\\$\\$\\s+/g;\nfunction hasScopePlaceholder(css) {\n\treturn regexScopePlaceholder.test(css);\n}\nfunction applyScope(css, scope) {\n\tif (hasScopePlaceholder(css)) return css.replace(regexScopePlaceholder, scope ? ` ${scope} ` : \" \");\n\telse return scope ? `${scope} ${css}` : css;\n}\nconst attributifyRe = /^\\[(.+?)(~?=)\"(.*)\"\\]$/;\nfunction toEscapedSelector(raw) {\n\tif (attributifyRe.test(raw)) return raw.replace(attributifyRe, (_, n, s, i) => `[${e(n)}${s}\"${e(i)}\"]`);\n\treturn `.${e(raw)}`;\n}\nfunction defaultVariantHandler(input, next) {\n\treturn next(input);\n}\n\n//#endregion\nexport { BetterMap, CountableSet, DEFAULT_LAYERS, LAYER_DEFAULT, LAYER_IMPORTS, LAYER_PREFLIGHTS, LAYER_SHORTCUTS, TwoKeyMap, UnoGenerator, VirtualKey, attributifyRE, clearIdenticalEntries, clone, collapseVariantGroup, createGenerator, createNanoEvents, cssIdRE, defaultSplitRE, definePreset, e, entriesToCss, escapeRegExp, escapeSelector, expandVariantGroup, extractorSplit as extractorDefault, extractorSplit, hasScopePlaceholder, isAttributifySelector, isCountableSet, isObject, isRawUtil, isStaticRule, isStaticShortcut, isString, isValidSelector, makeRegexClassGroup, mergeConfigs, mergeDeep, noop, normalizeCSSEntries, normalizeCSSValues, normalizeVariant, notNull, parseVariantGroup, regexScopePlaceholder, resolveConfig, resolvePreset, resolvePresets, resolveShortcuts, splitWithVariantGroupRE, symbols, toArray, toEscapedSelector, uniq, uniqueBy, validateFilterRE, warnOnce, withLayer };","import { escapeSelector, toEscapedSelector } from \"@unocss/core\";\ndeclare global {\n var sheet: CSSStyleSheet;\n}\n\nexport const categorizeClasses = (triggers: HTMLButtonElement[]) => {\n const textClasses =\n /(^|:)(text|font|color|tracking|leading|decoration|underline|line-through|overline|uppercase|lowercase|capitalize)\\b/;\n const activeVariant = \"data-[state=active]:\";\n const triggerClasses = [];\n for (const trigger of triggers) {\n const classList = [...trigger.classList];\n const activeIndicator = classList\n .filter((item) => item.includes(activeVariant))\n .map((item) => item.replace(activeVariant, \"\"));\n const base = classList.filter(\n (item) => !item.includes(activeVariant) || item.match(textClasses)\n );\n triggerClasses.push({ activeIndicator, base });\n }\n return triggerClasses;\n};\n\nconst inserted = new Set<string>();\nexport const safelistGeneralizedClasses = (el: HTMLElement) => {\n const activeSelector = '[data-state=\"active\"]';\n const activePrefix = \"data-[state=active]:\";\n\n const classes = [...el.classList]\n .filter((item) => item.startsWith(activePrefix))\n .map(toEscapedSelector);\n\n if (typeof document !== \"undefined\") {\n try {\n [...document.styleSheets].forEach((styleSheet) => {\n [...styleSheet.cssRules]\n .filter(\n (item) =>\n // for firefox\n item instanceof CSSStyleRule &&\n activeSelector !== item.selectorText.trim() &&\n classes.some((prefix) => item.selectorText.startsWith(prefix))\n )\n .forEach(({ cssText }) => {\n const newRule = cssText\n .replaceAll(escapeSelector(activePrefix), \"\")\n .replaceAll(activeSelector, \"\");\n if (!inserted.has(newRule)) {\n inserted.add(newRule);\n globalThis.sheet.insertRule(newRule);\n }\n });\n });\n } catch {}\n }\n};\n\nexport const getCurrentTargetX = (e: PointerEvent) =>\n e.clientX - (e.currentTarget as Element).getBoundingClientRect().left;\n\nexport const getCurrentTargetY = (e: PointerEvent) =>\n e.clientY - (e.currentTarget as Element).getBoundingClientRect().top;\n","import {\n Slidytabs,\n Update,\n RangeValue,\n SlidytabOptions,\n instances,\n} from \"./slidytabs.js\";\n\nexport type { RangeValue };\n\ntype RefTarget = Element | { $el: Element } | string | null;\ntype RefCallback = (node: RefTarget, refs?: unknown) => void;\n\nconst setupWithOptions = (ref: RefTarget, options: SlidytabOptions) => {\n const elements =\n typeof ref === \"string\"\n ? // For adding in a <script> e.g. starwind\n document.querySelectorAll(ref)\n : ref instanceof Element\n ? [ref]\n : ref?.$el instanceof Element\n ? [ref.$el]\n : [];\n\n if (typeof ref === \"string\" && elements.length === 0) {\n throw new Error(`Selector \"${ref}\" yielded no elements`);\n }\n\n const instances: Slidytabs[] = [];\n for (const el of elements) {\n if (!(el instanceof HTMLElement)) {\n continue;\n }\n const instance = getInstance(el);\n instance.setOptions(options);\n instances.push(instance);\n }\n\n return () => {\n for (const instance of instances) {\n instance.destroyIfDisconnected();\n }\n };\n};\n\n// TODO none of these should be optional\n\nconst getInstance = (el: HTMLElement) => {\n let instance = instances.get(el);\n if (instance === undefined) {\n instance = new Slidytabs(el);\n instances.set(el, instance);\n }\n return instance;\n};\n\nexport interface TabOptions {\n value?: number;\n onValueChange?: (value: number) => void;\n}\nexport interface SliderOptions {\n value?: number;\n onValueChange?: (value: number) => void;\n sticky?: number;\n}\nexport interface RangeOptions {\n value: [number, number];\n onValueChange?: (value: [number, number]) => void;\n push?: boolean;\n}\n\nexport const tabs =\n ({ value, onValueChange }: TabOptions = {}): RefCallback =>\n (root) => {\n const controlled = value != null || onValueChange != null;\n return setupWithOptions(root, {\n push: false,\n swipe: false,\n value: value != null ? [value, value] : undefined,\n onValueChange: ({ index }, instance) => {\n if (controlled) {\n onValueChange?.(index);\n } else {\n instance.updateValue([index, index]);\n }\n },\n });\n };\n\nexport const slider =\n ({ value, onValueChange, sticky }: SliderOptions = {}): RefCallback =>\n (root) => {\n const controlled = value != null || onValueChange != null;\n const stickyValue = (value: number) =>\n [sticky ?? value, value].toSorted((a, b) => a - b) as RangeValue;\n return setupWithOptions(root, {\n push: true,\n swipe: true,\n value: value != null ? stickyValue(value) : undefined,\n onValueChange: ({ index }, instance) => {\n if (controlled) {\n onValueChange?.(index);\n } else {\n instance.updateValue(stickyValue(index));\n }\n },\n });\n };\n\nexport const range =\n ({ value, onValueChange, push = false }: RangeOptions): RefCallback =>\n (root) => {\n return setupWithOptions(root, {\n push,\n swipe: true,\n value,\n onValueChange: ({ index, activeEdge, value }: Update, instance) => {\n if (activeEdge === null) {\n return;\n }\n const newValue = value.with(activeEdge, index) as RangeValue;\n onValueChange?.(newValue);\n },\n });\n };\n\nif (typeof document !== \"undefined\" && !globalThis.sheet) {\n const sheet = new CSSStyleSheet();\n globalThis.sheet = sheet;\n document.adoptedStyleSheets.push(sheet);\n}\n\n// https://github.com/huntabyte/bits-ui/blob/main/packages/bits-ui/src/lib/bits/tabs/tabs.svelte.ts\n// https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/src/tabs.tsx\n// https://github.com/unovue/reka-ui/blob/v2/packages/core/src/Tabs/TabsTrigger.vue\n// https://github.com/starwind-ui/starwind-ui/blob/main/packages/core/src/components/tabs/Tabs.astro\n// https://github.com/kobaltedev/kobalte/blob/main/packages/core/src/tabs/tabs-trigger.tsx\n\n// Parity notes:\n// (shadcn-react, with or without slidytabs)\n// focus ring on keyboard input works in chrome but not firefox/safari\n"],"mappings":"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","names":["e","e","index","instances","value"]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "slidytabs",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "tsup src/index.ts --watch --dts --format esm --splitting false --clean --sourcemap",
7
+ "build": "tsup src/index.ts --dts --format esm --splitting false --clean --sourcemap"
8
+ },
9
+ "devDependencies": {
10
+ "@eslint/js": "^9.39.2",
11
+ "@unocss/core": "^66.5.12",
12
+ "biome": "^0.3.3",
13
+ "eslint": "^9.39.2",
14
+ "eslint-plugin-react": "^7.37.5",
15
+ "globals": "^16.5.0",
16
+ "tsup": "^8.5.1",
17
+ "typescript": "^5.9.3",
18
+ "typescript-eslint": "^8.51.0"
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ }
29
+ },
30
+ "peerDependencies": {
31
+ "tailwind-merge": "^3"
32
+ },
33
+ "description": "A DOM-level utility for animating shadcn Tabs"
34
+ }