@ngneers/controls 0.0.1-next.1 → 0.0.1-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngneers-controls-api-ng.mjs +11 -18
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-badge.mjs +160 -0
- package/fesm2022/ngneers-controls-badge.mjs.map +1 -0
- package/fesm2022/ngneers-controls-base.mjs +85 -8
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs → ngneers-controls-calendar-time-paM6WVpV.mjs} +2 -2
- package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs.map → ngneers-controls-calendar-time-paM6WVpV.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +13 -6
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +3 -3
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-color-picker.mjs +336 -0
- package/fesm2022/ngneers-controls-color-picker.mjs.map +1 -0
- package/fesm2022/ngneers-controls-default-icons.mjs +5 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +64 -7
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -5
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-errors.mjs +203 -148
- package/fesm2022/ngneers-controls-errors.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +2 -2
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-hint.mjs +18 -1
- package/fesm2022/ngneers-controls-hint.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs +14 -0
- package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs +16 -0
- package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +23 -6
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +18 -2
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +49 -9
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +2 -2
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-mask-input.mjs +4 -1
- package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-number-input.mjs +4 -4
- package/fesm2022/ngneers-controls-number-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-otp.mjs +16 -4
- package/fesm2022/ngneers-controls-otp.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +36 -9
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-radio.mjs +4 -4
- package/fesm2022/ngneers-controls-radio.mjs.map +1 -1
- package/fesm2022/ngneers-controls-rating.mjs +180 -0
- package/fesm2022/ngneers-controls-rating.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +33 -7
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroller.mjs +4 -2
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +2 -1
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +24 -4
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +3 -3
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-stepper.mjs +142 -0
- package/fesm2022/ngneers-controls-stepper.mjs.map +1 -0
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
- package/fesm2022/ngneers-controls-table.mjs +282 -15
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +2 -2
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +3 -3
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +16 -28
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tree.mjs +2 -2
- package/fesm2022/ngneers-controls-tree.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils.mjs +138 -1
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/package.json +18 -2
- package/types/ngneers-controls-api-ng.d.ts +12 -9
- package/types/ngneers-controls-badge.d.ts +67 -0
- package/types/ngneers-controls-base.d.ts +61 -4
- package/types/ngneers-controls-breadcrumb.d.ts +14 -0
- package/types/ngneers-controls-calendar.d.ts +21 -6
- package/types/ngneers-controls-chip.d.ts +14 -0
- package/types/ngneers-controls-color-picker.d.ts +119 -0
- package/types/ngneers-controls-dialog.d.ts +14 -0
- package/types/ngneers-controls-directives.d.ts +31 -2
- package/types/ngneers-controls-drawer.d.ts +14 -0
- package/types/ngneers-controls-edit-inplace.d.ts +20 -0
- package/types/ngneers-controls-errors.d.ts +105 -16
- package/types/ngneers-controls-filter.d.ts +27 -13
- package/types/ngneers-controls-hint.d.ts +8 -1
- package/types/ngneers-controls-i18n-translations-de.d.ts +14 -0
- package/types/ngneers-controls-i18n-translations-en.d.ts +14 -0
- package/types/ngneers-controls-i18n.d.ts +14 -0
- package/types/ngneers-controls-icon.d.ts +2 -2
- package/types/ngneers-controls-input-field.d.ts +25 -2
- package/types/ngneers-controls-input.d.ts +35 -3
- package/types/ngneers-controls-list-box.d.ts +14 -0
- package/types/ngneers-controls-mask-input.d.ts +14 -0
- package/types/ngneers-controls-otp.d.ts +19 -0
- package/types/ngneers-controls-paginator.d.ts +31 -3
- package/types/ngneers-controls-rating.d.ts +69 -0
- package/types/ngneers-controls-scroll-shadow.d.ts +11 -2
- package/types/ngneers-controls-scroller.d.ts +3 -1
- package/types/ngneers-controls-select.d.ts +27 -3
- package/types/ngneers-controls-snackbar.d.ts +14 -0
- package/types/ngneers-controls-splitter.d.ts +14 -0
- package/types/ngneers-controls-state.d.ts +2 -2
- package/types/ngneers-controls-stepper.d.ts +68 -0
- package/types/ngneers-controls-table.d.ts +273 -169
- package/types/ngneers-controls-toast.d.ts +14 -0
- package/types/ngneers-controls-tooltip.d.ts +0 -1
- package/types/ngneers-controls-tree.d.ts +14 -0
- package/types/ngneers-controls-upload.d.ts +14 -0
- package/types/ngneers-controls-utils.d.ts +27 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-list-box.mjs","sources":["../../src/list-box/list-box-templates.ts","../../src/list-box/list-box.ts","../../src/list-box/list-box.html","../../src/list-box/ngneers-controls-list-box.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { ValueControlBase } from '@ngneers/controls/base';\n\nimport type { NgnItem, NgnItemsValue } from '@ngneers/controls/api';\nimport type { InputGeneric } from '@ngneers/controls/utils';\n\n/**\n * This type determines the value type for the select control.\n * * If `multiple` is `true`, the value is an array of items: `T[K][]`.\n * * Else it is the item's value type `T[K]`.\n */\nexport type ValueType<Items extends readonly NgnItem[], Multiple extends boolean> =\n InputGeneric<Multiple, false> extends true ? NgnItemsValue<Items>[] : NgnItemsValue<Items>;\n\n@Directive()\nexport abstract class ListBoxTemplates<\n Items extends readonly NgnItem[],\n Multiple extends boolean,\n> extends ValueControlBase<'listBox', ValueType<Items, Multiple> | null> {\n // Item template\n private readonly _defaultItemTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\n private readonly _userItemTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\n /**\n * Set a custom template for an item of the list box.\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\n */\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\n protected readonly itemTemplate = computed(\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\n );\n // Group template\n private readonly _defaultGroupTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\n private readonly _userGroupTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\n /**\n * Set a custom template for a group in the list box.\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\n */\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\n protected readonly groupTemplate = computed(\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\n );\n\n // Empty template\n private readonly _defaultEmptyTemplate =\n viewChild.required<TemplateRef<unknown>>('defaultEmptyTemplate');\n private readonly _userEmptyTemplate = contentChild<TemplateRef<unknown>>('empty');\n /**\n * Set a custom template for the empty state in the list box.\n * Can also be set using an `<ng-template>` element with `#empty` template reference variable.\n */\n public readonly templateEmpty = input<TemplateRef<unknown> | null>(null);\n protected readonly emptyTemplate = computed(\n () => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate()\n );\n\n /**\n * Types for the dialog templates.\n */\n public readonly templateTypes = templateTypesFn<{\n item: {\n $implicit: Items[number] | undefined;\n };\n }>();\n\n protected readonly templateTypesInternal = templateTypesFn<{\n item: {\n $implicit: Items[number] | undefined;\n index: number;\n };\n }>();\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n signal,\n untracked,\n viewChild,\n inject,\n output,\n} from '@angular/core';\nimport {\n type FilterConfig,\n type FilterConfigInternal,\n filterOptions,\n flatItems,\n mapToItems,\n type NgnItem,\n type NgnItemsValue,\n} from '@ngneers/controls/api';\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnScroller, NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { createConditionalSpinner } from '@ngneers/controls/spinner';\nimport { maybeCallback } from '@ngneers/controls/utils';\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\nimport { listBoxControlTemplate } from '@ngneers/controls-themes/templates/list-box';\n\nimport { ListBoxTemplates, type ValueType } from './list-box-templates';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-list-box',\n templateUrl: './list-box.html',\n imports: [NgTemplateOutlet, NgnScroller, NgnScrollerItem, NgnCheckbox, NgnTemplate, NgnPt],\n providers: [provideSelf(NgnListBox)],\n host: {\n '[attr.tabIndex]': 'focussable() ? 0 : null',\n '(keydown)': 'onKeyDown($event)',\n '(focusout)': 'currentHighlightedValue.set(null)',\n role: 'listbox',\n '[attr.aria-activedescendant]':\n 'currentHighlightedValue() ? inputId() + \"_option_\" + currentHighlightedValue() : null',\n '[aria-multiselectable]': '!!multiple()',\n '[attr.aria-label]': 'label()',\n '[attr.aria-labelledby]': 'labelledBy()',\n '[id]': 'inputId()',\n },\n})\nexport class NgnListBox<\n Items extends readonly NgnItem[],\n Multiple extends boolean = false,\n> extends ListBoxTemplates<Items, Multiple> {\n protected readonly i18n = inject(I18n).translations;\n protected readonly theme = this.injectThemeTemplate(listBoxControlTemplate, {\n root: true,\n invalid: () => this.invalid(),\n empty: () => !this.displayedItems().length,\n });\n\n private readonly _scroller = viewChild.required<NgnScroller<NgnItemsValue<Items>>>(NgnScroller);\n\n /**\n * The items to display in the list box.\n */\n public readonly items = input.required<Items>();\n\n /**\n * Whether to scroll to the selected item when the list box is first rendered.\n * Pass a `ScrollLogicalPosition` to control where the item lands in the viewport.\n * @default false\n */\n public readonly scrollToSelectedItemOnInit = input<boolean | ScrollLogicalPosition>(false);\n /**\n * Whether items can be selected by the user.\n * @default false\n */\n public readonly selectable = input(false, { transform: booleanAttribute });\n /**\n * Whether hovering an item selects it.\n * @default false\n */\n public readonly selectOnHover = input(false, { transform: booleanAttribute });\n /**\n * Whether the list box itself is focusable and participates in keyboard navigation.\n * @default true\n */\n public readonly focussable = input(true, { transform: booleanAttribute });\n /**\n * Whether the list is virtualized.\n * @default false\n */\n public readonly virtual = input(false, { transform: booleanAttribute });\n /**\n * When {@link virtual} is enabled, this defines the height of each item in the list.\n */\n public readonly itemHeight = input<number>();\n /**\n * Enable this to allow the user to select multiple values.\n * When enabled, the value of the control becomes an array of selected items.\n */\n public readonly multiple = input<Multiple>();\n /**\n * Whether to use a checkbox to indicate selection state.\n *\n * This option is true per default when {@link multiple} is `true`.\n * @default multiple()\n */\n public readonly checkbox = input<boolean>();\n /**\n * Accepts a boolean value that determines whether the filter is enabled.\n * Alternatively, you can provide `FilterConfig` to customize the filter behavior.\n * @default `false`\n */\n public readonly filter = input<FilterConfig<Items[number]> | boolean>(false);\n /**\n * Manually set the filter text.\n */\n public readonly filterText = input<string | null>(null);\n\n /**\n * Emitted when an item is clicked, carrying the value of that item.\n */\n public readonly itemClicked = output<NgnItemsValue<Items>>();\n\n protected readonly maybeCallback = maybeCallback;\n\n public readonly displayedItems = computed(() => flatItems(this.filteredItems()));\n\n protected readonly valueArray = computed(() => {\n const v = this.value();\n return (Array.isArray(v) ? v : v ? [v] : []) as NgnItemsValue<Items>[];\n });\n public readonly currentHighlightedValue = signal<NgnItemsValue<Items> | null>(null);\n protected readonly filteredItems = asyncComputed(async () => {\n const filter = !!this.filter();\n const appliedFilterOptions = this._appliedFilterOptions();\n const filterText = this.filterText();\n\n if (!filter || !filterText) {\n return this.items();\n }\n return await filterOptions(this.items(), filterText, appliedFilterOptions);\n }, []);\n\n private readonly _appliedFilterOptions = computed(() => {\n const filter = this.filter();\n const providedFilterArgs = typeof filter === 'boolean' ? {} : filter;\n const options: FilterConfigInternal<NgnItem> = {\n filterFieldsCallback: item => item.label,\n fieldItems: 'items',\n splitWords: true,\n caseSensitive: false,\n filterFn: 'contains',\n ...providedFilterArgs,\n };\n return options;\n });\n\n protected readonly filterIsExecuting = this.filteredItems.isRunning;\n\n protected readonly showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false);\n\n constructor() {\n super();\n createConditionalSpinner(this.filterIsExecuting);\n\n effect(() => {\n const currentHighlightedValue = this.currentHighlightedValue();\n if (!currentHighlightedValue) {\n return;\n }\n const index = flatItems(this.filteredItems()).findIndex(\n option => option.value === currentHighlightedValue\n );\n this._scroller().scrollToIndex(index);\n });\n\n afterRenderEffect(() => {\n const pos = this.scrollToSelectedItemOnInit();\n const filterDone = this.filteredItems.firstRunCompleted();\n if (pos && filterDone) {\n const val = untracked(this.value);\n const index = flatItems(untracked(this.filteredItems)).findIndex(\n option => option.value === val\n );\n this._scroller().scrollToIndex(index, pos === true ? 'nearest' : pos);\n }\n });\n }\n\n public onKeyDown(event: KeyboardEvent) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.stopPropagation();\n event.preventDefault();\n const flattenedItems = mapToItems(this.filteredItems());\n this.currentHighlightedValue.update(currentValue => {\n const enabledItems = flattenedItems.filter(item => !item.disabled);\n if (enabledItems.length === 0) {\n return null;\n }\n const currentHighlightIndex = enabledItems.findIndex(\n option => option.value === currentValue\n );\n const currentIndex =\n currentHighlightIndex >= 0\n ? currentHighlightIndex\n : enabledItems.findIndex(\n option => option.value === this.valueArray()[this.valueArray().length - 1]\n );\n\n if (currentIndex === -1) {\n return event.key === 'ArrowDown'\n ? enabledItems[0]?.value\n : enabledItems[enabledItems.length - 1]?.value;\n }\n\n const nextIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\n if (nextIndex < 0) {\n return enabledItems[enabledItems.length - 1]?.value;\n }\n if (nextIndex >= enabledItems.length) {\n return enabledItems[0]?.value;\n }\n return enabledItems[nextIndex]?.value;\n });\n } else if (this.selectable() && (event.key === 'Enter' || event.key === ' ')) {\n const currentHighlightedValue = this.currentHighlightedValue();\n if (currentHighlightedValue !== null) {\n event.stopImmediatePropagation();\n event.preventDefault();\n this.onSelect(currentHighlightedValue);\n }\n }\n }\n\n public scrollToIndex(index: number) {\n this._scroller().scrollToIndex(index);\n }\n\n protected onSelect(value: NgnItemsValue<Items>) {\n if (this.multiple()) {\n const currentValue = (this.value() as Array<NgnItemsValue<Items>>) ?? [];\n if (!currentValue.includes(value)) {\n this.value.set([...currentValue, value] as ValueType<Items, Multiple>);\n } else {\n this.value.set(currentValue.filter(item => item !== value) as ValueType<Items, Multiple>);\n }\n } else {\n if (this.value() !== value) {\n this.value.set(value as ValueType<Items, Multiple>);\n }\n }\n this.itemClicked.emit(value);\n this.touched.set(true);\n }\n}\n","<ngn-scroller\n [ptInt]=\"this\"\n [ptDep]=\"'scroller'\"\n [virtual]=\"virtual()\"\n [itemHeight]=\"itemHeight()\"\n [items]=\"displayedItems()\"\n [templateItem]=\"usedItemTemplate\"\n [fieldSticky]=\"'items'\"\n #scroller\n/>\n\n@if (!displayedItems().length) {\n <div role=\"status\">\n <ng-container\n *ngTemplateOutlet=\"emptyTemplate() || defaultEmptyTemplate; context: {}\"\n ></ng-container>\n </div>\n}\n\n<ng-template #usedItemTemplate [ngnTemplate]=\"scroller.templateTypes.item\" let-itemOrGroup>\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [ngnScrollerItem]=\"itemOrGroup\"\n [id]=\"inputId() + '_option_' + itemOrGroup.value\"\n [attr.role]=\"itemOrGroup.items ? 'group' : 'option'\"\n [attr.aria-label]=\"itemOrGroup.items ? maybeCallback(itemOrGroup.label) : null\"\n [aria-selected]=\"\n selectable() && !itemOrGroup.items ? valueArray().includes(itemOrGroup.value) : null\n \"\n [attr.aria-disabled]=\"itemOrGroup.disabled ? 'true' : null\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n item: !itemOrGroup.items,\n group: !!itemOrGroup.items,\n 'item-selected': valueArray().includes(itemOrGroup.value),\n 'item-highlighted': itemOrGroup.value === currentHighlightedValue(),\n 'item-disabled': !!itemOrGroup.disabled,\n }\"\n (click)=\"\n !itemOrGroup.items && !itemOrGroup.disabled && selectable() && onSelect(itemOrGroup.value)\n \"\n (mouseenter)=\"\n !itemOrGroup.items &&\n !itemOrGroup.disabled &&\n selectable() &&\n selectOnHover() &&\n onSelect(itemOrGroup.value)\n \"\n >\n @if (showCheckboxes() && !itemOrGroup.items) {\n <ngn-checkbox\n [ptInt]=\"this\"\n [ptDep]=\"'checkbox'\"\n [value]=\"valueArray().includes(itemOrGroup.value)\"\n aria-hidden=\"true\"\n inert=\"true\"\n />\n }\n <ng-container\n *ngTemplateOutlet=\"\n itemOrGroup.items ? groupTemplate() : itemTemplate();\n context: { $implicit: itemOrGroup }\n \"\n ></ng-container>\n </div>\n</ng-template>\n\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\n <span [attr.data-testid]=\"item?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-item'\">\n @let label = item?.label;\n @if (label) {\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\n } @else {\n <span [attr.data-testid]=\"item?.testId\">​</span>\n }\n </span>\n</ng-template>\n\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\n <span [attr.data-testid]=\"group?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-group'\">\n @let label = group?.label;\n @if (label) {\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\n } @else {\n <span [attr.data-testid]=\"group?.testId\">​</span>\n }\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyTemplate>\n <span [ptInt]=\"this\" [ptClass]=\"'empty'\" [attr.data-testid]=\"'empty'\">{{\n i18n['listBox_noItemsFound']()\n }}</span>\n</ng-template>\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-list-box.mjs","sources":["../../src/list-box/list-box-templates.ts","../../src/list-box/list-box.ts","../../src/list-box/list-box.html","../../src/list-box/ngneers-controls-list-box.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\nimport { ValueControlBase } from '@ngneers/controls/base';\n\nimport type { NgnItem, NgnItemsValue } from '@ngneers/controls/api';\nimport type { InputGeneric } from '@ngneers/controls/utils';\n\n/**\n * This type determines the value type for the select control.\n * * If `multiple` is `true`, the value is an array of items: `T[K][]`.\n * * Else it is the item's value type `T[K]`.\n */\nexport type ValueType<Items extends readonly NgnItem[], Multiple extends boolean> =\n InputGeneric<Multiple, false> extends true ? NgnItemsValue<Items>[] : NgnItemsValue<Items>;\n\n@Directive()\nexport abstract class ListBoxTemplates<\n Items extends readonly NgnItem[],\n Multiple extends boolean,\n> extends ValueControlBase<'listBox', ValueType<Items, Multiple> | null> {\n // Item template\n private readonly _defaultItemTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\n private readonly _userItemTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\n /**\n * Set a custom template for an item of the list box.\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\n */\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\n protected readonly itemTemplate = computed(\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\n );\n // Group template\n private readonly _defaultGroupTemplate =\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\n private readonly _userGroupTemplate =\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\n /**\n * Set a custom template for a group in the list box.\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\n */\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\n protected readonly groupTemplate = computed(\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\n );\n\n // Empty template\n private readonly _defaultEmptyTemplate =\n viewChild.required<TemplateRef<unknown>>('defaultEmptyTemplate');\n private readonly _userEmptyTemplate = contentChild<TemplateRef<unknown>>('empty');\n /**\n * Set a custom template for the empty state in the list box.\n * Can also be set using an `<ng-template>` element with `#empty` template reference variable.\n */\n public readonly templateEmpty = input<TemplateRef<unknown> | null>(null);\n protected readonly emptyTemplate = computed(\n () => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate()\n );\n\n /**\n * Types for the dialog templates.\n */\n public readonly templateTypes = templateTypesFn<{\n item: {\n $implicit: Items[number] | undefined;\n };\n }>();\n\n protected readonly templateTypesInternal = templateTypesFn<{\n item: {\n $implicit: Items[number] | undefined;\n index: number;\n };\n }>();\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n signal,\n untracked,\n viewChild,\n inject,\n output,\n} from '@angular/core';\nimport {\n type FilterConfig,\n type FilterConfigInternal,\n filterOptions,\n flatItems,\n mapToItems,\n type NgnItem,\n type NgnItemsValue,\n} from '@ngneers/controls/api';\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnScroller, NgnScrollerItem } from '@ngneers/controls/scroller';\nimport { createConditionalSpinner } from '@ngneers/controls/spinner';\nimport { maybeCallback } from '@ngneers/controls/utils';\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\nimport { listBoxControlTemplate } from '@ngneers/controls-themes/templates/list-box';\n\nimport { ListBoxTemplates, type ValueType } from './list-box-templates';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-list-box',\n templateUrl: './list-box.html',\n imports: [NgTemplateOutlet, NgnScroller, NgnScrollerItem, NgnCheckbox, NgnTemplate, NgnPt],\n providers: [provideSelf(NgnListBox)],\n host: {\n '[attr.tabIndex]': 'focussable() ? 0 : null',\n '(keydown)': 'onKeyDown($event)',\n '(focusout)': 'currentHighlightedValue.set(null)',\n role: 'listbox',\n '[attr.aria-activedescendant]':\n 'currentHighlightedValue() ? inputId() + \"_option_\" + currentHighlightedValue() : null',\n '[aria-multiselectable]': '!!multiple()',\n '[attr.aria-label]': 'label()',\n '[attr.aria-labelledby]': 'labelledBy()',\n '[id]': 'inputId()',\n },\n})\nexport class NgnListBox<\n Items extends readonly NgnItem[],\n Multiple extends boolean = false,\n> extends ListBoxTemplates<Items, Multiple> {\n protected readonly i18n = inject(I18n).translations;\n protected readonly theme = this.injectThemeTemplate(listBoxControlTemplate, {\n root: true,\n invalid: () => this.invalidState(),\n empty: () => !this.displayedItems().length,\n });\n\n private readonly _scroller = viewChild.required<NgnScroller<NgnItemsValue<Items>>>(NgnScroller);\n\n /**\n * The items to display in the list box.\n */\n public readonly items = input.required<Items>();\n\n /**\n * Whether to scroll to the selected item when the list box is first rendered.\n * Pass a `ScrollLogicalPosition` to control where the item lands in the viewport.\n * @default false\n */\n public readonly scrollToSelectedItemOnInit = input<boolean | ScrollLogicalPosition>(false);\n /**\n * Whether items can be selected by the user.\n * @default false\n */\n public readonly selectable = input(false, { transform: booleanAttribute });\n /**\n * Whether hovering an item selects it.\n * @default false\n */\n public readonly selectOnHover = input(false, { transform: booleanAttribute });\n /**\n * Whether the list box itself is focusable and participates in keyboard navigation.\n * @default true\n */\n public readonly focussable = input(true, { transform: booleanAttribute });\n /**\n * Whether the list is virtualized.\n * @default false\n */\n public readonly virtual = input(false, { transform: booleanAttribute });\n /**\n * When {@link virtual} is enabled, this defines the height of each item in the list.\n */\n public readonly itemHeight = input<number>();\n /**\n * Enable this to allow the user to select multiple values.\n * When enabled, the value of the control becomes an array of selected items.\n */\n public readonly multiple = input<Multiple>();\n /**\n * Whether to use a checkbox to indicate selection state.\n *\n * This option is true per default when {@link multiple} is `true`.\n * @default multiple()\n */\n public readonly checkbox = input<boolean>();\n /**\n * Accepts a boolean value that determines whether the filter is enabled.\n * Alternatively, you can provide `FilterConfig` to customize the filter behavior.\n * @default `false`\n */\n public readonly filter = input<FilterConfig<Items[number]> | boolean>(false);\n /**\n * Manually set the filter text.\n */\n public readonly filterText = input<string | null>(null);\n\n /**\n * Emitted when an item is clicked, carrying the value of that item.\n */\n public readonly itemClicked = output<NgnItemsValue<Items>>();\n\n protected readonly maybeCallback = maybeCallback;\n\n public readonly displayedItems = computed(() => flatItems(this.filteredItems()));\n\n protected readonly valueArray = computed(() => {\n const v = this.value();\n return (Array.isArray(v) ? v : v ? [v] : []) as NgnItemsValue<Items>[];\n });\n public readonly currentHighlightedValue = signal<NgnItemsValue<Items> | null>(null);\n protected readonly filteredItems = asyncComputed(async () => {\n const filter = !!this.filter();\n const appliedFilterOptions = this._appliedFilterOptions();\n const filterText = this.filterText();\n\n if (!filter || !filterText) {\n return this.items();\n }\n return await filterOptions(this.items(), filterText, appliedFilterOptions);\n }, []);\n\n private readonly _appliedFilterOptions = computed(() => {\n const filter = this.filter();\n const providedFilterArgs = typeof filter === 'boolean' ? {} : filter;\n const options: FilterConfigInternal<NgnItem> = {\n filterFieldsCallback: item => item.label,\n fieldItems: 'items',\n splitWords: true,\n caseSensitive: false,\n filterFn: 'contains',\n ...providedFilterArgs,\n };\n return options;\n });\n\n protected readonly filterIsExecuting = this.filteredItems.isRunning;\n\n protected readonly showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false);\n\n constructor() {\n super();\n createConditionalSpinner(this.filterIsExecuting);\n\n effect(() => {\n const currentHighlightedValue = this.currentHighlightedValue();\n if (!currentHighlightedValue) {\n return;\n }\n const index = flatItems(this.filteredItems()).findIndex(\n option => option.value === currentHighlightedValue\n );\n this._scroller().scrollToIndex(index);\n });\n\n afterRenderEffect(() => {\n const pos = this.scrollToSelectedItemOnInit();\n const filterDone = this.filteredItems.firstRunCompleted();\n if (pos && filterDone) {\n const val = untracked(this.value);\n const index = flatItems(untracked(this.filteredItems)).findIndex(\n option => option.value === val\n );\n this._scroller().scrollToIndex(index, pos === true ? 'nearest' : pos);\n }\n });\n }\n\n public onKeyDown(event: KeyboardEvent) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.stopPropagation();\n event.preventDefault();\n const flattenedItems = mapToItems(this.filteredItems());\n this.currentHighlightedValue.update(currentValue => {\n const enabledItems = flattenedItems.filter(item => !item.disabled);\n if (enabledItems.length === 0) {\n return null;\n }\n const currentHighlightIndex = enabledItems.findIndex(\n option => option.value === currentValue\n );\n const currentIndex =\n currentHighlightIndex >= 0\n ? currentHighlightIndex\n : enabledItems.findIndex(\n option => option.value === this.valueArray()[this.valueArray().length - 1]\n );\n\n if (currentIndex === -1) {\n return event.key === 'ArrowDown'\n ? enabledItems[0]?.value\n : enabledItems[enabledItems.length - 1]?.value;\n }\n\n const nextIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\n if (nextIndex < 0) {\n return enabledItems[enabledItems.length - 1]?.value;\n }\n if (nextIndex >= enabledItems.length) {\n return enabledItems[0]?.value;\n }\n return enabledItems[nextIndex]?.value;\n });\n } else if (this.selectable() && (event.key === 'Enter' || event.key === ' ')) {\n const currentHighlightedValue = this.currentHighlightedValue();\n if (currentHighlightedValue !== null) {\n event.stopImmediatePropagation();\n event.preventDefault();\n this.onSelect(currentHighlightedValue);\n }\n }\n }\n\n public scrollToIndex(index: number) {\n this._scroller().scrollToIndex(index);\n }\n\n protected onSelect(value: NgnItemsValue<Items>) {\n if (this.multiple()) {\n const currentValue = (this.value() as Array<NgnItemsValue<Items>>) ?? [];\n if (!currentValue.includes(value)) {\n this.value.set([...currentValue, value] as ValueType<Items, Multiple>);\n } else {\n this.value.set(currentValue.filter(item => item !== value) as ValueType<Items, Multiple>);\n }\n } else {\n if (this.value() !== value) {\n this.value.set(value as ValueType<Items, Multiple>);\n }\n }\n this.itemClicked.emit(value);\n this.markTouched();\n }\n}\n","<ngn-scroller\n [ptInt]=\"this\"\n [ptDep]=\"'scroller'\"\n [virtual]=\"virtual()\"\n [itemHeight]=\"itemHeight()\"\n [items]=\"displayedItems()\"\n [templateItem]=\"usedItemTemplate\"\n [fieldSticky]=\"'items'\"\n #scroller\n/>\n\n@if (!displayedItems().length) {\n <div role=\"status\">\n <ng-container\n *ngTemplateOutlet=\"emptyTemplate() || defaultEmptyTemplate; context: {}\"\n ></ng-container>\n </div>\n}\n\n<ng-template #usedItemTemplate [ngnTemplate]=\"scroller.templateTypes.item\" let-itemOrGroup>\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [ngnScrollerItem]=\"itemOrGroup\"\n [id]=\"inputId() + '_option_' + itemOrGroup.value\"\n [attr.role]=\"itemOrGroup.items ? 'group' : 'option'\"\n [attr.aria-label]=\"itemOrGroup.items ? maybeCallback(itemOrGroup.label) : null\"\n [aria-selected]=\"\n selectable() && !itemOrGroup.items ? valueArray().includes(itemOrGroup.value) : null\n \"\n [attr.aria-disabled]=\"itemOrGroup.disabled ? 'true' : null\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n item: !itemOrGroup.items,\n group: !!itemOrGroup.items,\n 'item-selected': valueArray().includes(itemOrGroup.value),\n 'item-highlighted': itemOrGroup.value === currentHighlightedValue(),\n 'item-disabled': !!itemOrGroup.disabled,\n }\"\n (click)=\"\n !itemOrGroup.items && !itemOrGroup.disabled && selectable() && onSelect(itemOrGroup.value)\n \"\n (mouseenter)=\"\n !itemOrGroup.items &&\n !itemOrGroup.disabled &&\n selectable() &&\n selectOnHover() &&\n onSelect(itemOrGroup.value)\n \"\n >\n @if (showCheckboxes() && !itemOrGroup.items) {\n <ngn-checkbox\n [ptInt]=\"this\"\n [ptDep]=\"'checkbox'\"\n [value]=\"valueArray().includes(itemOrGroup.value)\"\n aria-hidden=\"true\"\n inert=\"true\"\n />\n }\n <ng-container\n *ngTemplateOutlet=\"\n itemOrGroup.items ? groupTemplate() : itemTemplate();\n context: { $implicit: itemOrGroup }\n \"\n ></ng-container>\n </div>\n</ng-template>\n\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\n <span [attr.data-testid]=\"item?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-item'\">\n @let label = item?.label;\n @if (label) {\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\n } @else {\n <span [attr.data-testid]=\"item?.testId\">​</span>\n }\n </span>\n</ng-template>\n\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\n <span [attr.data-testid]=\"group?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-group'\">\n @let label = group?.label;\n @if (label) {\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\n } @else {\n <span [attr.data-testid]=\"group?.testId\">​</span>\n }\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyTemplate>\n <span [ptInt]=\"this\" [ptClass]=\"'empty'\" [attr.data-testid]=\"'empty'\">{{\n i18n['listBox_noItemsFound']()\n }}</span>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -745,7 +745,10 @@ class NgnMaskInput extends ValueControlBase {
|
|
|
745
745
|
domEventHandler(this._proxyRef, 'keydown', event => this._onKeyDown(event));
|
|
746
746
|
// Track focus so the active-section highlight only shows while focused.
|
|
747
747
|
domEventHandler(this._proxyRef, 'focus', () => this.focused.set(true));
|
|
748
|
-
domEventHandler(this._proxyRef, 'blur', () =>
|
|
748
|
+
domEventHandler(this._proxyRef, 'blur', () => {
|
|
749
|
+
this.focused.set(false);
|
|
750
|
+
this.markTouched();
|
|
751
|
+
});
|
|
749
752
|
// Pointer down anywhere on the control: focus the proxy and select the
|
|
750
753
|
// section nearest the pointer. Shared with field-delegated clicks via
|
|
751
754
|
// `focusFromPointer`. Works standalone (no surrounding input-field).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-mask-input.mjs","sources":["../../src/mask-input/masks.ts","../../src/mask-input/masks-date-time.ts","../../src/mask-input/helper.ts","../../src/mask-input/mask-input.ts","../../src/mask-input/mask-input.html","../../src/mask-input/ngneers-controls-mask-input.ts"],"sourcesContent":["import type { MaskInputCfg } from './types';\n\nconst phoneNumber = [\n '(',\n { kind: 'number', segment: 'areaCode', min: 0, max: 999, length: 3, placeholder: '000' },\n ')',\n ' ',\n { kind: 'number', segment: 'exchange', min: 0, max: 999, length: 3, placeholder: '000' },\n '-',\n { kind: 'number', segment: 'subscriber', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst creditCard = [\n { kind: 'number', segment: 'cardPart1', min: 0, max: 9999, length: 4, placeholder: '0000' },\n ' ',\n { kind: 'number', segment: 'cardPart2', min: 0, max: 9999, length: 4, placeholder: '0000' },\n ' ',\n { kind: 'number', segment: 'cardPart3', min: 0, max: 9999, length: 4, placeholder: '0000' },\n ' ',\n { kind: 'number', segment: 'cardPart4', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst ssn = [\n { kind: 'number', segment: 'areaNumber', min: 0, max: 999, length: 3, placeholder: '000' },\n '-',\n { kind: 'number', segment: 'groupNumber', min: 0, max: 99, length: 2, placeholder: '00' },\n '-',\n { kind: 'number', segment: 'serialNumber', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst zipCode = [\n { kind: 'number', segment: 'zipBase', min: 0, max: 99999, length: 5, placeholder: '00000' },\n '-',\n { kind: 'number', segment: 'zipPlus4', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst currency = [\n '$',\n {\n kind: 'number',\n segment: 'dollars',\n min: 0,\n max: 999999999,\n length: 9,\n placeholder: '000000000',\n },\n '.',\n { kind: 'number', segment: 'cents', min: 0, max: 99, length: 2, placeholder: '00' },\n] as const satisfies MaskInputCfg;\n\nconst percentage = [\n { kind: 'number', segment: 'percent', min: 0, max: 100, length: 3, placeholder: '000' },\n '%',\n] as const satisfies MaskInputCfg;\n\nexport const MASKS = {\n phoneNumber,\n creditCard,\n ssn,\n zipCode,\n currency,\n percentage,\n} as const satisfies Record<string, MaskInputCfg>;\n","import type { MaskInputCfg } from './types';\n\nconst formatSymbols = {\n d: 'day',\n M: 'month',\n y: 'year',\n H: 'hour24',\n h: 'hour12',\n m: 'minute',\n s: 'second',\n a: 'period',\n S: 'fractionalSecond',\n} as const;\n\ntype GroupedFormatSymbol = {\n symbol: (typeof formatSymbols)[keyof typeof formatSymbols];\n length: number;\n};\n\ntype Literal = {\n literal: string;\n};\n\ntype GroupedMaskSegment = GroupedFormatSymbol | Literal;\n\n/**\n * Returns the input mask configuration for a given date or time mask.\n * @param mask The mask string representing the date or time format.\n * For example, 'MM/dd/yyyy' for date, 'HH:mm:ss' for time, 'hh:mm:ss a' for 12-hour time with period.\n * @returns The input mask configuration that can be used with the input mask component.\n */\nexport function getDateOrTimeMask(mask: string): MaskInputCfg {\n const cfg: GroupedMaskSegment[] = [];\n let i = 0;\n while (i < mask.length) {\n const char = mask[i] as keyof typeof formatSymbols;\n const symbol = formatSymbols[char];\n if (symbol) {\n // Count how many times this symbol repeats\n let length = 1;\n while (i + length < mask.length && mask[i + length] === char) {\n length++;\n }\n cfg.push({ symbol, length });\n i += length;\n } else {\n cfg.push({ literal: char });\n i++;\n }\n }\n\n const result: MaskInputCfg = cfg.map(segment => {\n if ('literal' in segment) {\n return segment.literal;\n } else {\n const { symbol, length } = segment;\n // A single-letter token (length 1) yields a variable-length, non-padded field\n // (`length` omitted); a doubled token (length >= 2) yields a fixed, zero-padded field.\n const len = length >= 2 ? length : undefined;\n switch (symbol) {\n case 'day':\n return {\n segment: 'day',\n kind: 'number',\n min: 1,\n max: 31,\n length: len,\n placeholder: 'DD',\n } as const;\n case 'month':\n return {\n segment: 'month',\n kind: 'number',\n min: 1,\n max: 12,\n length: len,\n placeholder: 'MM',\n } as const;\n case 'year':\n return {\n segment: 'year',\n kind: 'number',\n min: 0,\n max: 9999,\n length: len,\n placeholder: 'YYYY',\n } as const;\n case 'hour24':\n return {\n segment: 'hour24',\n kind: 'number',\n min: 0,\n max: 23,\n length: len,\n placeholder: 'HH',\n } as const;\n case 'hour12':\n return {\n segment: 'hour12',\n kind: 'number',\n min: 1,\n max: 12,\n length: len,\n placeholder: 'HH',\n } as const;\n case 'minute':\n return {\n segment: 'minute',\n kind: 'number',\n min: 0,\n max: 59,\n length: len,\n placeholder: 'MM',\n } as const;\n case 'second':\n return {\n segment: 'second',\n kind: 'number',\n min: 0,\n max: 59,\n length: len,\n placeholder: 'SS',\n } as const;\n case 'period':\n return {\n segment: 'period',\n kind: 'enum',\n values: ['AM', 'PM'],\n } as const;\n case 'fractionalSecond':\n return {\n segment: 'fractionalSecond',\n kind: 'number',\n min: 0,\n max: 999,\n length: len,\n placeholder: 'SSS',\n } as const;\n }\n }\n });\n return result;\n}\n\nexport const DATE_TIME_MASKS = {\n date: getDateOrTimeMask('MM/dd/yyyy'),\n time: getDateOrTimeMask('HH:mm:ss'),\n timeShort: getDateOrTimeMask('HH:mm'),\n time12: getDateOrTimeMask('hh:mm:ss a'),\n};\n","import { MASKS } from './masks';\nimport { DATE_TIME_MASKS } from './masks-date-time';\n\nimport type { EnumField, Field, MaskInputCfg, NumberField, Part } from './types';\n\nexport type RenderToken =\n | { kind: 'sep'; text: string }\n | { kind: 'section'; ord: number; text: string; placeholder: boolean };\n\nexport function resolveMask(input: MaskInputCfg | string | null): Part[] | null {\n if (!input) return null;\n const cfg: MaskInputCfg | undefined =\n typeof input === 'string'\n ? ((MASKS as Record<string, MaskInputCfg>)[input] ??\n (DATE_TIME_MASKS as Record<string, MaskInputCfg>)[input])\n : input;\n if (!cfg) return null; // unknown raw string → unsupported\n\n return cfg.map<Part>(item => {\n if (typeof item === 'string') return { kind: 'sep', text: item };\n if (item.kind === 'number') {\n const maxLen = item.length ?? String(item.max).length;\n const field: NumberField = {\n kind: 'number',\n name: item.segment,\n min: item.min,\n max: item.max,\n maxLen,\n pad: item.length != null,\n placeholder: item.placeholder ?? '-'.repeat(maxLen),\n };\n return field;\n }\n // Guard an empty values array: Math.max(...[]) is -Infinity, which would\n // throw in '-'.repeat(maxLen). An empty enum is degenerate but must not crash.\n const maxLen = item.values.length === 0 ? 0 : Math.max(...item.values.map(v => v.length));\n const field: EnumField = {\n kind: 'enum',\n name: item.segment,\n values: [...item.values],\n maxLen,\n placeholder: item.placeholder ?? (maxLen > 0 ? '-'.repeat(maxLen) : ''),\n };\n return field;\n });\n}\n\nexport function fieldList(parts: Part[]): Field[] {\n return parts.filter((p): p is Field => p.kind !== 'sep');\n}\n\n/**\n * Index of the section whose horizontal box is nearest `clientX`.\n * - `clientX` left of the first section → 0\n * - `clientX` right of the last section → last index\n * - inside a section → that section\n * - in a gap/separator between two sections → the nearer one\n * Returns -1 for an empty list.\n */\nexport function nearestSectionIndex(\n rects: readonly { left: number; right: number }[],\n clientX: number\n): number {\n if (rects.length === 0) return -1;\n let best = 0;\n let bestDist = Infinity;\n for (let i = 0; i < rects.length; i++) {\n const r = rects[i];\n if (!r) continue;\n const dist = clientX < r.left ? r.left - clientX : clientX > r.right ? clientX - r.right : 0;\n if (dist < bestDist) {\n bestDist = dist;\n best = i;\n }\n if (dist === 0) break; // inside a section — exact hit\n }\n return best;\n}\n\n/**\n * Enforce the no-gaps invariant: scanning from index 0, once the first empty\n * field is seen, blank every field after it. A delete that empties an earlier\n * field therefore clears the now-orphaned later fields too.\n */\nexport function truncateGaps(values: string[]): string[] {\n let seenEmpty = false;\n return values.map(v => {\n if (seenEmpty) return '';\n if (!v) {\n seenEmpty = true;\n return '';\n }\n return v;\n });\n}\n\n// ---- New per-section pure functions ----\n\n/**\n * Type a char into ONE section. Returns the new section value + whether focus\n * should auto-advance to the next section, or null if the char is rejected.\n *\n * For number fields:\n * - Non-digit → null.\n * - If current is already complete (length===maxLen or value*10>max) a digit\n * starts a fresh value (replace).\n * - Otherwise appending is attempted. If the appended candidate exceeds max or\n * maxLen, restart with the bare digit instead.\n * - advance:true when the resulting value is isSectionComplete.\n *\n * For enum fields:\n * - Match by case-insensitive first char; on match returns {value, advance:true}.\n * - No match → null.\n *\n * NOTE: padding is NOT applied to the returned value — that is a display concern.\n */\nexport function typeIntoSection(\n field: Field,\n current: string,\n ch: string\n): { value: string; advance: boolean } | null {\n if (field.kind === 'enum') {\n const match = field.values.find(val => val[0]?.toLowerCase() === ch.toLowerCase());\n if (!match) return null;\n return { value: match, advance: true };\n }\n\n // number field — a single digit only (multi-char data is rejected outright).\n if (!/^\\d$/.test(ch)) return null;\n\n // If current section is already complete, start fresh\n const currentComplete = current !== '' && isSectionComplete(field, current);\n let candidate: string;\n if (currentComplete) {\n candidate = ch;\n } else {\n const appended = current + ch;\n // If appending would exceed max or length, restart with bare digit\n if (appended.length > field.maxLen || Number(appended) > field.max) {\n // A single digit that is itself out of range can never be a valid value\n // for this field (only possible for tiny fields with max < 10) → reject.\n if (Number(ch) > field.max) return null;\n candidate = ch;\n } else {\n candidate = appended;\n }\n }\n\n // A full-width candidate below the field minimum (e.g. '00' for a day/month\n // whose min is 1) is invalid — reject rather than letting it \"complete\".\n if (candidate.length === field.maxLen && Number(candidate) < field.min) return null;\n\n const advance = isSectionComplete(field, candidate);\n return { value: candidate, advance };\n}\n\n/**\n * Step/cycle a section value up (1) or down (-1). Empty defaults sensibly.\n *\n * For number fields:\n * - empty → field.min (no extra dir step on the empty→min transition).\n * - Non-empty: n = Number(current) + dir, wrap at >max → min, <min → max.\n * - Returns padded (padStart maxLen '0') iff field.pad.\n *\n * For enum fields:\n * - Find current (case-insensitive) in values; step by dir with wraparound.\n * - empty/not-found → first value (dir:1) or last value (dir:-1).\n */\nexport function stepSection(field: Field, current: string, dir: 1 | -1): string {\n if (field.kind === 'enum') {\n const i = field.values.findIndex(v => v.toLowerCase() === current.toLowerCase());\n if (i === -1) {\n return (dir === 1 ? field.values[0] : field.values[field.values.length - 1]) ?? '';\n }\n const next = (i + dir + field.values.length) % field.values.length;\n return field.values[next] ?? field.values[0] ?? '';\n }\n\n // number field\n if (current === '') {\n const min = field.min;\n return field.pad ? String(min).padStart(field.maxLen, '0') : String(min);\n }\n\n let n = Number(current) + dir;\n if (n > field.max) n = field.min;\n if (n < field.min) n = field.max;\n return field.pad ? String(n).padStart(field.maxLen, '0') : String(n);\n}\n\n/**\n * Whether a single section value is \"done\" (would auto-advance or is a fully\n * matched enum). Empty → always false.\n *\n * number: value.length===maxLen OR Number(value)*10 > max.\n * enum: value is literally in the values list (case-sensitive).\n */\nexport function isSectionComplete(field: Field, value: string): boolean {\n if (value === '') return false;\n if (field.kind === 'enum') return field.values.includes(value);\n if (!/^\\d+$/.test(value)) return false;\n const n = Number(value);\n // A complete number value must be within range AND either fill the width or be\n // unable to grow further (value*10 would exceed max).\n return n >= field.min && n <= field.max && (value.length === field.maxLen || n * 10 > field.max);\n}\n\n/**\n * Whether all fields in the mask have a complete value.\n * Empty field list → false.\n */\nexport function isComplete(parts: Part[], values: string[]): boolean {\n const fields = fieldList(parts);\n if (fields.length === 0) return false;\n return fields.every((field, i) => isSectionComplete(field, values[i] ?? ''));\n}\n\n/**\n * Render each part as a RenderToken for display. No offsets.\n *\n * Separator → {kind:'sep', text}.\n * Field → {kind:'section', ord, text, placeholder}:\n * - empty value → text=field.placeholder, placeholder=true\n * - filled → text=padded(number&&pad) or raw value, placeholder=false\n *\n * `ord` is the 0-based field ordinal (index among fields, not among all parts).\n *\n * When `activeOrd` is provided, a padded number field that is currently active\n * AND not yet complete renders its raw typed digits instead of zero-padded text.\n * This matches native date-field behaviour: padding is deferred until the section\n * is committed (complete or navigated away from).\n * When `activeOrd` is omitted, all non-empty padded fields are padded (preserving\n * the \"fully padded\" output for callers that don't track the active section).\n */\nexport function composeDisplay(parts: Part[], values: string[], activeOrd?: number): RenderToken[] {\n const tokens: RenderToken[] = [];\n let fieldOrd = 0;\n for (const part of parts) {\n if (part.kind === 'sep') {\n tokens.push({ kind: 'sep', text: part.text });\n } else {\n const o = fieldOrd;\n const value = values[o] ?? '';\n if (value === '') {\n tokens.push({ kind: 'section', ord: o, text: part.placeholder, placeholder: true });\n } else {\n const padded =\n part.kind === 'number' && part.pad && (o !== activeOrd || isSectionComplete(part, value));\n const text = padded ? value.padStart(part.maxLen, '0') : value;\n tokens.push({ kind: 'section', ord: o, text, placeholder: false });\n }\n fieldOrd++;\n }\n }\n return tokens;\n}\n\n/**\n * Compose the full serialized output string (padded per field definition).\n * Separators are appended verbatim. Number fields are padded iff field.pad.\n * Enum fields are verbatim. Empty values are included as-is (empty string).\n */\nexport function serialize(parts: Part[], values: string[]): string {\n let result = '';\n let fieldOrd = 0;\n for (const part of parts) {\n if (part.kind === 'sep') {\n result += part.text;\n } else {\n const value = values[fieldOrd] ?? '';\n if (part.kind === 'number' && part.pad) {\n result += value.padStart(part.maxLen, '0');\n } else {\n result += value;\n }\n fieldOrd++;\n }\n }\n return result;\n}\n\n// ---- Kept internals ----\n\n/**\n * Separator-aware string parser shared by `paste` and `deserialize`. Walks the\n * parts left→right with a cursor into `str`:\n * - **separator**: consume `sep.text` if present at the cursor; separators are\n * optional (so a no-separator paste like `'1234'` still works).\n * - **number field**: consume the maximal run of digits, capped at `maxLen`\n * (naturally stops at a non-digit such as a separator). Zero digits → leave\n * the field empty and stop. A chunk outside `[min,max]` → invalid.\n * - **enum field**: match a value (exact case-insensitive, else first char);\n * no match with chars remaining → invalid; no chars remaining → stop.\n *\n * The result is run through `truncateGaps` so a skipped middle field never\n * leaves a gap. `ok` is false when a field was outright invalid (out of range /\n * unmatched), in which case `values` holds the valid prefix parsed so far.\n */\n/** Per-field parse outcome: `stop` = nothing left to consume (partial input). */\ntype FieldParse = { value: string; cursor: number; ok: boolean; stop: boolean };\n\n/** Consume the maximal in-range digit run for a number field at `cursor`. */\nfunction takeNumberField(field: NumberField, str: string, cursor: number): FieldParse {\n let take = '';\n while (take.length < field.maxLen) {\n const c = str[cursor] ?? '';\n if (!/\\d/.test(c)) break;\n take += c;\n cursor++;\n }\n if (take === '') return { value: '', cursor, ok: true, stop: true };\n const n = Number(take);\n if (n < field.min || n > field.max) return { value: '', cursor, ok: false, stop: false };\n return { value: take, cursor, ok: true, stop: false };\n}\n\n/** Match an enum value (exact case-insensitive, else first char) at `cursor`. */\nfunction takeEnumField(field: EnumField, str: string, cursor: number): FieldParse {\n const rest = str.slice(cursor);\n if (rest === '') return { value: '', cursor, ok: true, stop: true };\n const exact = field.values.find(v => v.toUpperCase() === rest.slice(0, v.length).toUpperCase());\n const match = exact ?? field.values.find(v => v[0]?.toUpperCase() === rest[0]?.toUpperCase());\n if (!match) return { value: '', cursor, ok: false, stop: false };\n return { value: match, cursor: cursor + match.length, ok: true, stop: false };\n}\n\nfunction feedString(parts: Part[], str: string): { values: string[]; ok: boolean } {\n const fields = fieldList(parts);\n const values = fields.map(() => '');\n let cursor = 0;\n let o = 0; // field ordinal\n let ok = true;\n\n for (const part of parts) {\n if (part.kind === 'sep') {\n if (str.startsWith(part.text, cursor)) cursor += part.text.length;\n continue;\n }\n const res =\n part.kind === 'number'\n ? takeNumberField(part, str, cursor)\n : takeEnumField(part, str, cursor);\n if (!res.ok) {\n ok = false;\n break;\n }\n if (res.stop) break; // partial input — leave this and the rest empty\n values[o] = res.value;\n cursor = res.cursor;\n o++;\n }\n\n // Any unconsumed trailing input means the string didn't fully match the mask.\n // `paste` treats this as invalid (returns null); `deserialize` ignores `ok`\n // and keeps the best-effort prefix.\n if (cursor < str.length) ok = false;\n return { values: truncateGaps(values), ok };\n}\n\nexport function paste(parts: Part[], text: string): { values: string[]; offset: number } | null {\n const { values, ok } = feedString(parts, text);\n if (!ok) return null; // any invalid field rejects the whole paste\n // offset: count the committed characters in a simple left-to-right walk\n let offset = 0;\n let fieldOrd = 0;\n for (const part of parts) {\n if (part.kind === 'sep') {\n // include separator only if the next field has a value\n const nextValue = values[fieldOrd] ?? '';\n if (nextValue) offset += part.text.length;\n } else {\n const v = values[fieldOrd] ?? '';\n if (v) offset += v.length;\n fieldOrd++;\n }\n }\n return { values, offset };\n}\n\nexport function deserialize(parts: Part[], str: string): string[] {\n // Best-effort separator-aware parse. On an invalid/out-of-range field we keep\n // the valid prefix (feedString already stopped there, leaving the rest empty)\n // rather than producing garbage. Never throws.\n return feedString(parts, str).values;\n}\n","import {\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { domEventHandler } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnRovingGroup, NgnRovingItem } from '@ngneers/controls/roving-focus';\nimport { maskInputControlTemplate } from '@ngneers/controls-themes/templates/mask-input';\n\nimport {\n composeDisplay,\n deserialize,\n fieldList,\n isComplete,\n nearestSectionIndex,\n paste,\n resolveMask,\n serialize,\n stepSection,\n truncateGaps,\n typeIntoSection,\n} from './helper';\n\nimport type { MaskInputCfg } from './types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-mask-input',\n templateUrl: './mask-input.html',\n imports: [NgnPt, NgnRovingGroup, NgnRovingItem],\n providers: [provideSelf(NgnMaskInput)],\n})\nexport class NgnMaskInput extends ValueControlBase<'maskInput', string | null> {\n public override readonly isFieldControl = true;\n protected readonly theme = this.injectThemeTemplate(maskInputControlTemplate, 'root');\n protected readonly i18n = inject(I18n).translations;\n\n /**\n * The mask to apply to the input. Can be a predefined mask key or a custom mask configuration.\n */\n public readonly mask = input<MaskInputCfg | string | null>(null);\n\n private readonly _parts = computed(() => resolveMask(this.mask()));\n\n private readonly _fields = computed(() => {\n const p = this._parts();\n return p ? fieldList(p) : [];\n });\n\n /**\n * Structural signature of the resolved mask — field kinds/names/widths and\n * separators, but deliberately NOT numeric min/max. The section values are\n * reset only when this changes, so a consumer narrowing a field's range (e.g.\n * a calendar shrinking the day field's max to the current month's length) does\n * not wipe what the user has already typed.\n */\n private readonly _structureSig = computed(() => {\n const parts = this._parts();\n if (!parts) return '';\n return parts\n .map(p =>\n p.kind === 'sep'\n ? `sep:${p.text}`\n : p.kind === 'number'\n ? `num:${p.name}:${p.maxLen}:${p.pad}`\n : `enum:${p.name}:${p.values.join('|')}`\n )\n .join(';');\n });\n\n /** Source of truth: one raw string per field ordinal. */\n protected readonly values = signal<string[]>([]);\n\n /** Whether the proxy input currently holds focus. The active-section\n * highlight and \"actively edited\" treatment only apply while focused. */\n protected readonly focused = signal(false);\n\n /** RenderTokens for template `@for` loop. While unfocused there is no active\n * section, so padded fields render in their resting (padded) form. */\n protected readonly tokens = computed(() => {\n const p = this._parts();\n if (!p) return [];\n return composeDisplay(p, this.values(), this.focused() ? this.activeOrd() : undefined);\n });\n\n /** The roving group on the proxy input element. */\n protected readonly rovingGroup = viewChild.required(NgnRovingGroup);\n\n /** The proxy input element reference. */\n private readonly _proxyRef = viewChild.required<ElementRef<HTMLInputElement>>('proxy');\n\n /** Active field ordinal (identity: item index === field ordinal). */\n protected readonly activeOrd = computed(() => this.rovingGroup().activeIndex());\n\n protected readonly proxyInputMode = computed(() => {\n const f = this._fields()[this.activeOrd()];\n return f?.kind === 'enum' ? 'text' : 'numeric';\n });\n\n protected readonly liveAnnouncement = signal<string>('');\n\n // ---- A11y helpers ----\n\n protected sectionValueNow(ord: number): number | null {\n const f = this._fields()[ord];\n const v = this.values()[ord] ?? '';\n if (!f || v === '') return null;\n if (f.kind === 'number') return Number(v);\n // enum: expose the option index so the spinbutton has a valid numeric value.\n const idx = f.values.indexOf(v);\n return idx >= 0 ? idx : null;\n }\n\n protected sectionMin(ord: number): number | null {\n const f = this._fields()[ord];\n if (!f) return null;\n return f.kind === 'number' ? f.min : 0;\n }\n\n protected sectionMax(ord: number): number | null {\n const f = this._fields()[ord];\n if (!f) return null;\n return f.kind === 'number' ? f.max : f.values.length - 1;\n }\n\n /** Accessible name for a section's `role=\"spinbutton\"` — the field's name. */\n protected sectionName(ord: number): string {\n return this._fields()[ord]?.name ?? '';\n }\n\n protected sectionValueText(ord: number): string {\n const f = this._fields()[ord];\n const v = this.values()[ord] ?? '';\n if (!f) return '';\n if (v === '') return f.placeholder;\n return v;\n }\n\n /**\n * Whether every section holds a finished value — i.e. the mask is fully\n * filled and a serialized output value has been emitted.\n */\n public readonly complete = computed(() => this.value() !== null);\n\n /** Whether no section holds any value (the whole field is blank). Lets a host\n * (e.g. calendar) distinguish a fully-cleared field from mid-typing, both of\n * which emit a `null` value. */\n public readonly empty = computed(() => this.values().every(v => v === ''));\n\n /**\n * Returns the resolved CSS class string for `section-active` from the theme,\n * used to highlight the currently active section span in the template.\n */\n protected readonly activeSectionClass = computed(() => this.theme.class('section-active'));\n\n // ---- Segment descriptions for sr ----\n\n protected readonly segmentDescriptions = computed(() => {\n const parts = this._parts();\n if (!parts) return [];\n return fieldList(parts).map(field => ({\n id: `seg-${field.name}-${this.inputId()}`,\n text:\n field.kind === 'number'\n ? this.i18n['maskInput_segmentRange']({\n name: field.name,\n min: field.min,\n max: field.max,\n })\n : field.values.join(this.i18n['maskInput_optionSeparator']()),\n }));\n });\n\n /** Returns the description span id for a given field ordinal, or null if none. */\n protected sectionDescId(ord: number): string | null {\n return this.segmentDescriptions()[ord]?.id ?? null;\n }\n\n constructor() {\n super();\n\n // Reset values only when the mask STRUCTURE changes (not a min/max-only\n // tweak), synchronously before the next render, so stale values from a\n // different mask are never composed against the new parts.\n let prevStructureSig: string | null = null;\n effect(() => {\n const sig = this._structureSig();\n if (prevStructureSig !== null && prevStructureSig !== sig) {\n this.values.set([]);\n }\n prevStructureSig = sig;\n });\n\n // External value → internal: guard against write-loop by comparing to serialized form.\n // Use untracked() when reading `values` so that internal typing changes do NOT re-trigger\n // this effect — it must only fire when the external `value` model (from the parent) changes.\n effect(() => {\n const parts = this._parts();\n if (!parts) return;\n const ext = this.value() ?? '';\n const current = untracked(() =>\n isComplete(parts, this.values()) ? serialize(parts, this.values()) : ''\n );\n if (ext !== current) {\n this.values.set(deserialize(parts, ext));\n }\n });\n\n // Internal values → external value model.\n effect(() => {\n const parts = this._parts();\n if (!parts) return;\n const vals = this.values();\n if (isComplete(parts, vals)) {\n this.value.set(serialize(parts, vals));\n } else {\n this.value.set(null);\n }\n });\n\n // Wire DOM events on the proxy input.\n domEventHandler(this._proxyRef, 'beforeinput', event => this._onBeforeInput(event));\n domEventHandler(this._proxyRef, 'keydown', event => this._onKeyDown(event));\n\n // Track focus so the active-section highlight only shows while focused.\n domEventHandler(this._proxyRef, 'focus', () => this.focused.set(true));\n domEventHandler(this._proxyRef, 'blur', () => this.focused.set(false));\n\n // Pointer down anywhere on the control: focus the proxy and select the\n // section nearest the pointer. Shared with field-delegated clicks via\n // `focusFromPointer`. Works standalone (no surrounding input-field).\n domEventHandler(this.element, 'pointerdown', event => {\n if (this.disabled()) return;\n event.preventDefault();\n this.focusFromPointer(event);\n });\n }\n\n /**\n * Places focus on the proxy input and selects the section nearest the\n * pointer's horizontal position. Invoked both by the control's own\n * `pointerdown` and by a surrounding `ngn-input-field` when its padding is\n * clicked (so a click \"above\" a section selects that section). Returns `true`\n * to signal the field it handled focus.\n */\n public override focusFromPointer(event: MouseEvent): boolean {\n if (this.disabled()) return false;\n this._proxyRef().nativeElement.focus();\n const ord = this._sectionIndexAt(event.clientX);\n if (ord >= 0) this.rovingGroup().setActive(ord);\n return true;\n }\n\n /** Clears every section (invoked by a surrounding field's clear button). */\n public override clearValue(): boolean {\n if (this.disabled() || this.readonly()) return false;\n this.values.set([]);\n return true;\n }\n\n /** Field ordinal of the section nearest `clientX`, or -1 when there are none. */\n private _sectionIndexAt(clientX: number): number {\n // Section spans carry role=\"spinbutton\" and appear in DOM order = field\n // ordinal order (matching the activeOrd identity mapping).\n const spans = this.element.nativeElement.querySelectorAll<HTMLElement>('[role=\"spinbutton\"]');\n const rects = Array.from(spans, el => el.getBoundingClientRect());\n return nearestSectionIndex(rects, clientX);\n }\n\n private _onBeforeInput(event: InputEvent): void {\n const parts = this._parts();\n if (!parts) return;\n if (this.disabled() || this.readonly()) return;\n\n event.preventDefault();\n\n if (event.inputType === 'insertFromPaste' || event.inputType === 'insertFromDrop') {\n const r = event.data ? paste(parts, event.data) : null;\n if (r) {\n this.values.set(r.values);\n // Advance to the next empty section or stay on last\n const fields = this._fields();\n const nextEmpty = r.values.findIndex(v => v === '');\n const targetOrd = nextEmpty >= 0 ? nextEmpty : fields.length - 1;\n this.rovingGroup().setActive(targetOrd);\n }\n return;\n }\n\n if (event.data) {\n const ord = this.activeOrd();\n const fields = this._fields();\n const f = fields[ord];\n if (!f) return;\n const current = this.values()[ord] ?? '';\n const r = typeIntoSection(f, current, event.data);\n if (r) {\n // Immutable update of the values array\n const newValues = [...this.values()];\n newValues[ord] = r.value;\n this.values.set(newValues);\n if (r.advance) {\n this.rovingGroup().next();\n }\n }\n }\n }\n\n private _onKeyDown(event: KeyboardEvent): void {\n const parts = this._parts();\n if (!parts || event.ctrlKey || event.metaKey || event.altKey) return;\n if (this.disabled() || this.readonly()) return;\n\n const ord = this.activeOrd();\n const fields = this._fields();\n const f = fields[ord];\n\n switch (event.key) {\n case 'Backspace':\n case 'Delete': {\n event.preventDefault();\n const currentVal = this.values()[ord] ?? '';\n if (currentVal === '') {\n // Already empty — step to previous section\n this.rovingGroup().prev();\n } else {\n // Clear the active section; then enforce no-gaps so any filled\n // fields after the newly-emptied one are also cleared.\n const newValues = [...this.values()];\n newValues[ord] = '';\n this.values.set(truncateGaps(newValues));\n }\n break;\n }\n case 'ArrowUp':\n case 'ArrowDown': {\n // The roving group is configured with horizontal orientation, so it\n // deliberately does NOT consume ArrowUp/ArrowDown — the mask owns them\n // for value stepping. This division is intentional, not coincidental:\n // Left/Right move between sections, Up/Down change the active value.\n event.preventDefault();\n if (!f) break;\n const dir: 1 | -1 = event.key === 'ArrowUp' ? 1 : -1;\n const newVal = stepSection(f, this.values()[ord] ?? '', dir);\n const newValues = [...this.values()];\n newValues[ord] = newVal;\n this.values.set(newValues);\n this.liveAnnouncement.set(`${f.name}: ${newVal}`);\n break;\n }\n // ArrowLeft/Right/Home/End are handled by the roving group — do not preventDefault\n }\n }\n}\n","<div [ptInt]=\"this\" [ptClass]=\"'root'\">\n <input\n #proxy\n #pg=\"ngnRovingGroup\"\n [ptInt]=\"this\"\n [ptClass]=\"'proxy'\"\n ngnRovingGroup\n rovingMode=\"activedescendant\"\n orientation=\"horizontal\"\n [attr.inputmode]=\"proxyInputMode()\"\n [attr.aria-roledescription]=\"i18n['maskInput_roleDescription']()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [disabled]=\"disabled()\"\n [attr.readonly]=\"readonly() || null\"\n tabindex=\"0\"\n />\n @for (tok of tokens(); track $index) {\n @if (tok.kind === 'sep') {\n <span [ptInt]=\"this\" [ptClass]=\"'separator'\" aria-hidden=\"true\">{{ tok.text }}</span>\n } @else {\n <span\n [ngnRovingItem]=\"pg\"\n role=\"spinbutton\"\n [attr.aria-label]=\"sectionName(tok.ord)\"\n [ptInt]=\"this\"\n [ptClass]=\"tok.placeholder ? 'section-placeholder' : 'section'\"\n [class]=\"focused() && activeOrd() === tok.ord ? activeSectionClass() : ''\"\n [attr.aria-valuenow]=\"sectionValueNow(tok.ord)\"\n [attr.aria-valuemin]=\"sectionMin(tok.ord)\"\n [attr.aria-valuemax]=\"sectionMax(tok.ord)\"\n [attr.aria-valuetext]=\"sectionValueText(tok.ord)\"\n [attr.aria-describedby]=\"sectionDescId(tok.ord)\"\n >{{ tok.text }}</span\n >\n }\n }\n @for (seg of segmentDescriptions(); track seg.id) {\n <span [id]=\"seg.id\" [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ seg.text }}</span>\n }\n <span aria-live=\"polite\" [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ liveAnnouncement() }}</span>\n</div>\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-mask-input.mjs","sources":["../../src/mask-input/masks.ts","../../src/mask-input/masks-date-time.ts","../../src/mask-input/helper.ts","../../src/mask-input/mask-input.ts","../../src/mask-input/mask-input.html","../../src/mask-input/ngneers-controls-mask-input.ts"],"sourcesContent":["import type { MaskInputCfg } from './types';\n\nconst phoneNumber = [\n '(',\n { kind: 'number', segment: 'areaCode', min: 0, max: 999, length: 3, placeholder: '000' },\n ')',\n ' ',\n { kind: 'number', segment: 'exchange', min: 0, max: 999, length: 3, placeholder: '000' },\n '-',\n { kind: 'number', segment: 'subscriber', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst creditCard = [\n { kind: 'number', segment: 'cardPart1', min: 0, max: 9999, length: 4, placeholder: '0000' },\n ' ',\n { kind: 'number', segment: 'cardPart2', min: 0, max: 9999, length: 4, placeholder: '0000' },\n ' ',\n { kind: 'number', segment: 'cardPart3', min: 0, max: 9999, length: 4, placeholder: '0000' },\n ' ',\n { kind: 'number', segment: 'cardPart4', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst ssn = [\n { kind: 'number', segment: 'areaNumber', min: 0, max: 999, length: 3, placeholder: '000' },\n '-',\n { kind: 'number', segment: 'groupNumber', min: 0, max: 99, length: 2, placeholder: '00' },\n '-',\n { kind: 'number', segment: 'serialNumber', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst zipCode = [\n { kind: 'number', segment: 'zipBase', min: 0, max: 99999, length: 5, placeholder: '00000' },\n '-',\n { kind: 'number', segment: 'zipPlus4', min: 0, max: 9999, length: 4, placeholder: '0000' },\n] as const satisfies MaskInputCfg;\n\nconst currency = [\n '$',\n {\n kind: 'number',\n segment: 'dollars',\n min: 0,\n max: 999999999,\n length: 9,\n placeholder: '000000000',\n },\n '.',\n { kind: 'number', segment: 'cents', min: 0, max: 99, length: 2, placeholder: '00' },\n] as const satisfies MaskInputCfg;\n\nconst percentage = [\n { kind: 'number', segment: 'percent', min: 0, max: 100, length: 3, placeholder: '000' },\n '%',\n] as const satisfies MaskInputCfg;\n\nexport const MASKS = {\n phoneNumber,\n creditCard,\n ssn,\n zipCode,\n currency,\n percentage,\n} as const satisfies Record<string, MaskInputCfg>;\n","import type { MaskInputCfg } from './types';\n\nconst formatSymbols = {\n d: 'day',\n M: 'month',\n y: 'year',\n H: 'hour24',\n h: 'hour12',\n m: 'minute',\n s: 'second',\n a: 'period',\n S: 'fractionalSecond',\n} as const;\n\ntype GroupedFormatSymbol = {\n symbol: (typeof formatSymbols)[keyof typeof formatSymbols];\n length: number;\n};\n\ntype Literal = {\n literal: string;\n};\n\ntype GroupedMaskSegment = GroupedFormatSymbol | Literal;\n\n/**\n * Returns the input mask configuration for a given date or time mask.\n * @param mask The mask string representing the date or time format.\n * For example, 'MM/dd/yyyy' for date, 'HH:mm:ss' for time, 'hh:mm:ss a' for 12-hour time with period.\n * @returns The input mask configuration that can be used with the input mask component.\n */\nexport function getDateOrTimeMask(mask: string): MaskInputCfg {\n const cfg: GroupedMaskSegment[] = [];\n let i = 0;\n while (i < mask.length) {\n const char = mask[i] as keyof typeof formatSymbols;\n const symbol = formatSymbols[char];\n if (symbol) {\n // Count how many times this symbol repeats\n let length = 1;\n while (i + length < mask.length && mask[i + length] === char) {\n length++;\n }\n cfg.push({ symbol, length });\n i += length;\n } else {\n cfg.push({ literal: char });\n i++;\n }\n }\n\n const result: MaskInputCfg = cfg.map(segment => {\n if ('literal' in segment) {\n return segment.literal;\n } else {\n const { symbol, length } = segment;\n // A single-letter token (length 1) yields a variable-length, non-padded field\n // (`length` omitted); a doubled token (length >= 2) yields a fixed, zero-padded field.\n const len = length >= 2 ? length : undefined;\n switch (symbol) {\n case 'day':\n return {\n segment: 'day',\n kind: 'number',\n min: 1,\n max: 31,\n length: len,\n placeholder: 'DD',\n } as const;\n case 'month':\n return {\n segment: 'month',\n kind: 'number',\n min: 1,\n max: 12,\n length: len,\n placeholder: 'MM',\n } as const;\n case 'year':\n return {\n segment: 'year',\n kind: 'number',\n min: 0,\n max: 9999,\n length: len,\n placeholder: 'YYYY',\n } as const;\n case 'hour24':\n return {\n segment: 'hour24',\n kind: 'number',\n min: 0,\n max: 23,\n length: len,\n placeholder: 'HH',\n } as const;\n case 'hour12':\n return {\n segment: 'hour12',\n kind: 'number',\n min: 1,\n max: 12,\n length: len,\n placeholder: 'HH',\n } as const;\n case 'minute':\n return {\n segment: 'minute',\n kind: 'number',\n min: 0,\n max: 59,\n length: len,\n placeholder: 'MM',\n } as const;\n case 'second':\n return {\n segment: 'second',\n kind: 'number',\n min: 0,\n max: 59,\n length: len,\n placeholder: 'SS',\n } as const;\n case 'period':\n return {\n segment: 'period',\n kind: 'enum',\n values: ['AM', 'PM'],\n } as const;\n case 'fractionalSecond':\n return {\n segment: 'fractionalSecond',\n kind: 'number',\n min: 0,\n max: 999,\n length: len,\n placeholder: 'SSS',\n } as const;\n }\n }\n });\n return result;\n}\n\nexport const DATE_TIME_MASKS = {\n date: getDateOrTimeMask('MM/dd/yyyy'),\n time: getDateOrTimeMask('HH:mm:ss'),\n timeShort: getDateOrTimeMask('HH:mm'),\n time12: getDateOrTimeMask('hh:mm:ss a'),\n};\n","import { MASKS } from './masks';\nimport { DATE_TIME_MASKS } from './masks-date-time';\n\nimport type { EnumField, Field, MaskInputCfg, NumberField, Part } from './types';\n\nexport type RenderToken =\n | { kind: 'sep'; text: string }\n | { kind: 'section'; ord: number; text: string; placeholder: boolean };\n\nexport function resolveMask(input: MaskInputCfg | string | null): Part[] | null {\n if (!input) return null;\n const cfg: MaskInputCfg | undefined =\n typeof input === 'string'\n ? ((MASKS as Record<string, MaskInputCfg>)[input] ??\n (DATE_TIME_MASKS as Record<string, MaskInputCfg>)[input])\n : input;\n if (!cfg) return null; // unknown raw string → unsupported\n\n return cfg.map<Part>(item => {\n if (typeof item === 'string') return { kind: 'sep', text: item };\n if (item.kind === 'number') {\n const maxLen = item.length ?? String(item.max).length;\n const field: NumberField = {\n kind: 'number',\n name: item.segment,\n min: item.min,\n max: item.max,\n maxLen,\n pad: item.length != null,\n placeholder: item.placeholder ?? '-'.repeat(maxLen),\n };\n return field;\n }\n // Guard an empty values array: Math.max(...[]) is -Infinity, which would\n // throw in '-'.repeat(maxLen). An empty enum is degenerate but must not crash.\n const maxLen = item.values.length === 0 ? 0 : Math.max(...item.values.map(v => v.length));\n const field: EnumField = {\n kind: 'enum',\n name: item.segment,\n values: [...item.values],\n maxLen,\n placeholder: item.placeholder ?? (maxLen > 0 ? '-'.repeat(maxLen) : ''),\n };\n return field;\n });\n}\n\nexport function fieldList(parts: Part[]): Field[] {\n return parts.filter((p): p is Field => p.kind !== 'sep');\n}\n\n/**\n * Index of the section whose horizontal box is nearest `clientX`.\n * - `clientX` left of the first section → 0\n * - `clientX` right of the last section → last index\n * - inside a section → that section\n * - in a gap/separator between two sections → the nearer one\n * Returns -1 for an empty list.\n */\nexport function nearestSectionIndex(\n rects: readonly { left: number; right: number }[],\n clientX: number\n): number {\n if (rects.length === 0) return -1;\n let best = 0;\n let bestDist = Infinity;\n for (let i = 0; i < rects.length; i++) {\n const r = rects[i];\n if (!r) continue;\n const dist = clientX < r.left ? r.left - clientX : clientX > r.right ? clientX - r.right : 0;\n if (dist < bestDist) {\n bestDist = dist;\n best = i;\n }\n if (dist === 0) break; // inside a section — exact hit\n }\n return best;\n}\n\n/**\n * Enforce the no-gaps invariant: scanning from index 0, once the first empty\n * field is seen, blank every field after it. A delete that empties an earlier\n * field therefore clears the now-orphaned later fields too.\n */\nexport function truncateGaps(values: string[]): string[] {\n let seenEmpty = false;\n return values.map(v => {\n if (seenEmpty) return '';\n if (!v) {\n seenEmpty = true;\n return '';\n }\n return v;\n });\n}\n\n// ---- New per-section pure functions ----\n\n/**\n * Type a char into ONE section. Returns the new section value + whether focus\n * should auto-advance to the next section, or null if the char is rejected.\n *\n * For number fields:\n * - Non-digit → null.\n * - If current is already complete (length===maxLen or value*10>max) a digit\n * starts a fresh value (replace).\n * - Otherwise appending is attempted. If the appended candidate exceeds max or\n * maxLen, restart with the bare digit instead.\n * - advance:true when the resulting value is isSectionComplete.\n *\n * For enum fields:\n * - Match by case-insensitive first char; on match returns {value, advance:true}.\n * - No match → null.\n *\n * NOTE: padding is NOT applied to the returned value — that is a display concern.\n */\nexport function typeIntoSection(\n field: Field,\n current: string,\n ch: string\n): { value: string; advance: boolean } | null {\n if (field.kind === 'enum') {\n const match = field.values.find(val => val[0]?.toLowerCase() === ch.toLowerCase());\n if (!match) return null;\n return { value: match, advance: true };\n }\n\n // number field — a single digit only (multi-char data is rejected outright).\n if (!/^\\d$/.test(ch)) return null;\n\n // If current section is already complete, start fresh\n const currentComplete = current !== '' && isSectionComplete(field, current);\n let candidate: string;\n if (currentComplete) {\n candidate = ch;\n } else {\n const appended = current + ch;\n // If appending would exceed max or length, restart with bare digit\n if (appended.length > field.maxLen || Number(appended) > field.max) {\n // A single digit that is itself out of range can never be a valid value\n // for this field (only possible for tiny fields with max < 10) → reject.\n if (Number(ch) > field.max) return null;\n candidate = ch;\n } else {\n candidate = appended;\n }\n }\n\n // A full-width candidate below the field minimum (e.g. '00' for a day/month\n // whose min is 1) is invalid — reject rather than letting it \"complete\".\n if (candidate.length === field.maxLen && Number(candidate) < field.min) return null;\n\n const advance = isSectionComplete(field, candidate);\n return { value: candidate, advance };\n}\n\n/**\n * Step/cycle a section value up (1) or down (-1). Empty defaults sensibly.\n *\n * For number fields:\n * - empty → field.min (no extra dir step on the empty→min transition).\n * - Non-empty: n = Number(current) + dir, wrap at >max → min, <min → max.\n * - Returns padded (padStart maxLen '0') iff field.pad.\n *\n * For enum fields:\n * - Find current (case-insensitive) in values; step by dir with wraparound.\n * - empty/not-found → first value (dir:1) or last value (dir:-1).\n */\nexport function stepSection(field: Field, current: string, dir: 1 | -1): string {\n if (field.kind === 'enum') {\n const i = field.values.findIndex(v => v.toLowerCase() === current.toLowerCase());\n if (i === -1) {\n return (dir === 1 ? field.values[0] : field.values[field.values.length - 1]) ?? '';\n }\n const next = (i + dir + field.values.length) % field.values.length;\n return field.values[next] ?? field.values[0] ?? '';\n }\n\n // number field\n if (current === '') {\n const min = field.min;\n return field.pad ? String(min).padStart(field.maxLen, '0') : String(min);\n }\n\n let n = Number(current) + dir;\n if (n > field.max) n = field.min;\n if (n < field.min) n = field.max;\n return field.pad ? String(n).padStart(field.maxLen, '0') : String(n);\n}\n\n/**\n * Whether a single section value is \"done\" (would auto-advance or is a fully\n * matched enum). Empty → always false.\n *\n * number: value.length===maxLen OR Number(value)*10 > max.\n * enum: value is literally in the values list (case-sensitive).\n */\nexport function isSectionComplete(field: Field, value: string): boolean {\n if (value === '') return false;\n if (field.kind === 'enum') return field.values.includes(value);\n if (!/^\\d+$/.test(value)) return false;\n const n = Number(value);\n // A complete number value must be within range AND either fill the width or be\n // unable to grow further (value*10 would exceed max).\n return n >= field.min && n <= field.max && (value.length === field.maxLen || n * 10 > field.max);\n}\n\n/**\n * Whether all fields in the mask have a complete value.\n * Empty field list → false.\n */\nexport function isComplete(parts: Part[], values: string[]): boolean {\n const fields = fieldList(parts);\n if (fields.length === 0) return false;\n return fields.every((field, i) => isSectionComplete(field, values[i] ?? ''));\n}\n\n/**\n * Render each part as a RenderToken for display. No offsets.\n *\n * Separator → {kind:'sep', text}.\n * Field → {kind:'section', ord, text, placeholder}:\n * - empty value → text=field.placeholder, placeholder=true\n * - filled → text=padded(number&&pad) or raw value, placeholder=false\n *\n * `ord` is the 0-based field ordinal (index among fields, not among all parts).\n *\n * When `activeOrd` is provided, a padded number field that is currently active\n * AND not yet complete renders its raw typed digits instead of zero-padded text.\n * This matches native date-field behaviour: padding is deferred until the section\n * is committed (complete or navigated away from).\n * When `activeOrd` is omitted, all non-empty padded fields are padded (preserving\n * the \"fully padded\" output for callers that don't track the active section).\n */\nexport function composeDisplay(parts: Part[], values: string[], activeOrd?: number): RenderToken[] {\n const tokens: RenderToken[] = [];\n let fieldOrd = 0;\n for (const part of parts) {\n if (part.kind === 'sep') {\n tokens.push({ kind: 'sep', text: part.text });\n } else {\n const o = fieldOrd;\n const value = values[o] ?? '';\n if (value === '') {\n tokens.push({ kind: 'section', ord: o, text: part.placeholder, placeholder: true });\n } else {\n const padded =\n part.kind === 'number' && part.pad && (o !== activeOrd || isSectionComplete(part, value));\n const text = padded ? value.padStart(part.maxLen, '0') : value;\n tokens.push({ kind: 'section', ord: o, text, placeholder: false });\n }\n fieldOrd++;\n }\n }\n return tokens;\n}\n\n/**\n * Compose the full serialized output string (padded per field definition).\n * Separators are appended verbatim. Number fields are padded iff field.pad.\n * Enum fields are verbatim. Empty values are included as-is (empty string).\n */\nexport function serialize(parts: Part[], values: string[]): string {\n let result = '';\n let fieldOrd = 0;\n for (const part of parts) {\n if (part.kind === 'sep') {\n result += part.text;\n } else {\n const value = values[fieldOrd] ?? '';\n if (part.kind === 'number' && part.pad) {\n result += value.padStart(part.maxLen, '0');\n } else {\n result += value;\n }\n fieldOrd++;\n }\n }\n return result;\n}\n\n// ---- Kept internals ----\n\n/**\n * Separator-aware string parser shared by `paste` and `deserialize`. Walks the\n * parts left→right with a cursor into `str`:\n * - **separator**: consume `sep.text` if present at the cursor; separators are\n * optional (so a no-separator paste like `'1234'` still works).\n * - **number field**: consume the maximal run of digits, capped at `maxLen`\n * (naturally stops at a non-digit such as a separator). Zero digits → leave\n * the field empty and stop. A chunk outside `[min,max]` → invalid.\n * - **enum field**: match a value (exact case-insensitive, else first char);\n * no match with chars remaining → invalid; no chars remaining → stop.\n *\n * The result is run through `truncateGaps` so a skipped middle field never\n * leaves a gap. `ok` is false when a field was outright invalid (out of range /\n * unmatched), in which case `values` holds the valid prefix parsed so far.\n */\n/** Per-field parse outcome: `stop` = nothing left to consume (partial input). */\ntype FieldParse = { value: string; cursor: number; ok: boolean; stop: boolean };\n\n/** Consume the maximal in-range digit run for a number field at `cursor`. */\nfunction takeNumberField(field: NumberField, str: string, cursor: number): FieldParse {\n let take = '';\n while (take.length < field.maxLen) {\n const c = str[cursor] ?? '';\n if (!/\\d/.test(c)) break;\n take += c;\n cursor++;\n }\n if (take === '') return { value: '', cursor, ok: true, stop: true };\n const n = Number(take);\n if (n < field.min || n > field.max) return { value: '', cursor, ok: false, stop: false };\n return { value: take, cursor, ok: true, stop: false };\n}\n\n/** Match an enum value (exact case-insensitive, else first char) at `cursor`. */\nfunction takeEnumField(field: EnumField, str: string, cursor: number): FieldParse {\n const rest = str.slice(cursor);\n if (rest === '') return { value: '', cursor, ok: true, stop: true };\n const exact = field.values.find(v => v.toUpperCase() === rest.slice(0, v.length).toUpperCase());\n const match = exact ?? field.values.find(v => v[0]?.toUpperCase() === rest[0]?.toUpperCase());\n if (!match) return { value: '', cursor, ok: false, stop: false };\n return { value: match, cursor: cursor + match.length, ok: true, stop: false };\n}\n\nfunction feedString(parts: Part[], str: string): { values: string[]; ok: boolean } {\n const fields = fieldList(parts);\n const values = fields.map(() => '');\n let cursor = 0;\n let o = 0; // field ordinal\n let ok = true;\n\n for (const part of parts) {\n if (part.kind === 'sep') {\n if (str.startsWith(part.text, cursor)) cursor += part.text.length;\n continue;\n }\n const res =\n part.kind === 'number'\n ? takeNumberField(part, str, cursor)\n : takeEnumField(part, str, cursor);\n if (!res.ok) {\n ok = false;\n break;\n }\n if (res.stop) break; // partial input — leave this and the rest empty\n values[o] = res.value;\n cursor = res.cursor;\n o++;\n }\n\n // Any unconsumed trailing input means the string didn't fully match the mask.\n // `paste` treats this as invalid (returns null); `deserialize` ignores `ok`\n // and keeps the best-effort prefix.\n if (cursor < str.length) ok = false;\n return { values: truncateGaps(values), ok };\n}\n\nexport function paste(parts: Part[], text: string): { values: string[]; offset: number } | null {\n const { values, ok } = feedString(parts, text);\n if (!ok) return null; // any invalid field rejects the whole paste\n // offset: count the committed characters in a simple left-to-right walk\n let offset = 0;\n let fieldOrd = 0;\n for (const part of parts) {\n if (part.kind === 'sep') {\n // include separator only if the next field has a value\n const nextValue = values[fieldOrd] ?? '';\n if (nextValue) offset += part.text.length;\n } else {\n const v = values[fieldOrd] ?? '';\n if (v) offset += v.length;\n fieldOrd++;\n }\n }\n return { values, offset };\n}\n\nexport function deserialize(parts: Part[], str: string): string[] {\n // Best-effort separator-aware parse. On an invalid/out-of-range field we keep\n // the valid prefix (feedString already stopped there, leaving the rest empty)\n // rather than producing garbage. Never throws.\n return feedString(parts, str).values;\n}\n","import {\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { domEventHandler } from '@ngneers/controls/api/ng';\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { NgnRovingGroup, NgnRovingItem } from '@ngneers/controls/roving-focus';\nimport { maskInputControlTemplate } from '@ngneers/controls-themes/templates/mask-input';\n\nimport {\n composeDisplay,\n deserialize,\n fieldList,\n isComplete,\n nearestSectionIndex,\n paste,\n resolveMask,\n serialize,\n stepSection,\n truncateGaps,\n typeIntoSection,\n} from './helper';\n\nimport type { MaskInputCfg } from './types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-mask-input',\n templateUrl: './mask-input.html',\n imports: [NgnPt, NgnRovingGroup, NgnRovingItem],\n providers: [provideSelf(NgnMaskInput)],\n})\nexport class NgnMaskInput extends ValueControlBase<'maskInput', string | null> {\n public override readonly isFieldControl = true;\n protected readonly theme = this.injectThemeTemplate(maskInputControlTemplate, 'root');\n protected readonly i18n = inject(I18n).translations;\n\n /**\n * The mask to apply to the input. Can be a predefined mask key or a custom mask configuration.\n */\n public readonly mask = input<MaskInputCfg | string | null>(null);\n\n private readonly _parts = computed(() => resolveMask(this.mask()));\n\n private readonly _fields = computed(() => {\n const p = this._parts();\n return p ? fieldList(p) : [];\n });\n\n /**\n * Structural signature of the resolved mask — field kinds/names/widths and\n * separators, but deliberately NOT numeric min/max. The section values are\n * reset only when this changes, so a consumer narrowing a field's range (e.g.\n * a calendar shrinking the day field's max to the current month's length) does\n * not wipe what the user has already typed.\n */\n private readonly _structureSig = computed(() => {\n const parts = this._parts();\n if (!parts) return '';\n return parts\n .map(p =>\n p.kind === 'sep'\n ? `sep:${p.text}`\n : p.kind === 'number'\n ? `num:${p.name}:${p.maxLen}:${p.pad}`\n : `enum:${p.name}:${p.values.join('|')}`\n )\n .join(';');\n });\n\n /** Source of truth: one raw string per field ordinal. */\n protected readonly values = signal<string[]>([]);\n\n /** Whether the proxy input currently holds focus. The active-section\n * highlight and \"actively edited\" treatment only apply while focused. */\n protected readonly focused = signal(false);\n\n /** RenderTokens for template `@for` loop. While unfocused there is no active\n * section, so padded fields render in their resting (padded) form. */\n protected readonly tokens = computed(() => {\n const p = this._parts();\n if (!p) return [];\n return composeDisplay(p, this.values(), this.focused() ? this.activeOrd() : undefined);\n });\n\n /** The roving group on the proxy input element. */\n protected readonly rovingGroup = viewChild.required(NgnRovingGroup);\n\n /** The proxy input element reference. */\n private readonly _proxyRef = viewChild.required<ElementRef<HTMLInputElement>>('proxy');\n\n /** Active field ordinal (identity: item index === field ordinal). */\n protected readonly activeOrd = computed(() => this.rovingGroup().activeIndex());\n\n protected readonly proxyInputMode = computed(() => {\n const f = this._fields()[this.activeOrd()];\n return f?.kind === 'enum' ? 'text' : 'numeric';\n });\n\n protected readonly liveAnnouncement = signal<string>('');\n\n // ---- A11y helpers ----\n\n protected sectionValueNow(ord: number): number | null {\n const f = this._fields()[ord];\n const v = this.values()[ord] ?? '';\n if (!f || v === '') return null;\n if (f.kind === 'number') return Number(v);\n // enum: expose the option index so the spinbutton has a valid numeric value.\n const idx = f.values.indexOf(v);\n return idx >= 0 ? idx : null;\n }\n\n protected sectionMin(ord: number): number | null {\n const f = this._fields()[ord];\n if (!f) return null;\n return f.kind === 'number' ? f.min : 0;\n }\n\n protected sectionMax(ord: number): number | null {\n const f = this._fields()[ord];\n if (!f) return null;\n return f.kind === 'number' ? f.max : f.values.length - 1;\n }\n\n /** Accessible name for a section's `role=\"spinbutton\"` — the field's name. */\n protected sectionName(ord: number): string {\n return this._fields()[ord]?.name ?? '';\n }\n\n protected sectionValueText(ord: number): string {\n const f = this._fields()[ord];\n const v = this.values()[ord] ?? '';\n if (!f) return '';\n if (v === '') return f.placeholder;\n return v;\n }\n\n /**\n * Whether every section holds a finished value — i.e. the mask is fully\n * filled and a serialized output value has been emitted.\n */\n public readonly complete = computed(() => this.value() !== null);\n\n /** Whether no section holds any value (the whole field is blank). Lets a host\n * (e.g. calendar) distinguish a fully-cleared field from mid-typing, both of\n * which emit a `null` value. */\n public override readonly empty = computed(() => this.values().every(v => v === ''));\n\n /**\n * Returns the resolved CSS class string for `section-active` from the theme,\n * used to highlight the currently active section span in the template.\n */\n protected readonly activeSectionClass = computed(() => this.theme.class('section-active'));\n\n // ---- Segment descriptions for sr ----\n\n protected readonly segmentDescriptions = computed(() => {\n const parts = this._parts();\n if (!parts) return [];\n return fieldList(parts).map(field => ({\n id: `seg-${field.name}-${this.inputId()}`,\n text:\n field.kind === 'number'\n ? this.i18n['maskInput_segmentRange']({\n name: field.name,\n min: field.min,\n max: field.max,\n })\n : field.values.join(this.i18n['maskInput_optionSeparator']()),\n }));\n });\n\n /** Returns the description span id for a given field ordinal, or null if none. */\n protected sectionDescId(ord: number): string | null {\n return this.segmentDescriptions()[ord]?.id ?? null;\n }\n\n constructor() {\n super();\n\n // Reset values only when the mask STRUCTURE changes (not a min/max-only\n // tweak), synchronously before the next render, so stale values from a\n // different mask are never composed against the new parts.\n let prevStructureSig: string | null = null;\n effect(() => {\n const sig = this._structureSig();\n if (prevStructureSig !== null && prevStructureSig !== sig) {\n this.values.set([]);\n }\n prevStructureSig = sig;\n });\n\n // External value → internal: guard against write-loop by comparing to serialized form.\n // Use untracked() when reading `values` so that internal typing changes do NOT re-trigger\n // this effect — it must only fire when the external `value` model (from the parent) changes.\n effect(() => {\n const parts = this._parts();\n if (!parts) return;\n const ext = this.value() ?? '';\n const current = untracked(() =>\n isComplete(parts, this.values()) ? serialize(parts, this.values()) : ''\n );\n if (ext !== current) {\n this.values.set(deserialize(parts, ext));\n }\n });\n\n // Internal values → external value model.\n effect(() => {\n const parts = this._parts();\n if (!parts) return;\n const vals = this.values();\n if (isComplete(parts, vals)) {\n this.value.set(serialize(parts, vals));\n } else {\n this.value.set(null);\n }\n });\n\n // Wire DOM events on the proxy input.\n domEventHandler(this._proxyRef, 'beforeinput', event => this._onBeforeInput(event));\n domEventHandler(this._proxyRef, 'keydown', event => this._onKeyDown(event));\n\n // Track focus so the active-section highlight only shows while focused.\n domEventHandler(this._proxyRef, 'focus', () => this.focused.set(true));\n domEventHandler(this._proxyRef, 'blur', () => {\n this.focused.set(false);\n this.markTouched();\n });\n\n // Pointer down anywhere on the control: focus the proxy and select the\n // section nearest the pointer. Shared with field-delegated clicks via\n // `focusFromPointer`. Works standalone (no surrounding input-field).\n domEventHandler(this.element, 'pointerdown', event => {\n if (this.disabled()) return;\n event.preventDefault();\n this.focusFromPointer(event);\n });\n }\n\n /**\n * Places focus on the proxy input and selects the section nearest the\n * pointer's horizontal position. Invoked both by the control's own\n * `pointerdown` and by a surrounding `ngn-input-field` when its padding is\n * clicked (so a click \"above\" a section selects that section). Returns `true`\n * to signal the field it handled focus.\n */\n public override focusFromPointer(event: MouseEvent): boolean {\n if (this.disabled()) return false;\n this._proxyRef().nativeElement.focus();\n const ord = this._sectionIndexAt(event.clientX);\n if (ord >= 0) this.rovingGroup().setActive(ord);\n return true;\n }\n\n /** Clears every section (invoked by a surrounding field's clear button). */\n public override clearValue(): boolean {\n if (this.disabled() || this.readonly()) return false;\n this.values.set([]);\n return true;\n }\n\n /** Field ordinal of the section nearest `clientX`, or -1 when there are none. */\n private _sectionIndexAt(clientX: number): number {\n // Section spans carry role=\"spinbutton\" and appear in DOM order = field\n // ordinal order (matching the activeOrd identity mapping).\n const spans = this.element.nativeElement.querySelectorAll<HTMLElement>('[role=\"spinbutton\"]');\n const rects = Array.from(spans, el => el.getBoundingClientRect());\n return nearestSectionIndex(rects, clientX);\n }\n\n private _onBeforeInput(event: InputEvent): void {\n const parts = this._parts();\n if (!parts) return;\n if (this.disabled() || this.readonly()) return;\n\n event.preventDefault();\n\n if (event.inputType === 'insertFromPaste' || event.inputType === 'insertFromDrop') {\n const r = event.data ? paste(parts, event.data) : null;\n if (r) {\n this.values.set(r.values);\n // Advance to the next empty section or stay on last\n const fields = this._fields();\n const nextEmpty = r.values.findIndex(v => v === '');\n const targetOrd = nextEmpty >= 0 ? nextEmpty : fields.length - 1;\n this.rovingGroup().setActive(targetOrd);\n }\n return;\n }\n\n if (event.data) {\n const ord = this.activeOrd();\n const fields = this._fields();\n const f = fields[ord];\n if (!f) return;\n const current = this.values()[ord] ?? '';\n const r = typeIntoSection(f, current, event.data);\n if (r) {\n // Immutable update of the values array\n const newValues = [...this.values()];\n newValues[ord] = r.value;\n this.values.set(newValues);\n if (r.advance) {\n this.rovingGroup().next();\n }\n }\n }\n }\n\n private _onKeyDown(event: KeyboardEvent): void {\n const parts = this._parts();\n if (!parts || event.ctrlKey || event.metaKey || event.altKey) return;\n if (this.disabled() || this.readonly()) return;\n\n const ord = this.activeOrd();\n const fields = this._fields();\n const f = fields[ord];\n\n switch (event.key) {\n case 'Backspace':\n case 'Delete': {\n event.preventDefault();\n const currentVal = this.values()[ord] ?? '';\n if (currentVal === '') {\n // Already empty — step to previous section\n this.rovingGroup().prev();\n } else {\n // Clear the active section; then enforce no-gaps so any filled\n // fields after the newly-emptied one are also cleared.\n const newValues = [...this.values()];\n newValues[ord] = '';\n this.values.set(truncateGaps(newValues));\n }\n break;\n }\n case 'ArrowUp':\n case 'ArrowDown': {\n // The roving group is configured with horizontal orientation, so it\n // deliberately does NOT consume ArrowUp/ArrowDown — the mask owns them\n // for value stepping. This division is intentional, not coincidental:\n // Left/Right move between sections, Up/Down change the active value.\n event.preventDefault();\n if (!f) break;\n const dir: 1 | -1 = event.key === 'ArrowUp' ? 1 : -1;\n const newVal = stepSection(f, this.values()[ord] ?? '', dir);\n const newValues = [...this.values()];\n newValues[ord] = newVal;\n this.values.set(newValues);\n this.liveAnnouncement.set(`${f.name}: ${newVal}`);\n break;\n }\n // ArrowLeft/Right/Home/End are handled by the roving group — do not preventDefault\n }\n }\n}\n","<div [ptInt]=\"this\" [ptClass]=\"'root'\">\n <input\n #proxy\n #pg=\"ngnRovingGroup\"\n [ptInt]=\"this\"\n [ptClass]=\"'proxy'\"\n ngnRovingGroup\n rovingMode=\"activedescendant\"\n orientation=\"horizontal\"\n [attr.inputmode]=\"proxyInputMode()\"\n [attr.aria-roledescription]=\"i18n['maskInput_roleDescription']()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [disabled]=\"disabled()\"\n [attr.readonly]=\"readonly() || null\"\n tabindex=\"0\"\n />\n @for (tok of tokens(); track $index) {\n @if (tok.kind === 'sep') {\n <span [ptInt]=\"this\" [ptClass]=\"'separator'\" aria-hidden=\"true\">{{ tok.text }}</span>\n } @else {\n <span\n [ngnRovingItem]=\"pg\"\n role=\"spinbutton\"\n [attr.aria-label]=\"sectionName(tok.ord)\"\n [ptInt]=\"this\"\n [ptClass]=\"tok.placeholder ? 'section-placeholder' : 'section'\"\n [class]=\"focused() && activeOrd() === tok.ord ? activeSectionClass() : ''\"\n [attr.aria-valuenow]=\"sectionValueNow(tok.ord)\"\n [attr.aria-valuemin]=\"sectionMin(tok.ord)\"\n [attr.aria-valuemax]=\"sectionMax(tok.ord)\"\n [attr.aria-valuetext]=\"sectionValueText(tok.ord)\"\n [attr.aria-describedby]=\"sectionDescId(tok.ord)\"\n >{{ tok.text }}</span\n >\n }\n }\n @for (seg of segmentDescriptions(); track seg.id) {\n <span [id]=\"seg.id\" [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ seg.text }}</span>\n }\n <span aria-live=\"polite\" [ptInt]=\"this\" [ptClass]=\"'sr-only'\">{{ liveAnnouncement() }}</span>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -121,7 +121,7 @@ class NgnNumberInput extends ValueControlBase {
|
|
|
121
121
|
isFieldControl = true;
|
|
122
122
|
theme = this.injectThemeTemplate(inputControlTemplate, {
|
|
123
123
|
root: true,
|
|
124
|
-
invalid: () => this.
|
|
124
|
+
invalid: () => this.invalidState(),
|
|
125
125
|
empty: () => this.empty(),
|
|
126
126
|
});
|
|
127
127
|
/**
|
|
@@ -247,7 +247,7 @@ class NgnNumberInput extends ValueControlBase {
|
|
|
247
247
|
domEventHandler(this.element, 'blur', () => {
|
|
248
248
|
this._commit();
|
|
249
249
|
this.focused.set(false);
|
|
250
|
-
this.
|
|
250
|
+
this.markTouched();
|
|
251
251
|
});
|
|
252
252
|
domEventHandler(this.element, 'keydown', event => {
|
|
253
253
|
if (this.disabled() || this.readonly()) {
|
|
@@ -334,7 +334,7 @@ class NgnNumberInput extends ValueControlBase {
|
|
|
334
334
|
this._text.set(text);
|
|
335
335
|
}
|
|
336
336
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnNumberInput, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
337
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: NgnNumberInput, isStandalone: true, selector: "input[ngnNumberInput]", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, bigStep: { classPropertyName: "bigStep", publicName: "bigStep", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, formatOptions: { classPropertyName: "formatOptions", publicName: "formatOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "text", "role": "spinbutton", "inputmode": "decimal", "autocomplete": "off" }, properties: { "attr.aria-valuenow": "value() ?? null", "attr.aria-valuemin": "min() ?? null", "attr.aria-valuemax": "max() ?? null", "attr.aria-label": "label()", "attr.aria-invalid": "
|
|
337
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: NgnNumberInput, isStandalone: true, selector: "input[ngnNumberInput]", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, bigStep: { classPropertyName: "bigStep", publicName: "bigStep", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, formatOptions: { classPropertyName: "formatOptions", publicName: "formatOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "text", "role": "spinbutton", "inputmode": "decimal", "autocomplete": "off" }, properties: { "attr.aria-valuenow": "value() ?? null", "attr.aria-valuemin": "min() ?? null", "attr.aria-valuemax": "max() ?? null", "attr.aria-label": "label()", "attr.aria-invalid": "invalidState() ? \"true\" : null", "disabled": "disabled()", "readOnly": "readonly()" } }, providers: [provideSelf(NgnNumberInput)], exportAs: ["ngnNumberInput"], usesInheritance: true, ngImport: i0 });
|
|
338
338
|
}
|
|
339
339
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnNumberInput, decorators: [{
|
|
340
340
|
type: Directive,
|
|
@@ -351,7 +351,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
351
351
|
'[attr.aria-valuemin]': 'min() ?? null',
|
|
352
352
|
'[attr.aria-valuemax]': 'max() ?? null',
|
|
353
353
|
'[attr.aria-label]': 'label()',
|
|
354
|
-
'[attr.aria-invalid]': '
|
|
354
|
+
'[attr.aria-invalid]': 'invalidState() ? "true" : null',
|
|
355
355
|
'[disabled]': 'disabled()',
|
|
356
356
|
'[readOnly]': 'readonly()',
|
|
357
357
|
},
|