@star-ng/ui 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +162 -2
- package/fesm2022/star-ng-ui-accordion.mjs +376 -0
- package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
- package/fesm2022/star-ng-ui-autocomplete.mjs +786 -0
- package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
- package/fesm2022/star-ng-ui-avatar.mjs +154 -0
- package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
- package/fesm2022/star-ng-ui-badge.mjs +153 -0
- package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
- package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
- package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/star-ng-ui-button.mjs +282 -0
- package/fesm2022/star-ng-ui-button.mjs.map +1 -0
- package/fesm2022/star-ng-ui-card.mjs +112 -0
- package/fesm2022/star-ng-ui-card.mjs.map +1 -0
- package/fesm2022/star-ng-ui-chart.mjs +1904 -0
- package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
- package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
- package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
- package/fesm2022/star-ng-ui-core.mjs +484 -0
- package/fesm2022/star-ng-ui-core.mjs.map +1 -0
- package/fesm2022/star-ng-ui-data-display.mjs +1870 -0
- package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
- package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
- package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
- package/fesm2022/star-ng-ui-dialog.mjs +948 -0
- package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
- package/fesm2022/star-ng-ui-drawer.mjs +158 -0
- package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
- package/fesm2022/star-ng-ui-editor.mjs +416 -0
- package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
- package/fesm2022/star-ng-ui-field.mjs +378 -0
- package/fesm2022/star-ng-ui-field.mjs.map +1 -0
- package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
- package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
- package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
- package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
- package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
- package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-group.mjs +188 -0
- package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
- package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-number.mjs +691 -0
- package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
- package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
- package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
- package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
- package/fesm2022/star-ng-ui-knob.mjs +514 -0
- package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
- package/fesm2022/star-ng-ui-layout.mjs +608 -0
- package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
- package/fesm2022/star-ng-ui-listbox.mjs +886 -0
- package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
- package/fesm2022/star-ng-ui-media.mjs +833 -0
- package/fesm2022/star-ng-ui-media.mjs.map +1 -0
- package/fesm2022/star-ng-ui-menu.mjs +1840 -0
- package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
- package/fesm2022/star-ng-ui-message.mjs +191 -0
- package/fesm2022/star-ng-ui-message.mjs.map +1 -0
- package/fesm2022/star-ng-ui-paginator.mjs +387 -0
- package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
- package/fesm2022/star-ng-ui-panel.mjs +324 -0
- package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
- package/fesm2022/star-ng-ui-password.mjs +517 -0
- package/fesm2022/star-ng-ui-password.mjs.map +1 -0
- package/fesm2022/star-ng-ui-popover.mjs +241 -0
- package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
- package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
- package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
- package/fesm2022/star-ng-ui-radio.mjs +411 -0
- package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
- package/fesm2022/star-ng-ui-rating.mjs +211 -0
- package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
- package/fesm2022/star-ng-ui-select-button.mjs +613 -0
- package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
- package/fesm2022/star-ng-ui-select.mjs +2547 -0
- package/fesm2022/star-ng-ui-select.mjs.map +1 -0
- package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
- package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
- package/fesm2022/star-ng-ui-slider.mjs +552 -0
- package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
- package/fesm2022/star-ng-ui-spinner.mjs +148 -0
- package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
- package/fesm2022/star-ng-ui-stepper.mjs +360 -0
- package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
- package/fesm2022/star-ng-ui-table.mjs +3531 -0
- package/fesm2022/star-ng-ui-table.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tabs.mjs +464 -0
- package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tag.mjs +129 -0
- package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
- package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
- package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
- package/fesm2022/star-ng-ui-theme.mjs +98 -0
- package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
- package/fesm2022/star-ng-ui-toast.mjs +298 -0
- package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
- package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
- package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
- package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
- package/fesm2022/star-ng-ui-transloco.mjs +40 -0
- package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
- package/fesm2022/star-ng-ui-tree.mjs +1446 -0
- package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
- package/fesm2022/star-ng-ui-utility.mjs +2134 -0
- package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
- package/fesm2022/star-ng-ui.mjs +51 -0
- package/package.json +285 -3
- package/styles/_base.scss +70 -0
- package/styles/_shared.scss +2 -0
- package/styles/_tokens.scss +190 -0
- package/styles/controls/_accordion.scss +75 -0
- package/styles/controls/_autocomplete.scss +44 -0
- package/styles/controls/_avatar.scss +39 -0
- package/styles/controls/_breadcrumb.scss +45 -0
- package/styles/controls/_button.scss +137 -0
- package/styles/controls/_card.scss +38 -0
- package/styles/controls/_chart.scss +214 -0
- package/styles/controls/_chip.scss +51 -0
- package/styles/controls/_choice.scss +153 -0
- package/styles/controls/_data-display.scss +124 -0
- package/styles/controls/_date-picker.scss +300 -0
- package/styles/controls/_dialog.scss +123 -0
- package/styles/controls/_drawer.scss +118 -0
- package/styles/controls/_editor.scss +74 -0
- package/styles/controls/_field.scss +92 -0
- package/styles/controls/_file-upload.scss +136 -0
- package/styles/controls/_input-group.scss +104 -0
- package/styles/controls/_input-mask.scss +46 -0
- package/styles/controls/_input-number.scss +125 -0
- package/styles/controls/_knob.scss +76 -0
- package/styles/controls/_layout.scss +182 -0
- package/styles/controls/_listbox.scss +38 -0
- package/styles/controls/_media.scss +222 -0
- package/styles/controls/_menu.scss +254 -0
- package/styles/controls/_message.scss +48 -0
- package/styles/controls/_org-chart.scss +128 -0
- package/styles/controls/_paginator.scss +59 -0
- package/styles/controls/_panel.scss +83 -0
- package/styles/controls/_popover.scss +40 -0
- package/styles/controls/_progress-bar.scss +74 -0
- package/styles/controls/_select-button.scss +61 -0
- package/styles/controls/_select.scss +216 -0
- package/styles/controls/_skeleton.scss +43 -0
- package/styles/controls/_slider.scss +163 -0
- package/styles/controls/_spinner.scss +34 -0
- package/styles/controls/_stepper.scss +109 -0
- package/styles/controls/_table.scss +523 -0
- package/styles/controls/_tabs.scss +93 -0
- package/styles/controls/_tag.scss +84 -0
- package/styles/controls/_toast.scss +141 -0
- package/styles/controls/_tooltip.scss +14 -0
- package/styles/controls/_tree.scss +113 -0
- package/styles/controls/_utility.scss +654 -0
- package/styles/star-ng.css +5807 -0
- package/styles/star-ng.min.css +1 -0
- package/styles/star-ng.scss +50 -0
- package/theme/star-theme-first-paint.js +1 -0
- package/types/star-ng-ui-accordion.d.ts +82 -0
- package/types/star-ng-ui-autocomplete.d.ts +171 -0
- package/types/star-ng-ui-avatar.d.ts +43 -0
- package/types/star-ng-ui-badge.d.ts +46 -0
- package/types/star-ng-ui-breadcrumb.d.ts +39 -0
- package/types/star-ng-ui-button.d.ts +79 -0
- package/types/star-ng-ui-card.d.ts +29 -0
- package/types/star-ng-ui-chart.d.ts +337 -0
- package/types/star-ng-ui-checkbox.d.ts +92 -0
- package/types/star-ng-ui-core.d.ts +373 -0
- package/types/star-ng-ui-data-display.d.ts +438 -0
- package/types/star-ng-ui-date-picker.d.ts +701 -0
- package/types/star-ng-ui-dialog.d.ts +254 -0
- package/types/star-ng-ui-drawer.d.ts +29 -0
- package/types/star-ng-ui-editor.d.ts +96 -0
- package/types/star-ng-ui-field.d.ts +146 -0
- package/types/star-ng-ui-file-upload.d.ts +192 -0
- package/types/star-ng-ui-i18n-de.d.ts +7 -0
- package/types/star-ng-ui-i18n-es.d.ts +7 -0
- package/types/star-ng-ui-input-group.d.ts +58 -0
- package/types/star-ng-ui-input-mask.d.ts +126 -0
- package/types/star-ng-ui-input-number.d.ts +193 -0
- package/types/star-ng-ui-input-otp.d.ts +86 -0
- package/types/star-ng-ui-input-tags.d.ts +159 -0
- package/types/star-ng-ui-knob.d.ts +121 -0
- package/types/star-ng-ui-layout.d.ts +154 -0
- package/types/star-ng-ui-listbox.d.ts +170 -0
- package/types/star-ng-ui-media.d.ts +161 -0
- package/types/star-ng-ui-menu.d.ts +332 -0
- package/types/star-ng-ui-message.d.ts +52 -0
- package/types/star-ng-ui-paginator.d.ts +85 -0
- package/types/star-ng-ui-panel.d.ts +65 -0
- package/types/star-ng-ui-password.d.ts +129 -0
- package/types/star-ng-ui-popover.d.ts +57 -0
- package/types/star-ng-ui-progress-bar.d.ts +49 -0
- package/types/star-ng-ui-radio.d.ts +116 -0
- package/types/star-ng-ui-rating.d.ts +52 -0
- package/types/star-ng-ui-select-button.d.ts +169 -0
- package/types/star-ng-ui-select.d.ts +563 -0
- package/types/star-ng-ui-skeleton.d.ts +47 -0
- package/types/star-ng-ui-slider.d.ts +145 -0
- package/types/star-ng-ui-spinner.d.ts +29 -0
- package/types/star-ng-ui-stepper.d.ts +89 -0
- package/types/star-ng-ui-table.d.ts +885 -0
- package/types/star-ng-ui-tabs.d.ts +109 -0
- package/types/star-ng-ui-tag.d.ts +35 -0
- package/types/star-ng-ui-theme-switch.d.ts +36 -0
- package/types/star-ng-ui-theme.d.ts +95 -0
- package/types/star-ng-ui-toast.d.ts +84 -0
- package/types/star-ng-ui-toggle-switch.d.ts +81 -0
- package/types/star-ng-ui-tooltip.d.ts +66 -0
- package/types/star-ng-ui-transloco.d.ts +14 -0
- package/types/star-ng-ui-tree.d.ts +343 -0
- package/types/star-ng-ui-utility.d.ts +533 -0
- package/types/star-ng-ui.d.ts +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-ng-ui-autocomplete.mjs","names":[],"sources":["../../../projects/star-ng/autocomplete/autocomplete.ts"],"sourcesContent":["import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { matchesFilter } from '@star-ng/ui/core';\nimport { StarOptionListBase } from '@star-ng/ui/select';\n\nexport interface StarAutoCompleteSearch {\n readonly query: string;\n}\n\ninterface Chip<TValue> {\n readonly value: TValue;\n readonly label: string;\n}\n\n/**\n * Shared behaviour of the autocomplete controls (WAI-ARIA combobox with list autocomplete):\n * local filtering of `options`, or server search through `(completeMethod)` + `[suggestions]` with a\n * debounce, minimum query length, loading state, match highlighting, dropdown button and a\n * screen-reader result count.\n */\n@Directive()\nexport abstract class StarAutoCompleteBase<TOption, TValue> extends StarOptionListBase<\n TOption,\n TValue\n> {\n /** Server results. When set, the control shows these instead of filtering `options`. */\n readonly suggestions = input<readonly TOption[] | null>(null);\n readonly minQueryLength = input(1);\n /** Debounce in ms before `(completeMethod)` fires. */\n readonly delay = input(300);\n /** Shows a button that lists all options (local) or searches with an empty query. */\n readonly dropdown = input(false, { transform: booleanAttribute });\n /** Highlights the first result, so Enter picks it. */\n readonly autoHighlight = input(false, { transform: booleanAttribute });\n readonly showEmptyMessage = input(true, { transform: booleanAttribute });\n\n /** Fires (debounced) when the user types; load `suggestions` in reply (PrimeNG `completeMethod`). */\n readonly completeMethod = output<StarAutoCompleteSearch>();\n\n protected readonly closeOnChoose = true;\n protected abstract readonly isMultiple: boolean;\n protected readonly control = viewChild.required<ElementRef<HTMLElement>>('control');\n\n /** Options the user picked, so labels survive when the result list changes. */\n protected readonly known = signal<readonly TOption[]>([]);\n private readonly showAll = signal(false);\n private searchTimer: ReturnType<typeof setTimeout> | undefined;\n\n protected abstract queryFromValue(): string;\n /** Typed text. Resets to the selected label when the value changes. */\n protected readonly query = linkedSignal(() => this.queryFromValue());\n\n protected override readonly visibleOptions = computed(() => {\n const remote = this.suggestions();\n const query = this.query();\n const candidates =\n remote ??\n (this.showAll() || !query\n ? this.options()\n : this.options().filter((option) => matchesFilter(this.labelOf(option), query)));\n return this.groupedOrder(\n this.isMultiple ? candidates.filter((option) => !this.isSelected(option)) : candidates,\n );\n });\n\n protected readonly queryLongEnough = computed(\n () => this.showAll() || this.query().length >= this.minQueryLength(),\n );\n\n protected readonly panelVisible = computed(\n () =>\n this.open() &&\n this.queryLongEnough() &&\n (this.visibleOptions().length > 0 || this.loading() || this.showEmptyMessage()),\n );\n\n protected readonly liveText = computed(() => {\n if (!this.panelVisible()) return '';\n if (this.loading()) return this.text.searching;\n const count = this.visibleOptions().length;\n return count ? this.text.resultsAvailable(count) : this.emptyText();\n });\n\n constructor() {\n super();\n inject(DestroyRef).onDestroy(() => clearTimeout(this.searchTimer));\n // New results: show them from the top and highlight the first one (autoHighlight) or nothing.\n effect(() => {\n this.visibleOptions();\n untracked(() => {\n this.resetScroll();\n this.activeIndex.set(this.autoHighlight() ? this.firstEnabledFrom(0, 1) : -1);\n });\n });\n }\n\n protected initialActiveIndex(): number {\n return this.autoHighlight() ? this.firstEnabledFrom(0, 1) : -1;\n }\n\n /** Finds the option behind a stored value, for labels. */\n protected optionForValue(value: TValue): TOption | undefined {\n const pools = [this.known(), this.suggestions() ?? [], this.options()];\n for (const pool of pools) {\n const match = pool.find((option) => this.equals(this.valueOf(option), value));\n if (match !== undefined) return match;\n }\n return undefined;\n }\n\n protected labelForValue(value: TValue): string {\n const option = this.optionForValue(value);\n if (option !== undefined) return this.labelOf(option);\n return this.optionValue() === null ? this.labelOf(value as unknown as TOption) : String(value);\n }\n\n protected remember(option: TOption): void {\n this.known.update((known) => (known.includes(option) ? known : [...known, option]));\n }\n\n protected onQuery(text: string): void {\n this.query.set(text);\n this.showAll.set(false);\n clearTimeout(this.searchTimer);\n if (text.length < this.minQueryLength()) {\n this.closePanel(false);\n return;\n }\n this.openPanel();\n this.searchTimer = setTimeout(() => this.completeMethod.emit({ query: text }), this.delay());\n }\n\n protected showAllOptions(): void {\n if (!this.interactive()) return;\n if (this.panelVisible()) {\n this.closePanel();\n return;\n }\n this.showAll.set(true);\n this.completeMethod.emit({ query: '' });\n this.openPanel();\n this.focus();\n }\n\n protected override onOutsideClick(event: MouseEvent): void {\n if (this.control().nativeElement.contains(event.target as Node)) return;\n this.closePanel(false);\n this.onBlurCommit();\n this.touch.emit();\n }\n\n protected onInputBlur(): void {\n if (this.panelVisible()) return;\n this.onBlurCommit();\n this.touch.emit();\n }\n\n /** Called on blur: subclasses apply force-selection rules. */\n protected abstract onBlurCommit(): void;\n\n protected override onKeydown(event: KeyboardEvent): void {\n // Home / End move the caret in the text field; Enter on a closed list submits the form.\n if (event.key === 'Home' || event.key === 'End') return;\n if (event.key === 'Enter' && !this.panelVisible()) return;\n if (event.key === 'ArrowDown' && !this.open() && !this.queryLongEnough()) return;\n super.onKeydown(event);\n }\n\n /**\n * Sets the field text. Also writes the DOM: the `[value]` binding does not update when the\n * signal returns to the value it last rendered (typed text in between is not a signal write).\n */\n protected setText(text: string): void {\n this.query.set(text);\n (this.trigger().nativeElement as HTMLInputElement).value = text;\n }\n\n /** Splits a label around the typed text for `<mark>` highlighting. */\n protected highlight(label: string): readonly [string, string, string] {\n const query = this.query().trim();\n const index = query ? label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) : -1;\n if (index < 0) return [label, '', ''];\n return [\n label.slice(0, index),\n label.slice(index, index + query.length),\n label.slice(index + query.length),\n ];\n }\n\n protected chips(): readonly Chip<TValue>[] {\n return [];\n }\n}\n\nconst TEMPLATE = `\n <div #control class=\"star-select__control star-ac__control\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n @if (isMultiple) {\n @for (chip of chips(); track $index) {\n <span class=\"star-chip star-chip--sm\">\n {{ chip.label }}\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"star-chip__remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"text.removeItem(chip.label)\"\n (click)=\"removeValue(chip.value)\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n </span>\n }\n }\n <input\n #trigger\n type=\"text\"\n class=\"star-ac__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [id]=\"inputId()\"\n [attr.name]=\"name() || null\"\n [value]=\"query()\"\n [attr.placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-expanded]=\"panelVisible()\"\n [attr.aria-controls]=\"panelVisible() ? listId : null\"\n [attr.aria-activedescendant]=\"panelVisible() ? activeId() : null\"\n (input)=\"onQuery(trigger.value)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onInputBlur()\"\n />\n @if (loading()) {\n <i class=\"ph-bold ph-spinner-gap star-spin star-select__caret\" aria-hidden=\"true\"></i>\n }\n @if (showClear() && hasValue() && interactive()) {\n <button type=\"button\" class=\"star-select__icon-btn\" [attr.aria-label]=\"text.clear\" (click)=\"clear()\">\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (dropdown()) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n tabindex=\"-1\"\n [attr.aria-label]=\"text.showOptions\"\n [disabled]=\"!interactive()\"\n (click)=\"showAllOptions()\"\n >\n <i class=\"ph-bold ph-caret-down\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <span class=\"star-sr-only\" aria-live=\"polite\">{{ liveText() }}</span>\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayUsePopover=\"inline\"\n cdkConnectedOverlayMatchWidth\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"panelVisible()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (attach)=\"onPanelAttached()\"\n (detach)=\"closePanel(false)\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n >\n <div class=\"star-panel\" (mousedown)=\"onPanelMousedown($event)\">\n <ul\n class=\"star-listbox\"\n role=\"listbox\"\n [id]=\"listId\"\n [class.star-listbox--virtual]=\"virtualScroll()\"\n [style.--star-item-size.px]=\"virtualScroll() ? virtualItemSize() : null\"\n [style.max-height]=\"scrollHeight()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n (scroll)=\"onListScroll($event)\"\n >\n @if (virtualWindow().before) {\n <li class=\"star-listbox__spacer\" role=\"presentation\" [style.height.px]=\"virtualWindow().before\"></li>\n }\n @for (row of renderedRows(); track row.key) {\n @if (row.kind === 'group') {\n <li class=\"star-listbox__group\" role=\"presentation\" [id]=\"row.id\">{{ row.label }}</li>\n } @else {\n @let option = row.option;\n @let i = row.index;\n <!-- Keyboard is handled on the combobox via aria-activedescendant (WAI-ARIA combobox pattern). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n class=\"star-listbox__option\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [class.star-listbox__option--active]=\"activeIndex() === i\"\n [attr.aria-selected]=\"activeIndex() === i\"\n [attr.aria-disabled]=\"isDisabled(option) || null\"\n [attr.aria-describedby]=\"describedBy(row)\"\n [attr.aria-setsize]=\"virtualScroll() ? visibleOptions().length : null\"\n [attr.aria-posinset]=\"virtualScroll() ? i + 1 : null\"\n (click)=\"onOptionClick(option, i)\"\n (mousemove)=\"isDisabled(option) || activeIndex.set(i)\"\n >\n <span class=\"star-listbox__label\">\n @if (optionTemplate(); as custom) {\n <ng-container *ngTemplateOutlet=\"custom.template; context: optionContext(option, i)\" />\n } @else {\n @let parts = highlight(labelOf(option));\n {{ parts[0] }}<mark class=\"star-ac__match\">{{ parts[1] }}</mark>{{ parts[2] }}\n }\n </span>\n </li>\n }\n } @empty {\n <li class=\"star-listbox__empty\" role=\"presentation\">\n {{ loading() ? text.searching : emptyText() }}\n </li>\n }\n @if (virtualWindow().after) {\n <li class=\"star-listbox__spacer\" role=\"presentation\" [style.height.px]=\"virtualWindow().after\"></li>\n }\n </ul>\n </div>\n </ng-template>\n`;\n\nconst HOST = {\n class: 'star-select star-ac',\n '[class.star-select--open]': 'panelVisible()',\n '[class.star-select--disabled]': 'disabled()',\n '[class.star-select--invalid]': 'showInvalid()',\n '[class.star-select--sm]': \"size() === 'sm'\",\n};\n\n/**\n * Autocomplete (PrimeNG `p-autocomplete`). Local mode filters `options`; server mode listens\n * to `(completeMethod)` and shows `[suggestions]`. Only listed options can be chosen\n * (force selection): unmatched text reverts on blur, an exact label match is taken.\n *\n * ```html\n * <star-autocomplete [suggestions]=\"results()\" (completeMethod)=\"find($event.query)\" [loading]=\"busy()\"\n * optionLabel=\"name\" [formField]=\"form.assignee\" />\n * ```\n */\n@Component({\n selector: 'star-autocomplete',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: HOST,\n template: TEMPLATE,\n})\nexport class StarAutoComplete<TOption = unknown, TValue = TOption>\n extends StarAutoCompleteBase<TOption, TValue>\n implements FormValueControl<TValue | null>\n{\n readonly value = model<TValue | null>(null);\n readonly selected = output<TOption>();\n\n protected readonly isMultiple = false;\n protected readonly hasValue = computed(() => this.value() !== null || !!this.query());\n\n protected queryFromValue(): string {\n const value = this.value();\n return value === null ? '' : this.labelForValue(value);\n }\n\n protected isSelected(option: TOption): boolean {\n const value = this.value();\n return value !== null && this.equals(this.valueOf(option), value);\n }\n\n protected choose(option: TOption): void {\n this.remember(option);\n this.value.set(this.valueOf(option));\n this.setText(this.labelOf(option));\n this.selected.emit(option);\n }\n\n protected onBlurCommit(): void {\n const text = this.query().trim();\n if (!text) {\n if (this.value() !== null) this.value.set(null);\n return;\n }\n if (text === this.queryFromValue()) return;\n const exact = this.visibleOptions().find(\n (option) =>\n !this.isDisabled(option) &&\n this.labelOf(option).toLocaleLowerCase() === text.toLocaleLowerCase(),\n );\n if (exact !== undefined) this.choose(exact);\n else this.setText(this.queryFromValue());\n }\n\n /** Single mode shows no chips; kept so both components share one template. */\n protected removeValue(_value: TValue): void {\n this.clear();\n }\n\n clear(): void {\n this.value.set(null);\n this.setText('');\n this.focus();\n }\n}\n\n/**\n * Multiple-value autocomplete (PrimeNG `p-autocomplete [multiple]`): chosen items become\n * removable chips, Backspace in an empty field removes the last chip, chosen options leave\n * the result list.\n */\n@Component({\n selector: 'star-multi-autocomplete',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { ...HOST, class: 'star-select star-ac star-ac--multi' },\n template: TEMPLATE,\n})\nexport class StarMultiAutoComplete<TOption = unknown, TValue = TOption>\n extends StarAutoCompleteBase<TOption, TValue>\n implements FormValueControl<readonly TValue[]>\n{\n readonly value = model<readonly TValue[]>([]);\n /** Maximum number of chips (0 = no limit). */\n readonly selectionLimit = input(0);\n\n protected readonly isMultiple = true;\n protected readonly hasValue = computed(() => this.value().length > 0);\n\n protected queryFromValue(): string {\n return '';\n }\n\n protected override chips(): readonly Chip<TValue>[] {\n return this.value().map((value) => ({ value, label: this.labelForValue(value) }));\n }\n\n protected isSelected(option: TOption): boolean {\n const optionValue = this.valueOf(option);\n return this.value().some((value) => this.equals(value, optionValue));\n }\n\n protected choose(option: TOption): void {\n const limit = this.selectionLimit();\n if (this.isSelected(option) || (limit > 0 && this.value().length >= limit)) return;\n this.remember(option);\n this.value.update((values) => [...values, this.valueOf(option)]);\n this.setText('');\n }\n\n protected onBlurCommit(): void {\n this.setText('');\n }\n\n protected override onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Backspace' && !this.query() && this.value().length && this.interactive()) {\n this.value.update((values) => values.slice(0, -1));\n return;\n }\n super.onKeydown(event);\n }\n\n protected removeValue(value: TValue): void {\n this.value.update((values) => values.filter((v) => !this.equals(v, value)));\n this.focus();\n }\n\n clear(): void {\n this.value.set([]);\n this.setText('');\n this.focus();\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, input, signal } from "@angular/core";
|
|
3
|
+
var StarAvatar = class StarAvatar {
|
|
4
|
+
name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
|
|
5
|
+
image = input(null, ...ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []);
|
|
6
|
+
icon = input("ph-bold ph-user", ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
|
|
7
|
+
size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
|
|
8
|
+
shape = input("circle", ...ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []);
|
|
9
|
+
failed = signal(false, ...ngDevMode ? [{ debugName: "failed" }] : /* istanbul ignore next */ []);
|
|
10
|
+
initials = computed(() => this.name().split(/[\s.@_-]+/).filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join(""), ...ngDevMode ? [{ debugName: "initials" }] : /* istanbul ignore next */ []);
|
|
11
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
12
|
+
minVersion: "12.0.0",
|
|
13
|
+
version: "22.2.6",
|
|
14
|
+
ngImport: i0,
|
|
15
|
+
type: StarAvatar,
|
|
16
|
+
deps: [],
|
|
17
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
18
|
+
});
|
|
19
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
20
|
+
minVersion: "17.0.0",
|
|
21
|
+
version: "22.2.6",
|
|
22
|
+
type: StarAvatar,
|
|
23
|
+
isStandalone: true,
|
|
24
|
+
selector: "star-avatar",
|
|
25
|
+
inputs: {
|
|
26
|
+
name: {
|
|
27
|
+
classPropertyName: "name",
|
|
28
|
+
publicName: "name",
|
|
29
|
+
isSignal: true,
|
|
30
|
+
isRequired: false,
|
|
31
|
+
transformFunction: null
|
|
32
|
+
},
|
|
33
|
+
image: {
|
|
34
|
+
classPropertyName: "image",
|
|
35
|
+
publicName: "image",
|
|
36
|
+
isSignal: true,
|
|
37
|
+
isRequired: false,
|
|
38
|
+
transformFunction: null
|
|
39
|
+
},
|
|
40
|
+
icon: {
|
|
41
|
+
classPropertyName: "icon",
|
|
42
|
+
publicName: "icon",
|
|
43
|
+
isSignal: true,
|
|
44
|
+
isRequired: false,
|
|
45
|
+
transformFunction: null
|
|
46
|
+
},
|
|
47
|
+
size: {
|
|
48
|
+
classPropertyName: "size",
|
|
49
|
+
publicName: "size",
|
|
50
|
+
isSignal: true,
|
|
51
|
+
isRequired: false,
|
|
52
|
+
transformFunction: null
|
|
53
|
+
},
|
|
54
|
+
shape: {
|
|
55
|
+
classPropertyName: "shape",
|
|
56
|
+
publicName: "shape",
|
|
57
|
+
isSignal: true,
|
|
58
|
+
isRequired: false,
|
|
59
|
+
transformFunction: null
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
host: { properties: {
|
|
63
|
+
"class": "'star-avatar star-avatar--' + size() + ' star-avatar--' + shape()",
|
|
64
|
+
"attr.role": "name() ? 'img' : null",
|
|
65
|
+
"attr.aria-hidden": "name() ? null : 'true'",
|
|
66
|
+
"attr.aria-label": "name() || null"
|
|
67
|
+
} },
|
|
68
|
+
ngImport: i0,
|
|
69
|
+
template: `
|
|
70
|
+
@if (image() && !failed()) {
|
|
71
|
+
<img [src]="image()" alt="" (error)="failed.set(true)" />
|
|
72
|
+
} @else if (initials()) {
|
|
73
|
+
<span aria-hidden="true">{{ initials() }}</span>
|
|
74
|
+
} @else {
|
|
75
|
+
<i [class]="icon()" aria-hidden="true"></i>
|
|
76
|
+
}
|
|
77
|
+
`,
|
|
78
|
+
isInline: true,
|
|
79
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
83
|
+
minVersion: "12.0.0",
|
|
84
|
+
version: "22.2.6",
|
|
85
|
+
ngImport: i0,
|
|
86
|
+
type: StarAvatar,
|
|
87
|
+
decorators: [{
|
|
88
|
+
type: Component,
|
|
89
|
+
args: [{
|
|
90
|
+
selector: "star-avatar",
|
|
91
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
92
|
+
host: {
|
|
93
|
+
"[class]": "'star-avatar star-avatar--' + size() + ' star-avatar--' + shape()",
|
|
94
|
+
"[attr.role]": "name() ? 'img' : null",
|
|
95
|
+
"[attr.aria-hidden]": "name() ? null : 'true'",
|
|
96
|
+
"[attr.aria-label]": "name() || null"
|
|
97
|
+
},
|
|
98
|
+
template: `
|
|
99
|
+
@if (image() && !failed()) {
|
|
100
|
+
<img [src]="image()" alt="" (error)="failed.set(true)" />
|
|
101
|
+
} @else if (initials()) {
|
|
102
|
+
<span aria-hidden="true">{{ initials() }}</span>
|
|
103
|
+
} @else {
|
|
104
|
+
<i [class]="icon()" aria-hidden="true"></i>
|
|
105
|
+
}
|
|
106
|
+
`
|
|
107
|
+
}]
|
|
108
|
+
}],
|
|
109
|
+
propDecorators: {
|
|
110
|
+
name: [{
|
|
111
|
+
type: i0.Input,
|
|
112
|
+
args: [{
|
|
113
|
+
isSignal: true,
|
|
114
|
+
alias: "name",
|
|
115
|
+
required: false
|
|
116
|
+
}]
|
|
117
|
+
}],
|
|
118
|
+
image: [{
|
|
119
|
+
type: i0.Input,
|
|
120
|
+
args: [{
|
|
121
|
+
isSignal: true,
|
|
122
|
+
alias: "image",
|
|
123
|
+
required: false
|
|
124
|
+
}]
|
|
125
|
+
}],
|
|
126
|
+
icon: [{
|
|
127
|
+
type: i0.Input,
|
|
128
|
+
args: [{
|
|
129
|
+
isSignal: true,
|
|
130
|
+
alias: "icon",
|
|
131
|
+
required: false
|
|
132
|
+
}]
|
|
133
|
+
}],
|
|
134
|
+
size: [{
|
|
135
|
+
type: i0.Input,
|
|
136
|
+
args: [{
|
|
137
|
+
isSignal: true,
|
|
138
|
+
alias: "size",
|
|
139
|
+
required: false
|
|
140
|
+
}]
|
|
141
|
+
}],
|
|
142
|
+
shape: [{
|
|
143
|
+
type: i0.Input,
|
|
144
|
+
args: [{
|
|
145
|
+
isSignal: true,
|
|
146
|
+
alias: "shape",
|
|
147
|
+
required: false
|
|
148
|
+
}]
|
|
149
|
+
}]
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
export { StarAvatar };
|
|
153
|
+
|
|
154
|
+
//# sourceMappingURL=star-ng-ui-avatar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-ng-ui-avatar.mjs","names":[],"sources":["../../../projects/star-ng/avatar/avatar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core';\n\n/**\n * Avatar (PrimeNG `p-avatar`): image, initials from a name, or an icon; circle or square.\n * Falls back to initials when the image fails to load.\n * `<star-avatar name=\"Jane Doe\" [image]=\"user.photoUrl\" size=\"lg\" />`\n */\n@Component({\n selector: 'star-avatar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': \"'star-avatar star-avatar--' + size() + ' star-avatar--' + shape()\",\n // Without a name the avatar is decoration: it has no role and screen readers skip it.\n '[attr.role]': \"name() ? 'img' : null\",\n '[attr.aria-hidden]': \"name() ? null : 'true'\",\n '[attr.aria-label]': 'name() || null',\n },\n template: `\n @if (image() && !failed()) {\n <img [src]=\"image()\" alt=\"\" (error)=\"failed.set(true)\" />\n } @else if (initials()) {\n <span aria-hidden=\"true\">{{ initials() }}</span>\n } @else {\n <i [class]=\"icon()\" aria-hidden=\"true\"></i>\n }\n `,\n})\nexport class StarAvatar {\n readonly name = input('');\n readonly image = input<string | null>(null);\n readonly icon = input('ph-bold ph-user');\n readonly size = input<'sm' | 'md' | 'lg' | 'xl'>('md');\n readonly shape = input<'circle' | 'square'>('circle');\n\n protected readonly failed = signal(false);\n protected readonly initials = computed(() =>\n this.name()\n .split(/[\\s.@_-]+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase() ?? '')\n .join(''),\n );\n}\n"],"mappings":";;AA2BA,IAAa,aAAb,MAAa,WAAU;CACZ,OAAO,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAChB,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,OAAO,MAAM,mBAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,OAAO,MAAiC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC7C,QAAQ,MAA2B,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAElC,SAAS,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACtB,WAAW,eAC5B,KAAK,KAAI,CAAE,CACR,MAAM,WAAW,CAAC,CAClB,OAAO,OAAO,CAAC,CACf,MAAM,GAAG,CAAC,CAAC,CACX,KAAK,SAAS,KAAK,EAAE,EAAE,YAAW,KAAM,EAAE,CAAC,CAC3C,KAAK,EAAE,GACX,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAfU,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA;GAAA,SAAA;GAAA,aAAA;GAAA,oBAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UAVX;;;;;;;;;EAQT,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EApBtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM;IACJ,WAAW;IAEX,eAAe;IACf,sBAAsB;IACtB,qBAAqB;GACtB;GACD,UAAU;;;;;;;;;EASX,CAAA"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, input } from "@angular/core";
|
|
3
|
+
var StarBadge = class StarBadge {
|
|
4
|
+
value = input(null, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
|
|
5
|
+
severity = input("primary", ...ngDevMode ? [{ debugName: "severity" }] : /* istanbul ignore next */ []);
|
|
6
|
+
size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
|
|
7
|
+
max = input(99, ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
|
|
8
|
+
ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
|
|
9
|
+
isDot = computed(() => this.value() === null || this.value() === "", ...ngDevMode ? [{ debugName: "isDot" }] : /* istanbul ignore next */ []);
|
|
10
|
+
text = computed(() => {
|
|
11
|
+
const value = this.value();
|
|
12
|
+
return typeof value === "number" && value > this.max() ? `${this.max()}+` : `${value ?? ""}`;
|
|
13
|
+
}, ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
|
|
14
|
+
fullLabel = computed(() => {
|
|
15
|
+
const label = this.ariaLabel();
|
|
16
|
+
return label ? `${this.text()} ${label}`.trim() : null;
|
|
17
|
+
}, ...ngDevMode ? [{ debugName: "fullLabel" }] : /* istanbul ignore next */ []);
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
19
|
+
minVersion: "12.0.0",
|
|
20
|
+
version: "22.2.6",
|
|
21
|
+
ngImport: i0,
|
|
22
|
+
type: StarBadge,
|
|
23
|
+
deps: [],
|
|
24
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
25
|
+
});
|
|
26
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
27
|
+
minVersion: "17.0.0",
|
|
28
|
+
version: "22.2.6",
|
|
29
|
+
type: StarBadge,
|
|
30
|
+
isStandalone: true,
|
|
31
|
+
selector: "star-badge",
|
|
32
|
+
inputs: {
|
|
33
|
+
value: {
|
|
34
|
+
classPropertyName: "value",
|
|
35
|
+
publicName: "value",
|
|
36
|
+
isSignal: true,
|
|
37
|
+
isRequired: false,
|
|
38
|
+
transformFunction: null
|
|
39
|
+
},
|
|
40
|
+
severity: {
|
|
41
|
+
classPropertyName: "severity",
|
|
42
|
+
publicName: "severity",
|
|
43
|
+
isSignal: true,
|
|
44
|
+
isRequired: false,
|
|
45
|
+
transformFunction: null
|
|
46
|
+
},
|
|
47
|
+
size: {
|
|
48
|
+
classPropertyName: "size",
|
|
49
|
+
publicName: "size",
|
|
50
|
+
isSignal: true,
|
|
51
|
+
isRequired: false,
|
|
52
|
+
transformFunction: null
|
|
53
|
+
},
|
|
54
|
+
max: {
|
|
55
|
+
classPropertyName: "max",
|
|
56
|
+
publicName: "max",
|
|
57
|
+
isSignal: true,
|
|
58
|
+
isRequired: false,
|
|
59
|
+
transformFunction: null
|
|
60
|
+
},
|
|
61
|
+
ariaLabel: {
|
|
62
|
+
classPropertyName: "ariaLabel",
|
|
63
|
+
publicName: "ariaLabel",
|
|
64
|
+
isSignal: true,
|
|
65
|
+
isRequired: false,
|
|
66
|
+
transformFunction: null
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
host: { properties: {
|
|
70
|
+
"class": "'star-badge star-badge--' + severity() + ' star-badge--' + size()",
|
|
71
|
+
"class.star-badge--dot": "isDot()",
|
|
72
|
+
"attr.role": "ariaLabel() ? 'status' : null",
|
|
73
|
+
"attr.aria-label": "fullLabel()"
|
|
74
|
+
} },
|
|
75
|
+
ngImport: i0,
|
|
76
|
+
template: `
|
|
77
|
+
@if (!isDot()) {
|
|
78
|
+
{{ text() }}
|
|
79
|
+
}
|
|
80
|
+
`,
|
|
81
|
+
isInline: true,
|
|
82
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
86
|
+
minVersion: "12.0.0",
|
|
87
|
+
version: "22.2.6",
|
|
88
|
+
ngImport: i0,
|
|
89
|
+
type: StarBadge,
|
|
90
|
+
decorators: [{
|
|
91
|
+
type: Component,
|
|
92
|
+
args: [{
|
|
93
|
+
selector: "star-badge",
|
|
94
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
95
|
+
host: {
|
|
96
|
+
"[class]": "'star-badge star-badge--' + severity() + ' star-badge--' + size()",
|
|
97
|
+
"[class.star-badge--dot]": "isDot()",
|
|
98
|
+
"[attr.role]": "ariaLabel() ? 'status' : null",
|
|
99
|
+
"[attr.aria-label]": "fullLabel()"
|
|
100
|
+
},
|
|
101
|
+
template: `
|
|
102
|
+
@if (!isDot()) {
|
|
103
|
+
{{ text() }}
|
|
104
|
+
}
|
|
105
|
+
`
|
|
106
|
+
}]
|
|
107
|
+
}],
|
|
108
|
+
propDecorators: {
|
|
109
|
+
value: [{
|
|
110
|
+
type: i0.Input,
|
|
111
|
+
args: [{
|
|
112
|
+
isSignal: true,
|
|
113
|
+
alias: "value",
|
|
114
|
+
required: false
|
|
115
|
+
}]
|
|
116
|
+
}],
|
|
117
|
+
severity: [{
|
|
118
|
+
type: i0.Input,
|
|
119
|
+
args: [{
|
|
120
|
+
isSignal: true,
|
|
121
|
+
alias: "severity",
|
|
122
|
+
required: false
|
|
123
|
+
}]
|
|
124
|
+
}],
|
|
125
|
+
size: [{
|
|
126
|
+
type: i0.Input,
|
|
127
|
+
args: [{
|
|
128
|
+
isSignal: true,
|
|
129
|
+
alias: "size",
|
|
130
|
+
required: false
|
|
131
|
+
}]
|
|
132
|
+
}],
|
|
133
|
+
max: [{
|
|
134
|
+
type: i0.Input,
|
|
135
|
+
args: [{
|
|
136
|
+
isSignal: true,
|
|
137
|
+
alias: "max",
|
|
138
|
+
required: false
|
|
139
|
+
}]
|
|
140
|
+
}],
|
|
141
|
+
ariaLabel: [{
|
|
142
|
+
type: i0.Input,
|
|
143
|
+
args: [{
|
|
144
|
+
isSignal: true,
|
|
145
|
+
alias: "ariaLabel",
|
|
146
|
+
required: false
|
|
147
|
+
}]
|
|
148
|
+
}]
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
export { StarBadge };
|
|
152
|
+
|
|
153
|
+
//# sourceMappingURL=star-ng-ui-badge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-ng-ui-badge.mjs","names":[],"sources":["../../../projects/star-ng/badge/badge.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { StarSeverity } from '@star-ng/ui/core';\n\n/**\n * Count or dot badge (PrimeNG `p-badge`). Without a value it renders a dot.\n * `<star-badge [value]=\"unread()\" severity=\"danger\" ariaLabel=\"unread messages\" />`\n */\n@Component({\n selector: 'star-badge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': \"'star-badge star-badge--' + severity() + ' star-badge--' + size()\",\n '[class.star-badge--dot]': 'isDot()',\n '[attr.role]': \"ariaLabel() ? 'status' : null\",\n '[attr.aria-label]': 'fullLabel()',\n },\n template: `\n @if (!isDot()) {\n {{ text() }}\n }\n `,\n})\nexport class StarBadge {\n readonly value = input<string | number | null>(null);\n readonly severity = input<StarSeverity>('primary');\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n /** Numbers above this show as \"max+\". */\n readonly max = input(99);\n /** What the count means, for screen readers (for example \"unread messages\"). */\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly isDot = computed(() => this.value() === null || this.value() === '');\n protected readonly text = computed(() => {\n const value = this.value();\n return typeof value === 'number' && value > this.max() ? `${this.max()}+` : `${value ?? ''}`;\n });\n protected readonly fullLabel = computed(() => {\n const label = this.ariaLabel();\n return label ? `${this.text()} ${label}`.trim() : null;\n });\n}\n"],"mappings":";;AAsBA,IAAa,YAAb,MAAa,UAAS;CACX,QAAQ,MAA8B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC3C,WAAW,MAAoB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,OAAO,MAA0B,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEtC,MAAM,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAEf,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,QAAQ,eAAe,KAAK,MAAK,MAAO,QAAQ,KAAK,MAAK,MAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACpE,OAAO,eAAc;EACtC,MAAM,QAAQ,KAAK,MAAK;EACxB,OAAO,OAAO,UAAU,YAAY,QAAQ,KAAK,IAAG,IAAK,GAAG,KAAK,IAAG,EAAE,KAAM,GAAG,SAAS;CAC1F,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACiB,YAAY,eAAc;EAC3C,MAAM,QAAQ,KAAK,UAAS;EAC5B,OAAO,QAAQ,GAAG,KAAK,KAAI,EAAE,GAAI,QAAQ,KAAI,IAAK;CACpD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAjBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAS,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAT,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAS,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,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,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,KAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA;GAAA,SAAA;GAAA,yBAAA;GAAA,aAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UANV;;;;;EAIT,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EAfrB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM;IACJ,WAAW;IACX,2BAA2B;IAC3B,eAAe;IACf,qBAAqB;GACtB;GACD,UAAU;;;;;EAKX,CAAA"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, inject, input } from "@angular/core";
|
|
3
|
+
import { RouterLink } from "@angular/router";
|
|
4
|
+
import { STAR_UI_TEXT } from "@star-ng/ui/core";
|
|
5
|
+
var StarBreadcrumb = class StarBreadcrumb {
|
|
6
|
+
text = inject(STAR_UI_TEXT);
|
|
7
|
+
items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
8
|
+
home = input(null, ...ngDevMode ? [{ debugName: "home" }] : /* istanbul ignore next */ []);
|
|
9
|
+
ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
|
|
10
|
+
all() {
|
|
11
|
+
const home = this.home();
|
|
12
|
+
return home ? [home, ...this.items()] : this.items();
|
|
13
|
+
}
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
15
|
+
minVersion: "12.0.0",
|
|
16
|
+
version: "22.2.6",
|
|
17
|
+
ngImport: i0,
|
|
18
|
+
type: StarBreadcrumb,
|
|
19
|
+
deps: [],
|
|
20
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
21
|
+
});
|
|
22
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
23
|
+
minVersion: "17.0.0",
|
|
24
|
+
version: "22.2.6",
|
|
25
|
+
type: StarBreadcrumb,
|
|
26
|
+
isStandalone: true,
|
|
27
|
+
selector: "star-breadcrumb",
|
|
28
|
+
inputs: {
|
|
29
|
+
items: {
|
|
30
|
+
classPropertyName: "items",
|
|
31
|
+
publicName: "items",
|
|
32
|
+
isSignal: true,
|
|
33
|
+
isRequired: false,
|
|
34
|
+
transformFunction: null
|
|
35
|
+
},
|
|
36
|
+
home: {
|
|
37
|
+
classPropertyName: "home",
|
|
38
|
+
publicName: "home",
|
|
39
|
+
isSignal: true,
|
|
40
|
+
isRequired: false,
|
|
41
|
+
transformFunction: null
|
|
42
|
+
},
|
|
43
|
+
ariaLabel: {
|
|
44
|
+
classPropertyName: "ariaLabel",
|
|
45
|
+
publicName: "ariaLabel",
|
|
46
|
+
isSignal: true,
|
|
47
|
+
isRequired: false,
|
|
48
|
+
transformFunction: null
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
ngImport: i0,
|
|
52
|
+
template: `
|
|
53
|
+
<nav class="star-breadcrumb" [attr.aria-label]="ariaLabel() ?? text.breadcrumb">
|
|
54
|
+
<ol class="star-breadcrumb__list">
|
|
55
|
+
@for (item of all(); track $index; let last = $last) {
|
|
56
|
+
<li class="star-breadcrumb__item">
|
|
57
|
+
@if (last) {
|
|
58
|
+
<span class="star-breadcrumb__current" aria-current="page">
|
|
59
|
+
@if (item.icon) {
|
|
60
|
+
<i [class]="item.icon" aria-hidden="true"></i>
|
|
61
|
+
}
|
|
62
|
+
{{ item.label }}
|
|
63
|
+
</span>
|
|
64
|
+
} @else {
|
|
65
|
+
@if (item.routerLink) {
|
|
66
|
+
<a
|
|
67
|
+
class="star-breadcrumb__link"
|
|
68
|
+
[routerLink]="item.routerLink"
|
|
69
|
+
[attr.aria-label]="item.icon && $first && home() ? item.label : null"
|
|
70
|
+
>
|
|
71
|
+
@if (item.icon) {
|
|
72
|
+
<i [class]="item.icon" aria-hidden="true"></i>
|
|
73
|
+
}
|
|
74
|
+
@if (!(item.icon && $first && home())) {
|
|
75
|
+
{{ item.label }}
|
|
76
|
+
}
|
|
77
|
+
</a>
|
|
78
|
+
} @else if (item.url) {
|
|
79
|
+
<a class="star-breadcrumb__link" [href]="item.url">{{ item.label }}</a>
|
|
80
|
+
} @else {
|
|
81
|
+
<span>{{ item.label }}</span>
|
|
82
|
+
}
|
|
83
|
+
<i
|
|
84
|
+
class="ph-bold ph-caret-right star-breadcrumb__sep star-icon-mirror"
|
|
85
|
+
aria-hidden="true"
|
|
86
|
+
></i>
|
|
87
|
+
}
|
|
88
|
+
</li>
|
|
89
|
+
}
|
|
90
|
+
</ol>
|
|
91
|
+
</nav>
|
|
92
|
+
`,
|
|
93
|
+
isInline: true,
|
|
94
|
+
dependencies: [{
|
|
95
|
+
kind: "directive",
|
|
96
|
+
type: RouterLink,
|
|
97
|
+
selector: "[routerLink]",
|
|
98
|
+
inputs: [
|
|
99
|
+
"target",
|
|
100
|
+
"queryParams",
|
|
101
|
+
"fragment",
|
|
102
|
+
"queryParamsHandling",
|
|
103
|
+
"state",
|
|
104
|
+
"info",
|
|
105
|
+
"relativeTo",
|
|
106
|
+
"preserveFragment",
|
|
107
|
+
"skipLocationChange",
|
|
108
|
+
"replaceUrl",
|
|
109
|
+
"browserUrl",
|
|
110
|
+
"routerLink"
|
|
111
|
+
]
|
|
112
|
+
}],
|
|
113
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
117
|
+
minVersion: "12.0.0",
|
|
118
|
+
version: "22.2.6",
|
|
119
|
+
ngImport: i0,
|
|
120
|
+
type: StarBreadcrumb,
|
|
121
|
+
decorators: [{
|
|
122
|
+
type: Component,
|
|
123
|
+
args: [{
|
|
124
|
+
selector: "star-breadcrumb",
|
|
125
|
+
imports: [RouterLink],
|
|
126
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
127
|
+
template: `
|
|
128
|
+
<nav class="star-breadcrumb" [attr.aria-label]="ariaLabel() ?? text.breadcrumb">
|
|
129
|
+
<ol class="star-breadcrumb__list">
|
|
130
|
+
@for (item of all(); track $index; let last = $last) {
|
|
131
|
+
<li class="star-breadcrumb__item">
|
|
132
|
+
@if (last) {
|
|
133
|
+
<span class="star-breadcrumb__current" aria-current="page">
|
|
134
|
+
@if (item.icon) {
|
|
135
|
+
<i [class]="item.icon" aria-hidden="true"></i>
|
|
136
|
+
}
|
|
137
|
+
{{ item.label }}
|
|
138
|
+
</span>
|
|
139
|
+
} @else {
|
|
140
|
+
@if (item.routerLink) {
|
|
141
|
+
<a
|
|
142
|
+
class="star-breadcrumb__link"
|
|
143
|
+
[routerLink]="item.routerLink"
|
|
144
|
+
[attr.aria-label]="item.icon && $first && home() ? item.label : null"
|
|
145
|
+
>
|
|
146
|
+
@if (item.icon) {
|
|
147
|
+
<i [class]="item.icon" aria-hidden="true"></i>
|
|
148
|
+
}
|
|
149
|
+
@if (!(item.icon && $first && home())) {
|
|
150
|
+
{{ item.label }}
|
|
151
|
+
}
|
|
152
|
+
</a>
|
|
153
|
+
} @else if (item.url) {
|
|
154
|
+
<a class="star-breadcrumb__link" [href]="item.url">{{ item.label }}</a>
|
|
155
|
+
} @else {
|
|
156
|
+
<span>{{ item.label }}</span>
|
|
157
|
+
}
|
|
158
|
+
<i
|
|
159
|
+
class="ph-bold ph-caret-right star-breadcrumb__sep star-icon-mirror"
|
|
160
|
+
aria-hidden="true"
|
|
161
|
+
></i>
|
|
162
|
+
}
|
|
163
|
+
</li>
|
|
164
|
+
}
|
|
165
|
+
</ol>
|
|
166
|
+
</nav>
|
|
167
|
+
`
|
|
168
|
+
}]
|
|
169
|
+
}],
|
|
170
|
+
propDecorators: {
|
|
171
|
+
items: [{
|
|
172
|
+
type: i0.Input,
|
|
173
|
+
args: [{
|
|
174
|
+
isSignal: true,
|
|
175
|
+
alias: "items",
|
|
176
|
+
required: false
|
|
177
|
+
}]
|
|
178
|
+
}],
|
|
179
|
+
home: [{
|
|
180
|
+
type: i0.Input,
|
|
181
|
+
args: [{
|
|
182
|
+
isSignal: true,
|
|
183
|
+
alias: "home",
|
|
184
|
+
required: false
|
|
185
|
+
}]
|
|
186
|
+
}],
|
|
187
|
+
ariaLabel: [{
|
|
188
|
+
type: i0.Input,
|
|
189
|
+
args: [{
|
|
190
|
+
isSignal: true,
|
|
191
|
+
alias: "ariaLabel",
|
|
192
|
+
required: false
|
|
193
|
+
}]
|
|
194
|
+
}]
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
export { StarBreadcrumb };
|
|
198
|
+
|
|
199
|
+
//# sourceMappingURL=star-ng-ui-breadcrumb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-ng-ui-breadcrumb.mjs","names":[],"sources":["../../../projects/star-ng/breadcrumb/breadcrumb.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\n\nexport interface StarBreadcrumbItem {\n readonly label: string;\n readonly routerLink?: string | readonly unknown[];\n readonly url?: string;\n readonly icon?: string;\n}\n\n/**\n * Breadcrumb (PrimeNG `p-breadcrumb`): `nav` landmark, ordered list, `aria-current=\"page\"` on\n * the last item, optional home link.\n *\n * `<star-breadcrumb [home]=\"{ label: 'Home', icon: 'ph-bold ph-house', routerLink: '/' }\" [items]=\"trail\" />`\n */\n@Component({\n selector: 'star-breadcrumb',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <nav class=\"star-breadcrumb\" [attr.aria-label]=\"ariaLabel() ?? text.breadcrumb\">\n <ol class=\"star-breadcrumb__list\">\n @for (item of all(); track $index; let last = $last) {\n <li class=\"star-breadcrumb__item\">\n @if (last) {\n <span class=\"star-breadcrumb__current\" aria-current=\"page\">\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n {{ item.label }}\n </span>\n } @else {\n @if (item.routerLink) {\n <a\n class=\"star-breadcrumb__link\"\n [routerLink]=\"item.routerLink\"\n [attr.aria-label]=\"item.icon && $first && home() ? item.label : null\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n @if (!(item.icon && $first && home())) {\n {{ item.label }}\n }\n </a>\n } @else if (item.url) {\n <a class=\"star-breadcrumb__link\" [href]=\"item.url\">{{ item.label }}</a>\n } @else {\n <span>{{ item.label }}</span>\n }\n <i\n class=\"ph-bold ph-caret-right star-breadcrumb__sep star-icon-mirror\"\n aria-hidden=\"true\"\n ></i>\n }\n </li>\n }\n </ol>\n </nav>\n `,\n})\nexport class StarBreadcrumb {\n protected readonly text = inject(STAR_UI_TEXT);\n readonly items = input<readonly StarBreadcrumbItem[]>([]);\n /** First item; when it has an icon, only the icon shows (label stays for screen readers). */\n readonly home = input<StarBreadcrumbItem | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n protected all(): readonly StarBreadcrumbItem[] {\n const home = this.home();\n return home ? [home, ...this.items()] : this.items();\n }\n}\n"],"mappings":";;;;AA+DA,IAAa,iBAAb,MAAa,eAAc;CACN,OAAO,OAAO,YAAY;CACpC,QAAQ,MAAqC,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,OAAO,MAAiC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC7C,YAAY,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAErC,MAAG;EACX,MAAM,OAAO,KAAK,KAAI;EACtB,OAAO,OAAO,CAAC,MAAM,GAAG,KAAK,MAAK,CAAE,IAAI,KAAK,MAAK;CACpD;CAVW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAc,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAd,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAc,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UA1Cf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MA1CS;GAAU,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AA4CT,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAc,YAAA,CAAA;EA9C1B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,UAAU;GACpB,iBAAiB,wBAAwB;GACzC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCX,CAAA"}
|