slidytabs 0.1.0 → 0.1.2
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/LICENSE +21 -0
- package/dist/index.js +100 -30
- package/dist/index.js.map +1 -1
- package/package.json +23 -7
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Justin Francos
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.js
CHANGED
|
@@ -75,32 +75,37 @@ var safelistGeneralizedClasses = (el) => {
|
|
|
75
75
|
const activeSelector = '[data-state="active"]';
|
|
76
76
|
const activePrefix = "data-[state=active]:";
|
|
77
77
|
const classes = [...el.classList].filter((item) => item.startsWith(activePrefix)).map(toEscapedSelector);
|
|
78
|
-
|
|
78
|
+
for (const sheet of document.styleSheets) {
|
|
79
79
|
try {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
(
|
|
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, "");
|
|
80
|
+
walkRules(sheet.cssRules, (rule) => {
|
|
81
|
+
if (rule instanceof CSSStyleRule && activeSelector !== rule.selectorText.trim() && classes.some((prefix) => rule.selectorText.startsWith(prefix))) {
|
|
82
|
+
const newRule = rule.cssText.replaceAll(escapeSelector(activePrefix), "").replaceAll(activeSelector, "");
|
|
88
83
|
if (!inserted.has(newRule)) {
|
|
89
84
|
inserted.add(newRule);
|
|
90
85
|
globalThis.sheet.insertRule(newRule);
|
|
91
86
|
}
|
|
92
|
-
}
|
|
87
|
+
}
|
|
93
88
|
});
|
|
94
89
|
} catch {
|
|
95
90
|
}
|
|
96
91
|
}
|
|
97
92
|
};
|
|
93
|
+
function walkRules(rules, visit) {
|
|
94
|
+
for (const rule of rules) {
|
|
95
|
+
if (rule instanceof CSSStyleRule) {
|
|
96
|
+
visit(rule);
|
|
97
|
+
} else if ("cssRules" in rule) {
|
|
98
|
+
walkRules(rule.cssRules, visit);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
98
102
|
var getCurrentTargetX = (e2) => e2.clientX - e2.currentTarget.getBoundingClientRect().left;
|
|
99
103
|
|
|
100
104
|
// src/slidytabs.ts
|
|
101
105
|
var defaultTransitionDuration = 0.2 * 1e3;
|
|
102
106
|
var instances = /* @__PURE__ */ new WeakMap();
|
|
103
107
|
var Slidytabs = class {
|
|
108
|
+
#source;
|
|
104
109
|
#push = false;
|
|
105
110
|
#root;
|
|
106
111
|
#swipe;
|
|
@@ -116,6 +121,7 @@ var Slidytabs = class {
|
|
|
116
121
|
#list;
|
|
117
122
|
#triggers;
|
|
118
123
|
#slideToken = false;
|
|
124
|
+
#lastTriggered = null;
|
|
119
125
|
constructor(root) {
|
|
120
126
|
this.#root = root;
|
|
121
127
|
this.#extractFromDOM();
|
|
@@ -124,6 +130,9 @@ var Slidytabs = class {
|
|
|
124
130
|
safelistGeneralizedClasses(trigger);
|
|
125
131
|
}
|
|
126
132
|
this.#slidytab = this.#setupSlidytab();
|
|
133
|
+
this.#list.addEventListener("mousedown", this.#stopPropagation, true);
|
|
134
|
+
this.#list.addEventListener("click", this.#stopPropagation, true);
|
|
135
|
+
this.#list.addEventListener("focus", this.#onfocus, true);
|
|
127
136
|
this.#list.addEventListener("pointerdown", this.#onpointerdown, true);
|
|
128
137
|
this.#list.addEventListener("pointerup", this.#onpointerup);
|
|
129
138
|
this.#list.addEventListener("pointermove", this.#onpointermove, true);
|
|
@@ -142,10 +151,17 @@ var Slidytabs = class {
|
|
|
142
151
|
this.#list.append(this.#slidytab);
|
|
143
152
|
this.#dataStateObserver = this.#setupDataStateObserver();
|
|
144
153
|
}
|
|
145
|
-
setOptions = ({
|
|
154
|
+
setOptions = ({
|
|
155
|
+
value,
|
|
156
|
+
onValueChange,
|
|
157
|
+
swipe,
|
|
158
|
+
push,
|
|
159
|
+
source
|
|
160
|
+
}) => {
|
|
146
161
|
this.#onValueChange = onValueChange;
|
|
147
162
|
this.#swipe = swipe;
|
|
148
163
|
this.#push = push;
|
|
164
|
+
this.#source = source;
|
|
149
165
|
if (!value) {
|
|
150
166
|
onValueChange == null ? void 0 : onValueChange(
|
|
151
167
|
{
|
|
@@ -174,7 +190,34 @@ var Slidytabs = class {
|
|
|
174
190
|
}
|
|
175
191
|
this.#orientation = orientation;
|
|
176
192
|
};
|
|
177
|
-
#
|
|
193
|
+
#onfocus = (e2) => {
|
|
194
|
+
var _a;
|
|
195
|
+
if (!(e2.target instanceof HTMLButtonElement)) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (this.#source === "shadcn") {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const index = this.#triggers.indexOf(e2.target);
|
|
202
|
+
(_a = this.#onValueChange) == null ? void 0 : _a.call(
|
|
203
|
+
this,
|
|
204
|
+
{
|
|
205
|
+
index,
|
|
206
|
+
activeEdge: this.down,
|
|
207
|
+
// trigger: e.target,
|
|
208
|
+
value: this.value
|
|
209
|
+
},
|
|
210
|
+
this
|
|
211
|
+
);
|
|
212
|
+
};
|
|
213
|
+
#stopPropagation = (e2) => {
|
|
214
|
+
if (this.#source === "shadcn") {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
e2.stopPropagation();
|
|
218
|
+
};
|
|
219
|
+
#onpointerdown = async (e2) => {
|
|
220
|
+
var _a;
|
|
178
221
|
this.#slideToken = true;
|
|
179
222
|
this.#extractFromDOM();
|
|
180
223
|
const { index, trigger } = this.#triggerFromEvent(e2);
|
|
@@ -185,9 +228,20 @@ var Slidytabs = class {
|
|
|
185
228
|
const [x0, x1] = this.#getEndpoints();
|
|
186
229
|
this.down = Math.abs(tabListX - x0) < Math.abs(tabListX - x1) ? 0 : 1;
|
|
187
230
|
this.#list.setPointerCapture(e2.pointerId);
|
|
231
|
+
if (this.#source === "shadcn") {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
(_a = this.#onValueChange) == null ? void 0 : _a.call(
|
|
235
|
+
this,
|
|
236
|
+
{
|
|
237
|
+
index,
|
|
238
|
+
activeEdge: this.down,
|
|
239
|
+
value: this.value
|
|
240
|
+
},
|
|
241
|
+
this
|
|
242
|
+
);
|
|
188
243
|
};
|
|
189
244
|
#onpointerup = () => {
|
|
190
|
-
this.down = null;
|
|
191
245
|
};
|
|
192
246
|
#triggerFromEvent = (e2) => {
|
|
193
247
|
var _a;
|
|
@@ -209,6 +263,7 @@ var Slidytabs = class {
|
|
|
209
263
|
return { index, trigger };
|
|
210
264
|
};
|
|
211
265
|
#onpointermove = (e2) => {
|
|
266
|
+
var _a;
|
|
212
267
|
if (e2.buttons === 0) {
|
|
213
268
|
this.down = null;
|
|
214
269
|
}
|
|
@@ -216,9 +271,24 @@ var Slidytabs = class {
|
|
|
216
271
|
if (!this.#swipe || this.down === null || (this.down === 0 && index > this.value[1] || this.down === 1 && index < this.value[0]) && !this.#push) {
|
|
217
272
|
return;
|
|
218
273
|
}
|
|
219
|
-
|
|
274
|
+
if (this.#source === "slidytabs") {
|
|
275
|
+
(_a = this.#onValueChange) == null ? void 0 : _a.call(
|
|
276
|
+
this,
|
|
277
|
+
{
|
|
278
|
+
index,
|
|
279
|
+
activeEdge: this.down,
|
|
280
|
+
value: this.value
|
|
281
|
+
},
|
|
282
|
+
this
|
|
283
|
+
);
|
|
284
|
+
} else {
|
|
285
|
+
trigger.focus();
|
|
286
|
+
}
|
|
220
287
|
};
|
|
221
288
|
updateValue = (value) => {
|
|
289
|
+
if (!value || value[0] === -1) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
222
292
|
if (this.value && value[0] === this.value[0] && value[1] === this.value[1]) {
|
|
223
293
|
return;
|
|
224
294
|
}
|
|
@@ -259,24 +329,13 @@ var Slidytabs = class {
|
|
|
259
329
|
#updateTriggersUI = async () => {
|
|
260
330
|
this.#list.tabIndex = -1;
|
|
261
331
|
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
332
|
await new Promise(requestAnimationFrame);
|
|
276
333
|
for (let i = 0; i < this.#triggers.length; i++) {
|
|
277
334
|
const inRange = i >= this.value[0] && i <= this.value[1];
|
|
278
335
|
const targetState = inRange ? "active" : "inactive";
|
|
279
336
|
const trigger = this.#triggers[i];
|
|
337
|
+
if (this.value.includes(i)) {
|
|
338
|
+
}
|
|
280
339
|
if (trigger.dataset.state !== targetState) {
|
|
281
340
|
trigger.dataset.state = targetState;
|
|
282
341
|
}
|
|
@@ -323,6 +382,9 @@ var Slidytabs = class {
|
|
|
323
382
|
return resizeObserver;
|
|
324
383
|
};
|
|
325
384
|
#getEndpoints = () => {
|
|
385
|
+
if (!this.value) {
|
|
386
|
+
return [0, 0];
|
|
387
|
+
}
|
|
326
388
|
const [x0, x1] = this.value;
|
|
327
389
|
return [
|
|
328
390
|
this.#triggers[x0].offsetLeft,
|
|
@@ -340,6 +402,9 @@ var Slidytabs = class {
|
|
|
340
402
|
const dataStateObserver = new MutationObserver(
|
|
341
403
|
async (mutationList) => {
|
|
342
404
|
var _a, _b, _c;
|
|
405
|
+
if (this.#source === "slidytabs") {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
343
408
|
for (const observation of mutationList) {
|
|
344
409
|
if (observation.target instanceof HTMLButtonElement && observation.target.dataset.state === "active") {
|
|
345
410
|
const index = this.#triggers.indexOf(observation.target);
|
|
@@ -352,7 +417,6 @@ var Slidytabs = class {
|
|
|
352
417
|
{
|
|
353
418
|
index,
|
|
354
419
|
activeEdge: this.down,
|
|
355
|
-
trigger: observation.target,
|
|
356
420
|
value: this.value
|
|
357
421
|
},
|
|
358
422
|
this
|
|
@@ -362,10 +426,14 @@ var Slidytabs = class {
|
|
|
362
426
|
this.#updateTriggersUI();
|
|
363
427
|
}
|
|
364
428
|
);
|
|
429
|
+
dataStateObserver.observe(this.#list, {
|
|
430
|
+
subtree: true,
|
|
431
|
+
attributes: true,
|
|
432
|
+
attributeFilter: ["data-state"]
|
|
433
|
+
});
|
|
365
434
|
return dataStateObserver;
|
|
366
435
|
};
|
|
367
436
|
destroyIfDisconnected() {
|
|
368
|
-
var _a;
|
|
369
437
|
if (this.#root.isConnected) {
|
|
370
438
|
return;
|
|
371
439
|
}
|
|
@@ -373,7 +441,6 @@ var Slidytabs = class {
|
|
|
373
441
|
this.#list.removeEventListener("pointerdown", this.#onpointerdown);
|
|
374
442
|
this.#list.removeEventListener("pointermove", this.#onpointermove);
|
|
375
443
|
this.#resizeObserver.disconnect();
|
|
376
|
-
(_a = this.#dataStateObserver) == null ? void 0 : _a.disconnect();
|
|
377
444
|
instances.delete(this.#root);
|
|
378
445
|
}
|
|
379
446
|
};
|
|
@@ -413,6 +480,7 @@ var getInstance = (el) => {
|
|
|
413
480
|
var tabs = ({ value, onValueChange } = {}) => (root) => {
|
|
414
481
|
const controlled = value != null || onValueChange != null;
|
|
415
482
|
return setupWithOptions(root, {
|
|
483
|
+
source: "shadcn",
|
|
416
484
|
push: false,
|
|
417
485
|
swipe: false,
|
|
418
486
|
value: value != null ? [value, value] : void 0,
|
|
@@ -429,6 +497,7 @@ var slider = ({ value, onValueChange, sticky } = {}) => (root) => {
|
|
|
429
497
|
const controlled = value != null || onValueChange != null;
|
|
430
498
|
const stickyValue = (value2) => [sticky ?? value2, value2].toSorted((a, b) => a - b);
|
|
431
499
|
return setupWithOptions(root, {
|
|
500
|
+
source: sticky == null ? "shadcn" : "slidytabs",
|
|
432
501
|
push: true,
|
|
433
502
|
swipe: true,
|
|
434
503
|
value: value != null ? stickyValue(value) : void 0,
|
|
@@ -443,6 +512,7 @@ var slider = ({ value, onValueChange, sticky } = {}) => (root) => {
|
|
|
443
512
|
};
|
|
444
513
|
var range = ({ value, onValueChange, push = false }) => (root) => {
|
|
445
514
|
return setupWithOptions(root, {
|
|
515
|
+
source: "slidytabs",
|
|
446
516
|
push,
|
|
447
517
|
swipe: true,
|
|
448
518
|
value,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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"]}
|
|
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\ntype ClickSource = \"shadcn\" | \"slidytabs\";\nexport const instances = new WeakMap<HTMLElement, Slidytabs>();\nexport type RangeValue = [start: number, end: number];\nexport interface SlidytabsOptions {\n value?: RangeValue;\n onValueChange?: (update: Update, instance: Slidytabs) => void;\n swipe: boolean;\n push: boolean;\n source: ClickSource;\n}\nexport interface Update {\n activeEdge: number | null;\n index: number;\n value: RangeValue;\n}\n\nexport class Slidytabs {\n #source!: ClickSource;\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 #lastTriggered: HTMLElement | null = null;\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(\"mousedown\", this.#stopPropagation, true);\n this.#list.addEventListener(\"click\", this.#stopPropagation, true);\n this.#list.addEventListener(\"focus\", this.#onfocus, true);\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 = ({\n value,\n onValueChange,\n swipe,\n push,\n source,\n }: SlidytabsOptions) => {\n this.#onValueChange = onValueChange;\n this.#swipe = swipe;\n this.#push = push;\n this.#source = source;\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 #onfocus = (e: FocusEvent) => {\n if (!(e.target instanceof HTMLButtonElement)) {\n return;\n }\n if (this.#source === \"shadcn\") {\n return;\n }\n const index = this.#triggers.indexOf(e.target);\n // e.stopPropagation();\n // e.preventDefault();\n this.#onValueChange?.(\n {\n index,\n activeEdge: this.down,\n // trigger: e.target,\n value: this.value,\n },\n this\n );\n };\n\n #stopPropagation = (e: MouseEvent) => {\n if (this.#source === \"shadcn\") {\n return;\n }\n e.stopPropagation();\n };\n\n #onpointerdown = async (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 test out vertical range\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 if (this.#source === \"shadcn\") {\n return;\n }\n this.#onValueChange?.(\n {\n index,\n activeEdge: this.down,\n value: this.value,\n },\n this\n );\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 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 if (this.#source === \"slidytabs\") {\n this.#onValueChange?.(\n {\n index,\n activeEdge: this.down,\n value: this.value,\n },\n this\n );\n } else {\n trigger.focus();\n }\n };\n\n updateValue = (value: RangeValue) => {\n // guard against no default value and not controlled by slidy\n if (!value || value[0] === -1) {\n return;\n }\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 // focus goes to wrong component without this\n this.#list.tabIndex = -1;\n this.#dataStateObserver.disconnect();\n await new Promise(requestAnimationFrame);\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 // trigger.tabIndex = this.value.includes(i) ? 0 : -1;\n if (this.value.includes(i)) {\n // trigger.focus();\n // trigger.dispatchEvent(new FocusEvent(\"focus\", { bubbles: true }));\n // trigger.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true }));\n // trigger.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n }\n\n if (trigger.dataset.state !== targetState) {\n // trigger.tabIndex = targetState === \"active\" ? 0 : 1;\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 // guard against no default value and not controlled by slidy\n if (!this.value) {\n return [0, 0];\n }\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 if (this.#source === \"slidytabs\") {\n return;\n }\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 value: this.value,\n },\n this\n );\n }\n }\n this.#updateTriggersUI();\n }\n );\n dataStateObserver.observe(this.#list, {\n subtree: true,\n attributes: true,\n attributeFilter: [\"data-state\"],\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 // console.log(triggerClasses);\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 for (const sheet of document.styleSheets) {\n try {\n walkRules(sheet.cssRules, (rule) => {\n if (\n rule instanceof CSSStyleRule &&\n activeSelector !== rule.selectorText.trim() &&\n classes.some((prefix) => rule.selectorText.startsWith(prefix))\n ) {\n const newRule = rule.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\nfunction walkRules(rules: CSSRuleList, visit: (rule: CSSStyleRule) => void) {\n for (const rule of rules) {\n if (rule instanceof CSSStyleRule) {\n visit(rule);\n } else if (\"cssRules\" in rule) {\n walkRules(rule.cssRules as CSSRuleList, visit);\n }\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 SlidytabsOptions,\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: SlidytabsOptions) => {\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 source: \"shadcn\",\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 source: sticky == null ? \"shadcn\" : \"slidytabs\",\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 source: \"slidytabs\",\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
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "slidytabs",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"license": "MIT",
|
|
4
5
|
"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
6
|
"devDependencies": {
|
|
10
7
|
"@eslint/js": "^9.39.2",
|
|
11
8
|
"@unocss/core": "^66.5.12",
|
|
@@ -30,5 +27,24 @@
|
|
|
30
27
|
"peerDependencies": {
|
|
31
28
|
"tailwind-merge": "^3"
|
|
32
29
|
},
|
|
33
|
-
"description": "A DOM-level utility for animating shadcn Tabs"
|
|
34
|
-
|
|
30
|
+
"description": "A DOM-level utility for animating shadcn Tabs",
|
|
31
|
+
"homepage": "https://slidytabs.dev",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/jfrancos/slidytabs.git",
|
|
35
|
+
"directory": "packages/slidytabs"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"shadcn",
|
|
39
|
+
"shadcn-ui",
|
|
40
|
+
"animate",
|
|
41
|
+
"animation",
|
|
42
|
+
"slide",
|
|
43
|
+
"tabs",
|
|
44
|
+
"slider"
|
|
45
|
+
],
|
|
46
|
+
"scripts": {
|
|
47
|
+
"dev": "tsup src/index.ts --watch --dts --format esm --splitting false --clean --sourcemap",
|
|
48
|
+
"build": "tsup src/index.ts --dts --format esm --splitting false --clean --sourcemap"
|
|
49
|
+
}
|
|
50
|
+
}
|