@tociva/tailng-ui 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,443 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports$1) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports$1, p)) __createBinding(exports$1, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./lib"), exports);
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, input, booleanAttribute, output, contentChild, computed, signal, effect, Component, contentChildren, inject, HostListener, HostBinding } from '@angular/core';
3
+
4
+ /**
5
+ * OPEN-state icon marker.
6
+ * Consumer must import this directive where the icon is used.
7
+ */
8
+ class TngExpansionIconOpen {
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconOpen, deps: [], target: i0.ɵɵFactoryTarget.Directive });
10
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TngExpansionIconOpen, isStandalone: true, selector: "[tngExpansionIconOpen]", ngImport: i0 });
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconOpen, decorators: [{
13
+ type: Directive,
14
+ args: [{
15
+ selector: '[tngExpansionIconOpen]',
16
+ standalone: true,
17
+ }]
18
+ }] });
19
+ /**
20
+ * CLOSE-state icon marker.
21
+ * Consumer must import this directive where the icon is used.
22
+ */
23
+ class TngExpansionIconClose {
24
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconClose, deps: [], target: i0.ɵɵFactoryTarget.Directive });
25
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: TngExpansionIconClose, isStandalone: true, selector: "[tngExpansionIconClose]", ngImport: i0 });
26
+ }
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionIconClose, decorators: [{
28
+ type: Directive,
29
+ args: [{
30
+ selector: '[tngExpansionIconClose]',
31
+ standalone: true,
32
+ }]
33
+ }] });
34
+ class TngExpansionPanel {
35
+ /* =====================
36
+ * Inputs
37
+ * ===================== */
38
+ open = input(false, { ...(ngDevMode ? { debugName: "open" } : {}), transform: booleanAttribute });
39
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
40
+ padded = input(true, { ...(ngDevMode ? { debugName: "padded" } : {}), transform: booleanAttribute });
41
+ /* =====================
42
+ * Outputs
43
+ * ===================== */
44
+ openChange = output();
45
+ /* =====================
46
+ * Klass hooks
47
+ * ===================== */
48
+ rootKlass = input('rounded-lg border border-border bg-bg', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
49
+ headerKlass = input('flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground ' +
50
+ 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ' +
51
+ 'disabled:cursor-not-allowed disabled:opacity-60', ...(ngDevMode ? [{ debugName: "headerKlass" }] : []));
52
+ titleKlass = input('flex-1', ...(ngDevMode ? [{ debugName: "titleKlass" }] : []));
53
+ iconWrapperKlass = input('ml-2 shrink-0 inline-flex items-center justify-center', ...(ngDevMode ? [{ debugName: "iconWrapperKlass" }] : []));
54
+ chevronKlass = input('h-4 w-4 shrink-0 transition-transform duration-200', ...(ngDevMode ? [{ debugName: "chevronKlass" }] : []));
55
+ contentOuterKlass = input('grid transition-[grid-template-rows] duration-200 ease-in-out', ...(ngDevMode ? [{ debugName: "contentOuterKlass" }] : []));
56
+ contentClipKlass = input('overflow-hidden', ...(ngDevMode ? [{ debugName: "contentClipKlass" }] : []));
57
+ contentBodyKlass = input('text-sm text-muted-foreground', ...(ngDevMode ? [{ debugName: "contentBodyKlass" }] : []));
58
+ contentPaddingKlass = input('px-4 pb-4 pt-2', ...(ngDevMode ? [{ debugName: "contentPaddingKlass" }] : []));
59
+ /* =====================
60
+ * Slots (state icons only)
61
+ * ===================== */
62
+ iconOpen = contentChild(TngExpansionIconOpen, ...(ngDevMode ? [{ debugName: "iconOpen" }] : []));
63
+ iconClose = contentChild(TngExpansionIconClose, ...(ngDevMode ? [{ debugName: "iconClose" }] : []));
64
+ hasOpenIcon = computed(() => !!this.iconOpen(), ...(ngDevMode ? [{ debugName: "hasOpenIcon" }] : []));
65
+ hasCloseIcon = computed(() => !!this.iconClose(), ...(ngDevMode ? [{ debugName: "hasCloseIcon" }] : []));
66
+ hasAnyCustomIcon = computed(() => this.hasOpenIcon() || this.hasCloseIcon(), ...(ngDevMode ? [{ debugName: "hasAnyCustomIcon" }] : []));
67
+ // Stable rendering flags (avoid ng-content inside @if)
68
+ showOpenIcon = computed(() => {
69
+ if (!this.hasAnyCustomIcon())
70
+ return false;
71
+ if (this.hasOpenIcon() && this.hasCloseIcon())
72
+ return this.isOpen();
73
+ if (this.hasOpenIcon())
74
+ return true; // only open provided -> use for both states
75
+ return false;
76
+ }, ...(ngDevMode ? [{ debugName: "showOpenIcon" }] : []));
77
+ showCloseIcon = computed(() => {
78
+ if (!this.hasAnyCustomIcon())
79
+ return false;
80
+ if (this.hasOpenIcon() && this.hasCloseIcon())
81
+ return !this.isOpen();
82
+ if (this.hasCloseIcon())
83
+ return true; // only close provided -> use for both states
84
+ return false;
85
+ }, ...(ngDevMode ? [{ debugName: "showCloseIcon" }] : []));
86
+ /* =====================
87
+ * State
88
+ * ===================== */
89
+ _isOpen = signal(false, ...(ngDevMode ? [{ debugName: "_isOpen" }] : []));
90
+ isOpen = this._isOpen.asReadonly();
91
+ constructor() {
92
+ effect(() => {
93
+ this._isOpen.set(this.open());
94
+ });
95
+ }
96
+ toggle() {
97
+ if (this.disabled())
98
+ return;
99
+ const next = !this._isOpen();
100
+ this._isOpen.set(next);
101
+ this.openChange.emit(next);
102
+ }
103
+ /* =====================
104
+ * Computed
105
+ * ===================== */
106
+ contentRowsKlass = computed(() => this.isOpen() ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]', ...(ngDevMode ? [{ debugName: "contentRowsKlass" }] : []));
107
+ chevronRotateKlass = computed(() => (this.isOpen() ? 'rotate-180' : ''), ...(ngDevMode ? [{ debugName: "chevronRotateKlass" }] : []));
108
+ /* =====================
109
+ * Final Klass (defaults + user overrides)
110
+ * ===================== */
111
+ finalRootKlass = computed(() => this.join('rounded-lg border border-border bg-bg', this.rootKlass()), ...(ngDevMode ? [{ debugName: "finalRootKlass" }] : []));
112
+ finalHeaderKlass = computed(() => this.join('flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground', 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary', 'disabled:cursor-not-allowed disabled:opacity-60', this.headerKlass()), ...(ngDevMode ? [{ debugName: "finalHeaderKlass" }] : []));
113
+ finalTitleKlass = computed(() => this.join('flex-1', this.titleKlass()), ...(ngDevMode ? [{ debugName: "finalTitleKlass" }] : []));
114
+ finalIconWrapperKlass = computed(() => this.join('ml-2 shrink-0 inline-flex items-center justify-center', this.iconWrapperKlass()), ...(ngDevMode ? [{ debugName: "finalIconWrapperKlass" }] : []));
115
+ finalChevronKlass = computed(() => this.join('h-4 w-4 shrink-0 transition-transform duration-200', this.chevronKlass()), ...(ngDevMode ? [{ debugName: "finalChevronKlass" }] : []));
116
+ finalContentOuterKlass = computed(() => this.join('grid transition-[grid-template-rows] duration-200 ease-in-out', this.contentOuterKlass()), ...(ngDevMode ? [{ debugName: "finalContentOuterKlass" }] : []));
117
+ finalContentClipKlass = computed(() => this.join('overflow-hidden', this.contentClipKlass()), ...(ngDevMode ? [{ debugName: "finalContentClipKlass" }] : []));
118
+ finalContentBodyKlass = computed(() => {
119
+ const pad = this.padded() ? this.contentPaddingKlass() : '';
120
+ return this.join('text-sm text-muted-foreground', pad, this.contentBodyKlass());
121
+ }, ...(ngDevMode ? [{ debugName: "finalContentBodyKlass" }] : []));
122
+ join(...parts) {
123
+ return parts
124
+ .map((p) => (p ?? '').trim())
125
+ .filter(Boolean)
126
+ .join(' ');
127
+ }
128
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
129
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngExpansionPanel, isStandalone: true, selector: "tng-expansion-panel", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, padded: { classPropertyName: "padded", publicName: "padded", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, headerKlass: { classPropertyName: "headerKlass", publicName: "headerKlass", isSignal: true, isRequired: false, transformFunction: null }, titleKlass: { classPropertyName: "titleKlass", publicName: "titleKlass", isSignal: true, isRequired: false, transformFunction: null }, iconWrapperKlass: { classPropertyName: "iconWrapperKlass", publicName: "iconWrapperKlass", isSignal: true, isRequired: false, transformFunction: null }, chevronKlass: { classPropertyName: "chevronKlass", publicName: "chevronKlass", isSignal: true, isRequired: false, transformFunction: null }, contentOuterKlass: { classPropertyName: "contentOuterKlass", publicName: "contentOuterKlass", isSignal: true, isRequired: false, transformFunction: null }, contentClipKlass: { classPropertyName: "contentClipKlass", publicName: "contentClipKlass", isSignal: true, isRequired: false, transformFunction: null }, contentBodyKlass: { classPropertyName: "contentBodyKlass", publicName: "contentBodyKlass", isSignal: true, isRequired: false, transformFunction: null }, contentPaddingKlass: { classPropertyName: "contentPaddingKlass", publicName: "contentPaddingKlass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openChange: "openChange" }, queries: [{ propertyName: "iconOpen", first: true, predicate: TngExpansionIconOpen, descendants: true, isSignal: true }, { propertyName: "iconClose", first: true, predicate: TngExpansionIconClose, descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"finalRootKlass()\">\n \n <button\n type=\"button\"\n [class]=\"finalHeaderKlass()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <span [class]=\"finalTitleKlass()\">\n <ng-content select=\"[tngExpansionTitle]\"></ng-content>\n </span>\n\n <span [class]=\"finalIconWrapperKlass()\">\n @if (hasAnyCustomIcon()) {\n <!-- Keep both ng-content slots always present -->\n <span [hidden]=\"!showOpenIcon()\">\n <ng-content select=\"[tngExpansionIconOpen]\"></ng-content>\n </span>\n \n <span [hidden]=\"!showCloseIcon()\">\n <ng-content select=\"[tngExpansionIconClose]\"></ng-content>\n </span>\n } @else {\n <!-- Default chevron -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n [class]=\"finalChevronKlass() + ' ' + chevronRotateKlass()\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n </span>\n \n </button>\n\n <div [class]=\"finalContentOuterKlass() + ' ' + contentRowsKlass()\">\n <div [class]=\"finalContentClipKlass()\">\n <div [class]=\"finalContentBodyKlass()\">\n <ng-content select=\"[tngExpansionContent]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n" });
130
+ }
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngExpansionPanel, decorators: [{
132
+ type: Component,
133
+ args: [{ selector: 'tng-expansion-panel', standalone: true, template: "<div [class]=\"finalRootKlass()\">\n \n <button\n type=\"button\"\n [class]=\"finalHeaderKlass()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <span [class]=\"finalTitleKlass()\">\n <ng-content select=\"[tngExpansionTitle]\"></ng-content>\n </span>\n\n <span [class]=\"finalIconWrapperKlass()\">\n @if (hasAnyCustomIcon()) {\n <!-- Keep both ng-content slots always present -->\n <span [hidden]=\"!showOpenIcon()\">\n <ng-content select=\"[tngExpansionIconOpen]\"></ng-content>\n </span>\n \n <span [hidden]=\"!showCloseIcon()\">\n <ng-content select=\"[tngExpansionIconClose]\"></ng-content>\n </span>\n } @else {\n <!-- Default chevron -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n [class]=\"finalChevronKlass() + ' ' + chevronRotateKlass()\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n </span>\n \n </button>\n\n <div [class]=\"finalContentOuterKlass() + ' ' + contentRowsKlass()\">\n <div [class]=\"finalContentClipKlass()\">\n <div [class]=\"finalContentBodyKlass()\">\n <ng-content select=\"[tngExpansionContent]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n" }]
134
+ }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], padded: [{ type: i0.Input, args: [{ isSignal: true, alias: "padded", required: false }] }], openChange: [{ type: i0.Output, args: ["openChange"] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], headerKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerKlass", required: false }] }], titleKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleKlass", required: false }] }], iconWrapperKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconWrapperKlass", required: false }] }], chevronKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "chevronKlass", required: false }] }], contentOuterKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentOuterKlass", required: false }] }], contentClipKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentClipKlass", required: false }] }], contentBodyKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentBodyKlass", required: false }] }], contentPaddingKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentPaddingKlass", required: false }] }], iconOpen: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TngExpansionIconOpen), { isSignal: true }] }], iconClose: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TngExpansionIconClose), { isSignal: true }] }] } });
135
+
136
+ class TngAccordion {
137
+ /* =====================
138
+ * Inputs
139
+ * ===================== */
140
+ /** Allow multiple panels to be open at once */
141
+ multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : {}), transform: booleanAttribute });
142
+ /**
143
+ * If false: prevents closing the last open panel (at least one stays open)
144
+ * If true: all can be collapsed
145
+ */
146
+ collapsible = input(true, { ...(ngDevMode ? { debugName: "collapsible" } : {}), transform: booleanAttribute });
147
+ /** If true: when all panels are closed, open the first panel automatically */
148
+ autoOpenFirst = input(false, { ...(ngDevMode ? { debugName: "autoOpenFirst" } : {}), transform: booleanAttribute });
149
+ /* =====================
150
+ * Outputs
151
+ * ===================== */
152
+ /** Emits current open indexes when changes happen */
153
+ openIndexesChange = output();
154
+ /* =====================
155
+ * Klass hooks
156
+ * ===================== */
157
+ rootKlass = input('w-full', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
158
+ stackKlass = input('space-y-2', ...(ngDevMode ? [{ debugName: "stackKlass" }] : []));
159
+ /* =====================
160
+ * Children
161
+ * ===================== */
162
+ // All projected expansion panels (descendants enabled so nested layouts still work)
163
+ panels = contentChildren(TngExpansionPanel, { ...(ngDevMode ? { debugName: "panels" } : {}), descendants: true });
164
+ constructor() {
165
+ effect((onCleanup) => {
166
+ const panels = this.panels();
167
+ // Subscribe to openChange from each panel
168
+ const subs = panels.map((p) => p.openChange.subscribe((nextOpen) => {
169
+ this.onPanelToggled(p, nextOpen);
170
+ }));
171
+ // Emit initial state + optionally auto open first
172
+ this.emitOpenIndexes();
173
+ if (this.autoOpenFirst() && this.getOpenPanels().length === 0 && panels.length > 0) {
174
+ // open first panel
175
+ if (!panels[0].isOpen())
176
+ panels[0].toggle();
177
+ }
178
+ onCleanup(() => subs.forEach((s) => s.unsubscribe()));
179
+ });
180
+ }
181
+ onPanelToggled(panel, nextOpen) {
182
+ const panels = this.panels();
183
+ // If a panel just opened and multiple is false, close all others.
184
+ if (nextOpen && !this.multiple()) {
185
+ for (const p of panels) {
186
+ if (p !== panel && p.isOpen()) {
187
+ p.toggle();
188
+ }
189
+ }
190
+ }
191
+ // If a panel just closed and collapsible is false, ensure at least one stays open.
192
+ if (!nextOpen && !this.collapsible()) {
193
+ // After close, if none are open, reopen this one.
194
+ if (this.getOpenPanels().length === 0) {
195
+ // Reopen the same panel (guard against disabled)
196
+ if (!panel.disabled()) {
197
+ panel.toggle();
198
+ return; // the toggle will trigger emit later
199
+ }
200
+ }
201
+ }
202
+ this.emitOpenIndexes();
203
+ }
204
+ getOpenPanels() {
205
+ return this.panels().filter((p) => p.isOpen());
206
+ }
207
+ emitOpenIndexes() {
208
+ const panels = this.panels();
209
+ const openIndexes = panels
210
+ .map((p, i) => (p.isOpen() ? i : -1))
211
+ .filter((i) => i >= 0);
212
+ this.openIndexesChange.emit(openIndexes);
213
+ }
214
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngAccordion, deps: [], target: i0.ɵɵFactoryTarget.Component });
215
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.6", type: TngAccordion, isStandalone: true, selector: "tng-accordion", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, autoOpenFirst: { classPropertyName: "autoOpenFirst", publicName: "autoOpenFirst", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, stackKlass: { classPropertyName: "stackKlass", publicName: "stackKlass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openIndexesChange: "openIndexesChange" }, queries: [{ propertyName: "panels", predicate: TngExpansionPanel, descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"rootKlass()\">\n <div [class]=\"stackKlass()\">\n <ng-content></ng-content>\n </div>\n</div>\n" });
216
+ }
217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngAccordion, decorators: [{
218
+ type: Component,
219
+ args: [{ selector: 'tng-accordion', standalone: true, template: "<div [class]=\"rootKlass()\">\n <div [class]=\"stackKlass()\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
220
+ }], ctorParameters: () => [], propDecorators: { multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], autoOpenFirst: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoOpenFirst", required: false }] }], openIndexesChange: [{ type: i0.Output, args: ["openIndexesChange"] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], stackKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "stackKlass", required: false }] }], panels: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TngExpansionPanel), { ...{ descendants: true }, isSignal: true }] }] } });
221
+
222
+ class TngCard {
223
+ /* =====================
224
+ * Klass hooks
225
+ * ===================== */
226
+ rootKlass = input('', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
227
+ headerKlass = input('', ...(ngDevMode ? [{ debugName: "headerKlass" }] : []));
228
+ contentKlass = input('', ...(ngDevMode ? [{ debugName: "contentKlass" }] : []));
229
+ footerKlass = input('', ...(ngDevMode ? [{ debugName: "footerKlass" }] : []));
230
+ klass = input('', ...(ngDevMode ? [{ debugName: "klass" }] : []));
231
+ // Presence checks only (no `read` needed)
232
+ headerMarker = contentChild('[tngCardHeader]', ...(ngDevMode ? [{ debugName: "headerMarker" }] : []));
233
+ footerMarker = contentChild('[tngCardFooter]', ...(ngDevMode ? [{ debugName: "footerMarker" }] : []));
234
+ hasHeader = computed(() => !!this.headerMarker(), ...(ngDevMode ? [{ debugName: "hasHeader" }] : []));
235
+ hasFooter = computed(() => !!this.footerMarker(), ...(ngDevMode ? [{ debugName: "hasFooter" }] : []));
236
+ rootClasses = computed(() => ('block rounded-lg border border-border bg-bg text-fg shadow-sm ' +
237
+ this.rootKlass() +
238
+ ' ' +
239
+ this.klass()).trim(), ...(ngDevMode ? [{ debugName: "rootClasses" }] : []));
240
+ headerClasses = computed(() => ('border-b border-border px-4 py-3 ' + this.headerKlass()).trim(), ...(ngDevMode ? [{ debugName: "headerClasses" }] : []));
241
+ contentClasses = computed(() => ('px-4 py-4 ' + this.contentKlass()).trim(), ...(ngDevMode ? [{ debugName: "contentClasses" }] : []));
242
+ footerClasses = computed(() => ('border-t border-border px-4 py-3 ' + this.footerKlass()).trim(), ...(ngDevMode ? [{ debugName: "footerClasses" }] : []));
243
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
244
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngCard, isStandalone: true, selector: "tng-card", inputs: { rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, headerKlass: { classPropertyName: "headerKlass", publicName: "headerKlass", isSignal: true, isRequired: false, transformFunction: null }, contentKlass: { classPropertyName: "contentKlass", publicName: "contentKlass", isSignal: true, isRequired: false, transformFunction: null }, footerKlass: { classPropertyName: "footerKlass", publicName: "footerKlass", isSignal: true, isRequired: false, transformFunction: null }, klass: { classPropertyName: "klass", publicName: "klass", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "headerMarker", first: true, predicate: ["[tngCardHeader]"], descendants: true, isSignal: true }, { propertyName: "footerMarker", first: true, predicate: ["[tngCardFooter]"], descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"rootClasses()\">\n @if (hasHeader()) {\n <div [class]=\"headerClasses()\">\n <ng-content select=\"[tngCardHeader]\" />\n </div>\n }\n\n <div [class]=\"contentClasses()\">\n <ng-content />\n </div>\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[tngCardFooter]\" />\n </div>\n }\n</div>\n" });
245
+ }
246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngCard, decorators: [{
247
+ type: Component,
248
+ args: [{ selector: 'tng-card', standalone: true, template: "<div [class]=\"rootClasses()\">\n @if (hasHeader()) {\n <div [class]=\"headerClasses()\">\n <ng-content select=\"[tngCardHeader]\" />\n </div>\n }\n\n <div [class]=\"contentClasses()\">\n <ng-content />\n </div>\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[tngCardFooter]\" />\n </div>\n }\n</div>\n" }]
249
+ }], propDecorators: { rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], headerKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerKlass", required: false }] }], contentKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentKlass", required: false }] }], footerKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "footerKlass", required: false }] }], klass: [{ type: i0.Input, args: [{ isSignal: true, alias: "klass", required: false }] }], headerMarker: [{ type: i0.ContentChild, args: ['[tngCardHeader]', { isSignal: true }] }], footerMarker: [{ type: i0.ContentChild, args: ['[tngCardFooter]', { isSignal: true }] }] } });
250
+
251
+ class TngDivider {
252
+ orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
253
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
254
+ align = input('center', ...(ngDevMode ? [{ debugName: "align" }] : []));
255
+ dashed = input(false, { ...(ngDevMode ? { debugName: "dashed" } : {}), transform: booleanAttribute });
256
+ /* klass hooks */
257
+ rootKlass = input('', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
258
+ /** Must include border color: border-border or border-slate-300 */
259
+ lineKlass = input('border-border', ...(ngDevMode ? [{ debugName: "lineKlass" }] : []));
260
+ labelKlass = input('text-xs text-fg/70', ...(ngDevMode ? [{ debugName: "labelKlass" }] : []));
261
+ gapKlass = input('my-4', ...(ngDevMode ? [{ debugName: "gapKlass" }] : []));
262
+ thicknessKlass = input('border-t', ...(ngDevMode ? [{ debugName: "thicknessKlass" }] : []));
263
+ /** NEW: vertical height that does NOT depend on parent height */
264
+ verticalHeightKlass = input('h-6', ...(ngDevMode ? [{ debugName: "verticalHeightKlass" }] : []));
265
+ isVertical = computed(() => this.orientation() === 'vertical', ...(ngDevMode ? [{ debugName: "isVertical" }] : []));
266
+ rootClasses = computed(() => {
267
+ if (this.isVertical()) {
268
+ // no h-full dependency anymore
269
+ return (`inline-flex shrink-0 items-stretch ${this.rootKlass()}`).trim();
270
+ }
271
+ return (`flex w-full items-center ${this.gapKlass()} ${this.rootKlass()}`).trim();
272
+ }, ...(ngDevMode ? [{ debugName: "rootClasses" }] : []));
273
+ lineClasses = computed(() => {
274
+ const style = this.dashed() ? 'border-dashed' : 'border-solid';
275
+ if (this.isVertical()) {
276
+ // Always visible: w-px + explicit height
277
+ return (`w-px ${this.verticalHeightKlass()} self-stretch shrink-0 ` +
278
+ `border-l ${style} ${this.lineKlass()}`).trim();
279
+ }
280
+ return (`${this.thicknessKlass()} ${style} ${this.lineKlass()}`).trim();
281
+ }, ...(ngDevMode ? [{ debugName: "lineClasses" }] : []));
282
+ leftGrow = computed(() => {
283
+ const a = this.align();
284
+ if (a === 'start')
285
+ return 'grow-0 w-6';
286
+ if (a === 'end')
287
+ return 'grow';
288
+ return 'grow';
289
+ }, ...(ngDevMode ? [{ debugName: "leftGrow" }] : []));
290
+ rightGrow = computed(() => {
291
+ const a = this.align();
292
+ if (a === 'start')
293
+ return 'grow';
294
+ if (a === 'end')
295
+ return 'grow-0 w-6';
296
+ return 'grow';
297
+ }, ...(ngDevMode ? [{ debugName: "rightGrow" }] : []));
298
+ labelClasses = computed(() => (`px-3 whitespace-nowrap ${this.labelKlass()}`).trim(), ...(ngDevMode ? [{ debugName: "labelClasses" }] : []));
299
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngDivider, deps: [], target: i0.ɵɵFactoryTarget.Component });
300
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TngDivider, isStandalone: true, selector: "tng-divider", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, dashed: { classPropertyName: "dashed", publicName: "dashed", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, lineKlass: { classPropertyName: "lineKlass", publicName: "lineKlass", isSignal: true, isRequired: false, transformFunction: null }, labelKlass: { classPropertyName: "labelKlass", publicName: "labelKlass", isSignal: true, isRequired: false, transformFunction: null }, gapKlass: { classPropertyName: "gapKlass", publicName: "gapKlass", isSignal: true, isRequired: false, transformFunction: null }, thicknessKlass: { classPropertyName: "thicknessKlass", publicName: "thicknessKlass", isSignal: true, isRequired: false, transformFunction: null }, verticalHeightKlass: { classPropertyName: "verticalHeightKlass", publicName: "verticalHeightKlass", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n [class]=\"rootClasses()\"\n role=\"separator\"\n [attr.aria-orientation]=\"orientation()\"\n>\n @if (isVertical()) {\n <!-- Vertical divider -->\n <div [class]=\"lineClasses()\"></div>\n } @else {\n <!-- Horizontal divider -->\n @if (!label()) {\n <div class=\"w-full\" [class]=\"lineClasses()\"></div>\n } @else {\n <div [class]=\"leftGrow() + ' ' + lineClasses()\"></div>\n <span [class]=\"labelClasses()\">{{ label() }}</span>\n <div [class]=\"rightGrow() + ' ' + lineClasses()\"></div>\n }\n }\n</div>\n" });
301
+ }
302
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngDivider, decorators: [{
303
+ type: Component,
304
+ args: [{ selector: 'tng-divider', standalone: true, template: "<div\n [class]=\"rootClasses()\"\n role=\"separator\"\n [attr.aria-orientation]=\"orientation()\"\n>\n @if (isVertical()) {\n <!-- Vertical divider -->\n <div [class]=\"lineClasses()\"></div>\n } @else {\n <!-- Horizontal divider -->\n @if (!label()) {\n <div class=\"w-full\" [class]=\"lineClasses()\"></div>\n } @else {\n <div [class]=\"leftGrow() + ' ' + lineClasses()\"></div>\n <span [class]=\"labelClasses()\">{{ label() }}</span>\n <div [class]=\"rightGrow() + ' ' + lineClasses()\"></div>\n }\n }\n</div>\n" }]
305
+ }], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], dashed: [{ type: i0.Input, args: [{ isSignal: true, alias: "dashed", required: false }] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], lineKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineKlass", required: false }] }], labelKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelKlass", required: false }] }], gapKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "gapKlass", required: false }] }], thicknessKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "thicknessKlass", required: false }] }], verticalHeightKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "verticalHeightKlass", required: false }] }] } });
306
+
307
+ class TngTabs {
308
+ /* =====================
309
+ * Inputs
310
+ * ===================== */
311
+ /** Controlled value */
312
+ value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
313
+ /** Default value (uncontrolled init) */
314
+ defaultValue = input(null, ...(ngDevMode ? [{ debugName: "defaultValue" }] : []));
315
+ /** Orientation */
316
+ orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
317
+ /* =====================
318
+ * Outputs
319
+ * ===================== */
320
+ valueChange = output();
321
+ /* =====================
322
+ * Klass hooks
323
+ * ===================== */
324
+ rootKlass = input('w-full', ...(ngDevMode ? [{ debugName: "rootKlass" }] : []));
325
+ listKlass = input('flex gap-2 border-b border-border', ...(ngDevMode ? [{ debugName: "listKlass" }] : []));
326
+ panelKlass = input('pt-4', ...(ngDevMode ? [{ debugName: "panelKlass" }] : []));
327
+ /* =====================
328
+ * State
329
+ * ===================== */
330
+ _value = signal(null, ...(ngDevMode ? [{ debugName: "_value" }] : []));
331
+ activeValue = this._value.asReadonly();
332
+ constructor() {
333
+ effect(() => {
334
+ const controlled = this.value();
335
+ if (controlled !== null) {
336
+ this._value.set(controlled);
337
+ }
338
+ else if (this._value() === null) {
339
+ this._value.set(this.defaultValue());
340
+ }
341
+ });
342
+ }
343
+ setValue(v) {
344
+ this._value.set(v);
345
+ this.valueChange.emit(v);
346
+ }
347
+ isActive(v) {
348
+ return this.activeValue() === v;
349
+ }
350
+ orientationAttr = computed(() => this.orientation() === 'vertical' ? 'vertical' : 'horizontal', ...(ngDevMode ? [{ debugName: "orientationAttr" }] : []));
351
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabs, deps: [], target: i0.ɵɵFactoryTarget.Component });
352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: TngTabs, isStandalone: true, selector: "tng-tabs", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, rootKlass: { classPropertyName: "rootKlass", publicName: "rootKlass", isSignal: true, isRequired: false, transformFunction: null }, listKlass: { classPropertyName: "listKlass", publicName: "listKlass", isSignal: true, isRequired: false, transformFunction: null }, panelKlass: { classPropertyName: "panelKlass", publicName: "panelKlass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<div [class]=\"rootKlass()\">\n <div\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationAttr()\"\n [class]=\"listKlass()\"\n >\n <ng-content select=\"tng-tab\"></ng-content>\n </div>\n\n <div [class]=\"panelKlass()\">\n <ng-content select=\"tng-tab-panel\"></ng-content>\n </div>\n</div>\n" });
353
+ }
354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabs, decorators: [{
355
+ type: Component,
356
+ args: [{ selector: 'tng-tabs', standalone: true, template: "<div [class]=\"rootKlass()\">\n <div\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationAttr()\"\n [class]=\"listKlass()\"\n >\n <ng-content select=\"tng-tab\"></ng-content>\n </div>\n\n <div [class]=\"panelKlass()\">\n <ng-content select=\"tng-tab-panel\"></ng-content>\n </div>\n</div>\n" }]
357
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], defaultValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValue", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], rootKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootKlass", required: false }] }], listKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "listKlass", required: false }] }], panelKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelKlass", required: false }] }] } });
358
+
359
+ class TngTab {
360
+ tabs = inject(TngTabs);
361
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
362
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
363
+ tabKlass = input('px-3 py-2 text-sm font-medium border-b-2 border-transparent', ...(ngDevMode ? [{ debugName: "tabKlass" }] : []));
364
+ activeKlass = input('border-primary text-primary', ...(ngDevMode ? [{ debugName: "activeKlass" }] : []));
365
+ inactiveKlass = input('text-muted-foreground', ...(ngDevMode ? [{ debugName: "inactiveKlass" }] : []));
366
+ disabledKlass = input('opacity-50 cursor-not-allowed', ...(ngDevMode ? [{ debugName: "disabledKlass" }] : []));
367
+ role = 'tab';
368
+ get selected() {
369
+ return this.tabs.isActive(this.value());
370
+ }
371
+ get tabindex() {
372
+ return this.tabs.isActive(this.value()) ? 0 : -1;
373
+ }
374
+ get klass() {
375
+ if (this.disabled())
376
+ return `${this.tabKlass()} ${this.disabledKlass()}`;
377
+ return this.tabs.isActive(this.value())
378
+ ? `${this.tabKlass()} ${this.activeKlass()}`
379
+ : `${this.tabKlass()} ${this.inactiveKlass()}`;
380
+ }
381
+ onClick() {
382
+ if (!this.disabled()) {
383
+ this.tabs.setValue(this.value());
384
+ }
385
+ }
386
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTab, deps: [], target: i0.ɵɵFactoryTarget.Component });
387
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: TngTab, isStandalone: true, selector: "tng-tab", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, tabKlass: { classPropertyName: "tabKlass", publicName: "tabKlass", isSignal: true, isRequired: false, transformFunction: null }, activeKlass: { classPropertyName: "activeKlass", publicName: "activeKlass", isSignal: true, isRequired: false, transformFunction: null }, inactiveKlass: { classPropertyName: "inactiveKlass", publicName: "inactiveKlass", isSignal: true, isRequired: false, transformFunction: null }, disabledKlass: { classPropertyName: "disabledKlass", publicName: "disabledKlass", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick()" }, properties: { "attr.role": "this.role", "attr.aria-selected": "this.selected", "attr.tabindex": "this.tabindex", "class": "this.klass" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
388
+ }
389
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTab, decorators: [{
390
+ type: Component,
391
+ args: [{
392
+ selector: 'tng-tab',
393
+ standalone: true,
394
+ template: `<ng-content />`,
395
+ }]
396
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], tabKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabKlass", required: false }] }], activeKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeKlass", required: false }] }], inactiveKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "inactiveKlass", required: false }] }], disabledKlass: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledKlass", required: false }] }], role: [{
397
+ type: HostBinding,
398
+ args: ['attr.role']
399
+ }], selected: [{
400
+ type: HostBinding,
401
+ args: ['attr.aria-selected']
402
+ }], tabindex: [{
403
+ type: HostBinding,
404
+ args: ['attr.tabindex']
405
+ }], klass: [{
406
+ type: HostBinding,
407
+ args: ['class']
408
+ }], onClick: [{
409
+ type: HostListener,
410
+ args: ['click']
411
+ }] } });
412
+
413
+ class TngTabPanel {
414
+ tabs = inject(TngTabs);
415
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
416
+ role = 'tabpanel';
417
+ get hidden() {
418
+ return !this.tabs.isActive(this.value());
419
+ }
420
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabPanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
421
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: TngTabPanel, isStandalone: true, selector: "tng-tab-panel", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "attr.role": "this.role", "hidden": "this.hidden" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
422
+ }
423
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TngTabPanel, decorators: [{
424
+ type: Component,
425
+ args: [{
426
+ selector: 'tng-tab-panel',
427
+ standalone: true,
428
+ template: `<ng-content />`,
429
+ }]
430
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], role: [{
431
+ type: HostBinding,
432
+ args: ['attr.role']
433
+ }], hidden: [{
434
+ type: HostBinding,
435
+ args: ['hidden']
436
+ }] } });
18
437
 
