@cdevhub/ngx-tw 0.5.0 → 0.6.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/README.md +78 -15
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +18 -3
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
- package/index.json +1 -1
- package/package.json +63 -2
- package/theme/_base.css +13 -0
- package/theme/_dark.css +110 -36
- package/theme/_high-contrast-dark.css +367 -0
- package/theme/_high-contrast.css +13 -2
- package/theme/_light.css +276 -0
- package/theme/_semantic.css +47 -12
- package/theme/_typography.css +17 -0
- package/theme/index.css +86 -7
- package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
- package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
- package/types/cdevhub-ngx-tw-button.d.ts +1 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
- package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
- package/types/cdevhub-ngx-tw-card.d.ts +11 -3
- package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
- package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
- package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
- package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
- package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
- package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
- package/types/cdevhub-ngx-tw-core.d.ts +152 -21
- package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
- package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
- package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
- package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
- package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
- package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
- package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
- package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
- package/types/cdevhub-ngx-tw-input.d.ts +5 -8
- package/types/cdevhub-ngx-tw-item.d.ts +2 -0
- package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
- package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
- package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
- package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
- package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
- package/types/cdevhub-ngx-tw-select.d.ts +104 -33
- package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
- package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
- package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
- package/types/cdevhub-ngx-tw-split.d.ts +32 -2
- package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
- package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
- package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
- package/types/cdevhub-ngx-tw-table.d.ts +53 -10
- package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
- package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
- package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
- package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
- package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
- package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
- package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
- package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
- package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
- package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
- package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-tags-input.mjs","sources":["../../../projects/ngx-tw/tags-input/tags-input.ts","../../../projects/ngx-tw/tags-input/cdevhub-ngx-tw-tags-input.ts"],"sourcesContent":["import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n isDevMode,\n type OnInit,\n output,\n signal,\n type Signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { FocusMonitor, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isObservable, merge } from 'rxjs';\nimport { tv } from 'tailwind-variants';\nimport {\n type ErrorStateMatcher,\n TW_ERROR_STATE_MATCHER,\n type TwColor,\n type TwFormSubmitted,\n type TwSize,\n} from '@cdevhub/ngx-tw/core';\nimport {\n FormFieldControl,\n TW_FORM_FIELD,\n TW_FORM_FIELD_CONTROL,\n} from '@cdevhub/ngx-tw/form-field';\nimport { BadgeComponent } from '@cdevhub/ngx-tw/badge';\nimport type {\n TwTagAddedEvent,\n TwTagCompareFn,\n TwTagFactory,\n TwTagLabelFn,\n TwTagRemovedEvent,\n} from './types';\n\n// ── tv() config ──\n// `focus-within:outline-{color}-500` and the chip color classes are emitted by\n// combobox / badge already, so the Tailwind v4 JIT scanner picks them up.\n\nconst tagsInputVariants = tv(\n {\n slots: {\n // Host is the `role=\"group\"` chip strip. `flex-wrap` lets chips wrap; the\n // container owns the focus-within ring (standalone) or strips its chrome\n // inside a `<tw-form-field>` (the field draws the border / focus border).\n root: 'flex flex-wrap items-center gap-1.5 w-full text-fg',\n chip: 'max-w-full min-w-0',\n chipLabel: 'truncate',\n // Real DOM focus → canonical outline ring (NOT the activedescendant\n // background-shift carve-out). `text-current` inherits the chip color.\n // Per-size sets the square-interactive target size + negative margins.\n removeButton:\n 'inline-flex items-center justify-center shrink-0 ml-0.5 rounded-md text-current opacity-70 hover:opacity-100 transition-opacity duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 disabled:pointer-events-none',\n removeIcon: 'shrink-0',\n input:\n 'flex-1 min-w-24 bg-transparent text-fg placeholder:text-fg-subtle outline-none disabled:cursor-not-allowed',\n },\n variants: {\n inFormField: {\n // Inside a form-field: keep only the chip-strip layout; the field owns\n // border, padding, background and the focused-border indicator.\n true: { root: '' },\n false: {\n root: 'rounded-md border border-border bg-surface transition-colors duration-normal motion-reduce:transition-none hover:border-border-strong focus-within:outline-2 focus-within:outline-offset-2',\n },\n },\n size: {\n // removeButton uses the square-interactive sub-scale (the button IS the\n // touch target): size-6 (24px) meets WCAG 2.5.8; negative margins absorb\n // the overflow so the chip height is unchanged. Mirrors badge's dismiss.\n // `size-3.5` half-step on the md remove glyph lines up the X with text-sm\n // at md density (codified half-step per CLAUDE.md icon sizing).\n xs: { root: 'text-xs', removeButton: 'size-6 -my-1 -mr-1', removeIcon: 'size-3' },\n sm: { root: 'text-sm', removeButton: 'size-6 -my-1 -mr-1', removeIcon: 'size-3' },\n md: { root: 'text-sm', removeButton: 'size-7 -my-1.5 -mr-1.5', removeIcon: 'size-3.5' },\n lg: { root: 'text-base', removeButton: 'size-8 -my-1.5 -mr-1.5', removeIcon: 'size-4' },\n xl: { root: 'text-base', removeButton: 'size-8 -my-1.5 -mr-1.5', removeIcon: 'size-4' },\n },\n color: {\n primary: { root: 'focus-within:outline-primary-500' },\n secondary: { root: 'focus-within:outline-secondary-500' },\n accent: { root: 'focus-within:outline-accent-500' },\n neutral: { root: 'focus-within:outline-border-strong' },\n info: { root: 'focus-within:outline-info-500' },\n success: { root: 'focus-within:outline-success-500' },\n warning: { root: 'focus-within:outline-warning-500' },\n error: { root: 'focus-within:outline-error-500' },\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none cursor-not-allowed' },\n false: {},\n },\n errorState: {\n true: {},\n false: {},\n },\n },\n compoundVariants: [\n // Standalone density × size — inline padding scale (mirrors combobox trigger).\n { inFormField: false, size: 'xs', class: { root: 'px-2 py-1' } },\n { inFormField: false, size: 'sm', class: { root: 'px-3 py-1.5' } },\n { inFormField: false, size: 'md', class: { root: 'px-4 py-2' } },\n { inFormField: false, size: 'lg', class: { root: 'px-5 py-2.5' } },\n { inFormField: false, size: 'xl', class: { root: 'px-6 py-3' } },\n // Standalone error state — colored border + focus ring.\n {\n inFormField: false,\n errorState: true,\n class: { root: 'border-error-500 focus-within:outline-error-500' },\n },\n ],\n defaultVariants: {\n inFormField: false,\n size: 'md',\n color: 'primary',\n disabled: false,\n errorState: false,\n },\n },\n { twMerge: true },\n);\n\nconst DEFAULT_SEPARATORS: readonly string[] = ['Enter', ','];\n\nlet nextId = 0;\n\n/**\n * Free-text multi-value input. The user types a token and commits it via Enter,\n * a separator key, paste, or blur; committed tokens render as dismissible chips\n * (composing `[twBadge]`) inline with the text input. The value is exposed as a\n * real `T[]` (default `string[]`) through `ControlValueAccessor`, so it works\n * with template-driven, reactive, and signal forms and integrates with\n * `<tw-form-field>` for label / hint / error chrome.\n *\n * The control is a single tab stop with a roving-tabindex chip strip\n * (Material `MatChipGrid` interaction model): Arrow keys traverse chips and the\n * input, Delete / a two-step Backspace remove chips, and `LiveAnnouncer` voices\n * add / remove. Autocomplete suggestions are out of scope (use `tw-combobox`).\n */\n@Component({\n selector: 'tw-tags-input',\n exportAs: 'twTagsInput',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [BadgeComponent],\n providers: [\n {\n provide: TW_FORM_FIELD_CONTROL,\n useExisting: forwardRef(() => TagsInputComponent),\n },\n ],\n template: `\n @for (chip of chipViews(); track chip.index) {\n <span twBadge variant=\"soft\" [color]=\"color()\" [size]=\"size()\" [class]=\"chipClasses()\">\n <span [class]=\"chipLabelClasses()\">{{ chip.label }}</span>\n <button\n #removeBtn\n type=\"button\"\n [class]=\"removeButtonClasses()\"\n [attr.tabindex]=\"activeChipIndex() === chip.index ? 0 : -1\"\n [attr.aria-label]=\"chip.removeLabel\"\n [disabled]=\"disabled()\"\n (click)=\"onRemoveClick(chip.index)\"\n (keydown)=\"onChipKeydown($event, chip.index)\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n [class]=\"removeIconClasses()\"\n >\n <path\n d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\"\n />\n </svg>\n </button>\n </span>\n }\n <input\n #textInput\n type=\"text\"\n [class]=\"inputClasses()\"\n [attr.tabindex]=\"activeChipIndex() === null ? 0 : -1\"\n [attr.placeholder]=\"placeholder() || null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedLabelledBy() || null\"\n [attr.aria-describedby]=\"resolvedDescribedBy() || null\"\n [attr.aria-invalid]=\"errorState() || null\"\n [attr.name]=\"name() || null\"\n [disabled]=\"disabled()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (paste)=\"onPaste($event)\"\n />\n `,\n host: {\n 'role': 'group',\n '[id]': 'id()',\n '[class]': 'rootClasses()',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.aria-labelledby]': 'resolvedLabelledBy() || null',\n '[attr.aria-describedby]': 'resolvedDescribedBy() || null',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.aria-invalid]': 'errorState() || null',\n '[attr.data-focused]': 'focused() || null',\n },\n})\nexport class TagsInputComponent<T = string>\n extends FormFieldControl<T[]>\n implements ControlValueAccessor, OnInit\n{\n /** Semantic color for the container focus-within ring and the chip accent. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls overall density: container padding, chip size, and text scale. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, blocks typing, committing, and chip removal, and applies muted styling. Reactive forms also propagate disabled via `setDisabledState`. Defaults to `false`. */\n readonly disabledInput = input(false, { alias: 'disabled' });\n\n /** Marks the control as required. Mirrored to the input's `aria-required`. Also inferred from `Validators.required` on a bound control. Defaults to `false`. */\n readonly requiredInput = input(false, { alias: 'required' });\n\n /** Placeholder shown in the text input only while there are no chips and the input is empty. */\n readonly placeholder = input<string | undefined>(undefined);\n\n /** Keys that commit the in-progress text as a tag. Each entry is a `KeyboardEvent.key` value (`'Enter'`) or a single separator character (`','`). Single-character separators also split pasted text. Defaults to `['Enter', ',']`. */\n readonly separatorKeys = input<readonly string[]>(DEFAULT_SEPARATORS);\n\n /** When true, blurring the control while the input holds non-empty text commits it as a tag. Defaults to `false`. */\n readonly addOnBlur = input(false);\n\n /** Maximum number of tags. Once reached, further commits are blocked and announced. Does not truncate an oversized `writeValue`. Defaults to `undefined` (no limit). */\n readonly maxTags = input<number | undefined>(undefined);\n\n /** When false (default), a committed tag equal (per `compareWith`) to an existing tag is dropped silently. When true, duplicates are kept. Defaults to `false`. */\n readonly allowDuplicates = input(false);\n\n /** Maps committed text to a tag value. Default is identity — the trimmed string. Override to build object tags. */\n readonly createTag = input<TwTagFactory<T>>(\n ((text: string) => text) as unknown as TwTagFactory<T>,\n );\n\n /** Maps a tag value to its visible chip label and the remove-button accessible name. Defaults to `String(tag)`. */\n readonly tagLabel = input<TwTagLabelFn<T>>((tag: T) => String(tag));\n\n /** Equality comparator used for dedup when `allowDuplicates` is false. Defaults to `Object.is` (reference / value identity). String tags dedupe case-sensitively by default; pass `(a, b) => a.toLowerCase() === b.toLowerCase()` for case-insensitive dedup. */\n readonly compareWith = input<TwTagCompareFn<T>>((a: T, b: T) => Object.is(a, b));\n\n /** Applied to the text input for labeling and identification only; does not submit the tag array via native (non-Angular) form posting. */\n readonly name = input<string | undefined>(undefined);\n\n /** Id on the host element. Auto-generated as `tw-tags-input-N` when not provided. Used by the form-field's `<label for>` association. */\n readonly idInput = input<string | undefined>(undefined, { alias: 'id' });\n\n /** Accessible name applied to the control when no visible label is wired. Mirrored to `aria-label`. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** ID of an external element that labels the control. Mirrored to `aria-labelledby`. */\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n /** ID of an external element that describes the control. Form-field merges its hint / error ids alongside. */\n readonly ariaDescribedby = input<string | undefined>(undefined, { alias: 'aria-describedby' });\n\n /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, uses the `TW_ERROR_STATE_MATCHER` token's value. */\n readonly errorStateMatcher = input<ErrorStateMatcher | undefined>(undefined);\n\n /** Fires when the tag array changes through user interaction (add, remove, clear). Emits a fresh array reference. Does not fire on `writeValue`. */\n readonly valueChange = output<T[]>();\n\n /** Fires when a tag is committed via Enter, a separator key, paste, or `addTag()`. Does not fire for dropped duplicates, blocked-by-max commits, empty commits, or `writeValue`. */\n readonly tagAdded = output<TwTagAddedEvent<T>>();\n\n /** Fires when a tag is removed via the remove button, Backspace / Delete, or `removeTag()`. Does not fire on `writeValue` or `clear()`. */\n readonly tagRemoved = output<TwTagRemovedEvent<T>>();\n\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n private readonly ngControl = inject(NgControl, { optional: true, self: true });\n private readonly parentForm = inject(NgForm, { optional: true });\n private readonly parentFormGroup = inject(FormGroupDirective, { optional: true });\n private readonly defaultMatcher = inject(TW_ERROR_STATE_MATCHER);\n private readonly formField = inject(TW_FORM_FIELD, { optional: true });\n\n private readonly textInputRef = viewChild<ElementRef<HTMLInputElement>>('textInput');\n private readonly removeButtons = viewChildren<ElementRef<HTMLButtonElement>>('removeBtn');\n\n private onChange: (value: T[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n private readonly tags = signal<T[]>([]);\n /** The current in-progress (uncommitted) text in the input. Empty when nothing is typed. */\n readonly inputText = signal('');\n /** @internal Roving-tabindex position. `null` = the text input is the active element; a number = that chip's remove button. */\n protected readonly activeChipIndex = signal<number | null>(null);\n private readonly cvaDisabled = signal(false);\n private readonly _focused = signal(false);\n private readonly _ngControlRev = signal(0);\n private readonly _formSubmitRev = signal(0);\n private readonly describedByIdsSignal = signal<readonly string[]>([]);\n private readonly labelledByIdsSignal = signal<readonly string[]>([]);\n /** Nonce bumped only on explicit focus intent — keeps the focus effect from stealing focus on unrelated renders. */\n private readonly focusNonce = signal(0);\n private lastMaxAnnounce = 0;\n\n private readonly uid = nextId++;\n /** @internal Fallback id used when the consumer does not set `[id]`. */\n readonly hostId = `tw-tags-input-${this.uid}`;\n\n // ── FormFieldControl signals ──\n\n /** @internal */\n readonly id: Signal<string> = computed(() => this.idInput() ?? this.hostId);\n\n /** The current tag array (empty array when there are no tags). Read from a template ref (`#t=\"twTagsInput\"`) for non-form usage. Doubles as the `FormFieldControl` contract member. */\n readonly value: Signal<T[]> = this.tags.asReadonly();\n\n /** @internal */\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n\n /** @internal Empty when there are no chips AND the input text is blank — drives the form-field floating label. */\n readonly empty: Signal<boolean> = computed(\n () => this.tags().length === 0 && this.inputText().trim().length === 0,\n );\n\n /** @internal */\n readonly disabled: Signal<boolean> = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n /** @internal */\n readonly required: Signal<boolean> = computed(() => {\n this._ngControlRev();\n if (this.requiredInput()) return true;\n return !!this.ngControl?.control?.hasValidator(Validators.required);\n });\n\n /** @internal */\n readonly errorState: Signal<boolean> = computed(() => {\n this._ngControlRev();\n this._formSubmitRev();\n this._focused();\n const matcher = this.errorStateMatcher() ?? this.defaultMatcher;\n const form: TwFormSubmitted | null =\n (this.parentFormGroup as TwFormSubmitted | null) ??\n (this.parentForm as TwFormSubmitted | null);\n return matcher.isErrorState(this.ngControl?.control ?? null, form);\n });\n\n /** @internal Active validation errors map from the bound control, for `[twError match=\"…\"]` filtering. */\n override readonly errors = computed<Record<string, unknown> | null>(() => {\n this._ngControlRev();\n return (this.ngControl?.control?.errors as Record<string, unknown> | null) ?? null;\n });\n\n /** @internal */\n readonly controlType = 'tags-input';\n\n /** @internal */\n readonly userAriaDescribedBy: Signal<string | undefined> = computed(() => this.ariaDescribedby());\n\n /** @internal */\n override readonly userAriaLabelledby: Signal<string | undefined> = computed(() =>\n this.ariaLabelledby(),\n );\n\n // ── Effective ARIA ──\n //\n // When wrapped by `<tw-form-field>`, the form-field pushes the FULLY MERGED\n // id list (hint/error/label + the consumer's `aria-*by` ids) via\n // `setDescribedByIds` / `setLabelledByIds`. In that case the pushed ids alone\n // are the source of truth — re-merging the consumer's `aria-*by` input on top\n // would duplicate ids. When standalone, fall back to the consumer-supplied\n // `aria-*by` input.\n\n /** @internal Merged `aria-describedby` (form-field hint/error ids + consumer-supplied). */\n readonly resolvedDescribedBy = computed(() => {\n const pushed = this.describedByIdsSignal();\n if (pushed.length) return pushed.join(' ');\n const user = this.ariaDescribedby();\n if (user) return user.split(/\\s+/).filter(Boolean).join(' ');\n return '';\n });\n\n /** @internal Merged `aria-labelledby` (form-field label id + consumer-supplied). */\n readonly resolvedLabelledBy = computed(() => {\n const pushed = this.labelledByIdsSignal();\n if (pushed.length) return pushed.join(' ');\n const user = this.ariaLabelledby();\n if (user) return user.split(/\\s+/).filter(Boolean).join(' ');\n return '';\n });\n\n // ── tv() class bindings ──\n\n private readonly variantResult = computed(() =>\n tagsInputVariants({\n inFormField: !!this.formField,\n size: this.size(),\n color: this.color(),\n disabled: this.disabled(),\n errorState: this.errorState(),\n }),\n );\n\n /** @internal */\n readonly rootClasses = computed(() => this.variantResult().root());\n /** @internal */\n readonly chipClasses = computed(() => this.variantResult().chip());\n /** @internal */\n readonly chipLabelClasses = computed(() => this.variantResult().chipLabel());\n /** @internal */\n readonly removeButtonClasses = computed(() => this.variantResult().removeButton());\n /** @internal */\n readonly removeIconClasses = computed(() => this.variantResult().removeIcon());\n /** @internal */\n readonly inputClasses = computed(() => this.variantResult().input());\n\n /** @internal Pre-resolved chip view models so the template never calls accessor functions inline. */\n readonly chipViews = computed(() => {\n const label = this.tagLabel();\n return this.tags().map((tag, index) => {\n const text = label(tag);\n return { tag, label: text, removeLabel: `Remove ${text}`, index };\n });\n });\n\n constructor() {\n super();\n // Runtime CVA wiring — register on any host-level NgControl. The component\n // injects `NgControl { self }` for TW_ERROR_STATE_MATCHER, so a static\n // NG_VALUE_ACCESSOR provider would create circular DI on the same instance.\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n // Focus side-effect (leaves the signal graph; writes no signal → no cycle).\n // Triggered only by `focusNonce` bumps so it never steals focus on an\n // unrelated render (e.g. initial mount). Reads the active index and refs\n // untracked so it does not re-fire when the chip list changes on its own.\n effect(() => {\n if (this.focusNonce() === 0) return;\n untracked(() => {\n const idx = this.activeChipIndex();\n if (idx === null) {\n this.textInputRef()?.nativeElement.focus();\n } else {\n this.removeButtons()[idx]?.nativeElement.focus();\n }\n });\n });\n\n afterNextRender(() => {\n if (isDevMode() && !this.hasAccessibleNameHint()) {\n console.warn(\n '[tw-tags-input] The control has no accessible name. Provide `aria-label` / `aria-labelledby`, or wrap it in a <tw-form-field> with a <label twLabel>.',\n );\n }\n });\n }\n\n // ── Public instance API ──\n\n /** Commits `text` as a tag (trim → `createTag` → dedup unless `allowDuplicates` → `maxTags` check). Returns true if a tag was added, false if dropped (empty / duplicate / max). Emits `tagAdded` + `valueChange` on success. No-op when disabled. */\n addTag(text: string): boolean {\n if (this.disabled()) return false;\n const trimmed = text.trim();\n if (!trimmed) return false;\n return this.tryAdd(this.createTag()(trimmed)) === 'added';\n }\n\n /** Removes a tag by value (first match via `compareWith`) or by index when a number is passed. Emits `tagRemoved` + `valueChange` and restores focus. No-op when disabled or when no match. Note: when the tag type is `number`, the argument is treated as an index. */\n removeTag(tag: T | number): void {\n if (this.disabled()) return;\n if (typeof tag === 'number') {\n this.removeAt(tag);\n return;\n }\n const cmp = this.compareWith();\n const idx = this.tags().findIndex((t) => cmp(t, tag));\n if (idx >= 0) this.removeAt(idx);\n }\n\n /** Removes all tags and clears the in-progress input text. Emits `valueChange` with `[]`. Does NOT emit `tagRemoved` per tag (bulk reset). No-op when already empty or disabled. */\n clear(): void {\n if (this.disabled()) return;\n if (this.tags().length === 0 && this.inputText().length === 0) return;\n this.tags.set([]);\n this.setInputText('');\n this.activeChipIndex.set(null);\n this.onChange([]);\n this.valueChange.emit([]);\n this.liveAnnouncer.announce('All tags removed', 'polite');\n }\n\n /** Moves focus to the text input. */\n focus(): void {\n this.activeChipIndex.set(null);\n this.requestFocus();\n }\n\n // ── Internal commit / remove pipeline ──\n\n private tryAdd(tag: T): 'added' | 'duplicate' | 'max' {\n const current = this.tags();\n if (!this.allowDuplicates()) {\n const cmp = this.compareWith();\n if (current.some((e) => cmp(e, tag))) return 'duplicate';\n }\n const max = this.maxTags();\n if (max !== undefined && current.length >= max) {\n this.announceMax();\n return 'max';\n }\n const next = [...current, tag];\n this.tags.set(next);\n this.onChange(next);\n this.tagAdded.emit({ tag, value: next });\n this.valueChange.emit(next);\n this.liveAnnouncer.announce(`${this.tagLabel()(tag)} added`, 'polite');\n return 'added';\n }\n\n private commitInput(): void {\n if (this.disabled()) return;\n const trimmed = this.inputText().trim();\n if (!trimmed) {\n this.setInputText('');\n return;\n }\n const result = this.tryAdd(this.createTag()(trimmed));\n // Clear on success or duplicate (gesture consumed); retain on max so the\n // user can retry after removing a tag.\n if (result !== 'max') this.setInputText('');\n }\n\n private removeAt(index: number): void {\n if (this.disabled()) return;\n const current = this.tags();\n if (index < 0 || index >= current.length) return;\n const tag = current[index];\n const next = current.filter((_, i) => i !== index);\n this.tags.set(next);\n this.onChange(next);\n this.tagRemoved.emit({ tag, value: next, index });\n this.valueChange.emit(next);\n this.liveAnnouncer.announce(`${this.tagLabel()(tag)} removed`, 'polite');\n // Focus restoration: next chip at this index, else the previous chip, else the input.\n if (next.length === 0) {\n this.focusInput();\n } else if (index < next.length) {\n this.focusChip(index);\n } else {\n this.focusChip(next.length - 1);\n }\n }\n\n // ── DOM event handlers ──\n\n /** @internal */\n onInput(event: Event): void {\n this.inputText.set((event.target as HTMLInputElement).value);\n }\n\n /** @internal */\n onInputKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const separators = this.separatorKeys();\n const key = event.key;\n\n // Single-character separator → commit (and swallow the character).\n if (key.length === 1 && separators.includes(key)) {\n event.preventDefault();\n this.commitInput();\n return;\n }\n // Enter separator → commit only when there is text (otherwise let the form submit).\n if (key === 'Enter' && separators.includes('Enter')) {\n if (this.inputText().trim().length > 0) {\n event.preventDefault();\n this.commitInput();\n }\n return;\n }\n if (key === 'ArrowLeft') {\n const el = event.target as HTMLInputElement;\n const atStart = (el.selectionStart ?? 0) === 0 && (el.selectionEnd ?? 0) === 0;\n if (atStart && this.tags().length > 0) {\n event.preventDefault();\n this.focusChip(this.tags().length - 1);\n }\n return;\n }\n if (key === 'Backspace' && this.inputText().length === 0) {\n if (this.tags().length > 0) {\n event.preventDefault();\n this.focusChip(this.tags().length - 1);\n }\n return;\n }\n if (key === 'Escape' && this.inputText().length > 0) {\n event.preventDefault();\n this.setInputText('');\n }\n }\n\n /** @internal */\n onChipKeydown(event: KeyboardEvent, index: number): void {\n if (this.disabled()) return;\n const last = this.tags().length - 1;\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n if (index > 0) this.focusChip(index - 1);\n return;\n case 'ArrowRight':\n event.preventDefault();\n if (index < last) this.focusChip(index + 1);\n else this.focusInput();\n return;\n case 'Home':\n event.preventDefault();\n this.focusChip(0);\n return;\n case 'End':\n event.preventDefault();\n this.focusInput();\n return;\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n this.removeAt(index);\n return;\n case 'Escape':\n event.preventDefault();\n this.focusInput();\n return;\n default:\n return;\n }\n }\n\n /** @internal */\n onRemoveClick(index: number): void {\n this.removeAt(index);\n }\n\n /** @internal */\n onPaste(event: ClipboardEvent): void {\n if (this.disabled()) return;\n const data = event.clipboardData?.getData('text') ?? '';\n const charSeparators = this.separatorKeys().filter((k) => k.length === 1);\n const hasSeparator = charSeparators.some((s) => data.includes(s));\n if (!hasSeparator) {\n // No separator: let the browser merge the text into the input natively.\n return;\n }\n event.preventDefault();\n const combined = this.inputText() + data;\n this.setInputText('');\n for (const piece of this.splitOnSeparators(combined, charSeparators)) {\n const trimmed = piece.trim();\n if (!trimmed) continue;\n if (this.tryAdd(this.createTag()(trimmed)) === 'max') break;\n }\n }\n\n // ── ControlValueAccessor ──\n\n writeValue(value: T[] | null | undefined): void {\n this.tags.set(Array.isArray(value) ? [...value] : []);\n this.setInputText('');\n }\n\n registerOnChange(fn: (value: T[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n // ── FormFieldControl methods ──\n\n /** @internal */\n setDescribedByIds(ids: string[]): void {\n this.describedByIdsSignal.set([...ids]);\n }\n\n /** @internal */\n override setLabelledByIds(ids: string[]): void {\n this.labelledByIdsSignal.set([...ids]);\n }\n\n /** @internal Clicking the form-field surface (outside the control) focuses the text input. Clicks inside the control are left alone so chip removal keeps its own focus restoration. */\n onContainerClick(event: MouseEvent): void {\n if (this.disabled()) return;\n if (event.defaultPrevented) return;\n const host = this.elementRef.nativeElement;\n if (event.target === host || host.contains(event.target as Node)) return;\n this.focus();\n }\n\n // ── Lifecycle ──\n\n ngOnInit(): void {\n // checkChildren: true — internal focus moves (input ↔ chips) stay \"focused\";\n // origin === null fires only when focus leaves the whole control, the single\n // source for onTouched and the addOnBlur commit.\n const monitor$ = this.focusMonitor.monitor(this.elementRef, true);\n if (isObservable(monitor$)) {\n monitor$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((origin) => {\n const wasFocused = this._focused();\n this._focused.set(!!origin);\n if (wasFocused && !origin) {\n if (this.addOnBlur() && this.inputText().trim().length > 0) {\n this.commitInput();\n }\n this.onTouched();\n this._ngControlRev.update((n) => n + 1);\n // Reset roving so the next Tab into the control lands on the input.\n this.activeChipIndex.set(null);\n }\n });\n }\n this.destroyRef.onDestroy(() => this.focusMonitor.stopMonitoring(this.elementRef));\n\n const ctrl = this.ngControl?.control;\n if (ctrl) {\n const streams = [ctrl.statusChanges, ctrl.valueChanges].filter(\n (s): s is NonNullable<typeof s> => !!s,\n );\n if (streams.length) {\n merge(...streams)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._ngControlRev.update((n) => n + 1));\n }\n }\n\n const submit = this.parentFormGroup?.ngSubmit ?? this.parentForm?.ngSubmit;\n if (submit) {\n submit\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._formSubmitRev.update((n) => n + 1));\n }\n }\n\n // ── Helpers ──\n\n private focusChip(index: number): void {\n this.activeChipIndex.set(index);\n this.requestFocus();\n }\n\n private focusInput(): void {\n this.activeChipIndex.set(null);\n this.requestFocus();\n }\n\n private requestFocus(): void {\n this.focusNonce.update((n) => n + 1);\n }\n\n private setInputText(value: string): void {\n this.inputText.set(value);\n const el = this.textInputRef()?.nativeElement;\n if (el && el.value !== value) el.value = value;\n }\n\n private announceMax(): void {\n const now = Date.now();\n if (now - this.lastMaxAnnounce < 500) return;\n this.lastMaxAnnounce = now;\n this.liveAnnouncer.announce(`Maximum ${this.maxTags()} tags reached`, 'assertive');\n }\n\n private splitOnSeparators(text: string, separators: readonly string[]): string[] {\n if (separators.length === 0) return [text];\n let normalized = text;\n for (const s of separators) normalized = normalized.split(s).join('\\u0000');\n return normalized.split('\\u0000');\n }\n\n private hasAccessibleNameHint(): boolean {\n return (\n !!this.ariaLabel() ||\n !!this.ariaLabelledby() ||\n this.labelledByIdsSignal().length > 0\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-tags-input.mjs","sources":["../../../projects/ngx-tw/tags-input/tags-input.ts","../../../projects/ngx-tw/tags-input/cdevhub-ngx-tw-tags-input.ts"],"sourcesContent":["import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n forwardRef,\n inject,\n input,\n isDevMode,\n type OnInit,\n output,\n signal,\n type Signal,\n untracked,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { type ControlValueAccessor, NgControl } from '@angular/forms';\nimport { FocusMonitor, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { isObservable } from 'rxjs';\nimport { tv } from 'tailwind-variants';\nimport {\n type ErrorStateMatcher,\n type TwColor,\n type TwSize,\n wireErrorState,\n} from '@cdevhub/ngx-tw/core';\nimport {\n FormFieldControl,\n TW_FORM_FIELD,\n TW_FORM_FIELD_CONTROL,\n} from '@cdevhub/ngx-tw/form-field';\nimport { BadgeComponent } from '@cdevhub/ngx-tw/badge';\nimport type {\n TwTagAddedEvent,\n TwTagCompareFn,\n TwTagFactory,\n TwTagLabelFn,\n TwTagRemovedEvent,\n} from './types';\n\n// ── tv() config ──\n// `focus-within:outline-{color}-500` and the chip color classes are emitted by\n// combobox / badge already, so the Tailwind v4 JIT scanner picks them up.\n\nconst tagsInputVariants = tv(\n {\n slots: {\n // Host is the `role=\"group\"` chip strip. `flex-wrap` lets chips wrap; the\n // container owns the focus-within ring (standalone) or strips its chrome\n // inside a `<tw-form-field>` (the field draws the border / focus border).\n root: 'flex flex-wrap items-center gap-1.5 w-full text-fg',\n chip: 'max-w-full min-w-0',\n chipLabel: 'truncate',\n // Real DOM focus → canonical outline ring (NOT the activedescendant\n // background-shift carve-out). `text-current` inherits the chip color.\n // Per-size sets the square-interactive target size + negative margins.\n removeButton:\n 'inline-flex items-center justify-center shrink-0 ml-0.5 rounded-md text-current opacity-70 hover:opacity-100 transition-opacity duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 disabled:pointer-events-none',\n removeIcon: 'shrink-0',\n input:\n 'flex-1 min-w-24 bg-transparent text-fg placeholder:text-fg-subtle outline-none disabled:cursor-not-allowed',\n },\n variants: {\n inFormField: {\n // Inside a form-field: keep only the chip-strip layout; the field owns\n // border, padding, background and the focused-border indicator.\n true: { root: '' },\n false: {\n root: 'rounded-md border border-border bg-surface transition-colors duration-normal motion-reduce:transition-none hover:border-border-strong focus-within:outline-2 focus-within:outline-offset-2',\n },\n },\n size: {\n // removeButton uses the square-interactive sub-scale (the button IS the\n // touch target): size-6 (24px) meets WCAG 2.5.8; negative margins absorb\n // the overflow so the chip height is unchanged. Mirrors badge's dismiss.\n // `size-3.5` half-step on the md remove glyph lines up the X with text-sm\n // at md density (codified half-step per CLAUDE.md icon sizing).\n xs: { root: 'text-xs', removeButton: 'size-6 -my-1 -mr-1', removeIcon: 'size-3' },\n sm: { root: 'text-sm', removeButton: 'size-6 -my-1 -mr-1', removeIcon: 'size-3' },\n md: { root: 'text-sm', removeButton: 'size-7 -my-1.5 -mr-1.5', removeIcon: 'size-3.5' },\n lg: { root: 'text-base', removeButton: 'size-8 -my-1.5 -mr-1.5', removeIcon: 'size-4' },\n xl: { root: 'text-base', removeButton: 'size-8 -my-1.5 -mr-1.5', removeIcon: 'size-4' },\n },\n color: {\n primary: { root: 'focus-within:outline-primary-500' },\n secondary: { root: 'focus-within:outline-secondary-500' },\n accent: { root: 'focus-within:outline-accent-500' },\n neutral: { root: 'focus-within:outline-border-strong' },\n info: { root: 'focus-within:outline-info-500' },\n success: { root: 'focus-within:outline-success-500' },\n warning: { root: 'focus-within:outline-warning-500' },\n error: { root: 'focus-within:outline-error-500' },\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none cursor-not-allowed' },\n false: {},\n },\n errorState: {\n true: {},\n false: {},\n },\n },\n compoundVariants: [\n // Standalone density × size — inline padding scale (mirrors combobox trigger)\n // plus the control-height FLOOR. Per docs/vertical-rhythm.md §2 the chip\n // strip is a `min-h` control, not a pinned one: chips wrap, so `py-*` stays\n // exactly as it is and `min-h-*` only guarantees the box never sits below\n // the control scale. Standalone-only, alongside the padding: inside a\n // `tw-form-field` the root drops its border and padding and the field owns\n // the box, so a floor here would stack on top of the field's own padding.\n // Vertical padding is set so the `min-h-*` floor actually BINDS at rest.\n //\n // The tallest resting content is a CHIP, not the bare input line box. A\n // chip is a badge: its own padding and text size make it taller than the\n // input beside it at every size, so the box arithmetic that decides\n // whether the floor binds is\n //\n // chip + 2*py + 2px border <= floor\n //\n // Sizing the padding against the input line box instead left the floor\n // inert the moment a single tag existed. Empty, the control measured\n // correctly at all five sizes; populated, it measured 26 / 32 / 38 / 50 /\n // 54 against a 24 / 32 / 36 / 44 / 48 scale — so a filter bar was on the\n // grid until the user typed the first tag, then jumped 2px at xs and md\n // and 6px at lg and xl. Only sm was ever correct, which is why the\n // isolated slot reading looked like a one-off rather than a broken rule.\n //\n // Resting appearance does not change: once the floor binds, `items-center`\n // centres the chip and the padding is no longer what sets the height. The\n // padding still governs the multi-line case, where chips wrap and the box\n // legitimately grows past the floor.\n //\n // Chip heights are 20 / 20 / 24 / 32 / 32, so the padding ceiling is\n // 1 / 5 / 5 / 5 / 7px. `py-px` at xs is not decorative restraint: a 20px\n // chip inside a 24px control with a 1px border leaves exactly 1px a side.\n { inFormField: false, size: 'xs', class: { root: 'px-2 py-px min-h-6' } },\n { inFormField: false, size: 'sm', class: { root: 'px-3 py-1 min-h-8' } },\n { inFormField: false, size: 'md', class: { root: 'px-4 py-1 min-h-9' } },\n { inFormField: false, size: 'lg', class: { root: 'px-5 py-1 min-h-11' } },\n { inFormField: false, size: 'xl', class: { root: 'px-6 py-1.5 min-h-12' } },\n // Standalone error state — colored border + focus ring.\n {\n inFormField: false,\n errorState: true,\n class: { root: 'border-error-500 focus-within:outline-error-500' },\n },\n ],\n defaultVariants: {\n inFormField: false,\n size: 'md',\n color: 'primary',\n disabled: false,\n errorState: false,\n },\n },\n { twMerge: true },\n);\n\nconst DEFAULT_SEPARATORS: readonly string[] = ['Enter', ','];\n\nlet nextId = 0;\n\n/**\n * Free-text multi-value input. The user types a token and commits it via Enter,\n * a separator key, paste, or blur; committed tokens render as dismissible chips\n * (composing `[twBadge]`) inline with the text input. The value is exposed as a\n * real `T[]` (default `string[]`) through `ControlValueAccessor`, so it works\n * with template-driven, reactive, and signal forms and integrates with\n * `<tw-form-field>` for label / hint / error chrome.\n *\n * The control is a single tab stop with a roving-tabindex chip strip\n * (Material `MatChipGrid` interaction model): Arrow keys traverse chips and the\n * input, Delete / a two-step Backspace remove chips, and `LiveAnnouncer` voices\n * add / remove. Autocomplete suggestions are out of scope (use `tw-combobox`).\n */\n@Component({\n selector: 'tw-tags-input',\n exportAs: 'twTagsInput',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [BadgeComponent],\n providers: [\n {\n provide: TW_FORM_FIELD_CONTROL,\n useExisting: forwardRef(() => TagsInputComponent),\n },\n ],\n template: `\n @for (chip of chipViews(); track chip.index) {\n <span twBadge variant=\"soft\" [color]=\"color()\" [size]=\"size()\" [class]=\"chipClasses()\">\n <span [class]=\"chipLabelClasses()\">{{ chip.label }}</span>\n <button\n #removeBtn\n type=\"button\"\n [class]=\"removeButtonClasses()\"\n [attr.tabindex]=\"activeChipIndex() === chip.index ? 0 : -1\"\n [attr.aria-label]=\"chip.removeLabel\"\n [disabled]=\"disabled()\"\n (click)=\"onRemoveClick(chip.index)\"\n (keydown)=\"onChipKeydown($event, chip.index)\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n [class]=\"removeIconClasses()\"\n >\n <path\n d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\"\n />\n </svg>\n </button>\n </span>\n }\n <input\n #textInput\n type=\"text\"\n [class]=\"inputClasses()\"\n [attr.tabindex]=\"activeChipIndex() === null ? 0 : -1\"\n [attr.placeholder]=\"placeholder() || null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedLabelledBy() || null\"\n [attr.aria-describedby]=\"resolvedDescribedBy() || null\"\n [attr.aria-invalid]=\"errorState() || null\"\n [attr.name]=\"name() || null\"\n [disabled]=\"disabled()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onInputKeydown($event)\"\n (paste)=\"onPaste($event)\"\n />\n `,\n host: {\n 'role': 'group',\n '[id]': 'id()',\n '[class]': 'rootClasses()',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.aria-labelledby]': 'resolvedLabelledBy() || null',\n '[attr.aria-describedby]': 'resolvedDescribedBy() || null',\n '[attr.aria-disabled]': 'disabled() || null',\n // NOTE: no `aria-invalid` here. ARIA 1.2 does not allow it on\n // `role=\"group\"` (axe: critical `aria-allowed-attr`). The inner\n // `<input type=\"text\">` already carries it — that is the control with the\n // value. Latent rather than observed: it only fires once a consumer puts\n // the control into an error state.\n '[attr.data-focused]': 'focused() || null',\n },\n})\nexport class TagsInputComponent<T = string>\n extends FormFieldControl<T[]>\n implements ControlValueAccessor, OnInit\n{\n /** Semantic color for the container focus-within ring and the chip accent. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls overall density: container padding, chip size, and text scale. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, blocks typing, committing, and chip removal, and applies muted styling. Reactive forms also propagate disabled via `setDisabledState`. Defaults to `false`. */\n readonly disabledInput = input(false, { alias: 'disabled' });\n\n /** Marks the control as required. Mirrored to the input's `aria-required`. Also inferred from `Validators.required` on a bound control. Defaults to `false`. */\n readonly requiredInput = input(false, { alias: 'required' });\n\n /** Placeholder shown in the text input only while there are no chips and the input is empty. Defaults to `undefined`. */\n readonly placeholder = input<string | undefined>(undefined);\n\n /** Keys that commit the in-progress text as a tag. Each entry is a `KeyboardEvent.key` value (`'Enter'`) or a single separator character (`','`). Single-character separators also split pasted text. Defaults to `['Enter', ',']`. */\n readonly separatorKeys = input<readonly string[]>(DEFAULT_SEPARATORS);\n\n /** When true, blurring the control while the input holds non-empty text commits it as a tag. Defaults to `false`. */\n readonly addOnBlur = input(false);\n\n /** Maximum number of tags. Once reached, further commits are blocked and announced. Does not truncate an oversized `writeValue`. Defaults to `undefined` (no limit). */\n readonly maxTags = input<number | undefined>(undefined);\n\n /** When false (default), a committed tag equal (per `compareWith`) to an existing tag is dropped silently. When true, duplicates are kept. Defaults to `false`. */\n readonly allowDuplicates = input(false);\n\n /** Maps committed text to a tag value. Default is identity — the trimmed string. Override to build object tags. */\n readonly createTag = input<TwTagFactory<T>>(\n ((text: string) => text) as unknown as TwTagFactory<T>,\n );\n\n /** Maps a tag value to its visible chip label and the remove-button accessible name. Defaults to `String(tag)`. */\n readonly tagLabel = input<TwTagLabelFn<T>>((tag: T) => String(tag));\n\n /** Equality comparator used for dedup when `allowDuplicates` is false. Defaults to `Object.is` (reference / value identity). String tags dedupe case-sensitively by default; pass `(a, b) => a.toLowerCase() === b.toLowerCase()` for case-insensitive dedup. */\n readonly compareWith = input<TwTagCompareFn<T>>((a: T, b: T) => Object.is(a, b));\n\n /** Applied to the text input for labeling and identification only; does not submit the tag array via native (non-Angular) form posting. Defaults to `undefined`. */\n readonly name = input<string | undefined>(undefined);\n\n /** Id on the host element. Auto-generated as `tw-tags-input-N` when not provided. Used by the form-field's `<label for>` association. */\n readonly idInput = input<string | undefined>(undefined, { alias: 'id' });\n\n /** Accessible name applied to the control when no visible label is wired. Mirrored to `aria-label`. Defaults to `undefined`. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** ID of an external element that labels the control. Mirrored to `aria-labelledby`. Defaults to `undefined`. */\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n /** ID of an external element that describes the control. Form-field merges its hint / error ids alongside. Defaults to `undefined`. Alias: `aria-describedby`. */\n readonly ariaDescribedby = input<string | undefined>(undefined, { alias: 'aria-describedby' });\n\n /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, uses the `TW_ERROR_STATE_MATCHER` token's value. */\n readonly errorStateMatcher = input<ErrorStateMatcher | undefined>(undefined);\n\n /**\n * Fires when the tag array changes through user interaction (add, remove,\n * clear). Emits a fresh array reference. Does **not** fire on `writeValue` /\n * `FormControl.setValue` / `ngModel`.\n *\n * This is a hand-written, user-gesture-only output. The control exposes no\n * `value` input and therefore no two-way binding, so — unlike\n * `tw-checkbox` / `tw-switch` / `tw-radio-group`, where `(valueChange)` /\n * `(checkedChange)` is minted by a `model()` and fires on programmatic writes\n * too — there is no any-change channel here. Observe programmatic writes\n * through the bound form control's own `valueChanges`.\n */\n readonly valueChange = output<T[]>();\n\n /** Fires when a tag is committed via Enter, a separator key, paste, or `addTag()`. Does not fire for dropped duplicates, blocked-by-max commits, empty commits, or `writeValue`. */\n readonly tagAdded = output<TwTagAddedEvent<T>>();\n\n /** Fires when a tag is removed via the remove button, Backspace / Delete, or `removeTag()`. Does not fire on `writeValue` or `clear()`. */\n readonly tagRemoved = output<TwTagRemovedEvent<T>>();\n\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n private readonly ngControl = inject(NgControl, { optional: true, self: true });\n private readonly formField = inject(TW_FORM_FIELD, { optional: true });\n /**\n * Optional so a consumer that never imports `BidiModule` still gets a working\n * control — chip navigation falls back to LTR when the token is absent. Read\n * imperatively inside the keydown handlers; nothing here needs to re-render\n * on a direction change.\n */\n private readonly directionality = inject(Directionality, { optional: true });\n\n private readonly textInputRef = viewChild<ElementRef<HTMLInputElement>>('textInput');\n private readonly removeButtons = viewChildren<ElementRef<HTMLButtonElement>>('removeBtn');\n\n private onChange: (value: T[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n private readonly tags = signal<T[]>([]);\n /** The current in-progress (uncommitted) text in the input. Empty when nothing is typed. */\n readonly inputText = signal('');\n /** @internal Roving-tabindex position. `null` = the text input is the active element; a number = that chip's remove button. */\n protected readonly activeChipIndex = signal<number | null>(null);\n private readonly cvaDisabled = signal(false);\n private readonly _focused = signal(false);\n\n /** @internal Shared `errorState` / `required` / `errors` derivation — see `wireErrorState`. */\n private readonly errorWiring = wireErrorState({\n ngControl: () => this.ngControl,\n matcher: () => this.errorStateMatcher(),\n required: () => this.requiredInput(),\n track: [() => this._focused()],\n });\n private readonly describedByIdsSignal = signal<readonly string[]>([]);\n private readonly labelledByIdsSignal = signal<readonly string[]>([]);\n /** Nonce bumped only on explicit focus intent — keeps the focus effect from stealing focus on unrelated renders. */\n private readonly focusNonce = signal(0);\n private lastMaxAnnounce = 0;\n\n private readonly uid = nextId++;\n /** @internal Fallback id used when the consumer does not set `[id]`. */\n readonly hostId = `tw-tags-input-${this.uid}`;\n\n // ── FormFieldControl signals ──\n\n /** @internal */\n readonly id: Signal<string> = computed(() => this.idInput() ?? this.hostId);\n\n /** The current tag array (empty array when there are no tags). Read from a template ref (`#t=\"twTagsInput\"`) for non-form usage. Doubles as the `FormFieldControl` contract member. */\n readonly value: Signal<T[]> = this.tags.asReadonly();\n\n /** @internal */\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n\n /** @internal Empty when there are no chips AND the input text is blank — drives the form-field floating label. */\n readonly empty: Signal<boolean> = computed(\n () => this.tags().length === 0 && this.inputText().trim().length === 0,\n );\n\n /** @internal */\n readonly disabled: Signal<boolean> = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n /** @internal */\n readonly required: Signal<boolean> = this.errorWiring.required;\n\n /** @internal */\n readonly errorState: Signal<boolean> = this.errorWiring.errorState;\n\n /** @internal Active validation errors map from the bound control, for `[twError match=\"…\"]` filtering. */\n override readonly errors = this.errorWiring.errors;\n\n /** @internal */\n readonly controlType = 'tags-input';\n\n /** @internal */\n readonly userAriaDescribedBy: Signal<string | undefined> = computed(() => this.ariaDescribedby());\n\n /** @internal */\n override readonly userAriaLabelledby: Signal<string | undefined> = computed(() =>\n this.ariaLabelledby(),\n );\n\n // ── Effective ARIA ──\n //\n // When wrapped by `<tw-form-field>`, the form-field pushes the FULLY MERGED\n // id list (hint/error/label + the consumer's `aria-*by` ids) via\n // `setDescribedByIds` / `setLabelledByIds`. In that case the pushed ids alone\n // are the source of truth — re-merging the consumer's `aria-*by` input on top\n // would duplicate ids. When standalone, fall back to the consumer-supplied\n // `aria-*by` input.\n\n /** @internal Merged `aria-describedby` (form-field hint/error ids + consumer-supplied). */\n readonly resolvedDescribedBy = computed(() => {\n const pushed = this.describedByIdsSignal();\n if (pushed.length) return pushed.join(' ');\n const user = this.ariaDescribedby();\n if (user) return user.split(/\\s+/).filter(Boolean).join(' ');\n return '';\n });\n\n /** @internal Merged `aria-labelledby` (form-field label id + consumer-supplied). */\n readonly resolvedLabelledBy = computed(() => {\n const pushed = this.labelledByIdsSignal();\n if (pushed.length) return pushed.join(' ');\n const user = this.ariaLabelledby();\n if (user) return user.split(/\\s+/).filter(Boolean).join(' ');\n return '';\n });\n\n // ── tv() class bindings ──\n\n private readonly variantResult = computed(() =>\n tagsInputVariants({\n inFormField: !!this.formField,\n size: this.size(),\n color: this.color(),\n disabled: this.disabled(),\n errorState: this.errorState(),\n }),\n );\n\n /** @internal */\n readonly rootClasses = computed(() => this.variantResult().root());\n /** @internal */\n readonly chipClasses = computed(() => this.variantResult().chip());\n /** @internal */\n readonly chipLabelClasses = computed(() => this.variantResult().chipLabel());\n /** @internal */\n readonly removeButtonClasses = computed(() => this.variantResult().removeButton());\n /** @internal */\n readonly removeIconClasses = computed(() => this.variantResult().removeIcon());\n /** @internal */\n readonly inputClasses = computed(() => this.variantResult().input());\n\n /** @internal Pre-resolved chip view models so the template never calls accessor functions inline. */\n readonly chipViews = computed(() => {\n const label = this.tagLabel();\n return this.tags().map((tag, index) => {\n const text = label(tag);\n return { tag, label: text, removeLabel: `Remove ${text}`, index };\n });\n });\n\n constructor() {\n super();\n // Runtime CVA wiring — register on any host-level NgControl. The component\n // injects `NgControl { self }` for TW_ERROR_STATE_MATCHER, so a static\n // NG_VALUE_ACCESSOR provider would create circular DI on the same instance.\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n // Focus side-effect (leaves the signal graph; writes no signal → no cycle).\n // Triggered only by `focusNonce` bumps so it never steals focus on an\n // unrelated render (e.g. initial mount). Reads the active index and refs\n // untracked so it does not re-fire when the chip list changes on its own.\n effect(() => {\n if (this.focusNonce() === 0) return;\n untracked(() => {\n const idx = this.activeChipIndex();\n if (idx === null) {\n this.textInputRef()?.nativeElement.focus();\n } else {\n this.removeButtons()[idx]?.nativeElement.focus();\n }\n });\n });\n\n afterNextRender(() => {\n if (isDevMode() && !this.hasAccessibleNameHint()) {\n console.warn(\n '[tw-tags-input] The control has no accessible name. Provide `aria-label` / `aria-labelledby`, or wrap it in a <tw-form-field> with a <label twLabel>.',\n );\n }\n });\n }\n\n // ── Public instance API ──\n\n /** Commits `text` as a tag (trim → `createTag` → dedup unless `allowDuplicates` → `maxTags` check). Returns true if a tag was added, false if dropped (empty / duplicate / max). Emits `tagAdded` + `valueChange` on success. No-op when disabled. */\n addTag(text: string): boolean {\n if (this.disabled()) return false;\n const trimmed = text.trim();\n if (!trimmed) return false;\n return this.tryAdd(this.createTag()(trimmed)) === 'added';\n }\n\n /** Removes a tag by value (first match via `compareWith`) or by index when a number is passed. Emits `tagRemoved` + `valueChange` and restores focus. No-op when disabled or when no match. Note: when the tag type is `number`, the argument is treated as an index. */\n removeTag(tag: T | number): void {\n if (this.disabled()) return;\n if (typeof tag === 'number') {\n this.removeAt(tag);\n return;\n }\n const cmp = this.compareWith();\n const idx = this.tags().findIndex((t) => cmp(t, tag));\n if (idx >= 0) this.removeAt(idx);\n }\n\n /** Removes all tags and clears the in-progress input text. Emits `valueChange` with `[]`. Does NOT emit `tagRemoved` per tag (bulk reset). No-op when already empty or disabled. */\n clear(): void {\n if (this.disabled()) return;\n if (this.tags().length === 0 && this.inputText().length === 0) return;\n this.tags.set([]);\n this.setInputText('');\n this.activeChipIndex.set(null);\n this.onChange([]);\n this.valueChange.emit([]);\n this.liveAnnouncer.announce('All tags removed', 'polite');\n }\n\n /** Moves focus to the text input. */\n focus(): void {\n this.activeChipIndex.set(null);\n this.requestFocus();\n }\n\n // ── Internal commit / remove pipeline ──\n\n private tryAdd(tag: T): 'added' | 'duplicate' | 'max' {\n const current = this.tags();\n if (!this.allowDuplicates()) {\n const cmp = this.compareWith();\n if (current.some((e) => cmp(e, tag))) return 'duplicate';\n }\n const max = this.maxTags();\n if (max !== undefined && current.length >= max) {\n this.announceMax();\n return 'max';\n }\n const next = [...current, tag];\n this.tags.set(next);\n this.onChange(next);\n this.tagAdded.emit({ tag, value: next });\n this.valueChange.emit(next);\n this.liveAnnouncer.announce(`${this.tagLabel()(tag)} added`, 'polite');\n return 'added';\n }\n\n private commitInput(): void {\n if (this.disabled()) return;\n const trimmed = this.inputText().trim();\n if (!trimmed) {\n this.setInputText('');\n return;\n }\n const result = this.tryAdd(this.createTag()(trimmed));\n // Clear on success or duplicate (gesture consumed); retain on max so the\n // user can retry after removing a tag.\n if (result !== 'max') this.setInputText('');\n }\n\n private removeAt(index: number): void {\n if (this.disabled()) return;\n const current = this.tags();\n if (index < 0 || index >= current.length) return;\n const tag = current[index];\n const next = current.filter((_, i) => i !== index);\n this.tags.set(next);\n this.onChange(next);\n this.tagRemoved.emit({ tag, value: next, index });\n this.valueChange.emit(next);\n this.liveAnnouncer.announce(`${this.tagLabel()(tag)} removed`, 'polite');\n // Focus restoration: next chip at this index, else the previous chip, else the input.\n if (next.length === 0) {\n this.focusInput();\n } else if (index < next.length) {\n this.focusChip(index);\n } else {\n this.focusChip(next.length - 1);\n }\n }\n\n // ── DOM event handlers ──\n\n /** @internal */\n onInput(event: Event): void {\n this.inputText.set((event.target as HTMLInputElement).value);\n }\n\n /** @internal */\n onInputKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const separators = this.separatorKeys();\n const key = event.key;\n\n // Single-character separator → commit (and swallow the character).\n if (key.length === 1 && separators.includes(key)) {\n event.preventDefault();\n this.commitInput();\n return;\n }\n // Enter separator → commit only when there is text (otherwise let the form submit).\n if (key === 'Enter' && separators.includes('Enter')) {\n if (this.inputText().trim().length > 0) {\n event.preventDefault();\n this.commitInput();\n }\n return;\n }\n // Stepping out of the input into the last chip is a *backwards* move: the\n // chip row is rendered before the input, so it is ArrowLeft in LTR and\n // ArrowRight in an RTL locale, where the row lays out right-to-left. The\n // caret test is direction-independent — `selectionStart === 0` is the\n // logical start of the text in both directions.\n const backKey = this.directionality?.value === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n if (key === backKey) {\n const el = event.target as HTMLInputElement;\n const atStart = (el.selectionStart ?? 0) === 0 && (el.selectionEnd ?? 0) === 0;\n if (atStart && this.tags().length > 0) {\n event.preventDefault();\n this.focusChip(this.tags().length - 1);\n }\n return;\n }\n if (key === 'Backspace' && this.inputText().length === 0) {\n if (this.tags().length > 0) {\n event.preventDefault();\n this.focusChip(this.tags().length - 1);\n }\n return;\n }\n if (key === 'Escape' && this.inputText().length > 0) {\n event.preventDefault();\n this.setInputText('');\n }\n }\n\n /** @internal */\n onChipKeydown(event: KeyboardEvent, index: number): void {\n if (this.disabled()) return;\n const last = this.tags().length - 1;\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowRight': {\n // Horizontal arrows follow the layout direction. Chips sit on a\n // flex row that lays out right-to-left in an RTL locale, so ArrowLeft\n // is the *forward* key there. The chip host is a custom element, not a\n // native control, so the browser does no flipping for us. Home/End stay\n // logical — CDK's ListKeyManager does not flip them either.\n event.preventDefault();\n const rtl = this.directionality?.value === 'rtl';\n const forward = rtl ? event.key === 'ArrowLeft' : event.key === 'ArrowRight';\n if (forward) {\n if (index < last) this.focusChip(index + 1);\n else this.focusInput();\n } else if (index > 0) {\n this.focusChip(index - 1);\n }\n return;\n }\n case 'Home':\n event.preventDefault();\n this.focusChip(0);\n return;\n case 'End':\n event.preventDefault();\n this.focusInput();\n return;\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n this.removeAt(index);\n return;\n case 'Escape':\n event.preventDefault();\n this.focusInput();\n return;\n default:\n return;\n }\n }\n\n /** @internal */\n onRemoveClick(index: number): void {\n this.removeAt(index);\n }\n\n /** @internal */\n onPaste(event: ClipboardEvent): void {\n if (this.disabled()) return;\n const data = event.clipboardData?.getData('text') ?? '';\n const charSeparators = this.separatorKeys().filter((k) => k.length === 1);\n const hasSeparator = charSeparators.some((s) => data.includes(s));\n if (!hasSeparator) {\n // No separator: let the browser merge the text into the input natively.\n return;\n }\n event.preventDefault();\n const combined = this.inputText() + data;\n this.setInputText('');\n for (const piece of this.splitOnSeparators(combined, charSeparators)) {\n const trimmed = piece.trim();\n if (!trimmed) continue;\n if (this.tryAdd(this.createTag()(trimmed)) === 'max') break;\n }\n }\n\n // ── ControlValueAccessor ──\n\n writeValue(value: T[] | null | undefined): void {\n this.tags.set(Array.isArray(value) ? [...value] : []);\n this.setInputText('');\n }\n\n registerOnChange(fn: (value: T[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n // ── FormFieldControl methods ──\n\n /** @internal */\n setDescribedByIds(ids: string[]): void {\n this.describedByIdsSignal.set([...ids]);\n }\n\n /** @internal */\n override setLabelledByIds(ids: string[]): void {\n this.labelledByIdsSignal.set([...ids]);\n }\n\n /** @internal Clicking the form-field surface (outside the control) focuses the text input. Clicks inside the control are left alone so chip removal keeps its own focus restoration. */\n onContainerClick(event: MouseEvent): void {\n if (this.disabled()) return;\n if (event.defaultPrevented) return;\n const host = this.elementRef.nativeElement;\n if (event.target === host || host.contains(event.target as Node)) return;\n this.focus();\n }\n\n // ── Lifecycle ──\n\n ngOnInit(): void {\n // checkChildren: true — internal focus moves (input ↔ chips) stay \"focused\";\n // origin === null fires only when focus leaves the whole control, the single\n // source for onTouched and the addOnBlur commit.\n const monitor$ = this.focusMonitor.monitor(this.elementRef, true);\n if (isObservable(monitor$)) {\n monitor$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((origin) => {\n const wasFocused = this._focused();\n this._focused.set(!!origin);\n if (wasFocused && !origin) {\n if (this.addOnBlur() && this.inputText().trim().length > 0) {\n this.commitInput();\n }\n this.onTouched();\n this.errorWiring.bump();\n // Reset roving so the next Tab into the control lands on the input.\n this.activeChipIndex.set(null);\n }\n });\n }\n this.destroyRef.onDestroy(() => this.focusMonitor.stopMonitoring(this.elementRef));\n\n this.errorWiring.connect();\n }\n\n // ── Helpers ──\n\n private focusChip(index: number): void {\n this.activeChipIndex.set(index);\n this.requestFocus();\n }\n\n private focusInput(): void {\n this.activeChipIndex.set(null);\n this.requestFocus();\n }\n\n private requestFocus(): void {\n this.focusNonce.update((n) => n + 1);\n }\n\n private setInputText(value: string): void {\n this.inputText.set(value);\n const el = this.textInputRef()?.nativeElement;\n if (el && el.value !== value) el.value = value;\n }\n\n private announceMax(): void {\n const now = Date.now();\n if (now - this.lastMaxAnnounce < 500) return;\n this.lastMaxAnnounce = now;\n this.liveAnnouncer.announce(`Maximum ${this.maxTags()} tags reached`, 'assertive');\n }\n\n private splitOnSeparators(text: string, separators: readonly string[]): string[] {\n if (separators.length === 0) return [text];\n let normalized = text;\n for (const s of separators) normalized = normalized.split(s).join('\\u0000');\n return normalized.split('\\u0000');\n }\n\n private hasAccessibleNameHint(): boolean {\n return (\n !!this.ariaLabel() ||\n !!this.ariaLabelledby() ||\n this.labelledByIdsSignal().length > 0\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { inject, input, booleanAttribute, numberAttribute, computed, effect, for
|
|
|
3
3
|
import * as i1 from '@angular/cdk/text-field';
|
|
4
4
|
import { CdkTextareaAutosize } from '@angular/cdk/text-field';
|
|
5
5
|
import { tv } from 'tailwind-variants';
|
|
6
|
-
import { TW_FORM_FIELD_CONTROL } from '@cdevhub/ngx-tw/form-field';
|
|
6
|
+
import { TW_FORM_FIELD, TW_FORM_FIELD_CONTROL } from '@cdevhub/ngx-tw/form-field';
|
|
7
7
|
import { InputDirective } from '@cdevhub/ngx-tw/input';
|
|
8
8
|
|
|
9
9
|
const textareaVariants = tv({
|
|
@@ -14,9 +14,33 @@ const textareaVariants = tv({
|
|
|
14
14
|
vertical: 'resize-y',
|
|
15
15
|
both: 'resize',
|
|
16
16
|
},
|
|
17
|
+
// Control-height floor from `docs/vertical-rhythm.md`. A floor, not a
|
|
18
|
+
// pinned height — a textarea has to grow with its content — so the
|
|
19
|
+
// vertical padding on the shared size scale is retained alongside it.
|
|
20
|
+
//
|
|
21
|
+
// It lives here rather than on `inputVariants`' size scale because it
|
|
22
|
+
// must be droppable, via the `'none'` value:
|
|
23
|
+
//
|
|
24
|
+
// - Under `autosize`, `CdkTextareaAutosize` owns the height. It caches
|
|
25
|
+
// its line height from the `clientHeight` of a `cloneNode()`d textarea
|
|
26
|
+
// and clears only the clone's *inline* min-height, so a `min-h-*`
|
|
27
|
+
// class would survive onto the clone, inflate the cached line height,
|
|
28
|
+
// and leave the real field too short for its own text. CDK's own
|
|
29
|
+
// `minRows` inline min-height is the floor in that mode.
|
|
30
|
+
// - Inside a `<tw-form-field>`, the wrapper's control row owns the
|
|
31
|
+
// height (the control is stripped to `p-0 border-0`).
|
|
32
|
+
heightFloor: {
|
|
33
|
+
none: '',
|
|
34
|
+
xs: 'min-h-6',
|
|
35
|
+
sm: 'min-h-8',
|
|
36
|
+
md: 'min-h-9',
|
|
37
|
+
lg: 'min-h-11',
|
|
38
|
+
xl: 'min-h-12',
|
|
39
|
+
},
|
|
17
40
|
},
|
|
18
41
|
defaultVariants: {
|
|
19
42
|
resize: 'vertical',
|
|
43
|
+
heightFloor: 'none',
|
|
20
44
|
},
|
|
21
45
|
}, { twMerge: true });
|
|
22
46
|
/**
|
|
@@ -43,6 +67,10 @@ class TextareaDirective extends InputDirective {
|
|
|
43
67
|
self: true,
|
|
44
68
|
optional: true,
|
|
45
69
|
});
|
|
70
|
+
// Re-injected here (the base directive keeps its own reference private) so
|
|
71
|
+
// `textareaClasses()` can drop the control-height floor when the wrapper owns
|
|
72
|
+
// the row height.
|
|
73
|
+
parentFormField = inject(TW_FORM_FIELD, { optional: true });
|
|
46
74
|
// @internal Re-declares the `size` input inherited from `InputDirective` so
|
|
47
75
|
// it lands on this directive's own `ɵdir` input metadata. ng-packagr emits
|
|
48
76
|
// `ɵdir` with only the child's directly declared inputs, so without this the
|
|
@@ -58,7 +86,7 @@ class TextareaDirective extends InputDirective {
|
|
|
58
86
|
// the same resolution sees the member, so `@ts-expect-error` would itself
|
|
59
87
|
// flag as unused. `@ts-ignore` suppresses whichever error fires and is
|
|
60
88
|
// a no-op when neither does.
|
|
61
|
-
/** Density of a standalone textarea. Maps to the inline-padding + font scale (`xs` … `xl`). Ignored inside a `<tw-form-field>` — the wrapper's `size` carries density. Defaults to `'md'`. */
|
|
89
|
+
/** Density of a standalone textarea. Maps to the inline-padding + font scale (`xs` … `xl`) and to a `min-h-*` floor on the control-height scale (24/32/36/44/48px) — a floor, not a fixed height, because a textarea must grow with its content. The floor is dropped while `autosize` is on (CDK owns the height then; `minRows` is the floor). Ignored inside a `<tw-form-field>` — the wrapper's `size` carries density. Defaults to `'md'`. */
|
|
62
90
|
// TS4113 (CI) vs TS4114 (local) divergence means neither directive matches
|
|
63
91
|
// both, so we intentionally pick `@ts-ignore` over `@ts-expect-error`; see
|
|
64
92
|
// the longer comment above for the full reasoning.
|
|
@@ -82,13 +110,17 @@ class TextareaDirective extends InputDirective {
|
|
|
82
110
|
/** Current value length, updates on every `input` event. Wire `<span twHint align="end">{{ ta.valueLength() }} / {{ ta.maxLength() }}</span>` for a character counter. */
|
|
83
111
|
valueLength = computed(() => this.value()?.length ?? 0, /* @ts-ignore */
|
|
84
112
|
...(ngDevMode ? [{ debugName: "valueLength" }] : /* istanbul ignore next */ []));
|
|
85
|
-
/** @internal Textarea-specific Tailwind classes (resize axis). Combined with the inherited `classes()` in the host `[class]` binding. */
|
|
86
|
-
textareaClasses = computed(() =>
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
113
|
+
/** @internal Textarea-specific Tailwind classes (resize axis + control-height floor). Combined with the inherited `classes()` in the host `[class]` binding — the two strings never emit conflicting utilities, so concatenating them needs no cross-config merge. */
|
|
114
|
+
textareaClasses = computed(() => {
|
|
115
|
+
// Drop the floor whenever something else owns the height — see the
|
|
116
|
+
// `heightFloor` variant.
|
|
117
|
+
const heightFloor = this.autosize() || this.parentFormField ? 'none' : this.size();
|
|
118
|
+
// Short-circuit the resize/autosize conflict deterministically — don't
|
|
119
|
+
// rely on tv variant emission order or twMerge "last wins" semantics.
|
|
120
|
+
return this.autosize()
|
|
121
|
+
? textareaVariants({ resize: 'none', heightFloor })
|
|
122
|
+
: textareaVariants({ resize: this.resize(), heightFloor });
|
|
123
|
+
}, /* @ts-ignore */
|
|
92
124
|
...(ngDevMode ? [{ debugName: "textareaClasses" }] : /* istanbul ignore next */ []));
|
|
93
125
|
constructor() {
|
|
94
126
|
super();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-textarea.mjs","sources":["../../../projects/ngx-tw/textarea/textarea.ts","../../../projects/ngx-tw/textarea/cdevhub-ngx-tw-textarea.ts"],"sourcesContent":["import {\n booleanAttribute,\n computed,\n Directive,\n effect,\n forwardRef,\n inject,\n input,\n numberAttribute,\n type Signal,\n} from '@angular/core';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport { TW_FORM_FIELD_CONTROL } from '@cdevhub/ngx-tw/form-field';\nimport { InputDirective } from '@cdevhub/ngx-tw/input';\n\n/**\n * How the user-resize handle behaves on the textarea. `'vertical'` (the\n * default) lets users drag the bottom edge to grow the textarea; `'none'`\n * locks the size; `'both'` allows free resizing on both axes (rarely useful\n * inside a form-field — the textarea can overflow the wrapper). Horizontal\n * is intentionally omitted — it breaks form-field layout in practice.\n */\nexport type TwTextareaResize = 'none' | 'vertical' | 'both';\n\nconst textareaVariants = tv(\n {\n base: '',\n variants: {\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n both: 'resize',\n },\n },\n defaultVariants: {\n resize: 'vertical',\n },\n },\n { twMerge: true },\n);\n\n/**\n * Adapts a native `<textarea>` into an ngx-tw form-field-compatible multi-line\n * control. Extends {@link InputDirective} — inherits its form-field\n * integration, error-state machinery, autofill / focus tracking, ARIA wiring,\n * and standalone styling. Adds textarea-specific behavior: autosize composition\n * via CDK's `CdkTextareaAutosize`, a `resize` axis for the user-resize handle,\n * `rows` / `minRows` / `maxRows`, and `maxLength` with a `valueLength` signal\n * for character counters.\n *\n * Like `InputDirective`, this directive deliberately does NOT implement\n * `ControlValueAccessor`. Angular's built-in `DefaultValueAccessor` attaches to\n * the native `<textarea>` and handles value I/O for template-driven\n * (`ngModel`), reactive (`FormControl` / `formControlName`), and signal-forms\n * (`formField`) bindings — no library glue required.\n *\n * Form-control input-cap exception applies (codified in CLAUDE.md): ARIA +\n * forms baseline plus textarea-specific surface exceeds the 5–6 cap;\n * `checkbox` is the canonical 12+ exemplar.\n */\n@Directive({\n selector: 'textarea[twTextarea]',\n exportAs: 'twTextarea',\n hostDirectives: [\n {\n directive: CdkTextareaAutosize,\n inputs: [\n 'cdkAutosizeMinRows: minRows',\n 'cdkAutosizeMaxRows: maxRows',\n ],\n },\n ],\n providers: [\n {\n provide: TW_FORM_FIELD_CONTROL,\n useExisting: forwardRef(() => TextareaDirective),\n },\n ],\n host: {\n '[class]': 'classes() + \" \" + textareaClasses()',\n '[attr.id]': 'id()',\n '[attr.rows]': 'rows()',\n '[attr.maxlength]': 'maxLength() ?? null',\n '[disabled]': 'disabled()',\n '[attr.aria-invalid]': 'errorState() || null',\n '[attr.aria-required]': 'required() || null',\n '(input)': '_onInput()',\n },\n})\nexport class TextareaDirective extends InputDirective {\n private readonly cdkAutosize = inject(CdkTextareaAutosize, {\n self: true,\n optional: true,\n });\n\n // @internal Re-declares the `size` input inherited from `InputDirective` so\n // it lands on this directive's own `ɵdir` input metadata. ng-packagr emits\n // `ɵdir` with only the child's directly declared inputs, so without this the\n // consumer-side strict template-check rejects `<textarea twTextarea\n // [size]=\"…\">` with NG8002. Both signals share the same `'md'` default and\n // the inherited `classes()` computed reads through polymorphism, so runtime\n // behaviour is unchanged.\n //\n // The `@ts-ignore` is needed for a CI-only quirk: under\n // `noImplicitOverride`, partial compilation resolves `InputDirective`\n // through the just-built `dist/` d.ts on CI, where TypeScript decides the\n // base member isn't visible and rejects `override` with TS4113. Locally\n // the same resolution sees the member, so `@ts-expect-error` would itself\n // flag as unused. `@ts-ignore` suppresses whichever error fires and is\n // a no-op when neither does.\n /** Density of a standalone textarea. Maps to the inline-padding + font scale (`xs` … `xl`). Ignored inside a `<tw-form-field>` — the wrapper's `size` carries density. Defaults to `'md'`. */\n // TS4113 (CI) vs TS4114 (local) divergence means neither directive matches\n // both, so we intentionally pick `@ts-ignore` over `@ts-expect-error`; see\n // the longer comment above for the full reasoning.\n /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */\n // @ts-ignore — see comment above.\n override readonly size = input<TwSize>('md');\n\n /** Grows the textarea with its content (composed from CDK's `CdkTextareaAutosize`). When `true` the user-resize handle is forced off — autosize owns the height. Defaults to `false`. */\n readonly autosize = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n /** Minimum number of rows the textarea collapses to when `autosize` is `true`. Ignored when autosize is off. Defaults to `1`. */\n readonly minRows = input<number, unknown>(1, { transform: numberAttribute });\n\n /** Maximum number of rows the textarea expands to before scrolling, when `autosize` is `true`. `undefined` removes the cap. Ignored when autosize is off. Defaults to `undefined`. */\n readonly maxRows = input<number | undefined, unknown>(undefined, {\n transform: (v) => (v === undefined || v === null || v === '' ? undefined : numberAttribute(v)),\n });\n\n /** Number of rows for the initial render height (native `rows` attribute). Browsers honor this even when `autosize` is `true`, so first paint uses this value. Defaults to `3`. */\n readonly rows = input<number, unknown>(3, { transform: numberAttribute });\n\n /** Controls the user-resize handle: `'none'` locks the size, `'vertical'` (default) allows vertical drag, `'both'` allows both axes. Forced to `'none'` when `autosize` is `true`. Horizontal-only is intentionally not supported. */\n readonly resize = input<TwTextareaResize>('vertical');\n\n /** Maximum character count. Mirrors to the native `maxlength` attribute when defined and is exposed via the `valueLength` signal so consumers can render a \"X / N\" hint. Defaults to `undefined`. */\n readonly maxLength = input<number | undefined, unknown>(undefined, {\n transform: (v) => (v === undefined || v === null || v === '' ? undefined : numberAttribute(v)),\n });\n\n /** Current value length, updates on every `input` event. Wire `<span twHint align=\"end\">{{ ta.valueLength() }} / {{ ta.maxLength() }}</span>` for a character counter. */\n readonly valueLength: Signal<number> = computed(() => this.value()?.length ?? 0);\n\n /** @internal Textarea-specific Tailwind classes (resize axis). Combined with the inherited `classes()` in the host `[class]` binding. */\n readonly textareaClasses = computed(() =>\n // Short-circuit the resize/autosize conflict deterministically — don't\n // rely on tv variant emission order or twMerge \"last wins\" semantics.\n this.autosize()\n ? textareaVariants({ resize: 'none' })\n : textareaVariants({ resize: this.resize() }),\n );\n\n constructor() {\n super();\n\n // Wire the autosize toggle. The CDK directive is always mounted via\n // hostDirectives; we just flip its `enabled` setter based on our input.\n effect(() => {\n if (this.cdkAutosize) {\n this.cdkAutosize.enabled = this.autosize();\n }\n });\n }\n\n /** Triggers a CDK autosize recalculation. Useful after programmatic value changes that bypass the native `(input)` event (e.g., clipboard write APIs). No-op when `autosize` is `false`. */\n resizeToFitContent(force = false): void {\n if (this.cdkAutosize && this.autosize()) {\n this.cdkAutosize.resizeToFitContent(force);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-textarea.mjs","sources":["../../../projects/ngx-tw/textarea/textarea.ts","../../../projects/ngx-tw/textarea/cdevhub-ngx-tw-textarea.ts"],"sourcesContent":["import {\n booleanAttribute,\n computed,\n Directive,\n effect,\n forwardRef,\n inject,\n input,\n numberAttribute,\n type Signal,\n} from '@angular/core';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport { TW_FORM_FIELD, TW_FORM_FIELD_CONTROL } from '@cdevhub/ngx-tw/form-field';\nimport { InputDirective } from '@cdevhub/ngx-tw/input';\n\n/**\n * How the user-resize handle behaves on the textarea. `'vertical'` (the\n * default) lets users drag the bottom edge to grow the textarea; `'none'`\n * locks the size; `'both'` allows free resizing on both axes (rarely useful\n * inside a form-field — the textarea can overflow the wrapper). Horizontal\n * is intentionally omitted — it breaks form-field layout in practice.\n */\nexport type TwTextareaResize = 'none' | 'vertical' | 'both';\n\nconst textareaVariants = tv(\n {\n base: '',\n variants: {\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n both: 'resize',\n },\n // Control-height floor from `docs/vertical-rhythm.md`. A floor, not a\n // pinned height — a textarea has to grow with its content — so the\n // vertical padding on the shared size scale is retained alongside it.\n //\n // It lives here rather than on `inputVariants`' size scale because it\n // must be droppable, via the `'none'` value:\n //\n // - Under `autosize`, `CdkTextareaAutosize` owns the height. It caches\n // its line height from the `clientHeight` of a `cloneNode()`d textarea\n // and clears only the clone's *inline* min-height, so a `min-h-*`\n // class would survive onto the clone, inflate the cached line height,\n // and leave the real field too short for its own text. CDK's own\n // `minRows` inline min-height is the floor in that mode.\n // - Inside a `<tw-form-field>`, the wrapper's control row owns the\n // height (the control is stripped to `p-0 border-0`).\n heightFloor: {\n none: '',\n xs: 'min-h-6',\n sm: 'min-h-8',\n md: 'min-h-9',\n lg: 'min-h-11',\n xl: 'min-h-12',\n },\n },\n defaultVariants: {\n resize: 'vertical',\n heightFloor: 'none',\n },\n },\n { twMerge: true },\n);\n\n/**\n * Adapts a native `<textarea>` into an ngx-tw form-field-compatible multi-line\n * control. Extends {@link InputDirective} — inherits its form-field\n * integration, error-state machinery, autofill / focus tracking, ARIA wiring,\n * and standalone styling. Adds textarea-specific behavior: autosize composition\n * via CDK's `CdkTextareaAutosize`, a `resize` axis for the user-resize handle,\n * `rows` / `minRows` / `maxRows`, and `maxLength` with a `valueLength` signal\n * for character counters.\n *\n * Like `InputDirective`, this directive deliberately does NOT implement\n * `ControlValueAccessor`. Angular's built-in `DefaultValueAccessor` attaches to\n * the native `<textarea>` and handles value I/O for template-driven\n * (`ngModel`), reactive (`FormControl` / `formControlName`), and signal-forms\n * (`formField`) bindings — no library glue required.\n *\n * Form-control input-cap exception applies (codified in CLAUDE.md): ARIA +\n * forms baseline plus textarea-specific surface exceeds the 5–6 cap;\n * `checkbox` is the canonical 12+ exemplar.\n */\n@Directive({\n selector: 'textarea[twTextarea]',\n exportAs: 'twTextarea',\n hostDirectives: [\n {\n directive: CdkTextareaAutosize,\n inputs: [\n 'cdkAutosizeMinRows: minRows',\n 'cdkAutosizeMaxRows: maxRows',\n ],\n },\n ],\n providers: [\n {\n provide: TW_FORM_FIELD_CONTROL,\n useExisting: forwardRef(() => TextareaDirective),\n },\n ],\n host: {\n '[class]': 'classes() + \" \" + textareaClasses()',\n '[attr.id]': 'id()',\n '[attr.rows]': 'rows()',\n '[attr.maxlength]': 'maxLength() ?? null',\n '[disabled]': 'disabled()',\n '[attr.aria-invalid]': 'errorState() || null',\n '[attr.aria-required]': 'required() || null',\n '(input)': '_onInput()',\n },\n})\nexport class TextareaDirective extends InputDirective {\n private readonly cdkAutosize = inject(CdkTextareaAutosize, {\n self: true,\n optional: true,\n });\n\n // Re-injected here (the base directive keeps its own reference private) so\n // `textareaClasses()` can drop the control-height floor when the wrapper owns\n // the row height.\n private readonly parentFormField = inject(TW_FORM_FIELD, { optional: true });\n\n // @internal Re-declares the `size` input inherited from `InputDirective` so\n // it lands on this directive's own `ɵdir` input metadata. ng-packagr emits\n // `ɵdir` with only the child's directly declared inputs, so without this the\n // consumer-side strict template-check rejects `<textarea twTextarea\n // [size]=\"…\">` with NG8002. Both signals share the same `'md'` default and\n // the inherited `classes()` computed reads through polymorphism, so runtime\n // behaviour is unchanged.\n //\n // The `@ts-ignore` is needed for a CI-only quirk: under\n // `noImplicitOverride`, partial compilation resolves `InputDirective`\n // through the just-built `dist/` d.ts on CI, where TypeScript decides the\n // base member isn't visible and rejects `override` with TS4113. Locally\n // the same resolution sees the member, so `@ts-expect-error` would itself\n // flag as unused. `@ts-ignore` suppresses whichever error fires and is\n // a no-op when neither does.\n /** Density of a standalone textarea. Maps to the inline-padding + font scale (`xs` … `xl`) and to a `min-h-*` floor on the control-height scale (24/32/36/44/48px) — a floor, not a fixed height, because a textarea must grow with its content. The floor is dropped while `autosize` is on (CDK owns the height then; `minRows` is the floor). Ignored inside a `<tw-form-field>` — the wrapper's `size` carries density. Defaults to `'md'`. */\n // TS4113 (CI) vs TS4114 (local) divergence means neither directive matches\n // both, so we intentionally pick `@ts-ignore` over `@ts-expect-error`; see\n // the longer comment above for the full reasoning.\n /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */\n // @ts-ignore — see comment above.\n override readonly size = input<TwSize>('md');\n\n /** Grows the textarea with its content (composed from CDK's `CdkTextareaAutosize`). When `true` the user-resize handle is forced off — autosize owns the height. Defaults to `false`. */\n readonly autosize = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n /** Minimum number of rows the textarea collapses to when `autosize` is `true`. Ignored when autosize is off. Defaults to `1`. */\n readonly minRows = input<number, unknown>(1, { transform: numberAttribute });\n\n /** Maximum number of rows the textarea expands to before scrolling, when `autosize` is `true`. `undefined` removes the cap. Ignored when autosize is off. Defaults to `undefined`. */\n readonly maxRows = input<number | undefined, unknown>(undefined, {\n transform: (v) => (v === undefined || v === null || v === '' ? undefined : numberAttribute(v)),\n });\n\n /** Number of rows for the initial render height (native `rows` attribute). Browsers honor this even when `autosize` is `true`, so first paint uses this value. Defaults to `3`. */\n readonly rows = input<number, unknown>(3, { transform: numberAttribute });\n\n /** Controls the user-resize handle: `'none'` locks the size, `'vertical'` (default) allows vertical drag, `'both'` allows both axes. Forced to `'none'` when `autosize` is `true`. Horizontal-only is intentionally not supported. */\n readonly resize = input<TwTextareaResize>('vertical');\n\n /** Maximum character count. Mirrors to the native `maxlength` attribute when defined and is exposed via the `valueLength` signal so consumers can render a \"X / N\" hint. Defaults to `undefined`. */\n readonly maxLength = input<number | undefined, unknown>(undefined, {\n transform: (v) => (v === undefined || v === null || v === '' ? undefined : numberAttribute(v)),\n });\n\n /** Current value length, updates on every `input` event. Wire `<span twHint align=\"end\">{{ ta.valueLength() }} / {{ ta.maxLength() }}</span>` for a character counter. */\n readonly valueLength: Signal<number> = computed(() => this.value()?.length ?? 0);\n\n /** @internal Textarea-specific Tailwind classes (resize axis + control-height floor). Combined with the inherited `classes()` in the host `[class]` binding — the two strings never emit conflicting utilities, so concatenating them needs no cross-config merge. */\n readonly textareaClasses = computed(() => {\n // Drop the floor whenever something else owns the height — see the\n // `heightFloor` variant.\n const heightFloor =\n this.autosize() || this.parentFormField ? 'none' : this.size();\n // Short-circuit the resize/autosize conflict deterministically — don't\n // rely on tv variant emission order or twMerge \"last wins\" semantics.\n return this.autosize()\n ? textareaVariants({ resize: 'none', heightFloor })\n : textareaVariants({ resize: this.resize(), heightFloor });\n });\n\n constructor() {\n super();\n\n // Wire the autosize toggle. The CDK directive is always mounted via\n // hostDirectives; we just flip its `enabled` setter based on our input.\n effect(() => {\n if (this.cdkAutosize) {\n this.cdkAutosize.enabled = this.autosize();\n }\n });\n }\n\n /** Triggers a CDK autosize recalculation. Useful after programmatic value changes that bypass the native `(input)` event (e.g., clipboard write APIs). No-op when `autosize` is `false`. */\n resizeToFitContent(force = false): void {\n if (this.cdkAutosize && this.autosize()) {\n this.cdkAutosize.resizeToFitContent(force);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|