@vadem/ui 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vasyl Demchuk
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -92,3 +92,9 @@ Manrope and JetBrains Mono are distributed under SIL OFL 1.1; their notices are
92
92
  in `fonts/`. Lucide icon geometry is distributed under ISC; see `LICENSE-lucide.txt`.
93
93
 
94
94
  Getting started and copyable application examples: [usage guide](https://github.com/Demchuk12/vadem-ui-angular/blob/main/docs/GETTING_STARTED.md).
95
+
96
+ ## License
97
+
98
+ Vadem's own code is licensed under the MIT License; see `LICENSE` in the package.
99
+ Third-party fonts, icon geometry, and vendored design skills retain their respective licenses
100
+ and notices; they are not relicensed by the Vadem license.
@@ -86,6 +86,13 @@ var VdListboxBase = class VdListboxBase {
86
86
  list.addEventListener("toggle", onToggle);
87
87
  this.destroyRef.onDestroy(() => list.removeEventListener("toggle", onToggle));
88
88
  });
89
+ afterRenderEffect(() => {
90
+ if (this.isDisabled()) this.closeList();
91
+ else if (this.open()) {
92
+ const active = this.activeOption();
93
+ if (!active || active.disabled()) this.activate("first");
94
+ }
95
+ });
89
96
  afterRenderEffect(() => {
90
97
  const id = this.activeId();
91
98
  if (!this.open() || !id) return;
@@ -129,7 +136,7 @@ var VdListboxBase = class VdListboxBase {
129
136
  this.onChange(value);
130
137
  }
131
138
  markTouched() {
132
- this.onTouched();
139
+ if (!this.isDisabled()) this.onTouched();
133
140
  }
134
141
  openList(start = "selected") {
135
142
  if (this.isDisabled() || this.open()) return;
@@ -349,6 +356,7 @@ var VdCombobox = class VdCombobox extends VdListboxBase {
349
356
  }
350
357
  writeValue(value) {
351
358
  this.value.set(value ?? null);
359
+ this.query.set(null);
352
360
  }
353
361
  choose(option) {
354
362
  if (option.disabled() || this.isDisabled()) return;
@@ -670,16 +678,6 @@ var VdMultiSelect = class VdMultiSelect extends VdListboxBase {
670
678
  disabled: option?.disabled() ?? false
671
679
  };
672
680
  }), ...ngDevMode ? [{ debugName: "selectedItems" }] : /* istanbul ignore next */ []);
673
- constructor() {
674
- super();
675
- afterRenderEffect(() => {
676
- if (this.isDisabled()) this.closeList();
677
- else if (this.open()) {
678
- const active = this.activeOption();
679
- if (!active || active.disabled()) this.activate("first");
680
- }
681
- });
682
- }
683
681
  listEl() {
684
682
  return this.list()?.nativeElement;
685
683
  }
@@ -762,7 +760,7 @@ var VdMultiSelect = class VdMultiSelect extends VdListboxBase {
762
760
  version: "22.2.1",
763
761
  ngImport: i0,
764
762
  type: VdMultiSelect,
765
- deps: [],
763
+ deps: null,
766
764
  target: i0.ɵɵFactoryTarget.Component
767
765
  });
768
766
  static ɵcmp = i0.ɵɵngDeclareComponent({
@@ -1005,7 +1003,6 @@ i0.ɵɵngDeclareClassMetadata({
1005
1003
  encapsulation: ViewEncapsulation.None
1006
1004
  }]
1007
1005
  }],