19
438
  /**
20
439
  * Generated bundle index. Do not edit.
21
440
  */
441
+
442
+ export { TngAccordion, TngCard, TngDivider, TngExpansionIconClose, TngExpansionIconOpen, TngExpansionPanel, TngTab, TngTabPanel, TngTabs };
22
443
  //# sourceMappingURL=tociva-tailng-ui-layout.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tociva-tailng-ui-layout.mjs","sources":["../../../../libs/ui/layout/src/public-api.ts","../../../../libs/ui/layout/src/tociva-tailng-ui-layout.ts"],"sourcesContent":["export * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,EAAA,OAAA,CAAA;;ACAA;;AAEG"}
1
+ {"version":3,"file":"tociva-tailng-ui-layout.mjs","sources":["../../../../libs/ui/layout/src/lib/expansion-panel/expansion-panel.component.ts","../../../../libs/ui/layout/src/lib/expansion-panel/expansion-panel.component.html","../../../../libs/ui/layout/src/lib/accordion/accordion.component.ts","../../../../libs/ui/layout/src/lib/accordion/accordion.component.html","../../../../libs/ui/layout/src/lib/card/card.component.ts","../../../../libs/ui/layout/src/lib/card/card.component.html","../../../../libs/ui/layout/src/lib/divider/divider.component.ts","../../../../libs/ui/layout/src/lib/divider/divider.component.html","../../../../libs/ui/layout/src/lib/tabs/tabs.component.ts","../../../../libs/ui/layout/src/lib/tabs/tabs.component.html","../../../../libs/ui/layout/src/lib/tabs/tab.component.ts","../../../../libs/ui/layout/src/lib/tabs/tab-panel.component.ts","../../../../libs/ui/layout/src/tociva-tailng-ui-layout.ts"],"sourcesContent":["import {\n Component,\n Directive,\n computed,\n contentChild,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\n\n/**\n * OPEN-state icon marker.\n * Consumer must import this directive where the icon is used.\n */\n@Directive({\n selector: '[tngExpansionIconOpen]',\n standalone: true,\n})\nexport class TngExpansionIconOpen {}\n\n/**\n * CLOSE-state icon marker.\n * Consumer must import this directive where the icon is used.\n */\n@Directive({\n selector: '[tngExpansionIconClose]',\n standalone: true,\n})\nexport class TngExpansionIconClose {}\n\n@Component({\n selector: 'tng-expansion-panel',\n standalone: true,\n templateUrl: './expansion-panel.component.html',\n})\nexport class TngExpansionPanel {\n /* =====================\n * Inputs\n * ===================== */\n\n open = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n padded = input(true, { transform: booleanAttribute });\n\n /* =====================\n * Outputs\n * ===================== */\n\n openChange = output<boolean>();\n\n /* =====================\n * Klass hooks\n * ===================== */\n\n rootKlass = input<string>('rounded-lg border border-border bg-bg');\n\n headerKlass = input<string>(\n 'flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground ' +\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ' +\n 'disabled:cursor-not-allowed disabled:opacity-60'\n );\n\n titleKlass = input<string>('flex-1');\n\n iconWrapperKlass = input<string>(\n 'ml-2 shrink-0 inline-flex items-center justify-center'\n );\n\n chevronKlass = input<string>(\n 'h-4 w-4 shrink-0 transition-transform duration-200'\n );\n\n contentOuterKlass = input<string>(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out'\n );\n\n contentClipKlass = input<string>('overflow-hidden');\n contentBodyKlass = input<string>('text-sm text-muted-foreground');\n contentPaddingKlass = input<string>('px-4 pb-4 pt-2');\n\n /* =====================\n * Slots (state icons only)\n * ===================== */\n\n readonly iconOpen = contentChild(TngExpansionIconOpen);\n readonly iconClose = contentChild(TngExpansionIconClose);\n \n readonly hasOpenIcon = computed(() => !!this.iconOpen());\n readonly hasCloseIcon = computed(() => !!this.iconClose());\n readonly hasAnyCustomIcon = computed(() => this.hasOpenIcon() || this.hasCloseIcon());\n \n // Stable rendering flags (avoid ng-content inside @if)\n readonly showOpenIcon = computed(() => {\n if (!this.hasAnyCustomIcon()) return false;\n if (this.hasOpenIcon() && this.hasCloseIcon()) return this.isOpen();\n if (this.hasOpenIcon()) return true; // only open provided -> use for both states\n return false;\n });\n \n readonly showCloseIcon = computed(() => {\n if (!this.hasAnyCustomIcon()) return false;\n if (this.hasOpenIcon() && this.hasCloseIcon()) return !this.isOpen();\n if (this.hasCloseIcon()) return true; // only close provided -> use for both states\n return false;\n });\n \n\n /* =====================\n * State\n * ===================== */\n\n private readonly _isOpen = signal(false);\n readonly isOpen = this._isOpen.asReadonly();\n\n constructor() {\n effect(() => {\n this._isOpen.set(this.open());\n });\n }\n\n toggle(): void {\n if (this.disabled()) return;\n const next = !this._isOpen();\n this._isOpen.set(next);\n this.openChange.emit(next);\n }\n\n /* =====================\n * Computed\n * ===================== */\n\n readonly contentRowsKlass = computed(() =>\n this.isOpen() ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n );\n\n readonly chevronRotateKlass = computed(() => (this.isOpen() ? 'rotate-180' : ''));\n\n /* =====================\n * Final Klass (defaults + user overrides)\n * ===================== */\n\n readonly finalRootKlass = computed(() =>\n this.join('rounded-lg border border-border bg-bg', this.rootKlass()),\n );\n\n readonly finalHeaderKlass = computed(() =>\n this.join(\n 'flex w-full items-center justify-between gap-4 px-4 py-3 text-left text-sm font-medium text-foreground',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary',\n 'disabled:cursor-not-allowed disabled:opacity-60',\n this.headerKlass(),\n ),\n );\n\n readonly finalTitleKlass = computed(() => this.join('flex-1', this.titleKlass()));\n\n readonly finalIconWrapperKlass = computed(() =>\n this.join('ml-2 shrink-0 inline-flex items-center justify-center', this.iconWrapperKlass()),\n );\n\n readonly finalChevronKlass = computed(() =>\n this.join('h-4 w-4 shrink-0 transition-transform duration-200', this.chevronKlass()),\n );\n\n readonly finalContentOuterKlass = computed(() =>\n this.join(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out',\n this.contentOuterKlass(),\n ),\n );\n\n readonly finalContentClipKlass = computed(() =>\n this.join('overflow-hidden', this.contentClipKlass()),\n );\n\n readonly finalContentBodyKlass = computed(() => {\n const pad = this.padded() ? this.contentPaddingKlass() : '';\n return this.join('text-sm text-muted-foreground', pad, this.contentBodyKlass());\n });\n\n private join(...parts: Array<string | null | undefined>): string {\n return parts\n .map((p) => (p ?? '').trim())\n .filter(Boolean)\n .join(' ');\n }\n}\n","<div [class]=\"finalRootKlass()\">\n \n <button\n type=\"button\"\n [class]=\"finalHeaderKlass()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle()\"\n >\n <span [class]=\"finalTitleKlass()\">\n <ng-content select=\"[tngExpansionTitle]\"></ng-content>\n </span>\n\n <span [class]=\"finalIconWrapperKlass()\">\n @if (hasAnyCustomIcon()) {\n <!-- Keep both ng-content slots always present -->\n <span [hidden]=\"!showOpenIcon()\">\n <ng-content select=\"[tngExpansionIconOpen]\"></ng-content>\n </span>\n \n <span [hidden]=\"!showCloseIcon()\">\n <ng-content select=\"[tngExpansionIconClose]\"></ng-content>\n </span>\n } @else {\n <!-- Default chevron -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n [class]=\"finalChevronKlass() + ' ' + chevronRotateKlass()\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n }\n </span>\n \n </button>\n\n <div [class]=\"finalContentOuterKlass() + ' ' + contentRowsKlass()\">\n <div [class]=\"finalContentClipKlass()\">\n <div [class]=\"finalContentBodyKlass()\">\n <ng-content select=\"[tngExpansionContent]\"></ng-content>\n </div>\n </div>\n </div>\n</div>\n","import {\n booleanAttribute,\n Component,\n contentChildren,\n effect,\n input,\n output\n} from '@angular/core';\nimport { TngExpansionPanel } from '../expansion-panel/expansion-panel.component';\n\n@Component({\n selector: 'tng-accordion',\n standalone: true,\n templateUrl: './accordion.component.html',\n})\nexport class TngAccordion {\n /* =====================\n * Inputs\n * ===================== */\n\n /** Allow multiple panels to be open at once */\n multiple = input(false, { transform: booleanAttribute });\n\n /**\n * If false: prevents closing the last open panel (at least one stays open)\n * If true: all can be collapsed\n */\n collapsible = input(true, { transform: booleanAttribute });\n\n /** If true: when all panels are closed, open the first panel automatically */\n autoOpenFirst = input(false, { transform: booleanAttribute });\n\n /* =====================\n * Outputs\n * ===================== */\n\n /** Emits current open indexes when changes happen */\n openIndexesChange = output<number[]>();\n\n /* =====================\n * Klass hooks\n * ===================== */\n\n rootKlass = input<string>('w-full');\n stackKlass = input<string>('space-y-2');\n\n /* =====================\n * Children\n * ===================== */\n\n // All projected expansion panels (descendants enabled so nested layouts still work)\n readonly panels = contentChildren(TngExpansionPanel, { descendants: true });\n\n\n constructor() {\n effect((onCleanup) => {\n const panels = this.panels();\n\n // Subscribe to openChange from each panel\n const subs = panels.map((p) =>\n p.openChange.subscribe((nextOpen) => {\n this.onPanelToggled(p, nextOpen);\n })\n );\n\n // Emit initial state + optionally auto open first\n this.emitOpenIndexes();\n if (this.autoOpenFirst() && this.getOpenPanels().length === 0 && panels.length > 0) {\n // open first panel\n if (!panels[0].isOpen()) panels[0].toggle();\n }\n\n onCleanup(() => subs.forEach((s) => s.unsubscribe()));\n });\n }\n\n private onPanelToggled(panel: TngExpansionPanel, nextOpen: boolean): void {\n const panels = this.panels();\n\n // If a panel just opened and multiple is false, close all others.\n if (nextOpen && !this.multiple()) {\n for (const p of panels) {\n if (p !== panel && p.isOpen()) {\n p.toggle();\n }\n }\n }\n\n // If a panel just closed and collapsible is false, ensure at least one stays open.\n if (!nextOpen && !this.collapsible()) {\n // After close, if none are open, reopen this one.\n if (this.getOpenPanels().length === 0) {\n // Reopen the same panel (guard against disabled)\n if (!panel.disabled()) {\n panel.toggle();\n return; // the toggle will trigger emit later\n }\n }\n }\n\n this.emitOpenIndexes();\n }\n\n private getOpenPanels(): TngExpansionPanel[] {\n return this.panels().filter((p) => p.isOpen());\n }\n\n private emitOpenIndexes(): void {\n const panels = this.panels();\n const openIndexes = panels\n .map((p, i) => (p.isOpen() ? i : -1))\n .filter((i) => i >= 0);\n\n this.openIndexesChange.emit(openIndexes);\n }\n}\n","<div [class]=\"rootKlass()\">\n <div [class]=\"stackKlass()\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { Component, computed, contentChild, input } from '@angular/core';\n\n@Component({\n selector: 'tng-card',\n standalone: true,\n templateUrl: './card.component.html',\n})\nexport class TngCard {\n /* =====================\n * Klass hooks\n * ===================== */\n rootKlass = input<string>('');\n headerKlass = input<string>('');\n contentKlass = input<string>('');\n footerKlass = input<string>('');\n klass = input<string>('');\n\n // Presence checks only (no `read` needed)\n private headerMarker = contentChild('[tngCardHeader]');\n private footerMarker = contentChild('[tngCardFooter]');\n\n readonly hasHeader = computed(() => !!this.headerMarker());\n readonly hasFooter = computed(() => !!this.footerMarker());\n\n readonly rootClasses = computed(() =>\n (\n 'block rounded-lg border border-border bg-bg text-fg shadow-sm ' +\n this.rootKlass() +\n ' ' +\n this.klass()\n ).trim()\n );\n\n readonly headerClasses = computed(() =>\n ('border-b border-border px-4 py-3 ' + this.headerKlass()).trim()\n );\n\n readonly contentClasses = computed(() =>\n ('px-4 py-4 ' + this.contentKlass()).trim()\n );\n\n readonly footerClasses = computed(() =>\n ('border-t border-border px-4 py-3 ' + this.footerKlass()).trim()\n );\n}\n","<div [class]=\"rootClasses()\">\n @if (hasHeader()) {\n <div [class]=\"headerClasses()\">\n <ng-content select=\"[tngCardHeader]\" />\n </div>\n }\n\n <div [class]=\"contentClasses()\">\n <ng-content />\n </div>\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[tngCardFooter]\" />\n </div>\n }\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\n\nexport type TngDividerOrientation = 'horizontal' | 'vertical';\nexport type TngDividerAlign = 'start' | 'center' | 'end';\n\n@Component({\n selector: 'tng-divider',\n standalone: true,\n templateUrl: './divider.component.html',\n})\nexport class TngDivider {\n orientation = input<TngDividerOrientation>('horizontal');\n label = input<string>('');\n align = input<TngDividerAlign>('center');\n dashed = input(false, { transform: booleanAttribute });\n\n /* klass hooks */\n rootKlass = input<string>('');\n\n /** Must include border color: border-border or border-slate-300 */\n lineKlass = input<string>('border-border');\n\n labelKlass = input<string>('text-xs text-fg/70');\n gapKlass = input<string>('my-4');\n thicknessKlass = input<string>('border-t');\n\n /** NEW: vertical height that does NOT depend on parent height */\n verticalHeightKlass = input<string>('h-6');\n\n readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n readonly rootClasses = computed(() => {\n if (this.isVertical()) {\n // no h-full dependency anymore\n return (`inline-flex shrink-0 items-stretch ${this.rootKlass()}`).trim();\n }\n return (`flex w-full items-center ${this.gapKlass()} ${this.rootKlass()}`).trim();\n });\n\n readonly lineClasses = computed(() => {\n const style = this.dashed() ? 'border-dashed' : 'border-solid';\n\n if (this.isVertical()) {\n // Always visible: w-px + explicit height\n return (\n `w-px ${this.verticalHeightKlass()} self-stretch shrink-0 ` +\n `border-l ${style} ${this.lineKlass()}`\n ).trim();\n }\n\n return (`${this.thicknessKlass()} ${style} ${this.lineKlass()}`).trim();\n });\n\n readonly leftGrow = computed(() => {\n const a = this.align();\n if (a === 'start') return 'grow-0 w-6';\n if (a === 'end') return 'grow';\n return 'grow';\n });\n\n readonly rightGrow = computed(() => {\n const a = this.align();\n if (a === 'start') return 'grow';\n if (a === 'end') return 'grow-0 w-6';\n return 'grow';\n });\n\n readonly labelClasses = computed(\n () => (`px-3 whitespace-nowrap ${this.labelKlass()}`).trim()\n );\n}\n","<div\n [class]=\"rootClasses()\"\n role=\"separator\"\n [attr.aria-orientation]=\"orientation()\"\n>\n @if (isVertical()) {\n <!-- Vertical divider -->\n <div [class]=\"lineClasses()\"></div>\n } @else {\n <!-- Horizontal divider -->\n @if (!label()) {\n <div class=\"w-full\" [class]=\"lineClasses()\"></div>\n } @else {\n <div [class]=\"leftGrow() + ' ' + lineClasses()\"></div>\n <span [class]=\"labelClasses()\">{{ label() }}</span>\n <div [class]=\"rightGrow() + ' ' + lineClasses()\"></div>\n }\n }\n</div>\n","import {\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\n\n@Component({\n selector: 'tng-tabs',\n standalone: true,\n templateUrl: './tabs.component.html',\n})\nexport class TngTabs {\n /* =====================\n * Inputs\n * ===================== */\n\n /** Controlled value */\n value = input<string | null>(null);\n\n /** Default value (uncontrolled init) */\n defaultValue = input<string | null>(null);\n\n /** Orientation */\n orientation = input<'horizontal' | 'vertical'>('horizontal');\n\n /* =====================\n * Outputs\n * ===================== */\n\n valueChange = output<string>();\n\n /* =====================\n * Klass hooks\n * ===================== */\n\n rootKlass = input<string>('w-full');\n listKlass = input<string>('flex gap-2 border-b border-border');\n panelKlass = input<string>('pt-4');\n\n /* =====================\n * State\n * ===================== */\n\n private readonly _value = signal<string | null>(null);\n readonly activeValue = this._value.asReadonly();\n\n constructor() {\n effect(() => {\n const controlled = this.value();\n if (controlled !== null) {\n this._value.set(controlled);\n } else if (this._value() === null) {\n this._value.set(this.defaultValue());\n }\n });\n }\n\n setValue(v: string) {\n this._value.set(v);\n this.valueChange.emit(v);\n }\n\n isActive(v: string) {\n return this.activeValue() === v;\n }\n\n readonly orientationAttr = computed(() =>\n this.orientation() === 'vertical' ? 'vertical' : 'horizontal'\n );\n}\n","<div [class]=\"rootKlass()\">\n <div\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationAttr()\"\n [class]=\"listKlass()\"\n >\n <ng-content select=\"tng-tab\"></ng-content>\n </div>\n\n <div [class]=\"panelKlass()\">\n <ng-content select=\"tng-tab-panel\"></ng-content>\n </div>\n</div>\n","import {\n Component,\n HostBinding,\n HostListener,\n inject,\n input,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\nimport { TngTabs } from './tabs.component';\n\n@Component({\n selector: 'tng-tab',\n standalone: true,\n template: `<ng-content />`,\n})\nexport class TngTab {\n private readonly tabs = inject(TngTabs);\n\n value = input.required<string>();\n disabled = input(false, { transform: booleanAttribute });\n\n tabKlass = input<string>(\n 'px-3 py-2 text-sm font-medium border-b-2 border-transparent'\n );\n activeKlass = input<string>('border-primary text-primary');\n inactiveKlass = input<string>('text-muted-foreground');\n disabledKlass = input<string>('opacity-50 cursor-not-allowed');\n\n @HostBinding('attr.role') role = 'tab';\n\n @HostBinding('attr.aria-selected')\n get selected() {\n return this.tabs.isActive(this.value());\n }\n\n @HostBinding('attr.tabindex')\n get tabindex() {\n return this.tabs.isActive(this.value()) ? 0 : -1;\n }\n\n @HostBinding('class')\n get klass() {\n if (this.disabled()) return `${this.tabKlass()} ${this.disabledKlass()}`;\n return this.tabs.isActive(this.value())\n ? `${this.tabKlass()} ${this.activeKlass()}`\n : `${this.tabKlass()} ${this.inactiveKlass()}`;\n }\n\n @HostListener('click')\n onClick() {\n if (!this.disabled()) {\n this.tabs.setValue(this.value());\n }\n }\n}\n","import { Component, HostBinding, inject, input } from '@angular/core';\nimport { TngTabs } from './tabs.component';\n\n@Component({\n selector: 'tng-tab-panel',\n standalone: true,\n template: `<ng-content />`,\n})\nexport class TngTabPanel {\n private readonly tabs = inject(TngTabs);\n\n value = input.required<string>();\n\n @HostBinding('attr.role') role = 'tabpanel';\n\n @HostBinding('hidden')\n get hidden() {\n return !this.tabs.isActive(this.value());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAYA;;;AAGG;MAKU,oBAAoB,CAAA;uGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;AAGD;;;AAGG;MAKU,qBAAqB,CAAA;uGAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;MAQY,iBAAiB,CAAA;AAC5B;;AAE2B;IAE3B,IAAI,GAAG,KAAK,CAAC,KAAK,iDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACpD,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,MAAM,GAAG,KAAK,CAAC,IAAI,mDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAErD;;AAE2B;IAE3B,UAAU,GAAG,MAAM,EAAW;AAE9B;;AAE2B;AAE3B,IAAA,SAAS,GAAG,KAAK,CAAS,uCAAuC,qDAAC;IAElE,WAAW,GAAG,KAAK,CACjB,yGAAyG;QACvG,qEAAqE;AACrE,QAAA,iDAAiD,uDACpD;AAED,IAAA,UAAU,GAAG,KAAK,CAAS,QAAQ,sDAAC;AAEpC,IAAA,gBAAgB,GAAG,KAAK,CACtB,uDAAuD,4DACxD;AAED,IAAA,YAAY,GAAG,KAAK,CAClB,oDAAoD,wDACrD;AAED,IAAA,iBAAiB,GAAG,KAAK,CACvB,+DAA+D,6DAChE;AAED,IAAA,gBAAgB,GAAG,KAAK,CAAS,iBAAiB,4DAAC;AACnD,IAAA,gBAAgB,GAAG,KAAK,CAAS,+BAA+B,4DAAC;AACjE,IAAA,mBAAmB,GAAG,KAAK,CAAS,gBAAgB,+DAAC;AAEnD;;AAEyB;AAEhB,IAAA,QAAQ,GAAG,YAAY,CAAC,oBAAoB,oDAAC;AAC7C,IAAA,SAAS,GAAG,YAAY,CAAC,qBAAqB,qDAAC;AAE/C,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,uDAAC;AAC/C,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,wDAAC;AACjD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,4DAAC;;AAG5E,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAAE,YAAA,OAAO,KAAK;QAC1C,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,EAAE;QACnE,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC;AACpC,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,wDAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAAE,YAAA,OAAO,KAAK;QAC1C,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;QACpE,IAAI,IAAI,CAAC,YAAY,EAAE;YAAE,OAAO,IAAI,CAAC;AACrC,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,yDAAC;AAGJ;;AAE2B;AAEV,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AAC/B,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAE3C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;AAEA;;AAE2B;AAElB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,MAAM,EAAE,GAAG,iBAAiB,GAAG,iBAAiB,4DACtD;IAEQ,kBAAkB,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,GAAG,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEjF;;AAE2B;AAElB,IAAA,cAAc,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,IAAI,CAAC,uCAAuC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,0DACrE;IAEQ,gBAAgB,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,IAAI,CACP,wGAAwG,EACxG,oEAAoE,EACpE,iDAAiD,EACjD,IAAI,CAAC,WAAW,EAAE,CACnB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACF;AAEQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,2DAAC;AAExE,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,IAAI,CAAC,uDAAuD,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,iEAC5F;AAEQ,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MACpC,IAAI,CAAC,IAAI,CAAC,oDAAoD,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,6DACrF;AAEQ,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MACzC,IAAI,CAAC,IAAI,CACP,+DAA+D,EAC/D,IAAI,CAAC,iBAAiB,EAAE,CACzB,kEACF;AAEQ,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,iEACtD;AAEQ,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;AAC3D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACjF,IAAA,CAAC,iEAAC;IAEM,IAAI,CAAC,GAAG,KAAuC,EAAA;AACrD,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;aAC3B,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;IACd;uGAtJW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAiDO,oBAAoB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACnB,qBAAqB,gECvF3D,knDAuDA,EAAA,CAAA;;2FDlBa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,QAAA,EAAA,knDAAA,EAAA;AAoDmB,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,oBAAoB,2FACnB,qBAAqB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MExE9C,YAAY,CAAA;AACvB;;AAE2B;;IAG3B,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAExD;;;AAGG;IACH,WAAW,GAAG,KAAK,CAAC,IAAI,wDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG1D,aAAa,GAAG,KAAK,CAAC,KAAK,0DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAE7D;;AAE2B;;IAG3B,iBAAiB,GAAG,MAAM,EAAY;AAEtC;;AAE2B;AAE3B,IAAA,SAAS,GAAG,KAAK,CAAS,QAAQ,qDAAC;AACnC,IAAA,UAAU,GAAG,KAAK,CAAS,WAAW,sDAAC;AAEvC;;AAE2B;;IAGlB,MAAM,GAAG,eAAe,CAAC,iBAAiB,mDAAI,WAAW,EAAE,IAAI,EAAA,CAAG;AAG3E,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACnB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;;YAG5B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KACxB,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAI;AAClC,gBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC;YAClC,CAAC,CAAC,CACH;;YAGD,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;;AAElF,gBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;AAAE,oBAAA,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;YAC7C;AAEA,YAAA,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACvD,QAAA,CAAC,CAAC;IACJ;IAEQ,cAAc,CAAC,KAAwB,EAAE,QAAiB,EAAA;AAChE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;;QAG5B,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AAChC,YAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;gBACtB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC7B,CAAC,CAAC,MAAM,EAAE;gBACZ;YACF;QACF;;QAGA,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;;YAEpC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;;AAErC,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE;oBACrB,KAAK,CAAC,MAAM,EAAE;AACd,oBAAA,OAAO;gBACT;YACF;QACF;QAEA,IAAI,CAAC,eAAe,EAAE;IACxB;IAEQ,aAAa,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IAChD;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,MAAM,WAAW,GAAG;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;aACnC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAExB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;IAC1C;uGAnGW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAoCW,iBAAiB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnDrD,oHAKA,EAAA,CAAA;;2FDUa,YAAY,EAAA,UAAA,EAAA,CAAA;kBALxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cACb,IAAI,EAAA,QAAA,EAAA,oHAAA,EAAA;AAuCkB,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,iBAAiB,CAAA,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ME5C/D,OAAO,CAAA;AAClB;;AAE2B;AAC3B,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;AAC7B,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;AAC/B,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,wDAAC;AAChC,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;AAC/B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;AAGjB,IAAA,YAAY,GAAG,YAAY,CAAC,iBAAiB,wDAAC;AAC9C,IAAA,YAAY,GAAG,YAAY,CAAC,iBAAiB,wDAAC;AAE7C,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,qDAAC;AACjD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,qDAAC;AAEjD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAC9B,CACE,gEAAgE;QAChE,IAAI,CAAC,SAAS,EAAE;QAChB,GAAG;QACH,IAAI,CAAC,KAAK,EAAE,EACZ,IAAI,EAAE,uDACT;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAChC,CAAC,mCAAmC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,yDAClE;AAEQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MACjC,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,0DAC5C;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAChC,CAAC,mCAAmC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,yDAClE;uGApCU,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,49BCPpB,mXAiBA,EAAA,CAAA;;2FDVa,OAAO,EAAA,UAAA,EAAA,CAAA;kBALnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cACR,IAAI,EAAA,QAAA,EAAA,mXAAA,EAAA;AAcoB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,iBAAiB,yEACjB,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MER1C,UAAU,CAAA;AACrB,IAAA,WAAW,GAAG,KAAK,CAAwB,YAAY,uDAAC;AACxD,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,KAAK,GAAG,KAAK,CAAkB,QAAQ,iDAAC;IACxC,MAAM,GAAG,KAAK,CAAC,KAAK,mDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAGtD,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;;AAG7B,IAAA,SAAS,GAAG,KAAK,CAAS,eAAe,qDAAC;AAE1C,IAAA,UAAU,GAAG,KAAK,CAAS,oBAAoB,sDAAC;AAChD,IAAA,QAAQ,GAAG,KAAK,CAAS,MAAM,oDAAC;AAChC,IAAA,cAAc,GAAG,KAAK,CAAS,UAAU,0DAAC;;AAG1C,IAAA,mBAAmB,GAAG,KAAK,CAAS,KAAK,+DAAC;AAEjC,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,sDAAC;AAE9D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;;YAErB,OAAO,CAAC,CAAA,mCAAA,EAAsC,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE;QAC1E;AACA,QAAA,OAAO,CAAC,CAAA,yBAAA,EAA4B,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE;AACnF,IAAA,CAAC,uDAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,eAAe,GAAG,cAAc;AAE9D,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;;AAErB,YAAA,OAAO,CACL,CAAA,KAAA,EAAQ,IAAI,CAAC,mBAAmB,EAAE,CAAA,uBAAA,CAAyB;gBAC3D,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE,EACvC,IAAI,EAAE;QACV;AAEA,QAAA,OAAO,CAAC,CAAA,EAAG,IAAI,CAAC,cAAc,EAAE,IAAI,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE;AACzE,IAAA,CAAC,uDAAC;AAEO,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,KAAK,OAAO;AAAE,YAAA,OAAO,YAAY;QACtC,IAAI,CAAC,KAAK,KAAK;AAAE,YAAA,OAAO,MAAM;AAC9B,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,oDAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,KAAK,OAAO;AAAE,YAAA,OAAO,MAAM;QAChC,IAAI,CAAC,KAAK,KAAK;AAAE,YAAA,OAAO,YAAY;AACpC,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,qDAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAC9B,MAAM,CAAC,CAAA,uBAAA,EAA0B,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE,wDAC7D;uGA3DU,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,64CCXvB,gjBAmBA,EAAA,CAAA;;2FDRa,UAAU,EAAA,UAAA,EAAA,CAAA;kBALtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,QAAA,EAAA,gjBAAA,EAAA;;;MEOL,OAAO,CAAA;AAClB;;AAE2B;;AAG3B,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,iDAAC;;AAGlC,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,wDAAC;;AAGzC,IAAA,WAAW,GAAG,KAAK,CAA4B,YAAY,uDAAC;AAE5D;;AAE2B;IAE3B,WAAW,GAAG,MAAM,EAAU;AAE9B;;AAE2B;AAE3B,IAAA,SAAS,GAAG,KAAK,CAAS,QAAQ,qDAAC;AACnC,IAAA,SAAS,GAAG,KAAK,CAAS,mCAAmC,qDAAC;AAC9D,IAAA,UAAU,GAAG,KAAK,CAAS,MAAM,sDAAC;AAElC;;AAE2B;AAEV,IAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,kDAAC;AAC5C,IAAA,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAE/C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/B,YAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;YAC7B;AAAO,iBAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,QAAQ,CAAC,CAAS,EAAA;AAChB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B;AAEA,IAAA,QAAQ,CAAC,CAAS,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;IACjC;IAES,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,GAAG,UAAU,GAAG,YAAY,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC9D;uGAzDU,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,u5BCfpB,8TAaA,EAAA,CAAA;;2FDEa,OAAO,EAAA,UAAA,EAAA,CAAA;kBALnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cACR,IAAI,EAAA,QAAA,EAAA,8TAAA,EAAA;;;MEGL,MAAM,CAAA;AACA,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;AAEvC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;IAChC,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAExD,IAAA,QAAQ,GAAG,KAAK,CACd,6DAA6D,oDAC9D;AACD,IAAA,WAAW,GAAG,KAAK,CAAS,6BAA6B,uDAAC;AAC1D,IAAA,aAAa,GAAG,KAAK,CAAS,uBAAuB,yDAAC;AACtD,IAAA,aAAa,GAAG,KAAK,CAAS,+BAA+B,yDAAC;IAEpC,IAAI,GAAG,KAAK;AAEtC,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACzC;AAEA,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD;AAEA,IAAA,IACI,KAAK,GAAA;QACP,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,EAAE,CAAA,CAAE;QACxE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;cAClC,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,WAAW,EAAE,CAAA;AAC1C,cAAE,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,EAAE,CAAA,CAAE;IAClD;IAGA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC;IACF;uGAtCW,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAM,2iCAFP,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEf,MAAM,EAAA,UAAA,EAAA,CAAA;kBALlB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;sBAcE,WAAW;uBAAC,WAAW;;sBAEvB,WAAW;uBAAC,oBAAoB;;sBAKhC,WAAW;uBAAC,eAAe;;sBAK3B,WAAW;uBAAC,OAAO;;sBAQnB,YAAY;uBAAC,OAAO;;;MCxCV,WAAW,CAAA;AACL,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;AAEvC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;IAEN,IAAI,GAAG,UAAU;AAE3C,IAAA,IACI,MAAM,GAAA;AACR,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1C;uGAVW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,yRAFZ,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEf,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;sBAME,WAAW;uBAAC,WAAW;;sBAEvB,WAAW;uBAAC,QAAQ;;;ACfvB;;AAEG;;;;"}