@phcdevworks/spectre-components 1.19.0 → 1.21.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.
- package/README.md +770 -125
- package/dist/accordion-item.cjs +540 -0
- package/dist/accordion-item.cjs.map +1 -0
- package/dist/accordion-item.d.cts +59 -0
- package/dist/accordion-item.d.ts +59 -0
- package/dist/accordion-item.js +537 -0
- package/dist/accordion-item.js.map +1 -0
- package/dist/accordion.cjs +468 -0
- package/dist/accordion.cjs.map +1 -0
- package/dist/accordion.d.cts +38 -0
- package/dist/accordion.d.ts +38 -0
- package/dist/accordion.js +465 -0
- package/dist/accordion.js.map +1 -0
- package/dist/alert.cjs +166 -65
- package/dist/alert.cjs.map +1 -1
- package/dist/alert.d.cts +41 -8
- package/dist/alert.d.ts +41 -8
- package/dist/alert.js +168 -67
- package/dist/alert.js.map +1 -1
- package/dist/avatar.cjs +27 -1
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.d.cts +19 -3
- package/dist/avatar.d.ts +19 -3
- package/dist/avatar.js +27 -1
- package/dist/avatar.js.map +1 -1
- package/dist/badge.cjs +83 -3
- package/dist/badge.cjs.map +1 -1
- package/dist/badge.d.cts +51 -3
- package/dist/badge.d.ts +51 -3
- package/dist/badge.js +83 -3
- package/dist/badge.js.map +1 -1
- package/dist/breadcrumb.cjs +464 -0
- package/dist/breadcrumb.cjs.map +1 -0
- package/dist/breadcrumb.d.cts +32 -0
- package/dist/breadcrumb.d.ts +32 -0
- package/dist/breadcrumb.js +461 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/button.cjs +32 -2
- package/dist/button.cjs.map +1 -1
- package/dist/button.d.cts +19 -3
- package/dist/button.d.ts +19 -3
- package/dist/button.js +32 -2
- package/dist/button.js.map +1 -1
- package/dist/card-bleed.cjs +458 -0
- package/dist/card-bleed.cjs.map +1 -0
- package/dist/card-bleed.d.cts +37 -0
- package/dist/card-bleed.d.ts +37 -0
- package/dist/card-bleed.js +455 -0
- package/dist/card-bleed.js.map +1 -0
- package/dist/card.cjs +61 -1
- package/dist/card.cjs.map +1 -1
- package/dist/card.d.cts +33 -4
- package/dist/card.d.ts +33 -4
- package/dist/card.js +60 -2
- package/dist/card.js.map +1 -1
- package/dist/carousel.cjs +655 -0
- package/dist/carousel.cjs.map +1 -0
- package/dist/carousel.d.cts +79 -0
- package/dist/carousel.d.ts +79 -0
- package/dist/carousel.js +652 -0
- package/dist/carousel.js.map +1 -0
- package/dist/checkbox.cjs +3 -1
- package/dist/checkbox.cjs.map +1 -1
- package/dist/checkbox.js +3 -1
- package/dist/checkbox.js.map +1 -1
- package/dist/choice-card.cjs +524 -0
- package/dist/choice-card.cjs.map +1 -0
- package/dist/choice-card.d.cts +81 -0
- package/dist/choice-card.d.ts +81 -0
- package/dist/choice-card.js +521 -0
- package/dist/choice-card.js.map +1 -0
- package/dist/container.cjs +23 -6
- package/dist/container.cjs.map +1 -1
- package/dist/container.d.cts +9 -3
- package/dist/container.d.ts +9 -3
- package/dist/container.js +23 -7
- package/dist/container.js.map +1 -1
- package/dist/datepicker.cjs +580 -0
- package/dist/datepicker.cjs.map +1 -0
- package/dist/datepicker.d.cts +78 -0
- package/dist/datepicker.d.ts +78 -0
- package/dist/datepicker.js +577 -0
- package/dist/datepicker.js.map +1 -0
- package/dist/dom-CX9bgbcQ.d.cts +3 -0
- package/dist/dom-CX9bgbcQ.d.ts +3 -0
- package/dist/dropdown.cjs +66 -3
- package/dist/dropdown.cjs.map +1 -1
- package/dist/dropdown.d.cts +22 -2
- package/dist/dropdown.d.ts +22 -2
- package/dist/dropdown.js +67 -4
- package/dist/dropdown.js.map +1 -1
- package/dist/external-auth-button.cjs +494 -0
- package/dist/external-auth-button.cjs.map +1 -0
- package/dist/external-auth-button.d.cts +71 -0
- package/dist/external-auth-button.d.ts +71 -0
- package/dist/external-auth-button.js +491 -0
- package/dist/external-auth-button.js.map +1 -0
- package/dist/fieldset.cjs +3 -1
- package/dist/fieldset.cjs.map +1 -1
- package/dist/fieldset.js +3 -1
- package/dist/fieldset.js.map +1 -1
- package/dist/file-input.cjs +371 -0
- package/dist/file-input.cjs.map +1 -0
- package/dist/file-input.d.cts +96 -0
- package/dist/file-input.d.ts +96 -0
- package/dist/file-input.js +367 -0
- package/dist/file-input.js.map +1 -0
- package/dist/footer-chip.cjs +22 -2
- package/dist/footer-chip.cjs.map +1 -1
- package/dist/footer-chip.d.cts +12 -1
- package/dist/footer-chip.d.ts +12 -1
- package/dist/footer-chip.js +22 -2
- package/dist/footer-chip.js.map +1 -1
- package/dist/footer-link.cjs +19 -1
- package/dist/footer-link.cjs.map +1 -1
- package/dist/footer-link.d.cts +12 -1
- package/dist/footer-link.d.ts +12 -1
- package/dist/footer-link.js +19 -1
- package/dist/footer-link.js.map +1 -1
- package/dist/footer.cjs +62 -1
- package/dist/footer.cjs.map +1 -1
- package/dist/footer.d.cts +15 -0
- package/dist/footer.d.ts +15 -0
- package/dist/footer.js +63 -2
- package/dist/footer.js.map +1 -1
- package/dist/{form-TvtLcoW0.d.cts → form-CVO7mlDa.d.cts} +42 -9
- package/dist/{form-TvtLcoW0.d.ts → form-CVO7mlDa.d.ts} +42 -9
- package/dist/grid.cjs +35 -1
- package/dist/grid.cjs.map +1 -1
- package/dist/grid.d.cts +9 -3
- package/dist/grid.d.ts +9 -3
- package/dist/grid.js +35 -2
- package/dist/grid.js.map +1 -1
- package/dist/icon-box.cjs +27 -1
- package/dist/icon-box.cjs.map +1 -1
- package/dist/icon-box.d.cts +19 -3
- package/dist/icon-box.d.ts +19 -3
- package/dist/icon-box.js +27 -1
- package/dist/icon-box.js.map +1 -1
- package/dist/index.cjs +3849 -109
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +3787 -112
- package/dist/index.js.map +1 -1
- package/dist/input-group.cjs +471 -0
- package/dist/input-group.cjs.map +1 -0
- package/dist/input-group.d.cts +31 -0
- package/dist/input-group.d.ts +31 -0
- package/dist/input-group.js +468 -0
- package/dist/input-group.js.map +1 -0
- package/dist/input.cjs +96 -4
- package/dist/input.cjs.map +1 -1
- package/dist/input.d.cts +45 -6
- package/dist/input.d.ts +45 -6
- package/dist/input.js +98 -6
- package/dist/input.js.map +1 -1
- package/dist/label.cjs +3 -1
- package/dist/label.cjs.map +1 -1
- package/dist/label.js +3 -1
- package/dist/label.js.map +1 -1
- package/dist/list-group-item.cjs +367 -0
- package/dist/list-group-item.cjs.map +1 -0
- package/dist/list-group-item.d.cts +73 -0
- package/dist/list-group-item.d.ts +73 -0
- package/dist/list-group-item.js +364 -0
- package/dist/list-group-item.js.map +1 -0
- package/dist/list-group.cjs +610 -0
- package/dist/list-group.cjs.map +1 -0
- package/dist/list-group.d.cts +58 -0
- package/dist/list-group.d.ts +58 -0
- package/dist/list-group.js +607 -0
- package/dist/list-group.js.map +1 -0
- package/dist/modal.cjs +70 -35
- package/dist/modal.cjs.map +1 -1
- package/dist/modal.d.cts +14 -2
- package/dist/modal.d.ts +14 -2
- package/dist/modal.js +70 -35
- package/dist/modal.js.map +1 -1
- package/dist/nav-item.cjs +107 -4
- package/dist/nav-item.cjs.map +1 -1
- package/dist/nav-item.d.cts +52 -2
- package/dist/nav-item.d.ts +52 -2
- package/dist/nav-item.js +108 -5
- package/dist/nav-item.js.map +1 -1
- package/dist/nav.cjs +57 -1
- package/dist/nav.cjs.map +1 -1
- package/dist/nav.d.cts +15 -1
- package/dist/nav.d.ts +15 -1
- package/dist/nav.js +58 -2
- package/dist/nav.js.map +1 -1
- package/dist/offcanvas.cjs +621 -0
- package/dist/offcanvas.cjs.map +1 -0
- package/dist/offcanvas.d.cts +61 -0
- package/dist/offcanvas.d.ts +61 -0
- package/dist/offcanvas.js +617 -0
- package/dist/offcanvas.js.map +1 -0
- package/dist/pagination.cjs +452 -0
- package/dist/pagination.cjs.map +1 -0
- package/dist/pagination.d.cts +69 -0
- package/dist/pagination.d.ts +69 -0
- package/dist/pagination.js +448 -0
- package/dist/pagination.js.map +1 -0
- package/dist/popover.cjs +534 -0
- package/dist/popover.cjs.map +1 -0
- package/dist/popover.d.cts +59 -0
- package/dist/popover.d.ts +59 -0
- package/dist/popover.js +530 -0
- package/dist/popover.js.map +1 -0
- package/dist/pricing-card.cjs +153 -64
- package/dist/pricing-card.cjs.map +1 -1
- package/dist/pricing-card.d.cts +34 -6
- package/dist/pricing-card.d.ts +34 -6
- package/dist/pricing-card.js +154 -65
- package/dist/pricing-card.js.map +1 -1
- package/dist/progress.cjs +403 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.d.cts +70 -0
- package/dist/progress.d.ts +70 -0
- package/dist/progress.js +398 -0
- package/dist/progress.js.map +1 -0
- package/dist/prose.cjs +425 -0
- package/dist/prose.cjs.map +1 -0
- package/dist/prose.d.cts +21 -0
- package/dist/prose.d.ts +21 -0
- package/dist/prose.js +422 -0
- package/dist/prose.js.map +1 -0
- package/dist/radio.cjs +3 -1
- package/dist/radio.cjs.map +1 -1
- package/dist/radio.js +3 -1
- package/dist/radio.js.map +1 -1
- package/dist/range.cjs +381 -0
- package/dist/range.cjs.map +1 -0
- package/dist/range.d.cts +76 -0
- package/dist/range.d.ts +76 -0
- package/dist/range.js +378 -0
- package/dist/range.js.map +1 -0
- package/dist/rating.cjs +33 -0
- package/dist/rating.cjs.map +1 -1
- package/dist/rating.d.cts +38 -3
- package/dist/rating.d.ts +38 -3
- package/dist/rating.js +33 -0
- package/dist/rating.js.map +1 -1
- package/dist/section.cjs +27 -3
- package/dist/section.cjs.map +1 -1
- package/dist/section.d.cts +16 -1
- package/dist/section.d.ts +16 -1
- package/dist/section.js +27 -4
- package/dist/section.js.map +1 -1
- package/dist/select.cjs +6 -1
- package/dist/select.cjs.map +1 -1
- package/dist/select.d.cts +7 -1
- package/dist/select.d.ts +7 -1
- package/dist/select.js +6 -1
- package/dist/select.js.map +1 -1
- package/dist/sidebar-link.cjs +19 -1
- package/dist/sidebar-link.cjs.map +1 -1
- package/dist/sidebar-link.d.cts +13 -2
- package/dist/sidebar-link.d.ts +13 -2
- package/dist/sidebar-link.js +19 -1
- package/dist/sidebar-link.js.map +1 -1
- package/dist/sidebar-toggle.cjs +3 -1
- package/dist/sidebar-toggle.cjs.map +1 -1
- package/dist/sidebar-toggle.js +3 -1
- package/dist/sidebar-toggle.js.map +1 -1
- package/dist/sidebar.cjs +33 -1
- package/dist/sidebar.cjs.map +1 -1
- package/dist/sidebar.d.cts +1 -0
- package/dist/sidebar.d.ts +1 -0
- package/dist/sidebar.js +34 -2
- package/dist/sidebar.js.map +1 -1
- package/dist/spinner.cjs +2 -1
- package/dist/spinner.cjs.map +1 -1
- package/dist/spinner.d.cts +2 -2
- package/dist/spinner.d.ts +2 -2
- package/dist/spinner.js +2 -1
- package/dist/spinner.js.map +1 -1
- package/dist/stack.cjs +4 -2
- package/dist/stack.cjs.map +1 -1
- package/dist/stack.d.cts +2 -2
- package/dist/stack.d.ts +2 -2
- package/dist/stack.js +4 -2
- package/dist/stack.js.map +1 -1
- package/dist/states-Bgzwu_XZ.d.cts +9 -0
- package/dist/states-Bgzwu_XZ.d.ts +9 -0
- package/dist/stepper.cjs +495 -0
- package/dist/stepper.cjs.map +1 -0
- package/dist/stepper.d.cts +40 -0
- package/dist/stepper.d.ts +40 -0
- package/dist/stepper.js +491 -0
- package/dist/stepper.js.map +1 -0
- package/dist/switch.cjs +492 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.d.cts +82 -0
- package/dist/switch.d.ts +82 -0
- package/dist/switch.js +488 -0
- package/dist/switch.js.map +1 -0
- package/dist/tab-panel.cjs +465 -0
- package/dist/tab-panel.cjs.map +1 -0
- package/dist/tab-panel.d.cts +48 -0
- package/dist/tab-panel.d.ts +48 -0
- package/dist/tab-panel.js +462 -0
- package/dist/tab-panel.js.map +1 -0
- package/dist/table.cjs +506 -0
- package/dist/table.cjs.map +1 -0
- package/dist/table.d.cts +54 -0
- package/dist/table.d.ts +54 -0
- package/dist/table.js +501 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.cjs +596 -0
- package/dist/tabs.cjs.map +1 -0
- package/dist/tabs.d.cts +65 -0
- package/dist/tabs.d.ts +65 -0
- package/dist/tabs.js +592 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tag.cjs +27 -1
- package/dist/tag.cjs.map +1 -1
- package/dist/tag.d.cts +19 -3
- package/dist/tag.d.ts +19 -3
- package/dist/tag.js +27 -1
- package/dist/tag.js.map +1 -1
- package/dist/testimonial.cjs +162 -64
- package/dist/testimonial.cjs.map +1 -1
- package/dist/testimonial.d.cts +36 -8
- package/dist/testimonial.d.ts +36 -8
- package/dist/testimonial.js +163 -65
- package/dist/testimonial.js.map +1 -1
- package/dist/text.cjs +65 -6
- package/dist/text.cjs.map +1 -1
- package/dist/text.d.cts +24 -3
- package/dist/text.d.ts +24 -3
- package/dist/text.js +64 -8
- package/dist/text.js.map +1 -1
- package/dist/textarea.cjs +3 -0
- package/dist/textarea.cjs.map +1 -1
- package/dist/textarea.d.cts +7 -1
- package/dist/textarea.d.ts +7 -1
- package/dist/textarea.js +3 -0
- package/dist/textarea.js.map +1 -1
- package/dist/toast.cjs +34 -1
- package/dist/toast.cjs.map +1 -1
- package/dist/toast.d.cts +15 -2
- package/dist/toast.d.ts +15 -2
- package/dist/toast.js +34 -1
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.cjs +32 -0
- package/dist/tooltip.cjs.map +1 -1
- package/dist/tooltip.d.cts +15 -2
- package/dist/tooltip.d.ts +15 -2
- package/dist/tooltip.js +32 -0
- package/dist/tooltip.js.map +1 -1
- package/package.json +130 -15
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as lit_html from 'lit-html';
|
|
2
|
+
import { S as SpectreBaseElement } from './base-D0s95V2v.js';
|
|
3
|
+
import { s as spectreKindKey } from './dom-CX9bgbcQ.js';
|
|
4
|
+
import { S as SpectreHoverFocusStateProps } from './states-Bgzwu_XZ.js';
|
|
5
|
+
import 'lit';
|
|
6
|
+
|
|
7
|
+
interface SpectreChoiceCardProps extends SpectreHoverFocusStateProps {
|
|
8
|
+
ariaDescribedBy?: string | null;
|
|
9
|
+
checked?: boolean | undefined;
|
|
10
|
+
disabled?: boolean | undefined;
|
|
11
|
+
form?: string | undefined;
|
|
12
|
+
id?: string | null | undefined;
|
|
13
|
+
name?: string | undefined;
|
|
14
|
+
required?: boolean | undefined;
|
|
15
|
+
title?: string | null | undefined;
|
|
16
|
+
type?: 'radio' | 'checkbox' | undefined;
|
|
17
|
+
value?: string | undefined;
|
|
18
|
+
}
|
|
19
|
+
declare class SpectreChoiceCardElement extends SpectreBaseElement implements SpectreChoiceCardProps {
|
|
20
|
+
static properties: {
|
|
21
|
+
checked: {
|
|
22
|
+
type: BooleanConstructor;
|
|
23
|
+
reflect: boolean;
|
|
24
|
+
};
|
|
25
|
+
disabled: {
|
|
26
|
+
type: BooleanConstructor;
|
|
27
|
+
reflect: boolean;
|
|
28
|
+
};
|
|
29
|
+
form: {
|
|
30
|
+
type: StringConstructor;
|
|
31
|
+
};
|
|
32
|
+
name: {
|
|
33
|
+
type: StringConstructor;
|
|
34
|
+
reflect: boolean;
|
|
35
|
+
};
|
|
36
|
+
required: {
|
|
37
|
+
type: BooleanConstructor;
|
|
38
|
+
reflect: boolean;
|
|
39
|
+
};
|
|
40
|
+
type: {
|
|
41
|
+
type: StringConstructor;
|
|
42
|
+
reflect: boolean;
|
|
43
|
+
};
|
|
44
|
+
value: {
|
|
45
|
+
type: StringConstructor;
|
|
46
|
+
};
|
|
47
|
+
focused: {
|
|
48
|
+
readonly type: BooleanConstructor;
|
|
49
|
+
readonly reflect: true;
|
|
50
|
+
};
|
|
51
|
+
hovered: {
|
|
52
|
+
readonly type: BooleanConstructor;
|
|
53
|
+
readonly reflect: true;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
readonly [spectreKindKey] = "choice-card";
|
|
57
|
+
focused: boolean | undefined;
|
|
58
|
+
hovered: boolean | undefined;
|
|
59
|
+
checked: boolean | undefined;
|
|
60
|
+
disabled: boolean | undefined;
|
|
61
|
+
form: string | undefined;
|
|
62
|
+
name: string | undefined;
|
|
63
|
+
required: boolean | undefined;
|
|
64
|
+
type: 'radio' | 'checkbox' | undefined;
|
|
65
|
+
value: string | undefined;
|
|
66
|
+
private readonly projection;
|
|
67
|
+
get id(): string;
|
|
68
|
+
set id(value: string | null | undefined);
|
|
69
|
+
get title(): string;
|
|
70
|
+
set title(value: string | null | undefined);
|
|
71
|
+
connectedCallback(): void;
|
|
72
|
+
protected willUpdate(changedProperties: Map<PropertyKey, unknown>): void;
|
|
73
|
+
private get nativeInput();
|
|
74
|
+
focus(options?: FocusOptions): void;
|
|
75
|
+
blur(): void;
|
|
76
|
+
private handleChange;
|
|
77
|
+
render(): lit_html.TemplateResult<1>;
|
|
78
|
+
}
|
|
79
|
+
declare function defineSpectreChoiceCard(tagName?: string): typeof SpectreChoiceCardElement;
|
|
80
|
+
|
|
81
|
+
export { SpectreChoiceCardElement, type SpectreChoiceCardProps, defineSpectreChoiceCard };
|
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { LitElement, html } from 'lit';
|
|
2
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
3
|
+
import { live } from 'lit/directives/live.js';
|
|
4
|
+
import { getChoiceCardClasses } from '@phcdevworks/spectre-ui';
|
|
5
|
+
|
|
6
|
+
// src/components/choice-card/sp-choice-card.ts
|
|
7
|
+
var SpectreBaseElement = class extends LitElement {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this._ariaLabel = null;
|
|
11
|
+
this._ariaLabelledBy = null;
|
|
12
|
+
this._ariaDescribedBy = null;
|
|
13
|
+
this._autocapitalize = "";
|
|
14
|
+
this._autofocus = false;
|
|
15
|
+
this._spellcheck = null;
|
|
16
|
+
this._title = "";
|
|
17
|
+
this._id = "";
|
|
18
|
+
}
|
|
19
|
+
get ariaLabel() {
|
|
20
|
+
return this._ariaLabel;
|
|
21
|
+
}
|
|
22
|
+
set ariaLabel(value) {
|
|
23
|
+
if (this._ariaLabel === value) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this._ariaLabel = value;
|
|
27
|
+
this._removeHostAttribute("aria-label");
|
|
28
|
+
this.requestUpdate();
|
|
29
|
+
}
|
|
30
|
+
get ariaLabelledBy() {
|
|
31
|
+
return this._ariaLabelledBy;
|
|
32
|
+
}
|
|
33
|
+
set ariaLabelledBy(value) {
|
|
34
|
+
if (this._ariaLabelledBy === value) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
this._ariaLabelledBy = value;
|
|
38
|
+
this._removeHostAttribute("aria-labelledby");
|
|
39
|
+
this.requestUpdate();
|
|
40
|
+
}
|
|
41
|
+
get ariaDescribedBy() {
|
|
42
|
+
return this._ariaDescribedBy;
|
|
43
|
+
}
|
|
44
|
+
set ariaDescribedBy(value) {
|
|
45
|
+
if (this._ariaDescribedBy === value) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this._ariaDescribedBy = value;
|
|
49
|
+
this._removeHostAttribute("aria-describedby");
|
|
50
|
+
this.requestUpdate();
|
|
51
|
+
}
|
|
52
|
+
get autocapitalize() {
|
|
53
|
+
return this._autocapitalize;
|
|
54
|
+
}
|
|
55
|
+
set autocapitalize(value) {
|
|
56
|
+
const normalizedValue = value ?? "";
|
|
57
|
+
if (this._autocapitalize === normalizedValue) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this._autocapitalize = normalizedValue;
|
|
61
|
+
this._removeHostAttribute("autocapitalize");
|
|
62
|
+
this.requestUpdate();
|
|
63
|
+
}
|
|
64
|
+
get spellcheck() {
|
|
65
|
+
return this._spellcheck ?? super.spellcheck;
|
|
66
|
+
}
|
|
67
|
+
set spellcheck(value) {
|
|
68
|
+
if (this._spellcheck === value) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this._spellcheck = value ?? null;
|
|
72
|
+
this._removeHostAttribute("spellcheck");
|
|
73
|
+
this.requestUpdate();
|
|
74
|
+
}
|
|
75
|
+
get title() {
|
|
76
|
+
return this._title;
|
|
77
|
+
}
|
|
78
|
+
set title(value) {
|
|
79
|
+
const normalizedValue = value ?? "";
|
|
80
|
+
if (this._title === normalizedValue) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this._title = normalizedValue;
|
|
84
|
+
this._removeHostAttribute("title");
|
|
85
|
+
this.requestUpdate();
|
|
86
|
+
}
|
|
87
|
+
get id() {
|
|
88
|
+
return this._id;
|
|
89
|
+
}
|
|
90
|
+
set id(value) {
|
|
91
|
+
const normalizedValue = value ?? "";
|
|
92
|
+
if (this._id === normalizedValue) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this._id = normalizedValue;
|
|
96
|
+
this._removeHostAttribute("id");
|
|
97
|
+
this.requestUpdate();
|
|
98
|
+
}
|
|
99
|
+
get autofocus() {
|
|
100
|
+
return this._autofocus;
|
|
101
|
+
}
|
|
102
|
+
set autofocus(value) {
|
|
103
|
+
const normalizedValue = !!value;
|
|
104
|
+
if (this._autofocus === normalizedValue) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
this._autofocus = normalizedValue;
|
|
108
|
+
this._removeHostAttribute("autofocus");
|
|
109
|
+
this.requestUpdate();
|
|
110
|
+
}
|
|
111
|
+
// Spectre components intentionally render in light DOM so the global
|
|
112
|
+
// `@phcdevworks/spectre-ui` styling contract can apply directly.
|
|
113
|
+
createRenderRoot() {
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
connectedCallback() {
|
|
117
|
+
super.connectedCallback();
|
|
118
|
+
const proxiedAttributes = [
|
|
119
|
+
"id",
|
|
120
|
+
"title",
|
|
121
|
+
"autocapitalize",
|
|
122
|
+
"autofocus",
|
|
123
|
+
"spellcheck",
|
|
124
|
+
"aria-label",
|
|
125
|
+
"aria-labelledby",
|
|
126
|
+
"aria-describedby"
|
|
127
|
+
];
|
|
128
|
+
proxiedAttributes.forEach((attr) => {
|
|
129
|
+
const value = super.getAttribute(attr);
|
|
130
|
+
if (value !== null) {
|
|
131
|
+
this.setAttribute(attr, value);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
getAttribute(qualifiedName) {
|
|
136
|
+
switch (qualifiedName) {
|
|
137
|
+
case "id":
|
|
138
|
+
return this.id || null;
|
|
139
|
+
case "title":
|
|
140
|
+
return this.title || null;
|
|
141
|
+
case "autocapitalize":
|
|
142
|
+
return this.autocapitalize || null;
|
|
143
|
+
case "autofocus":
|
|
144
|
+
return this.autofocus ? "" : null;
|
|
145
|
+
case "spellcheck":
|
|
146
|
+
return this._spellcheck !== null ? String(this._spellcheck) : null;
|
|
147
|
+
case "aria-label":
|
|
148
|
+
return this.ariaLabel;
|
|
149
|
+
case "aria-labelledby":
|
|
150
|
+
return this.ariaLabelledBy;
|
|
151
|
+
case "aria-describedby":
|
|
152
|
+
return this.ariaDescribedBy;
|
|
153
|
+
default:
|
|
154
|
+
return super.getAttribute(qualifiedName);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
hasAttribute(qualifiedName) {
|
|
158
|
+
switch (qualifiedName) {
|
|
159
|
+
case "id":
|
|
160
|
+
return this.id !== "";
|
|
161
|
+
case "title":
|
|
162
|
+
return this.title !== "";
|
|
163
|
+
case "autocapitalize":
|
|
164
|
+
return this.autocapitalize !== "";
|
|
165
|
+
case "autofocus":
|
|
166
|
+
return this.autofocus;
|
|
167
|
+
case "spellcheck":
|
|
168
|
+
return this._spellcheck !== null;
|
|
169
|
+
case "aria-label":
|
|
170
|
+
return this.ariaLabel !== null;
|
|
171
|
+
case "aria-labelledby":
|
|
172
|
+
return this.ariaLabelledBy !== null;
|
|
173
|
+
case "aria-describedby":
|
|
174
|
+
return this.ariaDescribedBy !== null;
|
|
175
|
+
default:
|
|
176
|
+
return super.hasAttribute(qualifiedName);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
setAttribute(qualifiedName, value) {
|
|
180
|
+
switch (qualifiedName) {
|
|
181
|
+
case "id":
|
|
182
|
+
this.id = value;
|
|
183
|
+
break;
|
|
184
|
+
case "title":
|
|
185
|
+
this.title = value;
|
|
186
|
+
break;
|
|
187
|
+
case "autocapitalize":
|
|
188
|
+
this.autocapitalize = value;
|
|
189
|
+
break;
|
|
190
|
+
case "autofocus":
|
|
191
|
+
this.autofocus = true;
|
|
192
|
+
break;
|
|
193
|
+
case "spellcheck":
|
|
194
|
+
this.spellcheck = value !== "false";
|
|
195
|
+
break;
|
|
196
|
+
case "aria-label":
|
|
197
|
+
this.ariaLabel = value;
|
|
198
|
+
break;
|
|
199
|
+
case "aria-labelledby":
|
|
200
|
+
this.ariaLabelledBy = value;
|
|
201
|
+
break;
|
|
202
|
+
case "aria-describedby":
|
|
203
|
+
this.ariaDescribedBy = value;
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
super.setAttribute(qualifiedName, value);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
removeAttribute(qualifiedName) {
|
|
210
|
+
switch (qualifiedName) {
|
|
211
|
+
case "id":
|
|
212
|
+
this.id = "";
|
|
213
|
+
break;
|
|
214
|
+
case "title":
|
|
215
|
+
this.title = "";
|
|
216
|
+
break;
|
|
217
|
+
case "autocapitalize":
|
|
218
|
+
this.autocapitalize = "";
|
|
219
|
+
break;
|
|
220
|
+
case "autofocus":
|
|
221
|
+
this.autofocus = false;
|
|
222
|
+
break;
|
|
223
|
+
case "spellcheck":
|
|
224
|
+
this.spellcheck = null;
|
|
225
|
+
break;
|
|
226
|
+
case "aria-label":
|
|
227
|
+
this.ariaLabel = null;
|
|
228
|
+
break;
|
|
229
|
+
case "aria-labelledby":
|
|
230
|
+
this.ariaLabelledBy = null;
|
|
231
|
+
break;
|
|
232
|
+
case "aria-describedby":
|
|
233
|
+
this.ariaDescribedBy = null;
|
|
234
|
+
break;
|
|
235
|
+
default:
|
|
236
|
+
super.removeAttribute(qualifiedName);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
_removeHostAttribute(name) {
|
|
240
|
+
const host = this;
|
|
241
|
+
if (HTMLElement.prototype.hasAttribute.call(host, name)) {
|
|
242
|
+
HTMLElement.prototype.removeAttribute.call(host, name);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
get forwardedAriaLabel() {
|
|
246
|
+
const value = this.ariaLabel?.trim();
|
|
247
|
+
return value ? value : void 0;
|
|
248
|
+
}
|
|
249
|
+
get forwardedAriaLabelledBy() {
|
|
250
|
+
const value = this.ariaLabelledBy?.trim();
|
|
251
|
+
return value ? value : void 0;
|
|
252
|
+
}
|
|
253
|
+
get forwardedAriaDescribedBy() {
|
|
254
|
+
const value = this.ariaDescribedBy?.trim();
|
|
255
|
+
return value ? value : void 0;
|
|
256
|
+
}
|
|
257
|
+
// Subclasses that expose `disabled`/`loading` properties get this disabled
|
|
258
|
+
// calculation for free instead of redeclaring it per component.
|
|
259
|
+
get isDisabled() {
|
|
260
|
+
const self = this;
|
|
261
|
+
return (self.disabled ?? false) || (self.loading ?? false);
|
|
262
|
+
}
|
|
263
|
+
// Subclasses get this for free instead of redeclaring it per component.
|
|
264
|
+
get hasForwardedLabel() {
|
|
265
|
+
return Boolean(this.forwardedAriaLabel || this.forwardedAriaLabelledBy);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
SpectreBaseElement.properties = {};
|
|
269
|
+
|
|
270
|
+
// src/utils/dom.ts
|
|
271
|
+
function hasMeaningfulContent(nodes) {
|
|
272
|
+
return nodes.some((node) => {
|
|
273
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
277
|
+
return (node.textContent?.trim().length ?? 0) > 0;
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
var spectreKindKey = /* @__PURE__ */ Symbol.for(
|
|
283
|
+
"phcdevworks.spectre-components.kind"
|
|
284
|
+
);
|
|
285
|
+
function isSpectreKind(node, kind) {
|
|
286
|
+
return node[spectreKindKey] === kind;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// src/utils/projection.ts
|
|
290
|
+
function slotOf(node) {
|
|
291
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
292
|
+
return void 0;
|
|
293
|
+
}
|
|
294
|
+
return node.getAttribute("slot") ?? void 0;
|
|
295
|
+
}
|
|
296
|
+
var ProjectionController = class {
|
|
297
|
+
constructor(host, internalAttributes) {
|
|
298
|
+
this.host = host;
|
|
299
|
+
this.internalAttributes = internalAttributes;
|
|
300
|
+
this.projected = [];
|
|
301
|
+
host.addController(this);
|
|
302
|
+
}
|
|
303
|
+
hostConnected() {
|
|
304
|
+
this.sync();
|
|
305
|
+
this.observe();
|
|
306
|
+
}
|
|
307
|
+
hostDisconnected() {
|
|
308
|
+
this.disconnect();
|
|
309
|
+
}
|
|
310
|
+
hostUpdate() {
|
|
311
|
+
this.sync();
|
|
312
|
+
this.disconnect();
|
|
313
|
+
}
|
|
314
|
+
hostUpdated() {
|
|
315
|
+
this.observe();
|
|
316
|
+
}
|
|
317
|
+
// Every projected node in authored order, regardless of slot.
|
|
318
|
+
all() {
|
|
319
|
+
return [...this.projected];
|
|
320
|
+
}
|
|
321
|
+
// Omitting `slot` returns the nodes without a slot attribute.
|
|
322
|
+
nodes(slot) {
|
|
323
|
+
return this.projected.filter((node) => slotOf(node) === slot);
|
|
324
|
+
}
|
|
325
|
+
elements(slot) {
|
|
326
|
+
return this.nodes(slot).filter(
|
|
327
|
+
(node) => node.nodeType === Node.ELEMENT_NODE
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
has(slot) {
|
|
331
|
+
return hasMeaningfulContent(this.nodes(slot));
|
|
332
|
+
}
|
|
333
|
+
isInternalNode(node) {
|
|
334
|
+
return node.nodeType === Node.ELEMENT_NODE && this.internalAttributes.some(
|
|
335
|
+
(name) => node.hasAttribute(name)
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
isProjectable(node) {
|
|
339
|
+
if (node.nodeType === Node.COMMENT_NODE || this.isInternalNode(node)) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
if (node.nodeType === Node.TEXT_NODE && this.hostHasRendered) {
|
|
343
|
+
return Boolean(node.textContent?.trim());
|
|
344
|
+
}
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
get hostHasRendered() {
|
|
348
|
+
return this.host.hasUpdated;
|
|
349
|
+
}
|
|
350
|
+
sync() {
|
|
351
|
+
const next = [
|
|
352
|
+
.../* @__PURE__ */ new Set([
|
|
353
|
+
...this.projected.filter((node) => this.host.contains(node)),
|
|
354
|
+
...Array.from(this.host.childNodes).filter(
|
|
355
|
+
(node) => this.isProjectable(node)
|
|
356
|
+
)
|
|
357
|
+
])
|
|
358
|
+
];
|
|
359
|
+
const changed = next.length !== this.projected.length || next.some((node, index) => node !== this.projected[index]);
|
|
360
|
+
if (changed) {
|
|
361
|
+
this.projected = next;
|
|
362
|
+
}
|
|
363
|
+
return changed;
|
|
364
|
+
}
|
|
365
|
+
observe() {
|
|
366
|
+
if (this.observer || !this.host.isConnected) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
this.observer = new MutationObserver(() => {
|
|
370
|
+
if (this.sync()) {
|
|
371
|
+
this.host.requestUpdate();
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
this.observer.observe(this.host, { childList: true });
|
|
375
|
+
}
|
|
376
|
+
disconnect() {
|
|
377
|
+
this.observer?.disconnect();
|
|
378
|
+
this.observer = void 0;
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
// src/utils/states.ts
|
|
383
|
+
var hoverFocusStateProperties = {
|
|
384
|
+
focused: { type: Boolean, reflect: true },
|
|
385
|
+
hovered: { type: Boolean, reflect: true }
|
|
386
|
+
};
|
|
387
|
+
function hoverFocusStates(element) {
|
|
388
|
+
return {
|
|
389
|
+
focused: element.focused ?? false,
|
|
390
|
+
hovered: element.hovered ?? false
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
function owningCard(input) {
|
|
394
|
+
let node = input.parentElement;
|
|
395
|
+
while (node && !isSpectreKind(node, "choice-card")) {
|
|
396
|
+
node = node.parentElement;
|
|
397
|
+
}
|
|
398
|
+
return node;
|
|
399
|
+
}
|
|
400
|
+
var _a, _b;
|
|
401
|
+
var SpectreChoiceCardElement = class extends (_b = SpectreBaseElement, _a = spectreKindKey, _b) {
|
|
402
|
+
constructor() {
|
|
403
|
+
super(...arguments);
|
|
404
|
+
this[_a] = "choice-card";
|
|
405
|
+
this.focused = false;
|
|
406
|
+
this.hovered = false;
|
|
407
|
+
this.checked = false;
|
|
408
|
+
this.disabled = false;
|
|
409
|
+
this.form = void 0;
|
|
410
|
+
this.name = void 0;
|
|
411
|
+
this.required = false;
|
|
412
|
+
this.type = "radio";
|
|
413
|
+
this.value = void 0;
|
|
414
|
+
this.projection = new ProjectionController(this, [
|
|
415
|
+
"data-sp-choice-card-native"
|
|
416
|
+
]);
|
|
417
|
+
}
|
|
418
|
+
get id() {
|
|
419
|
+
return super.id;
|
|
420
|
+
}
|
|
421
|
+
set id(value) {
|
|
422
|
+
super.id = value;
|
|
423
|
+
}
|
|
424
|
+
get title() {
|
|
425
|
+
return super.title;
|
|
426
|
+
}
|
|
427
|
+
set title(value) {
|
|
428
|
+
super.title = value;
|
|
429
|
+
}
|
|
430
|
+
connectedCallback() {
|
|
431
|
+
var _a2;
|
|
432
|
+
super.connectedCallback();
|
|
433
|
+
(_a2 = this.style).display || (_a2.display = "block");
|
|
434
|
+
}
|
|
435
|
+
willUpdate(changedProperties) {
|
|
436
|
+
if (changedProperties.has("checked") && this.checked == null) {
|
|
437
|
+
this.checked = false;
|
|
438
|
+
}
|
|
439
|
+
if (changedProperties.has("disabled") && this.disabled == null) {
|
|
440
|
+
this.disabled = false;
|
|
441
|
+
}
|
|
442
|
+
if (changedProperties.has("type") && this.type !== "radio" && this.type !== "checkbox") {
|
|
443
|
+
this.type = "radio";
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
get nativeInput() {
|
|
447
|
+
return this.querySelector("[data-sp-choice-card-input]");
|
|
448
|
+
}
|
|
449
|
+
focus(options) {
|
|
450
|
+
this.nativeInput?.focus(options);
|
|
451
|
+
}
|
|
452
|
+
blur() {
|
|
453
|
+
this.nativeInput?.blur();
|
|
454
|
+
}
|
|
455
|
+
// Checking a radio unchecks its group natively; mirror that onto the other
|
|
456
|
+
// cards' `checked` properties.
|
|
457
|
+
handleChange(event) {
|
|
458
|
+
const input = event.currentTarget;
|
|
459
|
+
this.checked = input.checked;
|
|
460
|
+
if (this.type !== "radio" || !this.name) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
const root = this.getRootNode();
|
|
464
|
+
root.querySelectorAll("input[data-sp-choice-card-input]").forEach((other) => {
|
|
465
|
+
if (other === input || other.name !== this.name) {
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
const card = owningCard(other);
|
|
469
|
+
if (card) {
|
|
470
|
+
card.checked = other.checked;
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
render() {
|
|
475
|
+
return html`<label
|
|
476
|
+
class="${getChoiceCardClasses({
|
|
477
|
+
...hoverFocusStates(this),
|
|
478
|
+
disabled: this.disabled ?? false
|
|
479
|
+
})}"
|
|
480
|
+
data-sp-choice-card-native
|
|
481
|
+
title="${ifDefined(this.title || void 0)}"
|
|
482
|
+
>
|
|
483
|
+
<input
|
|
484
|
+
aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
|
|
485
|
+
.checked="${live(this.checked ?? false)}"
|
|
486
|
+
data-sp-choice-card-input
|
|
487
|
+
?disabled="${this.disabled ?? false}"
|
|
488
|
+
form="${ifDefined(this.form || void 0)}"
|
|
489
|
+
id="${ifDefined(this.id || void 0)}"
|
|
490
|
+
name="${ifDefined(this.name || void 0)}"
|
|
491
|
+
?required="${this.required ?? false}"
|
|
492
|
+
type="${this.type ?? "radio"}"
|
|
493
|
+
value="${ifDefined(this.value)}"
|
|
494
|
+
@change="${this.handleChange}"
|
|
495
|
+
/>
|
|
496
|
+
<span data-sp-choice-card-content>${this.projection.nodes()}</span>
|
|
497
|
+
</label>`;
|
|
498
|
+
}
|
|
499
|
+
};
|
|
500
|
+
SpectreChoiceCardElement.properties = {
|
|
501
|
+
...hoverFocusStateProperties,
|
|
502
|
+
checked: { type: Boolean, reflect: true },
|
|
503
|
+
disabled: { type: Boolean, reflect: true },
|
|
504
|
+
form: { type: String },
|
|
505
|
+
name: { type: String, reflect: true },
|
|
506
|
+
required: { type: Boolean, reflect: true },
|
|
507
|
+
type: { type: String, reflect: true },
|
|
508
|
+
value: { type: String }
|
|
509
|
+
};
|
|
510
|
+
function defineSpectreChoiceCard(tagName = "sp-choice-card") {
|
|
511
|
+
const existingElement = customElements.get(tagName);
|
|
512
|
+
if (existingElement) {
|
|
513
|
+
return existingElement;
|
|
514
|
+
}
|
|
515
|
+
customElements.define(tagName, SpectreChoiceCardElement);
|
|
516
|
+
return SpectreChoiceCardElement;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
export { SpectreChoiceCardElement, defineSpectreChoiceCard };
|
|
520
|
+
//# sourceMappingURL=choice-card.js.map
|
|
521
|
+
//# sourceMappingURL=choice-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/base.ts","../src/utils/dom.ts","../src/utils/projection.ts","../src/utils/states.ts","../src/components/choice-card/sp-choice-card.ts"],"names":["_a"],"mappings":";;;;;;AAEO,IAAM,kBAAA,GAAN,cAAiC,UAAA,CAAW;AAAA,EAA5C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAGL,IAAA,IAAA,CAAQ,UAAA,GAA4B,IAAA;AACpC,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,gBAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,eAAA,GAAkB,EAAA;AAC1B,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,WAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,MAAA,GAAS,EAAA;AACjB,IAAA,IAAA,CAAQ,GAAA,GAAM,EAAA;AAAA,EAAA;AAAA,EAEd,IAAI,SAAA,GAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,KAAA,EAAsB;AAClC,IAAA,IAAI,IAAA,CAAK,eAAe,KAAA,EAAO;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,qBAAqB,YAAY,CAAA;AACtC,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAI,cAAA,GAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,IAAI,eAAe,KAAA,EAAsB;AACvC,IAAA,IAAI,IAAA,CAAK,oBAAoB,KAAA,EAAO;AAClC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,qBAAqB,iBAAiB,CAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAI,eAAA,GAAiC;AACnC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,IAAI,gBAAgB,KAAA,EAAsB;AACxC,IAAA,IAAI,IAAA,CAAK,qBAAqB,KAAA,EAAO;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,IAAA,IAAA,CAAK,qBAAqB,kBAAkB,CAAA;AAC5C,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAa,cAAA,GAAyB;AACpC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,IAAa,eAAe,KAAA,EAAkC;AAC5D,IAAA,MAAM,kBAAkB,KAAA,IAAS,EAAA;AACjC,IAAA,IAAI,IAAA,CAAK,oBAAoB,eAAA,EAAiB;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,qBAAqB,gBAAgB,CAAA;AAC1C,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAa,UAAA,GAAsB;AACjC,IAAA,OAAO,IAAA,CAAK,eAAe,KAAA,CAAM,UAAA;AAAA,EACnC;AAAA,EAEA,IAAa,WAAW,KAAA,EAAmC;AACzD,IAAA,IAAI,IAAA,CAAK,gBAAgB,KAAA,EAAO;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAc,KAAA,IAAS,IAAA;AAC5B,IAAA,IAAA,CAAK,qBAAqB,YAAY,CAAA;AACtC,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAa,KAAA,GAAgB;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,IAAa,MAAM,KAAA,EAAkC;AACnD,IAAA,MAAM,kBAAkB,KAAA,IAAS,EAAA;AACjC,IAAA,IAAI,IAAA,CAAK,WAAW,eAAA,EAAiB;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,eAAA;AACd,IAAA,IAAA,CAAK,qBAAqB,OAAO,CAAA;AACjC,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAa,EAAA,GAAa;AACxB,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA,EAEA,IAAa,GAAG,KAAA,EAAkC;AAChD,IAAA,MAAM,kBAAkB,KAAA,IAAS,EAAA;AACjC,IAAA,IAAI,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAChC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,eAAA;AACX,IAAA,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAa,SAAA,GAAqB;AAChC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAa,UAAU,KAAA,EAAmC;AACxD,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAC,KAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,eAAe,eAAA,EAAiB;AACvC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,eAAA;AAClB,IAAA,IAAA,CAAK,qBAAqB,WAAW,CAAA;AACrC,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA;AAAA,EAIA,gBAAA,GAAyB;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAES,iBAAA,GAA0B;AACjC,IAAA,KAAA,CAAM,iBAAA,EAAkB;AAExB,IAAA,MAAM,iBAAA,GAAoB;AAAA,MACxB,IAAA;AAAA,MACA,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,CAAC,IAAA,KAAS;AAClC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,CAAa,IAAI,CAAA;AACrC,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,IAAA,CAAK,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,MAC/B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAES,aAAa,aAAA,EAAsC;AAC1D,IAAA,QAAQ,aAAA;AAAe,MACrB,KAAK,IAAA;AACH,QAAA,OAAO,KAAK,EAAA,IAAM,IAAA;AAAA,MACpB,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,KAAA,IAAS,IAAA;AAAA,MACvB,KAAK,gBAAA;AACH,QAAA,OAAO,KAAK,cAAA,IAAkB,IAAA;AAAA,MAChC,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAY,EAAA,GAAK,IAAA;AAAA,MAC/B,KAAK,YAAA;AACH,QAAA,OAAO,KAAK,WAAA,KAAgB,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,GAAI,IAAA;AAAA,MAChE,KAAK,YAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACd,KAAK,iBAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACd,KAAK,kBAAA;AACH,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACd;AACE,QAAA,OAAO,KAAA,CAAM,aAAa,aAAa,CAAA;AAAA;AAC3C,EACF;AAAA,EAES,aAAa,aAAA,EAAgC;AACpD,IAAA,QAAQ,aAAA;AAAe,MACrB,KAAK,IAAA;AACH,QAAA,OAAO,KAAK,EAAA,KAAO,EAAA;AAAA,MACrB,KAAK,OAAA;AACH,QAAA,OAAO,KAAK,KAAA,KAAU,EAAA;AAAA,MACxB,KAAK,gBAAA;AACH,QAAA,OAAO,KAAK,cAAA,KAAmB,EAAA;AAAA,MACjC,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACd,KAAK,YAAA;AACH,QAAA,OAAO,KAAK,WAAA,KAAgB,IAAA;AAAA,MAC9B,KAAK,YAAA;AACH,QAAA,OAAO,KAAK,SAAA,KAAc,IAAA;AAAA,MAC5B,KAAK,iBAAA;AACH,QAAA,OAAO,KAAK,cAAA,KAAmB,IAAA;AAAA,MACjC,KAAK,kBAAA;AACH,QAAA,OAAO,KAAK,eAAA,KAAoB,IAAA;AAAA,MAClC;AACE,QAAA,OAAO,KAAA,CAAM,aAAa,aAAa,CAAA;AAAA;AAC3C,EACF;AAAA,EAES,YAAA,CAAa,eAAuB,KAAA,EAAqB;AAChE,IAAA,QAAQ,aAAA;AAAe,MACrB,KAAK,IAAA;AACH,QAAA,IAAA,CAAK,EAAA,GAAK,KAAA;AACV,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,aAAa,KAAA,KAAU,OAAA;AAC5B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,QAAA;AAAA,MACF;AACE,QAAA,KAAA,CAAM,YAAA,CAAa,eAAe,KAAK,CAAA;AAAA;AAC3C,EACF;AAAA,EAES,gBAAgB,aAAA,EAA6B;AACpD,IAAA,QAAQ,aAAA;AAAe,MACrB,KAAK,IAAA;AACH,QAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAA;AACb,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AACtB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA;AAAA,MACF;AACE,QAAA,KAAA,CAAM,gBAAgB,aAAa,CAAA;AAAA;AACvC,EACF;AAAA,EAEQ,qBAAqB,IAAA,EAAoB;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,IAAI,YAAY,SAAA,CAAU,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA,EAAG;AAGvD,MAAA,WAAA,CAAY,SAAA,CAAU,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,IAAc,kBAAA,GAAyC;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,EAAW,IAAA,EAAK;AACnC,IAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AAAA,EACzB;AAAA,EAEA,IAAc,uBAAA,GAA8C;AAC1D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,EAAgB,IAAA,EAAK;AACxC,IAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AAAA,EACzB;AAAA,EAEA,IAAc,wBAAA,GAA+C;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,EAAiB,IAAA,EAAK;AACzC,IAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AAAA,EACzB;AAAA;AAAA;AAAA,EAIA,IAAc,UAAA,GAAsB;AAClC,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,IAAY,KAAA,MAAW,IAAA,CAAK,OAAA,IAAW,KAAA,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,IAAc,iBAAA,GAA6B;AACzC,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,uBAAuB,CAAA;AAAA,EACxE;AACF,CAAA;AAnSa,kBAAA,CACJ,aAAmC,EAAC;;;ACHtC,SAAS,qBAAqB,KAAA,EAAiC;AACpE,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AAC1B,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,SAAA,EAAW;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,IAAA,EAAK,CAAE,UAAU,CAAA,IAAK,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AA2BO,IAAM,iCAAgC,MAAA,CAAO,GAAA;AAAA,EAClD;AACF,CAAA;AAEO,SAAS,aAAA,CACd,MACA,IAAA,EACW;AACX,EAAA,OAAQ,IAAA,CAAuC,cAAc,CAAA,KAAM,IAAA;AACrE;;;AC1CA,SAAS,OAAO,IAAA,EAAgC;AAC9C,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAQ,IAAA,CAAiB,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AACnD;AAIO,IAAM,uBAAN,MAAyD;AAAA,EAI9D,WAAA,CACmB,MACA,kBAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,kBAAA,GAAA,kBAAA;AALnB,IAAA,IAAA,CAAQ,YAAoB,EAAC;AAO3B,IAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,EACzB;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAGA,GAAA,GAAc;AACZ,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,MAAM,IAAA,EAAuB;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAU,MAAA,CAAO,CAAC,SAAS,MAAA,CAAO,IAAI,MAAM,IAAI,CAAA;AAAA,EAC9D;AAAA,EAEA,SAAS,IAAA,EAA0B;AACjC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA;AAAA,MACtB,CAAC,IAAA,KAA0B,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK;AAAA,KACpD;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,EAAwB;AAC1B,IAAA,OAAO,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAC9C;AAAA,EAEQ,eAAe,IAAA,EAAqB;AAC1C,IAAA,OACE,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,IACvB,KAAK,kBAAA,CAAmB,IAAA;AAAA,MAAK,CAAC,IAAA,KAC3B,IAAA,CAAiB,YAAA,CAAa,IAAI;AAAA,KACrC;AAAA,EAEJ;AAAA,EAEQ,cAAc,IAAA,EAAqB;AACzC,IAAA,IAAI,KAAK,QAAA,KAAa,IAAA,CAAK,gBAAgB,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA,EAAG;AACpE,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,SAAA,IAAa,KAAK,eAAA,EAAiB;AAC5D,MAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAY,eAAA,GAA2B;AACrC,IAAA,OAAQ,KAAK,IAAA,CAA4C,UAAA;AAAA,EAC3D;AAAA,EAEQ,IAAA,GAAgB;AAGtB,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,uBAAO,GAAA,CAAI;AAAA,QACT,GAAG,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,QAC3D,GAAG,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA;AAAA,UAAO,CAAC,IAAA,KAC1C,IAAA,CAAK,aAAA,CAAc,IAAI;AAAA;AACzB,OACD;AAAA,KACH;AAEA,IAAA,MAAM,OAAA,GACJ,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,UAAU,MAAA,IAC/B,IAAA,CAAK,IAAA,CAAK,CAAC,MAAM,KAAA,KAAU,IAAA,KAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAE3D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,KAAK,WAAA,EAAa;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AACzC,MAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,QAAA,IAAA,CAAK,KAAK,aAAA,EAAc;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,IAAA,CAAK,MAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACtD;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAAA,EAClB;AACF,CAAA;;;AC5HO,IAAM,yBAAA,GAA4B;AAAA,EACvC,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EACxC,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA;AACrC,CAAA;AAgBO,SAAS,iBAAiB,OAAA,EAG/B;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,IAC5B,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC9B;AACF;ACFA,SAAS,WAAW,KAAA,EAAiD;AACnE,EAAA,IAAI,OAAuB,KAAA,CAAM,aAAA;AACjC,EAAA,OACE,IAAA,IACA,CAAC,aAAA,CAAwC,IAAA,EAAM,aAAa,CAAA,EAC5D;AACA,IAAA,IAAA,GAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;AArCA,IAAA,EAAA,EAAA,EAAA;AAyCO,IAAM,wBAAA,GAAN,eACG,EAAA,GAAA,kBAAA,EAcE,EAAA,GAAA,cAAA,EAdF,EAAA,EAEV;AAAA,EAHO,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAeL,IAAA,IAAA,CAAU,EAAA,CAAA,GAAkB,aAAA;AAE5B,IAAA,IAAA,CAAA,OAAA,GAA+B,KAAA;AAC/B,IAAA,IAAA,CAAA,OAAA,GAA+B,KAAA;AAE/B,IAAA,IAAA,CAAA,OAAA,GAA+B,KAAA;AAC/B,IAAA,IAAA,CAAA,QAAA,GAAgC,KAAA;AAChC,IAAA,IAAA,CAAA,IAAA,GAA2B,MAAA;AAC3B,IAAA,IAAA,CAAA,IAAA,GAA2B,MAAA;AAC3B,IAAA,IAAA,CAAA,QAAA,GAAgC,KAAA;AAChC,IAAA,IAAA,CAAA,IAAA,GAAyC,OAAA;AACzC,IAAA,IAAA,CAAA,KAAA,GAA4B,MAAA;AAE5B,IAAA,IAAA,CAAiB,UAAA,GAAa,IAAI,oBAAA,CAAqB,IAAA,EAAM;AAAA,MAC3D;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,EAED,IAAa,EAAA,GAAa;AACxB,IAAA,OAAO,KAAA,CAAM,EAAA;AAAA,EACf;AAAA,EAEA,IAAa,GAAG,KAAA,EAAkC;AAChD,IAAA,KAAA,CAAM,EAAA,GAAK,KAAA;AAAA,EACb;AAAA,EAEA,IAAa,KAAA,GAAgB;AAC3B,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AAAA,EAEA,IAAa,MAAM,KAAA,EAAkC;AACnD,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAAA,EAChB;AAAA,EAES,iBAAA,GAA0B;AAzFrC,IAAA,IAAAA,GAAAA;AA0FI,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,CAAAA,GAAAA,GAAA,IAAA,CAAK,KAAA,EAAM,OAAA,KAAXA,IAAW,OAAA,GAAY,OAAA,CAAA;AAAA,EACzB;AAAA,EAEmB,WACjB,iBAAA,EACM;AACN,IAAA,IAAI,kBAAkB,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA,CAAK,WAAW,IAAA,EAAM;AAC5D,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AACA,IAAA,IAAI,kBAAkB,GAAA,CAAI,UAAU,CAAA,IAAK,IAAA,CAAK,YAAY,IAAA,EAAM;AAC9D,MAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,IAClB;AACA,IAAA,IACE,iBAAA,CAAkB,IAAI,MAAM,CAAA,IAC5B,KAAK,IAAA,KAAS,OAAA,IACd,IAAA,CAAK,IAAA,KAAS,UAAA,EACd;AACA,MAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AAAA,IACd;AAAA,EACF;AAAA,EAEA,IAAY,WAAA,GAAuC;AACjD,IAAA,OAAO,IAAA,CAAK,cAAc,6BAA6B,CAAA;AAAA,EACzD;AAAA,EAES,MAAM,OAAA,EAA8B;AAC3C,IAAA,IAAA,CAAK,WAAA,EAAa,MAAM,OAAO,CAAA;AAAA,EACjC;AAAA,EAES,IAAA,GAAa;AACpB,IAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA,EAIQ,aAAa,KAAA,EAAoB;AACvC,IAAA,MAAM,QAAQ,KAAA,CAAM,aAAA;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AACrB,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,CAAC,KAAK,IAAA,EAAM;AACvC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAC9B,IAAA,IAAA,CACG,gBAAA,CAAmC,kCAAkC,CAAA,CACrE,OAAA,CAAQ,CAAC,KAAA,KAAU;AAClB,MAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,KAAK,IAAA,EAAM;AAC/C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AAAA,MACvB;AAAA,IACF,CAAC,CAAA;AAAA,EACL;AAAA,EAES,MAAA,GAAS;AAChB,IAAA,OAAO,IAAA,CAAA;AAAA,aAAA,EACI,oBAAA,CAAqB;AAAA,MAC5B,GAAG,iBAAiB,IAAI,CAAA;AAAA,MACxB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC5B,CAAC,CAAA;AAAA;AAAA,aAAA,EAEO,SAAA,CAAU,IAAA,CAAK,KAAA,IAAS,MAAS,CAAC,CAAA;AAAA;AAAA;AAAA,0BAAA,EAGrB,SAAA,CAAU,IAAA,CAAK,wBAAwB,CAAC,CAAA;AAAA,kBAAA,EAChD,IAAA,CAAK,IAAA,CAAK,OAAA,IAAW,KAAK,CAAC,CAAA;AAAA;AAAA,mBAAA,EAE1B,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,cAAA,EAC3B,SAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,MAAS,CAAC,CAAA;AAAA,YAAA,EACnC,SAAA,CAAU,IAAA,CAAK,EAAA,IAAM,MAAS,CAAC,CAAA;AAAA,cAAA,EAC7B,SAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,MAAS,CAAC,CAAA;AAAA,mBAAA,EAC5B,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,cAAA,EAC3B,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,eAAA,EACnB,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,iBAAA,EACnB,KAAK,YAAY,CAAA;AAAA;AAAA,wCAAA,EAEM,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,CAAA;AAAA,YAAA,CAAA;AAAA,EAE/D;AACF;AAlIa,wBAAA,CAIJ,UAAA,GAAa;AAAA,EAClB,GAAG,yBAAA;AAAA,EACH,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EACxC,QAAA,EAAU,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EACzC,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,EACrB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,EACpC,QAAA,EAAU,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EACzC,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,EACpC,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA;AACjB,CAAA;AAuHK,SAAS,uBAAA,CACd,UAAU,gBAAA,EACuB;AACjC,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAElD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,cAAA,CAAe,MAAA,CAAO,SAAS,wBAAwB,CAAA;AACvD,EAAA,OAAO,wBAAA;AACT","file":"choice-card.js","sourcesContent":["import { LitElement, type PropertyDeclarations } from 'lit'\n\nexport class SpectreBaseElement extends LitElement {\n static properties: PropertyDeclarations = {}\n\n private _ariaLabel: string | null = null\n private _ariaLabelledBy: string | null = null\n private _ariaDescribedBy: string | null = null\n private _autocapitalize = ''\n private _autofocus = false\n private _spellcheck: boolean | null = null\n private _title = ''\n private _id = ''\n\n get ariaLabel(): string | null {\n return this._ariaLabel\n }\n\n set ariaLabel(value: string | null) {\n if (this._ariaLabel === value) {\n return\n }\n this._ariaLabel = value\n this._removeHostAttribute('aria-label')\n this.requestUpdate()\n }\n\n get ariaLabelledBy(): string | null {\n return this._ariaLabelledBy\n }\n\n set ariaLabelledBy(value: string | null) {\n if (this._ariaLabelledBy === value) {\n return\n }\n this._ariaLabelledBy = value\n this._removeHostAttribute('aria-labelledby')\n this.requestUpdate()\n }\n\n get ariaDescribedBy(): string | null {\n return this._ariaDescribedBy\n }\n\n set ariaDescribedBy(value: string | null) {\n if (this._ariaDescribedBy === value) {\n return\n }\n this._ariaDescribedBy = value\n this._removeHostAttribute('aria-describedby')\n this.requestUpdate()\n }\n\n override get autocapitalize(): string {\n return this._autocapitalize\n }\n\n override set autocapitalize(value: string | undefined | null) {\n const normalizedValue = value ?? ''\n if (this._autocapitalize === normalizedValue) {\n return\n }\n this._autocapitalize = normalizedValue\n this._removeHostAttribute('autocapitalize')\n this.requestUpdate()\n }\n\n override get spellcheck(): boolean {\n return this._spellcheck ?? super.spellcheck\n }\n\n override set spellcheck(value: boolean | undefined | null) {\n if (this._spellcheck === value) {\n return\n }\n this._spellcheck = value ?? null\n this._removeHostAttribute('spellcheck')\n this.requestUpdate()\n }\n\n override get title(): string {\n return this._title\n }\n\n override set title(value: string | undefined | null) {\n const normalizedValue = value ?? ''\n if (this._title === normalizedValue) {\n return\n }\n this._title = normalizedValue\n this._removeHostAttribute('title')\n this.requestUpdate()\n }\n\n override get id(): string {\n return this._id\n }\n\n override set id(value: string | undefined | null) {\n const normalizedValue = value ?? ''\n if (this._id === normalizedValue) {\n return\n }\n this._id = normalizedValue\n this._removeHostAttribute('id')\n this.requestUpdate()\n }\n\n override get autofocus(): boolean {\n return this._autofocus\n }\n\n override set autofocus(value: boolean | undefined | null) {\n const normalizedValue = !!value\n if (this._autofocus === normalizedValue) {\n return\n }\n this._autofocus = normalizedValue\n this._removeHostAttribute('autofocus')\n this.requestUpdate()\n }\n\n // Spectre components intentionally render in light DOM so the global\n // `@phcdevworks/spectre-ui` styling contract can apply directly.\n createRenderRoot(): this {\n return this\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n\n const proxiedAttributes = [\n 'id',\n 'title',\n 'autocapitalize',\n 'autofocus',\n 'spellcheck',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby'\n ]\n\n proxiedAttributes.forEach((attr) => {\n const value = super.getAttribute(attr)\n if (value !== null) {\n this.setAttribute(attr, value)\n }\n })\n }\n\n override getAttribute(qualifiedName: string): string | null {\n switch (qualifiedName) {\n case 'id':\n return this.id || null\n case 'title':\n return this.title || null\n case 'autocapitalize':\n return this.autocapitalize || null\n case 'autofocus':\n return this.autofocus ? '' : null\n case 'spellcheck':\n return this._spellcheck !== null ? String(this._spellcheck) : null\n case 'aria-label':\n return this.ariaLabel\n case 'aria-labelledby':\n return this.ariaLabelledBy\n case 'aria-describedby':\n return this.ariaDescribedBy\n default:\n return super.getAttribute(qualifiedName)\n }\n }\n\n override hasAttribute(qualifiedName: string): boolean {\n switch (qualifiedName) {\n case 'id':\n return this.id !== ''\n case 'title':\n return this.title !== ''\n case 'autocapitalize':\n return this.autocapitalize !== ''\n case 'autofocus':\n return this.autofocus\n case 'spellcheck':\n return this._spellcheck !== null\n case 'aria-label':\n return this.ariaLabel !== null\n case 'aria-labelledby':\n return this.ariaLabelledBy !== null\n case 'aria-describedby':\n return this.ariaDescribedBy !== null\n default:\n return super.hasAttribute(qualifiedName)\n }\n }\n\n override setAttribute(qualifiedName: string, value: string): void {\n switch (qualifiedName) {\n case 'id':\n this.id = value\n break\n case 'title':\n this.title = value\n break\n case 'autocapitalize':\n this.autocapitalize = value\n break\n case 'autofocus':\n this.autofocus = true\n break\n case 'spellcheck':\n this.spellcheck = value !== 'false'\n break\n case 'aria-label':\n this.ariaLabel = value\n break\n case 'aria-labelledby':\n this.ariaLabelledBy = value\n break\n case 'aria-describedby':\n this.ariaDescribedBy = value\n break\n default:\n super.setAttribute(qualifiedName, value)\n }\n }\n\n override removeAttribute(qualifiedName: string): void {\n switch (qualifiedName) {\n case 'id':\n this.id = ''\n break\n case 'title':\n this.title = ''\n break\n case 'autocapitalize':\n this.autocapitalize = ''\n break\n case 'autofocus':\n this.autofocus = false\n break\n case 'spellcheck':\n this.spellcheck = null\n break\n case 'aria-label':\n this.ariaLabel = null\n break\n case 'aria-labelledby':\n this.ariaLabelledBy = null\n break\n case 'aria-describedby':\n this.ariaDescribedBy = null\n break\n default:\n super.removeAttribute(qualifiedName)\n }\n }\n\n private _removeHostAttribute(name: string): void {\n const host = this as unknown as HTMLElement\n if (HTMLElement.prototype.hasAttribute.call(host, name)) {\n // Use the native removeAttribute to avoid our own overridden version\n // which would reset the internal state.\n HTMLElement.prototype.removeAttribute.call(host, name)\n }\n }\n\n protected get forwardedAriaLabel(): string | undefined {\n const value = this.ariaLabel?.trim()\n return value ? value : undefined\n }\n\n protected get forwardedAriaLabelledBy(): string | undefined {\n const value = this.ariaLabelledBy?.trim()\n return value ? value : undefined\n }\n\n protected get forwardedAriaDescribedBy(): string | undefined {\n const value = this.ariaDescribedBy?.trim()\n return value ? value : undefined\n }\n\n // Subclasses that expose `disabled`/`loading` properties get this disabled\n // calculation for free instead of redeclaring it per component.\n protected get isDisabled(): boolean {\n const self = this as unknown as { disabled?: boolean; loading?: boolean }\n return (self.disabled ?? false) || (self.loading ?? false)\n }\n\n // Subclasses get this for free instead of redeclaring it per component.\n protected get hasForwardedLabel(): boolean {\n return Boolean(this.forwardedAriaLabel || this.forwardedAriaLabelledBy)\n }\n}\n","export function hasMeaningfulContent(nodes: readonly Node[]): boolean {\n return nodes.some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return true\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent?.trim().length ?? 0) > 0\n }\n\n return false\n })\n}\n\nlet idCounter = 0\n\nexport function createUniqueId(prefix: string): string {\n idCounter += 1\n return `${prefix}-${idCounter}`\n}\n\n// Swaps the recipe classes this component previously applied to `element`\n// without touching classes the author set.\nexport function replaceClasses(\n element: Element,\n previous: string,\n next: string\n): void {\n const nextTokens = next.split(/\\s+/).filter(Boolean)\n previous\n .split(/\\s+/)\n .filter((token) => token && !nextTokens.includes(token))\n .forEach((token) => element.classList.remove(token))\n element.classList.add(...nextTokens)\n}\n\n// Parent/child component pairs identify each other through a global symbol\n// rather than `instanceof`, because every subpath entry bundles its own copy\n// of the child class.\nexport const spectreKindKey: unique symbol = Symbol.for(\n 'phcdevworks.spectre-components.kind'\n)\n\nexport function isSpectreKind<T extends Element>(\n node: Node,\n kind: string\n): node is T {\n return (node as { [spectreKindKey]?: string })[spectreKindKey] === kind\n}\n","import type { ReactiveController, ReactiveControllerHost } from 'lit'\n\nimport { hasMeaningfulContent } from './dom'\n\ntype ProjectionHost = ReactiveControllerHost & HTMLElement\n\nfunction slotOf(node: Node): string | undefined {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return undefined\n }\n return (node as Element).getAttribute('slot') ?? undefined\n}\n\n// Tracks authored light-DOM nodes for components that project content into\n// more than one rendered container, partitioned by their `slot` attribute.\nexport class ProjectionController implements ReactiveController {\n private projected: Node[] = []\n private observer: MutationObserver | undefined\n\n constructor(\n private readonly host: ProjectionHost,\n private readonly internalAttributes: readonly string[]\n ) {\n host.addController(this)\n }\n\n hostConnected(): void {\n this.sync()\n this.observe()\n }\n\n hostDisconnected(): void {\n this.disconnect()\n }\n\n hostUpdate(): void {\n this.sync()\n this.disconnect()\n }\n\n hostUpdated(): void {\n this.observe()\n }\n\n // Every projected node in authored order, regardless of slot.\n all(): Node[] {\n return [...this.projected]\n }\n\n // Omitting `slot` returns the nodes without a slot attribute.\n nodes(slot?: string): Node[] {\n return this.projected.filter((node) => slotOf(node) === slot)\n }\n\n elements(slot?: string): Element[] {\n return this.nodes(slot).filter(\n (node): node is Element => node.nodeType === Node.ELEMENT_NODE\n )\n }\n\n has(slot?: string): boolean {\n return hasMeaningfulContent(this.nodes(slot))\n }\n\n private isInternalNode(node: Node): boolean {\n return (\n node.nodeType === Node.ELEMENT_NODE &&\n this.internalAttributes.some((name) =>\n (node as Element).hasAttribute(name)\n )\n )\n }\n\n private isProjectable(node: Node): boolean {\n if (node.nodeType === Node.COMMENT_NODE || this.isInternalNode(node)) {\n return false\n }\n // After the first render, whitespace between rendered siblings belongs to\n // the template, not the author.\n if (node.nodeType === Node.TEXT_NODE && this.hostHasRendered) {\n return Boolean(node.textContent?.trim())\n }\n return true\n }\n\n private get hostHasRendered(): boolean {\n return (this.host as unknown as { hasUpdated: boolean }).hasUpdated\n }\n\n private sync(): boolean {\n // Authored nodes already moved into rendered containers are retained;\n // re-reading those containers would also capture Lit's own nodes.\n const next = [\n ...new Set([\n ...this.projected.filter((node) => this.host.contains(node)),\n ...Array.from(this.host.childNodes).filter((node) =>\n this.isProjectable(node)\n )\n ])\n ]\n\n const changed =\n next.length !== this.projected.length ||\n next.some((node, index) => node !== this.projected[index])\n\n if (changed) {\n this.projected = next\n }\n return changed\n }\n\n private observe(): void {\n if (this.observer || !this.host.isConnected) {\n return\n }\n this.observer = new MutationObserver(() => {\n if (this.sync()) {\n this.host.requestUpdate()\n }\n })\n this.observer.observe(this.host, { childList: true })\n }\n\n private disconnect(): void {\n this.observer?.disconnect()\n this.observer = undefined\n }\n}\n","// Recipe-forced interaction states. Real interaction is styled by native\n// pseudo-classes; these force the look for documentation, previews, and\n// visual tests.\nexport const hoverFocusStateProperties = {\n focused: { type: Boolean, reflect: true },\n hovered: { type: Boolean, reflect: true }\n} as const\n\nexport const interactionStateProperties = {\n ...hoverFocusStateProperties,\n active: { type: Boolean, reflect: true }\n} as const\n\nexport interface SpectreHoverFocusStateProps {\n focused?: boolean | undefined\n hovered?: boolean | undefined\n}\n\nexport interface SpectreInteractionStateProps extends SpectreHoverFocusStateProps {\n active?: boolean | undefined\n}\n\nexport function hoverFocusStates(element: SpectreHoverFocusStateProps): {\n focused: boolean\n hovered: boolean\n} {\n return {\n focused: element.focused ?? false,\n hovered: element.hovered ?? false\n }\n}\n\nexport function interactionStates(element: SpectreInteractionStateProps): {\n active: boolean\n focused: boolean\n hovered: boolean\n} {\n return { ...hoverFocusStates(element), active: element.active ?? false }\n}\n","import { html } from 'lit'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { live } from 'lit/directives/live.js'\n\nimport { SpectreBaseElement } from '../../utils/base'\nimport { isSpectreKind, spectreKindKey } from '../../utils/dom'\nimport { ProjectionController } from '../../utils/projection'\nimport {\n hoverFocusStateProperties,\n hoverFocusStates,\n type SpectreHoverFocusStateProps\n} from '../../utils/states'\n\nimport { getChoiceCardClasses } from '@phcdevworks/spectre-ui'\n\nexport interface SpectreChoiceCardProps extends SpectreHoverFocusStateProps {\n ariaDescribedBy?: string | null\n checked?: boolean | undefined\n disabled?: boolean | undefined\n form?: string | undefined\n id?: string | null | undefined\n name?: string | undefined\n required?: boolean | undefined\n title?: string | null | undefined\n type?: 'radio' | 'checkbox' | undefined\n value?: string | undefined\n}\n\nfunction owningCard(input: Element): SpectreChoiceCardElement | null {\n let node: Element | null = input.parentElement\n while (\n node &&\n !isSpectreKind<SpectreChoiceCardElement>(node, 'choice-card')\n ) {\n node = node.parentElement\n }\n return node\n}\n\n// A whole-card hit target: a `<label>` wrapping a native radio or checkbox,\n// so selection, focus, and form submission stay native.\nexport class SpectreChoiceCardElement\n extends SpectreBaseElement\n implements SpectreChoiceCardProps\n{\n static properties = {\n ...hoverFocusStateProperties,\n checked: { type: Boolean, reflect: true },\n disabled: { type: Boolean, reflect: true },\n form: { type: String },\n name: { type: String, reflect: true },\n required: { type: Boolean, reflect: true },\n type: { type: String, reflect: true },\n value: { type: String }\n }\n\n readonly [spectreKindKey] = 'choice-card'\n\n focused: boolean | undefined = false\n hovered: boolean | undefined = false\n\n checked: boolean | undefined = false\n disabled: boolean | undefined = false\n form: string | undefined = undefined\n name: string | undefined = undefined\n required: boolean | undefined = false\n type: 'radio' | 'checkbox' | undefined = 'radio'\n value: string | undefined = undefined\n\n private readonly projection = new ProjectionController(this, [\n 'data-sp-choice-card-native'\n ])\n\n override get id(): string {\n return super.id\n }\n\n override set id(value: string | null | undefined) {\n super.id = value\n }\n\n override get title(): string {\n return super.title\n }\n\n override set title(value: string | null | undefined) {\n super.title = value\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.style.display ||= 'block'\n }\n\n protected override willUpdate(\n changedProperties: Map<PropertyKey, unknown>\n ): void {\n if (changedProperties.has('checked') && this.checked == null) {\n this.checked = false\n }\n if (changedProperties.has('disabled') && this.disabled == null) {\n this.disabled = false\n }\n if (\n changedProperties.has('type') &&\n this.type !== 'radio' &&\n this.type !== 'checkbox'\n ) {\n this.type = 'radio'\n }\n }\n\n private get nativeInput(): HTMLInputElement | null {\n return this.querySelector('[data-sp-choice-card-input]')\n }\n\n override focus(options?: FocusOptions): void {\n this.nativeInput?.focus(options)\n }\n\n override blur(): void {\n this.nativeInput?.blur()\n }\n\n // Checking a radio unchecks its group natively; mirror that onto the other\n // cards' `checked` properties.\n private handleChange(event: Event): void {\n const input = event.currentTarget as HTMLInputElement\n this.checked = input.checked\n if (this.type !== 'radio' || !this.name) {\n return\n }\n const root = this.getRootNode() as Document | ShadowRoot\n root\n .querySelectorAll<HTMLInputElement>('input[data-sp-choice-card-input]')\n .forEach((other) => {\n if (other === input || other.name !== this.name) {\n return\n }\n const card = owningCard(other)\n if (card) {\n card.checked = other.checked\n }\n })\n }\n\n override render() {\n return html`<label\n class=\"${getChoiceCardClasses({\n ...hoverFocusStates(this),\n disabled: this.disabled ?? false\n })}\"\n data-sp-choice-card-native\n title=\"${ifDefined(this.title || undefined)}\"\n >\n <input\n aria-describedby=\"${ifDefined(this.forwardedAriaDescribedBy)}\"\n .checked=\"${live(this.checked ?? false)}\"\n data-sp-choice-card-input\n ?disabled=\"${this.disabled ?? false}\"\n form=\"${ifDefined(this.form || undefined)}\"\n id=\"${ifDefined(this.id || undefined)}\"\n name=\"${ifDefined(this.name || undefined)}\"\n ?required=\"${this.required ?? false}\"\n type=\"${this.type ?? 'radio'}\"\n value=\"${ifDefined(this.value)}\"\n @change=\"${this.handleChange}\"\n />\n <span data-sp-choice-card-content>${this.projection.nodes()}</span>\n </label>`\n }\n}\n\nexport function defineSpectreChoiceCard(\n tagName = 'sp-choice-card'\n): typeof SpectreChoiceCardElement {\n const existingElement = customElements.get(tagName)\n\n if (existingElement) {\n return existingElement as unknown as typeof SpectreChoiceCardElement\n }\n\n customElements.define(tagName, SpectreChoiceCardElement)\n return SpectreChoiceCardElement\n}\n"]}
|