slidytabs 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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
- if (typeof document !== "undefined") {
78
+ for (const sheet of document.styleSheets) {
79
79
  try {
80
- [...document.styleSheets].forEach((styleSheet) => {
81
- [...styleSheet.cssRules].filter(
82
- (item) => (
83
- // for firefox
84
- item instanceof CSSStyleRule && activeSelector !== item.selectorText.trim() && classes.some((prefix) => item.selectorText.startsWith(prefix))
85
- )
86
- ).forEach(({ cssText }) => {
87
- const newRule = cssText.replaceAll(escapeSelector(activePrefix), "").replaceAll(activeSelector, "");
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 = ({ value, onValueChange, swipe, push }) => {
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
- #onpointerdown = (e2) => {
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
- trigger.focus();
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.0",
3
+ "version": "0.1.1",
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,15 @@
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
+ "scripts": {
38
+ "dev": "tsup src/index.ts --watch --dts --format esm --splitting false --clean --sourcemap",
39
+ "build": "tsup src/index.ts --dts --format esm --splitting false --clean --sourcemap"
40
+ }
41
+ }