@ngneers/controls 0.0.1-pre4 → 0.0.1-pre5

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.
Files changed (32) hide show
  1. package/fesm2022/ngneers-controls-button.mjs +3 -2
  2. package/fesm2022/ngneers-controls-button.mjs.map +1 -1
  3. package/fesm2022/{ngneers-controls-calendar-time-C7UnIFzU.mjs → ngneers-controls-calendar-time-BEeJIqIX.mjs} +2 -2
  4. package/fesm2022/{ngneers-controls-calendar-time-C7UnIFzU.mjs.map → ngneers-controls-calendar-time-BEeJIqIX.mjs.map} +1 -1
  5. package/fesm2022/ngneers-controls-calendar.mjs +3 -3
  6. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  7. package/fesm2022/ngneers-controls-dialog.mjs +1 -1
  8. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  9. package/fesm2022/ngneers-controls-drawer.mjs +1 -1
  10. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-edit-inplace.mjs +1 -1
  12. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-filter.mjs +1 -1
  14. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  15. package/fesm2022/ngneers-controls-input-field.mjs +1 -1
  16. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  17. package/fesm2022/ngneers-controls-input.mjs +2 -1
  18. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  19. package/fesm2022/ngneers-controls-paginator.mjs +1 -1
  20. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-select.mjs +1 -1
  22. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-slider.mjs +1 -1
  24. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-toast.mjs +1 -1
  26. package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-tooltip.mjs +2 -10
  28. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/types/ngneers-controls-button.d.ts +1 -1
  31. package/types/ngneers-controls-input.d.ts +1 -1
  32. package/types/ngneers-controls-tooltip.d.ts +1 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-select.mjs","sources":["../../src/select/select-templates.ts","../../src/select/select.ts","../../src/select/select.html","../../src/select/ngneers-controls-select.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { NgnItem } from '@ngneers/controls/api';\r\nimport type { InputGeneric } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * This type determines the value type for the select control.\r\n * * If `multiple` is true, the value is an array of items: `T[K][]`.\r\n * * If `editable` is true, the value is a `string`.\r\n * * If neither is true, the value is the item's value type `T[K]`.\r\n */\r\nexport type ValueType<V, Editable extends boolean, Multiple extends boolean> =\r\n InputGeneric<Multiple, false> extends true\r\n ? V[]\r\n : InputGeneric<Editable, false> extends true\r\n ? string\r\n : V;\r\n\r\n@Directive()\r\nexport abstract class SelectTemplates<\r\n V,\r\n Editable extends boolean,\r\n Multiple extends boolean,\r\n> extends ValueControlBase<'select', ValueType<V, Editable, Multiple> | null> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n\r\n // Selected item template\r\n private readonly _defaultSelectedItemTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.item>\r\n >('defaultSelectedItemTemplate');\r\n private readonly _userSelectedItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('selectedItem');\r\n /**\r\n * Set a custom template for the selected item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#selectedItem` template reference variable.\r\n */\r\n public readonly templateSelectedItem = input<TemplateRef<typeof this.templateTypes.item> | null>(\r\n null\r\n );\r\n protected readonly selectedItemTemplate = computed(\r\n () =>\r\n this._userSelectedItemTemplate() ??\r\n this.templateSelectedItem() ??\r\n this._defaultSelectedItemTemplate()\r\n );\r\n\r\n // Selected items template\r\n private readonly _defaultSelectedItemsTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.selectedItems>\r\n >('defaultSelectedItemsTemplate');\r\n private readonly _userSelectedItemsTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.selectedItems>>('selectedItems');\r\n /**\r\n * Set a custom template for the selected items of the select control if {@link multiple} is `true`.\r\n * Can also be set using an `<ng-template>` element with `#selectedItems` template reference variable.\r\n */\r\n public readonly templateSelectedItems = input<TemplateRef<\r\n typeof this.templateTypes.selectedItems\r\n > | null>(null);\r\n protected readonly selectedItemsTemplate = computed(\r\n () =>\r\n this._userSelectedItemsTemplate() ??\r\n this.templateSelectedItems() ??\r\n this._defaultSelectedItemsTemplate()\r\n );\r\n\r\n // Group template\r\n private readonly _defaultGroupTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\r\n private readonly _userGroupTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\r\n /**\r\n * Set a custom template for a group in the select control.\r\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\r\n */\r\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly groupTemplate = computed(\r\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\r\n );\r\n\r\n // No items template\r\n private readonly _userNoItemsTemplate = contentChild<TemplateRef<unknown>>('noItems');\r\n /**\r\n * Set a custom template for the no items state of the select control.\r\n * Can also be set using an `<ng-template>` element with `#noItems` template reference variable.\r\n */\r\n public readonly templateNoItems = input<TemplateRef<unknown> | null>(null);\r\n protected readonly noItemsTemplate = computed(\r\n () => this._userNoItemsTemplate() ?? this.templateNoItems()\r\n );\r\n\r\n /**\r\n * Types for the dialog templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: NgnItem<unknown, V> | undefined;\r\n };\r\n selectedItems: {\r\n $implicit: NgnItem<unknown, V>[];\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChild,\r\n effect,\r\n input,\r\n linkedSignal,\r\n type OutputRefSubscription,\r\n type Signal,\r\n signal,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n inject,\r\n} from '@angular/core';\r\nimport { type FilterConfig, mapToItems, type NgnItem } from '@ngneers/controls/api';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { NgnItemView } from '@ngneers/controls/item-view';\r\nimport { NgnListBox } from '@ngneers/controls/list-box';\r\nimport { NgnPopover, type PopoverOptions } from '@ngneers/controls/popover';\r\nimport { deepMerge, maybeCallback, NgnError } from '@ngneers/controls/utils';\r\nimport { selectControlTemplate } from '@ngneers/controls-themes/templates/select';\r\n\r\nimport { SelectTemplates, type ValueType } from './select-templates';\r\n\r\nimport type { SelectFilterOptions } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-select',\r\n templateUrl: './select.html',\r\n imports: [\r\n NgnPt,\r\n NgnInputField,\r\n NgnListBox,\r\n NgnPopover,\r\n NgnInput,\r\n NgTemplateOutlet,\r\n NgnTemplate,\r\n NgnItemView,\r\n NgnIcon,\r\n ],\r\n providers: [provideSelf(NgnSelect)],\r\n host: {\r\n style: 'display: block;',\r\n },\r\n})\r\nexport class NgnSelect<\r\n V,\r\n Editable extends boolean = false,\r\n Multiple extends boolean = false,\r\n> extends SelectTemplates<V, Editable, Multiple> {\r\n protected readonly theme = this.injectThemeTemplate(selectControlTemplate, 'root');\r\n protected readonly i18n = inject(I18n).translations;\r\n private readonly _popover = viewChild.required<NgnPopover>(NgnPopover);\r\n private readonly _customEditableInput = contentChild(NgnInput);\r\n private _customEditableSub?: OutputRefSubscription;\r\n\r\n /**\r\n * Options for the popover.\r\n */\r\n public readonly popoverOptions = input<PopoverOptions>({});\r\n protected readonly appliedPopoverOptions = computed(() =>\r\n deepMerge(\r\n {\r\n sizeConstraints: {\r\n width: 1,\r\n maxWidth: 1,\r\n minHeight: '250px',\r\n maxHeight: '700px',\r\n },\r\n },\r\n this.popoverOptions()\r\n )\r\n );\r\n /**\r\n * The available options to choose from. They can either be\r\n * * A list of {@link NgnItem} objects\r\n * * A list of plain objects. You'll have to provide a {@link fields} input to specify how to map the plain objects to {@link NgnItem} objects.\r\n */\r\n public readonly options = input<readonly NgnItem<unknown, V>[]>([]);\r\n /**\r\n * Accepts a boolean value that determines whether the filter is enabled.\r\n * Alternatively, you can provide `SelectFilterOptions` to customize the filter behavior.\r\n * @default `false`\r\n */\r\n public readonly filter = input<SelectFilterOptions<NgnItem<unknown, V>> | boolean>(false);\r\n /**\r\n * Manually set the filter text.\r\n */\r\n public readonly filterText = input<string | null>(null);\r\n /**\r\n * The icon to display in the filter input.\r\n */\r\n public readonly filterIcon = input<IconType>();\r\n /**\r\n * The icon to display in the dropdown.\r\n */\r\n public readonly dropdownIcon = input<IconType>();\r\n /**\r\n * Whether the select is virtualized.\r\n * @default `false`\r\n */\r\n public readonly virtual = input(false, { transform: booleanAttribute });\r\n /**\r\n * When {@link virtual} is enabled, this property defines the height of each item in the list.\r\n */\r\n public readonly itemHeight = input<number>();\r\n /**\r\n * Enable this to allow the user to type in a value that is not in the list.\r\n * When enabled, the value of the control becomes the label of a selected item or the typed value.\r\n *\r\n * Cannot be used with\r\n * * {@link multiple} selection\r\n * * {@link filter} without also setting {@link editableAutoFilter} to `false`\r\n *\r\n * @default `false`\r\n */\r\n public readonly editable = input<Editable>();\r\n /**\r\n * Whether to automatically filter the options based on the user's input in the {@link editable} input.\r\n * @default `true`\r\n */\r\n public readonly editableAutoFilter = input(true, { transform: booleanAttribute });\r\n /**\r\n * Enable this to allow the user to select multiple values.\r\n * When enabled, the value of the control becomes an array of selected items.\r\n *\r\n * This is only applicable when {@link editable} is `false`.\r\n * @default `false`\r\n */\r\n public readonly multiple = input<Multiple>();\r\n /**\r\n * Whether to scroll to the selected item when the dropdown is opened.\r\n * @default `true`\r\n */\r\n public readonly scrollToSelectedItemOnOpen = input<boolean | ScrollLogicalPosition>(true);\r\n /**\r\n * Tabindex for the select control.\r\n * @default `0`\r\n */\r\n public readonly tabindex = input<number>(0);\r\n /**\r\n * Whether to use a checkbox to indicate selection state.\r\n *\r\n * This option is true per default when {@link multiple} is `true`.\r\n * @default multiple()\r\n */\r\n public readonly checkbox = input<boolean>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n private readonly _listbox = viewChild(NgnListBox);\r\n private _userChangedEditableInput = false;\r\n\r\n protected readonly filterTextInternal = linkedSignal(this.filterText);\r\n protected readonly currentHighlightedValue = signal<V | null>(null);\r\n protected readonly valueStr = computed(() => {\r\n const v = this.value();\r\n return typeof v === 'string' ? v : null;\r\n });\r\n protected readonly valueArray = computed(() => {\r\n const v = this.value();\r\n return Array.isArray(v) ? v : v ? [v] : [];\r\n });\r\n\r\n protected readonly appliedFilter: Signal<FilterConfig<NgnItem> | boolean> = computed(\r\n () => this.filter() || this.editable() || false\r\n );\r\n\r\n private readonly _flatOptions = computed(() => mapToItems(this.options()));\r\n\r\n protected readonly selectedItems = computed(() => {\r\n if (this.editable()) {\r\n return [this._flatOptions().find(option => option.label === this.value())];\r\n } else {\r\n return this.valueArray().map(value =>\r\n this._flatOptions().find(option => option.value === value)\r\n );\r\n }\r\n });\r\n protected readonly selectedItemsValues = computed(() =>\r\n this.selectedItems().map(item => item?.value)\r\n );\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.editable() && this.multiple()) {\r\n throw new NgnError('select', 'Editable and multiple selection cannot be used together');\r\n }\r\n if (this.editable() && this.filter()) {\r\n throw new NgnError('select', 'Editable and filtering cannot be used together');\r\n }\r\n });\r\n effect(() => {\r\n this._customEditableSub?.unsubscribe();\r\n const editable = this.editable();\r\n const customEditableInput = this._customEditableInput();\r\n if (!editable || !customEditableInput) {\r\n return;\r\n }\r\n\r\n this._customEditableSub = customEditableInput.value.subscribe(value => {\r\n this.onEditableChange(value);\r\n });\r\n // Set ARIA attributes for accessibility\r\n customEditableInput.element.nativeElement.setAttribute('aria-autocomplete', 'list');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-expanded',\r\n `${this._popover().open()}`\r\n );\r\n customEditableInput.element.nativeElement.setAttribute('aria-haspopup', 'listbox');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-controls',\r\n `${this.inputId()}_listbox`\r\n );\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const valueSig = this._customEditableInput()?.value;\r\n if (valueSig) {\r\n valueSig.set((this.value() as string) || '');\r\n }\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const hasOptions = !!this._listbox()?.displayedItems().length;\r\n if (!this._userChangedEditableInput) {\r\n return;\r\n }\r\n this._userChangedEditableInput = false;\r\n if (hasOptions) {\r\n this.show();\r\n } else {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n this._listbox()?.onKeyDown(event);\r\n // if event is not handled by the listbox, we can handle it here\r\n if (!event.defaultPrevented) {\r\n if (event.key === 'Enter') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n this._popover().toggle();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const currentIndex = this.options().findIndex(option => option.value === this.value());\r\n let newIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\r\n if (newIndex < 0) {\r\n newIndex = 0;\r\n }\r\n if (newIndex >= this.options().length) {\r\n newIndex = this.options().length - 1;\r\n }\r\n const newValue = this.options()[newIndex]?.value;\r\n if (newValue !== undefined) {\r\n this.onSelect(newValue as ValueType<V, false, Multiple>);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected onPopoverClosed() {\r\n this.potentiallyBlurred();\r\n this.currentHighlightedValue.set(null);\r\n const filter = this.filter();\r\n if (filter === true || (typeof filter === 'object' && filter.clearFilterOnClose)) {\r\n if (!this.editable()) {\r\n this.filterTextInternal.set('');\r\n }\r\n }\r\n }\r\n\r\n protected onSelect(value: ValueType<V, false, Multiple> | null) {\r\n if (this.editable()) {\r\n const item = this._flatOptions().find(option => option.value === value);\r\n if (item) {\r\n this.value.set(maybeCallback(item.label) as ValueType<V, Editable, Multiple>);\r\n }\r\n } else {\r\n const v = value as ValueType<V, Editable, Multiple>;\r\n if (this.value() !== v) {\r\n this.value.set(v);\r\n }\r\n }\r\n }\r\n\r\n protected onItemClicked() {\r\n if (!this.multiple()) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Shows the select dropdown.\r\n */\r\n public show() {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n this._popover().show();\r\n }\r\n\r\n /**\r\n * Hides the select dropdown.\r\n */\r\n public hide() {\r\n this._popover().hide();\r\n }\r\n\r\n protected onEditableChange(value: string | null) {\r\n if (this.editable()) {\r\n this.value.set(maybeCallback(value) as ValueType<V, Editable, Multiple>);\r\n this._userChangedEditableInput = true;\r\n if (this.editableAutoFilter()) {\r\n this.filterTextInternal.set(value);\r\n }\r\n }\r\n }\r\n\r\n protected potentiallyBlurred() {\r\n setTimeout(() => {\r\n if (this.element.nativeElement.contains(document.activeElement) || this._popover().open()) {\r\n return;\r\n }\r\n this.touched.set(true);\r\n });\r\n }\r\n}\r\n","<ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n input: true,\r\n 'input-editable': editable(),\r\n }\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [labelledBy]=\"labelledBy()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [readonly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [tabindex]=\"editable() || disabled() ? -1 : tabindex()\"\r\n (focusout)=\"potentiallyBlurred()\"\r\n>\r\n @if (editable()) {\r\n <ng-content select=\"[ngnInput]\">\r\n <input\r\n ngnInput\r\n autocomplete=\"list\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [id]=\"inputId()\"\r\n [value]=\"valueStr() || ''\"\r\n (valueChange)=\"onEditableChange($event)\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </ng-content>\r\n } @else {\r\n <div\r\n role=\"combobox\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'combobox'\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\r\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [id]=\"inputId()\"\r\n >\r\n @if (multiple()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemsTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems(),\r\n }\"\r\n />\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems()[0],\r\n }\"\r\n />\r\n }\r\n </div>\r\n }\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"dropdownIcon()\" defaultIcon=\"chevron_down\" />\r\n</ngn-input-field>\r\n<ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"field.element.nativeElement\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (closed)=\"onPopoverClosed()\"\r\n [id]=\"inputId() + '_popover'\"\r\n [hasShrinkableContent]=\"true\"\r\n>\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n @if (filter()) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'filter'\">\r\n <input\r\n ngnInput\r\n [value]=\"filterTextInternal()\"\r\n (valueChange)=\"filterTextInternal.set($event)\"\r\n />\r\n <ngn-icon\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'filter-icon'\"\r\n defaultIcon=\"magnifying_glass\"\r\n [icon]=\"filterIcon()\"\r\n />\r\n </ngn-input-field>\r\n }\r\n <ngn-list-box\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n 'list-box': true,\r\n }\"\r\n style=\"height: 100%; min-height: 0\"\r\n [focussable]=\"false\"\r\n [selectable]=\"true\"\r\n [filter]=\"appliedFilter()\"\r\n [filterText]=\"filterTextInternal()\"\r\n [items]=\"options()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [virtual]=\"virtual()\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateGroup]=\"groupTemplate()\"\r\n [multiple]=\"multiple()\"\r\n [value]=\"multiple() ? selectedItemsValues() : selectedItemsValues()[0]\"\r\n [scrollToSelectedItemOnInit]=\"scrollToSelectedItemOnOpen()\"\r\n (valueChange)=\"onSelect($event)\"\r\n (itemClicked)=\"onItemClicked()\"\r\n [inputId]=\"inputId() + '_listbox'\"\r\n [templateEmpty]=\"noItemsTemplate()\"\r\n [checkbox]=\"checkbox()\"\r\n />\r\n </div>\r\n </ng-template>\r\n</ngn-popover>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">&ZeroWidthSpace;</span>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemsTemplate [ngnTemplate]=\"templateTypes.selectedItems\" let-items>\r\n <ngn-item-view\r\n #itemView\r\n [items]=\"items\"\r\n [idField]=\"'value'\"\r\n [separator]=\"true\"\r\n style=\"margin-right: 8px\"\r\n >\r\n <ng-template #item let-item [ngnTemplate]=\"itemView.templateTypes.item\">\r\n <ng-container\r\n *ngTemplateOutlet=\"selectedItemTemplate(); context: { $implicit: item }\"\r\n ></ng-container>\r\n </ng-template>\r\n </ngn-item-view>\r\n @if (items.length < 1) {\r\n &ZeroWidthSpace;\r\n }\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-select.mjs","sources":["../../src/select/select-templates.ts","../../src/select/select.ts","../../src/select/select.html","../../src/select/ngneers-controls-select.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { NgnItem } from '@ngneers/controls/api';\r\nimport type { InputGeneric } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * This type determines the value type for the select control.\r\n * * If `multiple` is true, the value is an array of items: `T[K][]`.\r\n * * If `editable` is true, the value is a `string`.\r\n * * If neither is true, the value is the item's value type `T[K]`.\r\n */\r\nexport type ValueType<V, Editable extends boolean, Multiple extends boolean> =\r\n InputGeneric<Multiple, false> extends true\r\n ? V[]\r\n : InputGeneric<Editable, false> extends true\r\n ? string\r\n : V;\r\n\r\n@Directive()\r\nexport abstract class SelectTemplates<\r\n V,\r\n Editable extends boolean,\r\n Multiple extends boolean,\r\n> extends ValueControlBase<'select', ValueType<V, Editable, Multiple> | null> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n\r\n // Selected item template\r\n private readonly _defaultSelectedItemTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.item>\r\n >('defaultSelectedItemTemplate');\r\n private readonly _userSelectedItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('selectedItem');\r\n /**\r\n * Set a custom template for the selected item of the select control.\r\n * Can also be set using an `<ng-template>` element with `#selectedItem` template reference variable.\r\n */\r\n public readonly templateSelectedItem = input<TemplateRef<typeof this.templateTypes.item> | null>(\r\n null\r\n );\r\n protected readonly selectedItemTemplate = computed(\r\n () =>\r\n this._userSelectedItemTemplate() ??\r\n this.templateSelectedItem() ??\r\n this._defaultSelectedItemTemplate()\r\n );\r\n\r\n // Selected items template\r\n private readonly _defaultSelectedItemsTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.selectedItems>\r\n >('defaultSelectedItemsTemplate');\r\n private readonly _userSelectedItemsTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.selectedItems>>('selectedItems');\r\n /**\r\n * Set a custom template for the selected items of the select control if {@link multiple} is `true`.\r\n * Can also be set using an `<ng-template>` element with `#selectedItems` template reference variable.\r\n */\r\n public readonly templateSelectedItems = input<TemplateRef<\r\n typeof this.templateTypes.selectedItems\r\n > | null>(null);\r\n protected readonly selectedItemsTemplate = computed(\r\n () =>\r\n this._userSelectedItemsTemplate() ??\r\n this.templateSelectedItems() ??\r\n this._defaultSelectedItemsTemplate()\r\n );\r\n\r\n // Group template\r\n private readonly _defaultGroupTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\r\n private readonly _userGroupTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\r\n /**\r\n * Set a custom template for a group in the select control.\r\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\r\n */\r\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly groupTemplate = computed(\r\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\r\n );\r\n\r\n // No items template\r\n private readonly _userNoItemsTemplate = contentChild<TemplateRef<unknown>>('noItems');\r\n /**\r\n * Set a custom template for the no items state of the select control.\r\n * Can also be set using an `<ng-template>` element with `#noItems` template reference variable.\r\n */\r\n public readonly templateNoItems = input<TemplateRef<unknown> | null>(null);\r\n protected readonly noItemsTemplate = computed(\r\n () => this._userNoItemsTemplate() ?? this.templateNoItems()\r\n );\r\n\r\n /**\r\n * Types for the dialog templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: NgnItem<unknown, V> | undefined;\r\n };\r\n selectedItems: {\r\n $implicit: NgnItem<unknown, V>[];\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChild,\r\n effect,\r\n input,\r\n linkedSignal,\r\n type OutputRefSubscription,\r\n type Signal,\r\n signal,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n inject,\r\n} from '@angular/core';\r\nimport { type FilterConfig, mapToItems, type NgnItem } from '@ngneers/controls/api';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { NgnItemView } from '@ngneers/controls/item-view';\r\nimport { NgnListBox } from '@ngneers/controls/list-box';\r\nimport { NgnPopover, type PopoverOptions } from '@ngneers/controls/popover';\r\nimport { deepMerge, maybeCallback, NgnError } from '@ngneers/controls/utils';\r\nimport { selectControlTemplate } from '@ngneers/controls-themes/templates/select';\r\n\r\nimport { SelectTemplates, type ValueType } from './select-templates';\r\n\r\nimport type { SelectFilterOptions } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-select',\r\n templateUrl: './select.html',\r\n imports: [\r\n NgnPt,\r\n NgnInputField,\r\n NgnListBox,\r\n NgnPopover,\r\n NgnInput,\r\n NgTemplateOutlet,\r\n NgnTemplate,\r\n NgnItemView,\r\n NgnIcon,\r\n ],\r\n providers: [provideSelf(NgnSelect)],\r\n host: {\r\n style: 'display: block;',\r\n },\r\n})\r\nexport class NgnSelect<\r\n V,\r\n Editable extends boolean = false,\r\n Multiple extends boolean = false,\r\n> extends SelectTemplates<V, Editable, Multiple> {\r\n protected readonly theme = this.injectThemeTemplate(selectControlTemplate, 'root');\r\n protected readonly i18n = inject(I18n).translations;\r\n private readonly _popover = viewChild.required<NgnPopover>(NgnPopover);\r\n private readonly _customEditableInput = contentChild(NgnInput);\r\n private _customEditableSub?: OutputRefSubscription;\r\n\r\n /**\r\n * Options for the popover.\r\n */\r\n public readonly popoverOptions = input<PopoverOptions>({});\r\n protected readonly appliedPopoverOptions = computed(() =>\r\n deepMerge(\r\n {\r\n sizeConstraints: {\r\n width: 1,\r\n maxWidth: 1,\r\n minHeight: '250px',\r\n maxHeight: '700px',\r\n },\r\n },\r\n this.popoverOptions()\r\n )\r\n );\r\n /**\r\n * The available options to choose from. They can either be\r\n * * A list of {@link NgnItem} objects\r\n * * A list of plain objects. You'll have to provide a {@link fields} input to specify how to map the plain objects to {@link NgnItem} objects.\r\n */\r\n public readonly options = input<readonly NgnItem<unknown, V>[]>([]);\r\n /**\r\n * Accepts a boolean value that determines whether the filter is enabled.\r\n * Alternatively, you can provide `SelectFilterOptions` to customize the filter behavior.\r\n * @default `false`\r\n */\r\n public readonly filter = input<SelectFilterOptions<NgnItem<unknown, V>> | boolean>(false);\r\n /**\r\n * Manually set the filter text.\r\n */\r\n public readonly filterText = input<string | null>(null);\r\n /**\r\n * The icon to display in the filter input.\r\n */\r\n public readonly filterIcon = input<IconType>();\r\n /**\r\n * The icon to display in the dropdown.\r\n */\r\n public readonly dropdownIcon = input<IconType>();\r\n /**\r\n * Whether the select is virtualized.\r\n * @default `false`\r\n */\r\n public readonly virtual = input(false, { transform: booleanAttribute });\r\n /**\r\n * When {@link virtual} is enabled, this property defines the height of each item in the list.\r\n */\r\n public readonly itemHeight = input<number>();\r\n /**\r\n * Enable this to allow the user to type in a value that is not in the list.\r\n * When enabled, the value of the control becomes the label of a selected item or the typed value.\r\n *\r\n * Cannot be used with\r\n * * {@link multiple} selection\r\n * * {@link filter} without also setting {@link editableAutoFilter} to `false`\r\n *\r\n * @default `false`\r\n */\r\n public readonly editable = input<Editable>();\r\n /**\r\n * Whether to automatically filter the options based on the user's input in the {@link editable} input.\r\n * @default `true`\r\n */\r\n public readonly editableAutoFilter = input(true, { transform: booleanAttribute });\r\n /**\r\n * Enable this to allow the user to select multiple values.\r\n * When enabled, the value of the control becomes an array of selected items.\r\n *\r\n * This is only applicable when {@link editable} is `false`.\r\n * @default `false`\r\n */\r\n public readonly multiple = input<Multiple>();\r\n /**\r\n * Whether to scroll to the selected item when the dropdown is opened.\r\n * @default `true`\r\n */\r\n public readonly scrollToSelectedItemOnOpen = input<boolean | ScrollLogicalPosition>(true);\r\n /**\r\n * Tabindex for the select control.\r\n * @default `0`\r\n */\r\n public readonly tabindex = input<number>(0);\r\n /**\r\n * Whether to use a checkbox to indicate selection state.\r\n *\r\n * This option is true per default when {@link multiple} is `true`.\r\n * @default multiple()\r\n */\r\n public readonly checkbox = input<boolean>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n private readonly _listbox = viewChild(NgnListBox);\r\n private _userChangedEditableInput = false;\r\n\r\n protected readonly filterTextInternal = linkedSignal(this.filterText);\r\n protected readonly currentHighlightedValue = signal<V | null>(null);\r\n protected readonly valueStr = computed(() => {\r\n const v = this.value();\r\n return typeof v === 'string' ? v : null;\r\n });\r\n protected readonly valueArray = computed(() => {\r\n const v = this.value();\r\n return Array.isArray(v) ? v : v ? [v] : [];\r\n });\r\n\r\n protected readonly appliedFilter: Signal<FilterConfig<NgnItem> | boolean> = computed(\r\n () => this.filter() || this.editable() || false\r\n );\r\n\r\n private readonly _flatOptions = computed(() => mapToItems(this.options()));\r\n\r\n protected readonly selectedItems = computed(() => {\r\n if (this.editable()) {\r\n return [this._flatOptions().find(option => option.label === this.value())];\r\n } else {\r\n return this.valueArray().map(value =>\r\n this._flatOptions().find(option => option.value === value)\r\n );\r\n }\r\n });\r\n protected readonly selectedItemsValues = computed(() =>\r\n this.selectedItems().map(item => item?.value)\r\n );\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.editable() && this.multiple()) {\r\n throw new NgnError('select', 'Editable and multiple selection cannot be used together');\r\n }\r\n if (this.editable() && this.filter()) {\r\n throw new NgnError('select', 'Editable and filtering cannot be used together');\r\n }\r\n });\r\n effect(() => {\r\n this._customEditableSub?.unsubscribe();\r\n const editable = this.editable();\r\n const customEditableInput = this._customEditableInput();\r\n if (!editable || !customEditableInput) {\r\n return;\r\n }\r\n\r\n this._customEditableSub = customEditableInput.value.subscribe(value => {\r\n this.onEditableChange(value);\r\n });\r\n // Set ARIA attributes for accessibility\r\n customEditableInput.element.nativeElement.setAttribute('aria-autocomplete', 'list');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-expanded',\r\n `${this._popover().open()}`\r\n );\r\n customEditableInput.element.nativeElement.setAttribute('aria-haspopup', 'listbox');\r\n customEditableInput.element.nativeElement.setAttribute(\r\n 'aria-controls',\r\n `${this.inputId()}_listbox`\r\n );\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const valueSig = this._customEditableInput()?.value;\r\n if (valueSig) {\r\n valueSig.set((this.value() as string) || '');\r\n }\r\n });\r\n effect(() => {\r\n if (!this.editable()) {\r\n return;\r\n }\r\n const hasOptions = !!this._listbox()?.displayedItems().length;\r\n if (!this._userChangedEditableInput) {\r\n return;\r\n }\r\n this._userChangedEditableInput = false;\r\n if (hasOptions) {\r\n this.show();\r\n } else {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n this._listbox()?.onKeyDown(event);\r\n // if event is not handled by the listbox, we can handle it here\r\n if (!event.defaultPrevented) {\r\n if (event.key === 'Enter') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n this._popover().toggle();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const currentIndex = this.options().findIndex(option => option.value === this.value());\r\n let newIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\r\n if (newIndex < 0) {\r\n newIndex = 0;\r\n }\r\n if (newIndex >= this.options().length) {\r\n newIndex = this.options().length - 1;\r\n }\r\n const newValue = this.options()[newIndex]?.value;\r\n if (newValue !== undefined) {\r\n this.onSelect(newValue as ValueType<V, false, Multiple>);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected onPopoverClosed() {\r\n this.potentiallyBlurred();\r\n this.currentHighlightedValue.set(null);\r\n const filter = this.filter();\r\n if (filter === true || (typeof filter === 'object' && filter.clearFilterOnClose)) {\r\n if (!this.editable()) {\r\n this.filterTextInternal.set('');\r\n }\r\n }\r\n }\r\n\r\n protected onSelect(value: ValueType<V, false, Multiple> | null) {\r\n if (this.editable()) {\r\n const item = this._flatOptions().find(option => option.value === value);\r\n if (item) {\r\n this.value.set(maybeCallback(item.label) as ValueType<V, Editable, Multiple>);\r\n }\r\n } else {\r\n const v = value as ValueType<V, Editable, Multiple>;\r\n if (this.value() !== v) {\r\n this.value.set(v);\r\n }\r\n }\r\n }\r\n\r\n protected onItemClicked() {\r\n if (!this.multiple()) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Shows the select dropdown.\r\n */\r\n public show() {\r\n if (this.disabled() || this.readonly()) {\r\n return;\r\n }\r\n this._popover().show();\r\n }\r\n\r\n /**\r\n * Hides the select dropdown.\r\n */\r\n public hide() {\r\n this._popover().hide();\r\n }\r\n\r\n protected onEditableChange(value: string | null) {\r\n if (this.editable()) {\r\n this.value.set(maybeCallback(value) as ValueType<V, Editable, Multiple>);\r\n this._userChangedEditableInput = true;\r\n if (this.editableAutoFilter()) {\r\n this.filterTextInternal.set(value);\r\n }\r\n }\r\n }\r\n\r\n protected potentiallyBlurred() {\r\n setTimeout(() => {\r\n if (this.element.nativeElement.contains(document.activeElement) || this._popover().open()) {\r\n return;\r\n }\r\n this.touched.set(true);\r\n });\r\n }\r\n}\r\n","<ngn-input-field\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n input: true,\r\n 'input-editable': editable(),\r\n }\"\r\n (click)=\"show()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n #field\r\n [label]=\"label()\"\r\n [labelledBy]=\"labelledBy()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [readonly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n [tabindex]=\"editable() || disabled() ? -1 : tabindex()\"\r\n (focusout)=\"potentiallyBlurred()\"\r\n>\r\n @if (editable()) {\r\n <ng-content select=\"[ngnInput]\">\r\n <input\r\n ngnInput\r\n autocomplete=\"list\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [id]=\"inputId()\"\r\n [value]=\"valueStr() || ''\"\r\n (valueChange)=\"onEditableChange($event)\"\r\n [readOnly]=\"readonly()\"\r\n [disabled]=\"disabled()\"\r\n />\r\n </ng-content>\r\n } @else {\r\n <div\r\n role=\"combobox\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'combobox'\"\r\n [aria-expanded]=\"popover.open()\"\r\n aria-haspopup=\"listbox\"\r\n [attr.aria-controls]=\"inputId() + '_listbox'\"\r\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\r\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [id]=\"inputId()\"\r\n >\r\n @if (multiple()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemsTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems(),\r\n }\"\r\n />\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"selectedItemTemplate()\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: selectedItems()[0],\r\n }\"\r\n />\r\n }\r\n </div>\r\n }\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"dropdownIcon()\" defaultIcon=\"chevron_down\" />\r\n</ngn-input-field>\r\n<ngn-popover\r\n #popover\r\n [options]=\"appliedPopoverOptions()\"\r\n [anchor]=\"field.element.nativeElement\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (closed)=\"onPopoverClosed()\"\r\n [id]=\"inputId() + '_popover'\"\r\n [hasShrinkableContent]=\"true\"\r\n>\r\n <ng-template #lazy>\r\n <div [ptInt]=\"this\" [ptClass]=\"'popover-content'\">\r\n @if (filter()) {\r\n <ngn-input-field [ptInt]=\"this\" [ptClass]=\"'filter'\">\r\n <input\r\n ngnInput\r\n [value]=\"filterTextInternal()\"\r\n (valueChange)=\"filterTextInternal.set($event)\"\r\n />\r\n <ngn-icon\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'filter-icon'\"\r\n defaultIcon=\"magnifying_glass\"\r\n [icon]=\"filterIcon()\"\r\n />\r\n </ngn-input-field>\r\n }\r\n <ngn-list-box\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n 'list-box': true,\r\n }\"\r\n style=\"height: 100%; min-height: 0\"\r\n [focussable]=\"false\"\r\n [selectable]=\"true\"\r\n [filter]=\"appliedFilter()\"\r\n [filterText]=\"filterTextInternal()\"\r\n [items]=\"options()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [virtual]=\"virtual()\"\r\n [templateItem]=\"itemTemplate()\"\r\n [templateGroup]=\"groupTemplate()\"\r\n [multiple]=\"multiple()\"\r\n [value]=\"multiple() ? selectedItemsValues() : selectedItemsValues()[0]\"\r\n [scrollToSelectedItemOnInit]=\"scrollToSelectedItemOnOpen()\"\r\n (valueChange)=\"onSelect($event)\"\r\n (itemClicked)=\"onItemClicked()\"\r\n [inputId]=\"inputId() + '_listbox'\"\r\n [templateEmpty]=\"noItemsTemplate()\"\r\n [checkbox]=\"checkbox()\"\r\n />\r\n </div>\r\n </ng-template>\r\n</ngn-popover>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">&ZeroWidthSpace;</span>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemsTemplate [ngnTemplate]=\"templateTypes.selectedItems\" let-items>\r\n <ngn-item-view\r\n #itemView\r\n [items]=\"items\"\r\n [idField]=\"'value'\"\r\n [separator]=\"true\"\r\n style=\"margin-right: 8px\"\r\n >\r\n <ng-template #item let-item [ngnTemplate]=\"itemView.templateTypes.item\">\r\n <ng-container\r\n *ngTemplateOutlet=\"selectedItemTemplate(); context: { $implicit: item }\"\r\n ></ng-container>\r\n </ng-template>\r\n </ngn-item-view>\r\n @if (items.length < 1) {\r\n &ZeroWidthSpace;\r\n }\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAqBM,MAAgB,eAIpB,SAAQ,gBAAmE,CAAA;;AAE1D,IAAA,oBAAoB,GACnC,SAAS,CAAC,QAAQ,CAA8C,qBAAqB,CAAC;AACvE,IAAA,iBAAiB,GAChC,YAAY,CAA8C,MAAM,6DAAC;AACnE;;;AAGG;AACa,IAAA,YAAY,GAAG,KAAK,CAAqD,IAAI,wDAAC;IAC3E,YAAY,GAAG,QAAQ,CACxC,MAAM,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACrF;;AAGgB,IAAA,4BAA4B,GAAG,SAAS,CAAC,QAAQ,CAEhE,6BAA6B,CAAC;AACf,IAAA,yBAAyB,GACxC,YAAY,CAA8C,cAAc,qEAAC;AAC3E;;;AAGG;AACa,IAAA,oBAAoB,GAAG,KAAK,CAC1C,IAAI,gEACL;IACkB,oBAAoB,GAAG,QAAQ,CAChD,MACE,IAAI,CAAC,yBAAyB,EAAE;QAChC,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,4BAA4B,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACtC;;AAGgB,IAAA,6BAA6B,GAAG,SAAS,CAAC,QAAQ,CAEjE,8BAA8B,CAAC;AAChB,IAAA,0BAA0B,GACzC,YAAY,CAAuD,eAAe,sEAAC;AACrF;;;AAGG;AACa,IAAA,qBAAqB,GAAG,KAAK,CAEnC,IAAI,iEAAC;IACI,qBAAqB,GAAG,QAAQ,CACjD,MACE,IAAI,CAAC,0BAA0B,EAAE;QACjC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,6BAA6B,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACvC;;AAGgB,IAAA,qBAAqB,GACpC,SAAS,CAAC,QAAQ,CAA8C,sBAAsB,CAAC;AACxE,IAAA,kBAAkB,GACjC,YAAY,CAA8C,OAAO,8DAAC;AACpE;;;AAGG;AACa,IAAA,aAAa,GAAG,KAAK,CAAqD,IAAI,yDAAC;IAC5E,aAAa,GAAG,QAAQ,CACzC,MAAM,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACxF;;AAGgB,IAAA,oBAAoB,GAAG,YAAY,CAAuB,SAAS,gEAAC;AACrF;;;AAGG;AACa,IAAA,eAAe,GAAG,KAAK,CAA8B,IAAI,2DAAC;AACvD,IAAA,eAAe,GAAG,QAAQ,CAC3C,MAAM,IAAI,CAAC,oBAAoB,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,2DAC5D;AAED;;AAEG;IACa,aAAa,GAAG,eAAe,EAO3C;uGA9FgB,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,2BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,4BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,8BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,6BAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,+BAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBADpC;AAQmE,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,qBAAqB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAE3B,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,4BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAahE,6BAA6B,sFAE6B,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAkBxE,8BAA8B,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAEqC,eAAe,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAiBlB,sBAAsB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAE5B,OAAO,2LAWQ,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC7DtF;;AAEG;AAqBG,MAAO,SAIX,SAAQ,eAAsC,CAAA;IAC3B,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,MAAM,CAAC;AAC/D,IAAA,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY;AAClC,IAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAa,UAAU,CAAC;AACrD,IAAA,oBAAoB,GAAG,YAAY,CAAC,QAAQ,gEAAC;AACtD,IAAA,kBAAkB;AAE1B;;AAEG;AACa,IAAA,cAAc,GAAG,KAAK,CAAiB,EAAE,0DAAC;AACvC,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAClD,SAAS,CACP;AACE,QAAA,eAAe,EAAE;AACf,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,SAAS,EAAE,OAAO;AACnB,SAAA;AACF,KAAA,EACD,IAAI,CAAC,cAAc,EAAE,CACtB,iEACF;AACD;;;;AAIG;AACa,IAAA,OAAO,GAAG,KAAK,CAAiC,EAAE,mDAAC;AACnE;;;;AAIG;AACa,IAAA,MAAM,GAAG,KAAK,CAAqD,KAAK,kDAAC;AACzF;;AAEG;AACa,IAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,sDAAC;AACvD;;AAEG;IACa,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;AAC9C;;AAEG;IACa,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;AAChD;;;AAGG;IACa,OAAO,GAAG,KAAK,CAAC,KAAK,oDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACvE;;AAEG;IACa,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC5C;;;;;;;;;AASG;IACa,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;AAC5C;;;AAGG;IACa,kBAAkB,GAAG,KAAK,CAAC,IAAI,+DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACjF;;;;;;AAMG;IACa,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;AAC5C;;;AAGG;AACa,IAAA,0BAA0B,GAAG,KAAK,CAAkC,IAAI,sEAAC;AACzF;;;AAGG;AACa,IAAA,QAAQ,GAAG,KAAK,CAAS,CAAC,oDAAC;AAC3C;;;;;AAKG;IACa,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;IAExB,aAAa,GAAG,aAAa;AAE/B,IAAA,QAAQ,GAAG,SAAS,CAAC,UAAU,oDAAC;IACzC,yBAAyB,GAAG,KAAK;AAEtB,IAAA,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,8DAAC;AAClD,IAAA,uBAAuB,GAAG,MAAM,CAAW,IAAI,mEAAC;AAChD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,IAAI;AACzC,IAAA,CAAC,oDAAC;AACiB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;AAC5C,IAAA,CAAC,sDAAC;AAEiB,IAAA,aAAa,GAA4C,QAAQ,CAClF,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,yDAChD;AAEgB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,wDAAC;AAEvD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5E;aAAO;AACL,YAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,IAChC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAC3D;QACH;AACF,IAAA,CAAC,yDAAC;IACiB,mBAAmB,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC9C;AAED,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACtC,gBAAA,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,yDAAyD,CAAC;YACzF;YACA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACpC,gBAAA,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,gDAAgD,CAAC;YAChF;AACF,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE;AACtC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACvD,YAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,mBAAmB,EAAE;gBACrC;YACF;YAEA,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAG;AACpE,gBAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC9B,YAAA,CAAC,CAAC;;YAEF,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,CAAC;AACnF,YAAA,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CACpD,eAAe,EACf,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA,CAAE,CAC5B;YACD,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,eAAe,EAAE,SAAS,CAAC;AAClF,YAAA,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CACpD,eAAe,EACf,CAAA,EAAG,IAAI,CAAC,OAAO,EAAE,CAAA,QAAA,CAAU,CAC5B;AACH,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACpB;YACF;YACA,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK;YACnD,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,GAAG,CAAE,IAAI,CAAC,KAAK,EAAa,IAAI,EAAE,CAAC;YAC9C;AACF,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACpB;YACF;AACA,YAAA,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAC,MAAM;AAC7D,YAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACnC;YACF;AACA,YAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;YACtC,IAAI,UAAU,EAAE;gBACd,IAAI,CAAC,IAAI,EAAE;YACb;iBAAO;gBACL,IAAI,CAAC,IAAI,EAAE;YACb;AACF,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC;;AAEjC,QAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;AAC3B,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBACzB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;oBACtC;gBACF;AACA,gBAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;gBACxB,KAAK,CAAC,eAAe,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE;YACxB;AACA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;gBACxD,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;oBACtC;gBACF;gBACA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;AACtF,gBAAA,IAAI,QAAQ,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC;AAC9E,gBAAA,IAAI,QAAQ,GAAG,CAAC,EAAE;oBAChB,QAAQ,GAAG,CAAC;gBACd;gBACA,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;oBACrC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC;gBACtC;gBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK;AAChD,gBAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,oBAAA,IAAI,CAAC,QAAQ,CAAC,QAAyC,CAAC;gBAC1D;YACF;QACF;IACF;IAEU,eAAe,GAAA;QACvB,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;AACtC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,kBAAkB,CAAC,EAAE;AAChF,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC;QACF;IACF;AAEU,IAAA,QAAQ,CAAC,KAA2C,EAAA;AAC5D,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;YACvE,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAqC,CAAC;YAC/E;QACF;aAAO;YACL,MAAM,CAAC,GAAG,KAAyC;AACnD,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;AACtB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACnB;QACF;IACF;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,IAAI,CAAC,IAAI,EAAE;QACb;IACF;AAEA;;AAEG;IACI,IAAI,GAAA;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC;QACF;AACA,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;IACxB;AAEA;;AAEG;IACI,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;IACxB;AAEU,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAqC,CAAC;AACxE,YAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AACrC,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC7B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC;QACF;IACF;IAEU,kBAAkB,GAAA;QAC1B,UAAU,CAAC,MAAK;YACd,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzF;YACF;AACA,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,CAAC,CAAC;IACJ;uGAtSW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EALT,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAakB,QAAQ,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EADF,UAAU,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAkG/B,UAAU,uFClKlD,o6KAoKA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1HI,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,4BAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,QAAQ,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,WAAW,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,WAAW,wNACX,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAOE,SAAS,EAAA,UAAA,EAAA,CAAA;kBApBrB,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,YAAY,EAAA,OAAA,EAEb;wBACP,KAAK;wBACL,aAAa;wBACb,UAAU;wBACV,UAAU;wBACV,QAAQ;wBACR,gBAAgB;wBAChB,WAAW;wBACX,WAAW;wBACX,OAAO;AACR,qBAAA,EAAA,SAAA,EACU,CAAC,WAAW,CAAA,SAAA,CAAW,CAAC,EAAA,IAAA,EAC7B;AACJ,wBAAA,KAAK,EAAE,iBAAiB;AACzB,qBAAA,EAAA,QAAA,EAAA,o6KAAA,EAAA;oHAS0D,UAAU,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAChB,QAAQ,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAiGvB,UAAU,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AElKlD;;AAEG;;;;"}
@@ -43,7 +43,7 @@ class NgnSlider extends ValueControlBase {
43
43
  valueTextFn = input(...(ngDevMode ? [undefined, { debugName: "valueTextFn" }] : []));
44
44
  left = computed(() => {
45
45
  const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;
46
- return percent;
46
+ return Math.min(100, Math.max(0, percent));
47
47
  }, ...(ngDevMode ? [{ debugName: "left" }] : []));
48
48
  constructor() {
49
49
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-slider.mjs","sources":["../../src/slider/slider.ts","../../src/slider/slider.html","../../src/slider/ngneers-controls-slider.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n viewChild,\r\n ElementRef,\r\n computed,\r\n} from '@angular/core';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnDrag, type NgnDragInfo } from '@ngneers/controls/directives';\r\nimport { sliderControlTemplate } from '@ngneers/controls-themes/templates/slider';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-slider',\r\n templateUrl: './slider.html',\r\n imports: [NgnPt, NgnDrag],\r\n providers: [provideSelf(NgnSlider)],\r\n host: {\r\n role: 'slider',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '[attr.aria-labelledby]': 'labelledBy()',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.aria-orientation]': 'vertical() ? \"vertical\" : \"horizontal\"',\r\n '[attr.aria-valuetext]': 'valueTextValue()',\r\n '[tabindex]': 'disabled() ? -1 : 0',\r\n '(keydown)': 'onKeyDown($event)',\r\n '(blur)': 'touched.set(true)',\r\n },\r\n})\r\nexport class NgnSlider extends ValueControlBase<'slider', number> {\r\n protected readonly theme = this.injectThemeTemplate(sliderControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n horizontal: () => !this.vertical(),\r\n vertical: () => this.vertical(),\r\n });\r\n\r\n private readonly _track = viewChild.required<ElementRef<HTMLDivElement>>('track');\r\n\r\n /**\r\n * The minimum value of the slider.\r\n */\r\n public readonly min = input<number>(0);\r\n\r\n /**\r\n * Whether the slider is vertical.\r\n */\r\n public readonly vertical = input<boolean>(false);\r\n\r\n /**\r\n * The maximum value of the slider.\r\n */\r\n public readonly max = input<number>(100);\r\n\r\n /**\r\n * The step increment value.\r\n */\r\n public readonly step = input<number>(1);\r\n\r\n /**\r\n * The value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueText = input<string>();\r\n\r\n /**\r\n * A function that generates the value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueTextFn = input<(value: number) => string>();\r\n\r\n protected readonly left = computed(() => {\r\n const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;\r\n return percent;\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected readonly valueTextValue = computed(() => {\r\n const valueText = this.valueText();\r\n if (valueText) {\r\n return valueText;\r\n }\r\n const valueTextFn = this.valueTextFn();\r\n if (valueTextFn) {\r\n return valueTextFn(this.value());\r\n }\r\n return null;\r\n });\r\n\r\n protected onDragged(delta: NgnDragInfo) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const cursorPos = this.vertical() ? delta.absoluteY : delta.absoluteX;\r\n this.dragToPosition(cursorPos);\r\n }\r\n\r\n private dragToPosition(cursorPos: number) {\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const trackStart = this.vertical() ? trackRect.top : trackRect.left;\r\n const trackLength = this.vertical() ? trackRect.height : trackRect.width;\r\n const positionInTrack = cursorPos - trackStart;\r\n const correctedPositionInTrack = this.vertical()\r\n ? trackLength - positionInTrack\r\n : positionInTrack;\r\n const positionPercent = correctedPositionInTrack / trackLength;\r\n const newValueUnstepped = this.min() + positionPercent * (this.max() - this.min());\r\n const steppedValue =\r\n Math.round((newValueUnstepped - this.min()) / this.step()) * this.step() + this.min();\r\n this.value.set(this.clampValue(steppedValue));\r\n }\r\n\r\n private clampValue(value: number): number {\r\n return Math.min(this.max(), Math.max(this.min(), value));\r\n }\r\n\r\n protected onDragEnd() {}\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n this.value.update(v => this.clampValue(v - this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n this.value.update(v => this.clampValue(v + this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'Home':\r\n this.value.set(this.min());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n case 'End':\r\n this.value.set(this.max());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n protected thumbClicked(event: PointerEvent) {\r\n event.stopPropagation();\r\n }\r\n protected trackClicked(event: PointerEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const clickPosition = this.vertical()\r\n ? event.clientY - trackRect.top\r\n : event.clientX - trackRect.left;\r\n this.dragToPosition(\r\n this.vertical() ? trackRect.top + clickPosition : trackRect.left + clickPosition\r\n );\r\n }\r\n}\r\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\r\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\r\n<div #track [ptInt]=\"this\" [ptClass]=\"'track'\" (click)=\"trackClicked($event)\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\" [style.--valuePercent.%]=\"left()\"></div>\r\n <div\r\n #thumb\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'thumb'\"\r\n ngnDrag\r\n (dragged)=\"onDragged($event)\"\r\n (dragEnd)=\"onDragEnd()\"\r\n [style.--valuePercent.%]=\"left()\"\r\n (click)=\"thumbClicked($event)\"\r\n ></div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-slider.mjs","sources":["../../src/slider/slider.ts","../../src/slider/slider.html","../../src/slider/ngneers-controls-slider.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n viewChild,\r\n ElementRef,\r\n computed,\r\n} from '@angular/core';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnDrag, type NgnDragInfo } from '@ngneers/controls/directives';\r\nimport { sliderControlTemplate } from '@ngneers/controls-themes/templates/slider';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-slider',\r\n templateUrl: './slider.html',\r\n imports: [NgnPt, NgnDrag],\r\n providers: [provideSelf(NgnSlider)],\r\n host: {\r\n role: 'slider',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '[attr.aria-labelledby]': 'labelledBy()',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.aria-orientation]': 'vertical() ? \"vertical\" : \"horizontal\"',\r\n '[attr.aria-valuetext]': 'valueTextValue()',\r\n '[tabindex]': 'disabled() ? -1 : 0',\r\n '(keydown)': 'onKeyDown($event)',\r\n '(blur)': 'touched.set(true)',\r\n },\r\n})\r\nexport class NgnSlider extends ValueControlBase<'slider', number> {\r\n protected readonly theme = this.injectThemeTemplate(sliderControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n horizontal: () => !this.vertical(),\r\n vertical: () => this.vertical(),\r\n });\r\n\r\n private readonly _track = viewChild.required<ElementRef<HTMLDivElement>>('track');\r\n\r\n /**\r\n * The minimum value of the slider.\r\n */\r\n public readonly min = input<number>(0);\r\n\r\n /**\r\n * Whether the slider is vertical.\r\n */\r\n public readonly vertical = input<boolean>(false);\r\n\r\n /**\r\n * The maximum value of the slider.\r\n */\r\n public readonly max = input<number>(100);\r\n\r\n /**\r\n * The step increment value.\r\n */\r\n public readonly step = input<number>(1);\r\n\r\n /**\r\n * The value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueText = input<string>();\r\n\r\n /**\r\n * A function that generates the value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueTextFn = input<(value: number) => string>();\r\n\r\n protected readonly left = computed(() => {\r\n const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;\r\n return Math.min(100, Math.max(0, percent));\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected readonly valueTextValue = computed(() => {\r\n const valueText = this.valueText();\r\n if (valueText) {\r\n return valueText;\r\n }\r\n const valueTextFn = this.valueTextFn();\r\n if (valueTextFn) {\r\n return valueTextFn(this.value());\r\n }\r\n return null;\r\n });\r\n\r\n protected onDragged(delta: NgnDragInfo) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const cursorPos = this.vertical() ? delta.absoluteY : delta.absoluteX;\r\n this.dragToPosition(cursorPos);\r\n }\r\n\r\n private dragToPosition(cursorPos: number) {\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const trackStart = this.vertical() ? trackRect.top : trackRect.left;\r\n const trackLength = this.vertical() ? trackRect.height : trackRect.width;\r\n const positionInTrack = cursorPos - trackStart;\r\n const correctedPositionInTrack = this.vertical()\r\n ? trackLength - positionInTrack\r\n : positionInTrack;\r\n const positionPercent = correctedPositionInTrack / trackLength;\r\n const newValueUnstepped = this.min() + positionPercent * (this.max() - this.min());\r\n const steppedValue =\r\n Math.round((newValueUnstepped - this.min()) / this.step()) * this.step() + this.min();\r\n this.value.set(this.clampValue(steppedValue));\r\n }\r\n\r\n private clampValue(value: number): number {\r\n return Math.min(this.max(), Math.max(this.min(), value));\r\n }\r\n\r\n protected onDragEnd() {}\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n this.value.update(v => this.clampValue(v - this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n this.value.update(v => this.clampValue(v + this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'Home':\r\n this.value.set(this.min());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n case 'End':\r\n this.value.set(this.max());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n protected thumbClicked(event: PointerEvent) {\r\n event.stopPropagation();\r\n }\r\n protected trackClicked(event: PointerEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const clickPosition = this.vertical()\r\n ? event.clientY - trackRect.top\r\n : event.clientX - trackRect.left;\r\n this.dragToPosition(\r\n this.vertical() ? trackRect.top + clickPosition : trackRect.left + clickPosition\r\n );\r\n }\r\n}\r\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\r\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\r\n<div #track [ptInt]=\"this\" [ptClass]=\"'track'\" (click)=\"trackClicked($event)\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\" [style.--valuePercent.%]=\"left()\"></div>\r\n <div\r\n #thumb\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'thumb'\"\r\n ngnDrag\r\n (dragged)=\"onDragged($event)\"\r\n (dragEnd)=\"onDragEnd()\"\r\n [style.--valuePercent.%]=\"left()\"\r\n (click)=\"thumbClicked($event)\"\r\n ></div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAYA;;AAEG;AAuBG,MAAO,SAAU,SAAQ,gBAAkC,CAAA;AAC5C,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;AACzE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClC,QAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;AAChC,KAAA,CAAC;AAEe,IAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAA6B,OAAO,CAAC;AAEjF;;AAEG;AACa,IAAA,GAAG,GAAG,KAAK,CAAS,CAAC,+CAAC;AAEtC;;AAEG;AACa,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAEhD;;AAEG;AACa,IAAA,GAAG,GAAG,KAAK,CAAS,GAAG,+CAAC;AAExC;;AAEG;AACa,IAAA,IAAI,GAAG,KAAK,CAAS,CAAC,gDAAC;AAEvC;;;AAGG;IACa,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAE3C;;;AAGG;IACa,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA6B;AAE7C,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG;AAC/E,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5C,IAAA,CAAC,gDAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;IACT;AAEmB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QACtC,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,0DAAC;AAEQ,IAAA,SAAS,CAAC,KAAkB,EAAA;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC;QACF;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AACrE,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;IAChC;AAEQ,IAAA,cAAc,CAAC,SAAiB,EAAA;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE;AACjD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI;AACnE,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK;AACxE,QAAA,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU;AAC9C,QAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,QAAQ;cAC1C,WAAW,GAAG;cACd,eAAe;AACnB,QAAA,MAAM,eAAe,GAAG,wBAAwB,GAAG,WAAW;QAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAClF,QAAA,MAAM,YAAY,GAChB,IAAI,CAAC,KAAK,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AACvF,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/C;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1D;AAEU,IAAA,SAAS,KAAI;AAEb,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC;QACF;AACA,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,WAAW;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,YAAY;AACjB,YAAA,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,KAAK;gBACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;gBACtB;;IAEN;AAEU,IAAA,YAAY,CAAC,KAAmB,EAAA;QACxC,KAAK,CAAC,eAAe,EAAE;IACzB;AACU,IAAA,YAAY,CAAC,KAAmB,EAAA;QACxC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC;QACF;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE;AACjD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;AACjC,cAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;cAC1B,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI;QAClC,IAAI,CAAC,cAAc,CACjB,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,aAAa,GAAG,SAAS,CAAC,IAAI,GAAG,aAAa,CACjF;IACH;uGAxIW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,8BAAA,EAAA,eAAA,EAAA,0BAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,4CAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,SAAA,EAjBT,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBrC,mmBAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDIY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAkBb,SAAS,EAAA,UAAA,EAAA,CAAA;kBAtBrB,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,YAAY,WAEb,CAAC,KAAK,EAAE,OAAO,CAAC,EAAA,SAAA,EACd,CAAC,WAAW,CAAA,SAAA,CAAW,CAAC,EAAA,IAAA,EAC7B;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,SAAS;AACjC,wBAAA,sBAAsB,EAAE,4BAA4B;AACpD,wBAAA,iBAAiB,EAAE,wBAAwB;AAC3C,wBAAA,wBAAwB,EAAE,cAAc;AACxC,wBAAA,mBAAmB,EAAE,SAAS;AAC9B,wBAAA,yBAAyB,EAAE,wCAAwC;AACnE,wBAAA,uBAAuB,EAAE,kBAAkB;AAC3C,wBAAA,YAAY,EAAE,qBAAqB;AACnC,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,QAAQ,EAAE,mBAAmB;AAC9B,qBAAA,EAAA,QAAA,EAAA,mmBAAA,EAAA;8FAUwE,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE7ClF;;AAEG;;;;"}
@@ -54,7 +54,7 @@ class NgnToast extends NgnBase {
54
54
  this.startHideTimer();
55
55
  }
56
56
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnToast, deps: null, target: i0.ɵɵFactoryTarget.Component });
57
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnToast, isStandalone: true, selector: "ngn-toast", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, closeIcon: { classPropertyName: "closeIcon", publicName: "closeIcon", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "autoHide", isSignal: true, isRequired: false, transformFunction: null }, templateContent: { classPropertyName: "templateContent", publicName: "templateContent", isSignal: true, isRequired: false, transformFunction: null }, templateHeader: { classPropertyName: "templateHeader", publicName: "templateHeader", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeToast: "closeToast" }, host: { attributes: { "role": "alert", "aria-live": "assertive" }, listeners: { "mouseenter": "mouseEnter()", "mouseleave": "mouseLeave()" }, properties: { "animate.enter": "theme.class('anim-enter')", "animate.leave": "theme.class('anim-leave')" } }, providers: [provideSelf(NgnToast)], usesInheritance: true, ngImport: i0, template: "@if (templateHeader(); as headerTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n header: header(),\r\n closable: !!closable(),\r\n closeToast: close.bind(this),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultHeader'\">\r\n <span [ptInt]=\"this\" [ptClass]=\"'defaultHeaderText'\">\r\n @if (icon(); as icon) {\r\n <ngn-icon [icon]=\"icon\" />\r\n }\r\n {{ header() }}\r\n </span>\r\n @if (closable()) {\r\n <button ngnButton kind=\"icon\" (click)=\"close()\">\r\n <ngn-icon [defaultIcon]=\"'xmark'\" [icon]=\"closeIcon()\" />\r\n </button>\r\n }\r\n </div>\r\n}\r\n@if (templateContent(); as contentTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"contentTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n content: content(),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultContent'\">\r\n {{ content() }}\r\n </div>\r\n}\r\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
57
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnToast, isStandalone: true, selector: "ngn-toast", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, closeIcon: { classPropertyName: "closeIcon", publicName: "closeIcon", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "autoHide", isSignal: true, isRequired: false, transformFunction: null }, templateContent: { classPropertyName: "templateContent", publicName: "templateContent", isSignal: true, isRequired: false, transformFunction: null }, templateHeader: { classPropertyName: "templateHeader", publicName: "templateHeader", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeToast: "closeToast" }, host: { attributes: { "role": "alert", "aria-live": "assertive" }, listeners: { "mouseenter": "mouseEnter()", "mouseleave": "mouseLeave()" }, properties: { "animate.enter": "theme.class('anim-enter')", "animate.leave": "theme.class('anim-leave')" } }, providers: [provideSelf(NgnToast)], usesInheritance: true, ngImport: i0, template: "@if (templateHeader(); as headerTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n header: header(),\r\n closable: !!closable(),\r\n closeToast: close.bind(this),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultHeader'\">\r\n <span [ptInt]=\"this\" [ptClass]=\"'defaultHeaderText'\">\r\n @if (icon(); as icon) {\r\n <ngn-icon [icon]=\"icon\" />\r\n }\r\n {{ header() }}\r\n </span>\r\n @if (closable()) {\r\n <button ngnButton kind=\"icon\" (click)=\"close()\">\r\n <ngn-icon [defaultIcon]=\"'xmark'\" [icon]=\"closeIcon()\" />\r\n </button>\r\n }\r\n </div>\r\n}\r\n@if (templateContent(); as contentTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"contentTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n content: content(),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultContent'\">\r\n {{ content() }}\r\n </div>\r\n}\r\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"], exportAs: ["ngnButton"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58
58
  }
59
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnToast, decorators: [{
60
60
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-toast.mjs","sources":["../../src/toast/defaults.ts","../../src/toast/toast.ts","../../src/toast/toast.html","../../src/toast/toast-host.ts","../../src/toast/toast-host.html","../../src/toast/toast-manager.ts","../../src/toast/provider.ts","../../src/toast/toast-creator.ts","../../src/toast/ngneers-controls-toast.ts"],"sourcesContent":["import type { NgnToastOptions } from './types';\r\n\r\nexport const DEFAULT_TOAST_OPTIONS: NgnToastOptions = {\r\n closable: false,\r\n autoHide: 5000,\r\n};\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n TemplateRef,\r\n output,\r\n type OnInit,\r\n} from '@angular/core';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { toastControlTemplate } from '@ngneers/controls-themes/templates/toast';\r\n\r\nimport { DEFAULT_TOAST_OPTIONS } from './defaults';\r\n\r\nimport type { ContentTemplateType, HeaderTemplateType } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-toast',\r\n templateUrl: './toast.html',\r\n imports: [NgTemplateOutlet, NgnPt, NgnButton, NgnIcon],\r\n providers: [provideSelf(NgnToast)],\r\n host: {\r\n '(mouseenter)': 'mouseEnter()',\r\n '(mouseleave)': 'mouseLeave()',\r\n '[animate.enter]': \"theme.class('anim-enter')\",\r\n '[animate.leave]': \"theme.class('anim-leave')\",\r\n role: 'alert',\r\n 'aria-live': 'assertive',\r\n },\r\n})\r\nexport class NgnToast extends NgnBase<'toast'> implements OnInit {\r\n protected readonly theme = this.injectThemeTemplate(toastControlTemplate, 'root');\r\n\r\n public readonly header = input<string>();\r\n public readonly content = input<string>();\r\n\r\n public readonly icon = input<IconType>();\r\n public readonly closeIcon = input<IconType>();\r\n public readonly closable = input<boolean | undefined>(DEFAULT_TOAST_OPTIONS.closable);\r\n public readonly autoHide = input<number | false | undefined>(DEFAULT_TOAST_OPTIONS.autoHide);\r\n\r\n public readonly templateContent = input<TemplateRef<ContentTemplateType> | null>();\r\n public readonly templateHeader = input<TemplateRef<HeaderTemplateType> | null>();\r\n\r\n public readonly closeToast = output<void>();\r\n private _closeTimeout?: number;\r\n\r\n public ngOnInit(): void {\r\n this.startHideTimer();\r\n }\r\n\r\n private startHideTimer() {\r\n const autoHide = this.autoHide();\r\n if (autoHide && autoHide > 0) {\r\n this._closeTimeout = setTimeout(() => this.close(), autoHide) as unknown as number;\r\n }\r\n }\r\n\r\n protected close() {\r\n this.closeToast.emit();\r\n if (this._closeTimeout) {\r\n clearTimeout(this._closeTimeout);\r\n }\r\n }\r\n\r\n protected mouseEnter(): void {\r\n if (this._closeTimeout) {\r\n clearTimeout(this._closeTimeout);\r\n this._closeTimeout = undefined;\r\n }\r\n }\r\n\r\n protected mouseLeave(): void {\r\n this.startHideTimer();\r\n }\r\n}\r\n","@if (templateHeader(); as headerTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n header: header(),\r\n closable: !!closable(),\r\n closeToast: close.bind(this),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultHeader'\">\r\n <span [ptInt]=\"this\" [ptClass]=\"'defaultHeaderText'\">\r\n @if (icon(); as icon) {\r\n <ngn-icon [icon]=\"icon\" />\r\n }\r\n {{ header() }}\r\n </span>\r\n @if (closable()) {\r\n <button ngnButton kind=\"icon\" (click)=\"close()\">\r\n <ngn-icon [defaultIcon]=\"'xmark'\" [icon]=\"closeIcon()\" />\r\n </button>\r\n }\r\n </div>\r\n}\r\n@if (templateContent(); as contentTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"contentTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n content: content(),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultContent'\">\r\n {{ content() }}\r\n </div>\r\n}\r\n","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\nimport { toastControlTemplate } from '@ngneers/controls-themes/templates/toast';\r\n\r\nimport { NgnToast } from './toast';\r\nimport { NgnToastManager } from './toast-manager';\r\n\r\n/**\r\n * The host component that renders toasts.\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-toast-host',\r\n templateUrl: 'toast-host.html',\r\n imports: [NgnToast],\r\n host: {\r\n '[attr.popover]': '\"manual\"',\r\n },\r\n})\r\nexport class NgnToastHost extends NgnBase<'toast'> {\r\n protected readonly theme = this.injectThemeTemplate(toastControlTemplate, 'host');\r\n private readonly _toastManager = inject(NgnToastManager);\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n protected readonly toasts = this._toastManager.toasts;\r\n\r\n constructor() {\r\n super();\r\n afterNextRender(() => {\r\n this._el.nativeElement.showPopover();\r\n });\r\n }\r\n\r\n protected removeToast(id: number): void {\r\n this._toastManager.removeToast(id);\r\n }\r\n}\r\n","@for (toast of toasts(); track toast.id) {\r\n <ngn-toast\r\n [header]=\"toast.header\"\r\n [content]=\"toast.content\"\r\n [color]=\"toast.color\"\r\n [icon]=\"toast.icon\"\r\n [autoHide]=\"toast.autoHide\"\r\n [templateContent]=\"toast.contentTemplate\"\r\n [templateHeader]=\"toast.headerTemplate\"\r\n [closable]=\"!!toast.closable\"\r\n (closeToast)=\"removeToast(toast.id)\"\r\n />\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n inject,\r\n Injectable,\r\n type OnDestroy,\r\n signal,\r\n} from '@angular/core';\r\nimport { Platform } from '@ngneers/controls/api/ng';\r\nimport { NgnError } from '@ngneers/controls/utils';\r\nimport { injectOrThrow } from '@ngneers/controls/utils-ng';\r\n\r\nimport { DEFAULT_TOAST_OPTIONS } from './defaults';\r\nimport { NGN_TOAST_USER_DEFAULTS } from './provider';\r\nimport { NgnToastHost } from './toast-host';\r\n\r\nimport type { NgnToastOptions } from './types';\r\n\r\ntype ToastFull = NgnToastOptions & { id: number };\r\n\r\n@Injectable()\r\nexport class NgnToastManager implements OnDestroy {\r\n private readonly _toasts = signal<ToastFull[]>([]);\r\n private readonly _appRef = inject(ApplicationRef);\r\n private readonly _userDefaults = injectOrThrow(\r\n NGN_TOAST_USER_DEFAULTS,\r\n 'NgnToastManager',\r\n 'Failed to inject NGN_TOAST_USER_DEFAULTS, make sure to use withToasts() to provide ngn toasts!'\r\n );\r\n private _nextId = 0;\r\n\r\n public readonly toasts = this._toasts.asReadonly();\r\n private _component?: ComponentRef<NgnToastHost>;\r\n\r\n constructor() {\r\n if (!inject(Platform).isBrowser) {\r\n return;\r\n }\r\n // Defer creation to avoid issues with Angular's injection tree during app initialization\r\n queueMicrotask(() => {\r\n // Create and attach the toast host component to the application's root\r\n this._component = createComponent(NgnToastHost, {\r\n environmentInjector: this._appRef.injector,\r\n });\r\n this._appRef.attachView(this._component.hostView);\r\n const hostEl = this._component.location.nativeElement as HTMLElement;\r\n const appRootEl = this._appRef.components[0]?.location.nativeElement as\r\n | undefined\r\n | HTMLElement;\r\n if (!appRootEl) {\r\n throw new NgnError(\r\n 'NgnToastManager',\r\n 'Failed to find application root element to attach toast host!'\r\n );\r\n }\r\n appRootEl.appendChild(hostEl);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (this._component) {\r\n this._appRef.detachView(this._component.hostView);\r\n this._component.destroy();\r\n this._component = undefined;\r\n }\r\n }\r\n\r\n public removeToast(id: number): void {\r\n this._toasts.update(toasts => toasts.filter(t => t.id !== id));\r\n }\r\n\r\n public addToast(options: NgnToastOptions): number {\r\n const id = this._nextId++;\r\n const toast: ToastFull = { ...DEFAULT_TOAST_OPTIONS, ...this._userDefaults, ...options, id };\r\n this._toasts.update(toasts => [...toasts, toast]);\r\n return id;\r\n }\r\n}\r\n","import { InjectionToken, type Provider } from '@angular/core';\r\n\r\nimport { NgnToastManager } from './toast-manager';\r\n\r\nimport type { NgnToastOptionsMeta } from './types';\r\n\r\nexport type NgnToastFeature = {\r\n providers: Provider[];\r\n};\r\n\r\nexport const NGN_TOAST_USER_DEFAULTS = new InjectionToken<NgnToastOptionsMeta>(\r\n 'NGN_TOAST_USER_DEFAULTS'\r\n);\r\n\r\nexport function withToasts(defaultOptions?: NgnToastOptionsMeta): NgnToastFeature {\r\n return {\r\n providers: [\r\n NgnToastManager,\r\n {\r\n provide: NGN_TOAST_USER_DEFAULTS,\r\n useValue: defaultOptions || {},\r\n },\r\n ],\r\n };\r\n}\r\n","import { Injector, runInInjectionContext } from '@angular/core';\r\nimport { injectOrThrow } from '@ngneers/controls/utils-ng';\r\n\r\nimport { NgnToastManager } from './toast-manager';\r\n\r\nimport type { NgnToastOptions, NgnToastRef } from './types';\r\n\r\nclass ToastCreator {\r\n private readonly _manager: NgnToastManager;\r\n\r\n constructor() {\r\n this._manager = injectOrThrow(\r\n NgnToastManager,\r\n 'injectToastCreator',\r\n 'NgnToastManager not found. Make sure to use withToasts() to provide ngn toasts!'\r\n );\r\n }\r\n\r\n public show(options: NgnToastOptions): NgnToastRef {\r\n const id = this._manager.addToast(options);\r\n return {\r\n hide: () => this._manager.removeToast(id),\r\n };\r\n }\r\n}\r\n\r\nexport function injectToastCreator(injector?: Injector): ToastCreator {\r\n if (injector) {\r\n return runInInjectionContext(injector, () => injectToastCreator());\r\n }\r\n return new ToastCreator();\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;AAEO,MAAM,qBAAqB,GAAoB;AACpD,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,QAAQ,EAAE,IAAI;CACf;;ACcD;;AAEG;AAgBG,MAAO,QAAS,SAAQ,OAAgB,CAAA;IACzB,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,MAAM,CAAC;IAEjE,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACxB,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IAEzB,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;IACxB,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAsB,qBAAqB,CAAC,QAAQ,oDAAC;AACrE,IAAA,QAAQ,GAAG,KAAK,CAA6B,qBAAqB,CAAC,QAAQ,oDAAC;IAE5E,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA2C;IAClE,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA0C;IAEhE,UAAU,GAAG,MAAM,EAAQ;AACnC,IAAA,aAAa;IAEd,QAAQ,GAAA;QACb,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;AACpB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAsB;QACpF;IACF;IAEU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QAClC;IACF;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAChC;IACF;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,cAAc,EAAE;IACvB;uGA5CW,QAAQ,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,o4CAVR,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BpC,gjCAoCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,SAAS,gGAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAW1C,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAfpB,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,WAAW,EAAA,OAAA,EAEZ,CAAC,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAA,SAAA,EAC3C,CAAC,WAAW,CAAA,QAAA,CAAU,CAAC,EAAA,IAAA,EAC5B;AACJ,wBAAA,cAAc,EAAE,cAAc;AAC9B,wBAAA,cAAc,EAAE,cAAc;AAC9B,wBAAA,iBAAiB,EAAE,2BAA2B;AAC9C,wBAAA,iBAAiB,EAAE,2BAA2B;AAC9C,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,WAAW,EAAE,WAAW;AACzB,qBAAA,EAAA,QAAA,EAAA,gjCAAA,EAAA;;;AEtBH;;AAEG;AAUG,MAAO,YAAa,SAAQ,OAAgB,CAAA;IAC7B,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,MAAM,CAAC;AAChE,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,GAAG,GAAG,MAAM,CAA0B,UAAU,CAAC;AAE/C,IAAA,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;AAErD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE;AACtC,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,WAAW,CAAC,EAAU,EAAA;AAC9B,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;IACpC;uGAhBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,cAAA,EAAA,YAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBzB,2aAaA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDOY,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKP,YAAY,EAAA,UAAA,EAAA,CAAA;kBATxB,SAAS;sCACS,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,gBAAgB,WAEjB,CAAC,QAAQ,CAAC,EAAA,IAAA,EACb;AACJ,wBAAA,gBAAgB,EAAE,UAAU;AAC7B,qBAAA,EAAA,QAAA,EAAA,2aAAA,EAAA;;;MEDU,eAAe,CAAA;AACT,IAAA,OAAO,GAAG,MAAM,CAAc,EAAE,mDAAC;AACjC,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;IAChC,aAAa,GAAG,aAAa,CAC5C,uBAAuB,EACvB,iBAAiB,EACjB,gGAAgG,CACjG;IACO,OAAO,GAAG,CAAC;AAEH,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAC1C,IAAA,UAAU;AAElB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE;YAC/B;QACF;;QAEA,cAAc,CAAC,MAAK;;AAElB,YAAA,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,YAAY,EAAE;AAC9C,gBAAA,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;AAC3C,aAAA,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAA4B;AACpE,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,aAExC;YACf,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,MAAM,IAAI,QAAQ,CAChB,iBAAiB,EACjB,+DAA+D,CAChE;YACH;AACA,YAAA,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;IAEO,WAAW,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjD,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC7B;IACF;AAEO,IAAA,WAAW,CAAC,EAAU,EAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE;AAEO,IAAA,QAAQ,CAAC,OAAwB,EAAA;AACtC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACzB,QAAA,MAAM,KAAK,GAAc,EAAE,GAAG,qBAAqB,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE;AAC5F,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;AACjD,QAAA,OAAO,EAAE;IACX;uGAvDW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MCXY,uBAAuB,GAAG,IAAI,cAAc,CACvD,yBAAyB;AAGrB,SAAU,UAAU,CAAC,cAAoC,EAAA;IAC7D,OAAO;AACL,QAAA,SAAS,EAAE;YACT,eAAe;AACf,YAAA;AACE,gBAAA,OAAO,EAAE,uBAAuB;gBAChC,QAAQ,EAAE,cAAc,IAAI,EAAE;AAC/B,aAAA;AACF,SAAA;KACF;AACH;;ACjBA,MAAM,YAAY,CAAA;AACC,IAAA,QAAQ;AAEzB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,QAAQ,GAAG,aAAa,CAC3B,eAAe,EACf,oBAAoB,EACpB,iFAAiF,CAClF;IACH;AAEO,IAAA,IAAI,CAAC,OAAwB,EAAA;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;SAC1C;IACH;AACD;AAEK,SAAU,kBAAkB,CAAC,QAAmB,EAAA;IACpD,IAAI,QAAQ,EAAE;QACZ,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAM,kBAAkB,EAAE,CAAC;IACpE;IACA,OAAO,IAAI,YAAY,EAAE;AAC3B;;AC/BA;;AAEG;;;;"}
1
+ {"version":3,"file":"ngneers-controls-toast.mjs","sources":["../../src/toast/defaults.ts","../../src/toast/toast.ts","../../src/toast/toast.html","../../src/toast/toast-host.ts","../../src/toast/toast-host.html","../../src/toast/toast-manager.ts","../../src/toast/provider.ts","../../src/toast/toast-creator.ts","../../src/toast/ngneers-controls-toast.ts"],"sourcesContent":["import type { NgnToastOptions } from './types';\r\n\r\nexport const DEFAULT_TOAST_OPTIONS: NgnToastOptions = {\r\n closable: false,\r\n autoHide: 5000,\r\n};\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n TemplateRef,\r\n output,\r\n type OnInit,\r\n} from '@angular/core';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { toastControlTemplate } from '@ngneers/controls-themes/templates/toast';\r\n\r\nimport { DEFAULT_TOAST_OPTIONS } from './defaults';\r\n\r\nimport type { ContentTemplateType, HeaderTemplateType } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-toast',\r\n templateUrl: './toast.html',\r\n imports: [NgTemplateOutlet, NgnPt, NgnButton, NgnIcon],\r\n providers: [provideSelf(NgnToast)],\r\n host: {\r\n '(mouseenter)': 'mouseEnter()',\r\n '(mouseleave)': 'mouseLeave()',\r\n '[animate.enter]': \"theme.class('anim-enter')\",\r\n '[animate.leave]': \"theme.class('anim-leave')\",\r\n role: 'alert',\r\n 'aria-live': 'assertive',\r\n },\r\n})\r\nexport class NgnToast extends NgnBase<'toast'> implements OnInit {\r\n protected readonly theme = this.injectThemeTemplate(toastControlTemplate, 'root');\r\n\r\n public readonly header = input<string>();\r\n public readonly content = input<string>();\r\n\r\n public readonly icon = input<IconType>();\r\n public readonly closeIcon = input<IconType>();\r\n public readonly closable = input<boolean | undefined>(DEFAULT_TOAST_OPTIONS.closable);\r\n public readonly autoHide = input<number | false | undefined>(DEFAULT_TOAST_OPTIONS.autoHide);\r\n\r\n public readonly templateContent = input<TemplateRef<ContentTemplateType> | null>();\r\n public readonly templateHeader = input<TemplateRef<HeaderTemplateType> | null>();\r\n\r\n public readonly closeToast = output<void>();\r\n private _closeTimeout?: number;\r\n\r\n public ngOnInit(): void {\r\n this.startHideTimer();\r\n }\r\n\r\n private startHideTimer() {\r\n const autoHide = this.autoHide();\r\n if (autoHide && autoHide > 0) {\r\n this._closeTimeout = setTimeout(() => this.close(), autoHide) as unknown as number;\r\n }\r\n }\r\n\r\n protected close() {\r\n this.closeToast.emit();\r\n if (this._closeTimeout) {\r\n clearTimeout(this._closeTimeout);\r\n }\r\n }\r\n\r\n protected mouseEnter(): void {\r\n if (this._closeTimeout) {\r\n clearTimeout(this._closeTimeout);\r\n this._closeTimeout = undefined;\r\n }\r\n }\r\n\r\n protected mouseLeave(): void {\r\n this.startHideTimer();\r\n }\r\n}\r\n","@if (templateHeader(); as headerTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n header: header(),\r\n closable: !!closable(),\r\n closeToast: close.bind(this),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultHeader'\">\r\n <span [ptInt]=\"this\" [ptClass]=\"'defaultHeaderText'\">\r\n @if (icon(); as icon) {\r\n <ngn-icon [icon]=\"icon\" />\r\n }\r\n {{ header() }}\r\n </span>\r\n @if (closable()) {\r\n <button ngnButton kind=\"icon\" (click)=\"close()\">\r\n <ngn-icon [defaultIcon]=\"'xmark'\" [icon]=\"closeIcon()\" />\r\n </button>\r\n }\r\n </div>\r\n}\r\n@if (templateContent(); as contentTemplate) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"contentTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n content: content(),\r\n }\"\r\n ></ng-container>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'defaultContent'\">\r\n {{ content() }}\r\n </div>\r\n}\r\n","import {\r\n afterNextRender,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\nimport { toastControlTemplate } from '@ngneers/controls-themes/templates/toast';\r\n\r\nimport { NgnToast } from './toast';\r\nimport { NgnToastManager } from './toast-manager';\r\n\r\n/**\r\n * The host component that renders toasts.\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-toast-host',\r\n templateUrl: 'toast-host.html',\r\n imports: [NgnToast],\r\n host: {\r\n '[attr.popover]': '\"manual\"',\r\n },\r\n})\r\nexport class NgnToastHost extends NgnBase<'toast'> {\r\n protected readonly theme = this.injectThemeTemplate(toastControlTemplate, 'host');\r\n private readonly _toastManager = inject(NgnToastManager);\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n protected readonly toasts = this._toastManager.toasts;\r\n\r\n constructor() {\r\n super();\r\n afterNextRender(() => {\r\n this._el.nativeElement.showPopover();\r\n });\r\n }\r\n\r\n protected removeToast(id: number): void {\r\n this._toastManager.removeToast(id);\r\n }\r\n}\r\n","@for (toast of toasts(); track toast.id) {\r\n <ngn-toast\r\n [header]=\"toast.header\"\r\n [content]=\"toast.content\"\r\n [color]=\"toast.color\"\r\n [icon]=\"toast.icon\"\r\n [autoHide]=\"toast.autoHide\"\r\n [templateContent]=\"toast.contentTemplate\"\r\n [templateHeader]=\"toast.headerTemplate\"\r\n [closable]=\"!!toast.closable\"\r\n (closeToast)=\"removeToast(toast.id)\"\r\n />\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n inject,\r\n Injectable,\r\n type OnDestroy,\r\n signal,\r\n} from '@angular/core';\r\nimport { Platform } from '@ngneers/controls/api/ng';\r\nimport { NgnError } from '@ngneers/controls/utils';\r\nimport { injectOrThrow } from '@ngneers/controls/utils-ng';\r\n\r\nimport { DEFAULT_TOAST_OPTIONS } from './defaults';\r\nimport { NGN_TOAST_USER_DEFAULTS } from './provider';\r\nimport { NgnToastHost } from './toast-host';\r\n\r\nimport type { NgnToastOptions } from './types';\r\n\r\ntype ToastFull = NgnToastOptions & { id: number };\r\n\r\n@Injectable()\r\nexport class NgnToastManager implements OnDestroy {\r\n private readonly _toasts = signal<ToastFull[]>([]);\r\n private readonly _appRef = inject(ApplicationRef);\r\n private readonly _userDefaults = injectOrThrow(\r\n NGN_TOAST_USER_DEFAULTS,\r\n 'NgnToastManager',\r\n 'Failed to inject NGN_TOAST_USER_DEFAULTS, make sure to use withToasts() to provide ngn toasts!'\r\n );\r\n private _nextId = 0;\r\n\r\n public readonly toasts = this._toasts.asReadonly();\r\n private _component?: ComponentRef<NgnToastHost>;\r\n\r\n constructor() {\r\n if (!inject(Platform).isBrowser) {\r\n return;\r\n }\r\n // Defer creation to avoid issues with Angular's injection tree during app initialization\r\n queueMicrotask(() => {\r\n // Create and attach the toast host component to the application's root\r\n this._component = createComponent(NgnToastHost, {\r\n environmentInjector: this._appRef.injector,\r\n });\r\n this._appRef.attachView(this._component.hostView);\r\n const hostEl = this._component.location.nativeElement as HTMLElement;\r\n const appRootEl = this._appRef.components[0]?.location.nativeElement as\r\n | undefined\r\n | HTMLElement;\r\n if (!appRootEl) {\r\n throw new NgnError(\r\n 'NgnToastManager',\r\n 'Failed to find application root element to attach toast host!'\r\n );\r\n }\r\n appRootEl.appendChild(hostEl);\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (this._component) {\r\n this._appRef.detachView(this._component.hostView);\r\n this._component.destroy();\r\n this._component = undefined;\r\n }\r\n }\r\n\r\n public removeToast(id: number): void {\r\n this._toasts.update(toasts => toasts.filter(t => t.id !== id));\r\n }\r\n\r\n public addToast(options: NgnToastOptions): number {\r\n const id = this._nextId++;\r\n const toast: ToastFull = { ...DEFAULT_TOAST_OPTIONS, ...this._userDefaults, ...options, id };\r\n this._toasts.update(toasts => [...toasts, toast]);\r\n return id;\r\n }\r\n}\r\n","import { InjectionToken, type Provider } from '@angular/core';\r\n\r\nimport { NgnToastManager } from './toast-manager';\r\n\r\nimport type { NgnToastOptionsMeta } from './types';\r\n\r\nexport type NgnToastFeature = {\r\n providers: Provider[];\r\n};\r\n\r\nexport const NGN_TOAST_USER_DEFAULTS = new InjectionToken<NgnToastOptionsMeta>(\r\n 'NGN_TOAST_USER_DEFAULTS'\r\n);\r\n\r\nexport function withToasts(defaultOptions?: NgnToastOptionsMeta): NgnToastFeature {\r\n return {\r\n providers: [\r\n NgnToastManager,\r\n {\r\n provide: NGN_TOAST_USER_DEFAULTS,\r\n useValue: defaultOptions || {},\r\n },\r\n ],\r\n };\r\n}\r\n","import { Injector, runInInjectionContext } from '@angular/core';\r\nimport { injectOrThrow } from '@ngneers/controls/utils-ng';\r\n\r\nimport { NgnToastManager } from './toast-manager';\r\n\r\nimport type { NgnToastOptions, NgnToastRef } from './types';\r\n\r\nclass ToastCreator {\r\n private readonly _manager: NgnToastManager;\r\n\r\n constructor() {\r\n this._manager = injectOrThrow(\r\n NgnToastManager,\r\n 'injectToastCreator',\r\n 'NgnToastManager not found. Make sure to use withToasts() to provide ngn toasts!'\r\n );\r\n }\r\n\r\n public show(options: NgnToastOptions): NgnToastRef {\r\n const id = this._manager.addToast(options);\r\n return {\r\n hide: () => this._manager.removeToast(id),\r\n };\r\n }\r\n}\r\n\r\nexport function injectToastCreator(injector?: Injector): ToastCreator {\r\n if (injector) {\r\n return runInInjectionContext(injector, () => injectToastCreator());\r\n }\r\n return new ToastCreator();\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -49,12 +49,6 @@ class NgnTooltip extends NgnBase {
49
49
  * @alias ngnTooltip
50
50
  */