1008
- ctorParameters: () => [],
1009
1006
  propDecorators: {
1010
1007
  value: [{
1011
1008
  type: i0.Input,
@@ -1 +1 @@
1
- {"version":3,"file":"vadem-ui-select.mjs","names":[],"sources":["../../../projects/ui/select/src/listbox-base.ts","../../../projects/ui/select/src/listbox-host.ts","../../../projects/ui/select/src/combobox.ts","../../../projects/ui/select/src/core/multi-selection.ts","../../../projects/ui/select/src/multi-select.ts","../../../projects/ui/select/src/option.ts","../../../projects/ui/select/src/select.ts"],"sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n ModelSignal,\n OnInit,\n Signal,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport {\n VD_FIELD,\n VdFieldControl,\n VdNgControlState,\n vdNgControlState,\n vdUniqueId,\n} from '@vadem/ui/field';\nimport { VdTypeahead, vdListTarget } from '@vadem/ui/keyboard';\nimport { VdListboxHost } from './listbox-host';\nimport type { VdOption } from './option';\nimport { vdTexts } from '@vadem/ui/locale';\n\nexport type VdSelectSize = 'sm' | 'md' | 'lg';\n\nconst NO_NG_STATE: VdNgControlState = {\n invalid: false,\n touched: false,\n disabled: false,\n required: false,\n};\n\n/**\n * Shared behavior of select, combobox, and multi-select: option registry, active option\n * (aria-activedescendant - focus stays on the combobox element), popover listbox anchored to\n * the field, value + ControlValueAccessor, and `vd-field` wiring.\n */\n@Directive()\nexport abstract class VdListboxBase<T = string | null>\n implements VdListboxHost, ControlValueAccessor, OnInit\n{\n /** Concrete controls define a single-value or array-valued selection model. */\n abstract readonly value: ModelSignal<T>;\n readonly placeholder = input('');\n readonly size = input<VdSelectSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Invalid state (e.g. server error); form validity is detected after touch. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Gate for `invalid`; Signal Forms binds it (FormUiControl contract). */\n readonly touched = input<boolean | undefined>(undefined);\n readonly required = input(false, { transform: booleanAttribute });\n /** Shown when no option is visible (e.g. nothing matches the filter). */\n readonly emptyText = input<string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly t = vdTexts('select', { emptyText: this.emptyText });\n /** Accessible name when there's no `vd-field` label; applied to the inner combobox element. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n readonly listboxId = vdUniqueId('vd-listbox');\n readonly controlId = vdUniqueId('vd-combobox');\n\n protected readonly field = inject(VD_FIELD, { optional: true });\n protected readonly hostEl: HTMLElement = inject(ElementRef).nativeElement;\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly options = signal<readonly VdOption[]>([]);\n protected readonly open = signal(false);\n protected readonly activeId = signal<string | null>(null);\n private readonly formDisabled = signal(false);\n private readonly ngSource = signal<Signal<VdNgControlState> | null>(null);\n private readonly typeahead = new VdTypeahead();\n\n /** The popover listbox element. */\n protected abstract listEl(): HTMLElement | undefined;\n /** What the listbox is anchored to (the visible field). */\n protected abstract anchorEl(): HTMLElement | undefined;\n\n protected readonly ordered = computed(() =>\n [...this.options()].sort((a, b) =>\n a.el.compareDocumentPosition(b.el) & a.el.DOCUMENT_POSITION_FOLLOWING ? -1 : 1,\n ),\n );\n protected readonly visibleOptions = computed(() =>\n this.ordered().filter((o) => this.isVisible(o)),\n );\n protected readonly selectedOption = computed(() =>\n this.ordered().find((o) => this.isSelected(o)),\n );\n protected readonly selectedLabel = computed(() => this.selectedOption()?.textLabel() ?? '');\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n private readonly ngState = computed(() => this.ngSource()?.() ?? NO_NG_STATE);\n\n protected readonly showInvalid = computed(() => {\n if (this.invalid() && this.touched() !== false) return true;\n const ng = this.ngState();\n return ng.invalid && ng.touched;\n });\n protected readonly isRequired = computed(() => this.required() || this.ngState().required);\n protected readonly describedBy = computed(() => this.field?.describedBy() ?? null);\n\n private onChange: (value: T) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n constructor() {\n const fieldControl: VdFieldControl = {\n id: signal(this.controlId),\n invalid: this.showInvalid,\n required: this.isRequired,\n disabled: this.isDisabled,\n };\n this.field?.register(fieldControl);\n this.destroyRef.onDestroy(() => this.field?.unregister(fieldControl));\n\n // Browser-only: anchor the listbox and keep `open` in sync with light dismiss / Escape.\n afterNextRender(() => {\n const list = this.listEl();\n const anchor = this.anchorEl();\n if (!list || !anchor) return;\n const name = `--${this.listboxId}`;\n anchor.style.setProperty('anchor-name', name);\n list.style.setProperty('position-anchor', name);\n const onToggle = (e: Event) => {\n if ((e as ToggleEvent).newState === 'closed') this.afterClose();\n };\n list.addEventListener('toggle', onToggle);\n this.destroyRef.onDestroy(() => list.removeEventListener('toggle', onToggle));\n });\n\n // Keep the active option visible while navigating.\n afterRenderEffect(() => {\n const id = this.activeId();\n if (!this.open() || !id) return;\n this.ordered()\n .find((o) => o.id === id)\n ?.el.scrollIntoView({ block: 'nearest' });\n });\n }\n\n ngOnInit(): void {\n // Can't inject NgControl in the constructor: it depends on this value accessor.\n const ngControl = this.injector.get(NgControl, null, { self: true, optional: true });\n this.ngSource.set(vdNgControlState(ngControl, this.destroyRef));\n }\n\n // ------------------------------------------------------------- VdListboxHost\n\n abstract isSelected(option: VdOption): boolean;\n\n isActive(option: VdOption): boolean {\n return option.id === this.activeId();\n }\n\n isVisible(_option: VdOption): boolean {\n return true;\n }\n\n abstract choose(option: VdOption): void;\n\n hover(option: VdOption): void {\n if (!option.disabled()) this.activeId.set(option.id);\n }\n\n register(option: VdOption): () => void {\n this.options.update((list) => [...list, option]);\n return () => this.options.update((list) => list.filter((o) => o !== option));\n }\n\n // --------------------------------------------------------- ControlValueAccessor\n\n abstract writeValue(value: T | null): void;\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n\n // ------------------------------------------------------------------ internals\n\n /** Hook for subclasses after an option was chosen. */\n protected onChosen(_option: VdOption): void {\n /* default: nothing */\n }\n\n /** Hook for subclasses after the list closed (any reason). */\n protected onClosed(): void {\n /* default: nothing */\n }\n\n protected setValue(value: T): void {\n if (value === this.value()) return;\n this.value.set(value);\n this.onChange(value);\n }\n\n protected markTouched(): void {\n this.onTouched();\n }\n\n protected openList(start: 'selected' | 'first' | 'last' = 'selected'): void {\n if (this.isDisabled() || this.open()) return;\n const list = this.listEl();\n if (!list) return;\n this.open.set(true);\n // `source` ties the popover to its field: clicks on the field don't light-dismiss it.\n // Engines without the option ignore it.\n list.showPopover({ source: this.anchorEl() } as ShowPopoverOptions);\n this.activate(start);\n }\n\n protected closeList(): void {\n const list = this.listEl();\n if (list?.matches(':popover-open')) list.hidePopover();\n else this.afterClose();\n }\n\n protected activate(start: 'selected' | 'first' | 'last'): void {\n const visible = this.visibleOptions();\n const enabled = visible.filter((o) => !o.disabled());\n const pick =\n start === 'selected'\n ? (enabled.find((o) => this.isSelected(o)) ?? enabled[0])\n : start === 'first'\n ? enabled[0]\n : enabled[enabled.length - 1];\n this.activeId.set(pick?.id ?? null);\n }\n\n /** Handles list navigation keys. Returns true when the key was used. */\n protected navigate(event: KeyboardEvent): boolean {\n const visible = this.visibleOptions();\n const current = visible.findIndex((o) => o.id === this.activeId());\n const target = vdListTarget(\n event.key,\n current,\n visible.map((o) => o.disabled()),\n { loop: false, pageSize: 10 },\n );\n if (target === null) return false;\n event.preventDefault();\n this.activeId.set(visible[target]?.id ?? null);\n return true;\n }\n\n /** Feeds a printable key to typeahead. Returns the matched option, if any. */\n protected typeaheadMatch(event: KeyboardEvent): VdOption | undefined {\n if (!VdTypeahead.accepts(event)) return undefined;\n const visible = this.visibleOptions();\n const current = visible.findIndex(\n (o) => o.id === (this.activeId() ?? this.selectedOption()?.id),\n );\n const idx = this.typeahead.match(\n event.key,\n visible.map((o) => o.textLabel()),\n visible.map((o) => o.disabled()),\n current,\n );\n return idx === null ? undefined : visible[idx];\n }\n\n protected activeOption(): VdOption | undefined {\n return this.visibleOptions().find((o) => o.id === this.activeId());\n }\n\n private afterClose(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.activeId.set(null);\n this.typeahead.reset();\n this.onClosed();\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { VdOption } from './option';\n\n/** What an option needs from the select, combobox, or multi-select that owns it. */\nexport interface VdListboxHost {\n isSelected(option: VdOption): boolean;\n isActive(option: VdOption): boolean;\n isVisible(option: VdOption): boolean;\n choose(option: VdOption): void;\n hover(option: VdOption): void;\n register(option: VdOption): () => void;\n}\n\nexport const VD_LISTBOX = new InjectionToken<VdListboxHost>('VD_LISTBOX');\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { vdMatchesQuery } from '@vadem/ui/keyboard';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\n\n/**\n * Editable combobox with list autocomplete (APG): type to filter, pick with arrows + Enter or\n * click. The value is always one of the options; free text reverts on blur. Spec: specs/select.md\n */\n@Component({\n selector: 'vd-combobox',\n imports: [VdIcon],\n template: `\n <!-- Pointer convenience only: the input inside handles every key. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n #field\n class=\"vd-combobox__field\"\n (pointerdown)=\"onFieldPointerDown($event)\"\n (click)=\"onFieldClick($event)\"\n >\n <vd-icon name=\"search\" class=\"vd-combobox__icon\" />\n <input\n #input\n class=\"vd-combobox__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [id]=\"controlId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </div>\n <div #list class=\"vd-listbox\" popover=\"auto\" role=\"listbox\" [id]=\"listboxId\" tabindex=\"-1\">\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-combobox',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n // Naming attributes move to the inner combobox element.\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdCombobox) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdCombobox), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdCombobox extends VdListboxBase {\n readonly value = model<string | null>(null);\n\n isSelected(option: VdOption): boolean {\n return option.value() === this.value();\n }\n\n writeValue(value: string | null): void {\n this.value.set(value ?? null);\n }\n\n choose(option: VdOption): void {\n if (option.disabled() || this.isDisabled()) return;\n this.setValue(option.value());\n this.onChosen();\n this.closeList();\n }\n\n private readonly fieldRef = viewChild.required<ElementRef<HTMLElement>>('field');\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n\n /** Text being typed; `null` when not filtering (the input shows the selected label). */\n private readonly query = signal<string | null>(null);\n protected readonly inputText = computed(() => this.query() ?? this.selectedLabel());\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.fieldRef()?.nativeElement;\n }\n\n focus(): void {\n this.inputRef().nativeElement.focus();\n }\n\n override isVisible(option: VdOption): boolean {\n const q = this.query();\n return q === null || vdMatchesQuery(option.textLabel(), q);\n }\n\n protected override onChosen(): void {\n this.query.set(null);\n }\n\n protected override onClosed(): void {\n this.query.set(null);\n if (this.hostEl.ownerDocument.activeElement !== this.inputRef().nativeElement)\n this.markTouched();\n }\n\n /** Whether the list was open when the press started (light dismiss may close it first). */\n private wasOpen = false;\n\n protected onFieldPointerDown(event: PointerEvent): void {\n this.wasOpen = this.open();\n const input = this.inputRef().nativeElement;\n // Icons and padding focus the input instead of stealing focus.\n if (event.target !== input && !this.isDisabled()) {\n event.preventDefault();\n input.focus();\n }\n }\n\n protected onFieldClick(event: MouseEvent): void {\n if (this.isDisabled()) return;\n const onInput = event.target === this.inputRef().nativeElement;\n if (this.open() && !onInput) this.closeList();\n else if (!this.open() && !(this.wasOpen && !onInput)) this.openList('selected');\n this.wasOpen = false;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n if (!this.open()) this.openList('first');\n else this.activate('first');\n }\n\n protected onBlur(): void {\n this.query.set(null);\n if (!this.open()) this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const { key, altKey } = event;\n\n if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n this.openList(key === 'ArrowUp' ? 'last' : 'selected');\n }\n return;\n }\n\n if (key === 'Escape') {\n event.preventDefault();\n this.closeList();\n } else if (key === 'Enter' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (key === 'Tab') {\n this.closeList();\n } else if (key !== 'Home' && key !== 'End') {\n // Home/End keep moving the caret in the text field.\n this.navigate(event);\n }\n }\n}\n","/** Immutable, unique selection values. Unknown values remain until the consumer removes them. */\nexport function vdUniqueSelection(values: readonly string[] | null): string[] {\n return [...new Set(values ?? [])];\n}\n\nexport function vdToggleSelection(values: readonly string[], value: string): string[] {\n return values.includes(value)\n ? values.filter((item) => item !== value)\n : [...new Set([...values, value])];\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n computed,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { vdMatchesQuery } from '@vadem/ui/keyboard';\nimport { vdToggleSelection, vdUniqueSelection } from './core/multi-selection';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\nimport { vdTexts } from '@vadem/ui/locale';\n\n/** Searchable multiple selection. Spec: specs/multi-select.md. */\n@Component({\n selector: 'vd-multi-select',\n imports: [VdIcon],\n template: `\n <div #field class=\"vd-multi-select__field\" (pointerdown)=\"onFieldPointerDown($event)\">\n @for (item of selectedItems(); track item.value) {\n <span class=\"vd-multi-select__chip\">\n <span class=\"vd-multi-select__label\" [title]=\"item.label\">{{ item.label }}</span>\n <button\n type=\"button\"\n class=\"vd-multi-select__remove\"\n [disabled]=\"isDisabled() || item.disabled\"\n [attr.aria-label]=\"multiTexts().removeLabel(item.label)\"\n (click)=\"remove(item.value)\"\n >\n <vd-icon name=\"x\" />\n </button>\n </span>\n }\n <input\n #input\n class=\"vd-multi-select__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n autocomplete=\"off\"\n [id]=\"controlId\"\n [value]=\"query()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"descriptionIds()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (click)=\"openList()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (compositionend)=\"onInput($event)\"\n />\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </div>\n <span class=\"vd-visually-hidden\" [id]=\"summaryId\" role=\"status\" aria-atomic=\"true\">\n {{ multiTexts().selectionLabel(selectedItems().length) }}\n </span>\n <div\n #list\n class=\"vd-listbox vd-multi-select__list\"\n popover=\"auto\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [id]=\"listboxId\"\n tabindex=\"-1\"\n >\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-multi-select',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n '(focusout)': 'onFocusOut($event)',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdMultiSelect) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdMultiSelect), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdMultiSelect extends VdListboxBase<string[]> {\n readonly value = model<string[]>([]);\n readonly removeLabel = input<(label: string) => string>();\n readonly selectionLabel = input<(count: number) => string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly multiTexts = vdTexts('multiSelect', {\n removeLabel: this.removeLabel,\n selectionLabel: this.selectionLabel,\n });\n\n private readonly fieldRef = viewChild.required<ElementRef<HTMLElement>>('field');\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n protected readonly query = signal('');\n protected readonly summaryId = vdUniqueId('vd-selection');\n protected readonly descriptionIds = computed(() =>\n [this.describedBy(), this.summaryId].filter(Boolean).join(' '),\n );\n protected readonly selectedItems = computed(() =>\n vdUniqueSelection(this.value()).map((value) => {\n const option = this.ordered().find((item) => item.value() === value);\n return { value, label: option?.textLabel() || value, disabled: option?.disabled() ?? false };\n }),\n );\n\n constructor() {\n super();\n afterRenderEffect(() => {\n if (this.isDisabled()) this.closeList();\n else if (this.open()) {\n // A query, dynamic option removal, or disabled change must never leave a dangling id.\n const active = this.activeOption();\n if (!active || active.disabled()) this.activate('first');\n }\n });\n }\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.fieldRef()?.nativeElement;\n }\n\n focus(): void {\n this.inputRef().nativeElement.focus();\n }\n\n isSelected(option: VdOption): boolean {\n return this.value().includes(option.value());\n }\n\n override isVisible(option: VdOption): boolean {\n return vdMatchesQuery(option.textLabel(), this.query());\n }\n\n choose(option: VdOption): void {\n if (this.isDisabled() || option.disabled()) return;\n this.setValue(vdToggleSelection(this.value(), option.value()));\n this.focus();\n }\n\n writeValue(value: string[] | null): void {\n this.value.set(vdUniqueSelection(value));\n }\n\n protected remove(value: string): void {\n const item = this.selectedItems().find((item) => item.value === value);\n if (this.isDisabled() || item?.disabled) return;\n this.setValue(this.value().filter((item) => item !== value));\n this.focus();\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n if ((event as InputEvent).isComposing) return;\n this.openList('first');\n this.activate('first');\n }\n\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (next && this.hostEl.contains(next)) return;\n this.markTouched();\n this.closeList();\n }\n\n protected onFieldPointerDown(event: PointerEvent): void {\n const target = event.target as HTMLElement;\n if (this.isDisabled() || target.closest('button') || target === this.inputRef().nativeElement)\n return;\n event.preventDefault();\n this.focus();\n this.openList();\n }\n\n protected override onClosed(): void {\n this.query.set('');\n if (!this.hostEl.contains(this.hostEl.ownerDocument.activeElement)) this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.isComposing || this.isDisabled()) return;\n const { key, altKey } = event;\n if (key === 'Backspace' && this.query() === '') {\n const last = this.selectedItems().at(-1);\n if (last && !last.disabled) {\n event.preventDefault();\n this.remove(last.value);\n }\n } else if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n this.openList(key === 'ArrowUp' ? 'last' : 'selected');\n }\n } else if (key === 'Escape' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n event.stopPropagation();\n this.closeList();\n } else if (key === 'Enter') {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n } else if (key === 'Tab') {\n this.closeList();\n } else if (key !== 'Home' && key !== 'End') {\n this.navigate(event);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n OnInit,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VD_LISTBOX } from './listbox-host';\n\n/** One option of select, combobox, or multi-select. Specs: select.md, multi-select.md. */\n@Component({\n selector: 'vd-option',\n imports: [VdIcon],\n template: `\n <span class=\"vd-option__label\"><ng-content /></span>\n <vd-icon name=\"check\" class=\"vd-option__check\" />\n `,\n host: {\n class: 'vd-option',\n role: 'option',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.data-active]': 'active() ? \"\" : null',\n '[hidden]': '!visible()',\n '(click)': 'host.choose(this)',\n '(pointermove)': 'host.hover(this)',\n // Keep focus on the combobox element while clicking options.\n '(mousedown)': '$event.preventDefault()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdOption implements OnInit {\n readonly value = input.required<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Text for the trigger, typeahead and filtering. Defaults to the option's text content. */\n readonly label = input<string>();\n\n protected readonly host = inject(VD_LISTBOX);\n readonly el: HTMLElement = inject(ElementRef).nativeElement;\n readonly id = vdUniqueId('vd-option');\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly selected = computed(() => this.host.isSelected(this));\n protected readonly active = computed(() => this.host.isActive(this));\n protected readonly visible = computed(() => this.host.isVisible(this));\n\n textLabel(): string {\n return this.label() ?? this.el.querySelector('.vd-option__label')?.textContent?.trim() ?? '';\n }\n\n ngOnInit(): void {\n this.destroyRef.onDestroy(this.host.register(this));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n forwardRef,\n model,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\n\n/**\n * Select-only combobox (APG): a button that opens a listbox; focus stays on the button and the\n * active option is exposed with aria-activedescendant. Spec: specs/select.md\n */\n@Component({\n selector: 'vd-select',\n imports: [VdIcon],\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"vd-select__trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"controlId\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (pointerdown)=\"wasOpen = open()\"\n (click)=\"onClick()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n >\n <span class=\"vd-select__value\" [attr.data-placeholder]=\"selectedLabel() ? null : ''\">\n {{ selectedLabel() || placeholder() }}\n </span>\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </button>\n <div #list class=\"vd-listbox\" popover=\"auto\" role=\"listbox\" [id]=\"listboxId\" tabindex=\"-1\">\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-select',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n // Naming attributes move to the inner combobox element.\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdSelect) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdSelect), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdSelect extends VdListboxBase {\n readonly value = model<string | null>(null);\n\n isSelected(option: VdOption): boolean {\n return option.value() === this.value();\n }\n\n writeValue(value: string | null): void {\n this.value.set(value ?? null);\n }\n\n choose(option: VdOption): void {\n if (option.disabled() || this.isDisabled()) return;\n this.setValue(option.value());\n this.onChosen(option);\n this.closeList();\n }\n\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n /** Light dismiss closes the list on pointerdown; the following click must not reopen it. */\n protected wasOpen = false;\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.trigger()?.nativeElement;\n }\n\n focus(): void {\n this.trigger().nativeElement.focus();\n }\n\n protected onClick(): void {\n if (this.wasOpen || this.open()) {\n this.wasOpen = false;\n this.closeList();\n return;\n }\n this.openList('selected');\n }\n\n protected onBlur(): void {\n if (!this.open()) this.markTouched();\n }\n\n protected override onClosed(): void {\n // Light dismiss moved focus elsewhere: the user has left the field.\n if (this.hostEl.ownerDocument.activeElement !== this.trigger().nativeElement)\n this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const { key, altKey } = event;\n\n if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.openList('selected');\n } else if (key === 'Home' || key === 'End') {\n event.preventDefault();\n this.openList(key === 'Home' ? 'first' : 'last');\n } else {\n const match = this.typeaheadMatch(event);\n if (match) {\n // APG: typing on a closed select opens it on the match.\n this.openList('selected');\n this.activeId.set(match.id);\n }\n }\n return;\n }\n\n if (key === 'Escape') {\n event.preventDefault();\n this.closeList();\n } else if (key === 'Enter' || key === ' ' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (key === 'Tab') {\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (!this.navigate(event)) {\n const match = this.typeaheadMatch(event);\n if (match) this.activeId.set(match.id);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vadem-ui-select.mjs","names":[],"sources":["../../../projects/ui/select/src/listbox-base.ts","../../../projects/ui/select/src/listbox-host.ts","../../../projects/ui/select/src/combobox.ts","../../../projects/ui/select/src/core/multi-selection.ts","../../../projects/ui/select/src/multi-select.ts","../../../projects/ui/select/src/option.ts","../../../projects/ui/select/src/select.ts"],"sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n ModelSignal,\n OnInit,\n Signal,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport {\n VD_FIELD,\n VdFieldControl,\n VdNgControlState,\n vdNgControlState,\n vdUniqueId,\n} from '@vadem/ui/field';\nimport { VdTypeahead, vdListTarget } from '@vadem/ui/keyboard';\nimport { VdListboxHost } from './listbox-host';\nimport type { VdOption } from './option';\nimport { vdTexts } from '@vadem/ui/locale';\n\nexport type VdSelectSize = 'sm' | 'md' | 'lg';\n\nconst NO_NG_STATE: VdNgControlState = {\n invalid: false,\n touched: false,\n disabled: false,\n required: false,\n};\n\n/**\n * Shared behavior of select, combobox, and multi-select: option registry, active option\n * (aria-activedescendant - focus stays on the combobox element), popover listbox anchored to\n * the field, value + ControlValueAccessor, and `vd-field` wiring.\n */\n@Directive()\nexport abstract class VdListboxBase<T = string | null>\n implements VdListboxHost, ControlValueAccessor, OnInit\n{\n /** Concrete controls define a single-value or array-valued selection model. */\n abstract readonly value: ModelSignal<T>;\n readonly placeholder = input('');\n readonly size = input<VdSelectSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Invalid state (e.g. server error); form validity is detected after touch. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Gate for `invalid`; Signal Forms binds it (FormUiControl contract). */\n readonly touched = input<boolean | undefined>(undefined);\n readonly required = input(false, { transform: booleanAttribute });\n /** Shown when no option is visible (e.g. nothing matches the filter). */\n readonly emptyText = input<string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly t = vdTexts('select', { emptyText: this.emptyText });\n /** Accessible name when there's no `vd-field` label; applied to the inner combobox element. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n readonly listboxId = vdUniqueId('vd-listbox');\n readonly controlId = vdUniqueId('vd-combobox');\n\n protected readonly field = inject(VD_FIELD, { optional: true });\n protected readonly hostEl: HTMLElement = inject(ElementRef).nativeElement;\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly options = signal<readonly VdOption[]>([]);\n protected readonly open = signal(false);\n protected readonly activeId = signal<string | null>(null);\n private readonly formDisabled = signal(false);\n private readonly ngSource = signal<Signal<VdNgControlState> | null>(null);\n private readonly typeahead = new VdTypeahead();\n\n /** The popover listbox element. */\n protected abstract listEl(): HTMLElement | undefined;\n /** What the listbox is anchored to (the visible field). */\n protected abstract anchorEl(): HTMLElement | undefined;\n\n protected readonly ordered = computed(() =>\n [...this.options()].sort((a, b) =>\n a.el.compareDocumentPosition(b.el) & a.el.DOCUMENT_POSITION_FOLLOWING ? -1 : 1,\n ),\n );\n protected readonly visibleOptions = computed(() =>\n this.ordered().filter((o) => this.isVisible(o)),\n );\n protected readonly selectedOption = computed(() =>\n this.ordered().find((o) => this.isSelected(o)),\n );\n protected readonly selectedLabel = computed(() => this.selectedOption()?.textLabel() ?? '');\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n private readonly ngState = computed(() => this.ngSource()?.() ?? NO_NG_STATE);\n\n protected readonly showInvalid = computed(() => {\n if (this.invalid() && this.touched() !== false) return true;\n const ng = this.ngState();\n return ng.invalid && ng.touched;\n });\n protected readonly isRequired = computed(() => this.required() || this.ngState().required);\n protected readonly describedBy = computed(() => this.field?.describedBy() ?? null);\n\n private onChange: (value: T) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n constructor() {\n const fieldControl: VdFieldControl = {\n id: signal(this.controlId),\n invalid: this.showInvalid,\n required: this.isRequired,\n disabled: this.isDisabled,\n };\n this.field?.register(fieldControl);\n this.destroyRef.onDestroy(() => this.field?.unregister(fieldControl));\n\n // Browser-only: anchor the listbox and keep `open` in sync with light dismiss / Escape.\n afterNextRender(() => {\n const list = this.listEl();\n const anchor = this.anchorEl();\n if (!list || !anchor) return;\n const name = `--${this.listboxId}`;\n anchor.style.setProperty('anchor-name', name);\n list.style.setProperty('position-anchor', name);\n const onToggle = (e: Event) => {\n if ((e as ToggleEvent).newState === 'closed') this.afterClose();\n };\n list.addEventListener('toggle', onToggle);\n this.destroyRef.onDestroy(() => list.removeEventListener('toggle', onToggle));\n });\n\n // Dynamic options and disabled state must not leave an inaccessible open list.\n afterRenderEffect(() => {\n if (this.isDisabled()) this.closeList();\n else if (this.open()) {\n const active = this.activeOption();\n if (!active || active.disabled()) this.activate('first');\n }\n });\n\n // Keep the active option visible while navigating.\n afterRenderEffect(() => {\n const id = this.activeId();\n if (!this.open() || !id) return;\n this.ordered()\n .find((o) => o.id === id)\n ?.el.scrollIntoView({ block: 'nearest' });\n });\n }\n\n ngOnInit(): void {\n // Can't inject NgControl in the constructor: it depends on this value accessor.\n const ngControl = this.injector.get(NgControl, null, { self: true, optional: true });\n this.ngSource.set(vdNgControlState(ngControl, this.destroyRef));\n }\n\n // ------------------------------------------------------------- VdListboxHost\n\n abstract isSelected(option: VdOption): boolean;\n\n isActive(option: VdOption): boolean {\n return option.id === this.activeId();\n }\n\n isVisible(_option: VdOption): boolean {\n return true;\n }\n\n abstract choose(option: VdOption): void;\n\n hover(option: VdOption): void {\n if (!option.disabled()) this.activeId.set(option.id);\n }\n\n register(option: VdOption): () => void {\n this.options.update((list) => [...list, option]);\n return () => this.options.update((list) => list.filter((o) => o !== option));\n }\n\n // --------------------------------------------------------- ControlValueAccessor\n\n abstract writeValue(value: T | null): void;\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n\n // ------------------------------------------------------------------ internals\n\n /** Hook for subclasses after an option was chosen. */\n protected onChosen(_option: VdOption): void {\n /* default: nothing */\n }\n\n /** Hook for subclasses after the list closed (any reason). */\n protected onClosed(): void {\n /* default: nothing */\n }\n\n protected setValue(value: T): void {\n if (value === this.value()) return;\n this.value.set(value);\n this.onChange(value);\n }\n\n protected markTouched(): void {\n if (!this.isDisabled()) this.onTouched();\n }\n\n protected openList(start: 'selected' | 'first' | 'last' = 'selected'): void {\n if (this.isDisabled() || this.open()) return;\n const list = this.listEl();\n if (!list) return;\n this.open.set(true);\n // `source` ties the popover to its field: clicks on the field don't light-dismiss it.\n // Engines without the option ignore it.\n list.showPopover({ source: this.anchorEl() } as ShowPopoverOptions);\n this.activate(start);\n }\n\n protected closeList(): void {\n const list = this.listEl();\n if (list?.matches(':popover-open')) list.hidePopover();\n else this.afterClose();\n }\n\n protected activate(start: 'selected' | 'first' | 'last'): void {\n const visible = this.visibleOptions();\n const enabled = visible.filter((o) => !o.disabled());\n const pick =\n start === 'selected'\n ? (enabled.find((o) => this.isSelected(o)) ?? enabled[0])\n : start === 'first'\n ? enabled[0]\n : enabled[enabled.length - 1];\n this.activeId.set(pick?.id ?? null);\n }\n\n /** Handles list navigation keys. Returns true when the key was used. */\n protected navigate(event: KeyboardEvent): boolean {\n const visible = this.visibleOptions();\n const current = visible.findIndex((o) => o.id === this.activeId());\n const target = vdListTarget(\n event.key,\n current,\n visible.map((o) => o.disabled()),\n { loop: false, pageSize: 10 },\n );\n if (target === null) return false;\n event.preventDefault();\n this.activeId.set(visible[target]?.id ?? null);\n return true;\n }\n\n /** Feeds a printable key to typeahead. Returns the matched option, if any. */\n protected typeaheadMatch(event: KeyboardEvent): VdOption | undefined {\n if (!VdTypeahead.accepts(event)) return undefined;\n const visible = this.visibleOptions();\n const current = visible.findIndex(\n (o) => o.id === (this.activeId() ?? this.selectedOption()?.id),\n );\n const idx = this.typeahead.match(\n event.key,\n visible.map((o) => o.textLabel()),\n visible.map((o) => o.disabled()),\n current,\n );\n return idx === null ? undefined : visible[idx];\n }\n\n protected activeOption(): VdOption | undefined {\n return this.visibleOptions().find((o) => o.id === this.activeId());\n }\n\n private afterClose(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.activeId.set(null);\n this.typeahead.reset();\n this.onClosed();\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { VdOption } from './option';\n\n/** What an option needs from the select, combobox, or multi-select that owns it. */\nexport interface VdListboxHost {\n isSelected(option: VdOption): boolean;\n isActive(option: VdOption): boolean;\n isVisible(option: VdOption): boolean;\n choose(option: VdOption): void;\n hover(option: VdOption): void;\n register(option: VdOption): () => void;\n}\n\nexport const VD_LISTBOX = new InjectionToken<VdListboxHost>('VD_LISTBOX');\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { vdMatchesQuery } from '@vadem/ui/keyboard';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\n\n/**\n * Editable combobox with list autocomplete (APG): type to filter, pick with arrows + Enter or\n * click. User choices come from the options; free text reverts on blur. Spec: specs/select.md\n */\n@Component({\n selector: 'vd-combobox',\n imports: [VdIcon],\n template: `\n <!-- Pointer convenience only: the input inside handles every key. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n #field\n class=\"vd-combobox__field\"\n (pointerdown)=\"onFieldPointerDown($event)\"\n (click)=\"onFieldClick($event)\"\n >\n <vd-icon name=\"search\" class=\"vd-combobox__icon\" />\n <input\n #input\n class=\"vd-combobox__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [id]=\"controlId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </div>\n <div #list class=\"vd-listbox\" popover=\"auto\" role=\"listbox\" [id]=\"listboxId\" tabindex=\"-1\">\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-combobox',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n // Naming attributes move to the inner combobox element.\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdCombobox) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdCombobox), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdCombobox extends VdListboxBase {\n readonly value = model<string | null>(null);\n\n isSelected(option: VdOption): boolean {\n return option.value() === this.value();\n }\n\n writeValue(value: string | null): void {\n this.value.set(value ?? null);\n this.query.set(null);\n }\n\n choose(option: VdOption): void {\n if (option.disabled() || this.isDisabled()) return;\n this.setValue(option.value());\n this.onChosen();\n this.closeList();\n }\n\n private readonly fieldRef = viewChild.required<ElementRef<HTMLElement>>('field');\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n\n /** Text being typed; `null` when not filtering (the input shows the selected label). */\n private readonly query = signal<string | null>(null);\n protected readonly inputText = computed(() => this.query() ?? this.selectedLabel());\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.fieldRef()?.nativeElement;\n }\n\n focus(): void {\n this.inputRef().nativeElement.focus();\n }\n\n override isVisible(option: VdOption): boolean {\n const q = this.query();\n return q === null || vdMatchesQuery(option.textLabel(), q);\n }\n\n protected override onChosen(): void {\n this.query.set(null);\n }\n\n protected override onClosed(): void {\n this.query.set(null);\n if (this.hostEl.ownerDocument.activeElement !== this.inputRef().nativeElement)\n this.markTouched();\n }\n\n /** Whether the list was open when the press started (light dismiss may close it first). */\n private wasOpen = false;\n\n protected onFieldPointerDown(event: PointerEvent): void {\n this.wasOpen = this.open();\n const input = this.inputRef().nativeElement;\n // Icons and padding focus the input instead of stealing focus.\n if (event.target !== input && !this.isDisabled()) {\n event.preventDefault();\n input.focus();\n }\n }\n\n protected onFieldClick(event: MouseEvent): void {\n if (this.isDisabled()) return;\n const onInput = event.target === this.inputRef().nativeElement;\n if (this.open() && !onInput) this.closeList();\n else if (!this.open() && !(this.wasOpen && !onInput)) this.openList('selected');\n this.wasOpen = false;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n if (!this.open()) this.openList('first');\n else this.activate('first');\n }\n\n protected onBlur(): void {\n this.query.set(null);\n if (!this.open()) this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const { key, altKey } = event;\n\n if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n this.openList(key === 'ArrowUp' ? 'last' : 'selected');\n }\n return;\n }\n\n if (key === 'Escape') {\n event.preventDefault();\n this.closeList();\n } else if (key === 'Enter' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (key === 'Tab') {\n this.closeList();\n } else if (key !== 'Home' && key !== 'End') {\n // Home/End keep moving the caret in the text field.\n this.navigate(event);\n }\n }\n}\n","/** Immutable, unique selection values. Unknown values remain until the consumer removes them. */\nexport function vdUniqueSelection(values: readonly string[] | null): string[] {\n return [...new Set(values ?? [])];\n}\n\nexport function vdToggleSelection(values: readonly string[], value: string): string[] {\n return values.includes(value)\n ? values.filter((item) => item !== value)\n : [...new Set([...values, value])];\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { vdMatchesQuery } from '@vadem/ui/keyboard';\nimport { vdToggleSelection, vdUniqueSelection } from './core/multi-selection';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\nimport { vdTexts } from '@vadem/ui/locale';\n\n/** Searchable multiple selection. Spec: specs/multi-select.md. */\n@Component({\n selector: 'vd-multi-select',\n imports: [VdIcon],\n template: `\n <div #field class=\"vd-multi-select__field\" (pointerdown)=\"onFieldPointerDown($event)\">\n @for (item of selectedItems(); track item.value) {\n <span class=\"vd-multi-select__chip\">\n <span class=\"vd-multi-select__label\" [title]=\"item.label\">{{ item.label }}</span>\n <button\n type=\"button\"\n class=\"vd-multi-select__remove\"\n [disabled]=\"isDisabled() || item.disabled\"\n [attr.aria-label]=\"multiTexts().removeLabel(item.label)\"\n (click)=\"remove(item.value)\"\n >\n <vd-icon name=\"x\" />\n </button>\n </span>\n }\n <input\n #input\n class=\"vd-multi-select__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n autocomplete=\"off\"\n [id]=\"controlId\"\n [value]=\"query()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"descriptionIds()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (click)=\"openList()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (compositionend)=\"onInput($event)\"\n />\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </div>\n <span class=\"vd-visually-hidden\" [id]=\"summaryId\" role=\"status\" aria-atomic=\"true\">\n {{ multiTexts().selectionLabel(selectedItems().length) }}\n </span>\n <div\n #list\n class=\"vd-listbox vd-multi-select__list\"\n popover=\"auto\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [id]=\"listboxId\"\n tabindex=\"-1\"\n >\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-multi-select',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n '(focusout)': 'onFocusOut($event)',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdMultiSelect) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdMultiSelect), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdMultiSelect extends VdListboxBase<string[]> {\n readonly value = model<string[]>([]);\n readonly removeLabel = input<(label: string) => string>();\n readonly selectionLabel = input<(count: number) => string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly multiTexts = vdTexts('multiSelect', {\n removeLabel: this.removeLabel,\n selectionLabel: this.selectionLabel,\n });\n\n private readonly fieldRef = viewChild.required<ElementRef<HTMLElement>>('field');\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n protected readonly query = signal('');\n protected readonly summaryId = vdUniqueId('vd-selection');\n protected readonly descriptionIds = computed(() =>\n [this.describedBy(), this.summaryId].filter(Boolean).join(' '),\n );\n protected readonly selectedItems = computed(() =>\n vdUniqueSelection(this.value()).map((value) => {\n const option = this.ordered().find((item) => item.value() === value);\n return { value, label: option?.textLabel() || value, disabled: option?.disabled() ?? false };\n }),\n );\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.fieldRef()?.nativeElement;\n }\n\n focus(): void {\n this.inputRef().nativeElement.focus();\n }\n\n isSelected(option: VdOption): boolean {\n return this.value().includes(option.value());\n }\n\n override isVisible(option: VdOption): boolean {\n return vdMatchesQuery(option.textLabel(), this.query());\n }\n\n choose(option: VdOption): void {\n if (this.isDisabled() || option.disabled()) return;\n this.setValue(vdToggleSelection(this.value(), option.value()));\n this.focus();\n }\n\n writeValue(value: string[] | null): void {\n this.value.set(vdUniqueSelection(value));\n }\n\n protected remove(value: string): void {\n const item = this.selectedItems().find((item) => item.value === value);\n if (this.isDisabled() || item?.disabled) return;\n this.setValue(this.value().filter((item) => item !== value));\n this.focus();\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n if ((event as InputEvent).isComposing) return;\n this.openList('first');\n this.activate('first');\n }\n\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (next && this.hostEl.contains(next)) return;\n this.markTouched();\n this.closeList();\n }\n\n protected onFieldPointerDown(event: PointerEvent): void {\n const target = event.target as HTMLElement;\n if (this.isDisabled() || target.closest('button') || target === this.inputRef().nativeElement)\n return;\n event.preventDefault();\n this.focus();\n this.openList();\n }\n\n protected override onClosed(): void {\n this.query.set('');\n if (!this.hostEl.contains(this.hostEl.ownerDocument.activeElement)) this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.isComposing || this.isDisabled()) return;\n const { key, altKey } = event;\n if (key === 'Backspace' && this.query() === '') {\n const last = this.selectedItems().at(-1);\n if (last && !last.disabled) {\n event.preventDefault();\n this.remove(last.value);\n }\n } else if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n this.openList(key === 'ArrowUp' ? 'last' : 'selected');\n }\n } else if (key === 'Escape' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n event.stopPropagation();\n this.closeList();\n } else if (key === 'Enter') {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n } else if (key === 'Tab') {\n this.closeList();\n } else if (key !== 'Home' && key !== 'End') {\n this.navigate(event);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n OnInit,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VD_LISTBOX } from './listbox-host';\n\n/** One option of select, combobox, or multi-select. Specs: select.md, multi-select.md. */\n@Component({\n selector: 'vd-option',\n imports: [VdIcon],\n template: `\n <span class=\"vd-option__label\"><ng-content /></span>\n <vd-icon name=\"check\" class=\"vd-option__check\" />\n `,\n host: {\n class: 'vd-option',\n role: 'option',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.data-active]': 'active() ? \"\" : null',\n '[hidden]': '!visible()',\n '(click)': 'host.choose(this)',\n '(pointermove)': 'host.hover(this)',\n // Keep focus on the combobox element while clicking options.\n '(mousedown)': '$event.preventDefault()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdOption implements OnInit {\n readonly value = input.required<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Text for the trigger, typeahead and filtering. Defaults to the option's text content. */\n readonly label = input<string>();\n\n protected readonly host = inject(VD_LISTBOX);\n readonly el: HTMLElement = inject(ElementRef).nativeElement;\n readonly id = vdUniqueId('vd-option');\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly selected = computed(() => this.host.isSelected(this));\n protected readonly active = computed(() => this.host.isActive(this));\n protected readonly visible = computed(() => this.host.isVisible(this));\n\n textLabel(): string {\n return this.label() ?? this.el.querySelector('.vd-option__label')?.textContent?.trim() ?? '';\n }\n\n ngOnInit(): void {\n this.destroyRef.onDestroy(this.host.register(this));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n forwardRef,\n model,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\n\n/**\n * Select-only combobox (APG): a button that opens a listbox; focus stays on the button and the\n * active option is exposed with aria-activedescendant. Spec: specs/select.md\n */\n@Component({\n selector: 'vd-select',\n imports: [VdIcon],\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"vd-select__trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"controlId\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (pointerdown)=\"wasOpen = open()\"\n (click)=\"onClick()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n >\n <span class=\"vd-select__value\" [attr.data-placeholder]=\"selectedLabel() ? null : ''\">\n {{ selectedLabel() || placeholder() }}\n </span>\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </button>\n <div #list class=\"vd-listbox\" popover=\"auto\" role=\"listbox\" [id]=\"listboxId\" tabindex=\"-1\">\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-select',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n // Naming attributes move to the inner combobox element.\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdSelect) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdSelect), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdSelect extends VdListboxBase {\n readonly value = model<string | null>(null);\n\n isSelected(option: VdOption): boolean {\n return option.value() === this.value();\n }\n\n writeValue(value: string | null): void {\n this.value.set(value ?? null);\n }\n\n choose(option: VdOption): void {\n if (option.disabled() || this.isDisabled()) return;\n this.setValue(option.value());\n this.onChosen(option);\n this.closeList();\n }\n\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n /** Light dismiss closes the list on pointerdown; the following click must not reopen it. */\n protected wasOpen = false;\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.trigger()?.nativeElement;\n }\n\n focus(): void {\n this.trigger().nativeElement.focus();\n }\n\n protected onClick(): void {\n if (this.wasOpen || this.open()) {\n this.wasOpen = false;\n this.closeList();\n return;\n }\n this.openList('selected');\n }\n\n protected onBlur(): void {\n if (!this.open()) this.markTouched();\n }\n\n protected override onClosed(): void {\n // Light dismiss moved focus elsewhere: the user has left the field.\n if (this.hostEl.ownerDocument.activeElement !== this.trigger().nativeElement)\n this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const { key, altKey } = event;\n\n if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.openList('selected');\n } else if (key === 'Home' || key === 'End') {\n event.preventDefault();\n this.openList(key === 'Home' ? 'first' : 'last');\n } else {\n const match = this.typeaheadMatch(event);\n if (match) {\n // APG: typing on a closed select opens it on the match.\n this.openList('selected');\n this.activeId.set(match.id);\n }\n }\n return;\n }\n\n if (key === 'Escape') {\n event.preventDefault();\n this.closeList();\n } else if (key === 'Enter' || key === ' ' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (key === 'Tab') {\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (!this.navigate(event)) {\n const match = this.typeaheadMatch(event);\n if (match) this.activeId.set(match.id);\n }\n }\n}\n"],"mappings":";;;;;;;AA+BA,MAAM,cAAgC;CACpC,SAAS;CACT,SAAS;CACT,UAAU;CACV,UAAU;AACX;AAQD,IAAsB,gBAAtB,MAAsB,cAAa;CAKxB,cAAc,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,OAAO,MAAoB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEpD,UAAU,MAA2B,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,YAAY,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEjB,IAAI,QAAQ,UAAU,EAAE,WAAW,KAAK,UAAS,CAAE;CAE7D,YAAY,MAA0B,QAAS;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,OAAO;CAAY,CAAA;CACtE,iBAAiB,MAA0B,QAAS;EAAA,GAAA,YAAA,EAAA,WAAA,iBAAA,+BAAA,CAAA;EAAI,OAAO;CAAiB,CAAA;CAEhF,YAAY,WAAW,YAAY;CACnC,YAAY,WAAW,aAAa;CAE1B,QAAQ,OAAO,UAAU,EAAE,UAAU,KAAI,CAAE;CAC3C,SAAsB,OAAO,UAAU,CAAC,CAAC;CAC3C,WAAW,OAAO,QAAQ;CAC1B,aAAa,OAAO,UAAU;CAE9B,UAAU,OAA4B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,OAAO,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACpB,WAAW,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,eAAe,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAC5B,WAAW,OAAwC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACxD,YAAY,IAAI,YAAW;CAOzB,UAAU,eAC3B,CAAC,GAAG,KAAK,QAAO,CAAE,CAAC,CAAC,MAAM,GAAG,MAC3B,EAAE,GAAG,wBAAwB,EAAE,EAAE,IAAI,EAAE,GAAG,8BAA8B,KAAK,CAAC,GAEjF,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,iBAAiB,eAClC,KAAK,QAAO,CAAE,CAAC,QAAQ,MAAM,KAAK,UAAU,CAAC,CAAC,GAC/C,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,iBAAiB,eAClC,KAAK,QAAO,CAAE,CAAC,MAAM,MAAM,KAAK,WAAW,CAAC,CAAC,GAC9C,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,gBAAgB,eAAe,KAAK,eAAc,CAAE,EAAE,UAAS,KAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACxE,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,aAAY,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACrE,UAAU,eAAe,KAAK,SAAQ,CAAE,GAAE,KAAM,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE1D,cAAc,eAAc;EAC7C,IAAI,KAAK,QAAO,KAAM,KAAK,QAAO,MAAO,OAAO,OAAO;EACvD,MAAM,KAAK,KAAK,QAAO;EACvB,OAAO,GAAG,WAAW,GAAG;CAC1B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACiB,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,QAAO,CAAE,CAAC,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACvE,cAAc,eAAe,KAAK,OAAO,YAAW,KAAM,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE1E,iBAAqC;CACrC,kBAA8B;CAEtC,cAAA;EACE,MAAM,eAA+B;GACnC,IAAI,OAAO,KAAK,SAAS;GACzB,SAAS,KAAK;GACd,UAAU,KAAK;GACf,UAAU,KAAK;EAChB;EACD,KAAK,OAAO,SAAS,YAAY;EACjC,KAAK,WAAW,gBAAgB,KAAK,OAAO,WAAW,YAAY,CAAC;EAGpE,sBAAqB;GACnB,MAAM,OAAO,KAAK,OAAM;GACxB,MAAM,SAAS,KAAK,SAAQ;GAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ;GACtB,MAAM,OAAO,KAAK,KAAK;GACvB,OAAO,MAAM,YAAY,eAAe,IAAI;GAC5C,KAAK,MAAM,YAAY,mBAAmB,IAAI;GAC9C,MAAM,YAAY,MAAY;IAC5B,IAAK,EAAkB,aAAa,UAAU,KAAK,WAAU;GAC/D;GACA,KAAK,iBAAiB,UAAU,QAAQ;GACxC,KAAK,WAAW,gBAAgB,KAAK,oBAAoB,UAAU,QAAQ,CAAC;EAC9E,CAAC;EAGD,wBAAuB;GACrB,IAAI,KAAK,WAAU,GAAI,KAAK,UAAS;QAChC,IAAI,KAAK,KAAI,GAAI;IACpB,MAAM,SAAS,KAAK,aAAY;IAChC,IAAI,CAAC,UAAU,OAAO,SAAQ,GAAI,KAAK,SAAS,OAAO;GACzD;EACF,CAAC;EAGD,wBAAuB;GACrB,MAAM,KAAK,KAAK,SAAQ;GACxB,IAAI,CAAC,KAAK,KAAI,KAAM,CAAC,IAAI;GACzB,KAAK,QAAO,CAAE,CACX,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,EACvB,GAAG,eAAe,EAAE,OAAO,UAAS,CAAE;EAC5C,CAAC;CACH;CAEA,WAAQ;EAEN,MAAM,YAAY,KAAK,SAAS,IAAI,WAAW,MAAM;GAAE,MAAM;GAAM,UAAU;EAAI,CAAE;EACnF,KAAK,SAAS,IAAI,iBAAiB,WAAW,KAAK,UAAU,CAAC;CAChE;CAMA,SAAS,QAAgB;EACvB,OAAO,OAAO,OAAO,KAAK,SAAQ;CACpC;CAEA,UAAU,SAAiB;EACzB,OAAO;CACT;CAIA,MAAM,QAAgB;EACpB,IAAI,CAAC,OAAO,SAAQ,GAAI,KAAK,SAAS,IAAI,OAAO,EAAE;CACrD;CAEA,SAAS,QAAgB;EACvB,KAAK,QAAQ,QAAQ,SAAS,CAAC,GAAG,MAAM,MAAM,CAAC;EAC/C,aAAa,KAAK,QAAQ,QAAQ,SAAS,KAAK,QAAQ,MAAM,MAAM,MAAM,CAAC;CAC7E;CAMA,iBAAiB,IAAsB;EACrC,KAAK,WAAW;CAClB;CAEA,kBAAkB,IAAc;EAC9B,KAAK,YAAY;CACnB;CAEA,iBAAiB,UAAiB;EAChC,KAAK,aAAa,IAAI,QAAQ;CAChC;CAKU,SAAS,SAAiB,CAEpC;CAGU,WAAQ,CAElB;CAEU,SAAS,OAAQ;EACzB,IAAI,UAAU,KAAK,MAAK,GAAI;EAC5B,KAAK,MAAM,IAAI,KAAK;EACpB,KAAK,SAAS,KAAK;CACrB;CAEU,cAAW;EACnB,IAAI,CAAC,KAAK,WAAU,GAAI,KAAK,UAAS;CACxC;CAEU,SAAS,QAAuC,YAAU;EAClE,IAAI,KAAK,WAAU,KAAM,KAAK,KAAI,GAAI;EACtC,MAAM,OAAO,KAAK,OAAM;EACxB,IAAI,CAAC,MAAM;EACX,KAAK,KAAK,IAAI,IAAI;EAGlB,KAAK,YAAY,EAAE,QAAQ,KAAK,SAAQ,EAAE,CAAwB;EAClE,KAAK,SAAS,KAAK;CACrB;CAEU,YAAS;EACjB,MAAM,OAAO,KAAK,OAAM;EACxB,IAAI,MAAM,QAAQ,eAAe,GAAG,KAAK,YAAW;OAC/C,KAAK,WAAU;CACtB;CAEU,SAAS,OAAoC;EAErD,MAAM,UADU,KAAK,eACL,CAAA,CAAQ,QAAQ,MAAM,CAAC,EAAE,SAAQ,CAAE;EACnD,MAAM,OACJ,UAAU,aACL,QAAQ,MAAM,MAAM,KAAK,WAAW,CAAC,CAAC,KAAK,QAAQ,KACpD,UAAU,UACR,QAAQ,KACR,QAAQ,QAAQ,SAAS;EACjC,KAAK,SAAS,IAAI,MAAM,MAAM,IAAI;CACpC;CAGU,SAAS,OAAoB;EACrC,MAAM,UAAU,KAAK,eAAc;EACnC,MAAM,UAAU,QAAQ,WAAW,MAAM,EAAE,OAAO,KAAK,SAAQ,CAAE;EACjE,MAAM,SAAS,aACb,MAAM,KACN,SACA,QAAQ,KAAK,MAAM,EAAE,SAAQ,CAAE,GAC/B;GAAE,MAAM;GAAO,UAAU;EAAE,CAAE;EAE/B,IAAI,WAAW,MAAM,OAAO;EAC5B,MAAM,eAAc;EACpB,KAAK,SAAS,IAAI,QAAQ,OAAO,EAAE,MAAM,IAAI;EAC7C,OAAO;CACT;CAGU,eAAe,OAAoB;EAC3C,IAAI,CAAC,YAAY,QAAQ,KAAK,GAAG,OAAO;EACxC,MAAM,UAAU,KAAK,eAAc;EACnC,MAAM,UAAU,QAAQ,WACrB,MAAM,EAAE,QAAQ,KAAK,SAAQ,KAAM,KAAK,eAAc,CAAE,EAAE,GAAG;EAEhE,MAAM,MAAM,KAAK,UAAU,MACzB,MAAM,KACN,QAAQ,KAAK,MAAM,EAAE,UAAS,CAAE,GAChC,QAAQ,KAAK,MAAM,EAAE,SAAQ,CAAE,GAC/B,OAAO;EAET,OAAO,QAAQ,OAAO,SAAY,QAAQ;CAC5C;CAEU,eAAY;EACpB,OAAO,KAAK,eAAc,CAAE,CAAC,MAAM,MAAM,EAAE,OAAO,KAAK,SAAQ,CAAE;CACnE;CAEQ,aAAU;EAChB,IAAI,CAAC,KAAK,KAAI,GAAI;EAClB,KAAK,KAAK,IAAI,KAAK;EACnB,KAAK,SAAS,IAAI,IAAI;EACtB,KAAK,UAAU,MAAK;EACpB,KAAK,SAAQ;CACf;CAzPoB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAa,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAb,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAa,cAAA;EAAA,QAAA;GAAA,aAAA;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,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;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,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,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAb,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAa,YAAA,CAAA,EADlC,MAAA,UAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9BD,MAAa,aAAa,IAAI,eAA8B,YAAY;ACsExE,IAAa,aAAb,MAAa,mBAAmB,cAAa;CAClC,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE3C,WAAW,QAAgB;EACzB,OAAO,OAAO,MAAK,MAAO,KAAK,MAAK;CACtC;CAEA,WAAW,OAAoB;EAC7B,KAAK,MAAM,IAAI,SAAS,IAAI;EAC5B,KAAK,MAAM,IAAI,IAAI;CACrB;CAEA,OAAO,QAAgB;EACrB,IAAI,OAAO,SAAQ,KAAM,KAAK,WAAU,GAAI;EAC5C,KAAK,SAAS,OAAO,MAAK,CAAE;EAC5B,KAAK,SAAQ;EACb,KAAK,UAAS;CAChB;CAEiB,WAAW,UAAU,SAAkC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC/D,WAAW,UAAU,SAAuC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACpE,OAAO,UAAU,SAAkC,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAG1D,QAAQ,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,YAAY,eAAe,KAAK,MAAK,KAAM,KAAK,cAAa,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEzE,SAAM;EACd,OAAO,KAAK,KAAI,CAAE,EAAE;CACtB;CAEU,WAAQ;EAChB,OAAO,KAAK,SAAQ,CAAE,EAAE;CAC1B;CAEA,QAAK;EACH,KAAK,SAAQ,CAAE,CAAC,cAAc,MAAK;CACrC;CAES,UAAU,QAAgB;EACjC,MAAM,IAAI,KAAK,MAAK;EACpB,OAAO,MAAM,QAAQ,eAAe,OAAO,UAAS,GAAI,CAAC;CAC3D;CAEmB,WAAQ;EACzB,KAAK,MAAM,IAAI,IAAI;CACrB;CAEmB,WAAQ;EACzB,KAAK,MAAM,IAAI,IAAI;EACnB,IAAI,KAAK,OAAO,cAAc,kBAAkB,KAAK,SAAQ,CAAE,CAAC,eAC9D,KAAK,YAAW;CACpB;CAGQ,UAAU;CAER,mBAAmB,OAAmB;EAC9C,KAAK,UAAU,KAAK,KAAI;EACxB,MAAM,QAAQ,KAAK,SAAQ,CAAE,CAAC;EAE9B,IAAI,MAAM,WAAW,SAAS,CAAC,KAAK,WAAU,GAAI;GAChD,MAAM,eAAc;GACpB,MAAM,MAAK;EACb;CACF;CAEU,aAAa,OAAiB;EACtC,IAAI,KAAK,WAAU,GAAI;EACvB,MAAM,UAAU,MAAM,WAAW,KAAK,SAAQ,CAAE,CAAC;EACjD,IAAI,KAAK,KAAI,KAAM,CAAC,SAAS,KAAK,UAAS;OACtC,IAAI,CAAC,KAAK,KAAI,KAAM,EAAE,KAAK,WAAW,CAAC,UAAU,KAAK,SAAS,UAAU;EAC9E,KAAK,UAAU;CACjB;CAEU,QAAQ,OAAY;EAC5B,KAAK,MAAM,IAAK,MAAM,OAA4B,KAAK;EACvD,IAAI,CAAC,KAAK,KAAI,GAAI,KAAK,SAAS,OAAO;OAClC,KAAK,SAAS,OAAO;CAC5B;CAEU,SAAM;EACd,KAAK,MAAM,IAAI,IAAI;EACnB,IAAI,CAAC,KAAK,KAAI,GAAI,KAAK,YAAW;CACpC;CAEU,UAAU,OAAoB;EACtC,MAAM,EAAE,KAAK,WAAW;EAExB,IAAI,CAAC,KAAK,KAAI,GAAI;GAChB,IAAI,QAAQ,eAAe,QAAQ,WAAW;IAC5C,MAAM,eAAc;IACpB,KAAK,SAAS,QAAQ,YAAY,SAAS,UAAU;GACvD;GACA;EACF;EAEA,IAAI,QAAQ,UAAU;GACpB,MAAM,eAAc;GACpB,KAAK,UAAS;EAChB,OAAO,IAAI,QAAQ,WAAY,UAAU,QAAQ,WAAY;GAC3D,MAAM,eAAc;GACpB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;QACzB,KAAK,UAAS;EACrB,OAAO,IAAI,QAAQ,OACjB,KAAK,UAAS;OACT,IAAI,QAAQ,UAAU,QAAQ,OAEnC,KAAK,SAAS,KAAK;CAEvB;CA/GW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA;GAAA,YAAA;IAAA,kBAAA;IAAA,kBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,mBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAPV,CACT;GAAE,SAAS;GAAY,aAAa,iBAAiB,UAAU;EAAC,GAChE;GAAE,SAAS;GAAmB,aAAa,iBAAiB,UAAU;GAAG,OAAO;EAAI,CACrF;EAAA,aAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,MAAA;IAAA,aAAA;IAAA,UAAA;GAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UAtDS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAzCS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AA2DL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EA7DtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCV,MAAM;IACJ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IACpB,uBAAuB;IACvB,wBAAwB;IAExB,qBAAqB;IACrB,0BAA0B;GAC3B;GACD,WAAW,CACT;IAAE,SAAS;IAAY,aAAa,iBAAgB,UAAW;GAAC,GAChE;IAAE,SAAS;IAAmB,aAAa,iBAAgB,UAAW;IAAG,OAAO;GAAI,CACrF;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;CAoByE,CAAA;CAAA,gBAAA;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,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CACF,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAChB,QAAM,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;ACvG5E,SAAgB,kBAAkB,QAAgC;CAChE,OAAO,CAAC,GAAG,IAAI,IAAI,UAAU,CAAA,CAAE,CAAC;AAClC;AAEA,SAAgB,kBAAkB,QAA2B,OAAa;CACxE,OAAO,OAAO,SAAS,KAAK,IACxB,OAAO,QAAQ,SAAS,SAAS,KAAK,IACtC,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC;AACrC;AC+FA,IAAa,gBAAb,MAAa,sBAAsB,cAAuB;CAC/C,QAAQ,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,cAAc,MAAkC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAChD,iBAAiB,MAAkC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEzC,aAAa,QAAQ,eAAe;EACrD,aAAa,KAAK;EAClB,gBAAgB,KAAK;CACtB,CAAA;CAEgB,WAAW,UAAU,SAAkC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC/D,WAAW,UAAU,SAAuC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACpE,OAAO,UAAU,SAAkC,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxD,QAAQ,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAClB,YAAY,WAAW,cAAc;CACrC,iBAAiB,eAClC,CAAC,KAAK,YAAW,GAAI,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,GAC9D,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,gBAAgB,eACjC,kBAAkB,KAAK,MAAK,CAAE,CAAC,CAAC,KAAK,UAAS;EAC5C,MAAM,SAAS,KAAK,QAAO,CAAE,CAAC,MAAM,SAAS,KAAK,MAAK,MAAO,KAAK;EACnE,OAAO;GAAE;GAAO,OAAO,QAAQ,UAAS,KAAM;GAAO,UAAU,QAAQ,SAAQ,KAAM;EAAK;CAC5F,CAAC,GACF,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAES,SAAM;EACd,OAAO,KAAK,KAAI,CAAE,EAAE;CACtB;CAEU,WAAQ;EAChB,OAAO,KAAK,SAAQ,CAAE,EAAE;CAC1B;CAEA,QAAK;EACH,KAAK,SAAQ,CAAE,CAAC,cAAc,MAAK;CACrC;CAEA,WAAW,QAAgB;EACzB,OAAO,KAAK,MAAK,CAAE,CAAC,SAAS,OAAO,MAAK,CAAE;CAC7C;CAES,UAAU,QAAgB;EACjC,OAAO,eAAe,OAAO,UAAS,GAAI,KAAK,MAAK,CAAE;CACxD;CAEA,OAAO,QAAgB;EACrB,IAAI,KAAK,WAAU,KAAM,OAAO,SAAQ,GAAI;EAC5C,KAAK,SAAS,kBAAkB,KAAK,MAAK,GAAI,OAAO,MAAK,CAAE,CAAC;EAC7D,KAAK,MAAK;CACZ;CAEA,WAAW,OAAsB;EAC/B,KAAK,MAAM,IAAI,kBAAkB,KAAK,CAAC;CACzC;CAEU,OAAO,OAAa;EAC5B,MAAM,OAAO,KAAK,cAAa,CAAE,CAAC,MAAM,SAAS,KAAK,UAAU,KAAK;EACrE,IAAI,KAAK,WAAU,KAAM,MAAM,UAAU;EACzC,KAAK,SAAS,KAAK,MAAK,CAAE,CAAC,QAAQ,SAAS,SAAS,KAAK,CAAC;EAC3D,KAAK,MAAK;CACZ;CAEU,QAAQ,OAAY;EAC5B,KAAK,MAAM,IAAK,MAAM,OAA4B,KAAK;EACvD,IAAK,MAAqB,aAAa;EACvC,KAAK,SAAS,OAAO;EACrB,KAAK,SAAS,OAAO;CACvB;CAEU,WAAW,OAAiB;EACpC,MAAM,OAAO,MAAM;EACnB,IAAI,QAAQ,KAAK,OAAO,SAAS,IAAI,GAAG;EACxC,KAAK,YAAW;EAChB,KAAK,UAAS;CAChB;CAEU,mBAAmB,OAAmB;EAC9C,MAAM,SAAS,MAAM;EACrB,IAAI,KAAK,WAAU,KAAM,OAAO,QAAQ,QAAQ,KAAK,WAAW,KAAK,SAAQ,CAAE,CAAC,eAC9E;EACF,MAAM,eAAc;EACpB,KAAK,MAAK;EACV,KAAK,SAAQ;CACf;CAEmB,WAAQ;EACzB,KAAK,MAAM,IAAI,EAAE;EACjB,IAAI,CAAC,KAAK,OAAO,SAAS,KAAK,OAAO,cAAc,aAAa,GAAG,KAAK,YAAW;CACtF;CAEU,UAAU,OAAoB;EACtC,IAAI,MAAM,eAAe,KAAK,WAAU,GAAI;EAC5C,MAAM,EAAE,KAAK,WAAW;EACxB,IAAI,QAAQ,eAAe,KAAK,MAAK,MAAO,IAAI;GAC9C,MAAM,OAAO,KAAK,cAAa,CAAE,CAAC,GAAG,EAAE;GACvC,IAAI,QAAQ,CAAC,KAAK,UAAU;IAC1B,MAAM,eAAc;IACpB,KAAK,OAAO,KAAK,KAAK;GACxB;EACF,OAAO,IAAI,CAAC,KAAK,KAAI,GACnB;OAAI,QAAQ,eAAe,QAAQ,WAAW;IAC5C,MAAM,eAAc;IACpB,KAAK,SAAS,QAAQ,YAAY,SAAS,UAAU;GACvD;SACK,IAAI,QAAQ,YAAa,UAAU,QAAQ,WAAY;GAC5D,MAAM,eAAc;GACpB,MAAM,gBAAe;GACrB,KAAK,UAAS;EAChB,OAAO,IAAI,QAAQ,SAAS;GAC1B,MAAM,eAAc;GACpB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;EAChC,OAAO,IAAI,QAAQ,OACjB,KAAK,UAAS;OACT,IAAI,QAAQ,UAAU,QAAQ,OACnC,KAAK,SAAS,KAAK;CAEvB;CArHW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAa,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAb,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAa,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;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;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA;GAAA,WAAA,EAAA,YAAA,qBAAA;GAAA,YAAA;IAAA,kBAAA;IAAA,kBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,sBAAA;IAAA,mBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAPb,CACT;GAAE,SAAS;GAAY,aAAa,iBAAiB,aAAa;EAAC,GACnE;GAAE,SAAS;GAAmB,aAAa,iBAAiB,aAAa;GAAG,OAAO;EAAI,CACxF;EAAA,aAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,MAAA;IAAA,aAAA;IAAA,UAAA;GAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UA1ES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2DT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MA5DS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AA+EL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAa,YAAA,CAAA;EAjFzB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DV,MAAM;IACJ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IACpB,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,qBAAqB;IACrB,0BAA0B;IAC1B,cAAc;GACf;GACD,WAAW,CACT;IAAE,SAAS;IAAY,aAAa,iBAAgB,aAAc;GAAC,GACnE;IAAE,SAAS;IAAmB,aAAa,iBAAgB,aAAc;IAAG,OAAO;GAAI,CACxF;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;CAWyE,CAAA;CAAA,gBAAA;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,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,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CACF,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAChB,QAAM,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AC5E5E,IAAa,WAAb,MAAa,SAAQ;CACV,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,QAAQ,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEb,OAAO,OAAO,UAAU;CAClC,KAAkB,OAAO,UAAU,CAAC,CAAC;CACrC,KAAK,WAAW,WAAW;CACnB,aAAa,OAAO,UAAU;CAE5B,WAAW,eAAe,KAAK,KAAK,WAAW,IAAI,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,SAAS,eAAe,KAAK,KAAK,SAAS,IAAI,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,UAAU,eAAe,KAAK,KAAK,UAAU,IAAI,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEtE,YAAS;EACP,OAAO,KAAK,MAAK,KAAM,KAAK,GAAG,cAAc,mBAAmB,CAAC,EAAE,aAAa,KAAI,KAAM;CAC5F;CAEA,WAAQ;EACN,KAAK,WAAW,UAAU,KAAK,KAAK,SAAS,IAAI,CAAC;CACpD;CArBW,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,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,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,SAAA;GAAA,WAAA;IAAA,SAAA;IAAA,eAAA;IAAA,aAAA;GAAA;GAAA,YAAA;IAAA,MAAA;IAAA,sBAAA;IAAA,sBAAA;IAAA,oBAAA;IAAA,UAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UApBT;;;;EAGT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAJS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAqBL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAvBpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;GAIV,MAAM;IACJ,OAAO;IACP,MAAM;IACN,QAAQ;IACR,wBAAwB;IACxB,wBAAwB;IACxB,sBAAsB;IACtB,YAAY;IACZ,WAAW;IACX,iBAAiB;IAEjB,eAAe;GAChB;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkCD,IAAa,WAAb,MAAa,iBAAiB,cAAa;CAChC,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE3C,WAAW,QAAgB;EACzB,OAAO,OAAO,MAAK,MAAO,KAAK,MAAK;CACtC;CAEA,WAAW,OAAoB;EAC7B,KAAK,MAAM,IAAI,SAAS,IAAI;CAC9B;CAEA,OAAO,QAAgB;EACrB,IAAI,OAAO,SAAQ,KAAM,KAAK,WAAU,GAAI;EAC5C,KAAK,SAAS,OAAO,MAAK,CAAE;EAC5B,KAAK,SAAS,MAAM;EACpB,KAAK,UAAS;CAChB;CAEiB,UAAU,UAAU,SAAwC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACtE,OAAO,UAAU,SAAkC,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEjE,UAAU;CAEV,SAAM;EACd,OAAO,KAAK,KAAI,CAAE,EAAE;CACtB;CAEU,WAAQ;EAChB,OAAO,KAAK,QAAO,CAAE,EAAE;CACzB;CAEA,QAAK;EACH,KAAK,QAAO,CAAE,CAAC,cAAc,MAAK;CACpC;CAEU,UAAO;EACf,IAAI,KAAK,WAAW,KAAK,KAAI,GAAI;GAC/B,KAAK,UAAU;GACf,KAAK,UAAS;GACd;EACF;EACA,KAAK,SAAS,UAAU;CAC1B;CAEU,SAAM;EACd,IAAI,CAAC,KAAK,KAAI,GAAI,KAAK,YAAW;CACpC;CAEmB,WAAQ;EAEzB,IAAI,KAAK,OAAO,cAAc,kBAAkB,KAAK,QAAO,CAAE,CAAC,eAC7D,KAAK,YAAW;CACpB;CAEU,UAAU,OAAoB;EACtC,MAAM,EAAE,KAAK,WAAW;EAExB,IAAI,CAAC,KAAK,KAAI,GAAI;GAChB,IAAI,QAAQ,eAAe,QAAQ,aAAa,QAAQ,WAAW,QAAQ,KAAK;IAC9E,MAAM,eAAc;IACpB,KAAK,SAAS,UAAU;GAC1B,OAAO,IAAI,QAAQ,UAAU,QAAQ,OAAO;IAC1C,MAAM,eAAc;IACpB,KAAK,SAAS,QAAQ,SAAS,UAAU,MAAM;GACjD,OAAO;IACL,MAAM,QAAQ,KAAK,eAAe,KAAK;IACvC,IAAI,OAAO;KAET,KAAK,SAAS,UAAU;KACxB,KAAK,SAAS,IAAI,MAAM,EAAE;IAC5B;GACF;GACA;EACF;EAEA,IAAI,QAAQ,UAAU;GACpB,MAAM,eAAc;GACpB,KAAK,UAAS;EAChB,OAAO,IAAI,QAAQ,WAAW,QAAQ,OAAQ,UAAU,QAAQ,WAAY;GAC1E,MAAM,eAAc;GACpB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;QACzB,KAAK,UAAS;EACrB,OAAO,IAAI,QAAQ,OAAO;GACxB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;QACzB,KAAK,UAAS;EACrB,OAAO,IAAI,CAAC,KAAK,SAAS,KAAK,GAAG;GAChC,MAAM,QAAQ,KAAK,eAAe,KAAK;GACvC,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,EAAE;EACvC;CACF;CA3FW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA;GAAA,YAAA;IAAA,kBAAA;IAAA,kBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,mBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAPR,CACT;GAAE,SAAS;GAAY,aAAa,iBAAiB,QAAQ;EAAC,GAC9D;GAAE,SAAS;GAAmB,aAAa,iBAAiB,QAAQ;GAAG,OAAO;EAAI,CACnF;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,MAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UA/CS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAlCS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAoDL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAtDpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCV,MAAM;IACJ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IACpB,uBAAuB;IACvB,wBAAwB;IAExB,qBAAqB;IACrB,0BAA0B;GAC3B;GACD,WAAW,CACT;IAAE,SAAS;IAAY,aAAa,iBAAgB,QAAS;GAAC,GAC9D;IAAE,SAAS;IAAmB,aAAa,iBAAgB,QAAS;IAAG,OAAO;GAAI,CACnF;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;CAmB8E,CAAA;CAAA,gBAAA;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,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAClB,QAAM,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- const VD_VERSION = "0.0.1";
1
+ const VD_VERSION = "0.0.3";
2
2
  export { VD_VERSION };
3
3
 
4
4
  //# sourceMappingURL=vadem-ui.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vadem-ui.mjs","names":[],"sources":["../../../projects/ui/src/public-api.ts"],"sourcesContent":["/*\n * Public API surface of @vadem/ui (primary entry point).\n * Components live in secondary entry points: @vadem/ui/button, @vadem/ui/card, ...\n */\nexport const VD_VERSION = '0.0.1';\n"],"mappings":"AAIA,MAAa,aAAa"}
1
+ {"version":3,"file":"vadem-ui.mjs","names":[],"sources":["../../../projects/ui/src/public-api.ts"],"sourcesContent":["/*\n * Public API surface of @vadem/ui (primary entry point).\n * Components live in secondary entry points: @vadem/ui/button, @vadem/ui/card, ...\n */\nexport const VD_VERSION = '0.0.3';\n"],"mappings":"AAIA,MAAa,aAAa"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vadem/ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^22.2.0",
6
6
  "@angular/core": "^22.2.0",
@@ -318,7 +318,7 @@
318
318
  "url": "git+https://github.com/Demchuk12/vadem-ui-angular.git",
319
319
  "directory": "projects/ui"
320
320
  },
321
- "homepage": "https://github.com/Demchuk12/vadem-ui-angular#readme",
321
+ "homepage": "https://demchuk12.github.io/vadem-ui-angular/",
322
322
  "bugs": {
323
323
  "url": "https://github.com/Demchuk12/vadem-ui-angular/issues"
324
324
  },
@@ -326,6 +326,7 @@
326
326
  "access": "public",
327
327
  "registry": "https://registry.npmjs.org/"
328
328
  },
329
+ "license": "MIT",
329
330
  "module": "fesm2022/vadem-ui.mjs",
330
331
  "typings": "types/vadem-ui.d.ts",
331
332
  "type": "module"
@@ -10,6 +10,7 @@
10
10
  align-items: start;
11
11
  justify-content: space-between;
12
12
  gap: var(--vd-file-preview-gap);
13
+ padding-block-end: var(--vd-dialog-gap);
13
14
  }
14
15
  .vd-file-preview__heading {
15
16
  min-inline-size: 0;
@@ -32,6 +33,10 @@
32
33
  display: grid;
33
34
  gap: var(--vd-file-preview-gap);
34
35
  min-inline-size: 0;
36
+ margin-inline: var(--vd-dialog-padding);
37
+ margin-block-end: var(--vd-dialog-gap);
38
+ padding: var(--vd-space-5);
39
+ border-radius: var(--vd-radius-md);
35
40
  background: var(--vd-file-preview-bg);
36
41
  }
37
42
  .vd-file-preview__body:focus-visible {
@@ -176,7 +176,7 @@ declare abstract class VdListboxBase<T = string | null> implements VdListboxHost
176
176
  }
177
177
  /**
178
178
  * Editable combobox with list autocomplete (APG): type to filter, pick with arrows + Enter or
179
- * click. The value is always one of the options; free text reverts on blur. Spec: specs/select.md
179
+ * click. User choices come from the options; free text reverts on blur. Spec: specs/select.md
180
180
  */
181
181
  export declare class VdCombobox extends VdListboxBase {
182
182
  readonly value: import("@angular/core").ModelSignal<string | null>;
@@ -234,7 +234,6 @@ export declare class VdMultiSelect extends VdListboxBase<string[]> {
234
234
  label: string;
235
235
  disabled: boolean;
236
236
  }[]>;
237
- constructor();
238
237
  protected listEl(): HTMLElement | undefined;
239
238
  protected anchorEl(): HTMLElement | undefined;
240
239
  focus(): void;
@@ -1 +1 @@
1
- export declare const VD_VERSION = "0.0.1";
1
+ export declare const VD_VERSION = "0.0.3";