@gravionlabs/helix-ui 22.1.25 → 22.1.27
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/fesm2022/gravionlabs-helix-ui-validators.mjs +92 -0
- package/fesm2022/gravionlabs-helix-ui-validators.mjs.map +1 -0
- package/fesm2022/gravionlabs-helix-ui.mjs +31 -45
- package/fesm2022/gravionlabs-helix-ui.mjs.map +1 -1
- package/package.json +5 -1
- package/styles.css +22 -9
- package/types/gravionlabs-helix-ui-validators.d.ts +35 -0
- package/types/gravionlabs-helix-ui.d.ts +61 -27
- package/validators/package.json +4 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { FormControl, Validators as Validators$1 } from "@angular/forms";
|
|
2
|
+
var ValidatorKey;
|
|
3
|
+
(function(ValidatorKey) {
|
|
4
|
+
ValidatorKey["Required"] = "Required";
|
|
5
|
+
ValidatorKey["Email"] = "Email";
|
|
6
|
+
ValidatorKey["Number"] = "Number";
|
|
7
|
+
ValidatorKey["Integer"] = "Integer";
|
|
8
|
+
ValidatorKey["Min"] = "Min";
|
|
9
|
+
ValidatorKey["Max"] = "Max";
|
|
10
|
+
ValidatorKey["MinLength"] = "MinLength";
|
|
11
|
+
ValidatorKey["MaxLength"] = "MaxLength";
|
|
12
|
+
ValidatorKey["Pattern"] = "Pattern";
|
|
13
|
+
ValidatorKey["Date"] = "Date";
|
|
14
|
+
ValidatorKey["OneOf"] = "OneOf";
|
|
15
|
+
ValidatorKey["AllOf"] = "AllOf";
|
|
16
|
+
})(ValidatorKey || (ValidatorKey = {}));
|
|
17
|
+
const EMPTY_VALUES = [
|
|
18
|
+
"",
|
|
19
|
+
null,
|
|
20
|
+
void 0
|
|
21
|
+
];
|
|
22
|
+
const isEmptyValue = (v) => EMPTY_VALUES.includes(v);
|
|
23
|
+
const checkEmpty = (allowEmpty, check) => (ctrl) => allowEmpty ? isEmptyValue(ctrl.value) || check(ctrl.value) : !isEmptyValue(ctrl.value) && check(ctrl.value);
|
|
24
|
+
const buildValidator = (isValid, key, msg) => (ctrl) => isValid(ctrl) ? null : { [key]: typeof msg === "function" ? msg(ctrl.value) : msg };
|
|
25
|
+
const Validators = {
|
|
26
|
+
required: (msg) => {
|
|
27
|
+
const predicate = (ctrl) => !isEmptyValue(ctrl.value);
|
|
28
|
+
return buildValidator(predicate, ValidatorKey.Required, msg);
|
|
29
|
+
},
|
|
30
|
+
email: (msg, allowEmpty = true) => {
|
|
31
|
+
const check = (value) => {
|
|
32
|
+
const ctrl = new FormControl(value);
|
|
33
|
+
return Validators$1.email(ctrl) === null;
|
|
34
|
+
};
|
|
35
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Email, msg);
|
|
36
|
+
},
|
|
37
|
+
pattern: (msg, regex, allowEmpty = true) => {
|
|
38
|
+
const check = (value) => regex.test(value);
|
|
39
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Pattern, msg);
|
|
40
|
+
},
|
|
41
|
+
date: (msg, allowEmpty = true) => {
|
|
42
|
+
const check = (value) => {
|
|
43
|
+
const d = new Date(value);
|
|
44
|
+
return !Number.isNaN(d.getTime());
|
|
45
|
+
};
|
|
46
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Date, msg);
|
|
47
|
+
},
|
|
48
|
+
number: (msg, allowEmpty = true) => {
|
|
49
|
+
const check = (value) => typeof value !== "boolean" && !Number.isNaN(Number(value));
|
|
50
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Number, msg);
|
|
51
|
+
},
|
|
52
|
+
integer: (msg, allowEmpty = true) => {
|
|
53
|
+
const check = (value) => {
|
|
54
|
+
if (typeof value === "boolean") return false;
|
|
55
|
+
const num = Number(value);
|
|
56
|
+
return !Number.isNaN(num) && num % 1 === 0;
|
|
57
|
+
};
|
|
58
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Integer, msg);
|
|
59
|
+
},
|
|
60
|
+
min: (msg, minimum, allowEmpty = true) => {
|
|
61
|
+
const check = (value) => Number(value) >= minimum;
|
|
62
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Min, msg);
|
|
63
|
+
},
|
|
64
|
+
max: (msg, maximum, allowEmpty = true) => {
|
|
65
|
+
const check = (value) => Number(value) <= maximum;
|
|
66
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Max, msg);
|
|
67
|
+
},
|
|
68
|
+
minLength: (msg, min, allowEmpty = true) => {
|
|
69
|
+
const check = (value) => value.length >= min;
|
|
70
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.MinLength, msg);
|
|
71
|
+
},
|
|
72
|
+
maxLength: (msg, max, allowEmpty = true) => {
|
|
73
|
+
const check = (value) => value.length <= max;
|
|
74
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.MaxLength, msg);
|
|
75
|
+
},
|
|
76
|
+
oneOf: (msg, options) => {
|
|
77
|
+
const anyEmptyMember = EMPTY_VALUES.some((v) => options.includes(v));
|
|
78
|
+
return (ctrl) => {
|
|
79
|
+
const value = ctrl.value;
|
|
80
|
+
if (anyEmptyMember && isEmptyValue(value)) return null;
|
|
81
|
+
if (options.includes(value)) return null;
|
|
82
|
+
return { [ValidatorKey.OneOf]: typeof msg === "function" ? msg(value) : msg };
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
allOf: (msg, options, allowEmpty = true) => {
|
|
86
|
+
const check = (value) => Array.isArray(value) && value.every((v) => options.includes(v));
|
|
87
|
+
return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.AllOf, msg);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
export { EMPTY_VALUES, ValidatorKey, Validators, buildValidator, checkEmpty, isEmptyValue };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=gravionlabs-helix-ui-validators.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gravionlabs-helix-ui-validators.mjs","names":[],"sources":["../../../projects/ui/validators/validator-key.enum.ts","../../../projects/ui/validators/validators.ts"],"sourcesContent":["export enum ValidatorKey {\n Required = 'Required',\n Email = 'Email',\n Number = 'Number',\n Integer = 'Integer',\n Min = 'Min',\n Max = 'Max',\n MinLength = 'MinLength',\n MaxLength = 'MaxLength',\n Pattern = 'Pattern',\n Date = 'Date',\n OneOf = 'OneOf',\n AllOf = 'AllOf',\n}\n","import type { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { FormControl, Validators as NgValidators } from '@angular/forms';\nimport { ValidatorKey } from './validator-key.enum';\n\nexport type ValidatorMessage = (value: any) => string;\n\nconst EMPTY_VALUES = ['', null, undefined];\n\nconst isEmptyValue = (v: unknown): boolean => EMPTY_VALUES.includes(v as string);\n\nconst checkEmpty =\n (allowEmpty: boolean, check: (value: unknown) => boolean) =>\n (ctrl: AbstractControl): boolean =>\n allowEmpty\n ? isEmptyValue(ctrl.value) || check(ctrl.value)\n : !isEmptyValue(ctrl.value) && check(ctrl.value);\n\nconst buildValidator =\n (\n isValid: (ctrl: AbstractControl) => boolean,\n key: ValidatorKey,\n msg: string | ValidatorMessage,\n ): ValidatorFn =>\n (ctrl: AbstractControl): ValidationErrors | null =>\n isValid(ctrl) ? null : { [key]: typeof msg === 'function' ? msg(ctrl.value) : msg };\n\nexport { buildValidator, checkEmpty, EMPTY_VALUES, isEmptyValue };\n\nexport const Validators = {\n required: (msg: string | ValidatorMessage): ValidatorFn => {\n const predicate = (ctrl: AbstractControl): boolean => !isEmptyValue(ctrl.value);\n return buildValidator(predicate, ValidatorKey.Required, msg);\n },\n\n email: (msg: string | ValidatorMessage, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => {\n const ctrl = new FormControl(value);\n return NgValidators.email(ctrl) === null;\n };\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Email, msg);\n },\n\n pattern: (msg: string | ValidatorMessage, regex: RegExp, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => regex.test(value as string);\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Pattern, msg);\n },\n\n date: (msg: string | ValidatorMessage, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => {\n const d = new Date(value as string | number | Date);\n return !Number.isNaN(d.getTime());\n };\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Date, msg);\n },\n\n number: (msg: string | ValidatorMessage, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean =>\n typeof value !== 'boolean' && !Number.isNaN(Number(value));\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Number, msg);\n },\n\n integer: (msg: string | ValidatorMessage, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => {\n if (typeof value === 'boolean') return false;\n const num = Number(value);\n return !Number.isNaN(num) && num % 1 === 0;\n };\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Integer, msg);\n },\n\n min: (msg: string | ValidatorMessage, minimum: number, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => Number(value) >= minimum;\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Min, msg);\n },\n\n max: (msg: string | ValidatorMessage, maximum: number, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => Number(value) <= maximum;\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.Max, msg);\n },\n\n minLength: (msg: string | ValidatorMessage, min: number, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => (value as { length: number }).length >= min;\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.MinLength, msg);\n },\n\n maxLength: (msg: string | ValidatorMessage, max: number, allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean => (value as { length: number }).length <= max;\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.MaxLength, msg);\n },\n\n oneOf: (msg: string | ValidatorMessage, options: unknown[]): ValidatorFn => {\n const anyEmptyMember = EMPTY_VALUES.some((v) => options.includes(v));\n return (ctrl: AbstractControl): ValidationErrors | null => {\n const value = ctrl.value;\n if (anyEmptyMember && isEmptyValue(value)) return null;\n if (options.includes(value)) return null;\n return { [ValidatorKey.OneOf]: typeof msg === 'function' ? msg(value) : msg };\n };\n },\n\n allOf: (msg: string | ValidatorMessage, options: unknown[], allowEmpty = true): ValidatorFn => {\n const check = (value: unknown): boolean =>\n Array.isArray(value) && value.every((v) => options.includes(v));\n return buildValidator(checkEmpty(allowEmpty, check), ValidatorKey.AllOf, msg);\n },\n};\n"],"mappings":"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"}
|
|
@@ -637,7 +637,10 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
637
637
|
}]
|
|
638
638
|
}
|
|
639
639
|
});
|
|
640
|
-
let
|
|
640
|
+
let counter = 0;
|
|
641
|
+
function nextId(prefix) {
|
|
642
|
+
return `${prefix}-${counter++}`;
|
|
643
|
+
}
|
|
641
644
|
var HxPassword = class HxPassword {
|
|
642
645
|
placeholder = input("", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
|
|
643
646
|
inputId = input(...ngDevMode ? [void 0, { debugName: "inputId" }] : /* istanbul ignore next */ []);
|
|
@@ -666,7 +669,7 @@ var HxPassword = class HxPassword {
|
|
|
666
669
|
transform: booleanAttribute
|
|
667
670
|
});
|
|
668
671
|
touch = output();
|
|
669
|
-
defaultId =
|
|
672
|
+
defaultId = nextId("hx-password");
|
|
670
673
|
visible = signal(false, ...ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []);
|
|
671
674
|
#cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "#cvaDisabled" }] : /* istanbul ignore next */ []);
|
|
672
675
|
isDisabled = computed(() => this.disabled() || this.#cvaDisabled(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
|
|
@@ -1139,7 +1142,25 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1139
1142
|
}]
|
|
1140
1143
|
}] }
|
|
1141
1144
|
});
|
|
1142
|
-
|
|
1145
|
+
const compareValues = Object.is;
|
|
1146
|
+
function read(option, accessor, fallback) {
|
|
1147
|
+
if (typeof accessor === "function") return accessor(option);
|
|
1148
|
+
return accessor in option ? option[accessor] : fallback;
|
|
1149
|
+
}
|
|
1150
|
+
function resolveOptions(options, label, value, disabled) {
|
|
1151
|
+
return options.map((option) => {
|
|
1152
|
+
if (option === null || typeof option !== "object") return {
|
|
1153
|
+
label: String(option),
|
|
1154
|
+
value: option,
|
|
1155
|
+
disabled: false
|
|
1156
|
+
};
|
|
1157
|
+
return {
|
|
1158
|
+
label: String(read(option, label, "")),
|
|
1159
|
+
value: read(option, value, option),
|
|
1160
|
+
disabled: Boolean(read(option, disabled, false))
|
|
1161
|
+
};
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1143
1164
|
var HxSelect = class HxSelect {
|
|
1144
1165
|
#host = inject(ElementRef);
|
|
1145
1166
|
#injector = inject(Injector);
|
|
@@ -1162,7 +1183,7 @@ var HxSelect = class HxSelect {
|
|
|
1162
1183
|
inputId = input(...ngDevMode ? [void 0, { debugName: "inputId" }] : /* istanbul ignore next */ []);
|
|
1163
1184
|
ariaLabel = input(...ngDevMode ? [void 0, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
|
|
1164
1185
|
ariaLabelledby = input(...ngDevMode ? [void 0, { debugName: "ariaLabelledby" }] : /* istanbul ignore next */ []);
|
|
1165
|
-
compareWith = input(
|
|
1186
|
+
compareWith = input(compareValues, ...ngDevMode ? [{ debugName: "compareWith" }] : /* istanbul ignore next */ []);
|
|
1166
1187
|
value = model(null, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
|
|
1167
1188
|
disabled = input(false, {
|
|
1168
1189
|
...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
|
|
@@ -1175,7 +1196,7 @@ var HxSelect = class HxSelect {
|
|
|
1175
1196
|
touch = output();
|
|
1176
1197
|
open = signal(false, ...ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []);
|
|
1177
1198
|
panelWidth = signal(0, ...ngDevMode ? [{ debugName: "panelWidth" }] : /* istanbul ignore next */ []);
|
|
1178
|
-
panelId =
|
|
1199
|
+
panelId = nextId("hx-select-panel");
|
|
1179
1200
|
positions = [{
|
|
1180
1201
|
originX: "start",
|
|
1181
1202
|
originY: "bottom",
|
|
@@ -1193,24 +1214,7 @@ var HxSelect = class HxSelect {
|
|
|
1193
1214
|
listbox = viewChild(CdkListbox, ...ngDevMode ? [{ debugName: "listbox" }] : /* istanbul ignore next */ []);
|
|
1194
1215
|
#cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "#cvaDisabled" }] : /* istanbul ignore next */ []);
|
|
1195
1216
|
isDisabled = computed(() => this.disabled() || this.#cvaDisabled(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
|
|
1196
|
-
items = computed(() => {
|
|
1197
|
-
const label = this.optionLabel();
|
|
1198
|
-
const value = this.optionValue();
|
|
1199
|
-
const disabled = this.optionDisabled();
|
|
1200
|
-
return this.options().map((option) => {
|
|
1201
|
-
if (option === null || typeof option !== "object") return {
|
|
1202
|
-
label: String(option),
|
|
1203
|
-
value: option,
|
|
1204
|
-
disabled: false
|
|
1205
|
-
};
|
|
1206
|
-
const read = (accessor, fallback) => typeof accessor === "function" ? accessor(option) : accessor in option ? option[accessor] : fallback;
|
|
1207
|
-
return {
|
|
1208
|
-
label: String(read(label, "")),
|
|
1209
|
-
value: read(value, option),
|
|
1210
|
-
disabled: Boolean(read(disabled, false))
|
|
1211
|
-
};
|
|
1212
|
-
});
|
|
1213
|
-
}, ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
1217
|
+
items = computed(() => resolveOptions(this.options(), this.optionLabel(), this.optionValue(), this.optionDisabled()), ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
1214
1218
|
selected = computed(() => {
|
|
1215
1219
|
const compare = this.compareWith();
|
|
1216
1220
|
const current = this.value();
|
|
@@ -1465,7 +1469,7 @@ var HxSelect = class HxSelect {
|
|
|
1465
1469
|
isSignal: true
|
|
1466
1470
|
}],
|
|
1467
1471
|
ngImport: i0,
|
|
1468
|
-
template: "<button\n #trigger\n type=\"button\"\n class=\"hx-select-trigger\"\n role=\"combobox\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId() ?? null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span class=\"hx-select-label\" [class.hx-select-placeholder]=\"!selected()\">{{\n selected()?.label ?? placeholder()\n }}</span>\n <
|
|
1472
|
+
template: "<button\n #trigger\n type=\"button\"\n class=\"hx-select-trigger\"\n role=\"combobox\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId() ?? null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span class=\"hx-select-label\" [class.hx-select-placeholder]=\"!selected()\">{{\n selected()?.label ?? placeholder()\n }}</span>\n <span class=\"hx-select-chevron\" aria-hidden=\"true\"></span>\n</button>\n@if (canClear()) {\n <button type=\"button\" class=\"hx-select-clear\" aria-label=\"Clear selection\" (click)=\"clear($event)\">\n <span class=\"hx-select-clear-icon\" aria-hidden=\"true\"></span>\n </button>\n}\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayPanelClass=\"hx-select-overlay\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"panelWidth()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n (attach)=\"onAttach()\"\n (detach)=\"close()\"\n>\n <div class=\"hx-select-panel\">\n <div\n cdkListbox\n class=\"hx-select-list\"\n [id]=\"panelId\"\n [cdkListboxValue]=\"selectedValues()\"\n [cdkListboxUseActiveDescendant]=\"true\"\n [cdkListboxCompareWith]=\"compareWith()\"\n [attr.aria-label]=\"ariaLabel() ?? placeholder() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (cdkListboxValueChange)=\"onSelect($event)\"\n >\n @for (item of items(); track $index) {\n <div\n class=\"hx-select-option\"\n [cdkOption]=\"item.value\"\n [cdkOptionDisabled]=\"item.disabled\"\n [cdkOptionTypeaheadLabel]=\"item.label\"\n >\n <span class=\"hx-select-check\" aria-hidden=\"true\"></span>\n <span>{{ item.label }}</span>\n </div>\n } @empty {\n <div class=\"hx-select-empty\">{{ emptyMessage() }}</div>\n }\n </div>\n </div>\n</ng-template>\n",
|
|
1469
1473
|
dependencies: [
|
|
1470
1474
|
{
|
|
1471
1475
|
kind: "directive",
|
|
@@ -1583,7 +1587,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1583
1587
|
"[class.hx-select-invalid]": "invalid()",
|
|
1584
1588
|
"(focusout)": "onFocusOut($event)"
|
|
1585
1589
|
},
|
|
1586
|
-
template: "<button\n #trigger\n type=\"button\"\n class=\"hx-select-trigger\"\n role=\"combobox\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId() ?? null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span class=\"hx-select-label\" [class.hx-select-placeholder]=\"!selected()\">{{\n selected()?.label ?? placeholder()\n }}</span>\n <
|
|
1590
|
+
template: "<button\n #trigger\n type=\"button\"\n class=\"hx-select-trigger\"\n role=\"combobox\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId() ?? null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span class=\"hx-select-label\" [class.hx-select-placeholder]=\"!selected()\">{{\n selected()?.label ?? placeholder()\n }}</span>\n <span class=\"hx-select-chevron\" aria-hidden=\"true\"></span>\n</button>\n@if (canClear()) {\n <button type=\"button\" class=\"hx-select-clear\" aria-label=\"Clear selection\" (click)=\"clear($event)\">\n <span class=\"hx-select-clear-icon\" aria-hidden=\"true\"></span>\n </button>\n}\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayPanelClass=\"hx-select-overlay\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"panelWidth()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n (attach)=\"onAttach()\"\n (detach)=\"close()\"\n>\n <div class=\"hx-select-panel\">\n <div\n cdkListbox\n class=\"hx-select-list\"\n [id]=\"panelId\"\n [cdkListboxValue]=\"selectedValues()\"\n [cdkListboxUseActiveDescendant]=\"true\"\n [cdkListboxCompareWith]=\"compareWith()\"\n [attr.aria-label]=\"ariaLabel() ?? placeholder() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (cdkListboxValueChange)=\"onSelect($event)\"\n >\n @for (item of items(); track $index) {\n <div\n class=\"hx-select-option\"\n [cdkOption]=\"item.value\"\n [cdkOptionDisabled]=\"item.disabled\"\n [cdkOptionTypeaheadLabel]=\"item.label\"\n >\n <span class=\"hx-select-check\" aria-hidden=\"true\"></span>\n <span>{{ item.label }}</span>\n </div>\n } @empty {\n <div class=\"hx-select-empty\">{{ emptyMessage() }}</div>\n }\n </div>\n </div>\n</ng-template>\n"
|
|
1587
1591
|
}]
|
|
1588
1592
|
}],
|
|
1589
1593
|
propDecorators: {
|
|
@@ -1772,24 +1776,7 @@ var HxSelectButton = class HxSelectButton {
|
|
|
1772
1776
|
touch = output();
|
|
1773
1777
|
#cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "#cvaDisabled" }] : /* istanbul ignore next */ []);
|
|
1774
1778
|
isDisabled = computed(() => this.disabled() || this.#cvaDisabled(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
|
|
1775
|
-
items = computed(() => {
|
|
1776
|
-
const label = this.optionLabel();
|
|
1777
|
-
const value = this.optionValue();
|
|
1778
|
-
const disabled = this.optionDisabled();
|
|
1779
|
-
return this.options().map((option) => {
|
|
1780
|
-
if (option === null || typeof option !== "object") return {
|
|
1781
|
-
label: String(option),
|
|
1782
|
-
value: option,
|
|
1783
|
-
disabled: false
|
|
1784
|
-
};
|
|
1785
|
-
const read = (accessor, fallback) => typeof accessor === "function" ? accessor(option) : accessor in option ? option[accessor] : fallback;
|
|
1786
|
-
return {
|
|
1787
|
-
label: String(read(label, "")),
|
|
1788
|
-
value: read(value, option),
|
|
1789
|
-
disabled: Boolean(read(disabled, false))
|
|
1790
|
-
};
|
|
1791
|
-
});
|
|
1792
|
-
}, ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
1779
|
+
items = computed(() => resolveOptions(this.options(), this.optionLabel(), this.optionValue(), this.optionDisabled()), ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
1793
1780
|
#onChange = () => {};
|
|
1794
1781
|
#onTouched = () => {};
|
|
1795
1782
|
writeValue(value) {
|
|
@@ -2485,7 +2472,6 @@ function provideHxTheme(options = {}) {
|
|
|
2485
2472
|
inject(HxTheme);
|
|
2486
2473
|
})]);
|
|
2487
2474
|
}
|
|
2488
|
-
let nextId = 0;
|
|
2489
2475
|
var HxTooltipBubble = class HxTooltipBubble {
|
|
2490
2476
|
text = signal("", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
|
|
2491
2477
|
id = "";
|
|
@@ -2588,7 +2574,7 @@ var HxTooltip = class HxTooltip {
|
|
|
2588
2574
|
...ngDevMode ? { debugName: "showDelay" } : /* istanbul ignore next */ {},
|
|
2589
2575
|
alias: "hxTooltipShowDelay"
|
|
2590
2576
|
});
|
|
2591
|
-
bubbleId =
|
|
2577
|
+
bubbleId = nextId("hx-tooltip");
|
|
2592
2578
|
shown = signal(false, ...ngDevMode ? [{ debugName: "shown" }] : /* istanbul ignore next */ []);
|
|
2593
2579
|
#ref = null;
|
|
2594
2580
|
#bubble = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gravionlabs-helix-ui.mjs","names":[],"sources":["../../../projects/ui/src/lib/breadcrumb/breadcrumb.ts","../../../projects/ui/src/lib/breadcrumb/breadcrumb.html","../../../projects/ui/src/lib/button/button.ts","../../../projects/ui/src/lib/checkbox/checkbox.ts","../../../projects/ui/src/lib/divider/divider.ts","../../../projects/ui/src/lib/input/input.ts","../../../projects/ui/src/lib/password/password.ts","../../../projects/ui/src/lib/radio/radio.ts","../../../projects/ui/src/lib/select/select.ts","../../../projects/ui/src/lib/select/select.html","../../../projects/ui/src/lib/select-button/select-button.ts","../../../projects/ui/src/lib/switch/switch.ts","../../../projects/ui/src/lib/theme/surfaces.ts","../../../projects/ui/src/lib/theme/theme.ts","../../../projects/ui/src/lib/tooltip/tooltip.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\n/** One step of the trail. Structurally compatible with the menu items of the shell. */\nexport interface HxBreadcrumbItem {\n label?: string;\n /** CSS classes of an icon font, e.g. `pi pi-home`. */\n icon?: string;\n /** Router link (string or commands). Wins over `url`. */\n routerLink?: string | readonly unknown[];\n url?: string;\n target?: string;\n disabled?: boolean;\n visible?: boolean;\n}\n\n/**\n * The path to the current page. The last item is the current page (`aria-current=\"page\"`).\n *\n * ```html\n * <hx-breadcrumb [model]=\"items\" [home]=\"{ icon: 'pi pi-home', routerLink: '/' }\" />\n * ```\n */\n@Component({\n selector: 'hx-breadcrumb',\n imports: [RouterLink, NgTemplateOutlet],\n templateUrl: './breadcrumb.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'hx-breadcrumb' },\n})\nexport class HxBreadcrumb {\n readonly model = input<readonly HxBreadcrumbItem[]>([]);\n readonly home = input<HxBreadcrumbItem>();\n /** Accessible name of the navigation landmark. */\n readonly ariaLabel = input('Breadcrumb');\n\n protected items(): HxBreadcrumbItem[] {\n return this.model().filter((item) => item.visible !== false);\n }\n}\n","<nav [attr.aria-label]=\"ariaLabel()\">\n <ol class=\"hx-breadcrumb-list\">\n @if (home(); as home) {\n <li class=\"hx-breadcrumb-item\">\n <ng-container [ngTemplateOutlet]=\"entry\" [ngTemplateOutletContext]=\"{ $implicit: home, current: false }\" />\n </li>\n }\n @for (item of items(); track $index; let last = $last) {\n @if (home() || $index > 0) {\n <li class=\"hx-breadcrumb-separator\" aria-hidden=\"true\"></li>\n }\n <li class=\"hx-breadcrumb-item\">\n <ng-container [ngTemplateOutlet]=\"entry\" [ngTemplateOutletContext]=\"{ $implicit: item, current: last }\" />\n </li>\n }\n </ol>\n</nav>\n\n<ng-template #entry let-item let-current=\"current\">\n @if (current || item.disabled || (!item.routerLink && !item.url)) {\n <span class=\"hx-breadcrumb-link\" [attr.aria-current]=\"current ? 'page' : null\" [attr.aria-disabled]=\"item.disabled ? 'true' : null\">\n @if (item.icon) { <span [class]=\"item.icon + ' hx-breadcrumb-icon'\" aria-hidden=\"true\"></span> }\n @if (item.label) { <span>{{ item.label }}</span> }\n </span>\n } @else if (item.routerLink) {\n <a class=\"hx-breadcrumb-link\" [routerLink]=\"item.routerLink\" [attr.target]=\"item.target\" [attr.aria-label]=\"item.label ? null : 'Home'\">\n @if (item.icon) { <span [class]=\"item.icon + ' hx-breadcrumb-icon'\" aria-hidden=\"true\"></span> }\n @if (item.label) { <span>{{ item.label }}</span> }\n </a>\n } @else {\n <a class=\"hx-breadcrumb-link\" [href]=\"item.url\" [attr.target]=\"item.target\">\n @if (item.icon) { <span [class]=\"item.icon + ' hx-breadcrumb-icon'\" aria-hidden=\"true\"></span> }\n @if (item.label) { <span>{{ item.label }}</span> }\n </a>\n }\n</ng-template>\n","import { booleanAttribute, DestroyRef, Directive, ElementRef, inject, input } from '@angular/core';\n\nexport type HxButtonVariant = 'filled' | 'outlined' | 'text' | 'link';\nexport type HxButtonSeverity =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'info'\n | 'warn'\n | 'help'\n | 'danger'\n | 'contrast';\nexport type HxButtonSize = 'small' | 'medium' | 'large';\n\n/**\n * A native `<button>` or `<a>` dressed as a Helix button. The label is the element's content; an icon is\n * an inline `<svg>` or an element with `hxButtonIcon` next to it. Styled by `@gravionlabs/helix-ui/styles.css`\n * on the `--h-button-*` design tokens.\n *\n * ```html\n * <button hx-button severity=\"success\" (click)=\"save()\">Save</button>\n * <button hx-button variant=\"outlined\" [loading]=\"saving()\">Save</button>\n * <button hx-button iconOnly aria-label=\"Add\"><svg …/></button>\n * ```\n *\n * A loading button stays focusable (`aria-busy`) but swallows clicks; a disabled one is the native `disabled`\n * attribute (or `aria-disabled=\"true\"` on an anchor). An icon-only button needs an accessible name.\n */\n@Directive({\n selector: 'button[hx-button], a[hx-button]',\n exportAs: 'hx-button',\n host: {\n class: 'hx-button',\n '[class.hx-button-outlined]': \"variant() === 'outlined'\",\n '[class.hx-button-text]': \"variant() === 'text'\",\n '[class.hx-button-link]': \"variant() === 'link'\",\n '[class.hx-button-secondary]': \"severity() === 'secondary'\",\n '[class.hx-button-success]': \"severity() === 'success'\",\n '[class.hx-button-info]': \"severity() === 'info'\",\n '[class.hx-button-warn]': \"severity() === 'warn'\",\n '[class.hx-button-help]': \"severity() === 'help'\",\n '[class.hx-button-danger]': \"severity() === 'danger'\",\n '[class.hx-button-contrast]': \"severity() === 'contrast'\",\n '[class.hx-button-sm]': \"size() === 'small'\",\n '[class.hx-button-lg]': \"size() === 'large'\",\n '[class.hx-button-rounded]': 'rounded()',\n '[class.hx-button-raised]': 'raised()',\n '[class.hx-button-fluid]': 'fluid()',\n '[class.hx-button-icon-only]': 'iconOnly()',\n '[class.hx-button-loading]': 'loading()',\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n },\n})\nexport class HxButton {\n /** How loud the button is: filled (default), outlined, text or link. */\n readonly variant = input<HxButtonVariant>('filled');\n\n /** What the button means: `primary` (default), `secondary` and the status colours. */\n readonly severity = input<HxButtonSeverity>('primary');\n\n readonly size = input<HxButtonSize>('medium');\n\n /** A pill instead of the 6 px radius; a circle for an icon-only button. */\n readonly rounded = input(false, { transform: booleanAttribute });\n\n /** Adds the elevation shadow. */\n readonly raised = input(false, { transform: booleanAttribute });\n\n /** Takes the full width of the container. */\n readonly fluid = input(false, { transform: booleanAttribute });\n\n /** Square button for a single icon; give it `aria-label`. */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n\n /** Shows a spinner and ignores clicks while an operation runs. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n constructor() {\n // A capture listener on the host itself fires before the click listeners of the consuming template\n // (a host `(click)` binding would not: its order against the template's is not guaranteed).\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const guard = (event: Event) => {\n if (this.loading() || host.getAttribute('aria-disabled') === 'true') {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n host.addEventListener('click', guard, true);\n inject(DestroyRef).onDestroy(() => host.removeEventListener('click', guard, true));\n }\n}\n","import { Directive, input } from '@angular/core';\n\nexport type HxCheckboxSize = 'small' | 'medium' | 'large';\n\n/**\n * A native `<input type=\"checkbox\">` drawn as a Helix checkbox (CSS only). It is a real checkbox: `checked`,\n * `indeterminate`, `disabled`, `ngModel`, reactive and signal forms, keyboard and screen readers all work\n * as for any checkbox.\n *\n * ```html\n * <label><input type=\"checkbox\" hx-checkbox [(ngModel)]=\"agreed\" /> I agree</label>\n * <input type=\"checkbox\" hx-checkbox [indeterminate]=\"some\" aria-label=\"Select all\" />\n * ```\n *\n * Put it in a `<label>` with its text (or give it `aria-label`); the invalid look comes from\n * `aria-invalid=\"true\"` and from `ng-invalid ng-touched`.\n */\n@Directive({\n selector: 'input[hx-checkbox]',\n exportAs: 'hx-checkbox',\n host: {\n class: 'hx-checkbox',\n '[class.hx-checkbox-sm]': \"size() === 'small'\",\n '[class.hx-checkbox-lg]': \"size() === 'large'\",\n },\n})\nexport class HxCheckbox {\n readonly size = input<HxCheckboxSize>('medium');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport type HxDividerLayout = 'horizontal' | 'vertical';\nexport type HxDividerType = 'solid' | 'dashed' | 'dotted';\nexport type HxDividerAlign = 'start' | 'center' | 'end';\n\n/**\n * A line between content; the projected content is a label sitting on the line.\n *\n * ```html\n * <hx-divider />\n * <hx-divider align=\"center\">or</hx-divider>\n * <hx-divider layout=\"vertical\" />\n * ```\n */\n@Component({\n selector: 'hx-divider',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'hx-divider',\n role: 'separator',\n '[attr.aria-orientation]': 'layout()',\n '[class.hx-divider-horizontal]': \"layout() === 'horizontal'\",\n '[class.hx-divider-vertical]': \"layout() === 'vertical'\",\n '[class.hx-divider-dashed]': \"type() === 'dashed'\",\n '[class.hx-divider-dotted]': \"type() === 'dotted'\",\n '[class.hx-divider-start]': \"align() === 'start'\",\n '[class.hx-divider-center]': \"align() === 'center'\",\n '[class.hx-divider-end]': \"align() === 'end'\",\n },\n})\nexport class HxDivider {\n readonly layout = input<HxDividerLayout>('horizontal');\n readonly type = input<HxDividerType>('solid');\n /** Where the label sits on the line (start, center, end); without a label it has no effect. */\n readonly align = input<HxDividerAlign>();\n}\n","import { booleanAttribute, Directive, input } from '@angular/core';\n\nexport type HxInputSize = 'small' | 'medium' | 'large';\nexport type HxInputVariant = 'outlined' | 'filled';\n\n/**\n * A native `<input>` or `<textarea>` styled as a Helix text field. It works with template-driven forms,\n * reactive forms and signal forms unchanged: the element stays a native control.\n *\n * ```html\n * <label for=\"name\">Name</label>\n * <input hx-input id=\"name\" [(ngModel)]=\"name\" />\n * <textarea hx-input variant=\"filled\" rows=\"4\"></textarea>\n * <input hx-input [attr.aria-invalid]=\"invalid() ? 'true' : null\" aria-describedby=\"name-error\" />\n * ```\n *\n * The invalid look comes from `aria-invalid=\"true\"` (set it yourself or let the forms API do it) and from\n * Angular's `ng-invalid ng-touched` classes. Always give a field a visible `<label>`; a placeholder is a hint.\n */\n@Directive({\n selector: 'input[hx-input], textarea[hx-input]',\n exportAs: 'hx-input',\n host: {\n class: 'hx-input',\n '[class.hx-input-filled]': \"variant() === 'filled'\",\n '[class.hx-input-sm]': \"size() === 'small'\",\n '[class.hx-input-lg]': \"size() === 'large'\",\n '[class.hx-input-fluid]': 'fluid()',\n },\n})\nexport class HxInput {\n /** `outlined` (default) or a tinted `filled` field. */\n readonly variant = input<HxInputVariant>('outlined');\n\n readonly size = input<HxInputSize>('medium');\n\n /** Takes the full width of the container. */\n readonly fluid = input(false, { transform: booleanAttribute });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n type ElementRef,\n forwardRef,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { HxInput, type HxInputSize, type HxInputVariant } from '../input/input';\n\nlet nextId = 0;\n\n/**\n * A password field with a button that shows or hides the text. Works with `ngModel`, reactive forms and\n * signal forms (`[formField]`).\n *\n * ```html\n * <label for=\"pw\">Password</label>\n * <hx-password inputId=\"pw\" [(ngModel)]=\"password\" toggleMask fluid />\n * ```\n */\n@Component({\n selector: 'hx-password',\n imports: [HxInput],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => HxPassword), multi: true },\n ],\n host: {\n class: 'hx-password',\n '[class.hx-password-fluid]': 'fluid()',\n '[class.hx-password-has-toggle]': 'toggleMask()',\n },\n template: `\n <input\n #field\n hx-input\n [id]=\"inputId() ?? defaultId\"\n [type]=\"visible() ? 'text' : 'password'\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [fluid]=\"true\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n />\n @if (toggleMask()) {\n <button\n type=\"button\"\n class=\"hx-password-toggle\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"visible() ? hideLabel() : showLabel()\"\n [attr.aria-pressed]=\"visible()\"\n (click)=\"visible.set(!visible())\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"1em\" height=\"1em\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n @if (visible()) {\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <path d=\"m1 1 22 22\" />\n } @else {\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n }\n </svg>\n </button>\n }\n `,\n})\nexport class HxPassword implements ControlValueAccessor, FormValueControl<string> {\n readonly placeholder = input('');\n readonly inputId = input<string>();\n readonly ariaLabel = input<string>();\n readonly ariaLabelledby = input<string>();\n readonly autocomplete = input('current-password');\n readonly size = input<HxInputSize>('medium');\n readonly variant = input<HxInputVariant>('outlined');\n readonly fluid = input(false, { transform: booleanAttribute });\n /** Shows the button that reveals the text. */\n readonly toggleMask = input(false, { transform: booleanAttribute });\n readonly showLabel = input('Show password');\n readonly hideLabel = input('Hide password');\n\n // The signal-forms contract (FormValueControl): value, disabled, invalid, touch.\n readonly value = model('');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n\n protected readonly defaultId = `hx-password-${nextId++}`;\n protected readonly visible = signal(false);\n readonly #cvaDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.#cvaDisabled());\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\n\n #onChange: (value: string) => void = () => {};\n #onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.#onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.#cvaDisabled.set(disabled);\n }\n\n focus(options?: FocusOptions): void {\n this.field().nativeElement.focus(options);\n }\n\n protected onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.value.set(value);\n this.#onChange(value);\n }\n\n protected onBlur(): void {\n this.#onTouched();\n this.touch.emit();\n }\n}\n","import { Directive, input } from '@angular/core';\n\nexport type HxRadioSize = 'small' | 'medium' | 'large';\n\n/**\n * A native `<input type=\"radio\">` drawn as a Helix radio button (CSS only). Group radios with the same\n * `name` (or a forms API's `formControlName`/`ngModel` name) exactly as with native radios; arrow keys move\n * the selection natively.\n *\n * ```html\n * <label><input type=\"radio\" hx-radio name=\"plan\" value=\"free\" [(ngModel)]=\"plan\" /> Free</label>\n * <label><input type=\"radio\" hx-radio name=\"plan\" value=\"pro\" [(ngModel)]=\"plan\" /> Pro</label>\n * ```\n */\n@Directive({\n selector: 'input[hx-radio]',\n exportAs: 'hx-radio',\n host: {\n class: 'hx-radio',\n '[class.hx-radio-sm]': \"size() === 'small'\",\n '[class.hx-radio-lg]': \"size() === 'large'\",\n },\n})\nexport class HxRadio {\n readonly size = input<HxRadioSize>('medium');\n}\n","import { CdkListbox, CdkOption, type ListboxValueChangeEvent } from '@angular/cdk/listbox';\nimport {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n Injector,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nexport type HxSelectSize = 'small' | 'medium' | 'large';\nexport type HxSelectVariant = 'outlined' | 'filled';\n\n/** An option as the select works with it, after `optionLabel`/`optionValue`/`optionDisabled` are applied. */\nexport interface HxSelectItem<V = unknown> {\n label: string;\n value: V;\n disabled: boolean;\n}\n\ntype Accessor<O, R> = string | ((option: O) => R);\n\nlet nextId = 0;\n\n/**\n * A single-value select: a `combobox` button that opens a listbox in a CDK connected overlay (typeahead,\n * Arrow/Home/End/Enter/Escape from the CDK listbox). A real form control for template-driven, reactive and\n * signal forms.\n *\n * ```html\n * <label for=\"city\">City</label>\n * <hx-select inputId=\"city\" [options]=\"cities\" optionLabel=\"name\" optionValue=\"code\"\n * placeholder=\"Select a city\" [(ngModel)]=\"city\" />\n * <hx-select [options]=\"['Small', 'Medium', 'Large']\" [formField]=\"form.size\" />\n * ```\n *\n * `options` may hold primitives (label = the value as text) or objects (`optionLabel`, `optionValue` and\n * `optionDisabled` name a key or give a function; defaults `label`, `value` and `disabled`).\n * Give the select a visible `<label for>` (with `inputId`) or an `ariaLabel`.\n */\n@Component({\n selector: 'hx-select',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkListbox, CdkOption],\n templateUrl: './select.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => HxSelect), multi: true }],\n host: {\n class: 'hx-select',\n '[class.hx-select-open]': 'open()',\n '[class.hx-select-filled]': \"variant() === 'filled'\",\n '[class.hx-select-sm]': \"size() === 'small'\",\n '[class.hx-select-lg]': \"size() === 'large'\",\n '[class.hx-select-fluid]': 'fluid()',\n '[class.hx-select-disabled]': 'isDisabled()',\n '[class.hx-select-has-clear]': 'canClear()',\n '[class.hx-select-invalid]': 'invalid()',\n '(focusout)': 'onFocusOut($event)',\n },\n})\nexport class HxSelect<V = unknown> implements ControlValueAccessor, FormValueControl<V | null> {\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #injector = inject(Injector);\n\n /** The options: primitives or objects. */\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<Accessor<never, string>>('label');\n readonly optionValue = input<Accessor<never, unknown>>('value');\n readonly optionDisabled = input<Accessor<never, boolean>>('disabled');\n readonly placeholder = input('');\n readonly emptyMessage = input('No options');\n readonly size = input<HxSelectSize>('medium');\n readonly variant = input<HxSelectVariant>('outlined');\n readonly fluid = input(false, { transform: booleanAttribute });\n /** Shows a button that resets the value to `null`. */\n readonly showClear = input(false, { transform: booleanAttribute });\n /** The `id` of the trigger, for a `<label for>`. */\n readonly inputId = input<string>();\n readonly ariaLabel = input<string>();\n readonly ariaLabelledby = input<string>();\n /** How values are compared to find the selected option (default: `Object.is`). */\n readonly compareWith = input<(a: unknown, b: unknown) => boolean>(Object.is);\n\n // The signal-forms contract (FormValueControl): value, disabled, invalid, touch.\n readonly value = model<V | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n\n readonly open = signal(false);\n protected readonly panelWidth = signal(0);\n protected readonly panelId = `hx-select-panel-${nextId++}`;\n protected readonly positions: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 2 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -2 },\n ];\n\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly listbox = viewChild(CdkListbox);\n\n readonly #cvaDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.#cvaDisabled());\n\n protected readonly items = computed<HxSelectItem[]>(() => {\n const label = this.optionLabel() as Accessor<unknown, string>;\n const value = this.optionValue() as Accessor<unknown, unknown>;\n const disabled = this.optionDisabled() as Accessor<unknown, boolean>;\n return this.options().map((option) => {\n if (option === null || typeof option !== 'object') {\n return { label: String(option), value: option, disabled: false };\n }\n const read = <R>(accessor: Accessor<unknown, R>, fallback: R) =>\n typeof accessor === 'function'\n ? accessor(option)\n : accessor in option\n ? ((option as Record<string, unknown>)[accessor] as R)\n : fallback;\n return {\n label: String(read(label, '')),\n value: read(value, option),\n disabled: Boolean(read(disabled, false)),\n };\n });\n });\n\n protected readonly selected = computed(() => {\n const compare = this.compareWith();\n const current = this.value();\n return current === null ? undefined : this.items().find((item) => compare(item.value, current));\n });\n\n protected readonly canClear = computed(\n () => this.showClear() && !!this.selected() && !this.isDisabled(),\n );\n\n protected readonly selectedValues = computed(() => {\n const item = this.selected();\n return item ? [item.value] : [];\n });\n\n #onChange: (value: V | null) => void = () => {};\n #onTouched: () => void = () => {};\n\n // ControlValueAccessor (template-driven and reactive forms)\n writeValue(value: V | null): void {\n this.value.set(value ?? null);\n }\n registerOnChange(fn: (value: V | null) => void): void {\n this.#onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.#cvaDisabled.set(disabled);\n }\n\n /** Focuses the trigger (signal forms call this to focus the control). */\n focus(options?: FocusOptions): void {\n this.trigger().nativeElement.focus(options);\n }\n\n protected toggle(): void {\n if (this.open()) this.close();\n else this.show();\n }\n\n protected show(): void {\n if (this.isDisabled() || this.open()) return;\n this.panelWidth.set(this.#host.nativeElement.getBoundingClientRect().width);\n this.open.set(true);\n }\n\n protected close(refocus = false): void {\n if (!this.open()) return;\n this.open.set(false);\n if (refocus) this.focus();\n }\n\n protected onAttach(): void {\n // the listbox lives in the overlay template: focus it once it has rendered\n afterNextRender(() => this.listbox()?.focus(), { injector: this.#injector });\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n this.show();\n }\n }\n\n protected onOverlayKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close(true);\n } else if (event.key === 'Tab') {\n this.close();\n }\n }\n\n protected onOutsideClick(event: MouseEvent): void {\n if (!this.#host.nativeElement.contains(event.target as Node)) this.close();\n }\n\n protected onSelect(event: ListboxValueChangeEvent<unknown>): void {\n const [picked] = event.value;\n this.#commit((picked ?? null) as V | null);\n this.close(true);\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.#commit(null);\n this.focus();\n }\n\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (this.open() || (next && this.#host.nativeElement.contains(next))) return;\n this.#touched();\n }\n\n #commit(value: V | null): void {\n this.value.set(value);\n this.#onChange(value);\n }\n\n #touched(): void {\n this.#onTouched();\n this.touch.emit();\n }\n}\n","<button\n #trigger\n type=\"button\"\n class=\"hx-select-trigger\"\n role=\"combobox\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId() ?? null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span class=\"hx-select-label\" [class.hx-select-placeholder]=\"!selected()\">{{\n selected()?.label ?? placeholder()\n }}</span>\n <svg class=\"hx-select-chevron\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m3 5.5 4 4 4-4\" />\n </svg>\n</button>\n@if (canClear()) {\n <button type=\"button\" class=\"hx-select-clear\" aria-label=\"Clear selection\" (click)=\"clear($event)\">\n <svg viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" aria-hidden=\"true\">\n <path d=\"m3.5 3.5 7 7M10.5 3.5l-7 7\" />\n </svg>\n </button>\n}\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayPanelClass=\"hx-select-overlay\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"panelWidth()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n (attach)=\"onAttach()\"\n (detach)=\"close()\"\n>\n <div class=\"hx-select-panel\">\n <div\n cdkListbox\n class=\"hx-select-list\"\n [id]=\"panelId\"\n [cdkListboxValue]=\"selectedValues()\"\n [cdkListboxUseActiveDescendant]=\"true\"\n [cdkListboxCompareWith]=\"compareWith()\"\n [attr.aria-label]=\"ariaLabel() ?? placeholder() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (cdkListboxValueChange)=\"onSelect($event)\"\n >\n @for (item of items(); track $index) {\n <div\n class=\"hx-select-option\"\n [cdkOption]=\"item.value\"\n [cdkOptionDisabled]=\"item.disabled\"\n [cdkOptionTypeaheadLabel]=\"item.label\"\n >\n <span class=\"hx-select-check\" aria-hidden=\"true\"></span>\n <span>{{ item.label }}</span>\n </div>\n } @empty {\n <div class=\"hx-select-empty\">{{ emptyMessage() }}</div>\n }\n </div>\n </div>\n</ng-template>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nexport type HxSelectButtonSize = 'small' | 'medium' | 'large';\n\n/** A string is the name of a property of the option; a function reads it. */\ntype Accessor<T> = string | ((option: never) => T);\n\ninterface Item {\n label: string;\n value: unknown;\n disabled: boolean;\n}\n\n/**\n * A choice among a few options shown as a joined group of toggle buttons. Single choice by default,\n * `multiple` for a list of values. The buttons are native buttons with `aria-pressed`.\n *\n * ```html\n * <hx-select-button [options]=\"['Left', 'Center', 'Right']\" [(ngModel)]=\"align\" [allowEmpty]=\"false\" />\n * ```\n */\n@Component({\n selector: 'hx-select-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => HxSelectButton), multi: true },\n ],\n host: {\n class: 'hx-select-button',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n '[class.hx-select-button-sm]': \"size() === 'small'\",\n '[class.hx-select-button-lg]': \"size() === 'large'\",\n '[class.hx-select-button-fluid]': 'fluid()',\n '[class.hx-select-button-invalid]': 'invalid()',\n '[class.hx-select-button-disabled]': 'isDisabled()',\n },\n template: `\n @for (item of items(); track $index) {\n <button\n type=\"button\"\n class=\"hx-select-button-option\"\n [class.hx-select-button-option-checked]=\"isChecked(item)\"\n [attr.aria-pressed]=\"isChecked(item)\"\n [disabled]=\"isDisabled() || item.disabled\"\n (click)=\"toggle(item)\"\n (blur)=\"onBlur()\"\n >\n <span class=\"hx-select-button-content\">{{ item.label }}</span>\n </button>\n }\n `,\n})\nexport class HxSelectButton implements ControlValueAccessor, FormValueControl<unknown> {\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<Accessor<string>>('label');\n readonly optionValue = input<Accessor<unknown>>('value');\n readonly optionDisabled = input<Accessor<boolean>>('disabled');\n /** Several options can be chosen; the value is then an array. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Whether the chosen option can be switched off again (single choice). */\n readonly allowEmpty = input(true, { transform: booleanAttribute });\n readonly size = input<HxSelectButtonSize>('medium');\n readonly fluid = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string>();\n readonly ariaLabelledby = input<string>();\n\n // The signal-forms contract (FormValueControl): value, disabled, invalid, touch.\n readonly value = model<unknown>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n\n readonly #cvaDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.#cvaDisabled());\n\n protected readonly items = computed<Item[]>(() => {\n const label = this.optionLabel() as Accessor<string>;\n const value = this.optionValue() as Accessor<unknown>;\n const disabled = this.optionDisabled() as Accessor<boolean>;\n return this.options().map((option) => {\n if (option === null || typeof option !== 'object') {\n return { label: String(option), value: option, disabled: false };\n }\n const read = <R>(accessor: Accessor<R>, fallback: R): R =>\n typeof accessor === 'function'\n ? (accessor as (o: unknown) => R)(option)\n : accessor in option\n ? ((option as Record<string, unknown>)[accessor] as R)\n : fallback;\n return {\n label: String(read(label, '')),\n value: read(value, option),\n disabled: Boolean(read(disabled, false)),\n };\n });\n });\n\n #onChange: (value: unknown) => void = () => {};\n #onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n this.value.set(value ?? (this.multiple() ? [] : null));\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.#onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.#cvaDisabled.set(disabled);\n }\n\n protected isChecked(item: Item): boolean {\n const current = this.value();\n return this.multiple()\n ? Array.isArray(current) && current.some((v) => Object.is(v, item.value))\n : Object.is(current, item.value);\n }\n\n protected toggle(item: Item): void {\n const checked = this.isChecked(item);\n let next: unknown;\n if (this.multiple()) {\n const current = Array.isArray(this.value()) ? (this.value() as unknown[]) : [];\n next = checked ? current.filter((v) => !Object.is(v, item.value)) : [...current, item.value];\n } else if (checked) {\n if (!this.allowEmpty()) return;\n next = null;\n } else {\n next = item.value;\n }\n this.value.set(next);\n this.#onChange(next);\n }\n\n protected onBlur(): void {\n this.#onTouched();\n this.touch.emit();\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * A native `<input type=\"checkbox\">` with `role=\"switch\"`, drawn as a Helix toggle switch (CSS only).\n * Use it for a setting that takes effect immediately; label it with the setting's name, not the action.\n *\n * ```html\n * <label><input type=\"checkbox\" hx-switch [(ngModel)]=\"darkMode\" /> Dark mode</label>\n * ```\n */\n@Directive({\n selector: 'input[hx-switch]',\n exportAs: 'hx-switch',\n host: {\n class: 'hx-switch',\n role: 'switch',\n },\n})\nexport class HxSwitch {}\n","// The surface scales the theme service offers: the neutral scales of Tailwind and three Helix extras. Each is the\n// 12 steps of `--h-surface-0 … --h-surface-950`; the scale replaces the surface of both colour schemes.\nexport const HX_SURFACES = {\n slate: {\n 0: '#ffffff',\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n gray: {\n 0: '#ffffff',\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n zinc: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f4f4f5',\n 200: '#e4e4e7',\n 300: '#d4d4d8',\n 400: '#a1a1aa',\n 500: '#71717a',\n 600: '#52525b',\n 700: '#3f3f46',\n 800: '#27272a',\n 900: '#18181b',\n 950: '#09090b',\n },\n neutral: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#e5e5e5',\n 300: '#d4d4d4',\n 400: '#a3a3a3',\n 500: '#737373',\n 600: '#525252',\n 700: '#404040',\n 800: '#262626',\n 900: '#171717',\n 950: '#0a0a0a',\n },\n stone: {\n 0: '#ffffff',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d6d3d1',\n 400: '#a8a29e',\n 500: '#78716c',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#0c0a09',\n },\n soho: {\n 0: '#ffffff',\n 50: '#ececec',\n 100: '#dedfdf',\n 200: '#c4c4c6',\n 300: '#adaeb0',\n 400: '#97979b',\n 500: '#7f8084',\n 600: '#6a6b70',\n 700: '#55565b',\n 800: '#3f4046',\n 900: '#2c2c34',\n 950: '#16161d',\n },\n viva: {\n 0: '#ffffff',\n 50: '#f3f3f3',\n 100: '#e7e7e8',\n 200: '#cfd0d0',\n 300: '#b7b8b9',\n 400: '#9fa1a1',\n 500: '#87898a',\n 600: '#6e7173',\n 700: '#565a5b',\n 800: '#3e4244',\n 900: '#262b2c',\n 950: '#0e1315',\n },\n ocean: {\n 0: '#ffffff',\n 50: '#fbfcfc',\n 100: '#F7F9F8',\n 200: '#EFF3F2',\n 300: '#DADEDD',\n 400: '#B1B7B6',\n 500: '#828787',\n 600: '#5F7274',\n 700: '#415B61',\n 800: '#29444E',\n 900: '#183240',\n 950: '#0c1920',\n },\n} as const;\n\nexport type HxSurface = keyof typeof HX_SURFACES;\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n type EnvironmentProviders,\n effect,\n Injectable,\n InjectionToken,\n inject,\n makeEnvironmentProviders,\n PLATFORM_ID,\n provideEnvironmentInitializer,\n signal,\n} from '@angular/core';\nimport { HX_SURFACES, type HxSurface } from './surfaces';\n\n/** The colour scales an app can choose as its primary colour; `noir` uses the surface scale (black and white). */\nexport const HX_PRIMARY_COLORS = [\n 'emerald',\n 'green',\n 'lime',\n 'orange',\n 'amber',\n 'yellow',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n 'noir',\n] as const;\nexport type HxPrimaryColor = (typeof HX_PRIMARY_COLORS)[number];\nexport const HX_SURFACE_NAMES = Object.keys(HX_SURFACES) as HxSurface[];\nexport type { HxSurface };\n\nconst STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const;\nconst SURFACE_STEPS = [0, ...STEPS] as const;\n\nexport interface HxThemeOptions {\n /**\n * How dark mode is switched on: a class on `<html>` (`.app-dark`, the default, also the selector of\n * `tokens.css`) or an attribute (`[data-theme=\"dark\"]`).\n */\n darkSelector?: string;\n /** Where the choice is remembered (localStorage). `null` (the default) remembers nothing. */\n storageKey?: string | null;\n /** Dark mode when nothing is remembered; by default the system setting (`prefers-color-scheme`). */\n dark?: boolean;\n /** The primary colour when nothing is remembered; `null` is the one of the preset (indigo). */\n primary?: HxPrimaryColor | null;\n /** The surface scale when nothing is remembered; `null` is the one of the preset. */\n surface?: HxSurface | null;\n /**\n * Cross-fades the page when dark mode is switched, with the View Transitions API where the browser has it\n * (the first value at start-up is applied at once). Default `false`.\n */\n viewTransition?: boolean;\n}\n\n/** The scales of the surfaces, by name: for swatches in a colour chooser (`HX_SURFACES.zinc[500]`). */\nexport { HX_SURFACES };\n\nexport const HX_THEME_OPTIONS = new InjectionToken<HxThemeOptions>('HX_THEME_OPTIONS', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\ninterface Saved {\n dark?: boolean;\n primary?: HxPrimaryColor | null;\n surface?: HxSurface | null;\n}\n\n/** A class (`.app-dark`) or an attribute (`[data-theme=\"dark\"]`) selector, split into what the DOM needs. */\nexport function parseDarkSelector(selector: string): {\n css: string;\n apply: (el: Element, on: boolean) => void;\n} {\n const cls = /^\\.([a-zA-Z][\\w-]*)$/.exec(selector);\n if (cls) {\n return { css: selector, apply: (el, on) => el.classList.toggle(cls[1], on) };\n }\n const attr = /^\\[([\\w-]+)(?:=[\"']?([^\"'\\]]+)[\"']?)?\\]$/.exec(selector);\n if (attr) {\n const [, name, value = ''] = attr;\n return {\n css: selector,\n apply: (el, on) => (on ? el.setAttribute(name, value) : el.removeAttribute(name)),\n };\n }\n throw new Error(\n `HxTheme darkSelector \"${selector}\": use a class (\".app-dark\") or an attribute (\"[data-theme=dark]\")`,\n );\n}\n\nconst scale = (name: string) =>\n STEPS.map((step) => `--h-primary-${step}:var(--h-${name}-${step});`).join('');\n\n/** The primary colour: its scale, and for `noir` the scheme-dependent roles that are no scale step. */\nfunction primaryCss(primary: HxPrimaryColor, dark: string): string {\n if (primary !== 'noir') return `:root:root{${scale(primary)}}`;\n const light =\n `${STEPS.map((step) => `--h-primary-${step}:var(--h-surface-${step});`).join('')}` +\n '--h-primary-color:var(--h-primary-950);--h-primary-contrast-color:#ffffff;' +\n '--h-primary-hover-color:var(--h-primary-800);--h-primary-active-color:var(--h-primary-700);' +\n '--h-highlight-background:var(--h-primary-950);--h-highlight-focus-background:var(--h-primary-700);' +\n '--h-highlight-color:#ffffff;--h-highlight-focus-color:#ffffff;';\n const night =\n '--h-primary-color:var(--h-primary-50);--h-primary-contrast-color:var(--h-primary-950);' +\n '--h-primary-hover-color:var(--h-primary-200);--h-primary-active-color:var(--h-primary-300);' +\n '--h-highlight-background:var(--h-primary-50);--h-highlight-focus-background:var(--h-primary-300);' +\n '--h-highlight-color:var(--h-primary-950);--h-highlight-focus-color:var(--h-primary-950);';\n return `:root:root{${light}}:root:root${dark}{${night}}`;\n}\n\n/** The surface scale, the same in both colour schemes (as the configurator of the shell always did). */\nfunction surfaceCss(surface: HxSurface, dark: string): string {\n const palette = HX_SURFACES[surface] as Record<number, string>;\n const body = SURFACE_STEPS.map((step) => `--h-surface-${step}:${palette[step]};`).join('');\n return `:root:root{${body}}:root:root${dark}{${body}}`;\n}\n\n/**\n * Switches dark mode, the primary colour and the surface scale while the app runs, with CSS custom properties\n * only: no styling engine, no rebuild of the tokens. `tokens.css` defines every `--h-*` token for the Helix look;\n * this service overrides the ones that carry the colour choice, in a style sheet of its own that wins over\n * `tokens.css` in both colour schemes.\n *\n * ```ts\n * // app.config.ts\n * provideHxTheme({ storageKey: 'my-app-theme' })\n *\n * // anywhere\n * readonly theme = inject(HxTheme);\n * theme.toggleDark();\n * theme.setPrimary('emerald');\n * theme.setSurface('zinc');\n * ```\n *\n * Nothing touches the DOM on the server; `css()` is the style text, for an app that renders it itself.\n */\n@Injectable({ providedIn: 'root' })\nexport class HxTheme {\n readonly #doc = inject(DOCUMENT);\n readonly #browser = isPlatformBrowser(inject(PLATFORM_ID));\n readonly #options = inject(HX_THEME_OPTIONS);\n readonly #darkSelector = parseDarkSelector(this.#options.darkSelector ?? '.app-dark');\n readonly #saved = this.#load();\n\n readonly #dark = signal(this.#saved.dark ?? this.#options.dark ?? this.#systemDark());\n readonly #primary = signal<HxPrimaryColor | null>(\n this.#saved.primary ?? this.#options.primary ?? null,\n );\n readonly #surface = signal<HxSurface | null>(\n this.#saved.surface ?? this.#options.surface ?? null,\n );\n\n readonly dark = this.#dark.asReadonly();\n readonly primary = this.#primary.asReadonly();\n readonly surface = this.#surface.asReadonly();\n\n /** The overrides for the chosen primary colour and surface (empty while both are the preset's own). */\n readonly css = computed(() => {\n const dark = this.#darkSelector.css;\n const primary = this.#primary();\n const surface = this.#surface();\n return `${surface ? surfaceCss(surface, dark) : ''}${primary ? primaryCss(primary, dark) : ''}`;\n });\n\n #darkApplied = false;\n #write: ((css: string) => void) | null = null;\n #remove: (() => void) | null = null;\n\n constructor() {\n effect(() => {\n const dark = this.#dark();\n if (!this.#browser) return;\n const root = this.#doc.documentElement;\n const doc = this.#doc as Document & { startViewTransition?: (update: () => void) => unknown };\n const apply = () => this.#darkSelector.apply(root, dark);\n // the first value is the start-up state: nothing to cross-fade from\n if (this.#darkApplied && this.#options.viewTransition && doc.startViewTransition) {\n doc.startViewTransition(apply);\n } else {\n apply();\n }\n this.#darkApplied = true;\n });\n effect(() => {\n const css = this.css();\n if (this.#browser) this.#writeSheet(css);\n });\n effect(() =>\n this.#save({ dark: this.#dark(), primary: this.#primary(), surface: this.#surface() }),\n );\n // an instance that is not the root one (provided on a component) takes its overrides with it\n inject(DestroyRef).onDestroy(() => this.#remove?.());\n }\n\n setDark(dark: boolean): void {\n this.#dark.set(dark);\n }\n\n toggleDark(): void {\n this.#dark.update((dark) => !dark);\n }\n\n /** `null` goes back to the primary colour of the preset. */\n setPrimary(primary: HxPrimaryColor | null): void {\n if (primary !== null && !HX_PRIMARY_COLORS.includes(primary))\n throw new Error(`unknown primary colour \"${primary}\"`);\n this.#primary.set(primary);\n }\n\n /** `null` goes back to the surface scale of the preset. */\n setSurface(surface: HxSurface | null): void {\n if (surface !== null && !(surface in HX_SURFACES))\n throw new Error(`unknown surface \"${surface}\"`);\n this.#surface.set(surface);\n }\n\n #systemDark(): boolean {\n const view = this.#doc.defaultView;\n return this.#browser && !!view?.matchMedia?.('(prefers-color-scheme: dark)').matches;\n }\n\n #load(): Saved {\n const key = this.#options.storageKey;\n if (!this.#browser || !key) return {};\n try {\n const value = JSON.parse(\n this.#doc.defaultView?.localStorage.getItem(key) ?? 'null',\n ) as Saved | null;\n return value && typeof value === 'object' ? value : {};\n } catch {\n return {}; // blocked or damaged storage: start from the defaults\n }\n }\n\n #save(state: Saved): void {\n const key = this.#options.storageKey;\n if (!this.#browser || !key) return;\n try {\n this.#doc.defaultView?.localStorage.setItem(key, JSON.stringify(state));\n } catch {\n // storage full or blocked: the choice just does not survive a reload\n }\n }\n\n /** One style sheet of the service: a constructed one where the browser has them, else a `<style>`. */\n #writeSheet(css: string): void {\n if (!this.#write) {\n const doc = this.#doc;\n const view = doc.defaultView as (Window & { CSSStyleSheet?: typeof CSSStyleSheet }) | null;\n if (\n view?.CSSStyleSheet &&\n 'adoptedStyleSheets' in doc &&\n 'replaceSync' in view.CSSStyleSheet.prototype\n ) {\n const sheet = new view.CSSStyleSheet();\n doc.adoptedStyleSheets = [...doc.adoptedStyleSheets, sheet];\n this.#write = (text) => sheet.replaceSync(text);\n this.#remove = () => {\n doc.adoptedStyleSheets = doc.adoptedStyleSheets.filter((s) => s !== sheet);\n };\n } else {\n const style = doc.createElement('style');\n style.setAttribute('data-hx-theme', '');\n doc.head.appendChild(style);\n this.#write = (text) => {\n style.textContent = text;\n };\n this.#remove = () => style.remove();\n }\n }\n this.#write(css);\n }\n}\n\n/** Provides the theme service with its options and creates it at start-up, so the saved choice applies at once. */\nexport function provideHxTheme(options: HxThemeOptions = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: HX_THEME_OPTIONS, useValue: options },\n provideEnvironmentInitializer(() => {\n inject(HxTheme);\n }),\n ]);\n}\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Directive,\n ElementRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nexport type HxTooltipPosition = 'top' | 'right' | 'bottom' | 'left';\nexport type HxTooltipEvent = 'hover' | 'focus' | 'both';\n\nlet nextId = 0;\n\n/** The bubble. Created by the directive in a CDK overlay. */\n@Component({\n selector: 'hx-tooltip-bubble',\n template: '{{ text() }}',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'hx-tooltip', role: 'tooltip', '[id]': 'id' },\n})\nexport class HxTooltipBubble {\n readonly text = signal('');\n id = '';\n}\n\nconst POSITIONS = {\n top: { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' },\n bottom: { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' },\n left: { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' },\n right: { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' },\n} as const;\n\n/** Where to flip to when the preferred side does not fit. */\nconst OPPOSITE: Record<HxTooltipPosition, HxTooltipPosition> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/**\n * A short text that explains an element, shown on hover and/or keyboard focus (CDK overlay, `role=\"tooltip\"`,\n * `aria-describedby` on the host). Escape closes it. It is a hint, not a place for essential information.\n *\n * ```html\n * <button hx-button iconOnly aria-label=\"Add\" hx-tooltip=\"Add item\" hxTooltipPosition=\"right\">+</button>\n * ```\n */\n@Directive({\n selector: '[hx-tooltip]',\n host: {\n '[attr.aria-describedby]': 'shown() ? bubbleId : null',\n '(mouseenter)': 'onEnter(\"hover\")',\n '(mouseleave)': 'onLeave(\"hover\")',\n '(focusin)': 'onEnter(\"focus\")',\n '(focusout)': 'onLeave(\"focus\")',\n '(keydown.escape)': 'hide()',\n '(click)': 'hide()',\n },\n})\nexport class HxTooltip {\n readonly #overlay = inject(Overlay);\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The text. Empty or null shows nothing. */\n readonly text = input<string | null | undefined>('', { alias: 'hx-tooltip' });\n readonly position = input<HxTooltipPosition>('top', { alias: 'hxTooltipPosition' });\n readonly event = input<HxTooltipEvent>('both', { alias: 'hxTooltipEvent' });\n readonly disabled = input(false, { alias: 'hxTooltipDisabled' });\n /** Milliseconds before it appears. */\n readonly showDelay = input(0, { alias: 'hxTooltipShowDelay' });\n\n protected readonly bubbleId = `hx-tooltip-${nextId++}`;\n protected readonly shown = signal(false);\n #ref: OverlayRef | null = null;\n #bubble: HxTooltipBubble | null = null;\n #timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.dispose());\n // keep a visible bubble in sync with the inputs, and drop it when it has nothing to say\n effect(() => {\n const text = this.text();\n if (this.disabled() || !text) this.hide();\n else if (this.#bubble) this.#bubble.text.set(text);\n this.position();\n this.#ref?.updatePositionStrategy(this.#strategy());\n });\n }\n\n protected onEnter(source: 'hover' | 'focus'): void {\n const event = this.event();\n if (event !== 'both' && event !== source) return;\n this.show();\n }\n\n protected onLeave(source: 'hover' | 'focus'): void {\n const event = this.event();\n if (event !== 'both' && event !== source) return;\n this.hide();\n }\n\n #strategy() {\n const preferred = this.position();\n const margin = 4;\n const offset = (p: HxTooltipPosition) =>\n p === 'top'\n ? { offsetY: -margin }\n : p === 'bottom'\n ? { offsetY: margin }\n : p === 'left'\n ? { offsetX: -margin }\n : { offsetX: margin };\n return this.#overlay\n .position()\n .flexibleConnectedTo(this.#host)\n .withPositions(\n [preferred, OPPOSITE[preferred]].map((p) => ({ ...POSITIONS[p], ...offset(p) })),\n )\n .withPush(true);\n }\n\n show(): void {\n const text = this.text();\n if (this.disabled() || !text || this.#ref) return;\n clearTimeout(this.#timer);\n const delay = this.showDelay();\n if (delay > 0) this.#timer = setTimeout(() => this.#create(text), delay);\n else this.#create(text);\n }\n\n #create(text: string): void {\n if (this.#ref) return;\n this.#ref = this.#overlay.create({\n positionStrategy: this.#strategy(),\n scrollStrategy: this.#overlay.scrollStrategies.close(),\n panelClass: 'hx-tooltip-overlay',\n });\n const bubble = this.#ref.attach(new ComponentPortal(HxTooltipBubble));\n bubble.instance.id = this.bubbleId;\n bubble.instance.text.set(text);\n this.#bubble = bubble.instance;\n this.shown.set(true);\n }\n\n hide(): void {\n clearTimeout(this.#timer);\n this.dispose();\n }\n\n private dispose(): void {\n clearTimeout(this.#timer);\n this.#ref?.dispose();\n this.#ref = null;\n this.#bubble = null;\n this.shown.set(false);\n }\n}\n"],"mappings":";;;;;;;;AA+BA,IAAa,eAAb,MAAa,aAAY;CACd,QAAQ,MAAmC,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAC9C,OAAO,MAAyB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CAEhC,YAAY,MAAM,cAAa,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,gCAAA,CAAA,CAAA;CAE9B,QAAK;EACb,OAAO,KAAK,MAAK,CAAE,CAAC,QAAQ,SAAS,KAAK,YAAY,KAAK;CAC7D;CARW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAZ,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAY,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,gBAAA;EAAA,UAAA;EAAA,UC/BzB;EAoCA,cAAA,CAAA;GAAA,MAAA;GAAA,MDVY;GAAU,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAgB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAK3B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAY,YAAA,CAAA;EAPxB,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAe,SAChB,CAAC,YAAY,gBAAgB;GAAC,iBAEtB,wBAAwB;GAAM,MACzC,EAAE,OAAO,gBAAe;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEwBlC,IAAa,WAAb,MAAa,SAAQ;CAEV,UAAU,MAAuB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CAG1C,WAAW,MAAwB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,gCAAA,CAAA,CAAA;CAE7C,OAAO,MAAoB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CAGpC,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGpD,SAAS,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGnD,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGlD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAGrD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAE7D,cAAA;EAGE,MAAM,OAAO,OAAgC,UAAU,CAAC,CAAC;EACzD,MAAM,SAAS,UAAgB;GAC7B,IAAI,KAAK,QAAO,KAAM,KAAK,aAAa,eAAe,MAAM,QAAQ;IACnE,MAAM,eAAc;IACpB,MAAM,yBAAwB;GAChC;EACF;EACA,KAAK,iBAAiB,SAAS,OAAO,IAAI;EAC1C,OAAO,UAAU,CAAC,CAAC,gBAAgB,KAAK,oBAAoB,SAAS,OAAO,IAAI,CAAC;CACnF;CApCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,4BAAA;IAAA,wBAAA;IAAA,wBAAA;IAAA,6BAAA;IAAA,2BAAA;IAAA,wBAAA;IAAA,wBAAA;IAAA,wBAAA;IAAA,0BAAA;IAAA,4BAAA;IAAA,sBAAA;IAAA,sBAAA;IAAA,2BAAA;IAAA,0BAAA;IAAA,yBAAA;IAAA,6BAAA;IAAA,2BAAA;IAAA,kBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA,CAAA,WAAA;EAAA,UAAA;CAAA,CAAA;;AAAR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAzBpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,MAAM;IACJ,OAAO;IACP,8BAA8B;IAC9B,0BAA0B;IAC1B,0BAA0B;IAC1B,+BAA+B;IAC/B,6BAA6B;IAC7B,0BAA0B;IAC1B,0BAA0B;IAC1B,0BAA0B;IAC1B,4BAA4B;IAC5B,8BAA8B;IAC9B,wBAAwB;IACxB,wBAAwB;IACxB,6BAA6B;IAC7B,4BAA4B;IAC5B,2BAA2B;IAC3B,+BAA+B;IAC/B,6BAA6B;IAC7B,oBAAoB;GACrB;EACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1BD,IAAa,aAAb,MAAa,WAAU;CACZ,OAAO,MAAsB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CADpC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,MAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,wBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA,CAAA,aAAA;EAAA,UAAA;CAAA,CAAA;;AAAV,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EATtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,MAAM;IACJ,OAAO;IACP,0BAA0B;IAC1B,0BAA0B;GAC3B;EACF,CAAA;;;;;;;;;;;ACOD,IAAa,YAAb,MAAa,UAAS;CACX,SAAS,MAAuB,cAAa,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,gCAAA,CAAA,CAAA;CAC7C,OAAO,MAAqB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CAEpC,QAAQ,MAAuB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAJ7B,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAS,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAT,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAS,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,YAAA;GAAA,YAAA;IAAA,yBAAA;IAAA,+BAAA;IAAA,6BAAA;IAAA,2BAAA;IAAA,2BAAA;IAAA,0BAAA;IAAA,2BAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UAfV;EAAgB,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAef,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EAjBrB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM;IACJ,OAAO;IACP,MAAM;IACN,2BAA2B;IAC3B,iCAAiC;IACjC,+BAA+B;IAC/B,6BAA6B;IAC7B,6BAA6B;IAC7B,4BAA4B;IAC5B,6BAA6B;IAC7B,0BAA0B;GAC3B;EACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDD,IAAa,UAAb,MAAa,QAAO;CAET,UAAU,MAAsB,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CAE3C,OAAO,MAAmB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CAGnC,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAPhD,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAO,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAP,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAO,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,yBAAA;IAAA,qBAAA;IAAA,qBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA,CAAA,UAAA;EAAA,UAAA;CAAA,CAAA;;AAAP,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAO,YAAA,CAAA;EAXnB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,MAAM;IACJ,OAAO;IACP,2BAA2B;IAC3B,uBAAuB;IACvB,uBAAuB;IACvB,0BAA0B;GAC3B;EACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACZD,IAAI,WAAS;AAgEb,IAAa,aAAb,MAAa,WAAU;CACZ,cAAc,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,gCAAA,CAAA,CAAA;CACvB,UAAU,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CACzB,YAAY,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,YAAA,CAAA,gCAAA,CAAA,CAAA;CAC3B,iBAAiB,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,iBAAA,CAAA,gCAAA,CAAA,CAAA;CAChC,eAAe,MAAM,oBAAmB,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,gCAAA,CAAA,CAAA;CACxC,OAAO,MAAmB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CACnC,UAAU,MAAsB,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CAC3C,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAElD,aAAa,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACvD,YAAY,MAAM,iBAAgB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,gCAAA,CAAA,CAAA;CAClC,YAAY,MAAM,iBAAgB,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,gCAAA,CAAA,CAAA;CAGlC,QAAQ,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CACjB,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,QAAQ,OAAM;CAEJ,YAAY,eAAe;CAC3B,UAAU,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CACjC,eAAe,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,gCAAA,CAAA,CAAA;CAClB,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,aAAY,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,gCAAA,CAAA,CAAA;CACrE,QAAQ,UAAU,SAAuC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAElF,kBAA0C,CAAE;CAC5C,mBAA8B,CAAE;CAEhC,WAAW,OAAoB;EAC7B,KAAK,MAAM,IAAI,SAAS,EAAE;CAC5B;CACA,iBAAiB,IAA2B;EAC1C,KAAK,YAAY;CACnB;CACA,kBAAkB,IAAc;EAC9B,KAAK,aAAa;CACpB;CACA,iBAAiB,UAAiB;EAChC,KAAK,aAAa,IAAI,QAAQ;CAChC;CAEA,MAAM,SAAsB;EAC1B,KAAK,MAAK,CAAE,CAAC,cAAc,MAAM,OAAO;CAC1C;CAEU,QAAQ,OAAY;EAC5B,MAAM,QAAS,MAAM,OAA4B;EACjD,KAAK,MAAM,IAAI,KAAK;EACpB,KAAK,UAAU,KAAK;CACtB;CAEU,SAAM;EACd,KAAK,WAAU;EACf,KAAK,MAAM,KAAI;CACjB;CAvDW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,OAAA;EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,2BAAA;IAAA,gCAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAjDV,CACT;GAAE,SAAS;GAAmB,aAAa,iBAAiB,UAAU;GAAG,OAAO;EAAI,CACrF;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,OAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAMS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAjDS;GAAO,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;GAAA;GAAA,UAAA,CAAA,UAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAmDN,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EArDtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,OAAO;GACjB,iBAAiB,wBAAwB;GACzC,WAAW,CACT;IAAE,SAAS;IAAmB,aAAa,iBAAgB,UAAW;IAAG,OAAO;GAAI,CACrF;GACD,MAAM;IACJ,OAAO;IACP,6BAA6B;IAC7B,kCAAkC;GACnC;GACD,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCX,CAAA;CAyB2E,CAAA;CAAA,gBAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,OAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AClFnF,IAAa,UAAb,MAAa,QAAO;CACT,OAAO,MAAmB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CADjC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAO,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAP,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAO,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,MAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,qBAAA;IAAA,qBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA,CAAA,UAAA;EAAA,UAAA;CAAA,CAAA;;AAAP,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAO,YAAA,CAAA;EATnB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,MAAM;IACJ,OAAO;IACP,uBAAuB;IACvB,uBAAuB;GACxB;EACF,CAAA;;;;;;;;;;;ACeD,IAAI,WAAS;AAqCb,IAAa,WAAb,MAAa,SAAQ;CACV,QAAQ,OAAgC,UAAU;CAClD,YAAY,OAAO,QAAQ;CAG3B,UAAU,MAA0B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CACvC,cAAc,MAA+B,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,gCAAA,CAAA,CAAA;CACrD,cAAc,MAAgC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,gCAAA,CAAA,CAAA;CACtD,iBAAiB,MAAgC,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,gCAAA,CAAA,CAAA;CAC5D,cAAc,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,gCAAA,CAAA,CAAA;CACvB,eAAe,MAAM,cAAa,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,gCAAA,CAAA,CAAA;CAClC,OAAO,MAAoB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CACpC,UAAU,MAAuB,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CAC5C,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAElD,YAAY,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEtD,UAAU,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CACzB,YAAY,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,YAAA,CAAA,gCAAA,CAAA,CAAA;CAC3B,iBAAiB,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,iBAAA,CAAA,gCAAA,CAAA,CAAA;CAEhC,cAAc,MAA2C,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,gCAAA,CAAA,CAAA;CAGnE,QAAQ,MAAgB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAC7B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,QAAQ,OAAM;CAEd,OAAO,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CACV,aAAa,OAAO,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,gCAAA,CAAA,CAAA;CACtB,UAAU,mBAAmB;CAC7B,YAAiC,CAClD;EAAE,SAAS;EAAS,SAAS;EAAU,UAAU;EAAS,UAAU;EAAO,SAAS;CAAC,GACrF;EAAE,SAAS;EAAS,SAAS;EAAO,UAAU;EAAS,UAAU;EAAU,SAAS;CAAE,CACvF;CAEgB,UAAU,UAAU,SAAwC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CACtE,UAAU,UAAU,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CAEvC,eAAe,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,gCAAA,CAAA,CAAA;CAClB,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,aAAY,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,gCAAA,CAAA,CAAA;CAEnE,QAAQ,eAA8B;EACvD,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,WAAW,KAAK,eAAc;EACpC,OAAO,KAAK,QAAO,CAAE,CAAC,KAAK,WAAU;GACnC,IAAI,WAAW,QAAQ,OAAO,WAAW,UACvC,OAAO;IAAE,OAAO,OAAO,MAAM;IAAG,OAAO;IAAQ,UAAU;GAAK;GAEhE,MAAM,QAAW,UAAgC,aAC/C,OAAO,aAAa,aAChB,SAAS,MAAM,IACf,YAAY,SACR,OAAmC,YACrC;GACR,OAAO;IACL,OAAO,OAAO,KAAK,OAAO,EAAE,CAAC;IAC7B,OAAO,KAAK,OAAO,MAAM;IACzB,UAAU,QAAQ,KAAK,UAAU,KAAK,CAAC;GACxC;EACH,CAAC;CACH,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAEiB,WAAW,eAAc;EAC1C,MAAM,UAAU,KAAK,YAAW;EAChC,MAAM,UAAU,KAAK,MAAK;EAC1B,OAAO,YAAY,OAAO,SAAY,KAAK,MAAK,CAAE,CAAC,MAAM,SAAS,QAAQ,KAAK,OAAO,OAAO,CAAC;CAChG,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,gCAAA,CAAA,CAAA;CAEiB,WAAW,eACtB,KAAK,UAAS,KAAM,CAAC,CAAC,KAAK,SAAQ,KAAM,CAAC,KAAK,WAAU,GAChE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,gCAAA,CAAA,CAAA;CAEkB,iBAAiB,eAAc;EAChD,MAAM,OAAO,KAAK,SAAQ;EAC1B,OAAO,OAAO,CAAC,KAAK,KAAK,IAAI,CAAA;CAC/B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,gCAAA,CAAA,CAAA;CAEF,kBAA4C,CAAE;CAC9C,mBAA8B,CAAE;CAGhC,WAAW,OAAe;EACxB,KAAK,MAAM,IAAI,SAAS,IAAI;CAC9B;CACA,iBAAiB,IAA6B;EAC5C,KAAK,YAAY;CACnB;CACA,kBAAkB,IAAc;EAC9B,KAAK,aAAa;CACpB;CACA,iBAAiB,UAAiB;EAChC,KAAK,aAAa,IAAI,QAAQ;CAChC;CAGA,MAAM,SAAsB;EAC1B,KAAK,QAAO,CAAE,CAAC,cAAc,MAAM,OAAO;CAC5C;CAEU,SAAM;EACd,IAAI,KAAK,KAAI,GAAI,KAAK,MAAK;OACtB,KAAK,KAAI;CAChB;CAEU,OAAI;EACZ,IAAI,KAAK,WAAU,KAAM,KAAK,KAAI,GAAI;EACtC,KAAK,WAAW,IAAI,KAAK,MAAM,cAAc,sBAAqB,CAAE,CAAC,KAAK;EAC1E,KAAK,KAAK,IAAI,IAAI;CACpB;CAEU,MAAM,UAAU,OAAK;EAC7B,IAAI,CAAC,KAAK,KAAI,GAAI;EAClB,KAAK,KAAK,IAAI,KAAK;EACnB,IAAI,SAAS,KAAK,MAAK;CACzB;CAEU,WAAQ;EAEhB,sBAAsB,KAAK,QAAO,CAAE,EAAE,MAAK,GAAI,EAAE,UAAU,KAAK,UAAS,CAAE;CAC7E;CAEU,iBAAiB,OAAoB;EAC7C,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;GACxD,MAAM,eAAc;GACpB,KAAK,KAAI;EACX;CACF;CAEU,iBAAiB,OAAoB;EAC7C,IAAI,MAAM,QAAQ,UAAU;GAC1B,MAAM,eAAc;GACpB,KAAK,MAAM,IAAI;EACjB,OAAO,IAAI,MAAM,QAAQ,OACvB,KAAK,MAAK;CAEd;CAEU,eAAe,OAAiB;EACxC,IAAI,CAAC,KAAK,MAAM,cAAc,SAAS,MAAM,MAAc,GAAG,KAAK,MAAK;CAC1E;CAEU,SAAS,OAAuC;EACxD,MAAM,CAAC,UAAU,MAAM;EACvB,KAAK,QAAS,UAAU,IAAiB;EACzC,KAAK,MAAM,IAAI;CACjB;CAEU,MAAM,OAAY;EAC1B,MAAM,gBAAe;EACrB,KAAK,QAAQ,IAAI;EACjB,KAAK,MAAK;CACZ;CAEU,WAAW,OAAiB;EACpC,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK,KAAI,KAAO,QAAQ,KAAK,MAAM,cAAc,SAAS,IAAI,GAAI;EACtE,KAAK,SAAQ;CACf;CAEA,QAAQ,OAAe;EACrB,KAAK,MAAM,IAAI,KAAK;EACpB,KAAK,UAAU,KAAK;CACtB;CAEA,WAAQ;EACN,KAAK,WAAU;EACf,KAAK,MAAM,KAAI;CACjB;CA1KW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,OAAA;EAAA;EAAA,MAAA;GAAA,WAAA,EAAA,YAAA,qBAAA;GAAA,YAAA;IAAA,wBAAA;IAAA,0BAAA;IAAA,sBAAA;IAAA,sBAAA;IAAA,yBAAA;IAAA,4BAAA;IAAA,6BAAA;IAAA,2BAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAdR,CAAC;GAAE,SAAS;GAAmB,aAAa,iBAAiB,QAAQ;GAAG,OAAO;EAAI,CAAE;EAAC,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAoD5D;GAAU,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UChHjD;EAyEA,cAAA;GAAA;IAAA,MAAA;IAAA,MDhBY;IAAmB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,qBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,UAAA,CAAA,kBAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAU,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,uBAAA;IAAA,UAAA,CAAA,YAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAS,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,WAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAiB3D,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAnBpB,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAW,SACZ;IAAC;IAAqB;IAAkB;IAAY;GAAS;GAAC,iBAEtD,wBAAwB;GAAM,WACpC,CAAC;IAAE,SAAS;IAAmB,aAAa,iBAAgB,QAAS;IAAG,OAAO;GAAI,CAAE;GAAC,MAC3F;IACJ,OAAO;IACP,0BAA0B;IAC1B,4BAA4B;IAC5B,wBAAwB;IACxB,wBAAwB;IACxB,2BAA2B;IAC3B,8BAA8B;IAC9B,+BAA+B;IAC/B,6BAA6B;IAC7B,cAAc;GACf;GAAA,UAAA;EAAA,CAAA;CAuC4E,CAAA;CAAA,gBAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,WAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,OAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,GAAA,iBACjD,UAAU,GAAA,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AE9CjD,IAAa,iBAAb,MAAa,eAAc;CAChB,UAAU,MAA0B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,gCAAA,CAAA,CAAA;CACvC,cAAc,MAAwB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,gCAAA,CAAA,CAAA;CAC9C,cAAc,MAAyB,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,gCAAA,CAAA,CAAA;CAC/C,iBAAiB,MAAyB,YAAW,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,gCAAA,CAAA,CAAA;CAErD,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,aAAa,MAAM,MAAI;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACtD,OAAO,MAA0B,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CAC1C,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAClD,YAAY,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,YAAA,CAAA,gCAAA,CAAA,CAAA;CAC3B,iBAAiB,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,iBAAA,CAAA,gCAAA,CAAA,CAAA;CAGhC,QAAQ,MAAe,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAC5B,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACrD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,iCAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CACpD,QAAQ,OAAM;CAEd,eAAe,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,gCAAA,CAAA,CAAA;CAClB,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,aAAY,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,gCAAA,CAAA,CAAA;CAEnE,QAAQ,eAAsB;EAC/C,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,QAAQ,KAAK,YAAW;EAC9B,MAAM,WAAW,KAAK,eAAc;EACpC,OAAO,KAAK,QAAO,CAAE,CAAC,KAAK,WAAU;GACnC,IAAI,WAAW,QAAQ,OAAO,WAAW,UACvC,OAAO;IAAE,OAAO,OAAO,MAAM;IAAG,OAAO;IAAQ,UAAU;GAAK;GAEhE,MAAM,QAAW,UAAuB,aACtC,OAAO,aAAa,aACf,SAA+B,MAAM,IACtC,YAAY,SACR,OAAmC,YACrC;GACR,OAAO;IACL,OAAO,OAAO,KAAK,OAAO,EAAE,CAAC;IAC7B,OAAO,KAAK,OAAO,MAAM;IACzB,UAAU,QAAQ,KAAK,UAAU,KAAK,CAAC;GACxC;EACH,CAAC;CACH,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAEF,kBAA2C,CAAE;CAC7C,mBAA8B,CAAE;CAEhC,WAAW,OAAc;EACvB,KAAK,MAAM,IAAI,UAAU,KAAK,SAAQ,IAAK,CAAA,IAAK,KAAK;CACvD;CACA,iBAAiB,IAA4B;EAC3C,KAAK,YAAY;CACnB;CACA,kBAAkB,IAAc;EAC9B,KAAK,aAAa;CACpB;CACA,iBAAiB,UAAiB;EAChC,KAAK,aAAa,IAAI,QAAQ;CAChC;CAEU,UAAU,MAAU;EAC5B,MAAM,UAAU,KAAK,MAAK;EAC1B,OAAO,KAAK,SAAQ,IAChB,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM,MAAM,OAAO,GAAG,GAAG,KAAK,KAAK,CAAC,IACtE,OAAO,GAAG,SAAS,KAAK,KAAK;CACnC;CAEU,OAAO,MAAU;EACzB,MAAM,UAAU,KAAK,UAAU,IAAI;EACnC,IAAI;EACJ,IAAI,KAAK,SAAQ,GAAI;GACnB,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAK,CAAE,IAAK,KAAK,MAAK,IAAmB,CAAA;GAC5E,OAAO,UAAU,QAAQ,QAAQ,MAAM,CAAC,OAAO,GAAG,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,KAAK;EAC7F,OAAO,IAAI,SAAS;GAClB,IAAI,CAAC,KAAK,WAAU,GAAI;GACxB,OAAO;EACT,OACE,OAAO,KAAK;EAEd,KAAK,MAAM,IAAI,IAAI;EACnB,KAAK,UAAU,IAAI;CACrB;CAEU,SAAM;EACd,KAAK,WAAU;EACf,KAAK,MAAM,KAAI;CACjB;CAvFW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,OAAA;GAAA,OAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,QAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,wBAAA;IAAA,6BAAA;IAAA,6BAAA;IAAA,gCAAA;IAAA,kCAAA;IAAA,mCAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WA9Bd,CACT;GAAE,SAAS;GAAmB,aAAa,iBAAiB,cAAc;GAAG,OAAO;EAAI,CACzF;EAAA,UAAA;EAAA,UAYS;;;;;;;;;;;;;;;EAcT,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EAjC1B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,iBAAiB,wBAAwB;GACzC,WAAW,CACT;IAAE,SAAS;IAAmB,aAAa,iBAAgB,cAAe;IAAG,OAAO;GAAI,CACzF;GACD,MAAM;IACJ,OAAO;IACP,MAAM;IACN,qBAAqB;IACrB,0BAA0B;IAC1B,+BAA+B;IAC/B,+BAA+B;IAC/B,kCAAkC;IAClC,oCAAoC;IACpC,qCAAqC;GACtC;GACD,UAAU;;;;;;;;;;;;;;;EAeX,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/CD,IAAa,WAAb,MAAa,SAAQ;CAAR,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,SAAA;GAAA,gBAAA;EAAA;EAAA,UAAA,CAAA,WAAA;EAAA,UAAA;CAAA,CAAA;;AAAR,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EARpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,MAAM;IACJ,OAAO;IACP,MAAM;GACP;EACF,CAAA;;;ACfD,MAAa,cAAc;CACzB,OAAO;EACL,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,SAAS;EACP,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,OAAO;EACL,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,OAAO;EACL,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;AACO;AClGV,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACQ;AAEV,MAAa,mBAAmB,OAAO,KAAK,WAAW;AAGvD,MAAM,QAAQ;CAAC;CAAI;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAAG;AACnE,MAAM,gBAAgB,CAAC,GAAG,GAAG,KAAK;AA0BlC,MAAa,mBAAmB,IAAI,eAA+B,oBAAoB;CACrF,YAAY;CACZ,gBAAgB,CAAA;AACjB,CAAA;AASD,SAAgB,kBAAkB,UAAgB;CAIhD,MAAM,MAAM,uBAAuB,KAAK,QAAQ;CAChD,IAAI,KACF,OAAO;EAAE,KAAK;EAAU,QAAQ,IAAI,OAAO,GAAG,UAAU,OAAO,IAAI,IAAI,EAAE;CAAC;CAE5E,MAAM,OAAO,2CAA2C,KAAK,QAAQ;CACrE,IAAI,MAAM;EACR,MAAM,GAAG,MAAM,QAAQ,MAAM;EAC7B,OAAO;GACL,KAAK;GACL,QAAQ,IAAI,OAAQ,KAAK,GAAG,aAAa,MAAM,KAAK,IAAI,GAAG,gBAAgB,IAAI;EAChF;CACH;CACA,MAAM,IAAI,MACR,yBAAyB,SAAQ,mEAAoE;AAEzG;AAEA,MAAM,SAAS,SACb,MAAM,KAAK,SAAS,eAAe,KAAI,WAAY,KAAI,GAAI,KAAI,GAAI,CAAC,CAAC,KAAK,EAAE;AAG9E,SAAS,WAAW,SAAyB,MAAY;CACvD,IAAI,YAAY,QAAQ,OAAO,cAAc,MAAM,OAAO,EAAC;CAY3D,OAAO,cAAc,GAVhB,MAAM,KAAK,SAAS,eAAe,KAAI,mBAAoB,KAAI,GAAI,CAAC,CAAC,KAAK,EAAE,yUAUvD,aAAc,KAAI;AAC9C;AAGA,SAAS,WAAW,SAAoB,MAAY;CAClD,MAAM,UAAU,YAAY;CAC5B,MAAM,OAAO,cAAc,KAAK,SAAS,eAAe,KAAI,GAAI,QAAQ,MAAK,EAAG,CAAC,CAAC,KAAK,EAAE;CACzF,OAAO,cAAc,KAAI,aAAc,KAAI,GAAI,KAAI;AACrD;AAsBA,IAAa,UAAb,MAAa,QAAO;CACT,OAAO,OAAO,QAAQ;CACtB,WAAW,kBAAkB,OAAO,WAAW,CAAC;CAChD,WAAW,OAAO,gBAAgB;CAClC,gBAAgB,kBAAkB,KAAK,SAAS,gBAAgB,WAAW;CAC3E,SAAS,KAAK,MAAK;CAEnB,QAAQ,OAAO,KAAK,OAAO,QAAQ,KAAK,SAAS,QAAQ,KAAK,YAAW,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CAC5E,WAAW,OAClB,KAAK,OAAO,WAAW,KAAK,SAAS,WAAW,MACjD,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,gCAAA,CAAA,CAAA;CACQ,WAAW,OAClB,KAAK,OAAO,WAAW,KAAK,SAAS,WAAW,MACjD,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,gCAAA,CAAA,CAAA;CAEQ,OAAO,KAAK,MAAM,WAAU;CAC5B,UAAU,KAAK,SAAS,WAAU;CAClC,UAAU,KAAK,SAAS,WAAU;CAGlC,MAAM,eAAc;EAC3B,MAAM,OAAO,KAAK,cAAc;EAChC,MAAM,UAAU,KAAK,SAAQ;EAC7B,MAAM,UAAU,KAAK,SAAQ;EAC7B,OAAO,GAAG,UAAU,WAAW,SAAS,IAAI,IAAI,KAAK,UAAU,WAAW,SAAS,IAAI,IAAI;CAC7F,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,gCAAA,CAAA,CAAA;CAEF,eAAe;CACf,SAAyC;CACzC,UAA+B;CAE/B,cAAA;EACE,aAAY;GACV,MAAM,OAAO,KAAK,MAAK;GACvB,IAAI,CAAC,KAAK,UAAU;GACpB,MAAM,OAAO,KAAK,KAAK;GACvB,MAAM,MAAM,KAAK;GACjB,MAAM,cAAc,KAAK,cAAc,MAAM,MAAM,IAAI;GAEvD,IAAI,KAAK,gBAAgB,KAAK,SAAS,kBAAkB,IAAI,qBAC3D,IAAI,oBAAoB,KAAK;QAE7B,MAAK;GAEP,KAAK,eAAe;EACtB,CAAC;EACD,aAAY;GACV,MAAM,MAAM,KAAK,IAAG;GACpB,IAAI,KAAK,UAAU,KAAK,YAAY,GAAG;EACzC,CAAC;EACD,aACE,KAAK,MAAM;GAAE,MAAM,KAAK,MAAK;GAAI,SAAS,KAAK,SAAQ;GAAI,SAAS,KAAK,SAAQ;EAAE,CAAE,CAAC;EAGxF,OAAO,UAAU,CAAC,CAAC,gBAAgB,KAAK,UAAS,CAAE;CACrD;CAEA,QAAQ,MAAa;EACnB,KAAK,MAAM,IAAI,IAAI;CACrB;CAEA,aAAU;EACR,KAAK,MAAM,QAAQ,SAAS,CAAC,IAAI;CACnC;CAGA,WAAW,SAA8B;EACvC,IAAI,YAAY,QAAQ,CAAC,kBAAkB,SAAS,OAAO,GACzD,MAAM,IAAI,MAAM,2BAA2B,QAAO,EAAG;EACvD,KAAK,SAAS,IAAI,OAAO;CAC3B;CAGA,WAAW,SAAyB;EAClC,IAAI,YAAY,QAAQ,EAAE,WAAW,cACnC,MAAM,IAAI,MAAM,oBAAoB,QAAO,EAAG;EAChD,KAAK,SAAS,IAAI,OAAO;CAC3B;CAEA,cAAW;EACT,MAAM,OAAO,KAAK,KAAK;EACvB,OAAO,KAAK,YAAY,CAAC,CAAC,MAAM,aAAa,8BAA8B,CAAC,CAAC;CAC/E;CAEA,QAAK;EACH,MAAM,MAAM,KAAK,SAAS;EAC1B,IAAI,CAAC,KAAK,YAAY,CAAC,KAAK,OAAO,CAAA;EACnC,IAAI;GACF,MAAM,QAAQ,KAAK,MACjB,KAAK,KAAK,aAAa,aAAa,QAAQ,GAAG,KAAK,MAAM;GAE5D,OAAO,SAAS,OAAO,UAAU,WAAW,QAAQ,CAAA;EACtD,QAAQ;GACN,OAAO,CAAA;EACT;CACF;CAEA,MAAM,OAAY;EAChB,MAAM,MAAM,KAAK,SAAS;EAC1B,IAAI,CAAC,KAAK,YAAY,CAAC,KAAK;EAC5B,IAAI;GACF,KAAK,KAAK,aAAa,aAAa,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;EACxE,QAAQ,CAER;CACF;CAGA,YAAY,KAAW;EACrB,IAAI,CAAC,KAAK,QAAQ;GAChB,MAAM,MAAM,KAAK;GACjB,MAAM,OAAO,IAAI;GACjB,IACE,MAAM,iBACN,wBAAwB,OACxB,iBAAiB,KAAK,cAAc,WACpC;IACA,MAAM,QAAQ,IAAI,KAAK,cAAa;IACpC,IAAI,qBAAqB,CAAC,GAAG,IAAI,oBAAoB,KAAK;IAC1D,KAAK,UAAU,SAAS,MAAM,YAAY,IAAI;IAC9C,KAAK,gBAAe;KAClB,IAAI,qBAAqB,IAAI,mBAAmB,QAAQ,MAAM,MAAM,KAAK;IAC3E;GACF,OAAO;IACL,MAAM,QAAQ,IAAI,cAAc,OAAO;IACvC,MAAM,aAAa,iBAAiB,EAAE;IACtC,IAAI,KAAK,YAAY,KAAK;IAC1B,KAAK,UAAU,SAAQ;KACrB,MAAM,cAAc;IACtB;IACA,KAAK,gBAAgB,MAAM,OAAM;GACnC;EACF;EACA,KAAK,OAAO,GAAG;CACjB;CAtIW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAO,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAP,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAO,YADM;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAO,YAAA,CAAA;EADnB,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;;AA2IlC,SAAgB,eAAe,UAA0B,CAAA,GAAE;CACzD,OAAO,yBAAyB,CAC9B;EAAE,SAAS;EAAkB,UAAU;CAAO,GAC9C,oCAAmC;EACjC,OAAO,OAAO;CAChB,CAAC,CACF,CAAA;AACH;ACnRA,IAAI,SAAS;AASb,IAAa,kBAAb,MAAa,gBAAe;CACjB,OAAO,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;CAC1B,KAAK;CAFM,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAe,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAf,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAe,cAAA;EAAA,UAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,UAAA;GAAA,YAAA,EAAA,MAAA,KAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UAJhB;EAAc,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAIb,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAe,YAAA,CAAA;EAN3B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM;IAAE,OAAO;IAAc,MAAM;IAAW,QAAQ;GAAI;EAC3D,CAAA;;;AAMD,MAAM,YAAY;CAChB,KAAK;EAAE,SAAS;EAAU,SAAS;EAAO,UAAU;EAAU,UAAU;CAAQ;CAChF,QAAQ;EAAE,SAAS;EAAU,SAAS;EAAU,UAAU;EAAU,UAAU;CAAK;CACnF,MAAM;EAAE,SAAS;EAAS,SAAS;EAAU,UAAU;EAAO,UAAU;CAAQ;CAChF,OAAO;EAAE,SAAS;EAAO,SAAS;EAAU,UAAU;EAAS,UAAU;CAAQ;AACzE;AAGV,MAAM,WAAyD;CAC7D,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;AACR;AAsBD,IAAa,YAAb,MAAa,UAAS;CACX,WAAW,OAAO,OAAO;CACzB,QAAQ,OAAgC,UAAU;CAGlD,OAAO,MAAiC,IAAE;EAAA,GAAA,YAAA,EAAA,WAAA,OAAA,iCAAA,CAAA;EAAI,OAAO;CAAY,CAAA;CACjE,WAAW,MAAyB,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,iCAAA,CAAA;EAAI,OAAO;CAAmB,CAAA;CACvE,QAAQ,MAAsB,QAAM;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,iCAAA,CAAA;EAAI,OAAO;CAAgB,CAAA;CAC/D,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,iCAAA,CAAA;EAAI,OAAO;CAAmB,CAAA;CAEpD,YAAY,MAAM,GAAC;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,iCAAA,CAAA;EAAI,OAAO;CAAoB,CAAA;CAExC,WAAW,cAAc;CACzB,QAAQ,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,gCAAA,CAAA,CAAA;CACxC,OAA0B;CAC1B,UAAkC;CAClC;CAEA,cAAA;EACE,OAAO,UAAU,CAAC,CAAC,gBAAgB,KAAK,QAAO,CAAE;EAEjD,aAAY;GACV,MAAM,OAAO,KAAK,KAAI;GACtB,IAAI,KAAK,SAAQ,KAAM,CAAC,MAAM,KAAK,KAAI;QAClC,IAAI,KAAK,SAAS,KAAK,QAAQ,KAAK,IAAI,IAAI;GACjD,KAAK,SAAQ;GACb,KAAK,MAAM,uBAAuB,KAAK,UAAS,CAAE;EACpD,CAAC;CACH;CAEU,QAAQ,QAAyB;EACzC,MAAM,QAAQ,KAAK,MAAK;EACxB,IAAI,UAAU,UAAU,UAAU,QAAQ;EAC1C,KAAK,KAAI;CACX;CAEU,QAAQ,QAAyB;EACzC,MAAM,QAAQ,KAAK,MAAK;EACxB,IAAI,UAAU,UAAU,UAAU,QAAQ;EAC1C,KAAK,KAAI;CACX;CAEA,YAAS;EACP,MAAM,YAAY,KAAK,SAAQ;EAC/B,MAAM,SAAS;EACf,MAAM,UAAU,MACd,MAAM,QACF,EAAE,SAAS,GAAO,IAClB,MAAM,WACJ,EAAE,SAAS,OAAM,IACjB,MAAM,SACJ,EAAE,SAAS,GAAO,IAClB,EAAE,SAAS,OAAM;EAC3B,OAAO,KAAK,SACT,SAAQ,CAAE,CACV,oBAAoB,KAAK,KAAK,CAAC,CAC/B,cACC,CAAC,WAAW,SAAS,UAAU,CAAC,CAAC,KAAK,OAAO;GAAE,GAAG,UAAU;GAAI,GAAG,OAAO,CAAC;EAAC,EAAG,CAAC,CACjF,CACA,SAAS,IAAI;CAClB;CAEA,OAAI;EACF,MAAM,OAAO,KAAK,KAAI;EACtB,IAAI,KAAK,SAAQ,KAAM,CAAC,QAAQ,KAAK,MAAM;EAC3C,aAAa,KAAK,MAAM;EACxB,MAAM,QAAQ,KAAK,UAAS;EAC5B,IAAI,QAAQ,GAAG,KAAK,SAAS,iBAAiB,KAAK,QAAQ,IAAI,GAAG,KAAK;OAClE,KAAK,QAAQ,IAAI;CACxB;CAEA,QAAQ,MAAY;EAClB,IAAI,KAAK,MAAM;EACf,KAAK,OAAO,KAAK,SAAS,OAAO;GAC/B,kBAAkB,KAAK,UAAS;GAChC,gBAAgB,KAAK,SAAS,iBAAiB,MAAK;GACpD,YAAY;EACb,CAAA;EACD,MAAM,SAAS,KAAK,KAAK,OAAO,IAAI,gBAAgB,eAAe,CAAC;EACpE,OAAO,SAAS,KAAK,KAAK;EAC1B,OAAO,SAAS,KAAK,IAAI,IAAI;EAC7B,KAAK,UAAU,OAAO;EACtB,KAAK,MAAM,IAAI,IAAI;CACrB;CAEA,OAAI;EACF,aAAa,KAAK,MAAM;EACxB,KAAK,QAAO;CACd;CAEQ,UAAO;EACb,aAAa,KAAK,MAAM;EACxB,KAAK,MAAM,QAAO;EAClB,KAAK,OAAO;EACZ,KAAK,UAAU;EACf,KAAK,MAAM,IAAI,KAAK;CACtB;CAhGW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAS,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAT,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAS,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,WAAA;IAAA,cAAA;IAAA,cAAA;IAAA,WAAA;IAAA,YAAA;IAAA,kBAAA;IAAA,SAAA;GAAA;GAAA,YAAA,EAAA,yBAAA,4BAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAT,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EAZrB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IACJ,2BAA2B;IAC3B,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,cAAc;IACd,oBAAoB;IACpB,WAAW;GACZ;EACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"gravionlabs-helix-ui.mjs","names":[],"sources":["../../../projects/ui/src/lib/breadcrumb/breadcrumb.ts","../../../projects/ui/src/lib/breadcrumb/breadcrumb.html","../../../projects/ui/src/lib/button/button.ts","../../../projects/ui/src/lib/checkbox/checkbox.ts","../../../projects/ui/src/lib/divider/divider.ts","../../../projects/ui/src/lib/input/input.ts","../../../projects/ui/src/lib/internal/ids.ts","../../../projects/ui/src/lib/password/password.ts","../../../projects/ui/src/lib/radio/radio.ts","../../../projects/ui/src/lib/internal/options.ts","../../../projects/ui/src/lib/select/select.ts","../../../projects/ui/src/lib/select/select.html","../../../projects/ui/src/lib/select-button/select-button.ts","../../../projects/ui/src/lib/switch/switch.ts","../../../projects/ui/src/lib/theme/surfaces.ts","../../../projects/ui/src/lib/theme/theme.ts","../../../projects/ui/src/lib/tooltip/tooltip.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport type { HxMenuItem } from '../menu-item';\n\n/** One step of the trail: the menu item model, of which the breadcrumb uses label, icon, link and state. */\nexport type HxBreadcrumbItem = HxMenuItem;\n\n/**\n * The path to the current page. The last item is the current page (`aria-current=\"page\"`).\n *\n * ```html\n * <hx-breadcrumb [model]=\"items\" [home]=\"{ icon: 'pi pi-home', routerLink: '/' }\" />\n * ```\n */\n@Component({\n selector: 'hx-breadcrumb',\n imports: [RouterLink, NgTemplateOutlet],\n templateUrl: './breadcrumb.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'hx-breadcrumb' },\n})\nexport class HxBreadcrumb {\n readonly model = input<readonly HxBreadcrumbItem[]>([]);\n readonly home = input<HxBreadcrumbItem>();\n /** Accessible name of the navigation landmark. */\n readonly ariaLabel = input('Breadcrumb');\n\n protected items(): HxBreadcrumbItem[] {\n return this.model().filter((item) => item.visible !== false);\n }\n}\n","<nav [attr.aria-label]=\"ariaLabel()\">\n <ol class=\"hx-breadcrumb-list\">\n @if (home(); as home) {\n <li class=\"hx-breadcrumb-item\">\n <ng-container [ngTemplateOutlet]=\"entry\" [ngTemplateOutletContext]=\"{ $implicit: home, current: false }\" />\n </li>\n }\n @for (item of items(); track $index; let last = $last) {\n @if (home() || $index > 0) {\n <li class=\"hx-breadcrumb-separator\" aria-hidden=\"true\"></li>\n }\n <li class=\"hx-breadcrumb-item\">\n <ng-container [ngTemplateOutlet]=\"entry\" [ngTemplateOutletContext]=\"{ $implicit: item, current: last }\" />\n </li>\n }\n </ol>\n</nav>\n\n<ng-template #entry let-item let-current=\"current\">\n @if (current || item.disabled || (!item.routerLink && !item.url)) {\n <span class=\"hx-breadcrumb-link\" [attr.aria-current]=\"current ? 'page' : null\" [attr.aria-disabled]=\"item.disabled ? 'true' : null\">\n @if (item.icon) { <span [class]=\"item.icon + ' hx-breadcrumb-icon'\" aria-hidden=\"true\"></span> }\n @if (item.label) { <span>{{ item.label }}</span> }\n </span>\n } @else if (item.routerLink) {\n <a class=\"hx-breadcrumb-link\" [routerLink]=\"item.routerLink\" [attr.target]=\"item.target\" [attr.aria-label]=\"item.label ? null : 'Home'\">\n @if (item.icon) { <span [class]=\"item.icon + ' hx-breadcrumb-icon'\" aria-hidden=\"true\"></span> }\n @if (item.label) { <span>{{ item.label }}</span> }\n </a>\n } @else {\n <a class=\"hx-breadcrumb-link\" [href]=\"item.url\" [attr.target]=\"item.target\">\n @if (item.icon) { <span [class]=\"item.icon + ' hx-breadcrumb-icon'\" aria-hidden=\"true\"></span> }\n @if (item.label) { <span>{{ item.label }}</span> }\n </a>\n }\n</ng-template>\n","import { booleanAttribute, DestroyRef, Directive, ElementRef, inject, input } from '@angular/core';\n\nexport type HxButtonVariant = 'filled' | 'outlined' | 'text' | 'link';\nexport type HxButtonSeverity =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'info'\n | 'warn'\n | 'help'\n | 'danger'\n | 'contrast';\nexport type HxButtonSize = 'small' | 'medium' | 'large';\n\n/**\n * A native `<button>` or `<a>` dressed as a Helix button. The label is the element's content; an icon is\n * an inline `<svg>` or an element with `hxButtonIcon` next to it. Styled by `@gravionlabs/helix-ui/styles.css`\n * on the `--h-button-*` design tokens.\n *\n * ```html\n * <button hx-button severity=\"success\" (click)=\"save()\">Save</button>\n * <button hx-button variant=\"outlined\" [loading]=\"saving()\">Save</button>\n * <button hx-button iconOnly aria-label=\"Add\"><svg …/></button>\n * ```\n *\n * A loading button stays focusable (`aria-busy`) but swallows clicks; a disabled one is the native `disabled`\n * attribute (or `aria-disabled=\"true\"` on an anchor). An icon-only button needs an accessible name.\n */\n@Directive({\n selector: 'button[hx-button], a[hx-button]',\n exportAs: 'hx-button',\n host: {\n class: 'hx-button',\n '[class.hx-button-outlined]': \"variant() === 'outlined'\",\n '[class.hx-button-text]': \"variant() === 'text'\",\n '[class.hx-button-link]': \"variant() === 'link'\",\n '[class.hx-button-secondary]': \"severity() === 'secondary'\",\n '[class.hx-button-success]': \"severity() === 'success'\",\n '[class.hx-button-info]': \"severity() === 'info'\",\n '[class.hx-button-warn]': \"severity() === 'warn'\",\n '[class.hx-button-help]': \"severity() === 'help'\",\n '[class.hx-button-danger]': \"severity() === 'danger'\",\n '[class.hx-button-contrast]': \"severity() === 'contrast'\",\n '[class.hx-button-sm]': \"size() === 'small'\",\n '[class.hx-button-lg]': \"size() === 'large'\",\n '[class.hx-button-rounded]': 'rounded()',\n '[class.hx-button-raised]': 'raised()',\n '[class.hx-button-fluid]': 'fluid()',\n '[class.hx-button-icon-only]': 'iconOnly()',\n '[class.hx-button-loading]': 'loading()',\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n },\n})\nexport class HxButton {\n /** How loud the button is: filled (default), outlined, text or link. */\n readonly variant = input<HxButtonVariant>('filled');\n\n /** What the button means: `primary` (default), `secondary` and the status colours. */\n readonly severity = input<HxButtonSeverity>('primary');\n\n readonly size = input<HxButtonSize>('medium');\n\n /** A pill instead of the 6 px radius; a circle for an icon-only button. */\n readonly rounded = input(false, { transform: booleanAttribute });\n\n /** Adds the elevation shadow. */\n readonly raised = input(false, { transform: booleanAttribute });\n\n /** Takes the full width of the container. */\n readonly fluid = input(false, { transform: booleanAttribute });\n\n /** Square button for a single icon; give it `aria-label`. */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n\n /** Shows a spinner and ignores clicks while an operation runs. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n constructor() {\n // A capture listener on the host itself fires before the click listeners of the consuming template\n // (a host `(click)` binding would not: its order against the template's is not guaranteed).\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const guard = (event: Event) => {\n if (this.loading() || host.getAttribute('aria-disabled') === 'true') {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n host.addEventListener('click', guard, true);\n inject(DestroyRef).onDestroy(() => host.removeEventListener('click', guard, true));\n }\n}\n","import { Directive, input } from '@angular/core';\n\nexport type HxCheckboxSize = 'small' | 'medium' | 'large';\n\n/**\n * A native `<input type=\"checkbox\">` drawn as a Helix checkbox (CSS only). It is a real checkbox: `checked`,\n * `indeterminate`, `disabled`, `ngModel`, reactive and signal forms, keyboard and screen readers all work\n * as for any checkbox.\n *\n * ```html\n * <label><input type=\"checkbox\" hx-checkbox [(ngModel)]=\"agreed\" /> I agree</label>\n * <input type=\"checkbox\" hx-checkbox [indeterminate]=\"some\" aria-label=\"Select all\" />\n * ```\n *\n * Put it in a `<label>` with its text (or give it `aria-label`); the invalid look comes from\n * `aria-invalid=\"true\"` and from `ng-invalid ng-touched`.\n */\n@Directive({\n selector: 'input[hx-checkbox]',\n exportAs: 'hx-checkbox',\n host: {\n class: 'hx-checkbox',\n '[class.hx-checkbox-sm]': \"size() === 'small'\",\n '[class.hx-checkbox-lg]': \"size() === 'large'\",\n },\n})\nexport class HxCheckbox {\n readonly size = input<HxCheckboxSize>('medium');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport type HxDividerLayout = 'horizontal' | 'vertical';\nexport type HxDividerType = 'solid' | 'dashed' | 'dotted';\nexport type HxDividerAlign = 'start' | 'center' | 'end';\n\n/**\n * A line between content; the projected content is a label sitting on the line.\n *\n * ```html\n * <hx-divider />\n * <hx-divider align=\"center\">or</hx-divider>\n * <hx-divider layout=\"vertical\" />\n * ```\n */\n@Component({\n selector: 'hx-divider',\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'hx-divider',\n role: 'separator',\n '[attr.aria-orientation]': 'layout()',\n '[class.hx-divider-horizontal]': \"layout() === 'horizontal'\",\n '[class.hx-divider-vertical]': \"layout() === 'vertical'\",\n '[class.hx-divider-dashed]': \"type() === 'dashed'\",\n '[class.hx-divider-dotted]': \"type() === 'dotted'\",\n '[class.hx-divider-start]': \"align() === 'start'\",\n '[class.hx-divider-center]': \"align() === 'center'\",\n '[class.hx-divider-end]': \"align() === 'end'\",\n },\n})\nexport class HxDivider {\n readonly layout = input<HxDividerLayout>('horizontal');\n readonly type = input<HxDividerType>('solid');\n /** Where the label sits on the line (start, center, end); without a label it has no effect. */\n readonly align = input<HxDividerAlign>();\n}\n","import { booleanAttribute, Directive, input } from '@angular/core';\n\nexport type HxInputSize = 'small' | 'medium' | 'large';\nexport type HxInputVariant = 'outlined' | 'filled';\n\n/**\n * A native `<input>` or `<textarea>` styled as a Helix text field. It works with template-driven forms,\n * reactive forms and signal forms unchanged: the element stays a native control.\n *\n * ```html\n * <label for=\"name\">Name</label>\n * <input hx-input id=\"name\" [(ngModel)]=\"name\" />\n * <textarea hx-input variant=\"filled\" rows=\"4\"></textarea>\n * <input hx-input [attr.aria-invalid]=\"invalid() ? 'true' : null\" aria-describedby=\"name-error\" />\n * ```\n *\n * The invalid look comes from `aria-invalid=\"true\"` (set it yourself or let the forms API do it) and from\n * Angular's `ng-invalid ng-touched` classes. Always give a field a visible `<label>`; a placeholder is a hint.\n */\n@Directive({\n selector: 'input[hx-input], textarea[hx-input]',\n exportAs: 'hx-input',\n host: {\n class: 'hx-input',\n '[class.hx-input-filled]': \"variant() === 'filled'\",\n '[class.hx-input-sm]': \"size() === 'small'\",\n '[class.hx-input-lg]': \"size() === 'large'\",\n '[class.hx-input-fluid]': 'fluid()',\n },\n})\nexport class HxInput {\n /** `outlined` (default) or a tinted `filled` field. */\n readonly variant = input<HxInputVariant>('outlined');\n\n readonly size = input<HxInputSize>('medium');\n\n /** Takes the full width of the container. */\n readonly fluid = input(false, { transform: booleanAttribute });\n}\n","let counter = 0;\n\n/** A unique id for generated DOM ids (`aria-controls`, `aria-describedby`, `for`): `hx-select-panel-3`. */\nexport function nextId(prefix: string): string {\n return `${prefix}-${counter++}`;\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n type ElementRef,\n forwardRef,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { HxInput, type HxInputSize, type HxInputVariant } from '../input/input';\nimport { nextId } from '../internal/ids';\n\n/**\n * A password field with a button that shows or hides the text. Works with `ngModel`, reactive forms and\n * signal forms (`[formField]`).\n *\n * ```html\n * <label for=\"pw\">Password</label>\n * <hx-password inputId=\"pw\" [(ngModel)]=\"password\" toggleMask fluid />\n * ```\n */\n@Component({\n selector: 'hx-password',\n imports: [HxInput],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => HxPassword), multi: true },\n ],\n host: {\n class: 'hx-password',\n '[class.hx-password-fluid]': 'fluid()',\n '[class.hx-password-has-toggle]': 'toggleMask()',\n },\n template: `\n <input\n #field\n hx-input\n [id]=\"inputId() ?? defaultId\"\n [type]=\"visible() ? 'text' : 'password'\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [disabled]=\"isDisabled()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [fluid]=\"true\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n />\n @if (toggleMask()) {\n <button\n type=\"button\"\n class=\"hx-password-toggle\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"visible() ? hideLabel() : showLabel()\"\n [attr.aria-pressed]=\"visible()\"\n (click)=\"visible.set(!visible())\"\n >\n <svg viewBox=\"0 0 24 24\" width=\"1em\" height=\"1em\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n @if (visible()) {\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <path d=\"m1 1 22 22\" />\n } @else {\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n }\n </svg>\n </button>\n }\n `,\n})\nexport class HxPassword implements ControlValueAccessor, FormValueControl<string> {\n readonly placeholder = input('');\n readonly inputId = input<string>();\n readonly ariaLabel = input<string>();\n readonly ariaLabelledby = input<string>();\n readonly autocomplete = input('current-password');\n readonly size = input<HxInputSize>('medium');\n readonly variant = input<HxInputVariant>('outlined');\n readonly fluid = input(false, { transform: booleanAttribute });\n /** Shows the button that reveals the text. */\n readonly toggleMask = input(false, { transform: booleanAttribute });\n readonly showLabel = input('Show password');\n readonly hideLabel = input('Hide password');\n\n // The signal-forms contract (FormValueControl): value, disabled, invalid, touch.\n readonly value = model('');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n\n protected readonly defaultId = nextId('hx-password');\n protected readonly visible = signal(false);\n readonly #cvaDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.#cvaDisabled());\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\n\n #onChange: (value: string) => void = () => {};\n #onTouched: () => void = () => {};\n\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.#onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.#cvaDisabled.set(disabled);\n }\n\n focus(options?: FocusOptions): void {\n this.field().nativeElement.focus(options);\n }\n\n protected onInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.value.set(value);\n this.#onChange(value);\n }\n\n protected onBlur(): void {\n this.#onTouched();\n this.touch.emit();\n }\n}\n","import { Directive, input } from '@angular/core';\n\nexport type HxRadioSize = 'small' | 'medium' | 'large';\n\n/**\n * A native `<input type=\"radio\">` drawn as a Helix radio button (CSS only). Group radios with the same\n * `name` (or a forms API's `formControlName`/`ngModel` name) exactly as with native radios; arrow keys move\n * the selection natively.\n *\n * ```html\n * <label><input type=\"radio\" hx-radio name=\"plan\" value=\"free\" [(ngModel)]=\"plan\" /> Free</label>\n * <label><input type=\"radio\" hx-radio name=\"plan\" value=\"pro\" [(ngModel)]=\"plan\" /> Pro</label>\n * ```\n */\n@Directive({\n selector: 'input[hx-radio]',\n exportAs: 'hx-radio',\n host: {\n class: 'hx-radio',\n '[class.hx-radio-sm]': \"size() === 'small'\",\n '[class.hx-radio-lg]': \"size() === 'large'\",\n },\n})\nexport class HxRadio {\n readonly size = input<HxRadioSize>('medium');\n}\n","/** A property name of an option, or a function that reads the value from it. */\nexport type Accessor<O, R> = string | ((option: O) => R);\n\n/** An option after `optionLabel`, `optionValue` and `optionDisabled` are applied. */\nexport interface HxOption<V = unknown> {\n label: string;\n value: V;\n disabled: boolean;\n}\n\n/** How values are compared to find the chosen option: `Object.is` unless the app passes its own. */\nexport const compareValues: (a: unknown, b: unknown) => boolean = Object.is;\n\nfunction read<R>(option: object, accessor: Accessor<unknown, R>, fallback: R): R {\n if (typeof accessor === 'function') return accessor(option);\n return accessor in option ? ((option as Record<string, unknown>)[accessor] as R) : fallback;\n}\n\n/**\n * Turns the `options` input of a component into `{ label, value, disabled }` entries. A primitive is its own\n * label and value; an object is read through the accessors (a property name or a function). A missing label is\n * an empty string, a missing value is the object itself, a missing `disabled` is `false`.\n */\nexport function resolveOptions<V = unknown>(\n options: readonly unknown[],\n label: Accessor<never, string>,\n value: Accessor<never, unknown>,\n disabled: Accessor<never, boolean>,\n): HxOption<V>[] {\n return options.map((option) => {\n if (option === null || typeof option !== 'object') {\n return { label: String(option), value: option as V, disabled: false };\n }\n return {\n label: String(read(option, label as Accessor<unknown, string>, '')),\n value: read(option, value as Accessor<unknown, unknown>, option) as V,\n disabled: Boolean(read(option, disabled as Accessor<unknown, boolean>, false)),\n };\n });\n}\n","import { CdkListbox, CdkOption, type ListboxValueChangeEvent } from '@angular/cdk/listbox';\nimport {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n Injector,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { nextId } from '../internal/ids';\nimport { type Accessor, compareValues, type HxOption, resolveOptions } from '../internal/options';\n\nexport type HxSelectSize = 'small' | 'medium' | 'large';\nexport type HxSelectVariant = 'outlined' | 'filled';\n\n/** An option as the select works with it, after `optionLabel`/`optionValue`/`optionDisabled` are applied. */\nexport type HxSelectItem<V = unknown> = HxOption<V>;\n\n/**\n * A single-value select: a `combobox` button that opens a listbox in a CDK connected overlay (typeahead,\n * Arrow/Home/End/Enter/Escape from the CDK listbox). A real form control for template-driven, reactive and\n * signal forms.\n *\n * ```html\n * <label for=\"city\">City</label>\n * <hx-select inputId=\"city\" [options]=\"cities\" optionLabel=\"name\" optionValue=\"code\"\n * placeholder=\"Select a city\" [(ngModel)]=\"city\" />\n * <hx-select [options]=\"['Small', 'Medium', 'Large']\" [formField]=\"form.size\" />\n * ```\n *\n * `options` may hold primitives (label = the value as text) or objects (`optionLabel`, `optionValue` and\n * `optionDisabled` name a key or give a function; defaults `label`, `value` and `disabled`).\n * Give the select a visible `<label for>` (with `inputId`) or an `ariaLabel`.\n */\n@Component({\n selector: 'hx-select',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, CdkListbox, CdkOption],\n templateUrl: './select.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => HxSelect), multi: true }],\n host: {\n class: 'hx-select',\n '[class.hx-select-open]': 'open()',\n '[class.hx-select-filled]': \"variant() === 'filled'\",\n '[class.hx-select-sm]': \"size() === 'small'\",\n '[class.hx-select-lg]': \"size() === 'large'\",\n '[class.hx-select-fluid]': 'fluid()',\n '[class.hx-select-disabled]': 'isDisabled()',\n '[class.hx-select-has-clear]': 'canClear()',\n '[class.hx-select-invalid]': 'invalid()',\n '(focusout)': 'onFocusOut($event)',\n },\n})\nexport class HxSelect<V = unknown> implements ControlValueAccessor, FormValueControl<V | null> {\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #injector = inject(Injector);\n\n /** The options: primitives or objects. */\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<Accessor<never, string>>('label');\n readonly optionValue = input<Accessor<never, unknown>>('value');\n readonly optionDisabled = input<Accessor<never, boolean>>('disabled');\n readonly placeholder = input('');\n readonly emptyMessage = input('No options');\n readonly size = input<HxSelectSize>('medium');\n readonly variant = input<HxSelectVariant>('outlined');\n readonly fluid = input(false, { transform: booleanAttribute });\n /** Shows a button that resets the value to `null`. */\n readonly showClear = input(false, { transform: booleanAttribute });\n /** The `id` of the trigger, for a `<label for>`. */\n readonly inputId = input<string>();\n readonly ariaLabel = input<string>();\n readonly ariaLabelledby = input<string>();\n /** How values are compared to find the selected option (default: `Object.is`). */\n readonly compareWith = input<(a: unknown, b: unknown) => boolean>(compareValues);\n\n // The signal-forms contract (FormValueControl): value, disabled, invalid, touch.\n readonly value = model<V | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n\n readonly open = signal(false);\n protected readonly panelWidth = signal(0);\n protected readonly panelId = nextId('hx-select-panel');\n protected readonly positions: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 2 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -2 },\n ];\n\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly listbox = viewChild(CdkListbox);\n\n readonly #cvaDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.#cvaDisabled());\n\n protected readonly items = computed<HxSelectItem[]>(() =>\n resolveOptions(this.options(), this.optionLabel(), this.optionValue(), this.optionDisabled()),\n );\n\n protected readonly selected = computed(() => {\n const compare = this.compareWith();\n const current = this.value();\n return current === null ? undefined : this.items().find((item) => compare(item.value, current));\n });\n\n protected readonly canClear = computed(\n () => this.showClear() && !!this.selected() && !this.isDisabled(),\n );\n\n protected readonly selectedValues = computed(() => {\n const item = this.selected();\n return item ? [item.value] : [];\n });\n\n #onChange: (value: V | null) => void = () => {};\n #onTouched: () => void = () => {};\n\n // ControlValueAccessor (template-driven and reactive forms)\n writeValue(value: V | null): void {\n this.value.set(value ?? null);\n }\n registerOnChange(fn: (value: V | null) => void): void {\n this.#onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.#cvaDisabled.set(disabled);\n }\n\n /** Focuses the trigger (signal forms call this to focus the control). */\n focus(options?: FocusOptions): void {\n this.trigger().nativeElement.focus(options);\n }\n\n protected toggle(): void {\n if (this.open()) this.close();\n else this.show();\n }\n\n protected show(): void {\n if (this.isDisabled() || this.open()) return;\n this.panelWidth.set(this.#host.nativeElement.getBoundingClientRect().width);\n this.open.set(true);\n }\n\n protected close(refocus = false): void {\n if (!this.open()) return;\n this.open.set(false);\n if (refocus) this.focus();\n }\n\n protected onAttach(): void {\n // the listbox lives in the overlay template: focus it once it has rendered\n afterNextRender(() => this.listbox()?.focus(), { injector: this.#injector });\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n this.show();\n }\n }\n\n protected onOverlayKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close(true);\n } else if (event.key === 'Tab') {\n this.close();\n }\n }\n\n protected onOutsideClick(event: MouseEvent): void {\n if (!this.#host.nativeElement.contains(event.target as Node)) this.close();\n }\n\n protected onSelect(event: ListboxValueChangeEvent<unknown>): void {\n const [picked] = event.value;\n this.#commit((picked ?? null) as V | null);\n this.close(true);\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.#commit(null);\n this.focus();\n }\n\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (this.open() || (next && this.#host.nativeElement.contains(next))) return;\n this.#touched();\n }\n\n #commit(value: V | null): void {\n this.value.set(value);\n this.#onChange(value);\n }\n\n #touched(): void {\n this.#onTouched();\n this.touch.emit();\n }\n}\n","<button\n #trigger\n type=\"button\"\n class=\"hx-select-trigger\"\n role=\"combobox\"\n cdkOverlayOrigin\n #origin=\"cdkOverlayOrigin\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId() ?? null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span class=\"hx-select-label\" [class.hx-select-placeholder]=\"!selected()\">{{\n selected()?.label ?? placeholder()\n }}</span>\n <span class=\"hx-select-chevron\" aria-hidden=\"true\"></span>\n</button>\n@if (canClear()) {\n <button type=\"button\" class=\"hx-select-clear\" aria-label=\"Clear selection\" (click)=\"clear($event)\">\n <span class=\"hx-select-clear-icon\" aria-hidden=\"true\"></span>\n </button>\n}\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayPanelClass=\"hx-select-overlay\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"panelWidth()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n (attach)=\"onAttach()\"\n (detach)=\"close()\"\n>\n <div class=\"hx-select-panel\">\n <div\n cdkListbox\n class=\"hx-select-list\"\n [id]=\"panelId\"\n [cdkListboxValue]=\"selectedValues()\"\n [cdkListboxUseActiveDescendant]=\"true\"\n [cdkListboxCompareWith]=\"compareWith()\"\n [attr.aria-label]=\"ariaLabel() ?? placeholder() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (cdkListboxValueChange)=\"onSelect($event)\"\n >\n @for (item of items(); track $index) {\n <div\n class=\"hx-select-option\"\n [cdkOption]=\"item.value\"\n [cdkOptionDisabled]=\"item.disabled\"\n [cdkOptionTypeaheadLabel]=\"item.label\"\n >\n <span class=\"hx-select-check\" aria-hidden=\"true\"></span>\n <span>{{ item.label }}</span>\n </div>\n } @empty {\n <div class=\"hx-select-empty\">{{ emptyMessage() }}</div>\n }\n </div>\n </div>\n</ng-template>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { type Accessor, type HxOption, resolveOptions } from '../internal/options';\n\nexport type HxSelectButtonSize = 'small' | 'medium' | 'large';\n\n/**\n * A choice among a few options shown as a joined group of toggle buttons. Single choice by default,\n * `multiple` for a list of values. The buttons are native buttons with `aria-pressed`.\n *\n * ```html\n * <hx-select-button [options]=\"['Left', 'Center', 'Right']\" [(ngModel)]=\"align\" [allowEmpty]=\"false\" />\n * ```\n */\n@Component({\n selector: 'hx-select-button',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => HxSelectButton), multi: true },\n ],\n host: {\n class: 'hx-select-button',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledby()',\n '[class.hx-select-button-sm]': \"size() === 'small'\",\n '[class.hx-select-button-lg]': \"size() === 'large'\",\n '[class.hx-select-button-fluid]': 'fluid()',\n '[class.hx-select-button-invalid]': 'invalid()',\n '[class.hx-select-button-disabled]': 'isDisabled()',\n },\n template: `\n @for (item of items(); track $index) {\n <button\n type=\"button\"\n class=\"hx-select-button-option\"\n [class.hx-select-button-option-checked]=\"isChecked(item)\"\n [attr.aria-pressed]=\"isChecked(item)\"\n [disabled]=\"isDisabled() || item.disabled\"\n (click)=\"toggle(item)\"\n (blur)=\"onBlur()\"\n >\n <span class=\"hx-select-button-content\">{{ item.label }}</span>\n </button>\n }\n `,\n})\nexport class HxSelectButton implements ControlValueAccessor, FormValueControl<unknown> {\n readonly options = input<readonly unknown[]>([]);\n readonly optionLabel = input<Accessor<never, string>>('label');\n readonly optionValue = input<Accessor<never, unknown>>('value');\n readonly optionDisabled = input<Accessor<never, boolean>>('disabled');\n /** Several options can be chosen; the value is then an array. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Whether the chosen option can be switched off again (single choice). */\n readonly allowEmpty = input(true, { transform: booleanAttribute });\n readonly size = input<HxSelectButtonSize>('medium');\n readonly fluid = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string>();\n readonly ariaLabelledby = input<string>();\n\n // The signal-forms contract (FormValueControl): value, disabled, invalid, touch.\n readonly value = model<unknown>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n\n readonly #cvaDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.#cvaDisabled());\n\n protected readonly items = computed<HxOption[]>(() =>\n resolveOptions(this.options(), this.optionLabel(), this.optionValue(), this.optionDisabled()),\n );\n\n #onChange: (value: unknown) => void = () => {};\n #onTouched: () => void = () => {};\n\n writeValue(value: unknown): void {\n this.value.set(value ?? (this.multiple() ? [] : null));\n }\n registerOnChange(fn: (value: unknown) => void): void {\n this.#onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n setDisabledState(disabled: boolean): void {\n this.#cvaDisabled.set(disabled);\n }\n\n protected isChecked(item: HxOption): boolean {\n const current = this.value();\n return this.multiple()\n ? Array.isArray(current) && current.some((v) => Object.is(v, item.value))\n : Object.is(current, item.value);\n }\n\n protected toggle(item: HxOption): void {\n const checked = this.isChecked(item);\n let next: unknown;\n if (this.multiple()) {\n const current = Array.isArray(this.value()) ? (this.value() as unknown[]) : [];\n next = checked ? current.filter((v) => !Object.is(v, item.value)) : [...current, item.value];\n } else if (checked) {\n if (!this.allowEmpty()) return;\n next = null;\n } else {\n next = item.value;\n }\n this.value.set(next);\n this.#onChange(next);\n }\n\n protected onBlur(): void {\n this.#onTouched();\n this.touch.emit();\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * A native `<input type=\"checkbox\">` with `role=\"switch\"`, drawn as a Helix toggle switch (CSS only).\n * Use it for a setting that takes effect immediately; label it with the setting's name, not the action.\n *\n * ```html\n * <label><input type=\"checkbox\" hx-switch [(ngModel)]=\"darkMode\" /> Dark mode</label>\n * ```\n */\n@Directive({\n selector: 'input[hx-switch]',\n exportAs: 'hx-switch',\n host: {\n class: 'hx-switch',\n role: 'switch',\n },\n})\nexport class HxSwitch {}\n","// The surface scales the theme service offers: the neutral scales of Tailwind and three Helix extras. Each is the\n// 12 steps of `--h-surface-0 … --h-surface-950`; the scale replaces the surface of both colour schemes.\nexport const HX_SURFACES = {\n slate: {\n 0: '#ffffff',\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n gray: {\n 0: '#ffffff',\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n zinc: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f4f4f5',\n 200: '#e4e4e7',\n 300: '#d4d4d8',\n 400: '#a1a1aa',\n 500: '#71717a',\n 600: '#52525b',\n 700: '#3f3f46',\n 800: '#27272a',\n 900: '#18181b',\n 950: '#09090b',\n },\n neutral: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#e5e5e5',\n 300: '#d4d4d4',\n 400: '#a3a3a3',\n 500: '#737373',\n 600: '#525252',\n 700: '#404040',\n 800: '#262626',\n 900: '#171717',\n 950: '#0a0a0a',\n },\n stone: {\n 0: '#ffffff',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d6d3d1',\n 400: '#a8a29e',\n 500: '#78716c',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#0c0a09',\n },\n soho: {\n 0: '#ffffff',\n 50: '#ececec',\n 100: '#dedfdf',\n 200: '#c4c4c6',\n 300: '#adaeb0',\n 400: '#97979b',\n 500: '#7f8084',\n 600: '#6a6b70',\n 700: '#55565b',\n 800: '#3f4046',\n 900: '#2c2c34',\n 950: '#16161d',\n },\n viva: {\n 0: '#ffffff',\n 50: '#f3f3f3',\n 100: '#e7e7e8',\n 200: '#cfd0d0',\n 300: '#b7b8b9',\n 400: '#9fa1a1',\n 500: '#87898a',\n 600: '#6e7173',\n 700: '#565a5b',\n 800: '#3e4244',\n 900: '#262b2c',\n 950: '#0e1315',\n },\n ocean: {\n 0: '#ffffff',\n 50: '#fbfcfc',\n 100: '#F7F9F8',\n 200: '#EFF3F2',\n 300: '#DADEDD',\n 400: '#B1B7B6',\n 500: '#828787',\n 600: '#5F7274',\n 700: '#415B61',\n 800: '#29444E',\n 900: '#183240',\n 950: '#0c1920',\n },\n} as const;\n\nexport type HxSurface = keyof typeof HX_SURFACES;\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n type EnvironmentProviders,\n effect,\n Injectable,\n InjectionToken,\n inject,\n makeEnvironmentProviders,\n PLATFORM_ID,\n provideEnvironmentInitializer,\n signal,\n} from '@angular/core';\nimport { HX_SURFACES, type HxSurface } from './surfaces';\n\n/** The colour scales an app can choose as its primary colour; `noir` uses the surface scale (black and white). */\nexport const HX_PRIMARY_COLORS = [\n 'emerald',\n 'green',\n 'lime',\n 'orange',\n 'amber',\n 'yellow',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n 'noir',\n] as const;\nexport type HxPrimaryColor = (typeof HX_PRIMARY_COLORS)[number];\nexport const HX_SURFACE_NAMES = Object.keys(HX_SURFACES) as HxSurface[];\nexport type { HxSurface };\n\nconst STEPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const;\nconst SURFACE_STEPS = [0, ...STEPS] as const;\n\nexport interface HxThemeOptions {\n /**\n * How dark mode is switched on: a class on `<html>` (`.app-dark`, the default, also the selector of\n * `tokens.css`) or an attribute (`[data-theme=\"dark\"]`).\n */\n darkSelector?: string;\n /** Where the choice is remembered (localStorage). `null` (the default) remembers nothing. */\n storageKey?: string | null;\n /** Dark mode when nothing is remembered; by default the system setting (`prefers-color-scheme`). */\n dark?: boolean;\n /** The primary colour when nothing is remembered; `null` is the one of the preset (indigo). */\n primary?: HxPrimaryColor | null;\n /** The surface scale when nothing is remembered; `null` is the one of the preset. */\n surface?: HxSurface | null;\n /**\n * Cross-fades the page when dark mode is switched, with the View Transitions API where the browser has it\n * (the first value at start-up is applied at once). Default `false`.\n */\n viewTransition?: boolean;\n}\n\n/** The scales of the surfaces, by name: for swatches in a colour chooser (`HX_SURFACES.zinc[500]`). */\nexport { HX_SURFACES };\n\nexport const HX_THEME_OPTIONS = new InjectionToken<HxThemeOptions>('HX_THEME_OPTIONS', {\n providedIn: 'root',\n factory: () => ({}),\n});\n\ninterface Saved {\n dark?: boolean;\n primary?: HxPrimaryColor | null;\n surface?: HxSurface | null;\n}\n\n/** A class (`.app-dark`) or an attribute (`[data-theme=\"dark\"]`) selector, split into what the DOM needs. */\nexport function parseDarkSelector(selector: string): {\n css: string;\n apply: (el: Element, on: boolean) => void;\n} {\n const cls = /^\\.([a-zA-Z][\\w-]*)$/.exec(selector);\n if (cls) {\n return { css: selector, apply: (el, on) => el.classList.toggle(cls[1], on) };\n }\n const attr = /^\\[([\\w-]+)(?:=[\"']?([^\"'\\]]+)[\"']?)?\\]$/.exec(selector);\n if (attr) {\n const [, name, value = ''] = attr;\n return {\n css: selector,\n apply: (el, on) => (on ? el.setAttribute(name, value) : el.removeAttribute(name)),\n };\n }\n throw new Error(\n `HxTheme darkSelector \"${selector}\": use a class (\".app-dark\") or an attribute (\"[data-theme=dark]\")`,\n );\n}\n\nconst scale = (name: string) =>\n STEPS.map((step) => `--h-primary-${step}:var(--h-${name}-${step});`).join('');\n\n/** The primary colour: its scale, and for `noir` the scheme-dependent roles that are no scale step. */\nfunction primaryCss(primary: HxPrimaryColor, dark: string): string {\n if (primary !== 'noir') return `:root:root{${scale(primary)}}`;\n const light =\n `${STEPS.map((step) => `--h-primary-${step}:var(--h-surface-${step});`).join('')}` +\n '--h-primary-color:var(--h-primary-950);--h-primary-contrast-color:#ffffff;' +\n '--h-primary-hover-color:var(--h-primary-800);--h-primary-active-color:var(--h-primary-700);' +\n '--h-highlight-background:var(--h-primary-950);--h-highlight-focus-background:var(--h-primary-700);' +\n '--h-highlight-color:#ffffff;--h-highlight-focus-color:#ffffff;';\n const night =\n '--h-primary-color:var(--h-primary-50);--h-primary-contrast-color:var(--h-primary-950);' +\n '--h-primary-hover-color:var(--h-primary-200);--h-primary-active-color:var(--h-primary-300);' +\n '--h-highlight-background:var(--h-primary-50);--h-highlight-focus-background:var(--h-primary-300);' +\n '--h-highlight-color:var(--h-primary-950);--h-highlight-focus-color:var(--h-primary-950);';\n return `:root:root{${light}}:root:root${dark}{${night}}`;\n}\n\n/** The surface scale, the same in both colour schemes (as the configurator of the shell always did). */\nfunction surfaceCss(surface: HxSurface, dark: string): string {\n const palette = HX_SURFACES[surface] as Record<number, string>;\n const body = SURFACE_STEPS.map((step) => `--h-surface-${step}:${palette[step]};`).join('');\n return `:root:root{${body}}:root:root${dark}{${body}}`;\n}\n\n/**\n * Switches dark mode, the primary colour and the surface scale while the app runs, with CSS custom properties\n * only: no styling engine, no rebuild of the tokens. `tokens.css` defines every `--h-*` token for the Helix look;\n * this service overrides the ones that carry the colour choice, in a style sheet of its own that wins over\n * `tokens.css` in both colour schemes.\n *\n * ```ts\n * // app.config.ts\n * provideHxTheme({ storageKey: 'my-app-theme' })\n *\n * // anywhere\n * readonly theme = inject(HxTheme);\n * theme.toggleDark();\n * theme.setPrimary('emerald');\n * theme.setSurface('zinc');\n * ```\n *\n * Nothing touches the DOM on the server; `css()` is the style text, for an app that renders it itself.\n */\n@Injectable({ providedIn: 'root' })\nexport class HxTheme {\n readonly #doc = inject(DOCUMENT);\n readonly #browser = isPlatformBrowser(inject(PLATFORM_ID));\n readonly #options = inject(HX_THEME_OPTIONS);\n readonly #darkSelector = parseDarkSelector(this.#options.darkSelector ?? '.app-dark');\n readonly #saved = this.#load();\n\n readonly #dark = signal(this.#saved.dark ?? this.#options.dark ?? this.#systemDark());\n readonly #primary = signal<HxPrimaryColor | null>(\n this.#saved.primary ?? this.#options.primary ?? null,\n );\n readonly #surface = signal<HxSurface | null>(\n this.#saved.surface ?? this.#options.surface ?? null,\n );\n\n readonly dark = this.#dark.asReadonly();\n readonly primary = this.#primary.asReadonly();\n readonly surface = this.#surface.asReadonly();\n\n /** The overrides for the chosen primary colour and surface (empty while both are the preset's own). */\n readonly css = computed(() => {\n const dark = this.#darkSelector.css;\n const primary = this.#primary();\n const surface = this.#surface();\n return `${surface ? surfaceCss(surface, dark) : ''}${primary ? primaryCss(primary, dark) : ''}`;\n });\n\n #darkApplied = false;\n #write: ((css: string) => void) | null = null;\n #remove: (() => void) | null = null;\n\n constructor() {\n effect(() => {\n const dark = this.#dark();\n if (!this.#browser) return;\n const root = this.#doc.documentElement;\n const doc = this.#doc as Document & { startViewTransition?: (update: () => void) => unknown };\n const apply = () => this.#darkSelector.apply(root, dark);\n // the first value is the start-up state: nothing to cross-fade from\n if (this.#darkApplied && this.#options.viewTransition && doc.startViewTransition) {\n doc.startViewTransition(apply);\n } else {\n apply();\n }\n this.#darkApplied = true;\n });\n effect(() => {\n const css = this.css();\n if (this.#browser) this.#writeSheet(css);\n });\n effect(() =>\n this.#save({ dark: this.#dark(), primary: this.#primary(), surface: this.#surface() }),\n );\n // an instance that is not the root one (provided on a component) takes its overrides with it\n inject(DestroyRef).onDestroy(() => this.#remove?.());\n }\n\n setDark(dark: boolean): void {\n this.#dark.set(dark);\n }\n\n toggleDark(): void {\n this.#dark.update((dark) => !dark);\n }\n\n /** `null` goes back to the primary colour of the preset. */\n setPrimary(primary: HxPrimaryColor | null): void {\n if (primary !== null && !HX_PRIMARY_COLORS.includes(primary))\n throw new Error(`unknown primary colour \"${primary}\"`);\n this.#primary.set(primary);\n }\n\n /** `null` goes back to the surface scale of the preset. */\n setSurface(surface: HxSurface | null): void {\n if (surface !== null && !(surface in HX_SURFACES))\n throw new Error(`unknown surface \"${surface}\"`);\n this.#surface.set(surface);\n }\n\n #systemDark(): boolean {\n const view = this.#doc.defaultView;\n return this.#browser && !!view?.matchMedia?.('(prefers-color-scheme: dark)').matches;\n }\n\n #load(): Saved {\n const key = this.#options.storageKey;\n if (!this.#browser || !key) return {};\n try {\n const value = JSON.parse(\n this.#doc.defaultView?.localStorage.getItem(key) ?? 'null',\n ) as Saved | null;\n return value && typeof value === 'object' ? value : {};\n } catch {\n return {}; // blocked or damaged storage: start from the defaults\n }\n }\n\n #save(state: Saved): void {\n const key = this.#options.storageKey;\n if (!this.#browser || !key) return;\n try {\n this.#doc.defaultView?.localStorage.setItem(key, JSON.stringify(state));\n } catch {\n // storage full or blocked: the choice just does not survive a reload\n }\n }\n\n /** One style sheet of the service: a constructed one where the browser has them, else a `<style>`. */\n #writeSheet(css: string): void {\n if (!this.#write) {\n const doc = this.#doc;\n const view = doc.defaultView as (Window & { CSSStyleSheet?: typeof CSSStyleSheet }) | null;\n if (\n view?.CSSStyleSheet &&\n 'adoptedStyleSheets' in doc &&\n 'replaceSync' in view.CSSStyleSheet.prototype\n ) {\n const sheet = new view.CSSStyleSheet();\n doc.adoptedStyleSheets = [...doc.adoptedStyleSheets, sheet];\n this.#write = (text) => sheet.replaceSync(text);\n this.#remove = () => {\n doc.adoptedStyleSheets = doc.adoptedStyleSheets.filter((s) => s !== sheet);\n };\n } else {\n const style = doc.createElement('style');\n style.setAttribute('data-hx-theme', '');\n doc.head.appendChild(style);\n this.#write = (text) => {\n style.textContent = text;\n };\n this.#remove = () => style.remove();\n }\n }\n this.#write(css);\n }\n}\n\n/** Provides the theme service with its options and creates it at start-up, so the saved choice applies at once. */\nexport function provideHxTheme(options: HxThemeOptions = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: HX_THEME_OPTIONS, useValue: options },\n provideEnvironmentInitializer(() => {\n inject(HxTheme);\n }),\n ]);\n}\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Directive,\n ElementRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { nextId } from '../internal/ids';\n\nexport type HxTooltipPosition = 'top' | 'right' | 'bottom' | 'left';\nexport type HxTooltipEvent = 'hover' | 'focus' | 'both';\n\n/** The bubble. Created by the directive in a CDK overlay. */\n@Component({\n selector: 'hx-tooltip-bubble',\n template: '{{ text() }}',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'hx-tooltip', role: 'tooltip', '[id]': 'id' },\n})\nexport class HxTooltipBubble {\n readonly text = signal('');\n id = '';\n}\n\nconst POSITIONS = {\n top: { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' },\n bottom: { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' },\n left: { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' },\n right: { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' },\n} as const;\n\n/** Where to flip to when the preferred side does not fit. */\nconst OPPOSITE: Record<HxTooltipPosition, HxTooltipPosition> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/**\n * A short text that explains an element, shown on hover and/or keyboard focus (CDK overlay, `role=\"tooltip\"`,\n * `aria-describedby` on the host). Escape closes it. It is a hint, not a place for essential information.\n *\n * ```html\n * <button hx-button iconOnly aria-label=\"Add\" hx-tooltip=\"Add item\" hxTooltipPosition=\"right\">+</button>\n * ```\n */\n@Directive({\n selector: '[hx-tooltip]',\n host: {\n '[attr.aria-describedby]': 'shown() ? bubbleId : null',\n '(mouseenter)': 'onEnter(\"hover\")',\n '(mouseleave)': 'onLeave(\"hover\")',\n '(focusin)': 'onEnter(\"focus\")',\n '(focusout)': 'onLeave(\"focus\")',\n '(keydown.escape)': 'hide()',\n '(click)': 'hide()',\n },\n})\nexport class HxTooltip {\n readonly #overlay = inject(Overlay);\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The text. Empty or null shows nothing. */\n readonly text = input<string | null | undefined>('', { alias: 'hx-tooltip' });\n readonly position = input<HxTooltipPosition>('top', { alias: 'hxTooltipPosition' });\n readonly event = input<HxTooltipEvent>('both', { alias: 'hxTooltipEvent' });\n readonly disabled = input(false, { alias: 'hxTooltipDisabled' });\n /** Milliseconds before it appears. */\n readonly showDelay = input(0, { alias: 'hxTooltipShowDelay' });\n\n protected readonly bubbleId = nextId('hx-tooltip');\n protected readonly shown = signal(false);\n #ref: OverlayRef | null = null;\n #bubble: HxTooltipBubble | null = null;\n #timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.dispose());\n // keep a visible bubble in sync with the inputs, and drop it when it has nothing to say\n effect(() => {\n const text = this.text();\n if (this.disabled() || !text) this.hide();\n else if (this.#bubble) this.#bubble.text.set(text);\n this.position();\n this.#ref?.updatePositionStrategy(this.#strategy());\n });\n }\n\n protected onEnter(source: 'hover' | 'focus'): void {\n const event = this.event();\n if (event !== 'both' && event !== source) return;\n this.show();\n }\n\n protected onLeave(source: 'hover' | 'focus'): void {\n const event = this.event();\n if (event !== 'both' && event !== source) return;\n this.hide();\n }\n\n #strategy() {\n const preferred = this.position();\n const margin = 4;\n const offset = (p: HxTooltipPosition) =>\n p === 'top'\n ? { offsetY: -margin }\n : p === 'bottom'\n ? { offsetY: margin }\n : p === 'left'\n ? { offsetX: -margin }\n : { offsetX: margin };\n return this.#overlay\n .position()\n .flexibleConnectedTo(this.#host)\n .withPositions(\n [preferred, OPPOSITE[preferred]].map((p) => ({ ...POSITIONS[p], ...offset(p) })),\n )\n .withPush(true);\n }\n\n show(): void {\n const text = this.text();\n if (this.disabled() || !text || this.#ref) return;\n clearTimeout(this.#timer);\n const delay = this.showDelay();\n if (delay > 0) this.#timer = setTimeout(() => this.#create(text), delay);\n else this.#create(text);\n }\n\n #create(text: string): void {\n if (this.#ref) return;\n this.#ref = this.#overlay.create({\n positionStrategy: this.#strategy(),\n scrollStrategy: this.#overlay.scrollStrategies.close(),\n panelClass: 'hx-tooltip-overlay',\n });\n const bubble = this.#ref.attach(new ComponentPortal(HxTooltipBubble));\n bubble.instance.id = this.bubbleId;\n bubble.instance.text.set(text);\n this.#bubble = bubble.instance;\n this.shown.set(true);\n }\n\n hide(): void {\n clearTimeout(this.#timer);\n this.dispose();\n }\n\n private dispose(): void {\n clearTimeout(this.#timer);\n this.#ref?.dispose();\n this.#ref = null;\n this.#bubble = null;\n this.shown.set(false);\n }\n}\n"],"mappings":"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AAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,SAAS;EACP,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,OAAO;EACL,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,MAAM;EACJ,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;CACD,OAAO;EACL,GAAG;EACH,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;CACN;AACO;AClGV,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACQ;AAEV,MAAa,mBAAmB,OAAO,KAAK,WAAW;AAGvD,MAAM,QAAQ;CAAC;CAAI;CAAK;CAAK;CAAK;CAAK;CAAK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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gravionlabs/helix-ui",
|
|
3
|
-
"version": "22.1.
|
|
3
|
+
"version": "22.1.27",
|
|
4
4
|
"description": "Helix UI: vanilla Angular components on the Helix design tokens — plain CSS, no runtime styling engine.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -41,6 +41,10 @@
|
|
|
41
41
|
"types": "./types/gravionlabs-helix-ui.d.ts",
|
|
42
42
|
"default": "./fesm2022/gravionlabs-helix-ui.mjs"
|
|
43
43
|
},
|
|
44
|
+
"./validators": {
|
|
45
|
+
"types": "./types/gravionlabs-helix-ui-validators.d.ts",
|
|
46
|
+
"default": "./fesm2022/gravionlabs-helix-ui-validators.mjs"
|
|
47
|
+
},
|
|
44
48
|
"./styles.css": "./styles.css",
|
|
45
49
|
"./tokens.css": "./tokens.css"
|
|
46
50
|
},
|
package/styles.css
CHANGED
|
@@ -189,11 +189,12 @@
|
|
|
189
189
|
|
|
190
190
|
.hx-breadcrumb-separator {
|
|
191
191
|
display: inline-block;
|
|
192
|
+
flex: none;
|
|
192
193
|
width: 1em;
|
|
193
194
|
height: 1em;
|
|
194
|
-
flex: none;
|
|
195
195
|
background: var(--h-breadcrumb-separator-color);
|
|
196
196
|
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
197
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -1246,10 +1247,13 @@
|
|
|
1246
1247
|
}
|
|
1247
1248
|
|
|
1248
1249
|
.hx-select-chevron {
|
|
1250
|
+
display: inline-block;
|
|
1249
1251
|
flex: none;
|
|
1250
|
-
width:
|
|
1251
|
-
height:
|
|
1252
|
-
|
|
1252
|
+
width: 1rem;
|
|
1253
|
+
height: 1rem;
|
|
1254
|
+
background: var(--h-select-dropdown-color);
|
|
1255
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
1256
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
1253
1257
|
}
|
|
1254
1258
|
|
|
1255
1259
|
.hx-select-clear {
|
|
@@ -1265,9 +1269,14 @@
|
|
|
1265
1269
|
cursor: pointer;
|
|
1266
1270
|
}
|
|
1267
1271
|
|
|
1268
|
-
.hx-select-clear
|
|
1269
|
-
|
|
1270
|
-
|
|
1272
|
+
.hx-select-clear-icon {
|
|
1273
|
+
display: inline-block;
|
|
1274
|
+
flex: none;
|
|
1275
|
+
width: 1rem;
|
|
1276
|
+
height: 1rem;
|
|
1277
|
+
background: currentcolor;
|
|
1278
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
1279
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
1271
1280
|
}
|
|
1272
1281
|
|
|
1273
1282
|
.hx-select-has-clear .hx-select-trigger {
|
|
@@ -1388,9 +1397,13 @@
|
|
|
1388
1397
|
}
|
|
1389
1398
|
|
|
1390
1399
|
.hx-select-option[aria-selected=true] .hx-select-check {
|
|
1400
|
+
display: inline-block;
|
|
1401
|
+
flex: none;
|
|
1402
|
+
width: 0.875rem;
|
|
1403
|
+
height: 0.875rem;
|
|
1391
1404
|
background: var(--h-select-checkmark-color);
|
|
1392
|
-
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0
|
|
1393
|
-
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0
|
|
1405
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12.5 4.5 4.5L19 7.5'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
1406
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12.5 4.5 4.5L19 7.5'/%3E%3C/svg%3E") center/contain no-repeat;
|
|
1394
1407
|
}
|
|
1395
1408
|
|
|
1396
1409
|
.hx-select-empty {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AbstractControl, ValidatorFn } from "@angular/forms";
|
|
2
|
+
export declare enum ValidatorKey {
|
|
3
|
+
Required = "Required",
|
|
4
|
+
Email = "Email",
|
|
5
|
+
Number = "Number",
|
|
6
|
+
Integer = "Integer",
|
|
7
|
+
Min = "Min",
|
|
8
|
+
Max = "Max",
|
|
9
|
+
MinLength = "MinLength",
|
|
10
|
+
MaxLength = "MaxLength",
|
|
11
|
+
Pattern = "Pattern",
|
|
12
|
+
Date = "Date",
|
|
13
|
+
OneOf = "OneOf",
|
|
14
|
+
AllOf = "AllOf"
|
|
15
|
+
}
|
|
16
|
+
export type ValidatorMessage = (value: any) => string;
|
|
17
|
+
declare const EMPTY_VALUES: (string | null | undefined)[];
|
|
18
|
+
declare const isEmptyValue: (v: unknown) => boolean;
|
|
19
|
+
declare const checkEmpty: (allowEmpty: boolean, check: (value: unknown) => boolean) => (ctrl: AbstractControl) => boolean;
|
|
20
|
+
declare const buildValidator: (isValid: (ctrl: AbstractControl) => boolean, key: ValidatorKey, msg: string | ValidatorMessage) => ValidatorFn;
|
|
21
|
+
export declare const Validators: {
|
|
22
|
+
required: (msg: string | ValidatorMessage) => ValidatorFn;
|
|
23
|
+
email: (msg: string | ValidatorMessage, allowEmpty?: boolean) => ValidatorFn;
|
|
24
|
+
pattern: (msg: string | ValidatorMessage, regex: RegExp, allowEmpty?: boolean) => ValidatorFn;
|
|
25
|
+
date: (msg: string | ValidatorMessage, allowEmpty?: boolean) => ValidatorFn;
|
|
26
|
+
number: (msg: string | ValidatorMessage, allowEmpty?: boolean) => ValidatorFn;
|
|
27
|
+
integer: (msg: string | ValidatorMessage, allowEmpty?: boolean) => ValidatorFn;
|
|
28
|
+
min: (msg: string | ValidatorMessage, minimum: number, allowEmpty?: boolean) => ValidatorFn;
|
|
29
|
+
max: (msg: string | ValidatorMessage, maximum: number, allowEmpty?: boolean) => ValidatorFn;
|
|
30
|
+
minLength: (msg: string | ValidatorMessage, min: number, allowEmpty?: boolean) => ValidatorFn;
|
|
31
|
+
maxLength: (msg: string | ValidatorMessage, max: number, allowEmpty?: boolean) => ValidatorFn;
|
|
32
|
+
oneOf: (msg: string | ValidatorMessage, options: unknown[]) => ValidatorFn;
|
|
33
|
+
allOf: (msg: string | ValidatorMessage, options: unknown[], allowEmpty?: boolean) => ValidatorFn;
|
|
34
|
+
};
|
|
35
|
+
export { EMPTY_VALUES, buildValidator, checkEmpty, isEmptyValue };
|
|
@@ -4,18 +4,48 @@ import { ControlValueAccessor } from "@angular/forms";
|
|
|
4
4
|
import { FormValueControl } from "@angular/forms/signals";
|
|
5
5
|
import { ListboxValueChangeEvent } from "@angular/cdk/listbox";
|
|
6
6
|
import { ConnectedPosition } from "@angular/cdk/overlay";
|
|
7
|
-
/**
|
|
8
|
-
interface
|
|
7
|
+
/** What a menu item's `command` receives. */
|
|
8
|
+
interface HxMenuItemCommandEvent {
|
|
9
|
+
originalEvent: Event;
|
|
10
|
+
item: HxMenuItem;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* One entry of a menu, menubar, split button or breadcrumb. The shape is compatible with the menu items of
|
|
14
|
+
* the apps that came from helix-core, so an existing model can be passed on as it is.
|
|
15
|
+
*
|
|
16
|
+
* A router link wins over `url`; an item with neither and without `command` is a plain label.
|
|
17
|
+
*/
|
|
18
|
+
interface HxMenuItem {
|
|
19
|
+
/** Text of the entry. */
|
|
9
20
|
label?: string;
|
|
10
21
|
/** CSS classes of an icon font, e.g. `pi pi-home`. */
|
|
11
22
|
icon?: string;
|
|
12
|
-
/** Router link
|
|
23
|
+
/** Router link: a path or commands. */
|
|
13
24
|
routerLink?: string | readonly unknown[];
|
|
25
|
+
/** Query parameters of the router link. */
|
|
26
|
+
queryParams?: Record<string, unknown>;
|
|
27
|
+
/** External address, opened as a normal link. */
|
|
14
28
|
url?: string;
|
|
29
|
+
/** Link target, e.g. `_blank`. */
|
|
15
30
|
target?: string;
|
|
31
|
+
/** Called when the entry is activated. */
|
|
32
|
+
command?(event: HxMenuItemCommandEvent): void;
|
|
33
|
+
/** Child entries: a submenu, or a group when the entry has no action of its own. */
|
|
34
|
+
items?: HxMenuItem[];
|
|
16
35
|
disabled?: boolean;
|
|
36
|
+
/** `false` hides the entry. */
|
|
17
37
|
visible?: boolean;
|
|
38
|
+
/** Draws a line instead of an entry. */
|
|
39
|
+
separator?: boolean;
|
|
40
|
+
/** Id of the rendered element. */
|
|
41
|
+
id?: string;
|
|
42
|
+
/** Accessible name when the label is missing or not enough (icon-only entries). */
|
|
43
|
+
ariaLabel?: string;
|
|
44
|
+
/** A short text shown next to the label, e.g. a count. */
|
|
45
|
+
badge?: string;
|
|
18
46
|
}
|
|
47
|
+
/** One step of the trail: the menu item model, of which the breadcrumb uses label, icon, link and state. */
|
|
48
|
+
type HxBreadcrumbItem = HxMenuItem;
|
|
19
49
|
/**
|
|
20
50
|
* The path to the current page. The last item is the current page (`aria-current="page"`).
|
|
21
51
|
*
|
|
@@ -24,8 +54,8 @@ interface HxBreadcrumbItem {
|
|
|
24
54
|
* ```
|
|
25
55
|
*/
|
|
26
56
|
export declare class HxBreadcrumb {
|
|
27
|
-
readonly model: import("@angular/core").InputSignal<readonly
|
|
28
|
-
readonly home: import("@angular/core").InputSignal<
|
|
57
|
+
readonly model: import("@angular/core").InputSignal<readonly HxMenuItem[]>;
|
|
58
|
+
readonly home: import("@angular/core").InputSignal<HxMenuItem | undefined>;
|
|
29
59
|
/** Accessible name of the navigation landmark. */
|
|
30
60
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
31
61
|
protected items(): HxBreadcrumbItem[];
|
|
@@ -365,15 +395,26 @@ export declare class HxRadio {
|
|
|
365
395
|
};
|
|
366
396
|
}, {}, never, never, true, never>;
|
|
367
397
|
}
|
|
368
|
-
|
|
369
|
-
type
|
|
370
|
-
/** An option
|
|
371
|
-
interface
|
|
398
|
+
/** A property name of an option, or a function that reads the value from it. */
|
|
399
|
+
type Accessor<O, R> = string | ((option: O) => R);
|
|
400
|
+
/** An option after `optionLabel`, `optionValue` and `optionDisabled` are applied. */
|
|
401
|
+
interface HxOption<V = unknown> {
|
|
372
402
|
label: string;
|
|
373
403
|
value: V;
|
|
374
404
|
disabled: boolean;
|
|
375
405
|
}
|
|
376
|
-
|
|
406
|
+
/** How values are compared to find the chosen option: `Object.is` unless the app passes its own. */
|
|
407
|
+
declare const compareValues: (a: unknown, b: unknown) => boolean;
|
|
408
|
+
/**
|
|
409
|
+
* Turns the `options` input of a component into `{ label, value, disabled }` entries. A primitive is its own
|
|
410
|
+
* label and value; an object is read through the accessors (a property name or a function). A missing label is
|
|
411
|
+
* an empty string, a missing value is the object itself, a missing `disabled` is `false`.
|
|
412
|
+
*/
|
|
413
|
+
declare function resolveOptions<V = unknown>(options: readonly unknown[], label: Accessor<never, string>, value: Accessor<never, unknown>, disabled: Accessor<never, boolean>): HxOption<V>[];
|
|
414
|
+
type HxSelectSize = 'small' | 'medium' | 'large';
|
|
415
|
+
type HxSelectVariant = 'outlined' | 'filled';
|
|
416
|
+
/** An option as the select works with it, after `optionLabel`/`optionValue`/`optionDisabled` are applied. */
|
|
417
|
+
type HxSelectItem<V = unknown> = HxOption<V>;
|
|
377
418
|
/**
|
|
378
419
|
* A single-value select: a `combobox` button that opens a listbox in a CDK connected overlay (typeahead,
|
|
379
420
|
* Arrow/Home/End/Enter/Escape from the CDK listbox). A real form control for template-driven, reactive and
|
|
@@ -394,9 +435,9 @@ export declare class HxSelect<V = unknown> implements ControlValueAccessor, Form
|
|
|
394
435
|
#private;
|
|
395
436
|
/** The options: primitives or objects. */
|
|
396
437
|
readonly options: import("@angular/core").InputSignal<readonly unknown[]>;
|
|
397
|
-
readonly optionLabel: import("@angular/core").InputSignal<Accessor
|
|
398
|
-
readonly optionValue: import("@angular/core").InputSignal<Accessor
|
|
399
|
-
readonly optionDisabled: import("@angular/core").InputSignal<Accessor
|
|
438
|
+
readonly optionLabel: import("@angular/core").InputSignal<Accessor<never, string>>;
|
|
439
|
+
readonly optionValue: import("@angular/core").InputSignal<Accessor<never, unknown>>;
|
|
440
|
+
readonly optionDisabled: import("@angular/core").InputSignal<Accessor<never, boolean>>;
|
|
400
441
|
readonly placeholder: import("@angular/core").InputSignal<string>;
|
|
401
442
|
readonly emptyMessage: import("@angular/core").InputSignal<string>;
|
|
402
443
|
readonly size: import("@angular/core").InputSignal<HxSelectSize>;
|
|
@@ -534,13 +575,6 @@ export declare class HxSelect<V = unknown> implements ControlValueAccessor, Form
|
|
|
534
575
|
}, never, never, true, never>;
|
|
535
576
|
}
|
|
536
577
|
type HxSelectButtonSize = 'small' | 'medium' | 'large';
|
|
537
|
-
/** A string is the name of a property of the option; a function reads it. */
|
|
538
|
-
type Accessor<T> = string | ((option: never) => T);
|
|
539
|
-
interface Item {
|
|
540
|
-
label: string;
|
|
541
|
-
value: unknown;
|
|
542
|
-
disabled: boolean;
|
|
543
|
-
}
|
|
544
578
|
/**
|
|
545
579
|
* A choice among a few options shown as a joined group of toggle buttons. Single choice by default,
|
|
546
580
|
* `multiple` for a list of values. The buttons are native buttons with `aria-pressed`.
|
|
@@ -552,9 +586,9 @@ interface Item {
|
|
|
552
586
|
export declare class HxSelectButton implements ControlValueAccessor, FormValueControl<unknown> {
|
|
553
587
|
#private;
|
|
554
588
|
readonly options: import("@angular/core").InputSignal<readonly unknown[]>;
|
|
555
|
-
readonly optionLabel: import("@angular/core").InputSignal<Accessor<string>>;
|
|
556
|
-
readonly optionValue: import("@angular/core").InputSignal<Accessor<unknown>>;
|
|
557
|
-
readonly optionDisabled: import("@angular/core").InputSignal<Accessor<boolean>>;
|
|
589
|
+
readonly optionLabel: import("@angular/core").InputSignal<Accessor<never, string>>;
|
|
590
|
+
readonly optionValue: import("@angular/core").InputSignal<Accessor<never, unknown>>;
|
|
591
|
+
readonly optionDisabled: import("@angular/core").InputSignal<Accessor<never, boolean>>;
|
|
558
592
|
/** Several options can be chosen; the value is then an array. */
|
|
559
593
|
readonly multiple: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
560
594
|
/** Whether the chosen option can be switched off again (single choice). */
|
|
@@ -568,13 +602,13 @@ export declare class HxSelectButton implements ControlValueAccessor, FormValueCo
|
|
|
568
602
|
readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
569
603
|
readonly touch: import("@angular/core").OutputEmitterRef<void>;
|
|
570
604
|
protected readonly isDisabled: import("@angular/core").Signal<boolean>;
|
|
571
|
-
protected readonly items: import("@angular/core").Signal<
|
|
605
|
+
protected readonly items: import("@angular/core").Signal<HxOption<unknown>[]>;
|
|
572
606
|
writeValue(value: unknown): void;
|
|
573
607
|
registerOnChange(fn: (value: unknown) => void): void;
|
|
574
608
|
registerOnTouched(fn: () => void): void;
|
|
575
609
|
setDisabledState(disabled: boolean): void;
|
|
576
|
-
protected isChecked(item:
|
|
577
|
-
protected toggle(item:
|
|
610
|
+
protected isChecked(item: HxOption): boolean;
|
|
611
|
+
protected toggle(item: HxOption): void;
|
|
578
612
|
protected onBlur(): void;
|
|
579
613
|
static ɵfac: i0.ɵɵFactoryDeclaration<HxSelectButton, never>;
|
|
580
614
|
static ɵcmp: i0.ɵɵComponentDeclaration<HxSelectButton, "hx-select-button", never, {
|
|
@@ -906,4 +940,4 @@ export declare class HxTooltip {
|
|
|
906
940
|
};
|
|
907
941
|
}, {}, never, never, true, never>;
|
|
908
942
|
}
|
|
909
|
-
export type { HxBreadcrumbItem, HxButtonSeverity, HxButtonSize, HxButtonVariant, HxCheckboxSize, HxDividerAlign, HxDividerLayout, HxDividerType, HxInputSize, HxInputVariant, HxPrimaryColor, HxRadioSize, HxSelectButtonSize, HxSelectItem, HxSelectSize, HxSelectVariant, HxSurface, HxThemeOptions, HxTooltipEvent, HxTooltipPosition };
|
|
943
|
+
export type { HxBreadcrumbItem, HxButtonSeverity, HxButtonSize, HxButtonVariant, HxCheckboxSize, HxDividerAlign, HxDividerLayout, HxDividerType, HxInputSize, HxInputVariant, HxMenuItem, HxMenuItemCommandEvent, HxPrimaryColor, HxRadioSize, HxSelectButtonSize, HxSelectItem, HxSelectSize, HxSelectVariant, HxSurface, HxThemeOptions, HxTooltipEvent, HxTooltipPosition };
|