51
51
  content = input(null, { ...(ngDevMode ? { debugName: "content" } : {}), alias: 'ngnTooltip' });
52
- /**
53
- * The CSS class to apply to the tooltip.
54
- * This can be used to apply custom styles to the tooltip.
55
- * @alias ngnTooltipStyleClass
56
- */
57
- styleClass = input(null, { ...(ngDevMode ? { debugName: "styleClass" } : {}), alias: 'ngnTooltipStyleClass' });
58
52
  /**
59
53
  * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `""` is equivalent to `true`.
60
54
  * @alias ngnTooltipShowOnlyIfTruncated
@@ -166,7 +160,6 @@ class NgnTooltip extends NgnBase {
166
160
  if (tooltip)
167
161
  this.updateContent(tooltip);
168
162
  });
169
- effect(() => this._tooltip()?.setInput('styleClass', this.styleClass()));
170
163
  effect(() => this._tooltip()?.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated()));
171
164
  effect(() => this._tooltip()?.setInput('size', this.size()));
172
165
  effect(() => this._tooltip()?.setInput('options', this.effectiveOptions()));
@@ -216,7 +209,6 @@ class NgnTooltip extends NgnBase {
216
209
  tooltip = this._viewContainerRef.createComponent(TooltipComponent);
217
210
  tooltip.setInput('anchor', this.element.nativeElement);
218
211
  this.updateContent(tooltip);
219
- tooltip.setInput('styleClass', this.styleClass());
220
212
  tooltip.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated());
221
213
  tooltip.setInput('size', this.size());
222
214
  tooltip.setInput('options', this.effectiveOptions());
@@ -236,7 +228,7 @@ class NgnTooltip extends NgnBase {
236
228
  }
237
229
  }
238
230
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
239
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgnTooltip, isStandalone: true, selector: "[ngnTooltip]", inputs: { content: { classPropertyName: "content", publicName: "ngnTooltip", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "ngnTooltipStyleClass", isSignal: true, isRequired: false, transformFunction: null }, showOnlyIfTruncated: { classPropertyName: "showOnlyIfTruncated", publicName: "ngnTooltipShowOnlyIfTruncated", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "ngnTooltipSize", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "ngnTooltipOptions", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ngnTooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "ngnTooltipOffset", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "ngnTooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "ngnTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, showArrow: { classPropertyName: "showArrow", publicName: "ngnTooltipShowArrow", isSignal: true, isRequired: false, transformFunction: null }, showOnHover: { classPropertyName: "showOnHover", publicName: "ngnTooltipShowOnHover", isSignal: true, isRequired: false, transformFunction: null }, showOnFocus: { classPropertyName: "showOnFocus", publicName: "ngnTooltipShowOnFocus", isSignal: true, isRequired: false, transformFunction: null }, hideOnTooltipHover: { classPropertyName: "hideOnTooltipHover", publicName: "ngnTooltipHideOnTooltipHover", isSignal: true, isRequired: false, transformFunction: null }, hideOnClick: { classPropertyName: "hideOnClick", publicName: "ngnTooltipHideOnClick", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnTooltip)], exportAs: ["ngnTooltip"], usesInheritance: true, ngImport: i0 });
231
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.0", type: NgnTooltip, isStandalone: true, selector: "[ngnTooltip]", inputs: { content: { classPropertyName: "content", publicName: "ngnTooltip", isSignal: true, isRequired: false, transformFunction: null }, showOnlyIfTruncated: { classPropertyName: "showOnlyIfTruncated", publicName: "ngnTooltipShowOnlyIfTruncated", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "ngnTooltipSize", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "ngnTooltipOptions", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ngnTooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "ngnTooltipOffset", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "ngnTooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "ngnTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, showArrow: { classPropertyName: "showArrow", publicName: "ngnTooltipShowArrow", isSignal: true, isRequired: false, transformFunction: null }, showOnHover: { classPropertyName: "showOnHover", publicName: "ngnTooltipShowOnHover", isSignal: true, isRequired: false, transformFunction: null }, showOnFocus: { classPropertyName: "showOnFocus", publicName: "ngnTooltipShowOnFocus", isSignal: true, isRequired: false, transformFunction: null }, hideOnTooltipHover: { classPropertyName: "hideOnTooltipHover", publicName: "ngnTooltipHideOnTooltipHover", isSignal: true, isRequired: false, transformFunction: null }, hideOnClick: { classPropertyName: "hideOnClick", publicName: "ngnTooltipHideOnClick", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnTooltip)], exportAs: ["ngnTooltip"], usesInheritance: true, ngImport: i0 });
240
232
  }
241
233
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTooltip, decorators: [{
242
234
  type: Directive,
@@ -245,7 +237,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
245
237
  exportAs: 'ngnTooltip',
246
238
  providers: [provideSelf(NgnTooltip)],
247
239
  }]
248
- }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltip", required: false }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipStyleClass", required: false }] }], showOnlyIfTruncated: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnlyIfTruncated", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipSize", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOptions", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOffset", required: false }] }], showDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowDelay", required: false }] }], hideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideDelay", required: false }] }], showArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowArrow", required: false }] }], showOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnHover", required: false }] }], showOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnFocus", required: false }] }], hideOnTooltipHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnTooltipHover", required: false }] }], hideOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnClick", required: false }] }] } });
240
+ }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltip", required: false }] }], showOnlyIfTruncated: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnlyIfTruncated", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipSize", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOptions", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOffset", required: false }] }], showDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowDelay", required: false }] }], hideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideDelay", required: false }] }], showArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowArrow", required: false }] }], showOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnHover", required: false }] }], showOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnFocus", required: false }] }], hideOnTooltipHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnTooltipHover", required: false }] }], hideOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnClick", required: false }] }] } });
249
241
  class TooltipComponent extends NgnBase {
250
242
  _showHideTimeout;
251
243
  theme = this.injectThemeTemplate(tooltipControlTemplate, {