@tailng-ui/components 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +16 -5
- package/src/lib/feedback/empty/tng-empty.component.d.ts +16 -1
- package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -1
- package/src/lib/feedback/empty/tng-empty.component.js +47 -57
- package/src/lib/feedback/empty/tng-empty.component.js.map +1 -1
- package/src/lib/feedback/index.d.ts +0 -5
- package/src/lib/feedback/index.d.ts.map +1 -1
- package/src/lib/feedback/index.js +4 -5
- package/src/lib/feedback/index.js.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts +4 -0
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +16 -26
- package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts +4 -0
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +18 -32
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts +4 -0
- package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.component.js +14 -20
- package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -1
- package/src/lib/feedback/toast/tng-toast.component.d.ts +4 -1
- package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -1
- package/src/lib/feedback/toast/tng-toast.component.js +17 -19
- package/src/lib/feedback/toast/tng-toast.component.js.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts +4 -0
- package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.component.js +46 -49
- package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts +3 -0
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +33 -58
- package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts +3 -0
- package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.component.js +15 -26
- package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.component.d.ts +3 -0
- package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.component.js +32 -42
- package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -1
- package/src/lib/form/chips/tng-chips.component.d.ts +3 -0
- package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -1
- package/src/lib/form/chips/tng-chips.component.js +14 -19
- package/src/lib/form/chips/tng-chips.component.js.map +1 -1
- package/src/lib/form/combobox/tng-combobox.component.d.ts +3 -0
- package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -1
- package/src/lib/form/combobox/tng-combobox.component.js +10 -13
- package/src/lib/form/combobox/tng-combobox.component.js.map +1 -1
- package/src/lib/form/datepicker/tng-datepicker.component.d.ts +4 -1
- package/src/lib/form/datepicker/tng-datepicker.component.d.ts.map +1 -1
- package/src/lib/form/datepicker/tng-datepicker.component.js +58 -98
- package/src/lib/form/datepicker/tng-datepicker.component.js.map +1 -1
- package/src/lib/form/form-field/tng-form-field.component.d.ts +3 -0
- package/src/lib/form/form-field/tng-form-field.component.d.ts.map +1 -1
- package/src/lib/form/form-field/tng-form-field.component.js +28 -33
- package/src/lib/form/form-field/tng-form-field.component.js.map +1 -1
- package/src/lib/form/index.d.ts +0 -20
- package/src/lib/form/index.d.ts.map +1 -1
- package/src/lib/form/index.js +4 -20
- package/src/lib/form/index.js.map +1 -1
- package/src/lib/form/input/tng-input.component.d.ts +3 -0
- package/src/lib/form/input/tng-input.component.d.ts.map +1 -1
- package/src/lib/form/input/tng-input.component.js +49 -60
- package/src/lib/form/input/tng-input.component.js.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.component.d.ts +3 -0
- package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.component.js +55 -69
- package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -1
- package/src/lib/form/label/tng-label.component.d.ts +3 -0
- package/src/lib/form/label/tng-label.component.d.ts.map +1 -1
- package/src/lib/form/label/tng-label.component.js +12 -19
- package/src/lib/form/label/tng-label.component.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts +4 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js +40 -43
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.component.d.ts +4 -0
- package/src/lib/form/multiselect/tng-multiselect.component.d.ts.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.component.js +49 -52
- package/src/lib/form/multiselect/tng-multiselect.component.js.map +1 -1
- package/src/lib/form/radio/tng-radio.component.d.ts +3 -0
- package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -1
- package/src/lib/form/radio/tng-radio.component.js +18 -33
- package/src/lib/form/radio/tng-radio.component.js.map +1 -1
- package/src/lib/form/select/tng-select.component.d.ts +4 -0
- package/src/lib/form/select/tng-select.component.d.ts.map +1 -1
- package/src/lib/form/select/tng-select.component.js +52 -53
- package/src/lib/form/select/tng-select.component.js.map +1 -1
- package/src/lib/form/select/tng-select.slots.d.ts +5 -0
- package/src/lib/form/select/tng-select.slots.d.ts.map +1 -1
- package/src/lib/form/select/tng-select.slots.js +21 -17
- package/src/lib/form/select/tng-select.slots.js.map +1 -1
- package/src/lib/form/slider/tng-slider.component.d.ts +3 -0
- package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -1
- package/src/lib/form/slider/tng-slider.component.js +14 -27
- package/src/lib/form/slider/tng-slider.component.js.map +1 -1
- package/src/lib/form/switch/tng-switch.component.d.ts +3 -0
- package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -1
- package/src/lib/form/switch/tng-switch.component.js +15 -24
- package/src/lib/form/switch/tng-switch.component.js.map +1 -1
- package/src/lib/form/textarea/tng-textarea.component.d.ts +3 -0
- package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -1
- package/src/lib/form/textarea/tng-textarea.component.js +19 -36
- package/src/lib/form/textarea/tng-textarea.component.js.map +1 -1
- package/src/lib/form/toggle/tng-toggle.component.d.ts +3 -0
- package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -1
- package/src/lib/form/toggle/tng-toggle.component.js +41 -41
- package/src/lib/form/toggle/tng-toggle.component.js.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts +4 -0
- package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.component.js +28 -31
- package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.component.d.ts +10 -0
- package/src/lib/layout/accordion/tng-accordion.component.d.ts.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.component.js +49 -148
- package/src/lib/layout/accordion/tng-accordion.component.js.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts +3 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +10 -13
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -1
- package/src/lib/layout/card/tng-card.component.d.ts +21 -0
- package/src/lib/layout/card/tng-card.component.d.ts.map +1 -1
- package/src/lib/layout/card/tng-card.component.js +92 -136
- package/src/lib/layout/card/tng-card.component.js.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.component.d.ts +3 -0
- package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.component.js +17 -24
- package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -1
- package/src/lib/layout/drawer/tng-drawer.component.d.ts +4 -0
- package/src/lib/layout/drawer/tng-drawer.component.d.ts.map +1 -1
- package/src/lib/layout/drawer/tng-drawer.component.js +48 -51
- package/src/lib/layout/drawer/tng-drawer.component.js.map +1 -1
- package/src/lib/layout/grid/tng-grid.component.d.ts +8 -0
- package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -1
- package/src/lib/layout/grid/tng-grid.component.js +48 -110
- package/src/lib/layout/grid/tng-grid.component.js.map +1 -1
- package/src/lib/layout/index.d.ts +1 -8
- package/src/lib/layout/index.d.ts.map +1 -1
- package/src/lib/layout/index.js +5 -8
- package/src/lib/layout/index.js.map +1 -1
- package/src/lib/layout/separator/tng-separator.component.d.ts +3 -0
- package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -1
- package/src/lib/layout/separator/tng-separator.component.js +11 -16
- package/src/lib/layout/separator/tng-separator.component.js.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.component.d.ts +3 -0
- package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.component.js +10 -13
- package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts +4 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +47 -49
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts +4 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +16 -18
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts +4 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +10 -12
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts +3 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +12 -10
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts +4 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +12 -14
- package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts +4 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +23 -25
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts +5 -0
- package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.component.js +24 -26
- package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts +4 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +19 -23
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -1
- package/src/lib/navigation/index.d.ts +0 -12
- package/src/lib/navigation/index.d.ts.map +1 -1
- package/src/lib/navigation/index.js +4 -12
- package/src/lib/navigation/index.js.map +1 -1
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts +3 -0
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts.map +1 -1
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js +22 -20
- package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js.map +1 -1
- package/src/lib/navigation/menu/tng-menu.component.d.ts +5 -0
- package/src/lib/navigation/menu/tng-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/menu/tng-menu.component.js +21 -23
- package/src/lib/navigation/menu/tng-menu.component.js.map +1 -1
- package/src/lib/navigation/menubar/tng-menubar.component.d.ts +5 -0
- package/src/lib/navigation/menubar/tng-menubar.component.d.ts.map +1 -1
- package/src/lib/navigation/menubar/tng-menubar.component.js +20 -22
- package/src/lib/navigation/menubar/tng-menubar.component.js.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts +4 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +11 -13
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -1
- package/src/lib/navigation/tabs/tng-tabs.component.d.ts +5 -0
- package/src/lib/navigation/tabs/tng-tabs.component.d.ts.map +1 -1
- package/src/lib/navigation/tabs/tng-tabs.component.js +32 -34
- package/src/lib/navigation/tabs/tng-tabs.component.js.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts +4 -0
- package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.component.js +11 -13
- package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.component.d.ts +4 -0
- package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.component.js +18 -25
- package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -1
- package/src/lib/overlay/index.d.ts +0 -3
- package/src/lib/overlay/index.d.ts.map +1 -1
- package/src/lib/overlay/index.js +4 -3
- package/src/lib/overlay/index.js.map +1 -1
- package/src/lib/overlay/popover/tng-popover.component.d.ts +4 -0
- package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -1
- package/src/lib/overlay/popover/tng-popover.component.js +23 -37
- package/src/lib/overlay/popover/tng-popover.component.js.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts +4 -0
- package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.component.js +17 -21
- package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.component.d.ts +4 -1
- package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.component.js +20 -22
- package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -1
- package/src/lib/utility/badge/tng-badge.component.d.ts +4 -0
- package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -1
- package/src/lib/utility/badge/tng-badge.component.js +13 -10
- package/src/lib/utility/badge/tng-badge.component.js.map +1 -1
- package/src/lib/utility/button/tng-button.component.d.ts +4 -1
- package/src/lib/utility/button/tng-button.component.d.ts.map +1 -1
- package/src/lib/utility/button/tng-button.component.js +19 -29
- package/src/lib/utility/button/tng-button.component.js.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.component.d.ts +4 -0
- package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.component.js +73 -103
- package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.d.ts +4 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -1
- package/src/lib/utility/copy-button/tng-copy-button.component.js +28 -36
- package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -1
- package/src/lib/utility/index.d.ts +1 -9
- package/src/lib/utility/index.d.ts.map +1 -1
- package/src/lib/utility/index.js +5 -8
- package/src/lib/utility/index.js.map +1 -1
- package/src/lib/utility/tag/tng-tag.component.d.ts +4 -1
- package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -1
- package/src/lib/utility/tag/tng-tag.component.js +18 -24
- package/src/lib/utility/tag/tng-tag.component.js.map +1 -1
- package/src/lib/utility/tree/tng-tree.component.d.ts +4 -1
- package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -1
- package/src/lib/utility/tree/tng-tree.component.js +23 -25
- package/src/lib/utility/tree/tng-tree.component.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-input-otp.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/input-otp/tng-input-otp.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n Renderer2,\n signal,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n clampTngOtpValue,\n normalizeTngOtpLength,\n resolveTngOtpState,\n TngInputOtp as TngInputOtpPrimitive,\n} from '@tailng-ui/primitives';\n\nexport type TngInputOtpType = 'numeric' | 'alphanumeric' | 'custom';\nexport type TngInputOtpInputMode = 'numeric' | 'text' | 'tel' | 'decimal';\n\nconst tngOtpDigitPattern = /^\\d$/;\nconst tngOtpAlphanumericPattern = /^[a-zA-Z0-9]$/;\n\nlet tngInputOtpInstanceCounter = 0;\n\nfunction toNonGlobalRegex(pattern: RegExp): RegExp {\n const flags = pattern.flags.replace(/g/g, '');\n return new RegExp(pattern.source, flags);\n}\n\nexport function sanitizeTngOtpCharacters(\n value: string,\n mode: TngInputOtpType,\n pattern: string | RegExp | null,\n): readonly string[] {\n const compiledPattern =\n mode !== 'custom'\n ? null\n : typeof pattern === 'string'\n ? new RegExp(pattern)\n : pattern === null\n ? null\n : toNonGlobalRegex(pattern);\n\n const acceptedChars: string[] = [];\n for (const char of Array.from(value)) {\n if (mode === 'numeric' && !tngOtpDigitPattern.test(char)) {\n continue;\n }\n\n if (mode === 'alphanumeric' && !tngOtpAlphanumericPattern.test(char)) {\n continue;\n }\n\n if (compiledPattern && !compiledPattern.test(char)) {\n continue;\n }\n\n acceptedChars.push(char);\n }\n\n return acceptedChars;\n}\n\nexport function toTngOtpSlots(length: number, value: string): readonly string[] {\n const safeLength = normalizeTngOtpLength(length);\n const slots = Array.from({ length: safeLength }, () => '');\n const chars = Array.from(clampTngOtpValue(value, safeLength));\n\n for (const [index, char] of chars.entries()) {\n if (index >= safeLength) {\n break;\n }\n\n slots[index] = char;\n }\n\n return slots;\n}\n\nexport function applyTngOtpCharacters(\n value: string,\n startIndex: number,\n characters: readonly string[],\n maxLength: number,\n): string {\n const safeLength = normalizeTngOtpLength(maxLength);\n const nextChars = Array.from(clampTngOtpValue(value, safeLength));\n const safeStart = Math.max(0, Math.min(startIndex, safeLength - 1));\n\n let cursor = nextChars.length < safeLength ? Math.min(safeStart, nextChars.length) : safeStart;\n for (const char of characters) {\n if (cursor >= safeLength) {\n break;\n }\n\n if (cursor < nextChars.length) {\n nextChars[cursor] = char;\n } else {\n nextChars.push(char);\n }\n\n cursor += 1;\n }\n\n return nextChars.slice(0, safeLength).join('');\n}\n\nexport function removeTngOtpCharacter(value: string, index: number): string {\n const chars = Array.from(value);\n if (index < 0 || index >= chars.length) {\n return value;\n }\n\n chars.splice(index, 1);\n return chars.join('');\n}\n\nexport function resolveTngOtpEntryIndex(value: string, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n const safeValue = clampTngOtpValue(value, safeLength);\n if (safeValue.length >= safeLength) {\n return safeLength - 1;\n }\n\n return safeValue.length;\n}\n\nexport function resolveTngOtpEndIndex(value: string, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n const safeValue = clampTngOtpValue(value, safeLength);\n if (safeValue.length === 0) {\n return safeLength - 1;\n }\n\n return Math.max(0, safeValue.length - 1);\n}\n\nfunction clampOtpIndex(index: number, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n if (!Number.isFinite(index)) {\n return 0;\n }\n\n if (index < 0) {\n return 0;\n }\n\n if (index >= safeLength) {\n return safeLength - 1;\n }\n\n return Math.trunc(index);\n}\n\n@Component({\n selector: 'tng-input-otp',\n imports: [TngInputOtpPrimitive],\n templateUrl: './tng-input-otp.component.html',\n styleUrl: './tng-input-otp.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TngInputOtpComponent),\n multi: true,\n },\n ],\n})\nexport class TngInputOtpComponent implements AfterViewInit, ControlValueAccessor {\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private readonly generatedId = `tng-input-otp-${++tngInputOtpInstanceCounter}`;\n private resetUnlisten: (() => void) | null = null;\n private hasInitializedUncontrolled = false;\n\n private onChangeCallback: (value: string) => void = () => undefined;\n private onTouchedCallback: () => void = () => undefined;\n\n private readonly uncontrolledValue = signal('');\n private readonly formsDisabled = signal(false);\n private readonly focusedState = signal(false);\n private readonly focusVisibleState = signal(false);\n private readonly keyboardInteraction = signal(false);\n private readonly activeIndexState = signal(0);\n\n public readonly length = input<number, number | string>(6, {\n transform: (value: number | string): number =>\n normalizeTngOtpLength(typeof value === 'number' ? value : Number(value)),\n });\n public readonly valueInput = input<string | null | undefined>(undefined, { alias: 'value' });\n public readonly defaultValue = input<string>('');\n public readonly type = input<TngInputOtpType>('numeric');\n public readonly pattern = input<string | RegExp | null>(null);\n\n public readonly mask = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly disabledInput = input<boolean, boolean | string>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly invalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly autoFocus = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly selectOnFocus = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n\n public readonly placeholderChar = input<string>('');\n public readonly name = input<string | null>(null);\n public readonly id = input<string | null>(null);\n public readonly form = input<string | null>(null);\n public readonly autocomplete = input<string>('one-time-code');\n public readonly inputMode = input<TngInputOtpInputMode | null>(null);\n public readonly ariaLabel = input<string | null>(null);\n public readonly ariaLabelledby = input<string | null>(null);\n public readonly ariaDescribedby = input<string | null>(null);\n\n public readonly valueChange = output<string>();\n public readonly complete = output<string>();\n\n protected readonly disabled = computed(() => this.disabledInput() || this.formsDisabled());\n protected readonly focused = computed(() => this.focusedState());\n protected readonly focusVisible = computed(() => this.focusVisibleState());\n protected readonly activeIndex = computed(() => clampOtpIndex(this.activeIndexState(), this.length()));\n protected readonly rootId = computed(() => this.id() ?? this.generatedId);\n\n protected readonly currentValue = computed(() => {\n const controlled = this.valueInput();\n if (controlled !== undefined) {\n return this.normalizeAndClamp(controlled ?? '');\n }\n\n return this.normalizeAndClamp(this.uncontrolledValue());\n });\n\n protected readonly slots = computed(() => toTngOtpSlots(this.length(), this.currentValue()));\n protected readonly completionState = computed(() => resolveTngOtpState(this.length(), this.currentValue()));\n\n protected readonly resolvedInputMode = computed<TngInputOtpInputMode>(() => {\n const explicit = this.inputMode();\n if (explicit !== null) {\n return explicit;\n }\n\n return this.type() === 'numeric' ? 'numeric' : 'text';\n });\n\n protected readonly slotInputType = computed<'password' | 'text'>(() =>\n this.mask() ? 'password' : 'text',\n );\n\n private readonly syncUncontrolledState = effect(\n () => {\n const controlled = this.valueInput();\n const length = this.length();\n this.type();\n this.pattern();\n\n if (controlled !== undefined) {\n if (!this.focusedState()) {\n this.activeIndexState.set(\n resolveTngOtpEntryIndex(this.normalizeAndClamp(controlled ?? ''), length),\n );\n }\n\n return;\n }\n\n const normalizedDefault = this.normalizeAndClamp(this.defaultValue());\n if (!this.hasInitializedUncontrolled) {\n this.hasInitializedUncontrolled = true;\n this.uncontrolledValue.set(normalizedDefault);\n this.activeIndexState.set(resolveTngOtpEntryIndex(normalizedDefault, length));\n return;\n }\n\n const normalizedCurrent = this.normalizeAndClamp(this.uncontrolledValue());\n if (normalizedCurrent !== this.uncontrolledValue()) {\n this.uncontrolledValue.set(normalizedCurrent);\n }\n\n this.activeIndexState.update((index) => clampOtpIndex(index, length));\n },\n );\n\n public ngAfterViewInit(): void {\n this.attachFormResetListener();\n\n if (!this.autoFocus() || this.disabled()) {\n return;\n }\n\n queueMicrotask(() => {\n if (this.disabled()) {\n return;\n }\n\n this.focusSlot(resolveTngOtpEntryIndex(this.currentValue(), this.length()), this.selectOnFocus());\n });\n }\n\n public ngOnDestroy(): void {\n this.resetUnlisten?.();\n this.resetUnlisten = null;\n }\n\n public writeValue(value: string | null): void {\n const normalized = this.normalizeAndClamp(value ?? '');\n this.hasInitializedUncontrolled = true;\n this.uncontrolledValue.set(normalized);\n\n if (!this.focusedState()) {\n this.activeIndexState.set(resolveTngOtpEntryIndex(normalized, this.length()));\n }\n }\n\n public registerOnChange(fn: (value: string) => void): void {\n this.onChangeCallback = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouchedCallback = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.formsDisabled.set(isDisabled);\n }\n\n protected onSlotPointerDown(): void {\n this.keyboardInteraction.set(false);\n }\n\n protected onSlotFocus(index: number, event: FocusEvent): void {\n const target = event.target;\n const nextIndex = this.resolveEditableIndex(index);\n this.activeIndexState.set(nextIndex);\n this.focusedState.set(true);\n\n if (target instanceof HTMLElement && target.matches(':focus-visible')) {\n this.focusVisibleState.set(true);\n } else {\n this.focusVisibleState.set(this.keyboardInteraction());\n }\n\n if (this.selectOnFocus() && target instanceof HTMLInputElement) {\n target.select();\n }\n }\n\n protected onSlotBlur(event: FocusEvent): void {\n const host = this.hostRef.nativeElement;\n const relatedTarget = event.relatedTarget;\n if (relatedTarget instanceof Node && host.contains(relatedTarget)) {\n return;\n }\n\n queueMicrotask(() => {\n if (this.isFocusWithinHost()) {\n return;\n }\n\n this.focusedState.set(false);\n this.focusVisibleState.set(false);\n this.onTouchedCallback();\n });\n }\n\n protected onSlotKeydown(index: number, event: KeyboardEvent): void {\n this.keyboardInteraction.set(true);\n\n const editableIndex = this.resolveEditableIndex(index);\n const total = this.length();\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n this.focusSlot(Math.max(0, editableIndex - 1), true);\n return;\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.focusSlot(Math.min(total - 1, editableIndex + 1), true);\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n this.focusSlot(0, true);\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n this.focusSlot(resolveTngOtpEndIndex(this.currentValue(), total), true);\n return;\n }\n\n if (event.key === 'Backspace') {\n event.preventDefault();\n this.handleBackspace(editableIndex);\n return;\n }\n\n if (event.key === 'Delete') {\n event.preventDefault();\n this.handleDelete(editableIndex);\n return;\n }\n\n if ((this.disabled() || this.readonly()) && event.key.length === 1) {\n event.preventDefault();\n }\n }\n\n protected onSlotInput(index: number, event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n\n if (this.disabled() || this.readonly()) {\n target.value = this.slotValue(this.resolveEditableIndex(index));\n return;\n }\n\n const chars = sanitizeTngOtpCharacters(target.value, this.type(), this.pattern());\n if (chars.length === 0) {\n const nextValue = removeTngOtpCharacter(this.currentValue(), this.resolveEditableIndex(index));\n this.commitValue(nextValue, this.resolveEditableIndex(index));\n return;\n }\n\n const previousValue = this.currentValue();\n const totalLength = this.length();\n const editableIndex = this.resolveEditableIndex(index);\n const wasCompleteBeforeInput = previousValue.length >= totalLength;\n const wasReplacingExistingCharacter = editableIndex < previousValue.length;\n const nextValue = applyTngOtpCharacters(previousValue, editableIndex, chars, totalLength);\n const nextFocus =\n wasCompleteBeforeInput || wasReplacingExistingCharacter\n ? Math.min(totalLength - 1, editableIndex + chars.length)\n : nextValue.length >= totalLength\n ? totalLength - 1\n : Math.min(totalLength - 1, Math.max(editableIndex + chars.length, nextValue.length));\n\n this.commitValue(nextValue, nextFocus);\n }\n\n protected onSlotPaste(index: number, event: ClipboardEvent): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n const clipboardValue = event.clipboardData?.getData('text') ?? '';\n const chars = sanitizeTngOtpCharacters(clipboardValue, this.type(), this.pattern());\n if (chars.length === 0) {\n event.preventDefault();\n return;\n }\n\n event.preventDefault();\n const editableIndex = this.resolveEditableIndex(index);\n const nextValue = applyTngOtpCharacters(this.currentValue(), editableIndex, chars, this.length());\n const nextFocus =\n nextValue.length >= this.length()\n ? this.length() - 1\n : Math.min(this.length() - 1, nextValue.length);\n\n this.commitValue(nextValue, nextFocus);\n }\n\n protected slotValue(index: number): string {\n const slot = this.slots()[index];\n return slot ?? '';\n }\n\n protected slotPlaceholder(index: number): string | null {\n if (this.placeholderChar().length === 0) {\n return null;\n }\n\n return this.slotValue(index) === '' ? this.placeholderChar() : null;\n }\n\n protected slotAriaLabel(index: number): string {\n const prefix = this.ariaLabel();\n const base = prefix?.trim() ? `${prefix.trim()} - ` : '';\n return `${base}Character ${index + 1} of ${this.length()}`;\n }\n\n protected isSlotTabbable(index: number): boolean {\n return this.activeIndex() === index;\n }\n\n private handleBackspace(index: number): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n const currentValue = this.currentValue();\n if (currentValue.length === 0) {\n return;\n }\n\n if (index < currentValue.length) {\n const nextValue = removeTngOtpCharacter(currentValue, index);\n const nextFocus = Math.min(index, Math.max(0, nextValue.length));\n this.commitValue(nextValue, nextFocus);\n return;\n }\n\n const previousIndex = Math.max(0, currentValue.length - 1);\n const nextValue = removeTngOtpCharacter(currentValue, previousIndex);\n this.commitValue(nextValue, Math.max(0, previousIndex));\n }\n\n private handleDelete(index: number): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n if (index >= this.currentValue().length) {\n return;\n }\n\n const nextValue = removeTngOtpCharacter(this.currentValue(), index);\n this.commitValue(nextValue, index);\n }\n\n private commitValue(nextValue: string, nextFocusIndex: number): void {\n const previousValue = this.currentValue();\n const normalized = this.normalizeAndClamp(nextValue);\n const didChange = normalized !== previousValue;\n\n if (this.valueInput() === undefined) {\n this.uncontrolledValue.set(normalized);\n }\n\n this.activeIndexState.set(clampOtpIndex(nextFocusIndex, this.length()));\n\n if (didChange) {\n this.valueChange.emit(normalized);\n this.onChangeCallback(normalized);\n\n if (resolveTngOtpState(this.length(), normalized) === 'complete') {\n this.complete.emit(normalized);\n }\n }\n\n queueMicrotask(() => {\n this.syncSlotInputValues();\n if (!this.focusedState() && !this.isFocusWithinHost()) {\n return;\n }\n\n this.focusSlot(this.activeIndex(), this.selectOnFocus());\n });\n }\n\n private resolveEditableIndex(index: number): number {\n const safeIndex = clampOtpIndex(index, this.length());\n const currentValueLength = this.currentValue().length;\n\n if (currentValueLength >= this.length()) {\n return safeIndex;\n }\n\n return Math.min(safeIndex, currentValueLength);\n }\n\n private focusSlot(index: number, select: boolean): void {\n const safeIndex = clampOtpIndex(index, this.length());\n const slot = this.hostRef.nativeElement.querySelector<HTMLInputElement>(\n `[data-tng-otp-slot='${safeIndex}']`,\n );\n\n if (!(slot instanceof HTMLInputElement)) {\n return;\n }\n\n slot.focus();\n if (select) {\n slot.select();\n }\n\n this.activeIndexState.set(safeIndex);\n }\n\n private syncSlotInputValues(): void {\n const slotValues = this.slots();\n const slotInputs = this.hostRef.nativeElement.querySelectorAll<HTMLInputElement>('.tng-input-otp-slot');\n slotInputs.forEach((slotInput, index) => {\n slotInput.value = slotValues[index] ?? '';\n });\n }\n\n private isFocusWithinHost(): boolean {\n const ownerDocument = this.hostRef.nativeElement.ownerDocument;\n const activeElement = ownerDocument?.activeElement;\n return activeElement instanceof Node && this.hostRef.nativeElement.contains(activeElement);\n }\n\n private normalizeAndClamp(value: string): string {\n const chars = sanitizeTngOtpCharacters(value, this.type(), this.pattern());\n const safeLength = this.length();\n return chars.slice(0, safeLength).join('');\n }\n\n private attachFormResetListener(): void {\n const formId = this.form();\n const ownerForm =\n formId !== null\n ? this.hostRef.nativeElement.ownerDocument?.getElementById(formId)\n : this.hostRef.nativeElement.closest('form');\n\n if (!(ownerForm instanceof HTMLFormElement)) {\n return;\n }\n\n this.resetUnlisten?.();\n this.resetUnlisten = this.renderer.listen(ownerForm, 'reset', () => {\n if (this.valueInput() !== undefined) {\n return;\n }\n\n const resetValue = this.normalizeAndClamp(this.defaultValue());\n this.uncontrolledValue.set(resetValue);\n this.activeIndexState.set(resolveTngOtpEntryIndex(resetValue, this.length()));\n this.valueChange.emit(resetValue);\n this.onChangeCallback(resetValue);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-input-otp.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/input-otp/tng-input-otp.component.ts","../../../../../../../../libs/tailng-ui/components/src/lib/form/input-otp/tng-input-otp.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n Renderer2,\n signal,\n} from '@angular/core';\nimport { booleanAttribute } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n clampTngOtpValue,\n normalizeTngOtpLength,\n resolveTngOtpState,\n TngInputOtp as TngInputOtpPrimitive,\n} from '@tailng-ui/primitives';\n\nexport type TngInputOtpType = 'numeric' | 'alphanumeric' | 'custom';\nexport type TngInputOtpInputMode = 'numeric' | 'text' | 'tel' | 'decimal';\n\nconst tngOtpDigitPattern = /^\\d$/;\nconst tngOtpAlphanumericPattern = /^[a-zA-Z0-9]$/;\n\nlet tngInputOtpInstanceCounter = 0;\n\nfunction toNonGlobalRegex(pattern: RegExp): RegExp {\n const flags = pattern.flags.replace(/g/g, '');\n return new RegExp(pattern.source, flags);\n}\n\nexport function sanitizeTngOtpCharacters(\n value: string,\n mode: TngInputOtpType,\n pattern: string | RegExp | null,\n): readonly string[] {\n const compiledPattern =\n mode !== 'custom'\n ? null\n : typeof pattern === 'string'\n ? new RegExp(pattern)\n : pattern === null\n ? null\n : toNonGlobalRegex(pattern);\n\n const acceptedChars: string[] = [];\n for (const char of Array.from(value)) {\n if (mode === 'numeric' && !tngOtpDigitPattern.test(char)) {\n continue;\n }\n\n if (mode === 'alphanumeric' && !tngOtpAlphanumericPattern.test(char)) {\n continue;\n }\n\n if (compiledPattern && !compiledPattern.test(char)) {\n continue;\n }\n\n acceptedChars.push(char);\n }\n\n return acceptedChars;\n}\n\nexport function toTngOtpSlots(length: number, value: string): readonly string[] {\n const safeLength = normalizeTngOtpLength(length);\n const slots = Array.from({ length: safeLength }, () => '');\n const chars = Array.from(clampTngOtpValue(value, safeLength));\n\n for (const [index, char] of chars.entries()) {\n if (index >= safeLength) {\n break;\n }\n\n slots[index] = char;\n }\n\n return slots;\n}\n\nexport function applyTngOtpCharacters(\n value: string,\n startIndex: number,\n characters: readonly string[],\n maxLength: number,\n): string {\n const safeLength = normalizeTngOtpLength(maxLength);\n const nextChars = Array.from(clampTngOtpValue(value, safeLength));\n const safeStart = Math.max(0, Math.min(startIndex, safeLength - 1));\n\n let cursor = nextChars.length < safeLength ? Math.min(safeStart, nextChars.length) : safeStart;\n for (const char of characters) {\n if (cursor >= safeLength) {\n break;\n }\n\n if (cursor < nextChars.length) {\n nextChars[cursor] = char;\n } else {\n nextChars.push(char);\n }\n\n cursor += 1;\n }\n\n return nextChars.slice(0, safeLength).join('');\n}\n\nexport function removeTngOtpCharacter(value: string, index: number): string {\n const chars = Array.from(value);\n if (index < 0 || index >= chars.length) {\n return value;\n }\n\n chars.splice(index, 1);\n return chars.join('');\n}\n\nexport function resolveTngOtpEntryIndex(value: string, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n const safeValue = clampTngOtpValue(value, safeLength);\n if (safeValue.length >= safeLength) {\n return safeLength - 1;\n }\n\n return safeValue.length;\n}\n\nexport function resolveTngOtpEndIndex(value: string, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n const safeValue = clampTngOtpValue(value, safeLength);\n if (safeValue.length === 0) {\n return safeLength - 1;\n }\n\n return Math.max(0, safeValue.length - 1);\n}\n\nfunction clampOtpIndex(index: number, length: number): number {\n const safeLength = normalizeTngOtpLength(length);\n if (!Number.isFinite(index)) {\n return 0;\n }\n\n if (index < 0) {\n return 0;\n }\n\n if (index >= safeLength) {\n return safeLength - 1;\n }\n\n return Math.trunc(index);\n}\n\n@Component({\n selector: 'tng-input-otp',\n imports: [TngInputOtpPrimitive],\n templateUrl: './tng-input-otp.component.html',\n styleUrl: './tng-input-otp.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TngInputOtpComponent),\n multi: true,\n },\n ],\n})\nexport class TngInputOtpComponent implements AfterViewInit, ControlValueAccessor {\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private readonly generatedId = `tng-input-otp-${++tngInputOtpInstanceCounter}`;\n private resetUnlisten: (() => void) | null = null;\n private hasInitializedUncontrolled = false;\n\n private onChangeCallback: (value: string) => void = () => undefined;\n private onTouchedCallback: () => void = () => undefined;\n\n private readonly uncontrolledValue = signal('');\n private readonly formsDisabled = signal(false);\n private readonly focusedState = signal(false);\n private readonly focusVisibleState = signal(false);\n private readonly keyboardInteraction = signal(false);\n private readonly activeIndexState = signal(0);\n\n public readonly length = input<number, number | string>(6, {\n transform: (value: number | string): number =>\n normalizeTngOtpLength(typeof value === 'number' ? value : Number(value)),\n });\n public readonly valueInput = input<string | null | undefined>(undefined, { alias: 'value' });\n public readonly defaultValue = input<string>('');\n public readonly type = input<TngInputOtpType>('numeric');\n public readonly pattern = input<string | RegExp | null>(null);\n\n public readonly mask = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly disabledInput = input<boolean, boolean | string>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n public readonly readonly = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly invalid = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly autoFocus = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly selectOnFocus = input<boolean, boolean | string>(true, {\n transform: booleanAttribute,\n });\n\n public readonly placeholderChar = input<string>('');\n public readonly name = input<string | null>(null);\n public readonly id = input<string | null>(null);\n public readonly form = input<string | null>(null);\n public readonly autocomplete = input<string>('one-time-code');\n public readonly inputMode = input<TngInputOtpInputMode | null>(null);\n public readonly ariaLabel = input<string | null>(null);\n public readonly ariaLabelledby = input<string | null>(null);\n public readonly ariaDescribedby = input<string | null>(null);\n\n public readonly valueChange = output<string>();\n public readonly complete = output<string>();\n\n protected readonly disabled = computed(() => this.disabledInput() || this.formsDisabled());\n protected readonly focused = computed(() => this.focusedState());\n protected readonly focusVisible = computed(() => this.focusVisibleState());\n protected readonly activeIndex = computed(() => clampOtpIndex(this.activeIndexState(), this.length()));\n protected readonly rootId = computed(() => this.id() ?? this.generatedId);\n\n protected readonly currentValue = computed(() => {\n const controlled = this.valueInput();\n if (controlled !== undefined) {\n return this.normalizeAndClamp(controlled ?? '');\n }\n\n return this.normalizeAndClamp(this.uncontrolledValue());\n });\n\n protected readonly slots = computed(() => toTngOtpSlots(this.length(), this.currentValue()));\n protected readonly completionState = computed(() => resolveTngOtpState(this.length(), this.currentValue()));\n\n protected readonly resolvedInputMode = computed<TngInputOtpInputMode>(() => {\n const explicit = this.inputMode();\n if (explicit !== null) {\n return explicit;\n }\n\n return this.type() === 'numeric' ? 'numeric' : 'text';\n });\n\n protected readonly slotInputType = computed<'password' | 'text'>(() =>\n this.mask() ? 'password' : 'text',\n );\n\n private readonly syncUncontrolledState = effect(\n () => {\n const controlled = this.valueInput();\n const length = this.length();\n this.type();\n this.pattern();\n\n if (controlled !== undefined) {\n if (!this.focusedState()) {\n this.activeIndexState.set(\n resolveTngOtpEntryIndex(this.normalizeAndClamp(controlled ?? ''), length),\n );\n }\n\n return;\n }\n\n const normalizedDefault = this.normalizeAndClamp(this.defaultValue());\n if (!this.hasInitializedUncontrolled) {\n this.hasInitializedUncontrolled = true;\n this.uncontrolledValue.set(normalizedDefault);\n this.activeIndexState.set(resolveTngOtpEntryIndex(normalizedDefault, length));\n return;\n }\n\n const normalizedCurrent = this.normalizeAndClamp(this.uncontrolledValue());\n if (normalizedCurrent !== this.uncontrolledValue()) {\n this.uncontrolledValue.set(normalizedCurrent);\n }\n\n this.activeIndexState.update((index) => clampOtpIndex(index, length));\n },\n );\n\n public ngAfterViewInit(): void {\n this.attachFormResetListener();\n\n if (!this.autoFocus() || this.disabled()) {\n return;\n }\n\n queueMicrotask(() => {\n if (this.disabled()) {\n return;\n }\n\n this.focusSlot(resolveTngOtpEntryIndex(this.currentValue(), this.length()), this.selectOnFocus());\n });\n }\n\n public ngOnDestroy(): void {\n this.resetUnlisten?.();\n this.resetUnlisten = null;\n }\n\n public writeValue(value: string | null): void {\n const normalized = this.normalizeAndClamp(value ?? '');\n this.hasInitializedUncontrolled = true;\n this.uncontrolledValue.set(normalized);\n\n if (!this.focusedState()) {\n this.activeIndexState.set(resolveTngOtpEntryIndex(normalized, this.length()));\n }\n }\n\n public registerOnChange(fn: (value: string) => void): void {\n this.onChangeCallback = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouchedCallback = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.formsDisabled.set(isDisabled);\n }\n\n protected onSlotPointerDown(): void {\n this.keyboardInteraction.set(false);\n }\n\n protected onSlotFocus(index: number, event: FocusEvent): void {\n const target = event.target;\n const nextIndex = this.resolveEditableIndex(index);\n this.activeIndexState.set(nextIndex);\n this.focusedState.set(true);\n\n if (target instanceof HTMLElement && target.matches(':focus-visible')) {\n this.focusVisibleState.set(true);\n } else {\n this.focusVisibleState.set(this.keyboardInteraction());\n }\n\n if (this.selectOnFocus() && target instanceof HTMLInputElement) {\n target.select();\n }\n }\n\n protected onSlotBlur(event: FocusEvent): void {\n const host = this.hostRef.nativeElement;\n const relatedTarget = event.relatedTarget;\n if (relatedTarget instanceof Node && host.contains(relatedTarget)) {\n return;\n }\n\n queueMicrotask(() => {\n if (this.isFocusWithinHost()) {\n return;\n }\n\n this.focusedState.set(false);\n this.focusVisibleState.set(false);\n this.onTouchedCallback();\n });\n }\n\n protected onSlotKeydown(index: number, event: KeyboardEvent): void {\n this.keyboardInteraction.set(true);\n\n const editableIndex = this.resolveEditableIndex(index);\n const total = this.length();\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n this.focusSlot(Math.max(0, editableIndex - 1), true);\n return;\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n this.focusSlot(Math.min(total - 1, editableIndex + 1), true);\n return;\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n this.focusSlot(0, true);\n return;\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n this.focusSlot(resolveTngOtpEndIndex(this.currentValue(), total), true);\n return;\n }\n\n if (event.key === 'Backspace') {\n event.preventDefault();\n this.handleBackspace(editableIndex);\n return;\n }\n\n if (event.key === 'Delete') {\n event.preventDefault();\n this.handleDelete(editableIndex);\n return;\n }\n\n if ((this.disabled() || this.readonly()) && event.key.length === 1) {\n event.preventDefault();\n }\n }\n\n protected onSlotInput(index: number, event: Event): void {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n\n if (this.disabled() || this.readonly()) {\n target.value = this.slotValue(this.resolveEditableIndex(index));\n return;\n }\n\n const chars = sanitizeTngOtpCharacters(target.value, this.type(), this.pattern());\n if (chars.length === 0) {\n const nextValue = removeTngOtpCharacter(this.currentValue(), this.resolveEditableIndex(index));\n this.commitValue(nextValue, this.resolveEditableIndex(index));\n return;\n }\n\n const previousValue = this.currentValue();\n const totalLength = this.length();\n const editableIndex = this.resolveEditableIndex(index);\n const wasCompleteBeforeInput = previousValue.length >= totalLength;\n const wasReplacingExistingCharacter = editableIndex < previousValue.length;\n const nextValue = applyTngOtpCharacters(previousValue, editableIndex, chars, totalLength);\n const nextFocus =\n wasCompleteBeforeInput || wasReplacingExistingCharacter\n ? Math.min(totalLength - 1, editableIndex + chars.length)\n : nextValue.length >= totalLength\n ? totalLength - 1\n : Math.min(totalLength - 1, Math.max(editableIndex + chars.length, nextValue.length));\n\n this.commitValue(nextValue, nextFocus);\n }\n\n protected onSlotPaste(index: number, event: ClipboardEvent): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n const clipboardValue = event.clipboardData?.getData('text') ?? '';\n const chars = sanitizeTngOtpCharacters(clipboardValue, this.type(), this.pattern());\n if (chars.length === 0) {\n event.preventDefault();\n return;\n }\n\n event.preventDefault();\n const editableIndex = this.resolveEditableIndex(index);\n const nextValue = applyTngOtpCharacters(this.currentValue(), editableIndex, chars, this.length());\n const nextFocus =\n nextValue.length >= this.length()\n ? this.length() - 1\n : Math.min(this.length() - 1, nextValue.length);\n\n this.commitValue(nextValue, nextFocus);\n }\n\n protected slotValue(index: number): string {\n const slot = this.slots()[index];\n return slot ?? '';\n }\n\n protected slotPlaceholder(index: number): string | null {\n if (this.placeholderChar().length === 0) {\n return null;\n }\n\n return this.slotValue(index) === '' ? this.placeholderChar() : null;\n }\n\n protected slotAriaLabel(index: number): string {\n const prefix = this.ariaLabel();\n const base = prefix?.trim() ? `${prefix.trim()} - ` : '';\n return `${base}Character ${index + 1} of ${this.length()}`;\n }\n\n protected isSlotTabbable(index: number): boolean {\n return this.activeIndex() === index;\n }\n\n private handleBackspace(index: number): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n const currentValue = this.currentValue();\n if (currentValue.length === 0) {\n return;\n }\n\n if (index < currentValue.length) {\n const nextValue = removeTngOtpCharacter(currentValue, index);\n const nextFocus = Math.min(index, Math.max(0, nextValue.length));\n this.commitValue(nextValue, nextFocus);\n return;\n }\n\n const previousIndex = Math.max(0, currentValue.length - 1);\n const nextValue = removeTngOtpCharacter(currentValue, previousIndex);\n this.commitValue(nextValue, Math.max(0, previousIndex));\n }\n\n private handleDelete(index: number): void {\n if (this.disabled() || this.readonly()) {\n return;\n }\n\n if (index >= this.currentValue().length) {\n return;\n }\n\n const nextValue = removeTngOtpCharacter(this.currentValue(), index);\n this.commitValue(nextValue, index);\n }\n\n private commitValue(nextValue: string, nextFocusIndex: number): void {\n const previousValue = this.currentValue();\n const normalized = this.normalizeAndClamp(nextValue);\n const didChange = normalized !== previousValue;\n\n if (this.valueInput() === undefined) {\n this.uncontrolledValue.set(normalized);\n }\n\n this.activeIndexState.set(clampOtpIndex(nextFocusIndex, this.length()));\n\n if (didChange) {\n this.valueChange.emit(normalized);\n this.onChangeCallback(normalized);\n\n if (resolveTngOtpState(this.length(), normalized) === 'complete') {\n this.complete.emit(normalized);\n }\n }\n\n queueMicrotask(() => {\n this.syncSlotInputValues();\n if (!this.focusedState() && !this.isFocusWithinHost()) {\n return;\n }\n\n this.focusSlot(this.activeIndex(), this.selectOnFocus());\n });\n }\n\n private resolveEditableIndex(index: number): number {\n const safeIndex = clampOtpIndex(index, this.length());\n const currentValueLength = this.currentValue().length;\n\n if (currentValueLength >= this.length()) {\n return safeIndex;\n }\n\n return Math.min(safeIndex, currentValueLength);\n }\n\n private focusSlot(index: number, select: boolean): void {\n const safeIndex = clampOtpIndex(index, this.length());\n const slot = this.hostRef.nativeElement.querySelector<HTMLInputElement>(\n `[data-tng-otp-slot='${safeIndex}']`,\n );\n\n if (!(slot instanceof HTMLInputElement)) {\n return;\n }\n\n slot.focus();\n if (select) {\n slot.select();\n }\n\n this.activeIndexState.set(safeIndex);\n }\n\n private syncSlotInputValues(): void {\n const slotValues = this.slots();\n const slotInputs = this.hostRef.nativeElement.querySelectorAll<HTMLInputElement>('.tng-input-otp-slot');\n slotInputs.forEach((slotInput, index) => {\n slotInput.value = slotValues[index] ?? '';\n });\n }\n\n private isFocusWithinHost(): boolean {\n const ownerDocument = this.hostRef.nativeElement.ownerDocument;\n const activeElement = ownerDocument?.activeElement;\n return activeElement instanceof Node && this.hostRef.nativeElement.contains(activeElement);\n }\n\n private normalizeAndClamp(value: string): string {\n const chars = sanitizeTngOtpCharacters(value, this.type(), this.pattern());\n const safeLength = this.length();\n return chars.slice(0, safeLength).join('');\n }\n\n private attachFormResetListener(): void {\n const formId = this.form();\n const ownerForm =\n formId !== null\n ? this.hostRef.nativeElement.ownerDocument?.getElementById(formId)\n : this.hostRef.nativeElement.closest('form');\n\n if (!(ownerForm instanceof HTMLFormElement)) {\n return;\n }\n\n this.resetUnlisten?.();\n this.resetUnlisten = this.renderer.listen(ownerForm, 'reset', () => {\n if (this.valueInput() !== undefined) {\n return;\n }\n\n const resetValue = this.normalizeAndClamp(this.defaultValue());\n this.uncontrolledValue.set(resetValue);\n this.activeIndexState.set(resolveTngOtpEntryIndex(resetValue, this.length()));\n this.valueChange.emit(resetValue);\n this.onChangeCallback(resetValue);\n });\n }\n}\n","<div\n tngInputOtp\n class=\"tng-input-otp-root\"\n [id]=\"rootId()\"\n [length]=\"length()\"\n [value]=\"currentValue()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [invalid]=\"invalid()\"\n [focused]=\"focused()\"\n [focusVisible]=\"focusVisible()\"\n [activeIndex]=\"activeIndex()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\n>\n @for (slot of slots(); track $index) {\n <input\n class=\"tng-input-otp-slot\"\n [attr.id]=\"rootId() + '-slot-' + $index\"\n [attr.data-tng-otp-slot]=\"$index\"\n [tabIndex]=\"isSlotTabbable($index) ? 0 : -1\"\n [value]=\"slotValue($index)\"\n [attr.placeholder]=\"slotPlaceholder($index)\"\n [type]=\"slotInputType()\"\n [inputMode]=\"resolvedInputMode()\"\n [attr.autocomplete]=\"$index === 0 ? autocomplete() : 'off'\"\n [attr.aria-label]=\"slotAriaLabel($index)\"\n [readonly]=\"readonly()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n maxlength=\"1\"\n (mousedown)=\"onSlotPointerDown()\"\n (focus)=\"onSlotFocus($index, $event)\"\n (blur)=\"onSlotBlur($event)\"\n (keydown)=\"onSlotKeydown($index, $event)\"\n (input)=\"onSlotInput($index, $event)\"\n (paste)=\"onSlotPaste($index, $event)\"\n />\n }\n\n <input\n class=\"tng-input-otp-hidden-input\"\n type=\"text\"\n [value]=\"currentValue()\"\n [attr.name]=\"name()\"\n [attr.form]=\"form()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [attr.aria-hidden]=\"'true'\"\n tabindex=\"-1\"\n />\n</div>\n"]}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
1
2
|
export declare function resolveTngLabelForAttr(forId: string): string | null;
|
|
2
3
|
export declare class TngLabelComponent {
|
|
3
4
|
readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
|
|
4
5
|
readonly forId: import("@angular/core").InputSignal<string>;
|
|
5
6
|
readonly required: import("@angular/core").InputSignalWithTransform<boolean, string | boolean>;
|
|
6
7
|
resolveForAttr(): string | null;
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngLabelComponent, never>;
|
|
9
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TngLabelComponent, "tng-label", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "forId": { "alias": "forId"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
7
10
|
}
|
|
8
11
|
//# sourceMappingURL=tng-label.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-label.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/label/tng-label.component.ts"],"names":[],"mappings":"AAGA,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,qBAMa,iBAAiB;IAC5B,SAAgB,QAAQ,8EAErB;IACH,SAAgB,KAAK,8CAAqB;IAC1C,SAAgB,QAAQ,8EAErB;IAEI,cAAc,IAAI,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"tng-label.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/label/tng-label.component.ts"],"names":[],"mappings":";AAGA,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,qBAMa,iBAAiB;IAC5B,SAAgB,QAAQ,8EAErB;IACH,SAAgB,KAAK,8CAAqB;IAC1C,SAAgB,QAAQ,8EAErB;IAEI,cAAc,IAAI,MAAM,GAAG,IAAI;yCAT3B,iBAAiB;2CAAjB,iBAAiB;CAY7B"}
|
|
@@ -1,29 +1,22 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
1
|
import { booleanAttribute, Component, input } from '@angular/core';
|
|
3
2
|
import { TngLabel as TngLabelPrimitive } from '@tailng-ui/primitives';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
4
|
export function resolveTngLabelForAttr(forId) {
|
|
5
5
|
const trimmedId = forId.trim();
|
|
6
6
|
return trimmedId.length > 0 ? trimmedId : null;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
disabled = input(false, {
|
|
10
|
-
|
|
11
|
-
});
|
|
12
|
-
forId = input('');
|
|
13
|
-
required = input(false, {
|
|
14
|
-
transform: booleanAttribute,
|
|
15
|
-
});
|
|
8
|
+
export class TngLabelComponent {
|
|
9
|
+
disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : {}), transform: booleanAttribute });
|
|
10
|
+
forId = input('', ...(ngDevMode ? [{ debugName: "forId" }] : []));
|
|
11
|
+
required = input(false, { ...(ngDevMode ? { debugName: "required" } : {}), transform: booleanAttribute });
|
|
16
12
|
resolveForAttr() {
|
|
17
13
|
return resolveTngLabelForAttr(this.forId());
|
|
18
14
|
}
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
})
|
|
27
|
-
], TngLabelComponent);
|
|
28
|
-
export { TngLabelComponent };
|
|
15
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
16
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngLabelComponent, isStandalone: true, selector: "tng-label", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, forId: { classPropertyName: "forId", publicName: "forId", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<label\n tngLabel\n class=\"tng-label\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.for]=\"resolveForAttr()\"\n>\n <span class=\"tng-label-text\">\n <ng-content />\n </span>\n @if (required()) {\n <span class=\"tng-label-required\" aria-hidden=\"true\">*</span>\n }\n</label>\n", styles: [":host {\n display: inline-flex;\n}\n\n.tng-label {\n align-items: center;\n color: var(--tng-semantic-foreground-primary);\n display: inline-flex;\n font-size: 0.875rem;\n font-weight: 600;\n gap: 0.3rem;\n}\n\n.tng-label-required {\n color: var(--tng-semantic-accent-danger);\n font-weight: 700;\n}\n"], dependencies: [{ kind: "directive", type: TngLabelPrimitive, selector: "label[tngLabel]", inputs: ["disabled", "required"], exportAs: ["tngLabel"] }] });
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngLabelComponent, decorators: [{
|
|
19
|
+
type: Component,
|
|
20
|
+
args: [{ selector: 'tng-label', imports: [TngLabelPrimitive], template: "<label\n tngLabel\n class=\"tng-label\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.for]=\"resolveForAttr()\"\n>\n <span class=\"tng-label-text\">\n <ng-content />\n </span>\n @if (required()) {\n <span class=\"tng-label-required\" aria-hidden=\"true\">*</span>\n }\n</label>\n", styles: [":host {\n display: inline-flex;\n}\n\n.tng-label {\n align-items: center;\n color: var(--tng-semantic-foreground-primary);\n display: inline-flex;\n font-size: 0.875rem;\n font-weight: 600;\n gap: 0.3rem;\n}\n\n.tng-label-required {\n color: var(--tng-semantic-accent-danger);\n font-weight: 700;\n}\n"] }]
|
|
21
|
+
}], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], forId: [{ type: i0.Input, args: [{ isSignal: true, alias: "forId", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }] } });
|
|
29
22
|
//# sourceMappingURL=tng-label.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-label.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/label/tng-label.component.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tng-label.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/label/tng-label.component.ts","../../../../../../../../libs/tailng-ui/components/src/lib/form/label/tng-label.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;;AAEtE,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAQD,MAAM,OAAO,iBAAiB;IACZ,QAAQ,GAAG,KAAK,CAA4B,KAAK,qDAC/D,SAAS,EAAE,gBAAgB,GAC3B,CAAC;IACa,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC,CAAC;IAC1B,QAAQ,GAAG,KAAK,CAA4B,KAAK,qDAC/D,SAAS,EAAE,gBAAgB,GAC3B,CAAC;IAEI,cAAc;QACnB,OAAO,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;uGAXU,iBAAiB;2FAAjB,iBAAiB,2cCd9B,0TAcA,gXDJY,iBAAiB;;2FAIhB,iBAAiB;kBAN7B,SAAS;+BACE,WAAW,WACZ,CAAC,iBAAiB,CAAC","sourcesContent":["import { booleanAttribute, Component, input } from '@angular/core';\nimport { TngLabel as TngLabelPrimitive } from '@tailng-ui/primitives';\n\nexport function resolveTngLabelForAttr(forId: string): string | null {\n const trimmedId = forId.trim();\n return trimmedId.length > 0 ? trimmedId : null;\n}\n\n@Component({\n selector: 'tng-label',\n imports: [TngLabelPrimitive],\n templateUrl: './tng-label.component.html',\n styleUrl: './tng-label.component.css',\n})\nexport class TngLabelComponent {\n public readonly disabled = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n public readonly forId = input<string>('');\n public readonly required = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public resolveForAttr(): string | null {\n return resolveTngLabelForAttr(this.forId());\n }\n}\n","<label\n tngLabel\n class=\"tng-label\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.for]=\"resolveForAttr()\"\n>\n <span class=\"tng-label-text\">\n <ng-content />\n </span>\n @if (required()) {\n <span class=\"tng-label-required\" aria-hidden=\"true\">*</span>\n }\n</label>\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { TemplateRef } from '@angular/core';
|
|
2
2
|
import { TngMultiAutocomplete } from '@tailng-ui/primitives';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@tailng-ui/primitives";
|
|
3
5
|
export type TngMultiAutocompleteGetValue<O, V> = (opt: O) => V;
|
|
4
6
|
export type TngMultiAutocompleteGetLabel<O> = (opt: O) => string;
|
|
5
7
|
export type TngMultiAutocompleteIsDisabled<O> = (opt: O) => boolean;
|
|
@@ -50,6 +52,8 @@ export declare class TngMultiAutocompleteComponent<O = unknown, V = unknown> {
|
|
|
50
52
|
clear(): void;
|
|
51
53
|
private findOption;
|
|
52
54
|
private hasSelectedValue;
|
|
55
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngMultiAutocompleteComponent<any, any>, never>;
|
|
56
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TngMultiAutocompleteComponent<any, any>, "tng-multi-autocomplete", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "getOptionValue": { "alias": "getOptionValue"; "required": false; "isSignal": true; }; "getOptionLabel": { "alias": "getOptionLabel"; "required": false; "isSignal": true; }; "isOptionDisabled": { "alias": "isOptionDisabled"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, {}, ["chipTpl", "optionTpl"], never, true, [{ directive: typeof i1.TngMultiAutocomplete; inputs: { "open": "open"; "value": "value"; "disabled": "disabled"; "loading": "loading"; "invalid": "invalid"; }; outputs: { "openChange": "openChange"; "valueChange": "valueChange"; }; }]>;
|
|
53
57
|
}
|
|
54
58
|
export {};
|
|
55
59
|
//# sourceMappingURL=tng-multi-autocomplete.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAIZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,oBAAoB,EAOrB,MAAM,uBAAuB,CAAC
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAIZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,oBAAoB,EAOrB,MAAM,uBAAuB,CAAC;;;AAE/B,MAAM,MAAM,4BAA4B,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC/D,MAAM,MAAM,4BAA4B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;AACjE,MAAM,MAAM,8BAA8B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AACpE,MAAM,MAAM,2BAA2B,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AAEhF,MAAM,MAAM,+BAA+B,CAAC,CAAC,EAAE,CAAC,IAAI;IAClD,SAAS,EAAE;QACT,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;QACjB,KAAK,EAAE,CAAC,CAAC;QACT,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;KAC/B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iCAAiC,CAAC,CAAC,EAAE,CAAC,IAAI;IACpD,SAAS,EAAE;QACT,MAAM,EAAE,CAAC,CAAC;QACV,KAAK,EAAE,CAAC,CAAC;QACT,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI;IACxB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,qBAqBa,6BAA6B,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACjE,SAAS,CAAC,QAAQ,CAAC,SAAS,0BAAyD;IAErF,QAAQ,CAAC,OAAO,oDAA2B;IAC3C,QAAQ,CAAC,WAAW,8CAAoC;IACxD,QAAQ,CAAC,SAAS,8CAA+B;IACjD,QAAQ,CAAC,SAAS,8CAAuC;IAEzD,QAAQ,CAAC,cAAc,0EAErB;IACF,QAAQ,CAAC,cAAc,uEAOrB;IACF,QAAQ,CAAC,gBAAgB,yEAGvB;IACF,QAAQ,CAAC,OAAO,sEAGb;IAGH,OAAO,CAAC,EAAE,WAAW,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAG7D,SAAS,CAAC,EAAE,WAAW,CAAC,iCAAiC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjE,SAAS,CAAC,QAAQ,CAAC,aAAa,gEAa7B;IAEH,SAAS,CAAC,QAAQ,CAAC,eAAe,+CAmB/B;IAEH,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC,EAAE,CAAC,CAAC;IAWtF,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,iCAAiC,CAAC,CAAC,EAAE,CAAC,CAAC;IAexE,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAI9B,kBAAkB,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAIjC,kBAAkB,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAIjC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,gBAAgB;yCA1Hb,6BAA6B;2CAA7B,6BAA6B;CAgIzC"}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
1
|
import { Component, ContentChild, TemplateRef, computed, inject, input, } from '@angular/core';
|
|
3
2
|
import { NgTemplateOutlet } from '@angular/common';
|
|
4
3
|
import { TngMultiAutocomplete, TngMultiAutocompleteChip, TngMultiAutocompleteContent, TngMultiAutocompleteListbox, TngMultiAutocompleteOption, TngMultiAutocompleteOverlay, TngMultiAutocompleteTrigger, } from '@tailng-ui/primitives';
|
|
5
|
-
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@tailng-ui/primitives";
|
|
6
|
+
export class TngMultiAutocompleteComponent {
|
|
6
7
|
primitive = inject(TngMultiAutocomplete);
|
|
7
|
-
options = input([]);
|
|
8
|
-
placeholder = input('Type to search…');
|
|
9
|
-
emptyText = input('No matches');
|
|
10
|
-
ariaLabel = input('Multi autocomplete');
|
|
11
|
-
getOptionValue = input(((opt) => opt?.value));
|
|
8
|
+
options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
|
|
9
|
+
placeholder = input('Type to search…', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
|
|
10
|
+
emptyText = input('No matches', ...(ngDevMode ? [{ debugName: "emptyText" }] : []));
|
|
11
|
+
ariaLabel = input('Multi autocomplete', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
|
|
12
|
+
getOptionValue = input(((opt) => opt?.value), ...(ngDevMode ? [{ debugName: "getOptionValue" }] : []));
|
|
12
13
|
getOptionLabel = input(((opt) => String(opt?.label ??
|
|
13
14
|
opt?.value ??
|
|
14
|
-
opt)));
|
|
15
|
-
isOptionDisabled = input(((opt) => !!opt?.disabled));
|
|
15
|
+
opt)), ...(ngDevMode ? [{ debugName: "getOptionLabel" }] : []));
|
|
16
|
+
isOptionDisabled = input(((opt) => !!opt?.disabled), ...(ngDevMode ? [{ debugName: "isOptionDisabled" }] : []));
|
|
16
17
|
trackBy = input((_, opt) => {
|
|
17
18
|
const o = opt;
|
|
18
19
|
return o?.['value'] ?? o?.['id'] ?? opt;
|
|
19
|
-
});
|
|
20
|
+
}, ...(ngDevMode ? [{ debugName: "trackBy" }] : []));
|
|
20
21
|
chipTpl;
|
|
21
22
|
optionTpl;
|
|
22
23
|
selectedItems = computed(() => {
|
|
@@ -31,7 +32,7 @@ let TngMultiAutocompleteComponent = class TngMultiAutocompleteComponent {
|
|
|
31
32
|
trackId: value,
|
|
32
33
|
};
|
|
33
34
|
});
|
|
34
|
-
});
|
|
35
|
+
}, ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
|
|
35
36
|
filteredOptions = computed(() => {
|
|
36
37
|
const q = this.primitive.query().toLowerCase().trim();
|
|
37
38
|
const list = this.options();
|
|
@@ -44,7 +45,7 @@ let TngMultiAutocompleteComponent = class TngMultiAutocompleteComponent {
|
|
|
44
45
|
const pinnedSelected = matches.filter((opt) => this.hasSelectedValue(getValue(opt), selected));
|
|
45
46
|
const remaining = matches.filter((opt) => !this.hasSelectedValue(getValue(opt), selected));
|
|
46
47
|
return [...pinnedSelected, ...remaining];
|
|
47
|
-
});
|
|
48
|
+
}, ...(ngDevMode ? [{ debugName: "filteredOptions" }] : []));
|
|
48
49
|
chipContext(item) {
|
|
49
50
|
return {
|
|
50
51
|
$implicit: {
|
|
@@ -91,35 +92,31 @@ let TngMultiAutocompleteComponent = class TngMultiAutocompleteComponent {
|
|
|
91
92
|
hasSelectedValue(value, selected = this.primitive.value()) {
|
|
92
93
|
return selected.some((entry) => Object.is(entry, value));
|
|
93
94
|
}
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
styleUrl: './tng-multi-autocomplete.component.css',
|
|
122
|
-
})
|
|
123
|
-
], TngMultiAutocompleteComponent);
|
|
124
|
-
export { TngMultiAutocompleteComponent };
|
|
95
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngMultiAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
96
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngMultiAutocompleteComponent, isStandalone: true, selector: "tng-multi-autocomplete", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, getOptionValue: { classPropertyName: "getOptionValue", publicName: "getOptionValue", isSignal: true, isRequired: false, transformFunction: null }, getOptionLabel: { classPropertyName: "getOptionLabel", publicName: "getOptionLabel", isSignal: true, isRequired: false, transformFunction: null }, isOptionDisabled: { classPropertyName: "isOptionDisabled", publicName: "isOptionDisabled", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "chipTpl", first: true, predicate: ["tngMultiAutocompleteChipTpl"], descendants: true, read: TemplateRef }, { propertyName: "optionTpl", first: true, predicate: ["tngMultiAutocompleteOptionTpl"], descendants: true, read: TemplateRef }], hostDirectives: [{ directive: i1.TngMultiAutocomplete, inputs: ["open", "open", "value", "value", "disabled", "disabled", "loading", "loading", "invalid", "invalid"], outputs: ["openChange", "openChange", "valueChange", "valueChange"] }], ngImport: i0, template: "@for (item of selectedItems(); track item.trackId) {\n <span tngMultiAutocompleteChip [tngValue]=\"item.value\">\n @if (chipTpl) {\n <ng-container *ngTemplateOutlet=\"chipTpl; context: chipContext(item)\" />\n } @else {\n <span>{{ item.label }}</span>\n <button\n type=\"button\"\n [attr.aria-label]=\"'Remove ' + item.label\"\n (click)=\"removeSelectedItem(item.value); $event.preventDefault(); $event.stopPropagation()\"\n >\n \u00D7\n </button>\n }\n </span>\n}\n\n<input\n tngMultiAutocompleteTrigger\n type=\"text\"\n [value]=\"primitive.query()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.aria-label]=\"ariaLabel()\"\n autocomplete=\"off\"\n/>\n\n<div tngMultiAutocompleteContent>\n <div tngMultiAutocompleteOverlay>\n <ul tngMultiAutocompleteListbox>\n @for (opt of filteredOptions(); track trackBy()($index, opt)) {\n <li\n tngMultiAutocompleteOption\n [tngValue]=\"getOptionValue()(opt)\"\n [disabled]=\"isOptionDisabled()(opt)\"\n >\n @if (optionTpl) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: optionContext(opt)\" />\n } @else {\n {{ getOptionLabel()(opt) }}\n }\n </li>\n }\n @if (filteredOptions().length === 0) {\n <li data-slot=\"multi-autocomplete-empty\">{{ emptyText() }}</li>\n }\n </ul>\n </div>\n</div>\n", styles: [":host {\n display: block;\n}\n\n[data-slot='multi-autocomplete-chip'] button {\n border: 0;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: inherit;\n line-height: 1;\n padding: 0;\n}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TngMultiAutocompleteChip, selector: "[tngMultiAutocompleteChip]", inputs: ["tngValue"], exportAs: ["tngMultiAutocompleteChip"] }, { kind: "directive", type: TngMultiAutocompleteTrigger, selector: "[tngMultiAutocompleteTrigger]", exportAs: ["tngMultiAutocompleteTrigger"] }, { kind: "directive", type: TngMultiAutocompleteContent, selector: "[tngMultiAutocompleteContent]", exportAs: ["tngMultiAutocompleteContent"] }, { kind: "directive", type: TngMultiAutocompleteOverlay, selector: "[tngMultiAutocompleteOverlay]", exportAs: ["tngMultiAutocompleteOverlay"] }, { kind: "directive", type: TngMultiAutocompleteListbox, selector: "[tngMultiAutocompleteListbox]" }, { kind: "directive", type: TngMultiAutocompleteOption, selector: "[tngMultiAutocompleteOption]" }] });
|
|
97
|
+
}
|
|
98
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngMultiAutocompleteComponent, decorators: [{
|
|
99
|
+
type: Component,
|
|
100
|
+
args: [{ selector: 'tng-multi-autocomplete', imports: [
|
|
101
|
+
NgTemplateOutlet,
|
|
102
|
+
TngMultiAutocompleteChip,
|
|
103
|
+
TngMultiAutocompleteTrigger,
|
|
104
|
+
TngMultiAutocompleteContent,
|
|
105
|
+
TngMultiAutocompleteOverlay,
|
|
106
|
+
TngMultiAutocompleteListbox,
|
|
107
|
+
TngMultiAutocompleteOption,
|
|
108
|
+
], hostDirectives: [
|
|
109
|
+
{
|
|
110
|
+
directive: TngMultiAutocomplete,
|
|
111
|
+
inputs: ['open', 'value', 'disabled', 'loading', 'invalid'],
|
|
112
|
+
outputs: ['openChange', 'valueChange'],
|
|
113
|
+
},
|
|
114
|
+
], template: "@for (item of selectedItems(); track item.trackId) {\n <span tngMultiAutocompleteChip [tngValue]=\"item.value\">\n @if (chipTpl) {\n <ng-container *ngTemplateOutlet=\"chipTpl; context: chipContext(item)\" />\n } @else {\n <span>{{ item.label }}</span>\n <button\n type=\"button\"\n [attr.aria-label]=\"'Remove ' + item.label\"\n (click)=\"removeSelectedItem(item.value); $event.preventDefault(); $event.stopPropagation()\"\n >\n \u00D7\n </button>\n }\n </span>\n}\n\n<input\n tngMultiAutocompleteTrigger\n type=\"text\"\n [value]=\"primitive.query()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.aria-label]=\"ariaLabel()\"\n autocomplete=\"off\"\n/>\n\n<div tngMultiAutocompleteContent>\n <div tngMultiAutocompleteOverlay>\n <ul tngMultiAutocompleteListbox>\n @for (opt of filteredOptions(); track trackBy()($index, opt)) {\n <li\n tngMultiAutocompleteOption\n [tngValue]=\"getOptionValue()(opt)\"\n [disabled]=\"isOptionDisabled()(opt)\"\n >\n @if (optionTpl) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: optionContext(opt)\" />\n } @else {\n {{ getOptionLabel()(opt) }}\n }\n </li>\n }\n @if (filteredOptions().length === 0) {\n <li data-slot=\"multi-autocomplete-empty\">{{ emptyText() }}</li>\n }\n </ul>\n </div>\n</div>\n", styles: [":host {\n display: block;\n}\n\n[data-slot='multi-autocomplete-chip'] button {\n border: 0;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: inherit;\n line-height: 1;\n padding: 0;\n}\n"] }]
|
|
115
|
+
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], getOptionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "getOptionValue", required: false }] }], getOptionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "getOptionLabel", required: false }] }], isOptionDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOptionDisabled", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], chipTpl: [{
|
|
116
|
+
type: ContentChild,
|
|
117
|
+
args: ['tngMultiAutocompleteChipTpl', { read: TemplateRef }]
|
|
118
|
+
}], optionTpl: [{
|
|
119
|
+
type: ContentChild,
|
|
120
|
+
args: ['tngMultiAutocompleteOptionTpl', { read: TemplateRef }]
|
|
121
|
+
}] } });
|
|
125
122
|
//# sourceMappingURL=tng-multi-autocomplete.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,MAAM,EACN,KAAK,GACN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAuDxB,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IACrB,SAAS,GAAG,MAAM,CAA0B,oBAAoB,CAAC,CAAC;IAE5E,OAAO,GAAG,KAAK,CAAe,EAAE,CAAC,CAAC;IAClC,WAAW,GAAG,KAAK,CAAS,iBAAiB,CAAC,CAAC;IAC/C,SAAS,GAAG,KAAK,CAAS,YAAY,CAAC,CAAC;IACxC,SAAS,GAAG,KAAK,CAAS,oBAAoB,CAAC,CAAC;IAEhD,cAAc,GAAG,KAAK,CAC7B,CAAC,CAAC,GAAY,EAAE,EAAE,CAAE,GAAqB,EAAE,KAAK,CAAuC,CACxF,CAAC;IACO,cAAc,GAAG,KAAK,CAC7B,CAAC,CAAC,GAAY,EAAE,EAAE,CAChB,MAAM,CACH,GAA2C,EAAE,KAAK;QAChD,GAA2B,EAAE,KAAK;QACnC,GAAG,CACN,CAAoC,CACxC,CAAC;IACO,gBAAgB,GAAG,KAAK,CAC/B,CAAC,CAAC,GAAY,EAAE,EAAE,CAChB,CAAC,CAAE,GAA8B,EAAE,QAAQ,CAAsC,CACpF,CAAC;IACO,OAAO,GAAG,KAAK,CAAiC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAClE,MAAM,CAAC,GAAG,GAAiD,CAAC;QAC5D,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;IAC1C,CAAC,CAAC,CAAC;IAGH,OAAO,CAAsD;IAG7D,SAAS,CAAwD;IAE9C,aAAa,GAAG,QAAQ,CAAgC,GAAG,EAAE;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEvC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACtC,OAAO;gBACL,MAAM;gBACN,KAAK;gBACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAChD,OAAO,EAAE,KAAgB;aAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEgB,eAAe,GAAG,QAAQ,CAAe,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAExC,MAAM,OAAO,GAAG,CAAC;YACf,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAC/C,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CACzD,CAAC;QAEF,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEO,WAAW,CAAC,IAAwB;QAC5C,OAAO;YACL,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;aACzD;SACF,CAAC;IACJ,CAAC;IAES,aAAa,CAAC,GAAM;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC;QAEzC,OAAO;YACL,SAAS,EAAE;gBACT,MAAM,EAAE,GAAG;gBACX,KAAK;gBACL,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC;gBACjC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC;gBACtC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;gBACtC,MAAM,EAAE,KAAK;aACd;SACF,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,IAAO;QACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,kBAAkB,CAAC,IAAO;QACxB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,kBAAkB,CAAC,IAAO;QACxB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEO,UAAU,CAAC,KAAQ;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,gBAAgB,CACtB,KAAQ,EACR,WAAyB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QAE/C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF,CAAA;AAnGC;IADC,YAAY,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8DACN;AAG7D;IADC,YAAY,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gEACJ;AAhCtD,6BAA6B;IArBzC,SAAS,CAAC;QACT,QAAQ,EAAE,wBAAwB;QAClC,OAAO,EAAE;YACP,gBAAgB;YAChB,wBAAwB;YACxB,2BAA2B;YAC3B,2BAA2B;YAC3B,2BAA2B;YAC3B,2BAA2B;YAC3B,0BAA0B;SAC3B;QACD,cAAc,EAAE;YACd;gBACE,SAAS,EAAE,oBAAoB;gBAC/B,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;gBAC3D,OAAO,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;aACvC;SACF;QACD,WAAW,EAAE,yCAAyC;QACtD,QAAQ,EAAE,wCAAwC;KACnD,CAAC;GACW,6BAA6B,CAgIzC","sourcesContent":["import {\n Component,\n ContentChild,\n TemplateRef,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport {\n TngMultiAutocomplete,\n TngMultiAutocompleteChip,\n TngMultiAutocompleteContent,\n TngMultiAutocompleteListbox,\n TngMultiAutocompleteOption,\n TngMultiAutocompleteOverlay,\n TngMultiAutocompleteTrigger,\n} from '@tailng-ui/primitives';\n\nexport type TngMultiAutocompleteGetValue<O, V> = (opt: O) => V;\nexport type TngMultiAutocompleteGetLabel<O> = (opt: O) => string;\nexport type TngMultiAutocompleteIsDisabled<O> = (opt: O) => boolean;\nexport type TngMultiAutocompleteTrackBy<O> = (index: number, opt: O) => unknown;\n\nexport type TngMultiAutocompleteChipContext<O, V> = {\n $implicit: {\n option: O | null;\n value: V;\n label: string;\n removeItem: (item: V) => void;\n };\n};\n\nexport type TngMultiAutocompleteOptionContext<O, V> = {\n $implicit: {\n option: O;\n value: V;\n label: string;\n disabled: boolean;\n selected: boolean;\n active: boolean;\n };\n};\n\ntype SelectedItem<O, V> = {\n option: O | null;\n value: V;\n label: string;\n trackId: unknown;\n};\n\n@Component({\n selector: 'tng-multi-autocomplete',\n imports: [\n NgTemplateOutlet,\n TngMultiAutocompleteChip,\n TngMultiAutocompleteTrigger,\n TngMultiAutocompleteContent,\n TngMultiAutocompleteOverlay,\n TngMultiAutocompleteListbox,\n TngMultiAutocompleteOption,\n ],\n hostDirectives: [\n {\n directive: TngMultiAutocomplete,\n inputs: ['open', 'value', 'disabled', 'loading', 'invalid'],\n outputs: ['openChange', 'valueChange'],\n },\n ],\n templateUrl: './tng-multi-autocomplete.component.html',\n styleUrl: './tng-multi-autocomplete.component.css',\n})\nexport class TngMultiAutocompleteComponent<O = unknown, V = unknown> {\n protected readonly primitive = inject<TngMultiAutocomplete<V>>(TngMultiAutocomplete);\n\n readonly options = input<readonly O[]>([]);\n readonly placeholder = input<string>('Type to search…');\n readonly emptyText = input<string>('No matches');\n readonly ariaLabel = input<string>('Multi autocomplete');\n\n readonly getOptionValue = input<TngMultiAutocompleteGetValue<O, V>>(\n ((opt: unknown) => (opt as { value?: V })?.value) as TngMultiAutocompleteGetValue<O, V>,\n );\n readonly getOptionLabel = input<TngMultiAutocompleteGetLabel<O>>(\n ((opt: unknown) =>\n String(\n (opt as { label?: string; value?: unknown })?.label ??\n (opt as { value?: unknown })?.value ??\n opt,\n )) as TngMultiAutocompleteGetLabel<O>,\n );\n readonly isOptionDisabled = input<TngMultiAutocompleteIsDisabled<O>>(\n ((opt: unknown) =>\n !!(opt as { disabled?: boolean })?.disabled) as TngMultiAutocompleteIsDisabled<O>,\n );\n readonly trackBy = input<TngMultiAutocompleteTrackBy<O>>((_, opt) => {\n const o = opt as Record<string, unknown> | null | undefined;\n return o?.['value'] ?? o?.['id'] ?? opt;\n });\n\n @ContentChild('tngMultiAutocompleteChipTpl', { read: TemplateRef })\n chipTpl?: TemplateRef<TngMultiAutocompleteChipContext<O, V>>;\n\n @ContentChild('tngMultiAutocompleteOptionTpl', { read: TemplateRef })\n optionTpl?: TemplateRef<TngMultiAutocompleteOptionContext<O, V>>;\n\n protected readonly selectedItems = computed<readonly SelectedItem<O, V>[]>(() => {\n const values = this.primitive.value();\n const getLabel = this.getOptionLabel();\n\n return values.map((value) => {\n const option = this.findOption(value);\n return {\n option,\n value,\n label: option ? getLabel(option) : String(value),\n trackId: value as unknown,\n };\n });\n });\n\n protected readonly filteredOptions = computed<readonly O[]>(() => {\n const q = this.primitive.query().toLowerCase().trim();\n const list = this.options();\n const getLabel = this.getOptionLabel();\n const getValue = this.getOptionValue();\n const selected = this.primitive.value();\n\n const matches = q\n ? list.filter((opt) => getLabel(opt).toLowerCase().includes(q))\n : list;\n\n const pinnedSelected = matches.filter((opt) =>\n this.hasSelectedValue(getValue(opt), selected),\n );\n const remaining = matches.filter(\n (opt) => !this.hasSelectedValue(getValue(opt), selected),\n );\n\n return [...pinnedSelected, ...remaining];\n });\n\n protected chipContext(item: SelectedItem<O, V>): TngMultiAutocompleteChipContext<O, V> {\n return {\n $implicit: {\n option: item.option,\n value: item.value,\n label: item.label,\n removeItem: (value: V) => this.removeSelectedItem(value),\n },\n };\n }\n\n protected optionContext(opt: O): TngMultiAutocompleteOptionContext<O, V> {\n const value = this.getOptionValue()(opt);\n\n return {\n $implicit: {\n option: opt,\n value,\n label: this.getOptionLabel()(opt),\n disabled: this.isOptionDisabled()(opt),\n selected: this.hasSelectedValue(value),\n active: false,\n },\n };\n }\n\n addSelectedItem(item: V): void {\n this.primitive.add(item);\n }\n\n removeSelectedItem(item: V): void {\n this.primitive.remove(item);\n }\n\n toggleSelectedItem(item: V): void {\n this.primitive.toggle(item);\n }\n\n clear(): void {\n this.primitive.clear();\n }\n\n private findOption(value: V): O | null {\n const getValue = this.getOptionValue();\n\n for (const opt of this.options()) {\n if (Object.is(getValue(opt), value)) return opt;\n }\n\n return null;\n }\n\n private hasSelectedValue(\n value: V,\n selected: readonly V[] = this.primitive.value(),\n ): boolean {\n return selected.some((entry) => Object.is(entry, value));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.component.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.ts","../../../../../../../../libs/tailng-ui/components/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n ContentChild,\n TemplateRef,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport {\n TngMultiAutocomplete,\n TngMultiAutocompleteChip,\n TngMultiAutocompleteContent,\n TngMultiAutocompleteListbox,\n TngMultiAutocompleteOption,\n TngMultiAutocompleteOverlay,\n TngMultiAutocompleteTrigger,\n} from '@tailng-ui/primitives';\n\nexport type TngMultiAutocompleteGetValue<O, V> = (opt: O) => V;\nexport type TngMultiAutocompleteGetLabel<O> = (opt: O) => string;\nexport type TngMultiAutocompleteIsDisabled<O> = (opt: O) => boolean;\nexport type TngMultiAutocompleteTrackBy<O> = (index: number, opt: O) => unknown;\n\nexport type TngMultiAutocompleteChipContext<O, V> = {\n $implicit: {\n option: O | null;\n value: V;\n label: string;\n removeItem: (item: V) => void;\n };\n};\n\nexport type TngMultiAutocompleteOptionContext<O, V> = {\n $implicit: {\n option: O;\n value: V;\n label: string;\n disabled: boolean;\n selected: boolean;\n active: boolean;\n };\n};\n\ntype SelectedItem<O, V> = {\n option: O | null;\n value: V;\n label: string;\n trackId: unknown;\n};\n\n@Component({\n selector: 'tng-multi-autocomplete',\n imports: [\n NgTemplateOutlet,\n TngMultiAutocompleteChip,\n TngMultiAutocompleteTrigger,\n TngMultiAutocompleteContent,\n TngMultiAutocompleteOverlay,\n TngMultiAutocompleteListbox,\n TngMultiAutocompleteOption,\n ],\n hostDirectives: [\n {\n directive: TngMultiAutocomplete,\n inputs: ['open', 'value', 'disabled', 'loading', 'invalid'],\n outputs: ['openChange', 'valueChange'],\n },\n ],\n templateUrl: './tng-multi-autocomplete.component.html',\n styleUrl: './tng-multi-autocomplete.component.css',\n})\nexport class TngMultiAutocompleteComponent<O = unknown, V = unknown> {\n protected readonly primitive = inject<TngMultiAutocomplete<V>>(TngMultiAutocomplete);\n\n readonly options = input<readonly O[]>([]);\n readonly placeholder = input<string>('Type to search…');\n readonly emptyText = input<string>('No matches');\n readonly ariaLabel = input<string>('Multi autocomplete');\n\n readonly getOptionValue = input<TngMultiAutocompleteGetValue<O, V>>(\n ((opt: unknown) => (opt as { value?: V })?.value) as TngMultiAutocompleteGetValue<O, V>,\n );\n readonly getOptionLabel = input<TngMultiAutocompleteGetLabel<O>>(\n ((opt: unknown) =>\n String(\n (opt as { label?: string; value?: unknown })?.label ??\n (opt as { value?: unknown })?.value ??\n opt,\n )) as TngMultiAutocompleteGetLabel<O>,\n );\n readonly isOptionDisabled = input<TngMultiAutocompleteIsDisabled<O>>(\n ((opt: unknown) =>\n !!(opt as { disabled?: boolean })?.disabled) as TngMultiAutocompleteIsDisabled<O>,\n );\n readonly trackBy = input<TngMultiAutocompleteTrackBy<O>>((_, opt) => {\n const o = opt as Record<string, unknown> | null | undefined;\n return o?.['value'] ?? o?.['id'] ?? opt;\n });\n\n @ContentChild('tngMultiAutocompleteChipTpl', { read: TemplateRef })\n chipTpl?: TemplateRef<TngMultiAutocompleteChipContext<O, V>>;\n\n @ContentChild('tngMultiAutocompleteOptionTpl', { read: TemplateRef })\n optionTpl?: TemplateRef<TngMultiAutocompleteOptionContext<O, V>>;\n\n protected readonly selectedItems = computed<readonly SelectedItem<O, V>[]>(() => {\n const values = this.primitive.value();\n const getLabel = this.getOptionLabel();\n\n return values.map((value) => {\n const option = this.findOption(value);\n return {\n option,\n value,\n label: option ? getLabel(option) : String(value),\n trackId: value as unknown,\n };\n });\n });\n\n protected readonly filteredOptions = computed<readonly O[]>(() => {\n const q = this.primitive.query().toLowerCase().trim();\n const list = this.options();\n const getLabel = this.getOptionLabel();\n const getValue = this.getOptionValue();\n const selected = this.primitive.value();\n\n const matches = q\n ? list.filter((opt) => getLabel(opt).toLowerCase().includes(q))\n : list;\n\n const pinnedSelected = matches.filter((opt) =>\n this.hasSelectedValue(getValue(opt), selected),\n );\n const remaining = matches.filter(\n (opt) => !this.hasSelectedValue(getValue(opt), selected),\n );\n\n return [...pinnedSelected, ...remaining];\n });\n\n protected chipContext(item: SelectedItem<O, V>): TngMultiAutocompleteChipContext<O, V> {\n return {\n $implicit: {\n option: item.option,\n value: item.value,\n label: item.label,\n removeItem: (value: V) => this.removeSelectedItem(value),\n },\n };\n }\n\n protected optionContext(opt: O): TngMultiAutocompleteOptionContext<O, V> {\n const value = this.getOptionValue()(opt);\n\n return {\n $implicit: {\n option: opt,\n value,\n label: this.getOptionLabel()(opt),\n disabled: this.isOptionDisabled()(opt),\n selected: this.hasSelectedValue(value),\n active: false,\n },\n };\n }\n\n addSelectedItem(item: V): void {\n this.primitive.add(item);\n }\n\n removeSelectedItem(item: V): void {\n this.primitive.remove(item);\n }\n\n toggleSelectedItem(item: V): void {\n this.primitive.toggle(item);\n }\n\n clear(): void {\n this.primitive.clear();\n }\n\n private findOption(value: V): O | null {\n const getValue = this.getOptionValue();\n\n for (const opt of this.options()) {\n if (Object.is(getValue(opt), value)) return opt;\n }\n\n return null;\n }\n\n private hasSelectedValue(\n value: V,\n selected: readonly V[] = this.primitive.value(),\n ): boolean {\n return selected.some((entry) => Object.is(entry, value));\n }\n}\n","@for (item of selectedItems(); track item.trackId) {\n <span tngMultiAutocompleteChip [tngValue]=\"item.value\">\n @if (chipTpl) {\n <ng-container *ngTemplateOutlet=\"chipTpl; context: chipContext(item)\" />\n } @else {\n <span>{{ item.label }}</span>\n <button\n type=\"button\"\n [attr.aria-label]=\"'Remove ' + item.label\"\n (click)=\"removeSelectedItem(item.value); $event.preventDefault(); $event.stopPropagation()\"\n >\n ×\n </button>\n }\n </span>\n}\n\n<input\n tngMultiAutocompleteTrigger\n type=\"text\"\n [value]=\"primitive.query()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.aria-label]=\"ariaLabel()\"\n autocomplete=\"off\"\n/>\n\n<div tngMultiAutocompleteContent>\n <div tngMultiAutocompleteOverlay>\n <ul tngMultiAutocompleteListbox>\n @for (opt of filteredOptions(); track trackBy()($index, opt)) {\n <li\n tngMultiAutocompleteOption\n [tngValue]=\"getOptionValue()(opt)\"\n [disabled]=\"isOptionDisabled()(opt)\"\n >\n @if (optionTpl) {\n <ng-container *ngTemplateOutlet=\"optionTpl; context: optionContext(opt)\" />\n } @else {\n {{ getOptionLabel()(opt) }}\n }\n </li>\n }\n @if (filteredOptions().length === 0) {\n <li data-slot=\"multi-autocomplete-empty\">{{ emptyText() }}</li>\n }\n </ul>\n </div>\n</div>\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { TemplateRef } from '@angular/core';
|
|
2
2
|
import { TngMultiSelect } from '@tailng-ui/primitives';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@tailng-ui/primitives";
|
|
3
5
|
export type TngMultiSelectGetValue<O, V> = (opt: O) => V;
|
|
4
6
|
export type TngMultiSelectGetLabel<O> = (opt: O) => string;
|
|
5
7
|
export type TngMultiSelectIsDisabled<O> = (opt: O) => boolean;
|
|
@@ -45,5 +47,7 @@ export declare class TngMultiSelectComponent<O = unknown, V = unknown> {
|
|
|
45
47
|
toggleSelectedItem(item: V): void;
|
|
46
48
|
/** Clears the selection. Delegates to primitive. */
|
|
47
49
|
clear(): void;
|
|
50
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngMultiSelectComponent<any, any>, never>;
|
|
51
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TngMultiSelectComponent<any, any>, "tng-multiselect", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "getOptionValue": { "alias": "getOptionValue"; "required": false; "isSignal": true; }; "getOptionLabel": { "alias": "getOptionLabel"; "required": false; "isSignal": true; }; "isOptionDisabled": { "alias": "isOptionDisabled"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "iconText": { "alias": "iconText"; "required": false; "isSignal": true; }; }, {}, ["valueTpl", "optionTpl"], never, true, [{ directive: typeof i1.TngMultiSelect; inputs: { "open": "open"; "value": "value"; "disabled": "disabled"; "loading": "loading"; "invalid": "invalid"; "labelId": "labelId"; "descriptionId": "descriptionId"; "errorId": "errorId"; }; outputs: { "openChange": "openChange"; "valueChange": "valueChange"; }; }]>;
|
|
48
52
|
}
|
|
49
53
|
//# sourceMappingURL=tng-multiselect.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multiselect.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/multiselect/tng-multiselect.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAIZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,cAAc,EAQf,MAAM,uBAAuB,CAAC
|
|
1
|
+
{"version":3,"file":"tng-multiselect.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/components/src/lib/form/multiselect/tng-multiselect.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EAIZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,cAAc,EAQf,MAAM,uBAAuB,CAAC;;;AAE/B,MAAM,MAAM,sBAAsB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AACzD,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;AAC3D,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AAC9D,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;AAE1E,MAAM,MAAM,0BAA0B,CAAC,CAAC,EAAE,CAAC,IAAI;IAC7C,SAAS,EAAE;QACT,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;KAC/B,CAAC;CACH,CAAC;AACF,MAAM,MAAM,2BAA2B,CAAC,CAAC,EAAE,CAAC,IAAI;IAC9C,SAAS,EAAE;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1G,CAAC;AAEF,qBA+Ba,uBAAuB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IAC3D,SAAS,CAAC,QAAQ,CAAC,SAAS,oBAA6C;IAEzE,QAAQ,CAAC,OAAO,oDAA2B;IAC3C,QAAQ,CAAC,WAAW,8CAA4B;IAEhD,QAAQ,CAAC,cAAc,oEAErB;IACF,QAAQ,CAAC,cAAc,iEAErB;IACF,QAAQ,CAAC,gBAAgB,mEAEvB;IACF,QAAQ,CAAC,OAAO,gEAA+D;IAE/E,QAAQ,CAAC,QAAQ,8CAAsB;IAEwB,QAAQ,CAAC,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,SAAS,CAAC,EAAE,WAAW,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3H,SAAS,CAAC,QAAQ,CAAC,eAAe,+CAS/B;IAEH,SAAS,CAAC,QAAQ,CAAC,aAAa,yCAI7B;IAEH,SAAS,CAAC,YAAY,IAAI,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC;IAc1D,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC;IAUlE,6DAA6D;IAC7D,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAI9B,kEAAkE;IAClE,kBAAkB,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAIjC,gEAAgE;IAChE,kBAAkB,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAIjC,oDAAoD;IACpD,KAAK,IAAI,IAAI;yCA/EF,uBAAuB;2CAAvB,uBAAuB;CAkFnC"}
|