@easemate/web-kit 0.3.3 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -17
- package/build/decorators.cjs +7 -7
- package/build/decorators.cjs.map +1 -1
- package/build/decorators.js +7 -7
- package/build/decorators.js.map +1 -1
- package/build/elements.cjs +1902 -747
- package/build/elements.cjs.map +1 -1
- package/build/elements.d.cts +51 -2
- package/build/elements.d.ts +51 -2
- package/build/elements.js +1899 -746
- package/build/elements.js.map +1 -1
- package/build/{index-NzGpn7ai.d.cts → index-BKwMPyPy.d.cts} +3 -0
- package/build/{index-NzGpn7ai.d.ts → index-BKwMPyPy.d.ts} +3 -0
- package/build/index.cjs +1894 -706
- package/build/index.cjs.map +1 -1
- package/build/index.d.cts +4 -4
- package/build/index.d.ts +4 -4
- package/build/index.js +1889 -703
- package/build/index.js.map +1 -1
- package/build/{init-CaP7khA2.d.ts → init-C4Q5EEAr.d.ts} +1 -1
- package/build/{init-DmqoRv6_.d.cts → init-yLajTNMT.d.cts} +1 -1
- package/build/jsx.cjs.map +1 -1
- package/build/jsx.d.cts +21 -1
- package/build/jsx.d.ts +21 -1
- package/build/jsx.js.map +1 -1
- package/build/react.cjs +433 -334
- package/build/react.cjs.map +1 -1
- package/build/react.d.cts +4 -4
- package/build/react.d.ts +4 -4
- package/build/react.js +433 -334
- package/build/react.js.map +1 -1
- package/build/register.cjs +2279 -1128
- package/build/register.cjs.map +1 -1
- package/build/register.js +2260 -1109
- package/build/register.js.map +1 -1
- package/build/{registry-YCv1Ctoe.d.cts → registry-GVSJPmus.d.cts} +1 -0
- package/build/{registry-YCv1Ctoe.d.ts → registry-GVSJPmus.d.ts} +1 -0
- package/build/theme.cjs +34 -3
- package/build/theme.cjs.map +1 -1
- package/build/theme.d.cts +2 -2
- package/build/theme.d.ts +2 -2
- package/build/theme.js +34 -3
- package/build/theme.js.map +1 -1
- package/build/utils.cjs +3 -3
- package/build/utils.cjs.map +1 -1
- package/build/utils.js +3 -3
- package/build/utils.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,6 +41,7 @@ A modern, framework-agnostic UI kit of web components for building animation con
|
|
|
41
41
|
- [Usage Examples](#usage-examples)
|
|
42
42
|
- [Basic Controls](#basic-controls)
|
|
43
43
|
- [Panel Component](#panel-component)
|
|
44
|
+
- [Folder Component](#folder-component)
|
|
44
45
|
- [State Component](#state-component)
|
|
45
46
|
- [Combined Panel + State](#combined-panel--state)
|
|
46
47
|
- [JavaScript Integration](#javascript-integration)
|
|
@@ -63,6 +64,7 @@ A modern, framework-agnostic UI kit of web components for building animation con
|
|
|
63
64
|
- [Controller API](#controller-api)
|
|
64
65
|
- [Package Exports](#package-exports)
|
|
65
66
|
- [Panel API](#panel-api)
|
|
67
|
+
- [Folder API](#folder-api)
|
|
66
68
|
- [State API](#state-api)
|
|
67
69
|
- [Accessibility](#accessibility)
|
|
68
70
|
- [SSR Support](#ssr-support)
|
|
@@ -344,8 +346,7 @@ function AnimationControls() {
|
|
|
344
346
|
);
|
|
345
347
|
|
|
346
348
|
return (
|
|
347
|
-
<ease-panel ref={panelRef}>
|
|
348
|
-
<span slot="headline">Animation</span>
|
|
349
|
+
<ease-panel ref={panelRef} headline="Animation">
|
|
349
350
|
<ease-state ref={stateRef}>
|
|
350
351
|
<ease-field label="Duration">
|
|
351
352
|
<ease-slider name="duration" value="1" min="0" max="5" step="0.1" />
|
|
@@ -464,6 +465,7 @@ const handleChange = createEventHandler<ControlChangeEvent>((e) => {
|
|
|
464
465
|
| Component | Tag | Description |
|
|
465
466
|
|-----------|-----|-------------|
|
|
466
467
|
| Panel | `<ease-panel>` | Visual container with tabs, header, and footer |
|
|
468
|
+
| Folder | `<ease-folder>` | Collapsible container for grouping controls |
|
|
467
469
|
| State | `<ease-state>` | State aggregator for controls (no visual styling) |
|
|
468
470
|
| Field | `<ease-field>` | Label + control wrapper |
|
|
469
471
|
| Button | `<ease-button>` | Action button |
|
|
@@ -512,6 +514,7 @@ All icon components follow the pattern `<ease-icon-*>`. All icons are typed in J
|
|
|
512
514
|
|-----|-------------|
|
|
513
515
|
| `ease-icon-chevron` | Animated chevron (expands/collapses) |
|
|
514
516
|
| `ease-icon-clear` | Animated clear/X icon |
|
|
517
|
+
| `ease-icon-folder` | Animated folder open/close icon |
|
|
515
518
|
| `ease-icon-grid` | Animated grid icon |
|
|
516
519
|
| `ease-icon-loading` | Animated loading spinner |
|
|
517
520
|
| `ease-icon-snap` | Animated snap indicator |
|
|
@@ -536,15 +539,14 @@ The `<ease-panel>` component provides the visual container with optional tabs, h
|
|
|
536
539
|
|
|
537
540
|
```html
|
|
538
541
|
<!-- Simple panel with headline -->
|
|
539
|
-
<ease-panel>
|
|
540
|
-
<span slot="headline">Settings</span>
|
|
542
|
+
<ease-panel headline="Settings">
|
|
541
543
|
<div>
|
|
542
544
|
<!-- Your content here -->
|
|
543
545
|
</div>
|
|
544
546
|
</ease-panel>
|
|
545
547
|
|
|
546
548
|
<!-- Panel with tabs -->
|
|
547
|
-
<ease-panel active-tab="0">
|
|
549
|
+
<ease-panel headline="Animation" active-tab="0">
|
|
548
550
|
<div slot="tab-general" data-tab-label="General">
|
|
549
551
|
<!-- General settings -->
|
|
550
552
|
</div>
|
|
@@ -554,8 +556,7 @@ The `<ease-panel>` component provides the visual container with optional tabs, h
|
|
|
554
556
|
</ease-panel>
|
|
555
557
|
|
|
556
558
|
<!-- Panel with header actions -->
|
|
557
|
-
<ease-panel>
|
|
558
|
-
<span slot="headline">Controls</span>
|
|
559
|
+
<ease-panel headline="Controls">
|
|
559
560
|
<button slot="actions" title="Settings">
|
|
560
561
|
<ease-icon-settings></ease-icon-settings>
|
|
561
562
|
</button>
|
|
@@ -566,6 +567,40 @@ The `<ease-panel>` component provides the visual container with optional tabs, h
|
|
|
566
567
|
<ease-button>Save</ease-button>
|
|
567
568
|
</div>
|
|
568
569
|
</ease-panel>
|
|
570
|
+
|
|
571
|
+
<!-- Panel with max-height (scrollable) -->
|
|
572
|
+
<ease-panel headline="Scrollable Panel" max-height="250px">
|
|
573
|
+
<!-- Content will scroll when it exceeds 250px -->
|
|
574
|
+
</ease-panel>
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
### Folder Component
|
|
578
|
+
|
|
579
|
+
The `<ease-folder>` component provides a collapsible container for grouping controls. Click the header to toggle open/closed.
|
|
580
|
+
|
|
581
|
+
```html
|
|
582
|
+
<!-- Basic folder (closed by default) -->
|
|
583
|
+
<ease-folder headline="Transform">
|
|
584
|
+
<ease-field label="X">
|
|
585
|
+
<ease-number-input name="x" value="0"></ease-number-input>
|
|
586
|
+
</ease-field>
|
|
587
|
+
<ease-field label="Y">
|
|
588
|
+
<ease-number-input name="y" value="0"></ease-number-input>
|
|
589
|
+
</ease-field>
|
|
590
|
+
</ease-folder>
|
|
591
|
+
|
|
592
|
+
<!-- Open folder -->
|
|
593
|
+
<ease-folder open headline="Appearance">
|
|
594
|
+
<ease-field label="Color">
|
|
595
|
+
<ease-color-input name="color" value="#3b82f6"></ease-color-input>
|
|
596
|
+
</ease-field>
|
|
597
|
+
</ease-folder>
|
|
598
|
+
|
|
599
|
+
<!-- Folder with max-height (scrollable with fade masks) -->
|
|
600
|
+
<ease-folder headline="Animation" max-height="150px">
|
|
601
|
+
<!-- Many fields here will scroll with fade effect -->
|
|
602
|
+
</ease-folder>
|
|
603
|
+
|
|
569
604
|
```
|
|
570
605
|
|
|
571
606
|
### State Component
|
|
@@ -595,9 +630,7 @@ The `<ease-state>` component aggregates state from child controls. It can be use
|
|
|
595
630
|
For a complete control panel experience, combine `<ease-panel>` with `<ease-state>`:
|
|
596
631
|
|
|
597
632
|
```html
|
|
598
|
-
<ease-panel>
|
|
599
|
-
<span slot="headline">Animation Controls</span>
|
|
600
|
-
|
|
633
|
+
<ease-panel headline="Animation Controls">
|
|
601
634
|
<button slot="actions" title="Reset">
|
|
602
635
|
<ease-icon-minus></ease-icon-minus>
|
|
603
636
|
</button>
|
|
@@ -631,7 +664,7 @@ For a complete control panel experience, combine `<ease-panel>` with `<ease-stat
|
|
|
631
664
|
When using tabs with state, place the `<ease-state>` inside each tab:
|
|
632
665
|
|
|
633
666
|
```html
|
|
634
|
-
<ease-panel active-tab="0">
|
|
667
|
+
<ease-panel headline="Animation" active-tab="0">
|
|
635
668
|
<button slot="actions" title="Reset">
|
|
636
669
|
<ease-icon-minus></ease-icon-minus>
|
|
637
670
|
</button>
|
|
@@ -1074,12 +1107,12 @@ setThemeName('light', { colorScheme: 'light' });
|
|
|
1074
1107
|
| Category | Variables |
|
|
1075
1108
|
|----------|-----------|
|
|
1076
1109
|
| Typography | `--ease-font-family`, `--ease-font-mono`, `--ease-font-size`, `--ease-line-height` |
|
|
1077
|
-
| Panel | `--ease-panel-max-width`, `--ease-panel-padding`, `--ease-panel-radius`, `--ease-panel-background`, `--ease-panel-border-color`, `--ease-panel-shadow` |
|
|
1078
|
-
| Panel Title | `--ease-panel-title-font-size`, `--ease-panel-title-font-weight`, `--ease-panel-title-
|
|
1079
|
-
| Panel Tabs | `--ease-panel-tab-font-size`, `--ease-panel-tab-font-weight`, `--ease-panel-tab-
|
|
1110
|
+
| Panel | `--ease-panel-max-width`, `--ease-panel-padding`, `--ease-panel-radius`, `--ease-panel-background`, `--ease-panel-border-color`, `--ease-panel-shadow`, `--ease-panel-gap`, `--ease-panel-header-spacing`, `--ease-panel-fade-size` |
|
|
1111
|
+
| Panel Title | `--ease-panel-title-font-size`, `--ease-panel-title-font-weight`, `--ease-panel-title-color` |
|
|
1112
|
+
| Panel Tabs | `--ease-panel-tab-font-size`, `--ease-panel-tab-font-weight`, `--ease-panel-tab-color`, `--ease-panel-tab-color-hover`, `--ease-panel-tab-color-active`, `--ease-panel-tab-background-active`, `--ease-panel-tab-radius` |
|
|
1080
1113
|
| Panel Actions | `--ease-panel-action-icon-size` |
|
|
1081
1114
|
| Panel Footer | `--ease-panel-footer-padding` |
|
|
1082
|
-
|
|
|
1115
|
+
| Folder | `--ease-folder-padding`, `--ease-folder-radius`, `--ease-folder-border-color`, `--ease-folder-background`, `--ease-folder-shadow`, `--ease-folder-gap`, `--ease-folder-title-font-size`, `--ease-folder-title-font-weight`, `--ease-folder-title-color`, `--ease-folder-icon-color`, `--ease-folder-chevron-color`, `--ease-folder-chevron-color-hover`, `--ease-folder-fade-size` |
|
|
1083
1116
|
| Field | `--ease-field-label-width`, `--ease-field-column-gap`, `--ease-field-row-gap` |
|
|
1084
1117
|
| Controls | Each control exposes `--ease-<component>-*` tokens |
|
|
1085
1118
|
|
|
@@ -1123,7 +1156,9 @@ The `<ease-panel>` component provides the visual container.
|
|
|
1123
1156
|
|
|
1124
1157
|
| Property | Type | Default | Description |
|
|
1125
1158
|
|----------|------|---------|-------------|
|
|
1159
|
+
| `headline` | `string \| null` | `null` | Panel title text displayed in the header |
|
|
1126
1160
|
| `activeTab` | `number` | `0` | Zero-based index of the active tab |
|
|
1161
|
+
| `maxHeight` | `string \| null` | `null` | Maximum height for scrollable content (e.g., "250px") |
|
|
1127
1162
|
|
|
1128
1163
|
#### Methods
|
|
1129
1164
|
|
|
@@ -1135,7 +1170,6 @@ The `<ease-panel>` component provides the visual container.
|
|
|
1135
1170
|
|
|
1136
1171
|
| Slot | Description |
|
|
1137
1172
|
|------|-------------|
|
|
1138
|
-
| `headline` | Panel title text (hidden when tabs are present) |
|
|
1139
1173
|
| `actions` | Header action buttons, links, or dropdowns |
|
|
1140
1174
|
| (default) | Main content area (used when no tabs) |
|
|
1141
1175
|
| `tab-{id}` | Tab panel content (use `data-tab-label` for display name) |
|
|
@@ -1152,7 +1186,8 @@ The `<ease-panel>` component provides the visual container.
|
|
|
1152
1186
|
| `tab` | Individual tab button |
|
|
1153
1187
|
| `actions` | Actions container |
|
|
1154
1188
|
| `content` | Content wrapper (handles height animations) |
|
|
1155
|
-
| `body` | Inner body container |
|
|
1189
|
+
| `body` | Inner body container (scrollable when max-height is set) |
|
|
1190
|
+
| `items` | Grid container for slotted content |
|
|
1156
1191
|
| `tab-panel` | Individual tab panel |
|
|
1157
1192
|
| `footer` | Footer container |
|
|
1158
1193
|
|
|
@@ -1170,6 +1205,59 @@ interface TabChangeEventDetail {
|
|
|
1170
1205
|
}
|
|
1171
1206
|
```
|
|
1172
1207
|
|
|
1208
|
+
### Folder API
|
|
1209
|
+
|
|
1210
|
+
The `<ease-folder>` component provides a collapsible container for grouping controls.
|
|
1211
|
+
|
|
1212
|
+
#### Properties
|
|
1213
|
+
|
|
1214
|
+
| Property | Type | Default | Description |
|
|
1215
|
+
|----------|------|---------|-------------|
|
|
1216
|
+
| `headline` | `string \| null` | `null` | Folder title text displayed in the header |
|
|
1217
|
+
| `open` | `boolean` | `false` | Whether the folder is expanded |
|
|
1218
|
+
| `maxHeight` | `string \| null` | `null` | Maximum height for scrollable content (e.g., "150px") |
|
|
1219
|
+
|
|
1220
|
+
#### Methods
|
|
1221
|
+
|
|
1222
|
+
| Method | Signature | Description |
|
|
1223
|
+
|--------|-----------|-------------|
|
|
1224
|
+
| `toggle` | `() => void` | Toggle the folder open/closed state |
|
|
1225
|
+
|
|
1226
|
+
#### Slots
|
|
1227
|
+
|
|
1228
|
+
| Slot | Description |
|
|
1229
|
+
|------|-------------|
|
|
1230
|
+
| (default) | Folder content (fields and controls) |
|
|
1231
|
+
|
|
1232
|
+
#### CSS Parts
|
|
1233
|
+
|
|
1234
|
+
| Part | Description |
|
|
1235
|
+
|------|-------------|
|
|
1236
|
+
| `section` | Outer container |
|
|
1237
|
+
| `header` | Clickable header row |
|
|
1238
|
+
| `icon` | Folder icon |
|
|
1239
|
+
| `headline` | Title element |
|
|
1240
|
+
| `chevron` | Chevron icon (toggle indicator) |
|
|
1241
|
+
| `content` | Content wrapper (handles height animations) |
|
|
1242
|
+
| `body` | Inner body container (scrollable when max-height is set) |
|
|
1243
|
+
|
|
1244
|
+
#### Events
|
|
1245
|
+
|
|
1246
|
+
| Event | Detail Type | Description |
|
|
1247
|
+
|-------|-------------|-------------|
|
|
1248
|
+
| `folder-toggle` | `FolderToggleEventDetail` | Fired when the folder is opened or closed |
|
|
1249
|
+
|
|
1250
|
+
```typescript
|
|
1251
|
+
interface FolderToggleEventDetail {
|
|
1252
|
+
open: boolean; // Whether the folder is now open
|
|
1253
|
+
event: Event; // Original event
|
|
1254
|
+
}
|
|
1255
|
+
```
|
|
1256
|
+
|
|
1257
|
+
#### Scrollable Content
|
|
1258
|
+
|
|
1259
|
+
When `max-height` is set, the folder content becomes scrollable with fade gradient masks at the top and bottom edges. The masks automatically appear/disappear based on scroll position using scroll-driven animations.
|
|
1260
|
+
|
|
1173
1261
|
### State API
|
|
1174
1262
|
|
|
1175
1263
|
The `<ease-state>` component provides state management for controls.
|
package/build/decorators.cjs
CHANGED
|
@@ -29,7 +29,7 @@ __export(decorators_exports, {
|
|
|
29
29
|
});
|
|
30
30
|
module.exports = __toCommonJS(decorators_exports);
|
|
31
31
|
|
|
32
|
-
// swc:/
|
|
32
|
+
// swc:/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Component.ts
|
|
33
33
|
var import_lit_html = require("lit-html");
|
|
34
34
|
var styleCache = /* @__PURE__ */ new Map();
|
|
35
35
|
var normalizeTemplate = (template) => {
|
|
@@ -163,7 +163,7 @@ var Component = (options) => (Base, _context) => {
|
|
|
163
163
|
return Decorated;
|
|
164
164
|
};
|
|
165
165
|
|
|
166
|
-
// swc:/
|
|
166
|
+
// swc:/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Listen.ts
|
|
167
167
|
var lifecycleHooks = {
|
|
168
168
|
connectedCallback: /* @__PURE__ */ new WeakMap(),
|
|
169
169
|
disconnectedCallback: /* @__PURE__ */ new WeakMap()
|
|
@@ -309,7 +309,7 @@ function Listen(eventName, selectorOrOptions) {
|
|
|
309
309
|
};
|
|
310
310
|
}
|
|
311
311
|
|
|
312
|
-
// swc:/
|
|
312
|
+
// swc:/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/utils/dismiss-controller.ts
|
|
313
313
|
var DismissController = class {
|
|
314
314
|
#onDismiss;
|
|
315
315
|
#context;
|
|
@@ -460,7 +460,7 @@ var disconnectOutsideClickHandles = (host) => {
|
|
|
460
460
|
});
|
|
461
461
|
};
|
|
462
462
|
|
|
463
|
-
// swc:/
|
|
463
|
+
// swc:/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/OutsideClick.ts
|
|
464
464
|
var lifecycleApplied = /* @__PURE__ */ new WeakSet();
|
|
465
465
|
var wrapMethod = (host, name, hook, callHookFirst = false) => {
|
|
466
466
|
const original = host[name];
|
|
@@ -518,7 +518,7 @@ function OutsideClick(options = {}) {
|
|
|
518
518
|
};
|
|
519
519
|
}
|
|
520
520
|
|
|
521
|
-
// swc:/
|
|
521
|
+
// swc:/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Prop.ts
|
|
522
522
|
var renderQueue = /* @__PURE__ */ new WeakMap();
|
|
523
523
|
var cleanupRegistry2 = /* @__PURE__ */ new WeakMap();
|
|
524
524
|
var observerRegistry = /* @__PURE__ */ new WeakMap();
|
|
@@ -783,7 +783,7 @@ function Prop(options = {}) {
|
|
|
783
783
|
};
|
|
784
784
|
}
|
|
785
785
|
|
|
786
|
-
// swc:/
|
|
786
|
+
// swc:/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Query.ts
|
|
787
787
|
var defaultOptions = {
|
|
788
788
|
all: false,
|
|
789
789
|
closest: false,
|
|
@@ -859,7 +859,7 @@ function Query(selector, userOptions) {
|
|
|
859
859
|
return createQueryDecorator(selector, merged);
|
|
860
860
|
}
|
|
861
861
|
|
|
862
|
-
// swc:/
|
|
862
|
+
// swc:/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Watch.ts
|
|
863
863
|
var renderQueue2 = /* @__PURE__ */ new WeakMap();
|
|
864
864
|
var scheduleRender2 = (instance) => {
|
|
865
865
|
if (typeof instance.requestRender === "function") {
|
package/build/decorators.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/decorators/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/decorators/Component.ts","/home/runner/work/web-kit/web-kit/packages/core/src/decorators/Listen.ts","/home/runner/work/web-kit/web-kit/packages/core/src/utils/dismiss-controller.ts","../src/utils/outside-click.ts","/home/runner/work/web-kit/web-kit/packages/core/src/decorators/OutsideClick.ts","/home/runner/work/web-kit/web-kit/packages/core/src/decorators/Prop.ts","/home/runner/work/web-kit/web-kit/packages/core/src/decorators/Query.ts","/home/runner/work/web-kit/web-kit/packages/core/src/decorators/Watch.ts"],"sourcesContent":["export { Component, type RenderContext } from './Component';\nexport { Listen } from './Listen';\nexport { OutsideClick } from './OutsideClick';\nexport { Prop } from './Prop';\nexport { Query } from './Query';\nexport { Watch } from './Watch';\n","import { html, render, type TemplateResult } from 'lit-html';\n\ntype Constructor<T extends HTMLElement> = new (...args: unknown[]) => T;\n\ninterface LifecycleElement {\n connectedCallback?(): void;\n disconnectedCallback?(): void;\n attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;\n}\n\ntype RenderableElement = HTMLElement & {\n render?(): TemplateResult | null | undefined;\n afterRender?(): void;\n wrapRender?(commit: () => void, context: RenderContext): void;\n onAttributeChange?(name: string, oldValue: string | null, newValue: string | null): void;\n requestRender?(): void;\n renderRoot?: ShadowRoot | HTMLElement;\n};\n\ntype TemplateValue<TElement extends RenderableElement> =\n | TemplateResult\n | null\n | undefined\n | ((this: TElement, host: TElement) => TemplateResult | null | undefined);\n\ninterface ComponentOptions<TElement extends RenderableElement = RenderableElement> {\n tag: string;\n template?: TemplateValue<TElement>;\n styles?: string;\n styleUrls?: string[];\n observedAttributes?: string[];\n shadowMode?: ShadowRootMode;\n autoSlot?: boolean;\n}\n\n// Exporting RenderContext\nexport interface RenderContext {\n fragment: DocumentFragment;\n root: ShadowRoot | HTMLElement;\n}\n\nconst styleCache = new Map<string, Promise<string>>();\n\nconst normalizeTemplate = <TElement extends RenderableElement>(\n template?: TemplateValue<TElement>\n): ((this: TElement, host: TElement) => TemplateResult | null | undefined) => {\n if (typeof template === 'function') {\n return template as (this: TElement, host: TElement) => TemplateResult | null | undefined;\n }\n\n if (template && typeof template === 'object' && '_$litTemplate$' in template) {\n return function (this: TElement): TemplateResult | null | undefined {\n return template as TemplateResult;\n };\n }\n\n return function (this: TElement): TemplateResult | null | undefined {\n return null;\n };\n};\n\nconst fetchStyles = async (urls: readonly string[]): Promise<string[]> =>\n Promise.all(\n urls.map((url) => {\n const cached = styleCache.get(url);\n if (cached) {\n return cached;\n }\n\n const request = fetch(url)\n .then((response) => (response.ok ? response.text() : ''))\n .catch(() => '');\n\n styleCache.set(url, request);\n return request;\n })\n );\n\nexport const Component =\n <TElement extends RenderableElement = RenderableElement>(options: ComponentOptions<TElement>) =>\n <TBase extends Constructor<TElement> & { observedAttributes?: string[] }>(\n Base: TBase,\n _context: ClassDecoratorContext\n ): TBase => {\n const {\n tag,\n template,\n styles = '',\n styleUrls = [],\n observedAttributes = [],\n shadowMode = 'open',\n autoSlot = true\n } = options;\n\n if (!tag) {\n throw new Error('@Component requires a \"tag\" option.');\n }\n\n const templateFn = normalizeTemplate<TElement>(template);\n\n class Decorated extends (Base as unknown as Constructor<RenderableElement>) {\n static get observedAttributes(): string[] {\n const parent =\n 'observedAttributes' in Base && Array.isArray(Base.observedAttributes)\n ? (Base.observedAttributes as string[])\n : [];\n const own = Array.isArray(observedAttributes) ? observedAttributes : [];\n return Array.from(new Set([...parent, ...own]));\n }\n\n #shadow: ShadowRoot;\n #styles = styles;\n #styleUrls = [...styleUrls];\n #renderScheduled = false;\n\n constructor(...args: unknown[]) {\n super(...args);\n this.#shadow = this.attachShadow({ mode: shadowMode });\n this.renderRoot = this.#shadow;\n }\n\n get shadow(): HTMLElement | ShadowRoot | undefined {\n return this.renderRoot;\n }\n\n connectedCallback(): void {\n (Base.prototype as LifecycleElement).connectedCallback?.call(this);\n\n void this.#loadStyles().finally(() => {\n this.requestRender();\n });\n }\n\n disconnectedCallback(): void {\n (Base.prototype as LifecycleElement).disconnectedCallback?.call(this);\n this.#renderScheduled = false;\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n (Base.prototype as LifecycleElement).attributeChangedCallback?.call(this, name, oldValue, newValue);\n\n if (oldValue !== newValue) {\n this.onAttributeChange?.(name, oldValue, newValue);\n }\n }\n\n requestRender(): void {\n if (this.#renderScheduled) {\n return;\n }\n\n this.#renderScheduled = true;\n\n requestAnimationFrame(() => {\n this.#renderScheduled = false;\n this.#render();\n });\n }\n\n async #loadStyles(): Promise<void> {\n if (!this.#styleUrls.length) {\n return;\n }\n\n const fetched = await fetchStyles(this.#styleUrls);\n const inlineStyles = this.#styles ? [this.#styles] : [];\n this.#styles = [...inlineStyles, ...fetched.filter(Boolean)].join('\\n');\n }\n\n #render(): void {\n const root = this.#shadow;\n\n let templateResult: TemplateResult | null | undefined;\n\n if (typeof this.render === 'function') {\n templateResult = this.render();\n } else {\n templateResult = templateFn.call(this as unknown as TElement, this as unknown as TElement);\n }\n\n const styleTemplate = this.#styles ? html`<style>${this.#styles}</style>` : null;\n const slotTemplate = autoSlot ? html`<slot></slot>` : null;\n\n const completeTemplate = html`\n ${styleTemplate}\n ${templateResult ?? null}\n ${slotTemplate}\n `;\n\n const commit = (): void => {\n render(completeTemplate, root);\n this.afterRender?.();\n };\n\n if (typeof this.wrapRender === 'function') {\n const fragment = document.createDocumentFragment();\n const tempDiv = document.createElement('div');\n\n render(completeTemplate, tempDiv);\n\n fragment.append(...tempDiv.childNodes);\n\n this.wrapRender(commit, { fragment, root });\n return;\n }\n\n commit();\n }\n }\n\n // SSR safety: only register in browser environments\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n customElements.define(tag, Decorated as unknown as CustomElementConstructor);\n }\n\n return Decorated as unknown as TBase;\n };\n","type ListenHost = HTMLElement & {\n renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype LifecycleHookName = 'connectedCallback' | 'disconnectedCallback';\n\ntype LifecycleCallback<THost extends ListenHost> = (this: THost) => void;\n\ntype ListenTargetResolver<THost extends ListenHost> =\n | 'document'\n | 'window'\n | 'shadow'\n | 'root'\n | 'light'\n | EventTarget\n | ((host: THost) => EventTarget | null | undefined);\n\ntype Predicate<TEvent extends Event, TElement extends Element> = (event: TEvent, matched: TElement | null) => boolean;\n\ninterface ListenOptions<THost extends ListenHost, TElement extends Element, TEvent extends Event> {\n selector?: string;\n target?: ListenTargetResolver<THost>;\n prevent?: boolean;\n stop?: boolean;\n stopImmediate?: boolean;\n once?: boolean;\n passive?: boolean;\n capture?: boolean;\n when?: Predicate<TEvent, TElement>;\n}\n\ntype Cleanup = () => void;\n\nconst lifecycleHooks: Record<LifecycleHookName, WeakMap<ListenHost, Set<LifecycleCallback<ListenHost>>>> = {\n connectedCallback: new WeakMap(),\n disconnectedCallback: new WeakMap()\n};\n\nconst cleanupRegistry = new WeakMap<ListenHost, Set<Cleanup>>();\n\nconst addLifecycleHook = <THost extends ListenHost>(\n instance: THost,\n hookName: LifecycleHookName,\n handler: LifecycleCallback<THost>\n): void => {\n const store = lifecycleHooks[hookName] as WeakMap<THost, Set<LifecycleCallback<THost>>>;\n let callbacks = store.get(instance);\n\n if (!callbacks) {\n callbacks = new Set<LifecycleCallback<THost>>();\n store.set(instance, callbacks);\n\n const original = (instance as unknown as Record<LifecycleHookName, unknown>)[hookName];\n\n (instance as unknown as Record<LifecycleHookName, unknown>)[hookName] = function (...args: unknown[]) {\n callbacks?.forEach((callback) => {\n callback.apply(this as THost);\n });\n\n if (typeof original === 'function') {\n return (original as (...params: unknown[]) => unknown).apply(this, args);\n }\n\n return undefined;\n };\n }\n\n callbacks.add(handler);\n};\n\nconst registerCleanup = <THost extends ListenHost>(instance: THost, cleanup: Cleanup): void => {\n let callbacks = cleanupRegistry.get(instance);\n\n if (!callbacks) {\n callbacks = new Set();\n cleanupRegistry.set(instance, callbacks);\n\n addLifecycleHook(instance, 'disconnectedCallback', function (this: THost) {\n const registered = cleanupRegistry.get(this);\n registered?.forEach((fn) => {\n try {\n fn();\n } catch (error) {\n console.error('[Listen] cleanup failed', error);\n }\n });\n cleanupRegistry.delete(this);\n });\n }\n\n callbacks.add(cleanup);\n};\n\nconst resolveTarget = <THost extends ListenHost>(\n host: THost,\n target: ListenTargetResolver<THost> | undefined\n): EventTarget | null => {\n if (typeof target === 'function') {\n return target(host) ?? null;\n }\n\n if (target instanceof EventTarget) {\n return target;\n }\n\n switch (target) {\n case 'document':\n return document;\n case 'window':\n return window;\n case 'light':\n return host;\n default:\n return host.renderRoot ?? host.shadowRoot ?? host;\n }\n};\n\nconst normalizeOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n selectorOrOptions: string | ListenOptions<THost, TElement, TEvent> | undefined\n): ListenOptions<THost, TElement, TEvent> => {\n if (typeof selectorOrOptions === 'string') {\n return { selector: selectorOrOptions };\n }\n\n return selectorOrOptions ?? {};\n};\n\nconst buildOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n options: ListenOptions<THost, TElement, TEvent>\n) => {\n return {\n selector: options.selector ?? null,\n target: options.target ?? 'shadow',\n prevent: options.prevent ?? false,\n stop: options.stop ?? false,\n stopImmediate: options.stopImmediate ?? false,\n once: options.once ?? false,\n passive: options.passive,\n capture: options.capture ?? false,\n when: options.when ?? null\n };\n};\n\nexport function Listen<THost extends ListenHost, TEvent extends Event = Event, TElement extends Element = Element>(\n eventName: keyof HTMLElementEventMap | string,\n selectorOrOptions?: string | ListenOptions<THost, TElement, TEvent>\n) {\n if (!eventName) {\n throw new Error('@Listen requires an event name.');\n }\n\n const listenConfig = buildOptions(normalizeOptions(selectorOrOptions));\n\n return (\n originalMethod: (this: THost, event: TEvent, matched?: TElement | null) => unknown,\n context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n ): void => {\n context.addInitializer(function (this: THost) {\n let attached = false;\n\n const attach = () => {\n if (attached) {\n return;\n }\n\n const target = resolveTarget(this, listenConfig.target);\n\n if (!target || typeof (target as EventTarget).addEventListener !== 'function') {\n console.warn(`@Listen unable to resolve target for ${String(eventName)}`);\n return;\n }\n\n const eventOptions: AddEventListenerOptions = {\n capture: listenConfig.capture,\n once: listenConfig.once,\n passive: listenConfig.passive !== undefined ? listenConfig.passive : !listenConfig.prevent\n };\n\n const handler = (event: Event): void => {\n const typedEvent = event as TEvent;\n\n if (listenConfig.prevent) {\n typedEvent.preventDefault();\n }\n\n if (listenConfig.stopImmediate) {\n typedEvent.stopImmediatePropagation();\n } else if (listenConfig.stop) {\n typedEvent.stopPropagation();\n }\n\n let matched: TElement | null = null;\n\n if (listenConfig.selector) {\n const path = typedEvent.composedPath();\n matched =\n path.find(\n (node): node is TElement => node instanceof Element && node.matches(listenConfig.selector as string)\n ) ?? null;\n\n if (!matched) {\n return;\n }\n }\n\n if (listenConfig.when && !listenConfig.when(typedEvent, matched)) {\n return;\n }\n\n if (listenConfig.selector) {\n void originalMethod.call(this, typedEvent, matched);\n } else {\n const targetNode = (\n typedEvent.target instanceof Element ? (typedEvent.target as TElement) : null\n ) as TElement | null;\n void originalMethod.call(this, typedEvent, targetNode);\n }\n };\n\n target.addEventListener(eventName as string, handler, eventOptions);\n attached = true;\n\n registerCleanup(this, () => {\n target.removeEventListener(eventName as string, handler, eventOptions);\n attached = false;\n });\n };\n\n // IMPORTANT:\n // Many components are created inside templates/shadow DOM. At construction time they are often not connected yet,\n // and patching instance lifecycle callbacks is not reliably invoked by the platform.\n // Attach the listener ASAP (microtask) so it works for nested components as well.\n queueMicrotask(attach);\n\n // Best-effort attach on connect too (idempotent).\n addLifecycleHook(this, 'connectedCallback', attach);\n });\n };\n}\n","export interface DismissContext {\n owner: HTMLElement;\n content?: HTMLElement | null;\n triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface DismissControllerOptions {\n onDismiss: (event: Event) => void;\n}\n\nexport class DismissController {\n #onDismiss: (event: Event) => void;\n #context: {\n owner: HTMLElement;\n content: HTMLElement | null;\n triggers: HTMLElement[];\n } | null = null;\n #active = false;\n\n constructor(options: DismissControllerOptions) {\n this.#onDismiss = options.onDismiss;\n }\n\n connect(context: DismissContext): void {\n this.#context = {\n owner: context.owner,\n content: context.content ?? null,\n triggers: (context.triggers ?? []).filter((el): el is HTMLElement => el instanceof HTMLElement)\n };\n\n if (!this.#active) {\n document.addEventListener('pointerdown', this.#handlePointerDown, true);\n document.addEventListener('keydown', this.#handleKeyDown, true);\n this.#active = true;\n }\n }\n\n disconnect(): void {\n if (!this.#active) {\n return;\n }\n\n document.removeEventListener('pointerdown', this.#handlePointerDown, true);\n document.removeEventListener('keydown', this.#handleKeyDown, true);\n this.#active = false;\n this.#context = null;\n }\n\n #handlePointerDown = (event: PointerEvent): void => {\n if (!this.#context) {\n return;\n }\n\n const { owner, content, triggers } = this.#context;\n const path = event.composedPath();\n\n if (path.some((node) => node instanceof Element && node.hasAttribute('data-select-ignore'))) {\n return;\n }\n\n if (path.includes(owner)) {\n return;\n }\n\n if (content && path.includes(content)) {\n return;\n }\n\n if (triggers.some((trigger) => path.includes(trigger))) {\n return;\n }\n\n this.#onDismiss(event);\n };\n\n #handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !this.#context) {\n return;\n }\n\n event.preventDefault();\n\n const active = document.activeElement as HTMLElement | null;\n\n if (!active) {\n this.#onDismiss(event);\n return;\n }\n\n const { owner, content, triggers } = this.#context;\n const path = event.composedPath();\n\n if (path.includes(owner) || owner.contains(active)) {\n this.#onDismiss(event);\n return;\n }\n\n if (content && (path.includes(content) || content.contains(active))) {\n this.#onDismiss(event);\n return;\n }\n\n if (triggers.some((trigger) => path.includes(trigger) || trigger.contains(active))) {\n this.#onDismiss(event);\n }\n };\n}\n","import type { DismissContext } from './dismiss-controller';\n\nimport { DismissController } from './dismiss-controller';\n\nexport interface OutsideClickResolution {\n owner?: HTMLElement | null | undefined;\n content?: HTMLElement | null | undefined;\n triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface OutsideClickHandle {\n update(): void;\n disconnect(): void;\n}\n\nexport interface OutsideClickHandleOptions<THost extends HTMLElement> {\n resolve: (host: THost) => OutsideClickResolution | null | undefined;\n disabled?: (host: THost) => boolean;\n}\n\nconst registry = new WeakMap<HTMLElement, Set<OutsideClickHandle>>();\n\nconst toDismissContext = <THost extends HTMLElement>(\n host: THost,\n options: OutsideClickHandleOptions<THost>\n): DismissContext | null => {\n if (options.disabled?.(host)) {\n return null;\n }\n\n const resolved = options.resolve(host);\n\n if (!resolved) {\n return null;\n }\n\n const owner = resolved.owner ?? host ?? null;\n\n if (!(owner instanceof HTMLElement)) {\n return null;\n }\n\n const content = resolved.content && resolved.content instanceof HTMLElement ? resolved.content : null;\n\n const triggers = resolved.triggers?.filter((element): element is HTMLElement => element instanceof HTMLElement) ?? [];\n\n return {\n owner,\n content,\n triggers\n };\n};\n\nexport const createOutsideClickHandle = <THost extends HTMLElement>(\n host: THost,\n onDismiss: (this: THost, event: Event) => void,\n options: OutsideClickHandleOptions<THost>\n): OutsideClickHandle => {\n const controller = new DismissController({\n onDismiss(event) {\n if (options.disabled?.(host)) {\n return;\n }\n\n onDismiss.call(host, event);\n }\n });\n\n return {\n update(): void {\n const context = toDismissContext(host, options);\n if (!context) {\n controller.disconnect();\n return;\n }\n\n controller.connect(context);\n },\n disconnect(): void {\n controller.disconnect();\n }\n };\n};\n\nexport const registerOutsideClickHandle = (host: HTMLElement, handle: OutsideClickHandle): void => {\n let handles = registry.get(host);\n\n if (!handles) {\n handles = new Set();\n registry.set(host, handles);\n }\n\n handles.add(handle);\n};\n\nexport const updateOutsideClickHandles = (host: HTMLElement): void => {\n const handles = registry.get(host);\n\n if (!handles) {\n return;\n }\n\n handles.forEach((handle) => {\n handle.update();\n });\n};\n\nexport const disconnectOutsideClickHandles = (host: HTMLElement): void => {\n const handles = registry.get(host);\n\n if (!handles) {\n return;\n }\n\n handles.forEach((handle) => {\n handle.disconnect();\n });\n};\n\nexport const requestOutsideClickUpdate = (host: HTMLElement): void => {\n updateOutsideClickHandles(host);\n};\n","import type { OutsideClickResolution } from '~/utils/outside-click';\n\nimport {\n createOutsideClickHandle,\n disconnectOutsideClickHandles,\n registerOutsideClickHandle,\n updateOutsideClickHandles\n} from '~/utils/outside-click';\n\ntype OutsideClickHost = HTMLElement & {\n connectedCallback?: (...args: unknown[]) => unknown;\n disconnectedCallback?: (...args: unknown[]) => unknown;\n afterRender?: (...args: unknown[]) => unknown;\n};\n\ntype HookName = 'connectedCallback' | 'disconnectedCallback' | 'afterRender';\n\ninterface OutsideClickOptions<THost extends OutsideClickHost> {\n resolve?: (host: THost) => OutsideClickResolution | null | undefined;\n owner?: (host: THost) => HTMLElement | null | undefined;\n content?: (host: THost) => HTMLElement | null | undefined;\n triggers?: (host: THost) => Array<HTMLElement | null | undefined>;\n disabled?: (host: THost) => boolean;\n}\n\nconst lifecycleApplied = new WeakSet<OutsideClickHost>();\n\nconst wrapMethod = (\n host: OutsideClickHost,\n name: HookName,\n hook: (this: OutsideClickHost) => void,\n callHookFirst = false\n): void => {\n const original = host[name];\n\n (host as Required<OutsideClickHost>)[name] = function (...args: unknown[]) {\n if (callHookFirst) {\n hook.call(this);\n }\n\n let result: unknown;\n\n if (typeof original === 'function') {\n result = (original as (...params: unknown[]) => unknown).apply(this, args);\n }\n\n if (!callHookFirst) {\n hook.call(this);\n }\n\n return result;\n };\n};\n\nconst ensureLifecycle = (host: OutsideClickHost): void => {\n if (lifecycleApplied.has(host)) {\n return;\n }\n\n lifecycleApplied.add(host);\n\n wrapMethod(host, 'connectedCallback', function (this: OutsideClickHost) {\n updateOutsideClickHandles(this);\n });\n\n wrapMethod(host, 'afterRender', function (this: OutsideClickHost) {\n updateOutsideClickHandles(this);\n });\n\n wrapMethod(\n host,\n 'disconnectedCallback',\n function (this: OutsideClickHost) {\n disconnectOutsideClickHandles(this);\n },\n true\n );\n};\n\nexport function OutsideClick<THost extends OutsideClickHost, TEvent extends Event = Event>(\n options: OutsideClickOptions<THost> = {}\n) {\n return (\n originalMethod: (this: THost, event: TEvent) => unknown,\n context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n ): void => {\n context.addInitializer(function (this: THost) {\n ensureLifecycle(this);\n\n const resolve =\n options.resolve ??\n ((host: THost): OutsideClickResolution => {\n return {\n owner: options.owner?.(host),\n content: options.content?.(host),\n triggers: options.triggers?.(host)\n };\n });\n\n const handle = createOutsideClickHandle(\n this,\n (event) => {\n originalMethod.call(this, event as TEvent);\n },\n {\n resolve,\n disabled: options.disabled\n }\n );\n\n registerOutsideClickHandle(this, handle);\n\n if (this.isConnected) {\n updateOutsideClickHandles(this);\n }\n });\n };\n}\n\nexport { requestOutsideClickUpdate } from '~/utils/outside-click';\nexport type { OutsideClickOptions };\n","type RenderHost = HTMLElement & {\n requestRender?(): void;\n render?(): void;\n connectedCallback?(): void;\n disconnectedCallback?(...args: unknown[]): void;\n};\n\ntype PropTypeDescriptor =\n | BooleanConstructor\n | NumberConstructor\n | StringConstructor\n | ObjectConstructor\n | ArrayConstructor\n | 'boolean'\n | 'number'\n | 'string'\n | 'json';\n\ntype Formatter<TValue, THost extends RenderHost> = (this: THost, value: TValue) => string | null | undefined;\ntype Parser<TValue, THost extends RenderHost> = (this: THost, value: string | null) => TValue;\n\ninterface PropOptions<TValue, THost extends RenderHost> {\n attribute?: string;\n reflect?: boolean;\n type?: PropTypeDescriptor;\n parse?: Parser<TValue, THost>;\n format?: Formatter<TValue, THost>;\n defaultValue?: TValue | ((this: THost) => TValue);\n compare?: (previous: TValue, next: TValue) => boolean;\n onChange?: (this: THost, next: TValue, previous: TValue) => void;\n onAttributeChange?: (this: THost, next: TValue, previous: TValue) => void;\n}\n\ninterface AttributeObserverEntry {\n observer: MutationObserver;\n callbacks: Map<string, Set<(value: string | null) => void>>;\n}\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\nconst cleanupRegistry = new WeakMap<RenderHost, Set<() => void>>();\nconst observerRegistry = new WeakMap<RenderHost, AttributeObserverEntry>();\nconst internalMutations = new WeakMap<RenderHost, Set<string>>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n if (typeof instance.requestRender === 'function') {\n instance.requestRender();\n return;\n }\n\n if (typeof instance.render !== 'function') {\n return;\n }\n\n if (renderQueue.get(instance)) {\n return;\n }\n\n renderQueue.set(instance, true);\n\n requestAnimationFrame(() => {\n renderQueue.delete(instance);\n instance.render?.();\n });\n};\n\nconst toKebabCase = (value: PropertyKey): string =>\n String(value)\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n\nconst registerCleanup = (instance: RenderHost, cleanup: () => void): void => {\n let callbacks = cleanupRegistry.get(instance);\n\n if (!callbacks) {\n callbacks = new Set();\n cleanupRegistry.set(instance, callbacks);\n\n const original = instance.disconnectedCallback;\n\n instance.disconnectedCallback = function (this: RenderHost, ...args: unknown[]) {\n const registered = cleanupRegistry.get(this);\n registered?.forEach((callback) => {\n try {\n callback();\n } catch (error) {\n console.error('[Prop] cleanup failed', error);\n }\n });\n cleanupRegistry.delete(this);\n\n if (typeof original === 'function') {\n return original.apply(this, args as []);\n }\n\n return undefined;\n } as typeof instance.disconnectedCallback;\n }\n\n callbacks.add(cleanup);\n};\n\nconst markInternalMutation = (host: RenderHost, attribute: string): void => {\n let attributes = internalMutations.get(host);\n\n if (!attributes) {\n attributes = new Set();\n internalMutations.set(host, attributes);\n }\n\n attributes.add(attribute);\n};\n\nconst isInternalMutation = (host: RenderHost, attribute: string): boolean => {\n const attributes = internalMutations.get(host);\n\n if (!attributes) {\n return false;\n }\n\n const hasAttribute = attributes.has(attribute);\n\n if (hasAttribute) {\n attributes.delete(attribute);\n if (attributes.size === 0) {\n internalMutations.delete(host);\n }\n }\n\n return hasAttribute;\n};\n\nconst observeAttribute = (host: RenderHost, attribute: string, handler: (value: string | null) => void): void => {\n let entry = observerRegistry.get(host);\n\n if (!entry) {\n const callbacks = new Map<string, Set<(value: string | null) => void>>();\n const observer = new MutationObserver((records) => {\n records.forEach((record) => {\n const attributeName = record.attributeName;\n\n if (!attributeName) {\n return;\n }\n\n if (isInternalMutation(host, attributeName)) {\n return;\n }\n\n const listeners = callbacks.get(attributeName);\n if (!listeners) {\n return;\n }\n\n const currentValue = (record.target as Element).getAttribute(attributeName);\n\n for (const listener of listeners) {\n listener(currentValue);\n }\n });\n });\n\n observer.observe(host, { attributes: true });\n\n entry = { observer, callbacks };\n observerRegistry.set(host, entry);\n\n registerCleanup(host, () => {\n observer.disconnect();\n observerRegistry.delete(host);\n });\n }\n\n let listeners = entry.callbacks.get(attribute);\n\n if (!listeners) {\n listeners = new Set();\n entry.callbacks.set(attribute, listeners);\n }\n\n listeners.add(handler);\n};\n\nconst updateAttribute = (host: RenderHost, attribute: string, value: string | null | undefined | boolean): void => {\n markInternalMutation(host, attribute);\n\n if (value === undefined || value === null || value === false) {\n host.removeAttribute(attribute);\n return;\n }\n\n if (value === true) {\n host.setAttribute(attribute, '');\n return;\n }\n\n host.setAttribute(attribute, String(value));\n};\n\nconst resolveType = (type: PropTypeDescriptor | undefined): 'boolean' | 'number' | 'json' | 'string' | null => {\n if (!type) {\n return null;\n }\n\n if (type === Boolean || type === 'boolean') {\n return 'boolean';\n }\n\n if (type === Number || type === 'number') {\n return 'number';\n }\n\n if (type === Object || type === Array || type === 'json') {\n return 'json';\n }\n\n return 'string';\n};\n\nconst typeParsers: Record<'boolean' | 'number' | 'json' | 'string', Parser<unknown, RenderHost>> = {\n boolean(value: string | null): boolean {\n return value !== null;\n },\n number(value: string | null): number | null {\n if (value === null || value === '') {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isNaN(parsed) ? null : parsed;\n },\n json(value: string | null): unknown {\n if (!value) {\n return null;\n }\n\n try {\n return JSON.parse(value);\n } catch (error) {\n console.warn('[Prop] failed to parse JSON attribute', error);\n return null;\n }\n },\n string(value: string | null): string | null {\n return value;\n }\n};\n\nconst typeFormatters: Record<'boolean' | 'number' | 'json' | 'string', Formatter<unknown, RenderHost>> = {\n boolean(value: unknown): string | null {\n return value ? '' : null;\n },\n number(value: unknown): string | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n return String(value);\n },\n json(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n },\n string(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n return String(value);\n }\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\nexport function Prop<TValue, THost extends RenderHost = RenderHost>(options: PropOptions<TValue, THost> = {}) {\n const {\n attribute,\n reflect = true,\n type,\n parse,\n format,\n defaultValue,\n compare = defaultCompare,\n onChange,\n onAttributeChange\n } = options;\n\n const resolvedType = resolveType(type);\n\n const parseValue: Parser<TValue, THost> = parse\n ? parse\n : function (this: THost, value) {\n if (!resolvedType) {\n return value as unknown as TValue;\n }\n return typeParsers[resolvedType].call(this, value) as TValue;\n };\n\n const formatValue: Formatter<TValue, THost> = format\n ? format\n : function (this: THost, value) {\n if (!resolvedType) {\n return (value as unknown as string | null | undefined) ?? null;\n }\n return typeFormatters[resolvedType].call(this, value as unknown) as string | null;\n };\n\n return (\n accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n context: ClassAccessorDecoratorContext<THost, TValue>\n ): ClassAccessorDecoratorResult<THost, TValue> => {\n if (context.kind !== 'accessor') {\n throw new Error('@Prop requires the \"accessor\" keyword on the property.');\n }\n\n const attributeName = attribute ?? toKebabCase(context.name);\n\n context.addInitializer(function (this: THost) {\n if (!reflect) {\n return;\n }\n\n observeAttribute(this, attributeName, (rawValue) => {\n if (isInternalMutation(this, attributeName)) {\n return;\n }\n\n const parsed = parseValue.call(this, rawValue);\n const previous = accessor.get.call(this);\n\n if (compare(previous, parsed)) {\n return;\n }\n\n accessor.set.call(this, parsed);\n\n onAttributeChange?.call(this, parsed, previous);\n scheduleRender(this);\n });\n });\n\n return {\n get(this: THost): TValue {\n return accessor.get.call(this);\n },\n set(this: THost, value: TValue): void {\n const previous = accessor.get.call(this);\n\n if (compare(previous, value)) {\n return;\n }\n\n accessor.set.call(this, value);\n\n if (reflect) {\n const formatted = formatValue.call(this, value);\n updateAttribute(this, attributeName, formatted);\n }\n\n onChange?.call(this, value, previous);\n scheduleRender(this);\n },\n init(this: THost, initialValue: TValue): TValue {\n let value = initialValue;\n\n if (this.hasAttribute(attributeName)) {\n value = parseValue.call(this, this.getAttribute(attributeName));\n } else if (value === undefined && defaultValue !== undefined) {\n value =\n typeof defaultValue === 'function' ? (defaultValue as (this: THost) => TValue).call(this) : defaultValue;\n }\n\n if (reflect) {\n const formatted = formatValue.call(this, value);\n updateAttribute(this, attributeName, formatted);\n }\n\n return value;\n }\n };\n };\n}\n","type QueryRoot = 'shadow' | 'light' | 'document';\n\ntype QueryHost = HTMLElement & {\n renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype QueryFallback<TResult, THost extends QueryHost> = TResult | ((host: THost) => TResult);\n\ninterface BaseQueryOptions<TResult, THost extends QueryHost> {\n from?: QueryRoot;\n fallback?: QueryFallback<TResult, THost>;\n}\n\ninterface QueryAllOptions<TElement extends Element, THost extends QueryHost>\n extends BaseQueryOptions<TElement[], THost> {\n all: true;\n closest?: false;\n}\n\ninterface QueryClosestOptions<THost extends QueryHost> extends BaseQueryOptions<Element | null, THost> {\n closest: true;\n all?: false;\n}\n\ninterface QuerySingleOptions<TElement extends Element, THost extends QueryHost>\n extends BaseQueryOptions<TElement | null, THost> {\n all?: false;\n closest?: false;\n}\n\ntype QueryOptions<TElement extends Element, THost extends QueryHost> =\n | QueryAllOptions<TElement, THost>\n | QueryClosestOptions<THost>\n | QuerySingleOptions<TElement, THost>;\n\ntype QueryReturnType<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n> = TOptions extends QueryAllOptions<TElement, THost>\n ? TElement[]\n : TOptions extends QueryClosestOptions<THost>\n ? Element | null\n : TElement | null;\n\ntype QueryDecorator<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n> = (\n target: ClassAccessorDecoratorTarget<THost, QueryReturnType<TElement, THost, TOptions>> | undefined,\n context:\n | ClassFieldDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n | ClassAccessorDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n) => ClassAccessorDecoratorResult<THost, QueryReturnType<TElement, THost, TOptions>> | undefined;\n\nconst defaultOptions = {\n all: false,\n closest: false,\n from: 'shadow' as QueryRoot | undefined,\n fallback: null\n} as const satisfies QuerySingleOptions<Element, QueryHost>;\n\nconst resolveFallback = <TResult, THost extends QueryHost>(\n fallback: QueryFallback<TResult, THost> | undefined,\n host: THost\n): TResult | undefined => {\n if (typeof fallback === 'function') {\n return (fallback as (instance: THost) => TResult)(host);\n }\n\n return fallback;\n};\n\nconst resolveRoot = (host: QueryHost, option: QueryRoot | undefined): ParentNode | null => {\n switch (option) {\n case 'document':\n return document;\n case 'light':\n return host;\n default:\n return host.renderRoot ?? host.shadowRoot ?? host;\n }\n};\n\nconst resolveQuery = <\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(\n host: THost,\n selector: string,\n options: TOptions\n) => {\n if (options.closest) {\n const result = host.closest(selector);\n return result ?? resolveFallback(options.fallback as QueryFallback<Element | null, THost>, host) ?? null;\n }\n\n const root = resolveRoot(host, options.from);\n\n if (!root) {\n return options.all\n ? (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? [])\n : (resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null);\n }\n\n if (options.all) {\n const elements = Array.from(root.querySelectorAll<TElement>(selector));\n return elements.length > 0\n ? elements\n : (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? []);\n }\n\n const match = root.querySelector<TElement>(selector);\n return match ?? resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null;\n};\n\nconst createQueryDecorator = <\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(\n selector: string,\n options: TOptions\n): QueryDecorator<TElement, THost, TOptions> => {\n type Result = QueryReturnType<TElement, THost, TOptions>;\n\n return (\n _target: ClassAccessorDecoratorTarget<THost, Result> | undefined,\n context: ClassFieldDecoratorContext<THost, Result> | ClassAccessorDecoratorContext<THost, Result>\n ): ClassAccessorDecoratorResult<THost, Result> | undefined => {\n if (context.kind === 'accessor') {\n const descriptor: ClassAccessorDecoratorResult<THost, Result> = {\n get(this: THost) {\n return resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result;\n },\n set(_value: Result) {\n // Readonly accessor\n }\n };\n return descriptor;\n }\n\n context.addInitializer(function (this: THost) {\n Object.defineProperty(this, context.name, {\n configurable: true,\n enumerable: true,\n get: () => resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result\n });\n });\n\n return;\n };\n};\n\nexport function Query<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(selector: string, userOptions: TOptions): QueryDecorator<TElement, THost, TOptions>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n selector: string\n): QueryDecorator<TElement, THost, QuerySingleOptions<TElement, THost>>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n selector: string,\n userOptions?: QueryOptions<TElement, THost>\n) {\n if (!selector) {\n throw new Error('@Query requires a selector.');\n }\n\n if (userOptions) {\n const merged = { ...defaultOptions, ...userOptions } as QueryOptions<TElement, THost>;\n return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n }\n\n const merged = defaultOptions as QuerySingleOptions<TElement, THost>;\n return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n}\n","type RenderHost = HTMLElement & {\n requestRender?(): void;\n render?(): void;\n};\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n if (typeof instance.requestRender === 'function') {\n instance.requestRender();\n return;\n }\n\n if (typeof instance.render !== 'function') {\n return;\n }\n\n if (renderQueue.get(instance)) {\n return;\n }\n\n renderQueue.set(instance, true);\n\n requestAnimationFrame(() => {\n renderQueue.set(instance, false);\n\n instance.render?.();\n });\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\ninterface WatchOptions<TValue, THost extends RenderHost> {\n compare?: (previous: TValue, next: TValue) => boolean;\n onChange?: (this: THost, next: TValue, previous: TValue) => void;\n transform?: (this: THost, initial: TValue) => TValue;\n}\n\nexport function Watch<TValue, THost extends RenderHost = RenderHost>(options: WatchOptions<TValue, THost> = {}) {\n const { compare = defaultCompare, onChange, transform } = options;\n\n return (\n accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n context: ClassAccessorDecoratorContext<THost, TValue>\n ): ClassAccessorDecoratorResult<THost, TValue> => {\n if (context.kind !== 'accessor') {\n throw new Error('@Watch requires the \"accessor\" keyword on the property.');\n }\n\n return {\n get(this: THost): TValue {\n return accessor.get.call(this);\n },\n set(this: THost, value: TValue): void {\n const previous = accessor.get.call(this);\n\n if (compare(previous, value)) {\n return;\n }\n\n accessor.set.call(this, value);\n\n if (onChange) {\n onChange.call(this, value, previous);\n }\n\n scheduleRender(this);\n },\n init(this: THost, initialValue: TValue): TValue {\n if (transform) {\n return transform.call(this, initialValue);\n }\n\n return initialValue;\n }\n };\n };\n}\n"],"mappings":"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","names":["styleCache","Map","normalizeTemplate","template","fetchStyles","urls","Promise","all","map","url","cached","get","request","fetch","then","response","ok","text","catch","set","Component","options","Base","_context","tag","styles","styleUrls","observedAttributes","shadowMode","autoSlot","Error","templateFn","Decorated","parent","Array","isArray","own","from","Set","args","attachShadow","mode","renderRoot","shadow","connectedCallback","prototype","call","finally","requestRender","disconnectedCallback","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","requestAnimationFrame","length","fetched","inlineStyles","filter","Boolean","join","root","templateResult","render","styleTemplate","html","slotTemplate","completeTemplate","commit","afterRender","wrapRender","fragment","document","createDocumentFragment","tempDiv","createElement","append","childNodes","customElements","define","lifecycleHooks","connectedCallback","WeakMap","disconnectedCallback","cleanupRegistry","addLifecycleHook","instance","hookName","handler","store","callbacks","get","Set","set","original","args","forEach","callback","apply","undefined","add","registerCleanup","cleanup","registered","fn","error","console","delete","resolveTarget","host","target","EventTarget","document","window","renderRoot","shadowRoot","normalizeOptions","selectorOrOptions","selector","buildOptions","options","prevent","stop","stopImmediate","once","passive","capture","when","Listen","eventName","Error","listenConfig","originalMethod","context","addInitializer","attached","attach","addEventListener","warn","String","eventOptions","event","typedEvent","preventDefault","stopImmediatePropagation","stopPropagation","matched","path","composedPath","find","node","Element","matches","call","targetNode","removeEventListener","queueMicrotask","DismissController","options","event","owner","content","triggers","path","composedPath","some","node","Element","hasAttribute","includes","trigger","key","preventDefault","active","document","activeElement","contains","onDismiss","connect","context","filter","el","HTMLElement","addEventListener","disconnect","removeEventListener","registry","WeakMap","toDismissContext","host","options","disabled","resolved","resolve","owner","HTMLElement","content","triggers","filter","element","createOutsideClickHandle","onDismiss","controller","DismissController","event","call","update","context","disconnect","connect","registerOutsideClickHandle","handle","handles","get","Set","set","add","updateOutsideClickHandles","forEach","disconnectOutsideClickHandles","lifecycleApplied","WeakSet","wrapMethod","host","name","hook","callHookFirst","original","args","call","result","apply","ensureLifecycle","has","add","updateOutsideClickHandles","disconnectOutsideClickHandles","OutsideClick","options","originalMethod","context","addInitializer","resolve","owner","content","triggers","handle","createOutsideClickHandle","event","disabled","registerOutsideClickHandle","isConnected","renderQueue","WeakMap","cleanupRegistry","observerRegistry","internalMutations","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","delete","toKebabCase","value","String","replace","toLowerCase","registerCleanup","cleanup","callbacks","Set","original","disconnectedCallback","args","registered","forEach","callback","error","console","apply","undefined","add","markInternalMutation","host","attribute","attributes","isInternalMutation","hasAttribute","has","size","observeAttribute","handler","entry","Map","observer","MutationObserver","records","record","attributeName","listeners","currentValue","target","getAttribute","listener","observe","disconnect","updateAttribute","removeAttribute","setAttribute","resolveType","type","Boolean","Number","Object","Array","typeParsers","boolean","number","parsed","isNaN","json","JSON","parse","warn","string","typeFormatters","stringify","defaultCompare","previous","next","Prop","options","reflect","format","defaultValue","compare","onChange","onAttributeChange","resolvedType","parseValue","call","formatValue","accessor","context","kind","Error","name","addInitializer","rawValue","formatted","init","initialValue","defaultOptions","all","closest","from","fallback","resolveFallback","host","resolveRoot","option","document","renderRoot","shadowRoot","resolveQuery","selector","options","result","root","elements","Array","querySelectorAll","length","match","querySelector","createQueryDecorator","_target","context","kind","descriptor","get","set","_value","addInitializer","Object","defineProperty","name","configurable","enumerable","Query","userOptions","Error","merged","renderQueue","WeakMap","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","defaultCompare","previous","next","Watch","options","compare","onChange","transform","accessor","context","kind","Error","call","value","init","initialValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/decorators/index.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Component.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Listen.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/utils/dismiss-controller.ts","../src/utils/outside-click.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/OutsideClick.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Prop.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Query.ts","/Users/aaroniker/Documents/GitHub/ease/web-kit/packages/core/src/decorators/Watch.ts"],"sourcesContent":["export { Component, type RenderContext } from './Component';\nexport { Listen } from './Listen';\nexport { OutsideClick } from './OutsideClick';\nexport { Prop } from './Prop';\nexport { Query } from './Query';\nexport { Watch } from './Watch';\n","import { html, render, type TemplateResult } from 'lit-html';\n\ntype Constructor<T extends HTMLElement> = new (...args: unknown[]) => T;\n\ninterface LifecycleElement {\n connectedCallback?(): void;\n disconnectedCallback?(): void;\n attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;\n}\n\ntype RenderableElement = HTMLElement & {\n render?(): TemplateResult | null | undefined;\n afterRender?(): void;\n wrapRender?(commit: () => void, context: RenderContext): void;\n onAttributeChange?(name: string, oldValue: string | null, newValue: string | null): void;\n requestRender?(): void;\n renderRoot?: ShadowRoot | HTMLElement;\n};\n\ntype TemplateValue<TElement extends RenderableElement> =\n | TemplateResult\n | null\n | undefined\n | ((this: TElement, host: TElement) => TemplateResult | null | undefined);\n\ninterface ComponentOptions<TElement extends RenderableElement = RenderableElement> {\n tag: string;\n template?: TemplateValue<TElement>;\n styles?: string;\n styleUrls?: string[];\n observedAttributes?: string[];\n shadowMode?: ShadowRootMode;\n autoSlot?: boolean;\n}\n\n// Exporting RenderContext\nexport interface RenderContext {\n fragment: DocumentFragment;\n root: ShadowRoot | HTMLElement;\n}\n\nconst styleCache = new Map<string, Promise<string>>();\n\nconst normalizeTemplate = <TElement extends RenderableElement>(\n template?: TemplateValue<TElement>\n): ((this: TElement, host: TElement) => TemplateResult | null | undefined) => {\n if (typeof template === 'function') {\n return template as (this: TElement, host: TElement) => TemplateResult | null | undefined;\n }\n\n if (template && typeof template === 'object' && '_$litTemplate$' in template) {\n return function (this: TElement): TemplateResult | null | undefined {\n return template as TemplateResult;\n };\n }\n\n return function (this: TElement): TemplateResult | null | undefined {\n return null;\n };\n};\n\nconst fetchStyles = async (urls: readonly string[]): Promise<string[]> =>\n Promise.all(\n urls.map((url) => {\n const cached = styleCache.get(url);\n if (cached) {\n return cached;\n }\n\n const request = fetch(url)\n .then((response) => (response.ok ? response.text() : ''))\n .catch(() => '');\n\n styleCache.set(url, request);\n return request;\n })\n );\n\nexport const Component =\n <TElement extends RenderableElement = RenderableElement>(options: ComponentOptions<TElement>) =>\n <TBase extends Constructor<TElement> & { observedAttributes?: string[] }>(\n Base: TBase,\n _context: ClassDecoratorContext\n ): TBase => {\n const {\n tag,\n template,\n styles = '',\n styleUrls = [],\n observedAttributes = [],\n shadowMode = 'open',\n autoSlot = true\n } = options;\n\n if (!tag) {\n throw new Error('@Component requires a \"tag\" option.');\n }\n\n const templateFn = normalizeTemplate<TElement>(template);\n\n class Decorated extends (Base as unknown as Constructor<RenderableElement>) {\n static get observedAttributes(): string[] {\n const parent =\n 'observedAttributes' in Base && Array.isArray(Base.observedAttributes)\n ? (Base.observedAttributes as string[])\n : [];\n const own = Array.isArray(observedAttributes) ? observedAttributes : [];\n return Array.from(new Set([...parent, ...own]));\n }\n\n #shadow: ShadowRoot;\n #styles = styles;\n #styleUrls = [...styleUrls];\n #renderScheduled = false;\n\n constructor(...args: unknown[]) {\n super(...args);\n this.#shadow = this.attachShadow({ mode: shadowMode });\n this.renderRoot = this.#shadow;\n }\n\n get shadow(): HTMLElement | ShadowRoot | undefined {\n return this.renderRoot;\n }\n\n connectedCallback(): void {\n (Base.prototype as LifecycleElement).connectedCallback?.call(this);\n\n void this.#loadStyles().finally(() => {\n this.requestRender();\n });\n }\n\n disconnectedCallback(): void {\n (Base.prototype as LifecycleElement).disconnectedCallback?.call(this);\n this.#renderScheduled = false;\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n (Base.prototype as LifecycleElement).attributeChangedCallback?.call(this, name, oldValue, newValue);\n\n if (oldValue !== newValue) {\n this.onAttributeChange?.(name, oldValue, newValue);\n }\n }\n\n requestRender(): void {\n if (this.#renderScheduled) {\n return;\n }\n\n this.#renderScheduled = true;\n\n requestAnimationFrame(() => {\n this.#renderScheduled = false;\n this.#render();\n });\n }\n\n async #loadStyles(): Promise<void> {\n if (!this.#styleUrls.length) {\n return;\n }\n\n const fetched = await fetchStyles(this.#styleUrls);\n const inlineStyles = this.#styles ? [this.#styles] : [];\n this.#styles = [...inlineStyles, ...fetched.filter(Boolean)].join('\\n');\n }\n\n #render(): void {\n const root = this.#shadow;\n\n let templateResult: TemplateResult | null | undefined;\n\n if (typeof this.render === 'function') {\n templateResult = this.render();\n } else {\n templateResult = templateFn.call(this as unknown as TElement, this as unknown as TElement);\n }\n\n const styleTemplate = this.#styles ? html`<style>${this.#styles}</style>` : null;\n const slotTemplate = autoSlot ? html`<slot></slot>` : null;\n\n const completeTemplate = html`\n ${styleTemplate}\n ${templateResult ?? null}\n ${slotTemplate}\n `;\n\n const commit = (): void => {\n render(completeTemplate, root);\n this.afterRender?.();\n };\n\n if (typeof this.wrapRender === 'function') {\n const fragment = document.createDocumentFragment();\n const tempDiv = document.createElement('div');\n\n render(completeTemplate, tempDiv);\n\n fragment.append(...tempDiv.childNodes);\n\n this.wrapRender(commit, { fragment, root });\n return;\n }\n\n commit();\n }\n }\n\n // SSR safety: only register in browser environments\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n customElements.define(tag, Decorated as unknown as CustomElementConstructor);\n }\n\n return Decorated as unknown as TBase;\n };\n","type ListenHost = HTMLElement & {\n renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype LifecycleHookName = 'connectedCallback' | 'disconnectedCallback';\n\ntype LifecycleCallback<THost extends ListenHost> = (this: THost) => void;\n\ntype ListenTargetResolver<THost extends ListenHost> =\n | 'document'\n | 'window'\n | 'shadow'\n | 'root'\n | 'light'\n | EventTarget\n | ((host: THost) => EventTarget | null | undefined);\n\ntype Predicate<TEvent extends Event, TElement extends Element> = (event: TEvent, matched: TElement | null) => boolean;\n\ninterface ListenOptions<THost extends ListenHost, TElement extends Element, TEvent extends Event> {\n selector?: string;\n target?: ListenTargetResolver<THost>;\n prevent?: boolean;\n stop?: boolean;\n stopImmediate?: boolean;\n once?: boolean;\n passive?: boolean;\n capture?: boolean;\n when?: Predicate<TEvent, TElement>;\n}\n\ntype Cleanup = () => void;\n\nconst lifecycleHooks: Record<LifecycleHookName, WeakMap<ListenHost, Set<LifecycleCallback<ListenHost>>>> = {\n connectedCallback: new WeakMap(),\n disconnectedCallback: new WeakMap()\n};\n\nconst cleanupRegistry = new WeakMap<ListenHost, Set<Cleanup>>();\n\nconst addLifecycleHook = <THost extends ListenHost>(\n instance: THost,\n hookName: LifecycleHookName,\n handler: LifecycleCallback<THost>\n): void => {\n const store = lifecycleHooks[hookName] as WeakMap<THost, Set<LifecycleCallback<THost>>>;\n let callbacks = store.get(instance);\n\n if (!callbacks) {\n callbacks = new Set<LifecycleCallback<THost>>();\n store.set(instance, callbacks);\n\n const original = (instance as unknown as Record<LifecycleHookName, unknown>)[hookName];\n\n (instance as unknown as Record<LifecycleHookName, unknown>)[hookName] = function (...args: unknown[]) {\n callbacks?.forEach((callback) => {\n callback.apply(this as THost);\n });\n\n if (typeof original === 'function') {\n return (original as (...params: unknown[]) => unknown).apply(this, args);\n }\n\n return undefined;\n };\n }\n\n callbacks.add(handler);\n};\n\nconst registerCleanup = <THost extends ListenHost>(instance: THost, cleanup: Cleanup): void => {\n let callbacks = cleanupRegistry.get(instance);\n\n if (!callbacks) {\n callbacks = new Set();\n cleanupRegistry.set(instance, callbacks);\n\n addLifecycleHook(instance, 'disconnectedCallback', function (this: THost) {\n const registered = cleanupRegistry.get(this);\n registered?.forEach((fn) => {\n try {\n fn();\n } catch (error) {\n console.error('[Listen] cleanup failed', error);\n }\n });\n cleanupRegistry.delete(this);\n });\n }\n\n callbacks.add(cleanup);\n};\n\nconst resolveTarget = <THost extends ListenHost>(\n host: THost,\n target: ListenTargetResolver<THost> | undefined\n): EventTarget | null => {\n if (typeof target === 'function') {\n return target(host) ?? null;\n }\n\n if (target instanceof EventTarget) {\n return target;\n }\n\n switch (target) {\n case 'document':\n return document;\n case 'window':\n return window;\n case 'light':\n return host;\n default:\n return host.renderRoot ?? host.shadowRoot ?? host;\n }\n};\n\nconst normalizeOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n selectorOrOptions: string | ListenOptions<THost, TElement, TEvent> | undefined\n): ListenOptions<THost, TElement, TEvent> => {\n if (typeof selectorOrOptions === 'string') {\n return { selector: selectorOrOptions };\n }\n\n return selectorOrOptions ?? {};\n};\n\nconst buildOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n options: ListenOptions<THost, TElement, TEvent>\n) => {\n return {\n selector: options.selector ?? null,\n target: options.target ?? 'shadow',\n prevent: options.prevent ?? false,\n stop: options.stop ?? false,\n stopImmediate: options.stopImmediate ?? false,\n once: options.once ?? false,\n passive: options.passive,\n capture: options.capture ?? false,\n when: options.when ?? null\n };\n};\n\nexport function Listen<THost extends ListenHost, TEvent extends Event = Event, TElement extends Element = Element>(\n eventName: keyof HTMLElementEventMap | string,\n selectorOrOptions?: string | ListenOptions<THost, TElement, TEvent>\n) {\n if (!eventName) {\n throw new Error('@Listen requires an event name.');\n }\n\n const listenConfig = buildOptions(normalizeOptions(selectorOrOptions));\n\n return (\n originalMethod: (this: THost, event: TEvent, matched?: TElement | null) => unknown,\n context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n ): void => {\n context.addInitializer(function (this: THost) {\n let attached = false;\n\n const attach = () => {\n if (attached) {\n return;\n }\n\n const target = resolveTarget(this, listenConfig.target);\n\n if (!target || typeof (target as EventTarget).addEventListener !== 'function') {\n console.warn(`@Listen unable to resolve target for ${String(eventName)}`);\n return;\n }\n\n const eventOptions: AddEventListenerOptions = {\n capture: listenConfig.capture,\n once: listenConfig.once,\n passive: listenConfig.passive !== undefined ? listenConfig.passive : !listenConfig.prevent\n };\n\n const handler = (event: Event): void => {\n const typedEvent = event as TEvent;\n\n if (listenConfig.prevent) {\n typedEvent.preventDefault();\n }\n\n if (listenConfig.stopImmediate) {\n typedEvent.stopImmediatePropagation();\n } else if (listenConfig.stop) {\n typedEvent.stopPropagation();\n }\n\n let matched: TElement | null = null;\n\n if (listenConfig.selector) {\n const path = typedEvent.composedPath();\n matched =\n path.find(\n (node): node is TElement => node instanceof Element && node.matches(listenConfig.selector as string)\n ) ?? null;\n\n if (!matched) {\n return;\n }\n }\n\n if (listenConfig.when && !listenConfig.when(typedEvent, matched)) {\n return;\n }\n\n if (listenConfig.selector) {\n void originalMethod.call(this, typedEvent, matched);\n } else {\n const targetNode = (\n typedEvent.target instanceof Element ? (typedEvent.target as TElement) : null\n ) as TElement | null;\n void originalMethod.call(this, typedEvent, targetNode);\n }\n };\n\n target.addEventListener(eventName as string, handler, eventOptions);\n attached = true;\n\n registerCleanup(this, () => {\n target.removeEventListener(eventName as string, handler, eventOptions);\n attached = false;\n });\n };\n\n // IMPORTANT:\n // Many components are created inside templates/shadow DOM. At construction time they are often not connected yet,\n // and patching instance lifecycle callbacks is not reliably invoked by the platform.\n // Attach the listener ASAP (microtask) so it works for nested components as well.\n queueMicrotask(attach);\n\n // Best-effort attach on connect too (idempotent).\n addLifecycleHook(this, 'connectedCallback', attach);\n });\n };\n}\n","export interface DismissContext {\n owner: HTMLElement;\n content?: HTMLElement | null;\n triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface DismissControllerOptions {\n onDismiss: (event: Event) => void;\n}\n\nexport class DismissController {\n #onDismiss: (event: Event) => void;\n #context: {\n owner: HTMLElement;\n content: HTMLElement | null;\n triggers: HTMLElement[];\n } | null = null;\n #active = false;\n\n constructor(options: DismissControllerOptions) {\n this.#onDismiss = options.onDismiss;\n }\n\n connect(context: DismissContext): void {\n this.#context = {\n owner: context.owner,\n content: context.content ?? null,\n triggers: (context.triggers ?? []).filter((el): el is HTMLElement => el instanceof HTMLElement)\n };\n\n if (!this.#active) {\n document.addEventListener('pointerdown', this.#handlePointerDown, true);\n document.addEventListener('keydown', this.#handleKeyDown, true);\n this.#active = true;\n }\n }\n\n disconnect(): void {\n if (!this.#active) {\n return;\n }\n\n document.removeEventListener('pointerdown', this.#handlePointerDown, true);\n document.removeEventListener('keydown', this.#handleKeyDown, true);\n this.#active = false;\n this.#context = null;\n }\n\n #handlePointerDown = (event: PointerEvent): void => {\n if (!this.#context) {\n return;\n }\n\n const { owner, content, triggers } = this.#context;\n const path = event.composedPath();\n\n if (path.some((node) => node instanceof Element && node.hasAttribute('data-select-ignore'))) {\n return;\n }\n\n if (path.includes(owner)) {\n return;\n }\n\n if (content && path.includes(content)) {\n return;\n }\n\n if (triggers.some((trigger) => path.includes(trigger))) {\n return;\n }\n\n this.#onDismiss(event);\n };\n\n #handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !this.#context) {\n return;\n }\n\n event.preventDefault();\n\n const active = document.activeElement as HTMLElement | null;\n\n if (!active) {\n this.#onDismiss(event);\n return;\n }\n\n const { owner, content, triggers } = this.#context;\n const path = event.composedPath();\n\n if (path.includes(owner) || owner.contains(active)) {\n this.#onDismiss(event);\n return;\n }\n\n if (content && (path.includes(content) || content.contains(active))) {\n this.#onDismiss(event);\n return;\n }\n\n if (triggers.some((trigger) => path.includes(trigger) || trigger.contains(active))) {\n this.#onDismiss(event);\n }\n };\n}\n","import type { DismissContext } from './dismiss-controller';\n\nimport { DismissController } from './dismiss-controller';\n\nexport interface OutsideClickResolution {\n owner?: HTMLElement | null | undefined;\n content?: HTMLElement | null | undefined;\n triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface OutsideClickHandle {\n update(): void;\n disconnect(): void;\n}\n\nexport interface OutsideClickHandleOptions<THost extends HTMLElement> {\n resolve: (host: THost) => OutsideClickResolution | null | undefined;\n disabled?: (host: THost) => boolean;\n}\n\nconst registry = new WeakMap<HTMLElement, Set<OutsideClickHandle>>();\n\nconst toDismissContext = <THost extends HTMLElement>(\n host: THost,\n options: OutsideClickHandleOptions<THost>\n): DismissContext | null => {\n if (options.disabled?.(host)) {\n return null;\n }\n\n const resolved = options.resolve(host);\n\n if (!resolved) {\n return null;\n }\n\n const owner = resolved.owner ?? host ?? null;\n\n if (!(owner instanceof HTMLElement)) {\n return null;\n }\n\n const content = resolved.content && resolved.content instanceof HTMLElement ? resolved.content : null;\n\n const triggers = resolved.triggers?.filter((element): element is HTMLElement => element instanceof HTMLElement) ?? [];\n\n return {\n owner,\n content,\n triggers\n };\n};\n\nexport const createOutsideClickHandle = <THost extends HTMLElement>(\n host: THost,\n onDismiss: (this: THost, event: Event) => void,\n options: OutsideClickHandleOptions<THost>\n): OutsideClickHandle => {\n const controller = new DismissController({\n onDismiss(event) {\n if (options.disabled?.(host)) {\n return;\n }\n\n onDismiss.call(host, event);\n }\n });\n\n return {\n update(): void {\n const context = toDismissContext(host, options);\n if (!context) {\n controller.disconnect();\n return;\n }\n\n controller.connect(context);\n },\n disconnect(): void {\n controller.disconnect();\n }\n };\n};\n\nexport const registerOutsideClickHandle = (host: HTMLElement, handle: OutsideClickHandle): void => {\n let handles = registry.get(host);\n\n if (!handles) {\n handles = new Set();\n registry.set(host, handles);\n }\n\n handles.add(handle);\n};\n\nexport const updateOutsideClickHandles = (host: HTMLElement): void => {\n const handles = registry.get(host);\n\n if (!handles) {\n return;\n }\n\n handles.forEach((handle) => {\n handle.update();\n });\n};\n\nexport const disconnectOutsideClickHandles = (host: HTMLElement): void => {\n const handles = registry.get(host);\n\n if (!handles) {\n return;\n }\n\n handles.forEach((handle) => {\n handle.disconnect();\n });\n};\n\nexport const requestOutsideClickUpdate = (host: HTMLElement): void => {\n updateOutsideClickHandles(host);\n};\n","import type { OutsideClickResolution } from '~/utils/outside-click';\n\nimport {\n createOutsideClickHandle,\n disconnectOutsideClickHandles,\n registerOutsideClickHandle,\n updateOutsideClickHandles\n} from '~/utils/outside-click';\n\ntype OutsideClickHost = HTMLElement & {\n connectedCallback?: (...args: unknown[]) => unknown;\n disconnectedCallback?: (...args: unknown[]) => unknown;\n afterRender?: (...args: unknown[]) => unknown;\n};\n\ntype HookName = 'connectedCallback' | 'disconnectedCallback' | 'afterRender';\n\ninterface OutsideClickOptions<THost extends OutsideClickHost> {\n resolve?: (host: THost) => OutsideClickResolution | null | undefined;\n owner?: (host: THost) => HTMLElement | null | undefined;\n content?: (host: THost) => HTMLElement | null | undefined;\n triggers?: (host: THost) => Array<HTMLElement | null | undefined>;\n disabled?: (host: THost) => boolean;\n}\n\nconst lifecycleApplied = new WeakSet<OutsideClickHost>();\n\nconst wrapMethod = (\n host: OutsideClickHost,\n name: HookName,\n hook: (this: OutsideClickHost) => void,\n callHookFirst = false\n): void => {\n const original = host[name];\n\n (host as Required<OutsideClickHost>)[name] = function (...args: unknown[]) {\n if (callHookFirst) {\n hook.call(this);\n }\n\n let result: unknown;\n\n if (typeof original === 'function') {\n result = (original as (...params: unknown[]) => unknown).apply(this, args);\n }\n\n if (!callHookFirst) {\n hook.call(this);\n }\n\n return result;\n };\n};\n\nconst ensureLifecycle = (host: OutsideClickHost): void => {\n if (lifecycleApplied.has(host)) {\n return;\n }\n\n lifecycleApplied.add(host);\n\n wrapMethod(host, 'connectedCallback', function (this: OutsideClickHost) {\n updateOutsideClickHandles(this);\n });\n\n wrapMethod(host, 'afterRender', function (this: OutsideClickHost) {\n updateOutsideClickHandles(this);\n });\n\n wrapMethod(\n host,\n 'disconnectedCallback',\n function (this: OutsideClickHost) {\n disconnectOutsideClickHandles(this);\n },\n true\n );\n};\n\nexport function OutsideClick<THost extends OutsideClickHost, TEvent extends Event = Event>(\n options: OutsideClickOptions<THost> = {}\n) {\n return (\n originalMethod: (this: THost, event: TEvent) => unknown,\n context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n ): void => {\n context.addInitializer(function (this: THost) {\n ensureLifecycle(this);\n\n const resolve =\n options.resolve ??\n ((host: THost): OutsideClickResolution => {\n return {\n owner: options.owner?.(host),\n content: options.content?.(host),\n triggers: options.triggers?.(host)\n };\n });\n\n const handle = createOutsideClickHandle(\n this,\n (event) => {\n originalMethod.call(this, event as TEvent);\n },\n {\n resolve,\n disabled: options.disabled\n }\n );\n\n registerOutsideClickHandle(this, handle);\n\n if (this.isConnected) {\n updateOutsideClickHandles(this);\n }\n });\n };\n}\n\nexport { requestOutsideClickUpdate } from '~/utils/outside-click';\nexport type { OutsideClickOptions };\n","type RenderHost = HTMLElement & {\n requestRender?(): void;\n render?(): void;\n connectedCallback?(): void;\n disconnectedCallback?(...args: unknown[]): void;\n};\n\ntype PropTypeDescriptor =\n | BooleanConstructor\n | NumberConstructor\n | StringConstructor\n | ObjectConstructor\n | ArrayConstructor\n | 'boolean'\n | 'number'\n | 'string'\n | 'json';\n\ntype Formatter<TValue, THost extends RenderHost> = (this: THost, value: TValue) => string | null | undefined;\ntype Parser<TValue, THost extends RenderHost> = (this: THost, value: string | null) => TValue;\n\ninterface PropOptions<TValue, THost extends RenderHost> {\n attribute?: string;\n reflect?: boolean;\n type?: PropTypeDescriptor;\n parse?: Parser<TValue, THost>;\n format?: Formatter<TValue, THost>;\n defaultValue?: TValue | ((this: THost) => TValue);\n compare?: (previous: TValue, next: TValue) => boolean;\n onChange?: (this: THost, next: TValue, previous: TValue) => void;\n onAttributeChange?: (this: THost, next: TValue, previous: TValue) => void;\n}\n\ninterface AttributeObserverEntry {\n observer: MutationObserver;\n callbacks: Map<string, Set<(value: string | null) => void>>;\n}\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\nconst cleanupRegistry = new WeakMap<RenderHost, Set<() => void>>();\nconst observerRegistry = new WeakMap<RenderHost, AttributeObserverEntry>();\nconst internalMutations = new WeakMap<RenderHost, Set<string>>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n if (typeof instance.requestRender === 'function') {\n instance.requestRender();\n return;\n }\n\n if (typeof instance.render !== 'function') {\n return;\n }\n\n if (renderQueue.get(instance)) {\n return;\n }\n\n renderQueue.set(instance, true);\n\n requestAnimationFrame(() => {\n renderQueue.delete(instance);\n instance.render?.();\n });\n};\n\nconst toKebabCase = (value: PropertyKey): string =>\n String(value)\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n\nconst registerCleanup = (instance: RenderHost, cleanup: () => void): void => {\n let callbacks = cleanupRegistry.get(instance);\n\n if (!callbacks) {\n callbacks = new Set();\n cleanupRegistry.set(instance, callbacks);\n\n const original = instance.disconnectedCallback;\n\n instance.disconnectedCallback = function (this: RenderHost, ...args: unknown[]) {\n const registered = cleanupRegistry.get(this);\n registered?.forEach((callback) => {\n try {\n callback();\n } catch (error) {\n console.error('[Prop] cleanup failed', error);\n }\n });\n cleanupRegistry.delete(this);\n\n if (typeof original === 'function') {\n return original.apply(this, args as []);\n }\n\n return undefined;\n } as typeof instance.disconnectedCallback;\n }\n\n callbacks.add(cleanup);\n};\n\nconst markInternalMutation = (host: RenderHost, attribute: string): void => {\n let attributes = internalMutations.get(host);\n\n if (!attributes) {\n attributes = new Set();\n internalMutations.set(host, attributes);\n }\n\n attributes.add(attribute);\n};\n\nconst isInternalMutation = (host: RenderHost, attribute: string): boolean => {\n const attributes = internalMutations.get(host);\n\n if (!attributes) {\n return false;\n }\n\n const hasAttribute = attributes.has(attribute);\n\n if (hasAttribute) {\n attributes.delete(attribute);\n if (attributes.size === 0) {\n internalMutations.delete(host);\n }\n }\n\n return hasAttribute;\n};\n\nconst observeAttribute = (host: RenderHost, attribute: string, handler: (value: string | null) => void): void => {\n let entry = observerRegistry.get(host);\n\n if (!entry) {\n const callbacks = new Map<string, Set<(value: string | null) => void>>();\n const observer = new MutationObserver((records) => {\n records.forEach((record) => {\n const attributeName = record.attributeName;\n\n if (!attributeName) {\n return;\n }\n\n if (isInternalMutation(host, attributeName)) {\n return;\n }\n\n const listeners = callbacks.get(attributeName);\n if (!listeners) {\n return;\n }\n\n const currentValue = (record.target as Element).getAttribute(attributeName);\n\n for (const listener of listeners) {\n listener(currentValue);\n }\n });\n });\n\n observer.observe(host, { attributes: true });\n\n entry = { observer, callbacks };\n observerRegistry.set(host, entry);\n\n registerCleanup(host, () => {\n observer.disconnect();\n observerRegistry.delete(host);\n });\n }\n\n let listeners = entry.callbacks.get(attribute);\n\n if (!listeners) {\n listeners = new Set();\n entry.callbacks.set(attribute, listeners);\n }\n\n listeners.add(handler);\n};\n\nconst updateAttribute = (host: RenderHost, attribute: string, value: string | null | undefined | boolean): void => {\n markInternalMutation(host, attribute);\n\n if (value === undefined || value === null || value === false) {\n host.removeAttribute(attribute);\n return;\n }\n\n if (value === true) {\n host.setAttribute(attribute, '');\n return;\n }\n\n host.setAttribute(attribute, String(value));\n};\n\nconst resolveType = (type: PropTypeDescriptor | undefined): 'boolean' | 'number' | 'json' | 'string' | null => {\n if (!type) {\n return null;\n }\n\n if (type === Boolean || type === 'boolean') {\n return 'boolean';\n }\n\n if (type === Number || type === 'number') {\n return 'number';\n }\n\n if (type === Object || type === Array || type === 'json') {\n return 'json';\n }\n\n return 'string';\n};\n\nconst typeParsers: Record<'boolean' | 'number' | 'json' | 'string', Parser<unknown, RenderHost>> = {\n boolean(value: string | null): boolean {\n return value !== null;\n },\n number(value: string | null): number | null {\n if (value === null || value === '') {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isNaN(parsed) ? null : parsed;\n },\n json(value: string | null): unknown {\n if (!value) {\n return null;\n }\n\n try {\n return JSON.parse(value);\n } catch (error) {\n console.warn('[Prop] failed to parse JSON attribute', error);\n return null;\n }\n },\n string(value: string | null): string | null {\n return value;\n }\n};\n\nconst typeFormatters: Record<'boolean' | 'number' | 'json' | 'string', Formatter<unknown, RenderHost>> = {\n boolean(value: unknown): string | null {\n return value ? '' : null;\n },\n number(value: unknown): string | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n return String(value);\n },\n json(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n },\n string(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n return String(value);\n }\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\nexport function Prop<TValue, THost extends RenderHost = RenderHost>(options: PropOptions<TValue, THost> = {}) {\n const {\n attribute,\n reflect = true,\n type,\n parse,\n format,\n defaultValue,\n compare = defaultCompare,\n onChange,\n onAttributeChange\n } = options;\n\n const resolvedType = resolveType(type);\n\n const parseValue: Parser<TValue, THost> = parse\n ? parse\n : function (this: THost, value) {\n if (!resolvedType) {\n return value as unknown as TValue;\n }\n return typeParsers[resolvedType].call(this, value) as TValue;\n };\n\n const formatValue: Formatter<TValue, THost> = format\n ? format\n : function (this: THost, value) {\n if (!resolvedType) {\n return (value as unknown as string | null | undefined) ?? null;\n }\n return typeFormatters[resolvedType].call(this, value as unknown) as string | null;\n };\n\n return (\n accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n context: ClassAccessorDecoratorContext<THost, TValue>\n ): ClassAccessorDecoratorResult<THost, TValue> => {\n if (context.kind !== 'accessor') {\n throw new Error('@Prop requires the \"accessor\" keyword on the property.');\n }\n\n const attributeName = attribute ?? toKebabCase(context.name);\n\n context.addInitializer(function (this: THost) {\n if (!reflect) {\n return;\n }\n\n observeAttribute(this, attributeName, (rawValue) => {\n if (isInternalMutation(this, attributeName)) {\n return;\n }\n\n const parsed = parseValue.call(this, rawValue);\n const previous = accessor.get.call(this);\n\n if (compare(previous, parsed)) {\n return;\n }\n\n accessor.set.call(this, parsed);\n\n onAttributeChange?.call(this, parsed, previous);\n scheduleRender(this);\n });\n });\n\n return {\n get(this: THost): TValue {\n return accessor.get.call(this);\n },\n set(this: THost, value: TValue): void {\n const previous = accessor.get.call(this);\n\n if (compare(previous, value)) {\n return;\n }\n\n accessor.set.call(this, value);\n\n if (reflect) {\n const formatted = formatValue.call(this, value);\n updateAttribute(this, attributeName, formatted);\n }\n\n onChange?.call(this, value, previous);\n scheduleRender(this);\n },\n init(this: THost, initialValue: TValue): TValue {\n let value = initialValue;\n\n if (this.hasAttribute(attributeName)) {\n value = parseValue.call(this, this.getAttribute(attributeName));\n } else if (value === undefined && defaultValue !== undefined) {\n value =\n typeof defaultValue === 'function' ? (defaultValue as (this: THost) => TValue).call(this) : defaultValue;\n }\n\n if (reflect) {\n const formatted = formatValue.call(this, value);\n updateAttribute(this, attributeName, formatted);\n }\n\n return value;\n }\n };\n };\n}\n","type QueryRoot = 'shadow' | 'light' | 'document';\n\ntype QueryHost = HTMLElement & {\n renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype QueryFallback<TResult, THost extends QueryHost> = TResult | ((host: THost) => TResult);\n\ninterface BaseQueryOptions<TResult, THost extends QueryHost> {\n from?: QueryRoot;\n fallback?: QueryFallback<TResult, THost>;\n}\n\ninterface QueryAllOptions<TElement extends Element, THost extends QueryHost>\n extends BaseQueryOptions<TElement[], THost> {\n all: true;\n closest?: false;\n}\n\ninterface QueryClosestOptions<THost extends QueryHost> extends BaseQueryOptions<Element | null, THost> {\n closest: true;\n all?: false;\n}\n\ninterface QuerySingleOptions<TElement extends Element, THost extends QueryHost>\n extends BaseQueryOptions<TElement | null, THost> {\n all?: false;\n closest?: false;\n}\n\ntype QueryOptions<TElement extends Element, THost extends QueryHost> =\n | QueryAllOptions<TElement, THost>\n | QueryClosestOptions<THost>\n | QuerySingleOptions<TElement, THost>;\n\ntype QueryReturnType<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n> = TOptions extends QueryAllOptions<TElement, THost>\n ? TElement[]\n : TOptions extends QueryClosestOptions<THost>\n ? Element | null\n : TElement | null;\n\ntype QueryDecorator<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n> = (\n target: ClassAccessorDecoratorTarget<THost, QueryReturnType<TElement, THost, TOptions>> | undefined,\n context:\n | ClassFieldDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n | ClassAccessorDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n) => ClassAccessorDecoratorResult<THost, QueryReturnType<TElement, THost, TOptions>> | undefined;\n\nconst defaultOptions = {\n all: false,\n closest: false,\n from: 'shadow' as QueryRoot | undefined,\n fallback: null\n} as const satisfies QuerySingleOptions<Element, QueryHost>;\n\nconst resolveFallback = <TResult, THost extends QueryHost>(\n fallback: QueryFallback<TResult, THost> | undefined,\n host: THost\n): TResult | undefined => {\n if (typeof fallback === 'function') {\n return (fallback as (instance: THost) => TResult)(host);\n }\n\n return fallback;\n};\n\nconst resolveRoot = (host: QueryHost, option: QueryRoot | undefined): ParentNode | null => {\n switch (option) {\n case 'document':\n return document;\n case 'light':\n return host;\n default:\n return host.renderRoot ?? host.shadowRoot ?? host;\n }\n};\n\nconst resolveQuery = <\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(\n host: THost,\n selector: string,\n options: TOptions\n) => {\n if (options.closest) {\n const result = host.closest(selector);\n return result ?? resolveFallback(options.fallback as QueryFallback<Element | null, THost>, host) ?? null;\n }\n\n const root = resolveRoot(host, options.from);\n\n if (!root) {\n return options.all\n ? (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? [])\n : (resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null);\n }\n\n if (options.all) {\n const elements = Array.from(root.querySelectorAll<TElement>(selector));\n return elements.length > 0\n ? elements\n : (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? []);\n }\n\n const match = root.querySelector<TElement>(selector);\n return match ?? resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null;\n};\n\nconst createQueryDecorator = <\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(\n selector: string,\n options: TOptions\n): QueryDecorator<TElement, THost, TOptions> => {\n type Result = QueryReturnType<TElement, THost, TOptions>;\n\n return (\n _target: ClassAccessorDecoratorTarget<THost, Result> | undefined,\n context: ClassFieldDecoratorContext<THost, Result> | ClassAccessorDecoratorContext<THost, Result>\n ): ClassAccessorDecoratorResult<THost, Result> | undefined => {\n if (context.kind === 'accessor') {\n const descriptor: ClassAccessorDecoratorResult<THost, Result> = {\n get(this: THost) {\n return resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result;\n },\n set(_value: Result) {\n // Readonly accessor\n }\n };\n return descriptor;\n }\n\n context.addInitializer(function (this: THost) {\n Object.defineProperty(this, context.name, {\n configurable: true,\n enumerable: true,\n get: () => resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result\n });\n });\n\n return;\n };\n};\n\nexport function Query<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(selector: string, userOptions: TOptions): QueryDecorator<TElement, THost, TOptions>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n selector: string\n): QueryDecorator<TElement, THost, QuerySingleOptions<TElement, THost>>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n selector: string,\n userOptions?: QueryOptions<TElement, THost>\n) {\n if (!selector) {\n throw new Error('@Query requires a selector.');\n }\n\n if (userOptions) {\n const merged = { ...defaultOptions, ...userOptions } as QueryOptions<TElement, THost>;\n return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n }\n\n const merged = defaultOptions as QuerySingleOptions<TElement, THost>;\n return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n}\n","type RenderHost = HTMLElement & {\n requestRender?(): void;\n render?(): void;\n};\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n if (typeof instance.requestRender === 'function') {\n instance.requestRender();\n return;\n }\n\n if (typeof instance.render !== 'function') {\n return;\n }\n\n if (renderQueue.get(instance)) {\n return;\n }\n\n renderQueue.set(instance, true);\n\n requestAnimationFrame(() => {\n renderQueue.set(instance, false);\n\n instance.render?.();\n });\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\ninterface WatchOptions<TValue, THost extends RenderHost> {\n compare?: (previous: TValue, next: TValue) => boolean;\n onChange?: (this: THost, next: TValue, previous: TValue) => void;\n transform?: (this: THost, initial: TValue) => TValue;\n}\n\nexport function Watch<TValue, THost extends RenderHost = RenderHost>(options: WatchOptions<TValue, THost> = {}) {\n const { compare = defaultCompare, onChange, transform } = options;\n\n return (\n accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n context: ClassAccessorDecoratorContext<THost, TValue>\n ): ClassAccessorDecoratorResult<THost, TValue> => {\n if (context.kind !== 'accessor') {\n throw new Error('@Watch requires the \"accessor\" keyword on the property.');\n }\n\n return {\n get(this: THost): TValue {\n return accessor.get.call(this);\n },\n set(this: THost, value: TValue): void {\n const previous = accessor.get.call(this);\n\n if (compare(previous, value)) {\n return;\n }\n\n accessor.set.call(this, value);\n\n if (onChange) {\n onChange.call(this, value, previous);\n }\n\n scheduleRender(this);\n },\n init(this: THost, initialValue: TValue): TValue {\n if (transform) {\n return transform.call(this, initialValue);\n }\n\n return initialValue;\n }\n };\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;ACAA,sBAAkD;AAyClD,IAAMA,aAAa,oBAAIC,IAAAA;AAEvB,IAAMC,oBAAoB,CACxBC,aAAAA;AAEA,MAAI,OAAOA,aAAa,YAAY;AAClC,WAAOA;EACT;AAEA,MAAIA,YAAY,OAAOA,aAAa,YAAY,oBAAoBA,UAAU;AAC5E,WAAO,WAAA;AACL,aAAOA;IACT;EACF;AAEA,SAAO,WAAA;AACL,WAAO;EACT;AACF;AAEA,IAAMC,cAAc,OAAOC,SACzBC,QAAQC,IACNF,KAAKG,IAAI,CAACC,QAAAA;AACR,QAAMC,SAASV,WAAWW,IAAIF,GAAAA;AAC9B,MAAIC,QAAQ;AACV,WAAOA;EACT;AAEA,QAAME,UAAUC,MAAMJ,GAAAA,EACnBK,KAAK,CAACC,aAAcA,SAASC,KAAKD,SAASE,KAAI,IAAK,EAAA,EACpDC,MAAM,MAAM,EAAA;AAEflB,aAAWmB,IAAIV,KAAKG,OAAAA;AACpB,SAAOA;AACT,CAAA,CAAA;AAGG,IAAMQ,YACX,CAAyDC,YACzD,CACEC,MACAC,aAAAA;AAEA,QAAM,EACJC,KACArB,UACAsB,SAAS,IACTC,YAAY,CAAA,GACZC,qBAAqB,CAAA,GACrBC,aAAa,QACbC,WAAW,KAAI,IACbR;AAEJ,MAAI,CAACG,KAAK;AACR,UAAM,IAAIM,MAAM,qCAAA;EAClB;AAEA,QAAMC,aAAa7B,kBAA4BC,QAAAA;EAE/C,MAAM6B,kBAAmBV,KAAAA;IACvB,WAAWK,qBAA+B;AACxC,YAAMM,SACJ,wBAAwBX,QAAQY,MAAMC,QAAQb,KAAKK,kBAAkB,IAChEL,KAAKK,qBACN,CAAA;AACN,YAAMS,MAAMF,MAAMC,QAAQR,kBAAAA,IAAsBA,qBAAqB,CAAA;AACrE,aAAOO,MAAMG,KAAK,oBAAIC,IAAI;WAAIL;WAAWG;OAAI,CAAA;IAC/C;IAEA;IACA;IACA;IACA;IAEA,eAAeG,MAAiB;AAC9B,YAAK,GAAIA,IAAAA,GAAAA,KALX,UAAUd,QAAAA,KACV,aAAa;WAAIC;SAAU,KAC3B,mBAAmB;AAIjB,WAAK,UAAU,KAAKc,aAAa;QAAEC,MAAMb;MAAW,CAAA;AACpD,WAAKc,aAAa,KAAK;IACzB;IAEA,IAAIC,SAA+C;AACjD,aAAO,KAAKD;IACd;IAEAE,oBAA0B;AACvBtB,WAAKuB,UAA+BD,mBAAmBE,KAAK,IAAI;AAEjE,WAAK,KAAK,YAAW,EAAGC,QAAQ,MAAA;AAC9B,aAAKC,cAAa;MACpB,CAAA;IACF;IAEAC,uBAA6B;AAC1B3B,WAAKuB,UAA+BI,sBAAsBH,KAAK,IAAI;AACpE,WAAK,mBAAmB;IAC1B;IAEAI,yBAAyBC,MAAcC,UAAyBC,UAA+B;AAC5F/B,WAAKuB,UAA+BK,0BAA0BJ,KAAK,MAAMK,MAAMC,UAAUC,QAAAA;AAE1F,UAAID,aAAaC,UAAU;AACzB,aAAKC,oBAAoBH,MAAMC,UAAUC,QAAAA;MAC3C;IACF;IAEAL,gBAAsB;AACpB,UAAI,KAAK,kBAAkB;AACzB;MACF;AAEA,WAAK,mBAAmB;AAExBO,4BAAsB,MAAA;AACpB,aAAK,mBAAmB;AACxB,aAAK,QAAO;MACd,CAAA;IACF;IAEA,MAAM,cAAW;AACf,UAAI,CAAC,KAAK,WAAWC,QAAQ;AAC3B;MACF;AAEA,YAAMC,UAAU,MAAMrD,YAAY,KAAK,UAAU;AACjD,YAAMsD,eAAe,KAAK,UAAU;QAAC,KAAK;UAAW,CAAA;AACrD,WAAK,UAAU;WAAIA;WAAiBD,QAAQE,OAAOC,OAAAA;QAAUC,KAAK,IAAA;IACpE;IAEA,UAAO;AACL,YAAMC,OAAO,KAAK;AAElB,UAAIC;AAEJ,UAAI,OAAO,KAAKC,WAAW,YAAY;AACrCD,yBAAiB,KAAKC,OAAM;MAC9B,OAAO;AACLD,yBAAiBhC,WAAWe,KAAK,MAA6B,IAAI;MACpE;AAEA,YAAMmB,gBAAgB,KAAK,UAAUC,8BAAc,KAAK,OAAO,aAAa;AAC5E,YAAMC,eAAetC,WAAWqC,sCAAsB;AAEtD,YAAME,mBAAmBF;YACrBD,aAAAA;YACAF,kBAAkB,IAAA;YAClBI,YAAAA;;AAGJ,YAAME,SAAS,MAAA;AACbL,oCAAOI,kBAAkBN,IAAAA;AACzB,aAAKQ,cAAW;MAClB;AAEA,UAAI,OAAO,KAAKC,eAAe,YAAY;AACzC,cAAMC,WAAWC,SAASC,uBAAsB;AAChD,cAAMC,UAAUF,SAASG,cAAc,KAAA;AAEvCZ,oCAAOI,kBAAkBO,OAAAA;AAEzBH,iBAASK,OAAM,GAAIF,QAAQG,UAAU;AAErC,aAAKP,WAAWF,QAAQ;UAAEG;UAAUV;QAAK,CAAA;AACzC;MACF;AAEAO,aAAAA;IACF;EACF;AAGA,MAAI,OAAOU,mBAAmB,eAAe,CAACA,eAAepE,IAAIa,GAAAA,GAAM;AACrEuD,mBAAeC,OAAOxD,KAAKQ,SAAAA;EAC7B;AAEA,SAAOA;AACT;;;ACvLF,IAAMiD,iBAAqG;EACzGC,mBAAmB,oBAAIC,QAAAA;EACvBC,sBAAsB,oBAAID,QAAAA;AAC5B;AAEA,IAAME,kBAAkB,oBAAIF,QAAAA;AAE5B,IAAMG,mBAAmB,CACvBC,UACAC,UACAC,YAAAA;AAEA,QAAMC,QAAQT,eAAeO,QAAAA;AAC7B,MAAIG,YAAYD,MAAME,IAAIL,QAAAA;AAE1B,MAAI,CAACI,WAAW;AACdA,gBAAY,oBAAIE,IAAAA;AAChBH,UAAMI,IAAIP,UAAUI,SAAAA;AAEpB,UAAMI,WAAYR,SAA2DC,QAAAA;AAE5ED,aAA2DC,QAAAA,IAAY,YAAaQ,MAAe;AAClGL,iBAAWM,QAAQ,CAACC,aAAAA;AAClBA,iBAASC,MAAM,IAAI;MACrB,CAAA;AAEA,UAAI,OAAOJ,aAAa,YAAY;AAClC,eAAQA,SAA+CI,MAAM,MAAMH,IAAAA;MACrE;AAEA,aAAOI;IACT;EACF;AAEAT,YAAUU,IAAIZ,OAAAA;AAChB;AAEA,IAAMa,kBAAkB,CAA2Bf,UAAiBgB,YAAAA;AAClE,MAAIZ,YAAYN,gBAAgBO,IAAIL,QAAAA;AAEpC,MAAI,CAACI,WAAW;AACdA,gBAAY,oBAAIE,IAAAA;AAChBR,oBAAgBS,IAAIP,UAAUI,SAAAA;AAE9BL,qBAAiBC,UAAU,wBAAwB,WAAA;AACjD,YAAMiB,aAAanB,gBAAgBO,IAAI,IAAI;AAC3CY,kBAAYP,QAAQ,CAACQ,OAAAA;AACnB,YAAI;AACFA,aAAAA;QACF,SAASC,OAAO;AACdC,kBAAQD,MAAM,2BAA2BA,KAAAA;QAC3C;MACF,CAAA;AACArB,sBAAgBuB,OAAO,IAAI;IAC7B,CAAA;EACF;AAEAjB,YAAUU,IAAIE,OAAAA;AAChB;AAEA,IAAMM,gBAAgB,CACpBC,MACAC,WAAAA;AAEA,MAAI,OAAOA,WAAW,YAAY;AAChC,WAAOA,OAAOD,IAAAA,KAAS;EACzB;AAEA,MAAIC,kBAAkBC,aAAa;AACjC,WAAOD;EACT;AAEA,UAAQA,QAAAA;IACN,KAAK;AACH,aAAOE;IACT,KAAK;AACH,aAAOC;IACT,KAAK;AACH,aAAOJ;IACT;AACE,aAAOA,KAAKK,cAAcL,KAAKM,cAAcN;EACjD;AACF;AAEA,IAAMO,mBAAmB,CACvBC,sBAAAA;AAEA,MAAI,OAAOA,sBAAsB,UAAU;AACzC,WAAO;MAAEC,UAAUD;IAAkB;EACvC;AAEA,SAAOA,qBAAqB,CAAC;AAC/B;AAEA,IAAME,eAAe,CACnBC,YAAAA;AAEA,SAAO;IACLF,UAAUE,QAAQF,YAAY;IAC9BR,QAAQU,QAAQV,UAAU;IAC1BW,SAASD,QAAQC,WAAW;IAC5BC,MAAMF,QAAQE,QAAQ;IACtBC,eAAeH,QAAQG,iBAAiB;IACxCC,MAAMJ,QAAQI,QAAQ;IACtBC,SAASL,QAAQK;IACjBC,SAASN,QAAQM,WAAW;IAC5BC,MAAMP,QAAQO,QAAQ;EACxB;AACF;AAEO,SAASC,OACdC,WACAZ,mBAAmE;AAEnE,MAAI,CAACY,WAAW;AACd,UAAM,IAAIC,MAAM,iCAAA;EAClB;AAEA,QAAMC,eAAeZ,aAAaH,iBAAiBC,iBAAAA,CAAAA;AAEnD,SAAO,CACLe,gBACAC,YAAAA;AAEAA,YAAQC,eAAe,WAAA;AACrB,UAAIC,WAAW;AAEf,YAAMC,SAAS,MAAA;AACb,YAAID,UAAU;AACZ;QACF;AAEA,cAAMzB,SAASF,cAAc,MAAMuB,aAAarB,MAAM;AAEtD,YAAI,CAACA,UAAU,OAAQA,OAAuB2B,qBAAqB,YAAY;AAC7E/B,kBAAQgC,KAAK,wCAAwCC,OAAOV,SAAAA,CAAAA,EAAY;AACxE;QACF;AAEA,cAAMW,eAAwC;UAC5Cd,SAASK,aAAaL;UACtBF,MAAMO,aAAaP;UACnBC,SAASM,aAAaN,YAAY1B,SAAYgC,aAAaN,UAAU,CAACM,aAAaV;QACrF;AAEA,cAAMjC,UAAU,CAACqD,UAAAA;AACf,gBAAMC,aAAaD;AAEnB,cAAIV,aAAaV,SAAS;AACxBqB,uBAAWC,eAAc;UAC3B;AAEA,cAAIZ,aAAaR,eAAe;AAC9BmB,uBAAWE,yBAAwB;UACrC,WAAWb,aAAaT,MAAM;AAC5BoB,uBAAWG,gBAAe;UAC5B;AAEA,cAAIC,UAA2B;AAE/B,cAAIf,aAAab,UAAU;AACzB,kBAAM6B,OAAOL,WAAWM,aAAY;AACpCF,sBACEC,KAAKE,KACH,CAACC,SAA2BA,gBAAgBC,WAAWD,KAAKE,QAAQrB,aAAab,QAAQ,CAAA,KACtF;AAEP,gBAAI,CAAC4B,SAAS;AACZ;YACF;UACF;AAEA,cAAIf,aAAaJ,QAAQ,CAACI,aAAaJ,KAAKe,YAAYI,OAAAA,GAAU;AAChE;UACF;AAEA,cAAIf,aAAab,UAAU;AACzB,iBAAKc,eAAeqB,KAAK,MAAMX,YAAYI,OAAAA;UAC7C,OAAO;AACL,kBAAMQ,aACJZ,WAAWhC,kBAAkByC,UAAWT,WAAWhC,SAAsB;AAE3E,iBAAKsB,eAAeqB,KAAK,MAAMX,YAAYY,UAAAA;UAC7C;QACF;AAEA5C,eAAO2B,iBAAiBR,WAAqBzC,SAASoD,YAAAA;AACtDL,mBAAW;AAEXlC,wBAAgB,MAAM,MAAA;AACpBS,iBAAO6C,oBAAoB1B,WAAqBzC,SAASoD,YAAAA;AACzDL,qBAAW;QACb,CAAA;MACF;AAMAqB,qBAAepB,MAAAA;AAGfnD,uBAAiB,MAAM,qBAAqBmD,MAAAA;IAC9C,CAAA;EACF;AACF;;;ACpOO,IAAMqB,oBAAN,MAAMA;EACX;EACA;EAKA;EAEA,YAAYC,SAAmC;SAP/C,WAIW;SACX,UAAU;SA+BV,qBAAqB,CAACC,UAAAA;AACpB,UAAI,CAAC,KAAK,UAAU;AAClB;MACF;AAEA,YAAM,EAAEC,OAAOC,SAASC,SAAQ,IAAK,KAAK;AAC1C,YAAMC,OAAOJ,MAAMK,aAAY;AAE/B,UAAID,KAAKE,KAAK,CAACC,SAASA,gBAAgBC,WAAWD,KAAKE,aAAa,oBAAA,CAAA,GAAwB;AAC3F;MACF;AAEA,UAAIL,KAAKM,SAAST,KAAAA,GAAQ;AACxB;MACF;AAEA,UAAIC,WAAWE,KAAKM,SAASR,OAAAA,GAAU;AACrC;MACF;AAEA,UAAIC,SAASG,KAAK,CAACK,YAAYP,KAAKM,SAASC,OAAAA,CAAAA,GAAW;AACtD;MACF;AAEA,WAAK,WAAWX,KAAAA;IAClB;SAEA,iBAAiB,CAACA,UAAAA;AAChB,UAAIA,MAAMY,QAAQ,YAAY,CAAC,KAAK,UAAU;AAC5C;MACF;AAEAZ,YAAMa,eAAc;AAEpB,YAAMC,SAASC,SAASC;AAExB,UAAI,CAACF,QAAQ;AACX,aAAK,WAAWd,KAAAA;AAChB;MACF;AAEA,YAAM,EAAEC,OAAOC,SAASC,SAAQ,IAAK,KAAK;AAC1C,YAAMC,OAAOJ,MAAMK,aAAY;AAE/B,UAAID,KAAKM,SAAST,KAAAA,KAAUA,MAAMgB,SAASH,MAAAA,GAAS;AAClD,aAAK,WAAWd,KAAAA;AAChB;MACF;AAEA,UAAIE,YAAYE,KAAKM,SAASR,OAAAA,KAAYA,QAAQe,SAASH,MAAAA,IAAU;AACnE,aAAK,WAAWd,KAAAA;AAChB;MACF;AAEA,UAAIG,SAASG,KAAK,CAACK,YAAYP,KAAKM,SAASC,OAAAA,KAAYA,QAAQM,SAASH,MAAAA,CAAAA,GAAU;AAClF,aAAK,WAAWd,KAAAA;MAClB;IACF;AArFE,SAAK,aAAaD,QAAQmB;EAC5B;EAEAC,QAAQC,SAA+B;AACrC,SAAK,WAAW;MACdnB,OAAOmB,QAAQnB;MACfC,SAASkB,QAAQlB,WAAW;MAC5BC,WAAWiB,QAAQjB,YAAY,CAAA,GAAIkB,OAAO,CAACC,OAA0BA,cAAcC,WAAAA;IACrF;AAEA,QAAI,CAAC,KAAK,SAAS;AACjBR,eAASS,iBAAiB,eAAe,KAAK,oBAAoB,IAAA;AAClET,eAASS,iBAAiB,WAAW,KAAK,gBAAgB,IAAA;AAC1D,WAAK,UAAU;IACjB;EACF;EAEAC,aAAmB;AACjB,QAAI,CAAC,KAAK,SAAS;AACjB;IACF;AAEAV,aAASW,oBAAoB,eAAe,KAAK,oBAAoB,IAAA;AACrEX,aAASW,oBAAoB,WAAW,KAAK,gBAAgB,IAAA;AAC7D,SAAK,UAAU;AACf,SAAK,WAAW;EAClB;EAEA;EA2BA;AA+BF;;;ACtFA,IAAMC,WAAW,oBAAIC,QAAAA;AAErB,IAAMC,mBAAmB,CACvBC,MACAC,YAAAA;AAEA,MAAIA,QAAQC,WAAWF,IAAAA,GAAO;AAC5B,WAAO;EACT;AAEA,QAAMG,WAAWF,QAAQG,QAAQJ,IAAAA;AAEjC,MAAI,CAACG,UAAU;AACb,WAAO;EACT;AAEA,QAAME,QAAQF,SAASE,SAASL,QAAQ;AAExC,MAAI,EAAEK,iBAAiBC,cAAc;AACnC,WAAO;EACT;AAEA,QAAMC,UAAUJ,SAASI,WAAWJ,SAASI,mBAAmBD,cAAcH,SAASI,UAAU;AAEjG,QAAMC,WAAWL,SAASK,UAAUC,OAAO,CAACC,YAAoCA,mBAAmBJ,WAAAA,KAAgB,CAAA;AAEnH,SAAO;IACLD;IACAE;IACAC;EACF;AACF;AAEO,IAAMG,2BAA2B,CACtCX,MACAY,WACAX,YAAAA;AAEA,QAAMY,aAAa,IAAIC,kBAAkB;IACvCF,UAAUG,OAAK;AACb,UAAId,QAAQC,WAAWF,IAAAA,GAAO;AAC5B;MACF;AAEAY,gBAAUI,KAAKhB,MAAMe,KAAAA;IACvB;EACF,CAAA;AAEA,SAAO;IACLE,SAAAA;AACE,YAAMC,UAAUnB,iBAAiBC,MAAMC,OAAAA;AACvC,UAAI,CAACiB,SAAS;AACZL,mBAAWM,WAAU;AACrB;MACF;AAEAN,iBAAWO,QAAQF,OAAAA;IACrB;IACAC,aAAAA;AACEN,iBAAWM,WAAU;IACvB;EACF;AACF;AAEO,IAAME,6BAA6B,CAACrB,MAAmBsB,WAAAA;AAC5D,MAAIC,UAAU1B,SAAS2B,IAAIxB,IAAAA;AAE3B,MAAI,CAACuB,SAAS;AACZA,cAAU,oBAAIE,IAAAA;AACd5B,aAAS6B,IAAI1B,MAAMuB,OAAAA;EACrB;AAEAA,UAAQI,IAAIL,MAAAA;AACd;AAEO,IAAMM,4BAA4B,CAAC5B,SAAAA;AACxC,QAAMuB,UAAU1B,SAAS2B,IAAIxB,IAAAA;AAE7B,MAAI,CAACuB,SAAS;AACZ;EACF;AAEAA,UAAQM,QAAQ,CAACP,WAAAA;AACfA,WAAOL,OAAM;EACf,CAAA;AACF;AAEO,IAAMa,gCAAgC,CAAC9B,SAAAA;AAC5C,QAAMuB,UAAU1B,SAAS2B,IAAIxB,IAAAA;AAE7B,MAAI,CAACuB,SAAS;AACZ;EACF;AAEAA,UAAQM,QAAQ,CAACP,WAAAA;AACfA,WAAOH,WAAU;EACnB,CAAA;AACF;;;AC5FA,IAAMY,mBAAmB,oBAAIC,QAAAA;AAE7B,IAAMC,aAAa,CACjBC,MACAC,MACAC,MACAC,gBAAgB,UAAK;AAErB,QAAMC,WAAWJ,KAAKC,IAAAA;AAErBD,OAAoCC,IAAAA,IAAQ,YAAaI,MAAe;AACvE,QAAIF,eAAe;AACjBD,WAAKI,KAAK,IAAI;IAChB;AAEA,QAAIC;AAEJ,QAAI,OAAOH,aAAa,YAAY;AAClCG,eAAUH,SAA+CI,MAAM,MAAMH,IAAAA;IACvE;AAEA,QAAI,CAACF,eAAe;AAClBD,WAAKI,KAAK,IAAI;IAChB;AAEA,WAAOC;EACT;AACF;AAEA,IAAME,kBAAkB,CAACT,SAAAA;AACvB,MAAIH,iBAAiBa,IAAIV,IAAAA,GAAO;AAC9B;EACF;AAEAH,mBAAiBc,IAAIX,IAAAA;AAErBD,aAAWC,MAAM,qBAAqB,WAAA;AACpCY,8BAA0B,IAAI;EAChC,CAAA;AAEAb,aAAWC,MAAM,eAAe,WAAA;AAC9BY,8BAA0B,IAAI;EAChC,CAAA;AAEAb,aACEC,MACA,wBACA,WAAA;AACEa,kCAA8B,IAAI;EACpC,GACA,IAAA;AAEJ;AAEO,SAASC,aACdC,UAAsC,CAAC,GAAC;AAExC,SAAO,CACLC,gBACAC,YAAAA;AAEAA,YAAQC,eAAe,WAAA;AACrBT,sBAAgB,IAAI;AAEpB,YAAMU,UACJJ,QAAQI,YACP,CAACnB,SAAAA;AACA,eAAO;UACLoB,OAAOL,QAAQK,QAAQpB,IAAAA;UACvBqB,SAASN,QAAQM,UAAUrB,IAAAA;UAC3BsB,UAAUP,QAAQO,WAAWtB,IAAAA;QAC/B;MACF;AAEF,YAAMuB,SAASC,yBACb,MACA,CAACC,UAAAA;AACCT,uBAAeV,KAAK,MAAMmB,KAAAA;MAC5B,GACA;QACEN;QACAO,UAAUX,QAAQW;MACpB,CAAA;AAGFC,iCAA2B,MAAMJ,MAAAA;AAEjC,UAAI,KAAKK,aAAa;AACpBhB,kCAA0B,IAAI;MAChC;IACF,CAAA;EACF;AACF;;;AC/EA,IAAMiB,cAAc,oBAAIC,QAAAA;AACxB,IAAMC,mBAAkB,oBAAID,QAAAA;AAC5B,IAAME,mBAAmB,oBAAIF,QAAAA;AAC7B,IAAMG,oBAAoB,oBAAIH,QAAAA;AAE9B,IAAMI,iBAAiB,CAACC,aAAAA;AACtB,MAAI,OAAOA,SAASC,kBAAkB,YAAY;AAChDD,aAASC,cAAa;AACtB;EACF;AAEA,MAAI,OAAOD,SAASE,WAAW,YAAY;AACzC;EACF;AAEA,MAAIR,YAAYS,IAAIH,QAAAA,GAAW;AAC7B;EACF;AAEAN,cAAYU,IAAIJ,UAAU,IAAA;AAE1BK,wBAAsB,MAAA;AACpBX,gBAAYY,OAAON,QAAAA;AACnBA,aAASE,SAAM;EACjB,CAAA;AACF;AAEA,IAAMK,cAAc,CAACC,UACnBC,OAAOD,KAAAA,EACJE,QAAQ,sBAAsB,OAAA,EAC9BA,QAAQ,WAAW,GAAA,EACnBC,YAAW;AAEhB,IAAMC,mBAAkB,CAACZ,UAAsBa,YAAAA;AAC7C,MAAIC,YAAYlB,iBAAgBO,IAAIH,QAAAA;AAEpC,MAAI,CAACc,WAAW;AACdA,gBAAY,oBAAIC,IAAAA;AAChBnB,IAAAA,iBAAgBQ,IAAIJ,UAAUc,SAAAA;AAE9B,UAAME,WAAWhB,SAASiB;AAE1BjB,aAASiB,uBAAuB,YAA+BC,MAAe;AAC5E,YAAMC,aAAavB,iBAAgBO,IAAI,IAAI;AAC3CgB,kBAAYC,QAAQ,CAACC,aAAAA;AACnB,YAAI;AACFA,mBAAAA;QACF,SAASC,OAAO;AACdC,kBAAQD,MAAM,yBAAyBA,KAAAA;QACzC;MACF,CAAA;AACA1B,MAAAA,iBAAgBU,OAAO,IAAI;AAE3B,UAAI,OAAOU,aAAa,YAAY;AAClC,eAAOA,SAASQ,MAAM,MAAMN,IAAAA;MAC9B;AAEA,aAAOO;IACT;EACF;AAEAX,YAAUY,IAAIb,OAAAA;AAChB;AAEA,IAAMc,uBAAuB,CAACC,MAAkBC,cAAAA;AAC9C,MAAIC,aAAahC,kBAAkBK,IAAIyB,IAAAA;AAEvC,MAAI,CAACE,YAAY;AACfA,iBAAa,oBAAIf,IAAAA;AACjBjB,sBAAkBM,IAAIwB,MAAME,UAAAA;EAC9B;AAEAA,aAAWJ,IAAIG,SAAAA;AACjB;AAEA,IAAME,qBAAqB,CAACH,MAAkBC,cAAAA;AAC5C,QAAMC,aAAahC,kBAAkBK,IAAIyB,IAAAA;AAEzC,MAAI,CAACE,YAAY;AACf,WAAO;EACT;AAEA,QAAME,eAAeF,WAAWG,IAAIJ,SAAAA;AAEpC,MAAIG,cAAc;AAChBF,eAAWxB,OAAOuB,SAAAA;AAClB,QAAIC,WAAWI,SAAS,GAAG;AACzBpC,wBAAkBQ,OAAOsB,IAAAA;IAC3B;EACF;AAEA,SAAOI;AACT;AAEA,IAAMG,mBAAmB,CAACP,MAAkBC,WAAmBO,YAAAA;AAC7D,MAAIC,QAAQxC,iBAAiBM,IAAIyB,IAAAA;AAEjC,MAAI,CAACS,OAAO;AACV,UAAMvB,YAAY,oBAAIwB,IAAAA;AACtB,UAAMC,WAAW,IAAIC,iBAAiB,CAACC,YAAAA;AACrCA,cAAQrB,QAAQ,CAACsB,WAAAA;AACf,cAAMC,gBAAgBD,OAAOC;AAE7B,YAAI,CAACA,eAAe;AAClB;QACF;AAEA,YAAIZ,mBAAmBH,MAAMe,aAAAA,GAAgB;AAC3C;QACF;AAEA,cAAMC,aAAY9B,UAAUX,IAAIwC,aAAAA;AAChC,YAAI,CAACC,YAAW;AACd;QACF;AAEA,cAAMC,eAAgBH,OAAOI,OAAmBC,aAAaJ,aAAAA;AAE7D,mBAAWK,YAAYJ,YAAW;AAChCI,mBAASH,YAAAA;QACX;MACF,CAAA;IACF,CAAA;AAEAN,aAASU,QAAQrB,MAAM;MAAEE,YAAY;IAAK,CAAA;AAE1CO,YAAQ;MAAEE;MAAUzB;IAAU;AAC9BjB,qBAAiBO,IAAIwB,MAAMS,KAAAA;AAE3BzB,IAAAA,iBAAgBgB,MAAM,MAAA;AACpBW,eAASW,WAAU;AACnBrD,uBAAiBS,OAAOsB,IAAAA;IAC1B,CAAA;EACF;AAEA,MAAIgB,YAAYP,MAAMvB,UAAUX,IAAI0B,SAAAA;AAEpC,MAAI,CAACe,WAAW;AACdA,gBAAY,oBAAI7B,IAAAA;AAChBsB,UAAMvB,UAAUV,IAAIyB,WAAWe,SAAAA;EACjC;AAEAA,YAAUlB,IAAIU,OAAAA;AAChB;AAEA,IAAMe,kBAAkB,CAACvB,MAAkBC,WAAmBrB,UAAAA;AAC5DmB,uBAAqBC,MAAMC,SAAAA;AAE3B,MAAIrB,UAAUiB,UAAajB,UAAU,QAAQA,UAAU,OAAO;AAC5DoB,SAAKwB,gBAAgBvB,SAAAA;AACrB;EACF;AAEA,MAAIrB,UAAU,MAAM;AAClBoB,SAAKyB,aAAaxB,WAAW,EAAA;AAC7B;EACF;AAEAD,OAAKyB,aAAaxB,WAAWpB,OAAOD,KAAAA,CAAAA;AACtC;AAEA,IAAM8C,cAAc,CAACC,SAAAA;AACnB,MAAI,CAACA,MAAM;AACT,WAAO;EACT;AAEA,MAAIA,SAASC,WAAWD,SAAS,WAAW;AAC1C,WAAO;EACT;AAEA,MAAIA,SAASE,UAAUF,SAAS,UAAU;AACxC,WAAO;EACT;AAEA,MAAIA,SAASG,UAAUH,SAASI,SAASJ,SAAS,QAAQ;AACxD,WAAO;EACT;AAEA,SAAO;AACT;AAEA,IAAMK,cAA6F;EACjGC,QAAQrD,OAAoB;AAC1B,WAAOA,UAAU;EACnB;EACAsD,OAAOtD,OAAoB;AACzB,QAAIA,UAAU,QAAQA,UAAU,IAAI;AAClC,aAAO;IACT;AAEA,UAAMuD,SAASN,OAAOjD,KAAAA;AACtB,WAAOiD,OAAOO,MAAMD,MAAAA,IAAU,OAAOA;EACvC;EACAE,KAAKzD,OAAoB;AACvB,QAAI,CAACA,OAAO;AACV,aAAO;IACT;AAEA,QAAI;AACF,aAAO0D,KAAKC,MAAM3D,KAAAA;IACpB,SAASc,OAAO;AACdC,cAAQ6C,KAAK,yCAAyC9C,KAAAA;AACtD,aAAO;IACT;EACF;EACA+C,OAAO7D,OAAoB;AACzB,WAAOA;EACT;AACF;AAEA,IAAM8D,iBAAmG;EACvGT,QAAQrD,OAAc;AACpB,WAAOA,QAAQ,KAAK;EACtB;EACAsD,OAAOtD,OAAc;AACnB,QAAIA,UAAU,QAAQA,UAAUiB,UAAajB,UAAU,IAAI;AACzD,aAAO;IACT;AACA,WAAOC,OAAOD,KAAAA;EAChB;EACAyD,KAAKzD,OAAc;AACjB,QAAIA,UAAU,QAAQA,UAAUiB,QAAW;AACzC,aAAO;IACT;AACA,QAAI;AACF,aAAOyC,KAAKK,UAAU/D,KAAAA;IACxB,QAAQ;AACN,aAAO;IACT;EACF;EACA6D,OAAO7D,OAAc;AACnB,QAAIA,UAAU,QAAQA,UAAUiB,QAAW;AACzC,aAAO;IACT;AACA,WAAOhB,OAAOD,KAAAA;EAChB;AACF;AAEA,IAAMgE,iBAAiB,CAASC,UAAkBC,SAA0BD,aAAaC;AAElF,SAASC,KAAoDC,UAAsC,CAAC,GAAC;AAC1G,QAAM,EACJ/C,WACAgD,UAAU,MACVtB,MACAY,OACAW,QACAC,cACAC,UAAUR,gBACVS,UACAC,kBAAiB,IACfN;AAEJ,QAAMO,eAAe7B,YAAYC,IAAAA;AAEjC,QAAM6B,aAAoCjB,QACtCA,QACA,SAAuB3D,OAAK;AAC1B,QAAI,CAAC2E,cAAc;AACjB,aAAO3E;IACT;AACA,WAAOoD,YAAYuB,YAAAA,EAAcE,KAAK,MAAM7E,KAAAA;EAC9C;AAEJ,QAAM8E,cAAwCR,SAC1CA,SACA,SAAuBtE,OAAK;AAC1B,QAAI,CAAC2E,cAAc;AACjB,aAAQ3E,SAAkD;IAC5D;AACA,WAAO8D,eAAea,YAAAA,EAAcE,KAAK,MAAM7E,KAAAA;EACjD;AAEJ,SAAO,CACL+E,UACAC,YAAAA;AAEA,QAAIA,QAAQC,SAAS,YAAY;AAC/B,YAAM,IAAIC,MAAM,wDAAA;IAClB;AAEA,UAAM/C,gBAAgBd,aAAatB,YAAYiF,QAAQG,IAAI;AAE3DH,YAAQI,eAAe,WAAA;AACrB,UAAI,CAACf,SAAS;AACZ;MACF;AAEA1C,uBAAiB,MAAMQ,eAAe,CAACkD,aAAAA;AACrC,YAAI9D,mBAAmB,MAAMY,aAAAA,GAAgB;AAC3C;QACF;AAEA,cAAMoB,SAASqB,WAAWC,KAAK,MAAMQ,QAAAA;AACrC,cAAMpB,WAAWc,SAASpF,IAAIkF,KAAK,IAAI;AAEvC,YAAIL,QAAQP,UAAUV,MAAAA,GAAS;AAC7B;QACF;AAEAwB,iBAASnF,IAAIiF,KAAK,MAAMtB,MAAAA;AAExBmB,2BAAmBG,KAAK,MAAMtB,QAAQU,QAAAA;AACtC1E,uBAAe,IAAI;MACrB,CAAA;IACF,CAAA;AAEA,WAAO;MACLI,MAAAA;AACE,eAAOoF,SAASpF,IAAIkF,KAAK,IAAI;MAC/B;MACAjF,IAAiBI,OAAa;AAC5B,cAAMiE,WAAWc,SAASpF,IAAIkF,KAAK,IAAI;AAEvC,YAAIL,QAAQP,UAAUjE,KAAAA,GAAQ;AAC5B;QACF;AAEA+E,iBAASnF,IAAIiF,KAAK,MAAM7E,KAAAA;AAExB,YAAIqE,SAAS;AACX,gBAAMiB,YAAYR,YAAYD,KAAK,MAAM7E,KAAAA;AACzC2C,0BAAgB,MAAMR,eAAemD,SAAAA;QACvC;AAEAb,kBAAUI,KAAK,MAAM7E,OAAOiE,QAAAA;AAC5B1E,uBAAe,IAAI;MACrB;MACAgG,KAAkBC,cAAoB;AACpC,YAAIxF,QAAQwF;AAEZ,YAAI,KAAKhE,aAAaW,aAAAA,GAAgB;AACpCnC,kBAAQ4E,WAAWC,KAAK,MAAM,KAAKtC,aAAaJ,aAAAA,CAAAA;QAClD,WAAWnC,UAAUiB,UAAasD,iBAAiBtD,QAAW;AAC5DjB,kBACE,OAAOuE,iBAAiB,aAAcA,aAAyCM,KAAK,IAAI,IAAIN;QAChG;AAEA,YAAIF,SAAS;AACX,gBAAMiB,YAAYR,YAAYD,KAAK,MAAM7E,KAAAA;AACzC2C,0BAAgB,MAAMR,eAAemD,SAAAA;QACvC;AAEA,eAAOtF;MACT;IACF;EACF;AACF;;;ACzUA,IAAMyF,iBAAiB;EACrBC,KAAK;EACLC,SAAS;EACTC,MAAM;EACNC,UAAU;AACZ;AAEA,IAAMC,kBAAkB,CACtBD,UACAE,SAAAA;AAEA,MAAI,OAAOF,aAAa,YAAY;AAClC,WAAQA,SAA0CE,IAAAA;EACpD;AAEA,SAAOF;AACT;AAEA,IAAMG,cAAc,CAACD,MAAiBE,WAAAA;AACpC,UAAQA,QAAAA;IACN,KAAK;AACH,aAAOC;IACT,KAAK;AACH,aAAOH;IACT;AACE,aAAOA,KAAKI,cAAcJ,KAAKK,cAAcL;EACjD;AACF;AAEA,IAAMM,eAAe,CAKnBN,MACAO,UACAC,YAAAA;AAEA,MAAIA,QAAQZ,SAAS;AACnB,UAAMa,SAAST,KAAKJ,QAAQW,QAAAA;AAC5B,WAAOE,UAAUV,gBAAgBS,QAAQV,UAAkDE,IAAAA,KAAS;EACtG;AAEA,QAAMU,OAAOT,YAAYD,MAAMQ,QAAQX,IAAI;AAE3C,MAAI,CAACa,MAAM;AACT,WAAOF,QAAQb,MACVI,gBAAgBS,QAAQV,UAA8CE,IAAAA,KAAS,CAAA,IAC/ED,gBAAgBS,QAAQV,UAAmDE,IAAAA,KAAS;EAC3F;AAEA,MAAIQ,QAAQb,KAAK;AACf,UAAMgB,WAAWC,MAAMf,KAAKa,KAAKG,iBAA2BN,QAAAA,CAAAA;AAC5D,WAAOI,SAASG,SAAS,IACrBH,WACCZ,gBAAgBS,QAAQV,UAA8CE,IAAAA,KAAS,CAAA;EACtF;AAEA,QAAMe,QAAQL,KAAKM,cAAwBT,QAAAA;AAC3C,SAAOQ,SAAShB,gBAAgBS,QAAQV,UAAmDE,IAAAA,KAAS;AACtG;AAEA,IAAMiB,uBAAuB,CAK3BV,UACAC,YAAAA;AAIA,SAAO,CACLU,SACAC,YAAAA;AAEA,QAAIA,QAAQC,SAAS,YAAY;AAC/B,YAAMC,aAA0D;QAC9DC,MAAAA;AACE,iBAAOhB,aAAwC,MAAMC,UAAUC,OAAAA;QACjE;QACAe,IAAIC,QAAc;QAElB;MACF;AACA,aAAOH;IACT;AAEAF,YAAQM,eAAe,WAAA;AACrBC,aAAOC,eAAe,MAAMR,QAAQS,MAAM;QACxCC,cAAc;QACdC,YAAY;QACZR,KAAK,MAAMhB,aAAwC,MAAMC,UAAUC,OAAAA;MACrE,CAAA;IACF,CAAA;AAEA;EACF;AACF;AAYO,SAASuB,MACdxB,UACAyB,aAA2C;AAE3C,MAAI,CAACzB,UAAU;AACb,UAAM,IAAI0B,MAAM,6BAAA;EAClB;AAEA,MAAID,aAAa;AACf,UAAME,UAAS;MAAE,GAAGxC;MAAgB,GAAGsC;IAAY;AACnD,WAAOf,qBAAqDV,UAAU2B,OAAAA;EACxE;AAEA,QAAMA,SAASxC;AACf,SAAOuB,qBAAqDV,UAAU2B,MAAAA;AACxE;;;AChLA,IAAMC,eAAc,oBAAIC,QAAAA;AAExB,IAAMC,kBAAiB,CAACC,aAAAA;AACtB,MAAI,OAAOA,SAASC,kBAAkB,YAAY;AAChDD,aAASC,cAAa;AACtB;EACF;AAEA,MAAI,OAAOD,SAASE,WAAW,YAAY;AACzC;EACF;AAEA,MAAIL,aAAYM,IAAIH,QAAAA,GAAW;AAC7B;EACF;AAEAH,EAAAA,aAAYO,IAAIJ,UAAU,IAAA;AAE1BK,wBAAsB,MAAA;AACpBR,IAAAA,aAAYO,IAAIJ,UAAU,KAAA;AAE1BA,aAASE,SAAM;EACjB,CAAA;AACF;AAEA,IAAMI,kBAAiB,CAASC,UAAkBC,SAA0BD,aAAaC;AAQlF,SAASC,MAAqDC,UAAuC,CAAC,GAAC;AAC5G,QAAM,EAAEC,UAAUL,iBAAgBM,UAAUC,UAAS,IAAKH;AAE1D,SAAO,CACLI,UACAC,YAAAA;AAEA,QAAIA,QAAQC,SAAS,YAAY;AAC/B,YAAM,IAAIC,MAAM,yDAAA;IAClB;AAEA,WAAO;MACLd,MAAAA;AACE,eAAOW,SAASX,IAAIe,KAAK,IAAI;MAC/B;MACAd,IAAiBe,OAAa;AAC5B,cAAMZ,WAAWO,SAASX,IAAIe,KAAK,IAAI;AAEvC,YAAIP,QAAQJ,UAAUY,KAAAA,GAAQ;AAC5B;QACF;AAEAL,iBAASV,IAAIc,KAAK,MAAMC,KAAAA;AAExB,YAAIP,UAAU;AACZA,mBAASM,KAAK,MAAMC,OAAOZ,QAAAA;QAC7B;AAEAR,QAAAA,gBAAe,IAAI;MACrB;MACAqB,KAAkBC,cAAoB;AACpC,YAAIR,WAAW;AACb,iBAAOA,UAAUK,KAAK,MAAMG,YAAAA;QAC9B;AAEA,eAAOA;MACT;IACF;EACF;AACF;","names":["styleCache","Map","normalizeTemplate","template","fetchStyles","urls","Promise","all","map","url","cached","get","request","fetch","then","response","ok","text","catch","set","Component","options","Base","_context","tag","styles","styleUrls","observedAttributes","shadowMode","autoSlot","Error","templateFn","Decorated","parent","Array","isArray","own","from","Set","args","attachShadow","mode","renderRoot","shadow","connectedCallback","prototype","call","finally","requestRender","disconnectedCallback","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","requestAnimationFrame","length","fetched","inlineStyles","filter","Boolean","join","root","templateResult","render","styleTemplate","html","slotTemplate","completeTemplate","commit","afterRender","wrapRender","fragment","document","createDocumentFragment","tempDiv","createElement","append","childNodes","customElements","define","lifecycleHooks","connectedCallback","WeakMap","disconnectedCallback","cleanupRegistry","addLifecycleHook","instance","hookName","handler","store","callbacks","get","Set","set","original","args","forEach","callback","apply","undefined","add","registerCleanup","cleanup","registered","fn","error","console","delete","resolveTarget","host","target","EventTarget","document","window","renderRoot","shadowRoot","normalizeOptions","selectorOrOptions","selector","buildOptions","options","prevent","stop","stopImmediate","once","passive","capture","when","Listen","eventName","Error","listenConfig","originalMethod","context","addInitializer","attached","attach","addEventListener","warn","String","eventOptions","event","typedEvent","preventDefault","stopImmediatePropagation","stopPropagation","matched","path","composedPath","find","node","Element","matches","call","targetNode","removeEventListener","queueMicrotask","DismissController","options","event","owner","content","triggers","path","composedPath","some","node","Element","hasAttribute","includes","trigger","key","preventDefault","active","document","activeElement","contains","onDismiss","connect","context","filter","el","HTMLElement","addEventListener","disconnect","removeEventListener","registry","WeakMap","toDismissContext","host","options","disabled","resolved","resolve","owner","HTMLElement","content","triggers","filter","element","createOutsideClickHandle","onDismiss","controller","DismissController","event","call","update","context","disconnect","connect","registerOutsideClickHandle","handle","handles","get","Set","set","add","updateOutsideClickHandles","forEach","disconnectOutsideClickHandles","lifecycleApplied","WeakSet","wrapMethod","host","name","hook","callHookFirst","original","args","call","result","apply","ensureLifecycle","has","add","updateOutsideClickHandles","disconnectOutsideClickHandles","OutsideClick","options","originalMethod","context","addInitializer","resolve","owner","content","triggers","handle","createOutsideClickHandle","event","disabled","registerOutsideClickHandle","isConnected","renderQueue","WeakMap","cleanupRegistry","observerRegistry","internalMutations","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","delete","toKebabCase","value","String","replace","toLowerCase","registerCleanup","cleanup","callbacks","Set","original","disconnectedCallback","args","registered","forEach","callback","error","console","apply","undefined","add","markInternalMutation","host","attribute","attributes","isInternalMutation","hasAttribute","has","size","observeAttribute","handler","entry","Map","observer","MutationObserver","records","record","attributeName","listeners","currentValue","target","getAttribute","listener","observe","disconnect","updateAttribute","removeAttribute","setAttribute","resolveType","type","Boolean","Number","Object","Array","typeParsers","boolean","number","parsed","isNaN","json","JSON","parse","warn","string","typeFormatters","stringify","defaultCompare","previous","next","Prop","options","reflect","format","defaultValue","compare","onChange","onAttributeChange","resolvedType","parseValue","call","formatValue","accessor","context","kind","Error","name","addInitializer","rawValue","formatted","init","initialValue","defaultOptions","all","closest","from","fallback","resolveFallback","host","resolveRoot","option","document","renderRoot","shadowRoot","resolveQuery","selector","options","result","root","elements","Array","querySelectorAll","length","match","querySelector","createQueryDecorator","_target","context","kind","descriptor","get","set","_value","addInitializer","Object","defineProperty","name","configurable","enumerable","Query","userOptions","Error","merged","renderQueue","WeakMap","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","defaultCompare","previous","next","Watch","options","compare","onChange","transform","accessor","context","kind","Error","call","value","init","initialValue"]}
|