@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-flip-card.mjs","sources":["../../../projects/ngx-tw/flip-card/flip-card.ts","../../../projects/ngx-tw/flip-card/cdevhub-ngx-tw-flip-card.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n type ElementRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\n\n/** Visual style of the flip card chrome. Mirrors `tw-card`. */\nexport type FlipCardVariant = 'outlined' | 'elevated' | 'ghost';\n\n/** Axis of rotation for the flip animation. */\nexport type FlipCardDirection = 'horizontal' | 'vertical';\n\n/** Which user interaction flips the card. */\nexport type FlipCardTrigger = 'hover' | 'click' | 'manual' | 'both';\n\n// ── tv() config ──\n\nconst flipCardVariants = tv(\n {\n slots: {\n root:\n 'relative block rounded-lg transition-shadow duration-normal motion-reduce:transition-none tw-flip-perspective',\n inner:\n 'relative h-full w-full tw-flip-inner transition-transform duration-300 ease-in-out motion-reduce:transition-none',\n face:\n 'absolute inset-0 h-full w-full rounded-lg overflow-hidden tw-flip-face',\n front: '',\n back: 'tw-flip-back-face',\n },\n variants: {\n variant: {\n outlined: {\n face: 'bg-surface border border-border text-fg',\n },\n elevated: {\n face: 'bg-surface-raised shadow text-fg',\n root: 'hover:shadow-md',\n },\n ghost: {\n face: 'bg-transparent text-fg',\n },\n },\n direction: {\n horizontal: {\n inner: 'tw-flip-axis-y',\n back: 'tw-flip-back-y',\n },\n vertical: {\n inner: 'tw-flip-axis-x',\n back: 'tw-flip-back-x',\n },\n },\n flipped: {\n true: { inner: 'tw-flip-rotated' },\n false: {},\n },\n interactive: {\n true: {\n root:\n 'cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n false: {},\n },\n disabled: {\n true: { root: 'opacity-50 cursor-not-allowed' },\n false: {},\n },\n },\n defaultVariants: {\n variant: 'outlined',\n direction: 'horizontal',\n flipped: false,\n interactive: true,\n disabled: false,\n },\n },\n { twMerge: true },\n);\n\n/**\n * Two-faced card with a CSS 3D-perspective flip animation.\n *\n * @remarks\n * **Hard theme dependency.** The flip animation is driven by helper classes\n * (`tw-flip-perspective`, `tw-flip-inner`, `tw-flip-face`, `tw-flip-back-face`,\n * `tw-flip-axis-x`, `tw-flip-axis-y`, `tw-flip-rotated`, `tw-flip-back-x`,\n * `tw-flip-back-y`) declared in `projects/ngx-tw/theme/_base.css` and re-exported\n * via `ngx-tw/theme/default.css`. Consumers MUST import the theme stylesheet —\n * without it the card renders as two stacked faces with no perspective and no\n * rotation, and there is no run-time fallback. `prefers-reduced-motion: reduce`\n * is handled in the theme CSS, not here.\n */\n@Component({\n selector: 'tw-flip-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n '[attr.role]': 'hostRole()',\n '[attr.tabindex]': 'hostTabindex()',\n '[attr.aria-pressed]': 'ariaPressed()',\n '[attr.aria-live]': 'ariaLive()',\n '[attr.aria-disabled]': 'ariaDisabled()',\n '[attr.aria-label]': 'hostAriaLabel()',\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n template: `\n <div [class]=\"innerClasses()\">\n <div\n [class]=\"frontClasses()\"\n [attr.aria-hidden]=\"frontAriaHidden()\"\n [attr.inert]=\"frontInert()\"\n >\n <ng-content select=\"[slot='front']\" />\n </div>\n <div\n #backWrapper\n [class]=\"backClasses()\"\n [class.hidden]=\"!hasBack()\"\n [attr.aria-hidden]=\"backAriaHidden()\"\n [attr.inert]=\"backInert()\"\n >\n <ng-content select=\"[slot='back']\" />\n </div>\n </div>\n `,\n})\nexport class FlipCardComponent {\n /**\n * Visual style of the card chrome. Mirrors `tw-card`'s variant vocabulary.\n * Defaults to `'outlined'` (vs `tw-card`'s `'elevated'` default) so the flip\n * animation reads more clearly without a baseline shadow underneath.\n */\n readonly variant = input<FlipCardVariant>('outlined');\n\n /** Axis of rotation. `'horizontal'` rotates around the Y axis (left/right flip); `'vertical'` rotates around the X axis (top/bottom flip). Defaults to `'horizontal'`. */\n readonly direction = input<FlipCardDirection>('horizontal');\n\n /** Which user action flips the card. `'both'` enables click and hover. `'manual'` disables all triggers and defers control to the `flipped` model. Defaults to `'both'`. */\n readonly trigger = input<FlipCardTrigger>('both');\n\n /** When true, all triggers and keyboard handling are disabled; the current face stays visible. Defaults to `false`. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Whether the back face is currently visible. Two-way bindable via `[(flipped)]`. Defaults to `false`. The `flippedChange` event fires on every toggle. */\n readonly flipped = model(false);\n\n /**\n * Accessible name for the host element. Required when `trigger` is\n * `'manual'` (the host renders as `role=\"region\"`, which AXE requires to\n * have an accessible name); a default of `'Flip card'` is used in that\n * mode if no value is provided. In interactive modes the host's accessible\n * name is normally derived from the visible face's content — set this\n * input to override.\n */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly destroyRef = inject(DestroyRef);\n private readonly backWrapper = viewChild<ElementRef<HTMLElement>>('backWrapper');\n\n private readonly _hasBack = signal(false);\n /** @internal */\n readonly hasBack = this._hasBack.asReadonly();\n\n /** @internal */\n readonly interactive = computed(\n () => this.trigger() !== 'manual' && !this.disabled() && this.hasBack(),\n );\n\n /** @internal */\n readonly hostRole = computed(() =>\n this.trigger() === 'manual' ? 'region' : 'button',\n );\n\n /** @internal */\n readonly hostTabindex = computed(() => (this.interactive() ? 0 : null));\n\n /** @internal */\n readonly ariaPressed = computed(() =>\n this.interactive() ? String(this.flipped()) : null,\n );\n\n /** @internal */\n readonly ariaLive = computed(() =>\n this.trigger() === 'manual' ? 'polite' : null,\n );\n\n /** @internal */\n readonly ariaDisabled = computed(() =>\n this.disabled() ? 'true' : null,\n );\n\n /** @internal */\n readonly hostAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit !== undefined && explicit !== '') return explicit;\n return this.trigger() === 'manual' ? 'Flip card' : null;\n });\n\n /** @internal */\n readonly frontAriaHidden = computed(() =>\n this.hasBack() && this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly backAriaHidden = computed(() =>\n !this.hasBack() || !this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly frontInert = computed(() =>\n this.hasBack() && this.flipped() ? '' : null,\n );\n\n /** @internal */\n readonly backInert = computed(() =>\n !this.hasBack() || !this.flipped() ? '' : null,\n );\n\n private readonly variantResult = computed(() =>\n flipCardVariants({\n variant: this.variant(),\n direction: this.direction(),\n flipped: this.flipped(),\n interactive: this.interactive(),\n disabled: this.disabled(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly innerClasses = computed(() => this.variantResult().inner());\n readonly frontClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().front()}`,\n );\n readonly backClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().back()}`,\n );\n\n constructor() {\n // `MutationObserver` (not `contentChild`) because the spec exercises\n // *dynamic* projection toggled by an `@if` in the host template\n // (see `DynamicBackHost` in flip-card.spec.ts). `contentChild` resolves\n // the parent's own content children — it does NOT see elements projected\n // *through* the host via `<ng-content select=\"[slot='back']\" />`. The\n // observer is single-target and listens only for `childList` on the back\n // wrapper, so the cost is bounded and the disconnect runs on destroy.\n afterNextRender(() => {\n const el = this.backWrapper()?.nativeElement;\n if (!el) return;\n const update = () => this._hasBack.set(el.childElementCount > 0);\n update();\n const observer = new MutationObserver(update);\n observer.observe(el, { childList: true });\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n\n let firstRun = true;\n effect(() => {\n const isFlipped = this.flipped();\n if (firstRun) {\n firstRun = false;\n return;\n }\n // Announce in any mode that exposes a flippable back face. Manual mode\n // historically owned this because it sets `aria-live='polite'` on the\n // host; interactive modes (hover, click, both) still need an explicit\n // `LiveAnnouncer.announce` so screen-reader users hear the transition\n // when triggering the card via keyboard or pointer.\n if (this.hasBack()) {\n this.liveAnnouncer.announce(\n isFlipped ? 'Back face visible' : 'Front face visible',\n );\n }\n });\n }\n\n /** @internal */\n onClick(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t === 'manual') return;\n this.toggle();\n }\n\n /** @internal */\n onKeydown(event: KeyboardEvent): void {\n if (!this.interactive()) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggle();\n }\n }\n\n /** @internal */\n onMouseEnter(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(true);\n }\n\n /** @internal */\n onMouseLeave(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(false);\n }\n\n private toggle(): void {\n this.setFlipped(!this.flipped());\n }\n\n private setFlipped(next: boolean): void {\n if (this.flipped() === next) return;\n this.flipped.set(next);\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-flip-card.mjs","sources":["../../../projects/ngx-tw/flip-card/flip-card.ts","../../../projects/ngx-tw/flip-card/cdevhub-ngx-tw-flip-card.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n type ElementRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\n\n/** Visual style of the flip card chrome. Mirrors `tw-card`. */\nexport type FlipCardVariant = 'outline' | 'elevated' | 'ghost' | FlipCardVariantLegacy;\n\n/**\n * Legacy `variant` spellings, kept so existing templates keep compiling.\n * @deprecated `'outlined'` is an alias for `'outline'` and renders identically.\n * It will be removed in the next major — prefer `'outline'`.\n */\nexport type FlipCardVariantLegacy = 'outlined';\n\n/** Canonical `variant` spellings — the set `tv()` actually keys on. */\ntype FlipCardVariantCanonical = Exclude<FlipCardVariant, FlipCardVariantLegacy>;\n\n/** Maps every legacy spelling onto its canonical replacement. */\nconst VARIANT_ALIASES: Readonly<\n Record<FlipCardVariantLegacy, FlipCardVariantCanonical>\n> = {\n outlined: 'outline',\n};\n\n/** Axis of rotation for the flip animation. */\nexport type FlipCardDirection = 'horizontal' | 'vertical';\n\n/** Which user interaction flips the card. */\nexport type FlipCardTrigger = 'hover' | 'click' | 'manual' | 'both';\n\n// ── tv() config ──\n\nconst flipCardVariants = tv(\n {\n slots: {\n root:\n 'relative block rounded-lg transition-shadow duration-normal motion-reduce:transition-none tw-flip-perspective',\n // `duration-300` sits above the codified transition scale\n // (`duration-150` / `duration-200` / `duration-normal`), and none of\n // those govern here: the scale is calibrated for colour and shadow\n // shifts that travel no distance, while this is a 180° 3-D rotation of\n // the whole card through `rotateY`/`rotateX`. At `duration-200` the\n // faces swap before the perspective reads as depth and the flip looks\n // like a hard cut; 300ms is the shortest step where the rotation is\n // legible as one continuous motion. The `motion-reduce:transition-none`\n // guard the scale requires is still applied.\n inner:\n 'relative h-full w-full tw-flip-inner transition-transform duration-300 ease-in-out motion-reduce:transition-none',\n face:\n 'absolute inset-0 h-full w-full rounded-lg overflow-hidden tw-flip-face',\n front: '',\n back: 'tw-flip-back-face',\n },\n variants: {\n variant: {\n outline: {\n face: 'bg-surface border border-border text-fg',\n },\n elevated: {\n face: 'bg-surface-raised shadow text-fg',\n root: 'hover:shadow-md',\n },\n ghost: {\n face: 'bg-transparent text-fg',\n },\n },\n direction: {\n horizontal: {\n inner: 'tw-flip-axis-y',\n back: 'tw-flip-back-y',\n },\n vertical: {\n inner: 'tw-flip-axis-x',\n back: 'tw-flip-back-x',\n },\n },\n flipped: {\n true: { inner: 'tw-flip-rotated' },\n false: {},\n },\n interactive: {\n true: {\n root:\n 'cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n false: {},\n },\n disabled: {\n true: { root: 'opacity-50 cursor-not-allowed' },\n false: {},\n },\n },\n defaultVariants: {\n variant: 'outline',\n direction: 'horizontal',\n flipped: false,\n interactive: true,\n disabled: false,\n },\n },\n { twMerge: true },\n);\n\n/**\n * Two-faced card with a CSS 3D-perspective flip animation.\n *\n * @remarks\n * **Hard theme dependency.** The flip animation is driven by helper classes\n * (`tw-flip-perspective`, `tw-flip-inner`, `tw-flip-face`, `tw-flip-back-face`,\n * `tw-flip-axis-x`, `tw-flip-axis-y`, `tw-flip-rotated`, `tw-flip-back-x`,\n * `tw-flip-back-y`) declared in `projects/ngx-tw/theme/_base.css` and re-exported\n * via `ngx-tw/theme/default.css`. Consumers MUST import the theme stylesheet —\n * without it the card renders as two stacked faces with no perspective and no\n * rotation, and there is no run-time fallback. `prefers-reduced-motion: reduce`\n * is handled in the theme CSS, not here.\n */\n@Component({\n selector: 'tw-flip-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n '[attr.role]': 'hostRole()',\n '[attr.tabindex]': 'hostTabindex()',\n '[attr.aria-pressed]': 'ariaPressed()',\n '[attr.aria-disabled]': 'ariaDisabled()',\n '[attr.aria-label]': 'hostAriaLabel()',\n '(click)': 'onClick()',\n '(keydown)': 'onKeydown($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n template: `\n <div [class]=\"innerClasses()\">\n <div\n [class]=\"frontClasses()\"\n [attr.aria-hidden]=\"frontAriaHidden()\"\n [attr.inert]=\"frontInert()\"\n >\n <ng-content select=\"[slot='front']\" />\n </div>\n <div\n #backWrapper\n [class]=\"backClasses()\"\n [class.hidden]=\"!hasBack()\"\n [attr.aria-hidden]=\"backAriaHidden()\"\n [attr.inert]=\"backInert()\"\n >\n <ng-content select=\"[slot='back']\" />\n </div>\n </div>\n `,\n})\nexport class FlipCardComponent {\n /**\n * Visual style of the card chrome. Mirrors `tw-card`'s variant vocabulary.\n * Defaults to `'outline'` (vs `tw-card`'s `'elevated'` default) so the flip\n * animation reads more clearly without a baseline shadow underneath.\n * `'outlined'` is a deprecated alias for `'outline'` and renders identically.\n */\n readonly variant = input<FlipCardVariant>('outline');\n\n /** Axis of rotation. `'horizontal'` rotates around the Y axis (left/right flip); `'vertical'` rotates around the X axis (top/bottom flip). Defaults to `'horizontal'`. */\n readonly direction = input<FlipCardDirection>('horizontal');\n\n /** Which user action flips the card. `'both'` enables click and hover. `'manual'` disables all triggers and defers control to the `flipped` model. Defaults to `'both'`. */\n readonly trigger = input<FlipCardTrigger>('both');\n\n /** When true, all triggers and keyboard handling are disabled; the current face stays visible. Defaults to `false`. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Whether the back face is currently visible. Two-way bindable via `[(flipped)]`. Defaults to `false`. The `flippedChange` event fires on every toggle. */\n readonly flipped = model(false);\n\n /**\n * Accessible name for the host element, mirrored to `aria-label`. Required\n * when `trigger` is `'manual'` (the host renders as `role=\"region\"`, which\n * AXE requires to have an accessible name); a default of `'Flip card'` is\n * used in that mode if no value is provided. In interactive modes the host's\n * accessible name is normally derived from the visible face's content — set\n * this input to override. Defaults to `undefined`.\n */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n private readonly liveAnnouncer = inject(LiveAnnouncer);\n private readonly destroyRef = inject(DestroyRef);\n private readonly backWrapper = viewChild<ElementRef<HTMLElement>>('backWrapper');\n\n private readonly _hasBack = signal(false);\n /** @internal */\n readonly hasBack = this._hasBack.asReadonly();\n\n /** @internal */\n readonly interactive = computed(\n () => this.trigger() !== 'manual' && !this.disabled() && this.hasBack(),\n );\n\n /** @internal */\n readonly hostRole = computed(() =>\n this.trigger() === 'manual' ? 'region' : 'button',\n );\n\n /** @internal */\n readonly hostTabindex = computed(() => (this.interactive() ? 0 : null));\n\n /** @internal */\n readonly ariaPressed = computed(() =>\n this.interactive() ? String(this.flipped()) : null,\n );\n\n /** @internal */\n readonly ariaDisabled = computed(() =>\n this.disabled() ? 'true' : null,\n );\n\n /** @internal */\n readonly hostAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit !== undefined && explicit !== '') return explicit;\n return this.trigger() === 'manual' ? 'Flip card' : null;\n });\n\n /** @internal */\n readonly frontAriaHidden = computed(() =>\n this.hasBack() && this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly backAriaHidden = computed(() =>\n !this.hasBack() || !this.flipped() ? 'true' : null,\n );\n\n /** @internal */\n readonly frontInert = computed(() =>\n this.hasBack() && this.flipped() ? '' : null,\n );\n\n /** @internal */\n readonly backInert = computed(() =>\n !this.hasBack() || !this.flipped() ? '' : null,\n );\n\n /** @internal Canonical variant with legacy spellings folded in. */\n private readonly resolvedVariant = computed<FlipCardVariantCanonical>(() => {\n const v = this.variant();\n return (\n (VARIANT_ALIASES as Record<string, FlipCardVariantCanonical | undefined>)[v] ??\n (v as FlipCardVariantCanonical)\n );\n });\n\n private readonly variantResult = computed(() =>\n flipCardVariants({\n variant: this.resolvedVariant(),\n direction: this.direction(),\n flipped: this.flipped(),\n interactive: this.interactive(),\n disabled: this.disabled(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly innerClasses = computed(() => this.variantResult().inner());\n readonly frontClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().front()}`,\n );\n readonly backClasses = computed(\n () => `${this.variantResult().face()} ${this.variantResult().back()}`,\n );\n\n constructor() {\n // `MutationObserver` (not `contentChild`) because the spec exercises\n // *dynamic* projection toggled by an `@if` in the host template\n // (see `DynamicBackHost` in flip-card.spec.ts). `contentChild` resolves\n // the parent's own content children — it does NOT see elements projected\n // *through* the host via `<ng-content select=\"[slot='back']\" />`. The\n // observer is single-target and listens only for `childList` on the back\n // wrapper, so the cost is bounded and the disconnect runs on destroy.\n afterNextRender(() => {\n const el = this.backWrapper()?.nativeElement;\n if (!el) return;\n const update = () => this._hasBack.set(el.childElementCount > 0);\n update();\n const observer = new MutationObserver(update);\n observer.observe(el, { childList: true });\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n\n let firstRun = true;\n effect(() => {\n const isFlipped = this.flipped();\n if (firstRun) {\n firstRun = false;\n return;\n }\n // `LiveAnnouncer` is the single announcement channel, in every trigger\n // mode. Manual mode used to *also* mark the host `aria-live=\"polite\"`,\n // so the `aria-hidden` face swap was announced by the live region on\n // top of this call — one flip, two announcements. The host region was\n // dropped rather than this call, because it was the narrower of the\n // two (manual mode only) and because a live region whose host also\n // carries `role`/`aria-label` is announced inconsistently across ATs.\n if (this.hasBack()) {\n this.liveAnnouncer.announce(\n isFlipped ? 'Back face visible' : 'Front face visible',\n );\n }\n });\n }\n\n /** @internal */\n onClick(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t === 'manual') return;\n this.toggle();\n }\n\n /** @internal */\n onKeydown(event: KeyboardEvent): void {\n if (!this.interactive()) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggle();\n }\n }\n\n /** @internal */\n onMouseEnter(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(true);\n }\n\n /** @internal */\n onMouseLeave(): void {\n if (this.disabled() || !this.hasBack()) return;\n const t = this.trigger();\n if (t !== 'hover' && t !== 'both') return;\n this.setFlipped(false);\n }\n\n private toggle(): void {\n this.setFlipped(!this.flipped());\n }\n\n private setFlipped(next: boolean): void {\n if (this.flipped() === next) return;\n this.flipped.set(next);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, ElementRef, computed, isDevMode, Directive, input, contentChild, contentChildren, viewChild, signal, effect, untracked, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, ElementRef, computed, isDevMode, Directive, input, contentChild, contentChildren, viewChild, signal, effect, untracked, afterRenderEffect, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { tv } from 'tailwind-variants';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -8,7 +8,24 @@ import { tv } from 'tailwind-variants';
|
|
|
8
8
|
* surrounding `FormFieldComponent` can mirror its state and wire ARIA.
|
|
9
9
|
*/
|
|
10
10
|
class FormFieldControl {
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* Active validation errors map keyed by validator name (e.g. `{ required: true, email: true }`).
|
|
13
|
+
* Returns `null` when the control has no validation errors.
|
|
14
|
+
*
|
|
15
|
+
* This is the *only* source the form-field consults for `[twError match="…"]` filtering: it
|
|
16
|
+
* feeds `FormFieldComponent.activeErrorKeys`, and an error with a `match` renders only while
|
|
17
|
+
* that key is present. A control that leaves this undefined therefore reports an empty key set,
|
|
18
|
+
* and **every `match`-targeted message under it is permanently hidden** — in all three form
|
|
19
|
+
* strategies, with no warning. Unmatched `[twError]` messages are unaffected; they follow
|
|
20
|
+
* `errorState` alone.
|
|
21
|
+
*
|
|
22
|
+
* Optional only so the member can be added to existing controls without a breaking change. Any
|
|
23
|
+
* control that resolves an `NgControl` should implement it — typically as
|
|
24
|
+
* `computed(() => ngControl?.control?.errors ?? null)`, reading whatever revision signal the
|
|
25
|
+
* control already uses to invalidate `errorState`, so the map tracks validator transitions that
|
|
26
|
+
* do not flip `VALID`/`INVALID`. Omit it only for a control that genuinely has no validation
|
|
27
|
+
* errors to report.
|
|
28
|
+
*/
|
|
12
29
|
errors;
|
|
13
30
|
/** Optional consumer-supplied `aria-labelledby` ids the form-field preserves when merging in the projected label id. Controls that consume label pushdown (non-native triggers) override this. */
|
|
14
31
|
userAriaLabelledby;
|
|
@@ -34,6 +51,9 @@ const TW_FORM_FIELD_CONTROL = new InjectionToken('TW_FORM_FIELD_CONTROL');
|
|
|
34
51
|
* form-field component out of each control's bundle.
|
|
35
52
|
*/
|
|
36
53
|
const TW_FORM_FIELD = new InjectionToken('TW_FORM_FIELD');
|
|
54
|
+
// Resting-label left offset used when the field has no prefix: matches the control row's own
|
|
55
|
+
// horizontal padding so the label lines up with the control's text.
|
|
56
|
+
const DEFAULT_RESTING_LABEL_OFFSET_PX = 12;
|
|
37
57
|
// ── Unique ID counters ──
|
|
38
58
|
let nextLabelId = 0;
|
|
39
59
|
let nextHintId = 0;
|
|
@@ -63,12 +83,28 @@ const formFieldVariants = tv({
|
|
|
63
83
|
infix: 'items-end',
|
|
64
84
|
},
|
|
65
85
|
},
|
|
86
|
+
// Density of the control row. Two things ride this axis:
|
|
87
|
+
//
|
|
88
|
+
// 1. The font scale, on `controlWrapper` rather than `infix`. A nested
|
|
89
|
+
// control strips its own `text-*` (see `inputVariants`' `inFormField`
|
|
90
|
+
// branch), so without this the row inherited the ambient 16px/24px line
|
|
91
|
+
// box at every size and the size axis did nothing vertically. It sits on
|
|
92
|
+
// `controlWrapper` so the prefix and suffix adornments scale with the
|
|
93
|
+
// control instead of driving the row taller than the control it wraps;
|
|
94
|
+
// the `label` slot sets its own `text-*` per (size, labelFloated) and so
|
|
95
|
+
// is unaffected.
|
|
96
|
+
// 2. The `min-h-*` floor from the control-height scale
|
|
97
|
+
// (`docs/vertical-rhythm.md`). A floor rather than a pinned height
|
|
98
|
+
// because a form-field wraps arbitrary consumer controls — a textarea,
|
|
99
|
+
// a wrapping tag list — and must be free to grow. The vertical padding
|
|
100
|
+
// is deliberately retained for the same reason: it is the only vertical
|
|
101
|
+
// breathing room a nested `p-0` control has.
|
|
66
102
|
size: {
|
|
67
|
-
xs: {},
|
|
68
|
-
sm: {},
|
|
69
|
-
md: {},
|
|
70
|
-
lg: {},
|
|
71
|
-
xl: {},
|
|
103
|
+
xs: { controlWrapper: 'min-h-6 text-xs' },
|
|
104
|
+
sm: { controlWrapper: 'min-h-8 text-sm' },
|
|
105
|
+
md: { controlWrapper: 'min-h-9 text-sm' },
|
|
106
|
+
lg: { controlWrapper: 'min-h-11 text-base' },
|
|
107
|
+
xl: { controlWrapper: 'min-h-12 text-base' },
|
|
72
108
|
},
|
|
73
109
|
color: {
|
|
74
110
|
primary: {},
|
|
@@ -100,18 +136,46 @@ const formFieldVariants = tv({
|
|
|
100
136
|
true: { subscriptWrapper: 'min-h-5' },
|
|
101
137
|
false: {},
|
|
102
138
|
},
|
|
139
|
+
// The disabled treatment splits across two slots on purpose.
|
|
140
|
+
//
|
|
141
|
+
// `opacity-50` moved OFF `root`. `root` wraps both the control row and the
|
|
142
|
+
// subscript (hint/error) row, so dimming it composited every hint down to
|
|
143
|
+
// 50% alpha over the page surface. At that alpha no foreground token can
|
|
144
|
+
// reach AA: pure black at 50% over white is #808080 = 3.95:1, and
|
|
145
|
+
// `text-fg-muted` (gray-600, 7.56:1 at rest) measured 2.34:1 light /
|
|
146
|
+
// 3.92:1 dark. That is a real SC 1.4.3 failure — a hint is a description OF
|
|
147
|
+
// the control, not part OF the inactive control, so it does not inherit
|
|
148
|
+
// 1.4.3's inactive-component exemption — and it is the text most worth
|
|
149
|
+
// reading on a disabled field ("Disabled — slugs can no longer be edited").
|
|
150
|
+
// The label wrapper is nested inside `controlWrapper` (see
|
|
151
|
+
// `form-field.html`), so the label keeps exactly the dimming it had, and
|
|
152
|
+
// axe already exempts it anyway via its `<label for>` → disabled control.
|
|
153
|
+
//
|
|
154
|
+
// `pointer-events-none` deliberately STAYS on `root`. Moving it would make
|
|
155
|
+
// the subscript row live again, and the host's `(click)` forwards to
|
|
156
|
+
// `control.onContainerClick()` — which not every wrapped control guards on
|
|
157
|
+
// its disabled state. Keeping it on the host preserves the interaction
|
|
158
|
+
// semantics exactly; only the composited alpha changes.
|
|
103
159
|
disabled: {
|
|
104
|
-
true: { root: '
|
|
160
|
+
true: { root: 'pointer-events-none', controlWrapper: 'opacity-50' },
|
|
105
161
|
false: {},
|
|
106
162
|
},
|
|
107
163
|
},
|
|
108
164
|
compoundVariants: [
|
|
109
165
|
// ── Padding × (appearance, size) ──
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
166
|
+
// Vertical padding sits one half-step below the inline-padding scale so the
|
|
167
|
+
// `min-h-*` floor on the control row actually BINDS at rest. With the
|
|
168
|
+
// nominal padding the natural height (padding + line box + 2px border)
|
|
169
|
+
// lands 2px above the floor at every size, leaving the floor inert and a
|
|
170
|
+
// wrapped control 2px taller than the same control standalone. The padding
|
|
171
|
+
// still governs the multi-line case (textarea), where the row grows past
|
|
172
|
+
// the floor. `filled` is deliberately NOT shifted — its asymmetric
|
|
173
|
+
// `pt-*`/`pb-*` reserves room for the floating label and is taller by design.
|
|
174
|
+
{ appearance: 'outline', size: 'xs', class: { controlWrapper: 'px-2 py-0.5' } },
|
|
175
|
+
{ appearance: 'outline', size: 'sm', class: { controlWrapper: 'px-3 py-1' } },
|
|
176
|
+
{ appearance: 'outline', size: 'md', class: { controlWrapper: 'px-3 py-1.5' } },
|
|
177
|
+
{ appearance: 'outline', size: 'lg', class: { controlWrapper: 'px-4 py-2' } },
|
|
178
|
+
{ appearance: 'outline', size: 'xl', class: { controlWrapper: 'px-5 py-2.5' } },
|
|
115
179
|
{ appearance: 'filled', size: 'xs', class: { controlWrapper: 'px-2 pt-5 pb-1' } },
|
|
116
180
|
{ appearance: 'filled', size: 'sm', class: { controlWrapper: 'px-3 pt-5 pb-1.5' } },
|
|
117
181
|
{ appearance: 'filled', size: 'md', class: { controlWrapper: 'px-3 pt-6 pb-2' } },
|
|
@@ -359,7 +423,7 @@ class FormFieldComponent {
|
|
|
359
423
|
/** Visual appearance of the field container. `'outline'` draws a full border around the control; `'filled'` uses a filled surface with a bottom border. Defaults to `'outline'`. */
|
|
360
424
|
appearance = input('outline', /* @ts-ignore */
|
|
361
425
|
...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
|
|
362
|
-
/** Density of the field container. Maps to the inline-padding scale (`px-2 py-1` xs … `px-5 py-3` xl) and the
|
|
426
|
+
/** Density of the field container. Maps to the inline-padding scale (`px-2 py-1` xs … `px-5 py-3` xl), the control-row font scale (`text-xs` xs, `text-sm` sm/md, `text-base` lg/xl — inherited by the nested control and by prefix/suffix adornments), the label font scale, and a `min-h-*` floor on the control row from the control-height scale (24/32/36/44/48px). The floor is a minimum, not a fixed height: the row grows for a textarea or any other multi-line control. Defaults to `'md'`. */
|
|
363
427
|
size = input('md', /* @ts-ignore */
|
|
364
428
|
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
365
429
|
/** Floating label behavior. `'auto'` floats when focused or non-empty; `'always'` stays floated; `'never'` disables floating entirely (the label wrapper is not rendered and the wrapped control's placeholder is always visible). Defaults to `'auto'`. */
|
|
@@ -397,7 +461,7 @@ class FormFieldComponent {
|
|
|
397
461
|
hasPrefix = computed(() => this.prefixChildren().length > 0, /* @ts-ignore */
|
|
398
462
|
...(ngDevMode ? [{ debugName: "hasPrefix" }] : /* istanbul ignore next */ []));
|
|
399
463
|
/** @internal Resting-label left offset in pixels, mirroring the infix's `offsetLeft` so the label sits right after any prefix. */
|
|
400
|
-
restingLabelOffset = signal(
|
|
464
|
+
restingLabelOffset = signal(DEFAULT_RESTING_LABEL_OFFSET_PX, /* @ts-ignore */
|
|
401
465
|
...(ngDevMode ? [{ debugName: "restingLabelOffset" }] : /* istanbul ignore next */ []));
|
|
402
466
|
/** @internal */
|
|
403
467
|
isFocused = computed(() => !!this.control()?.focused(), /* @ts-ignore */
|
|
@@ -577,20 +641,49 @@ class FormFieldComponent {
|
|
|
577
641
|
}
|
|
578
642
|
});
|
|
579
643
|
// Track the infix's left offset so the resting label can sit right after any prefix.
|
|
644
|
+
//
|
|
645
|
+
// The measurement lives in `afterRenderEffect`'s `earlyRead` phase, NOT in a plain
|
|
646
|
+
// `effect()`. `effect()` runs inside `refreshView` *after* this component's own template but
|
|
647
|
+
// *before* its embedded views, content queries, host bindings and child components are
|
|
648
|
+
// refreshed, so `offsetLeft` read there samples geometry that predates the very change that
|
|
649
|
+
// triggered the run — a prefix appearing inside an `@if`, for instance. `earlyRead` runs
|
|
650
|
+
// after the whole render has committed, which is what it exists for.
|
|
651
|
+
//
|
|
652
|
+
// `afterRenderEffect` is a *reactive* effect scheduled into a render phase, not an
|
|
653
|
+
// every-render hook: it re-runs only when a tracked producer changes. The tracked producers
|
|
654
|
+
// here are `prefixChildren()` and `infixRef()` — exactly the set the previous `effect()`
|
|
655
|
+
// tracked, so this is a timing fix, not a coverage fix. A prefix that changes width without
|
|
656
|
+
// changing the prefix set is invisible to the signal graph either way, which is why the
|
|
657
|
+
// ResizeObserver below stays.
|
|
658
|
+
afterRenderEffect({
|
|
659
|
+
earlyRead: () => {
|
|
660
|
+
if (this.prefixChildren().length === 0)
|
|
661
|
+
return DEFAULT_RESTING_LABEL_OFFSET_PX;
|
|
662
|
+
const infix = this.infixRef()?.nativeElement;
|
|
663
|
+
// `null` means "nothing measurable this run" — leave the previous offset in place.
|
|
664
|
+
return infix ? infix.offsetLeft : null;
|
|
665
|
+
},
|
|
666
|
+
write: (offset) => {
|
|
667
|
+
const px = offset();
|
|
668
|
+
if (px !== null)
|
|
669
|
+
this.restingLabelOffset.set(px);
|
|
670
|
+
},
|
|
671
|
+
});
|
|
672
|
+
// Keep the offset fresh when an already-mounted prefix changes size. Creating the observer
|
|
673
|
+
// is a subscription, not a layout read, so a plain `effect()` is the right hook; the
|
|
674
|
+
// callback itself is delivered after layout, so its `offsetLeft` read is safe. Note this
|
|
675
|
+
// repairs *size* changes only — an infix that shifts position with no observed box resizing
|
|
676
|
+
// is not covered here and not covered by the render effect above either.
|
|
580
677
|
effect((onCleanup) => {
|
|
581
678
|
const prefixes = this.prefixChildren();
|
|
582
|
-
if (prefixes.length === 0)
|
|
583
|
-
this.restingLabelOffset.set(12);
|
|
679
|
+
if (prefixes.length === 0)
|
|
584
680
|
return;
|
|
585
|
-
}
|
|
586
681
|
const infix = this.infixRef()?.nativeElement;
|
|
587
682
|
if (!infix)
|
|
588
683
|
return;
|
|
589
|
-
const update = () => this.restingLabelOffset.set(infix.offsetLeft);
|
|
590
|
-
update();
|
|
591
684
|
if (typeof ResizeObserver === 'undefined')
|
|
592
685
|
return;
|
|
593
|
-
const ro = new ResizeObserver(
|
|
686
|
+
const ro = new ResizeObserver(() => this.restingLabelOffset.set(infix.offsetLeft));
|
|
594
687
|
for (const p of prefixes) {
|
|
595
688
|
ro.observe(p.elementRef.nativeElement);
|
|
596
689
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-form-field.mjs","sources":["../../../projects/ngx-tw/form-field/form-field.ts","../../../projects/ngx-tw/form-field/form-field.html","../../../projects/ngx-tw/form-field/cdevhub-ngx-tw-form-field.ts"],"sourcesContent":["import {\n type AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n forwardRef,\n inject,\n InjectionToken,\n input,\n isDevMode,\n signal,\n type Signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual appearance of the form-field container. */\nexport type FormFieldAppearance = 'outline' | 'filled';\n\n/** Floating label behavior. `'never'` disables floating entirely; the label wrapper is not rendered and the wrapped control's placeholder is always visible. */\nexport type FloatLabel = 'auto' | 'always' | 'never';\n\n/** Subscript (hint/error row) sizing strategy. `'fixed'` always reserves vertical space; `'dynamic'` collapses the row when no hint/error is projected. */\nexport type SubscriptSizing = 'fixed' | 'dynamic';\n\n/**\n * Contract every ngx-tw form-field-compatible control must implement. A\n * concrete control provides itself under {@link TW_FORM_FIELD_CONTROL} so the\n * surrounding `FormFieldComponent` can mirror its state and wire ARIA.\n */\nexport abstract class FormFieldControl<T = unknown> {\n /** Unique id on the control's host element. Used by the form-field label `for` attribute and `aria-describedby` wiring. */\n abstract readonly id: Signal<string>;\n /** Current value of the control. */\n abstract readonly value: Signal<T | null>;\n /** Whether the control currently has focus. Typically driven by CDK `FocusMonitor`. */\n abstract readonly focused: Signal<boolean>;\n /** Whether the control's value is considered empty. Drives the floating-label state. */\n abstract readonly empty: Signal<boolean>;\n /** Whether the control is disabled. */\n abstract readonly disabled: Signal<boolean>;\n /** Whether the control is marked required. */\n abstract readonly required: Signal<boolean>;\n /** Whether the control should be rendered as invalid. Usually derived from `NgControl.invalid` combined with `touched`/`submitted`. */\n abstract readonly errorState: Signal<boolean>;\n /** Active validation errors map keyed by validator name (e.g. `{ required: true, email: true }`). Returns `null` when the control has no validation errors. Drives `[twError match=\"…\"]` filtering inside the form-field. Optional — controls without a backing `NgControl` may omit it. */\n readonly errors?: Signal<Record<string, unknown> | null>;\n /** Optional control-type identifier (e.g. `'input'`, `'select'`). When set, the form-field appends `tw-form-field-type-{controlType}` to its host for styling hooks. */\n abstract readonly controlType?: string;\n /** Optional consumer-supplied `aria-describedby` ids the form-field preserves when merging in hint/error ids. */\n abstract readonly userAriaDescribedBy?: Signal<string | undefined>;\n /** Optional consumer-supplied `aria-labelledby` ids the form-field preserves when merging in the projected label id. Controls that consume label pushdown (non-native triggers) override this. */\n readonly userAriaLabelledby?: Signal<string | undefined>;\n\n /** Called by the form-field to push the merged `aria-describedby` ids back onto the control's host element. */\n abstract setDescribedByIds(ids: string[]): void;\n /** Called when the form-field container is clicked. Concrete controls typically focus their underlying native element or open a panel. */\n abstract onContainerClick(event: MouseEvent): void;\n /**\n * Called by the form-field to push the merged `aria-labelledby` ids onto the control's host element.\n * Default is a no-op — native `<input>` controls rely on the label's `for=` attribute for the canonical association.\n * Non-native controls (combobox triggers, date-pickers, etc.) override this to set the attribute explicitly.\n */\n setLabelledByIds(_ids: string[]): void {\n // Default no-op. Controls override when label pushdown is required for accessibility.\n }\n}\n\n/**\n * Injection token matching {@link FormFieldControl}. Controls register via\n * `providers: [{ provide: TW_FORM_FIELD_CONTROL, useExisting: MyControl }]`.\n */\nexport const TW_FORM_FIELD_CONTROL = new InjectionToken<FormFieldControl<unknown>>(\n 'TW_FORM_FIELD_CONTROL',\n);\n\n/**\n * Minimal surface a wrapped control reads from its surrounding form-field —\n * presence (via optional injection) plus whether a label is projected — without\n * depending on the concrete {@link FormFieldComponent}. Controls inject\n * {@link TW_FORM_FIELD} typed as this interface so detecting a parent form-field\n * never pins the heavier component class into the control's own bundle.\n */\nexport interface TwFormFieldParent {\n /** Whether a `twLabel` element is projected into the form-field. */\n readonly hasLabel: Signal<boolean>;\n}\n\n/**\n * Injection token exposing the wrapping {@link TwFormFieldParent}. The\n * {@link FormFieldComponent} provides itself under this token; controls inject\n * it with `{ optional: true }` to detect (and read label state from) a parent\n * `tw-form-field` without referencing the concrete component class — keeping the\n * form-field component out of each control's bundle.\n */\nexport const TW_FORM_FIELD = new InjectionToken<TwFormFieldParent>('TW_FORM_FIELD');\n\n// ── Unique ID counters ──\nlet nextLabelId = 0;\nlet nextHintId = 0;\nlet nextErrorId = 0;\n\n// ── tv() config ──\n\nconst formFieldVariants = tv({\n slots: {\n root: 'block text-fg',\n controlWrapper:\n 'relative flex items-stretch gap-2 rounded-md bg-transparent transition-colors duration-normal motion-reduce:transition-none',\n infix: 'relative flex-1 flex items-center min-w-0 [&_input::placeholder]:transition-opacity [&_input::placeholder]:duration-normal [&_textarea::placeholder]:transition-opacity [&_textarea::placeholder]:duration-normal',\n labelWrapper:\n 'absolute pointer-events-none flex items-center max-w-[calc(100%-1.5rem)] transition-[top,left,color,transform] duration-normal motion-reduce:transition-none origin-[top_left]',\n label:\n 'text-fg-muted truncate transition-[font-size,color] duration-normal motion-reduce:transition-none',\n requiredMarker: 'text-error-600 ml-0.5',\n prefix: 'flex items-center shrink-0 text-fg-muted',\n suffix: 'flex items-center shrink-0 text-fg-muted',\n subscriptWrapper: 'mt-1 text-xs flex gap-2',\n hint: 'text-fg-muted',\n error: 'text-error-600 font-medium',\n },\n variants: {\n appearance: {\n outline: {\n controlWrapper: 'border border-border hover:border-border-strong',\n },\n filled: {\n controlWrapper:\n 'bg-surface-muted border-b border-border hover:bg-surface-sunken',\n infix: 'items-end',\n },\n },\n size: {\n xs: {},\n sm: {},\n md: {},\n lg: {},\n xl: {},\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n focused: {\n true: {},\n false: {},\n },\n invalid: {\n true: {},\n false: {},\n },\n labelFloated: {\n true: {\n labelWrapper: 'top-1 left-2',\n },\n false: {\n labelWrapper: 'top-1/2 -translate-y-1/2 left-3',\n },\n },\n subscriptReserve: {\n true: { subscriptWrapper: 'min-h-5' },\n false: {},\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none' },\n false: {},\n },\n },\n compoundVariants: [\n // ── Padding × (appearance, size) ──\n { appearance: 'outline', size: 'xs', class: { controlWrapper: 'px-2 py-1' } },\n { appearance: 'outline', size: 'sm', class: { controlWrapper: 'px-3 py-1.5' } },\n { appearance: 'outline', size: 'md', class: { controlWrapper: 'px-3 py-2' } },\n { appearance: 'outline', size: 'lg', class: { controlWrapper: 'px-4 py-2.5' } },\n { appearance: 'outline', size: 'xl', class: { controlWrapper: 'px-5 py-3' } },\n { appearance: 'filled', size: 'xs', class: { controlWrapper: 'px-2 pt-5 pb-1' } },\n { appearance: 'filled', size: 'sm', class: { controlWrapper: 'px-3 pt-5 pb-1.5' } },\n { appearance: 'filled', size: 'md', class: { controlWrapper: 'px-3 pt-6 pb-2' } },\n { appearance: 'filled', size: 'lg', class: { controlWrapper: 'px-4 pt-7 pb-2.5' } },\n { appearance: 'filled', size: 'xl', class: { controlWrapper: 'px-5 pt-8 pb-3' } },\n\n // ── Label font-size × (size, labelFloated) ──\n { size: 'xs', labelFloated: false, class: { label: 'text-xs' } },\n { size: 'xs', labelFloated: true, class: { label: 'text-2xs' } },\n { size: 'sm', labelFloated: false, class: { label: 'text-sm' } },\n { size: 'sm', labelFloated: true, class: { label: 'text-xs' } },\n { size: 'md', labelFloated: false, class: { label: 'text-sm' } },\n { size: 'md', labelFloated: true, class: { label: 'text-xs' } },\n { size: 'lg', labelFloated: false, class: { label: 'text-base' } },\n { size: 'lg', labelFloated: true, class: { label: 'text-sm' } },\n { size: 'xl', labelFloated: false, class: { label: 'text-base' } },\n { size: 'xl', labelFloated: true, class: { label: 'text-sm' } },\n\n // ── Outline + focused → colored border ──\n { appearance: 'outline', focused: true, color: 'primary', class: { controlWrapper: 'border-primary-500' } },\n { appearance: 'outline', focused: true, color: 'secondary', class: { controlWrapper: 'border-secondary-500' } },\n { appearance: 'outline', focused: true, color: 'accent', class: { controlWrapper: 'border-accent-500' } },\n { appearance: 'outline', focused: true, color: 'neutral', class: { controlWrapper: 'border-border-strong' } },\n { appearance: 'outline', focused: true, color: 'info', class: { controlWrapper: 'border-info-500' } },\n { appearance: 'outline', focused: true, color: 'success', class: { controlWrapper: 'border-success-500' } },\n { appearance: 'outline', focused: true, color: 'warning', class: { controlWrapper: 'border-warning-500' } },\n { appearance: 'outline', focused: true, color: 'error', class: { controlWrapper: 'border-error-500' } },\n\n // ── Filled + focused → colored bottom border ──\n { appearance: 'filled', focused: true, color: 'primary', class: { controlWrapper: 'border-b-2 border-primary-500' } },\n { appearance: 'filled', focused: true, color: 'secondary', class: { controlWrapper: 'border-b-2 border-secondary-500' } },\n { appearance: 'filled', focused: true, color: 'accent', class: { controlWrapper: 'border-b-2 border-accent-500' } },\n { appearance: 'filled', focused: true, color: 'neutral', class: { controlWrapper: 'border-b-2 border-border-strong' } },\n { appearance: 'filled', focused: true, color: 'info', class: { controlWrapper: 'border-b-2 border-info-500' } },\n { appearance: 'filled', focused: true, color: 'success', class: { controlWrapper: 'border-b-2 border-success-500' } },\n { appearance: 'filled', focused: true, color: 'warning', class: { controlWrapper: 'border-b-2 border-warning-500' } },\n { appearance: 'filled', focused: true, color: 'error', class: { controlWrapper: 'border-b-2 border-error-500' } },\n\n // ── Floated label + focused → colored label ──\n { labelFloated: true, focused: true, color: 'primary', class: { label: 'text-primary-600' } },\n { labelFloated: true, focused: true, color: 'secondary', class: { label: 'text-secondary-600' } },\n { labelFloated: true, focused: true, color: 'accent', class: { label: 'text-accent-600' } },\n { labelFloated: true, focused: true, color: 'neutral', class: { label: 'text-fg' } },\n { labelFloated: true, focused: true, color: 'info', class: { label: 'text-info-600' } },\n { labelFloated: true, focused: true, color: 'success', class: { label: 'text-success-600' } },\n { labelFloated: true, focused: true, color: 'warning', class: { label: 'text-warning-600' } },\n { labelFloated: true, focused: true, color: 'error', class: { label: 'text-error-600' } },\n\n // ── Outline + floated label → sit centered on the top border with a surface notch ──\n { appearance: 'outline', labelFloated: true, class: { labelWrapper: 'bg-surface px-1 top-0 -translate-y-1/2' } },\n\n // ── Filled + resting label → align vertically with the input baseline (input is items-end inside an asymmetric pt/pb container) ──\n { appearance: 'filled', labelFloated: false, class: { labelWrapper: 'top-[calc(50%+0.5rem)]' } },\n\n // ── Invalid overrides (declared last so twMerge lets them win) ──\n { invalid: true, appearance: 'outline', class: { controlWrapper: 'border-error-500' } },\n { invalid: true, appearance: 'filled', class: { controlWrapper: 'border-b-2 border-error-500' } },\n { invalid: true, labelFloated: true, class: { label: 'text-error-600' } },\n ],\n defaultVariants: {\n appearance: 'outline',\n size: 'md',\n color: 'primary',\n focused: false,\n invalid: false,\n labelFloated: false,\n subscriptReserve: true,\n disabled: false,\n },\n}, {\n twMerge: true,\n});\n\n// ── LabelDirective ──\n\n@Directive({\n selector: '[twLabel]',\n host: {\n '[attr.id]': 'id',\n '[attr.for]': 'controlId()',\n '[class]': 'classes()',\n },\n})\nexport class LabelDirective {\n private readonly formField = inject(FormFieldComponent);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly id = `tw-form-field-label-${nextLabelId++}`;\n\n /** @internal */\n readonly controlId = computed(() => this.formField.control()?.id() ?? null);\n\n /** @internal */\n readonly classes = computed(() => this.formField.labelClasses());\n\n constructor() {\n if (isDevMode()) {\n const tag = this.elementRef.nativeElement.tagName;\n if (tag !== 'LABEL') {\n console.warn(\n `[tw-form-field] twLabel should be applied to a <label> element for the native \\`for\\`/\\`id\\` association to work; got <${tag.toLowerCase()}>. Non-native controls (e.g. tw-select) still receive label pushdown via aria-labelledby.`,\n );\n }\n }\n }\n}\n\n// ── HintDirective ──\n\n@Directive({\n selector: '[twHint]',\n host: {\n '[attr.id]': 'id',\n '[class]': 'classes()',\n },\n})\nexport class HintDirective {\n private readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly id = `tw-form-field-hint-${nextHintId++}`;\n\n /** Alignment within the subscript row. `'end'` pushes the hint to the right. When unset, the form-field's `hintAlign` input supplies the default. */\n readonly align = input<'start' | 'end' | undefined>(undefined);\n\n /** @internal */\n readonly effectiveAlign = computed(\n () => this.align() ?? this.formField.hintAlign(),\n );\n\n /** @internal */\n readonly classes = computed(() => {\n const base = this.formField.hintClasses();\n return this.effectiveAlign() === 'end' ? `${base} ml-auto` : base;\n });\n}\n\n// ── ErrorDirective ──\n\n@Directive({\n selector: '[twError]',\n host: {\n 'role': 'alert',\n 'aria-live': 'polite',\n '[attr.id]': 'id',\n '[class]': 'classes()',\n '[class.hidden]': '!shouldShow()',\n },\n})\nexport class ErrorDirective {\n private readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly id = `tw-form-field-error-${nextErrorId++}`;\n\n /** Validation error key this message is bound to (e.g. `'required'`, `'email'`, `'minlength'`). When set, the error renders only while the surrounding control reports that key in its active validation errors. When omitted, the error displays whenever the form-field is in an error state — useful as a generic fallback. */\n readonly match = input<string | undefined>(undefined);\n\n /** @internal Whether this error should display given the control's active error keys. */\n readonly shouldShow = computed(() => {\n const key = this.match();\n if (!key) return true;\n return this.formField.activeErrorKeys().has(key);\n });\n\n /** @internal */\n readonly classes = computed(() => this.formField.errorClasses());\n}\n\n// ── PrefixDirective ──\n\n@Directive({\n selector: '[twPrefix]',\n host: {\n '[class]': 'prefixClasses()',\n },\n})\nexport class PrefixDirective {\n protected readonly formField = inject(FormFieldComponent);\n\n /** @internal Used by the form-field to measure the prefix area and align the resting label after it. */\n readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly prefixClasses = computed(() => this.formField.prefixClasses());\n}\n\n// ── SuffixDirective ──\n\n@Directive({\n selector: '[twSuffix]',\n host: {\n '[class]': 'suffixClasses()',\n },\n})\nexport class SuffixDirective {\n protected readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly suffixClasses = computed(() => this.formField.suffixClasses());\n}\n\n// ── PrefixIconDirective / SuffixIconDirective ──\n// Opt-in directives that apply a glyph-sized adornment (`size-5 text-fg-muted shrink-0`) so consumers\n// don't pick `size-4` vs `size-5` ad-hoc. Use these for SVG icons; use [twPrefix]/[twSuffix]\n// when the adornment is text (currency, units, kbd hints).\n// They extend Prefix/SuffixDirective so the form-field's content query picks them up as a prefix/suffix\n// when computing the resting-label offset.\n\n@Directive({\n selector: '[twPrefixIcon]',\n host: {\n '[class]': 'prefixClasses()',\n },\n providers: [{ provide: PrefixDirective, useExisting: PrefixIconDirective }],\n})\nexport class PrefixIconDirective extends PrefixDirective {\n /** @internal */\n override readonly prefixClasses = computed(\n () => `${this.formField.prefixClasses()} size-5`,\n );\n}\n\n@Directive({\n selector: '[twSuffixIcon]',\n host: {\n '[class]': 'suffixClasses()',\n },\n providers: [{ provide: SuffixDirective, useExisting: SuffixIconDirective }],\n})\nexport class SuffixIconDirective extends SuffixDirective {\n /** @internal */\n override readonly suffixClasses = computed(\n () => `${this.formField.suffixClasses()} size-5`,\n );\n}\n\n// ── FormFieldComponent ──\n\n@Component({\n selector: 'tw-form-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.html',\n host: {\n '[class]': 'rootClasses()',\n '(click)': '_onContainerClick($event)',\n },\n providers: [\n { provide: TW_FORM_FIELD, useExisting: forwardRef(() => FormFieldComponent) },\n ],\n})\nexport class FormFieldComponent implements AfterContentInit, TwFormFieldParent {\n /** Visual appearance of the field container. `'outline'` draws a full border around the control; `'filled'` uses a filled surface with a bottom border. Defaults to `'outline'`. */\n readonly appearance = input<FormFieldAppearance>('outline');\n\n /** Density of the field container. Maps to the inline-padding scale (`px-2 py-1` xs … `px-5 py-3` xl) and the floating-label font scale. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Floating label behavior. `'auto'` floats when focused or non-empty; `'always'` stays floated; `'never'` disables floating entirely (the label wrapper is not rendered and the wrapped control's placeholder is always visible). Defaults to `'auto'`. */\n readonly floatLabel = input<FloatLabel>('auto');\n\n /** Subscript sizing strategy. `'fixed'` always reserves a 20px row for hints/errors so adjacent fields align; `'dynamic'` collapses the row when no hint/error is projected. Defaults to `'fixed'`. */\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\n\n /** Hides the visual required marker (`*`) even when the wrapped control is required. `aria-required` on the control is unaffected. Defaults to `false`. */\n readonly hideRequiredMarker = input(false);\n\n /** Semantic color for focused/active accents (focused border, floated label). Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Default alignment for a `twHint` element that does not specify its own `align`. Defaults to `'start'`. */\n readonly hintAlign = input<'start' | 'end'>('start');\n\n /** @internal */\n readonly control = contentChild(TW_FORM_FIELD_CONTROL, { descendants: true });\n /** @internal */\n readonly labelChild = contentChild(LabelDirective, { descendants: true });\n /** @internal */\n readonly hintChildren = contentChildren(HintDirective, { descendants: true });\n /** @internal */\n readonly errorChildren = contentChildren(ErrorDirective, { descendants: true });\n /** @internal */\n readonly prefixChildren = contentChildren(PrefixDirective, { descendants: true });\n /** @internal */\n readonly infixRef = viewChild<ElementRef<HTMLElement>>('infix');\n\n /** @internal */\n readonly hasLabel = computed(() => !!this.labelChild());\n /** @internal */\n readonly hasPrefix = computed(() => this.prefixChildren().length > 0);\n\n /** @internal Resting-label left offset in pixels, mirroring the infix's `offsetLeft` so the label sits right after any prefix. */\n private readonly restingLabelOffset = signal(12);\n\n /** @internal */\n readonly isFocused = computed(() => !!this.control()?.focused());\n /** @internal */\n readonly isInvalid = computed(() => !!this.control()?.errorState());\n /** @internal */\n readonly isDisabled = computed(() => !!this.control()?.disabled());\n /** @internal */\n readonly isRequired = computed(() => !!this.control()?.required());\n\n /** @internal Whether the floating label wrapper should render at all. `'never'` opts out entirely. */\n readonly shouldRenderLabelWrapper = computed(\n () => this.hasLabel() && this.floatLabel() !== 'never',\n );\n\n /** @internal */\n readonly shouldLabelFloat = computed(() => {\n const mode = this.floatLabel();\n if (mode === 'never') return false;\n if (mode === 'always') return true;\n const ctrl = this.control();\n if (!ctrl) return false;\n return ctrl.focused() || !ctrl.empty();\n });\n\n /** @internal Inline `left` value for the label wrapper. Floated labels pin to the container edge; resting labels align with the infix's left (after any prefix). */\n readonly labelLeft = computed(() =>\n this.shouldLabelFloat() ? '0.5rem' : `${this.restingLabelOffset()}px`,\n );\n\n /** @internal */\n readonly subscriptMode = computed<'error' | 'hint'>(() =>\n this.isInvalid() && this.errorChildren().length > 0 ? 'error' : 'hint',\n );\n\n /** @internal Set of validation error keys currently active on the bound control (e.g. `Set('required', 'email')`). Empty when the control has no `errors` signal or no active errors. Read by `[twError match=\"…\"]` to decide whether to display. */\n readonly activeErrorKeys = computed<ReadonlySet<string>>(() => {\n const errs = this.control()?.errors?.();\n return new Set(errs ? Object.keys(errs) : []);\n });\n\n /** @internal Whether the subscript row has anything to render right now. */\n readonly hasSubscriptContent = computed(() => {\n if (this.subscriptMode() === 'error') return this.errorChildren().length > 0;\n return this.hintChildren().length > 0;\n });\n\n /** @internal Whether the subscript wrapper renders. In `'fixed'` mode it always renders to reserve vertical space; in `'dynamic'` mode it collapses when empty. */\n readonly shouldRenderSubscript = computed(() => {\n if (this.subscriptSizing() === 'fixed') return true;\n return this.hasSubscriptContent();\n });\n\n private readonly controlTypeClass = computed(() => {\n const type = this.control()?.controlType;\n return type ? `tw-form-field-type-${type}` : '';\n });\n\n private readonly variantResult = computed(() =>\n formFieldVariants({\n appearance: this.appearance(),\n size: this.size(),\n color: this.color(),\n focused: this.isFocused(),\n invalid: this.isInvalid(),\n labelFloated: this.shouldLabelFloat(),\n subscriptReserve: this.subscriptSizing() === 'fixed',\n disabled: this.isDisabled(),\n }),\n );\n\n /** @internal */\n readonly rootClasses = computed(() => {\n const base = this.variantResult().root();\n const type = this.controlTypeClass();\n return type ? `${base} ${type}` : base;\n });\n /** @internal */\n readonly controlWrapperClasses = computed(() => this.variantResult().controlWrapper());\n /** @internal */\n readonly infixClasses = computed(() => {\n const base = this.variantResult().infix();\n // Hide the placeholder while the resting label is occupying the same space.\n // `floatLabel='never'` keeps the placeholder visible regardless of label projection.\n const hidePlaceholder =\n this.shouldRenderLabelWrapper() && !this.shouldLabelFloat();\n return hidePlaceholder\n ? `${base} [&_input::placeholder]:opacity-0 [&_textarea::placeholder]:opacity-0`\n : base;\n });\n /** @internal */\n readonly labelWrapperClasses = computed(() => this.variantResult().labelWrapper());\n /** @internal */\n readonly labelClasses = computed(() => this.variantResult().label());\n /** @internal */\n readonly requiredMarkerClasses = computed(() => this.variantResult().requiredMarker());\n /** @internal */\n readonly prefixClasses = computed(() => this.variantResult().prefix());\n /** @internal */\n readonly suffixClasses = computed(() => this.variantResult().suffix());\n /** @internal */\n readonly subscriptWrapperClasses = computed(() => this.variantResult().subscriptWrapper());\n /** @internal */\n readonly hintClasses = computed(() => this.variantResult().hint());\n /** @internal */\n readonly errorClasses = computed(() => this.variantResult().error());\n\n constructor() {\n // Push merged aria-describedby ids to the control whenever hint/error lists, the subscript mode, or per-error `match` visibility change.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl) return;\n const ids: string[] = [];\n if (this.subscriptMode() === 'error') {\n for (const e of this.errorChildren()) {\n // Filter by `shouldShow()` so `[twError match=\"…\"]` entries that\n // don't match the active validation keys are not announced.\n if (e.shouldShow()) ids.push(e.id);\n }\n } else {\n for (const h of this.hintChildren()) ids.push(h.id);\n }\n const userIds = ctrl.userAriaDescribedBy?.();\n if (userIds) {\n for (const id of userIds.split(/\\s+/)) {\n if (id) ids.push(id);\n }\n }\n untracked(() => ctrl.setDescribedByIds(ids));\n });\n\n // Push merged aria-labelledby ids (projected label id + user-supplied) to the control.\n // Native inputs ignore this in practice (the `for=`/`id` association wins) but non-native\n // triggers (combobox, date-picker) need the explicit attribute for screen readers.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl) return;\n const ids: string[] = [];\n const labelId = this.labelChild()?.id;\n if (labelId && this.shouldRenderLabelWrapper()) ids.push(labelId);\n const userIds = ctrl.userAriaLabelledby?.();\n if (userIds) {\n for (const id of userIds.split(/\\s+/)) {\n if (id) ids.push(id);\n }\n }\n untracked(() => ctrl.setLabelledByIds(ids));\n });\n\n // Dev-mode validation: at most one hint per alignment.\n // Reports via `console.error` instead of `throw` so an authoring mistake\n // surfaces during development without crashing the surrounding effect graph\n // (which would otherwise leave Angular in an unrecoverable error state).\n effect(() => {\n if (!isDevMode()) return;\n const hints = this.hintChildren();\n const startCount = hints.filter((h) => h.effectiveAlign() === 'start').length;\n const endCount = hints.filter((h) => h.effectiveAlign() === 'end').length;\n if (startCount > 1 || endCount > 1) {\n console.error(\n 'tw-form-field: only one twHint per alignment (\"start\" / \"end\") is allowed.',\n );\n }\n });\n\n // Track the infix's left offset so the resting label can sit right after any prefix.\n effect((onCleanup) => {\n const prefixes = this.prefixChildren();\n if (prefixes.length === 0) {\n this.restingLabelOffset.set(12);\n return;\n }\n const infix = this.infixRef()?.nativeElement;\n if (!infix) return;\n const update = (): void => this.restingLabelOffset.set(infix.offsetLeft);\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n for (const p of prefixes) {\n ro.observe(p.elementRef.nativeElement);\n }\n ro.observe(infix);\n onCleanup(() => ro.disconnect());\n });\n }\n\n ngAfterContentInit(): void {\n if (isDevMode() && !this.control()) {\n throw new Error(\n 'tw-form-field requires a child control providing TW_FORM_FIELD_CONTROL. ' +\n 'Place a control (e.g. <input twInput />) inside the <tw-form-field>.',\n );\n }\n }\n\n /** @internal */\n _onContainerClick(event: MouseEvent): void {\n this.control()?.onContainerClick(event);\n }\n}\n","<div [class]=\"controlWrapperClasses()\">\n <ng-content select=\"[twPrefix]\" />\n <ng-content select=\"[twPrefixIcon]\" />\n <div #infix [class]=\"infixClasses()\">\n <ng-content />\n </div>\n <ng-content select=\"[twSuffix]\" />\n <ng-content select=\"[twSuffixIcon]\" />\n @if (shouldRenderLabelWrapper()) {\n <div [class]=\"labelWrapperClasses()\" [style.left]=\"labelLeft()\">\n <ng-content select=\"[twLabel]\" />\n @if (!hideRequiredMarker() && isRequired()) {\n <span [class]=\"requiredMarkerClasses()\" aria-hidden=\"true\">*</span>\n }\n </div>\n }\n</div>\n\n@if (shouldRenderSubscript()) {\n <div [class]=\"subscriptWrapperClasses()\">\n @if (subscriptMode() === 'error') {\n <ng-content select=\"[twError]\" />\n } @else {\n <ng-content select=\"[twHint]\" />\n }\n </div>\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-form-field.mjs","sources":["../../../projects/ngx-tw/form-field/form-field.ts","../../../projects/ngx-tw/form-field/form-field.html","../../../projects/ngx-tw/form-field/cdevhub-ngx-tw-form-field.ts"],"sourcesContent":["import {\n type AfterContentInit,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n forwardRef,\n inject,\n InjectionToken,\n input,\n isDevMode,\n signal,\n type Signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual appearance of the form-field container. */\nexport type FormFieldAppearance = 'outline' | 'filled';\n\n/** Floating label behavior. `'never'` disables floating entirely; the label wrapper is not rendered and the wrapped control's placeholder is always visible. */\nexport type FloatLabel = 'auto' | 'always' | 'never';\n\n/** Subscript (hint/error row) sizing strategy. `'fixed'` always reserves vertical space; `'dynamic'` collapses the row when no hint/error is projected. */\nexport type SubscriptSizing = 'fixed' | 'dynamic';\n\n/**\n * Contract every ngx-tw form-field-compatible control must implement. A\n * concrete control provides itself under {@link TW_FORM_FIELD_CONTROL} so the\n * surrounding `FormFieldComponent` can mirror its state and wire ARIA.\n */\nexport abstract class FormFieldControl<T = unknown> {\n /** Unique id on the control's host element. Used by the form-field label `for` attribute and `aria-describedby` wiring. */\n abstract readonly id: Signal<string>;\n /** Current value of the control. */\n abstract readonly value: Signal<T | null>;\n /** Whether the control currently has focus. Typically driven by CDK `FocusMonitor`. */\n abstract readonly focused: Signal<boolean>;\n /** Whether the control's value is considered empty. Drives the floating-label state. */\n abstract readonly empty: Signal<boolean>;\n /** Whether the control is disabled. */\n abstract readonly disabled: Signal<boolean>;\n /** Whether the control is marked required. */\n abstract readonly required: Signal<boolean>;\n /** Whether the control should be rendered as invalid. Usually derived from `NgControl.invalid` combined with `touched`/`submitted`. */\n abstract readonly errorState: Signal<boolean>;\n /**\n * Active validation errors map keyed by validator name (e.g. `{ required: true, email: true }`).\n * Returns `null` when the control has no validation errors.\n *\n * This is the *only* source the form-field consults for `[twError match=\"…\"]` filtering: it\n * feeds `FormFieldComponent.activeErrorKeys`, and an error with a `match` renders only while\n * that key is present. A control that leaves this undefined therefore reports an empty key set,\n * and **every `match`-targeted message under it is permanently hidden** — in all three form\n * strategies, with no warning. Unmatched `[twError]` messages are unaffected; they follow\n * `errorState` alone.\n *\n * Optional only so the member can be added to existing controls without a breaking change. Any\n * control that resolves an `NgControl` should implement it — typically as\n * `computed(() => ngControl?.control?.errors ?? null)`, reading whatever revision signal the\n * control already uses to invalidate `errorState`, so the map tracks validator transitions that\n * do not flip `VALID`/`INVALID`. Omit it only for a control that genuinely has no validation\n * errors to report.\n */\n readonly errors?: Signal<Record<string, unknown> | null>;\n /** Optional control-type identifier (e.g. `'input'`, `'select'`). When set, the form-field appends `tw-form-field-type-{controlType}` to its host for styling hooks. */\n abstract readonly controlType?: string;\n /** Optional consumer-supplied `aria-describedby` ids the form-field preserves when merging in hint/error ids. */\n abstract readonly userAriaDescribedBy?: Signal<string | undefined>;\n /** Optional consumer-supplied `aria-labelledby` ids the form-field preserves when merging in the projected label id. Controls that consume label pushdown (non-native triggers) override this. */\n readonly userAriaLabelledby?: Signal<string | undefined>;\n\n /** Called by the form-field to push the merged `aria-describedby` ids back onto the control's host element. */\n abstract setDescribedByIds(ids: string[]): void;\n /** Called when the form-field container is clicked. Concrete controls typically focus their underlying native element or open a panel. */\n abstract onContainerClick(event: MouseEvent): void;\n /**\n * Called by the form-field to push the merged `aria-labelledby` ids onto the control's host element.\n * Default is a no-op — native `<input>` controls rely on the label's `for=` attribute for the canonical association.\n * Non-native controls (combobox triggers, date-pickers, etc.) override this to set the attribute explicitly.\n */\n setLabelledByIds(_ids: string[]): void {\n // Default no-op. Controls override when label pushdown is required for accessibility.\n }\n}\n\n/**\n * Injection token matching {@link FormFieldControl}. Controls register via\n * `providers: [{ provide: TW_FORM_FIELD_CONTROL, useExisting: MyControl }]`.\n */\nexport const TW_FORM_FIELD_CONTROL = new InjectionToken<FormFieldControl<unknown>>(\n 'TW_FORM_FIELD_CONTROL',\n);\n\n/**\n * Minimal surface a wrapped control reads from its surrounding form-field —\n * presence (via optional injection) plus whether a label is projected — without\n * depending on the concrete {@link FormFieldComponent}. Controls inject\n * {@link TW_FORM_FIELD} typed as this interface so detecting a parent form-field\n * never pins the heavier component class into the control's own bundle.\n */\nexport interface TwFormFieldParent {\n /** Whether a `twLabel` element is projected into the form-field. */\n readonly hasLabel: Signal<boolean>;\n}\n\n/**\n * Injection token exposing the wrapping {@link TwFormFieldParent}. The\n * {@link FormFieldComponent} provides itself under this token; controls inject\n * it with `{ optional: true }` to detect (and read label state from) a parent\n * `tw-form-field` without referencing the concrete component class — keeping the\n * form-field component out of each control's bundle.\n */\nexport const TW_FORM_FIELD = new InjectionToken<TwFormFieldParent>('TW_FORM_FIELD');\n\n// Resting-label left offset used when the field has no prefix: matches the control row's own\n// horizontal padding so the label lines up with the control's text.\nconst DEFAULT_RESTING_LABEL_OFFSET_PX = 12;\n\n// ── Unique ID counters ──\nlet nextLabelId = 0;\nlet nextHintId = 0;\nlet nextErrorId = 0;\n\n// ── tv() config ──\n\nconst formFieldVariants = tv({\n slots: {\n root: 'block text-fg',\n controlWrapper:\n 'relative flex items-stretch gap-2 rounded-md bg-transparent transition-colors duration-normal motion-reduce:transition-none',\n infix: 'relative flex-1 flex items-center min-w-0 [&_input::placeholder]:transition-opacity [&_input::placeholder]:duration-normal [&_textarea::placeholder]:transition-opacity [&_textarea::placeholder]:duration-normal',\n labelWrapper:\n 'absolute pointer-events-none flex items-center max-w-[calc(100%-1.5rem)] transition-[top,left,color,transform] duration-normal motion-reduce:transition-none origin-[top_left]',\n label:\n 'text-fg-muted truncate transition-[font-size,color] duration-normal motion-reduce:transition-none',\n requiredMarker: 'text-error-600 ml-0.5',\n prefix: 'flex items-center shrink-0 text-fg-muted',\n suffix: 'flex items-center shrink-0 text-fg-muted',\n subscriptWrapper: 'mt-1 text-xs flex gap-2',\n hint: 'text-fg-muted',\n error: 'text-error-600 font-medium',\n },\n variants: {\n appearance: {\n outline: {\n controlWrapper: 'border border-border hover:border-border-strong',\n },\n filled: {\n controlWrapper:\n 'bg-surface-muted border-b border-border hover:bg-surface-sunken',\n infix: 'items-end',\n },\n },\n // Density of the control row. Two things ride this axis:\n //\n // 1. The font scale, on `controlWrapper` rather than `infix`. A nested\n // control strips its own `text-*` (see `inputVariants`' `inFormField`\n // branch), so without this the row inherited the ambient 16px/24px line\n // box at every size and the size axis did nothing vertically. It sits on\n // `controlWrapper` so the prefix and suffix adornments scale with the\n // control instead of driving the row taller than the control it wraps;\n // the `label` slot sets its own `text-*` per (size, labelFloated) and so\n // is unaffected.\n // 2. The `min-h-*` floor from the control-height scale\n // (`docs/vertical-rhythm.md`). A floor rather than a pinned height\n // because a form-field wraps arbitrary consumer controls — a textarea,\n // a wrapping tag list — and must be free to grow. The vertical padding\n // is deliberately retained for the same reason: it is the only vertical\n // breathing room a nested `p-0` control has.\n size: {\n xs: { controlWrapper: 'min-h-6 text-xs' },\n sm: { controlWrapper: 'min-h-8 text-sm' },\n md: { controlWrapper: 'min-h-9 text-sm' },\n lg: { controlWrapper: 'min-h-11 text-base' },\n xl: { controlWrapper: 'min-h-12 text-base' },\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n focused: {\n true: {},\n false: {},\n },\n invalid: {\n true: {},\n false: {},\n },\n labelFloated: {\n true: {\n labelWrapper: 'top-1 left-2',\n },\n false: {\n labelWrapper: 'top-1/2 -translate-y-1/2 left-3',\n },\n },\n subscriptReserve: {\n true: { subscriptWrapper: 'min-h-5' },\n false: {},\n },\n // The disabled treatment splits across two slots on purpose.\n //\n // `opacity-50` moved OFF `root`. `root` wraps both the control row and the\n // subscript (hint/error) row, so dimming it composited every hint down to\n // 50% alpha over the page surface. At that alpha no foreground token can\n // reach AA: pure black at 50% over white is #808080 = 3.95:1, and\n // `text-fg-muted` (gray-600, 7.56:1 at rest) measured 2.34:1 light /\n // 3.92:1 dark. That is a real SC 1.4.3 failure — a hint is a description OF\n // the control, not part OF the inactive control, so it does not inherit\n // 1.4.3's inactive-component exemption — and it is the text most worth\n // reading on a disabled field (\"Disabled — slugs can no longer be edited\").\n // The label wrapper is nested inside `controlWrapper` (see\n // `form-field.html`), so the label keeps exactly the dimming it had, and\n // axe already exempts it anyway via its `<label for>` → disabled control.\n //\n // `pointer-events-none` deliberately STAYS on `root`. Moving it would make\n // the subscript row live again, and the host's `(click)` forwards to\n // `control.onContainerClick()` — which not every wrapped control guards on\n // its disabled state. Keeping it on the host preserves the interaction\n // semantics exactly; only the composited alpha changes.\n disabled: {\n true: { root: 'pointer-events-none', controlWrapper: 'opacity-50' },\n false: {},\n },\n },\n compoundVariants: [\n // ── Padding × (appearance, size) ──\n // Vertical padding sits one half-step below the inline-padding scale so the\n // `min-h-*` floor on the control row actually BINDS at rest. With the\n // nominal padding the natural height (padding + line box + 2px border)\n // lands 2px above the floor at every size, leaving the floor inert and a\n // wrapped control 2px taller than the same control standalone. The padding\n // still governs the multi-line case (textarea), where the row grows past\n // the floor. `filled` is deliberately NOT shifted — its asymmetric\n // `pt-*`/`pb-*` reserves room for the floating label and is taller by design.\n { appearance: 'outline', size: 'xs', class: { controlWrapper: 'px-2 py-0.5' } },\n { appearance: 'outline', size: 'sm', class: { controlWrapper: 'px-3 py-1' } },\n { appearance: 'outline', size: 'md', class: { controlWrapper: 'px-3 py-1.5' } },\n { appearance: 'outline', size: 'lg', class: { controlWrapper: 'px-4 py-2' } },\n { appearance: 'outline', size: 'xl', class: { controlWrapper: 'px-5 py-2.5' } },\n { appearance: 'filled', size: 'xs', class: { controlWrapper: 'px-2 pt-5 pb-1' } },\n { appearance: 'filled', size: 'sm', class: { controlWrapper: 'px-3 pt-5 pb-1.5' } },\n { appearance: 'filled', size: 'md', class: { controlWrapper: 'px-3 pt-6 pb-2' } },\n { appearance: 'filled', size: 'lg', class: { controlWrapper: 'px-4 pt-7 pb-2.5' } },\n { appearance: 'filled', size: 'xl', class: { controlWrapper: 'px-5 pt-8 pb-3' } },\n\n // ── Label font-size × (size, labelFloated) ──\n { size: 'xs', labelFloated: false, class: { label: 'text-xs' } },\n { size: 'xs', labelFloated: true, class: { label: 'text-2xs' } },\n { size: 'sm', labelFloated: false, class: { label: 'text-sm' } },\n { size: 'sm', labelFloated: true, class: { label: 'text-xs' } },\n { size: 'md', labelFloated: false, class: { label: 'text-sm' } },\n { size: 'md', labelFloated: true, class: { label: 'text-xs' } },\n { size: 'lg', labelFloated: false, class: { label: 'text-base' } },\n { size: 'lg', labelFloated: true, class: { label: 'text-sm' } },\n { size: 'xl', labelFloated: false, class: { label: 'text-base' } },\n { size: 'xl', labelFloated: true, class: { label: 'text-sm' } },\n\n // ── Outline + focused → colored border ──\n { appearance: 'outline', focused: true, color: 'primary', class: { controlWrapper: 'border-primary-500' } },\n { appearance: 'outline', focused: true, color: 'secondary', class: { controlWrapper: 'border-secondary-500' } },\n { appearance: 'outline', focused: true, color: 'accent', class: { controlWrapper: 'border-accent-500' } },\n { appearance: 'outline', focused: true, color: 'neutral', class: { controlWrapper: 'border-border-strong' } },\n { appearance: 'outline', focused: true, color: 'info', class: { controlWrapper: 'border-info-500' } },\n { appearance: 'outline', focused: true, color: 'success', class: { controlWrapper: 'border-success-500' } },\n { appearance: 'outline', focused: true, color: 'warning', class: { controlWrapper: 'border-warning-500' } },\n { appearance: 'outline', focused: true, color: 'error', class: { controlWrapper: 'border-error-500' } },\n\n // ── Filled + focused → colored bottom border ──\n { appearance: 'filled', focused: true, color: 'primary', class: { controlWrapper: 'border-b-2 border-primary-500' } },\n { appearance: 'filled', focused: true, color: 'secondary', class: { controlWrapper: 'border-b-2 border-secondary-500' } },\n { appearance: 'filled', focused: true, color: 'accent', class: { controlWrapper: 'border-b-2 border-accent-500' } },\n { appearance: 'filled', focused: true, color: 'neutral', class: { controlWrapper: 'border-b-2 border-border-strong' } },\n { appearance: 'filled', focused: true, color: 'info', class: { controlWrapper: 'border-b-2 border-info-500' } },\n { appearance: 'filled', focused: true, color: 'success', class: { controlWrapper: 'border-b-2 border-success-500' } },\n { appearance: 'filled', focused: true, color: 'warning', class: { controlWrapper: 'border-b-2 border-warning-500' } },\n { appearance: 'filled', focused: true, color: 'error', class: { controlWrapper: 'border-b-2 border-error-500' } },\n\n // ── Floated label + focused → colored label ──\n { labelFloated: true, focused: true, color: 'primary', class: { label: 'text-primary-600' } },\n { labelFloated: true, focused: true, color: 'secondary', class: { label: 'text-secondary-600' } },\n { labelFloated: true, focused: true, color: 'accent', class: { label: 'text-accent-600' } },\n { labelFloated: true, focused: true, color: 'neutral', class: { label: 'text-fg' } },\n { labelFloated: true, focused: true, color: 'info', class: { label: 'text-info-600' } },\n { labelFloated: true, focused: true, color: 'success', class: { label: 'text-success-600' } },\n { labelFloated: true, focused: true, color: 'warning', class: { label: 'text-warning-600' } },\n { labelFloated: true, focused: true, color: 'error', class: { label: 'text-error-600' } },\n\n // ── Outline + floated label → sit centered on the top border with a surface notch ──\n { appearance: 'outline', labelFloated: true, class: { labelWrapper: 'bg-surface px-1 top-0 -translate-y-1/2' } },\n\n // ── Filled + resting label → align vertically with the input baseline (input is items-end inside an asymmetric pt/pb container) ──\n { appearance: 'filled', labelFloated: false, class: { labelWrapper: 'top-[calc(50%+0.5rem)]' } },\n\n // ── Invalid overrides (declared last so twMerge lets them win) ──\n { invalid: true, appearance: 'outline', class: { controlWrapper: 'border-error-500' } },\n { invalid: true, appearance: 'filled', class: { controlWrapper: 'border-b-2 border-error-500' } },\n { invalid: true, labelFloated: true, class: { label: 'text-error-600' } },\n ],\n defaultVariants: {\n appearance: 'outline',\n size: 'md',\n color: 'primary',\n focused: false,\n invalid: false,\n labelFloated: false,\n subscriptReserve: true,\n disabled: false,\n },\n}, {\n twMerge: true,\n});\n\n// ── LabelDirective ──\n\n@Directive({\n selector: '[twLabel]',\n host: {\n '[attr.id]': 'id',\n '[attr.for]': 'controlId()',\n '[class]': 'classes()',\n },\n})\nexport class LabelDirective {\n private readonly formField = inject(FormFieldComponent);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly id = `tw-form-field-label-${nextLabelId++}`;\n\n /** @internal */\n readonly controlId = computed(() => this.formField.control()?.id() ?? null);\n\n /** @internal */\n readonly classes = computed(() => this.formField.labelClasses());\n\n constructor() {\n if (isDevMode()) {\n const tag = this.elementRef.nativeElement.tagName;\n if (tag !== 'LABEL') {\n console.warn(\n `[tw-form-field] twLabel should be applied to a <label> element for the native \\`for\\`/\\`id\\` association to work; got <${tag.toLowerCase()}>. Non-native controls (e.g. tw-select) still receive label pushdown via aria-labelledby.`,\n );\n }\n }\n }\n}\n\n// ── HintDirective ──\n\n@Directive({\n selector: '[twHint]',\n host: {\n '[attr.id]': 'id',\n '[class]': 'classes()',\n },\n})\nexport class HintDirective {\n private readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly id = `tw-form-field-hint-${nextHintId++}`;\n\n /** Alignment within the subscript row. `'end'` pushes the hint to the right. When unset, the form-field's `hintAlign` input supplies the default. */\n readonly align = input<'start' | 'end' | undefined>(undefined);\n\n /** @internal */\n readonly effectiveAlign = computed(\n () => this.align() ?? this.formField.hintAlign(),\n );\n\n /** @internal */\n readonly classes = computed(() => {\n const base = this.formField.hintClasses();\n return this.effectiveAlign() === 'end' ? `${base} ml-auto` : base;\n });\n}\n\n// ── ErrorDirective ──\n\n@Directive({\n selector: '[twError]',\n host: {\n 'role': 'alert',\n 'aria-live': 'polite',\n '[attr.id]': 'id',\n '[class]': 'classes()',\n '[class.hidden]': '!shouldShow()',\n },\n})\nexport class ErrorDirective {\n private readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly id = `tw-form-field-error-${nextErrorId++}`;\n\n /** Validation error key this message is bound to (e.g. `'required'`, `'email'`, `'minlength'`). When set, the error renders only while the surrounding control reports that key in its active validation errors. When omitted, the error displays whenever the form-field is in an error state — useful as a generic fallback. */\n readonly match = input<string | undefined>(undefined);\n\n /** @internal Whether this error should display given the control's active error keys. */\n readonly shouldShow = computed(() => {\n const key = this.match();\n if (!key) return true;\n return this.formField.activeErrorKeys().has(key);\n });\n\n /** @internal */\n readonly classes = computed(() => this.formField.errorClasses());\n}\n\n// ── PrefixDirective ──\n\n@Directive({\n selector: '[twPrefix]',\n host: {\n '[class]': 'prefixClasses()',\n },\n})\nexport class PrefixDirective {\n protected readonly formField = inject(FormFieldComponent);\n\n /** @internal Used by the form-field to measure the prefix area and align the resting label after it. */\n readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly prefixClasses = computed(() => this.formField.prefixClasses());\n}\n\n// ── SuffixDirective ──\n\n@Directive({\n selector: '[twSuffix]',\n host: {\n '[class]': 'suffixClasses()',\n },\n})\nexport class SuffixDirective {\n protected readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly suffixClasses = computed(() => this.formField.suffixClasses());\n}\n\n// ── PrefixIconDirective / SuffixIconDirective ──\n// Opt-in directives that apply a glyph-sized adornment (`size-5 text-fg-muted shrink-0`) so consumers\n// don't pick `size-4` vs `size-5` ad-hoc. Use these for SVG icons; use [twPrefix]/[twSuffix]\n// when the adornment is text (currency, units, kbd hints).\n// They extend Prefix/SuffixDirective so the form-field's content query picks them up as a prefix/suffix\n// when computing the resting-label offset.\n\n@Directive({\n selector: '[twPrefixIcon]',\n host: {\n '[class]': 'prefixClasses()',\n },\n providers: [{ provide: PrefixDirective, useExisting: PrefixIconDirective }],\n})\nexport class PrefixIconDirective extends PrefixDirective {\n /** @internal */\n override readonly prefixClasses = computed(\n () => `${this.formField.prefixClasses()} size-5`,\n );\n}\n\n@Directive({\n selector: '[twSuffixIcon]',\n host: {\n '[class]': 'suffixClasses()',\n },\n providers: [{ provide: SuffixDirective, useExisting: SuffixIconDirective }],\n})\nexport class SuffixIconDirective extends SuffixDirective {\n /** @internal */\n override readonly suffixClasses = computed(\n () => `${this.formField.suffixClasses()} size-5`,\n );\n}\n\n// ── FormFieldComponent ──\n\n@Component({\n selector: 'tw-form-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.html',\n host: {\n '[class]': 'rootClasses()',\n '(click)': '_onContainerClick($event)',\n },\n providers: [\n { provide: TW_FORM_FIELD, useExisting: forwardRef(() => FormFieldComponent) },\n ],\n})\nexport class FormFieldComponent implements AfterContentInit, TwFormFieldParent {\n /** Visual appearance of the field container. `'outline'` draws a full border around the control; `'filled'` uses a filled surface with a bottom border. Defaults to `'outline'`. */\n readonly appearance = input<FormFieldAppearance>('outline');\n\n /** Density of the field container. Maps to the inline-padding scale (`px-2 py-1` xs … `px-5 py-3` xl), the control-row font scale (`text-xs` xs, `text-sm` sm/md, `text-base` lg/xl — inherited by the nested control and by prefix/suffix adornments), the label font scale, and a `min-h-*` floor on the control row from the control-height scale (24/32/36/44/48px). The floor is a minimum, not a fixed height: the row grows for a textarea or any other multi-line control. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Floating label behavior. `'auto'` floats when focused or non-empty; `'always'` stays floated; `'never'` disables floating entirely (the label wrapper is not rendered and the wrapped control's placeholder is always visible). Defaults to `'auto'`. */\n readonly floatLabel = input<FloatLabel>('auto');\n\n /** Subscript sizing strategy. `'fixed'` always reserves a 20px row for hints/errors so adjacent fields align; `'dynamic'` collapses the row when no hint/error is projected. Defaults to `'fixed'`. */\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\n\n /** Hides the visual required marker (`*`) even when the wrapped control is required. `aria-required` on the control is unaffected. Defaults to `false`. */\n readonly hideRequiredMarker = input(false);\n\n /** Semantic color for focused/active accents (focused border, floated label). Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Default alignment for a `twHint` element that does not specify its own `align`. Defaults to `'start'`. */\n readonly hintAlign = input<'start' | 'end'>('start');\n\n /** @internal */\n readonly control = contentChild(TW_FORM_FIELD_CONTROL, { descendants: true });\n /** @internal */\n readonly labelChild = contentChild(LabelDirective, { descendants: true });\n /** @internal */\n readonly hintChildren = contentChildren(HintDirective, { descendants: true });\n /** @internal */\n readonly errorChildren = contentChildren(ErrorDirective, { descendants: true });\n /** @internal */\n readonly prefixChildren = contentChildren(PrefixDirective, { descendants: true });\n /** @internal */\n readonly infixRef = viewChild<ElementRef<HTMLElement>>('infix');\n\n /** @internal */\n readonly hasLabel = computed(() => !!this.labelChild());\n /** @internal */\n readonly hasPrefix = computed(() => this.prefixChildren().length > 0);\n\n /** @internal Resting-label left offset in pixels, mirroring the infix's `offsetLeft` so the label sits right after any prefix. */\n private readonly restingLabelOffset = signal(DEFAULT_RESTING_LABEL_OFFSET_PX);\n\n /** @internal */\n readonly isFocused = computed(() => !!this.control()?.focused());\n /** @internal */\n readonly isInvalid = computed(() => !!this.control()?.errorState());\n /** @internal */\n readonly isDisabled = computed(() => !!this.control()?.disabled());\n /** @internal */\n readonly isRequired = computed(() => !!this.control()?.required());\n\n /** @internal Whether the floating label wrapper should render at all. `'never'` opts out entirely. */\n readonly shouldRenderLabelWrapper = computed(\n () => this.hasLabel() && this.floatLabel() !== 'never',\n );\n\n /** @internal */\n readonly shouldLabelFloat = computed(() => {\n const mode = this.floatLabel();\n if (mode === 'never') return false;\n if (mode === 'always') return true;\n const ctrl = this.control();\n if (!ctrl) return false;\n return ctrl.focused() || !ctrl.empty();\n });\n\n /** @internal Inline `left` value for the label wrapper. Floated labels pin to the container edge; resting labels align with the infix's left (after any prefix). */\n readonly labelLeft = computed(() =>\n this.shouldLabelFloat() ? '0.5rem' : `${this.restingLabelOffset()}px`,\n );\n\n /** @internal */\n readonly subscriptMode = computed<'error' | 'hint'>(() =>\n this.isInvalid() && this.errorChildren().length > 0 ? 'error' : 'hint',\n );\n\n /** @internal Set of validation error keys currently active on the bound control (e.g. `Set('required', 'email')`). Empty when the control has no `errors` signal or no active errors. Read by `[twError match=\"…\"]` to decide whether to display. */\n readonly activeErrorKeys = computed<ReadonlySet<string>>(() => {\n const errs = this.control()?.errors?.();\n return new Set(errs ? Object.keys(errs) : []);\n });\n\n /** @internal Whether the subscript row has anything to render right now. */\n readonly hasSubscriptContent = computed(() => {\n if (this.subscriptMode() === 'error') return this.errorChildren().length > 0;\n return this.hintChildren().length > 0;\n });\n\n /** @internal Whether the subscript wrapper renders. In `'fixed'` mode it always renders to reserve vertical space; in `'dynamic'` mode it collapses when empty. */\n readonly shouldRenderSubscript = computed(() => {\n if (this.subscriptSizing() === 'fixed') return true;\n return this.hasSubscriptContent();\n });\n\n private readonly controlTypeClass = computed(() => {\n const type = this.control()?.controlType;\n return type ? `tw-form-field-type-${type}` : '';\n });\n\n private readonly variantResult = computed(() =>\n formFieldVariants({\n appearance: this.appearance(),\n size: this.size(),\n color: this.color(),\n focused: this.isFocused(),\n invalid: this.isInvalid(),\n labelFloated: this.shouldLabelFloat(),\n subscriptReserve: this.subscriptSizing() === 'fixed',\n disabled: this.isDisabled(),\n }),\n );\n\n /** @internal */\n readonly rootClasses = computed(() => {\n const base = this.variantResult().root();\n const type = this.controlTypeClass();\n return type ? `${base} ${type}` : base;\n });\n /** @internal */\n readonly controlWrapperClasses = computed(() => this.variantResult().controlWrapper());\n /** @internal */\n readonly infixClasses = computed(() => {\n const base = this.variantResult().infix();\n // Hide the placeholder while the resting label is occupying the same space.\n // `floatLabel='never'` keeps the placeholder visible regardless of label projection.\n const hidePlaceholder =\n this.shouldRenderLabelWrapper() && !this.shouldLabelFloat();\n return hidePlaceholder\n ? `${base} [&_input::placeholder]:opacity-0 [&_textarea::placeholder]:opacity-0`\n : base;\n });\n /** @internal */\n readonly labelWrapperClasses = computed(() => this.variantResult().labelWrapper());\n /** @internal */\n readonly labelClasses = computed(() => this.variantResult().label());\n /** @internal */\n readonly requiredMarkerClasses = computed(() => this.variantResult().requiredMarker());\n /** @internal */\n readonly prefixClasses = computed(() => this.variantResult().prefix());\n /** @internal */\n readonly suffixClasses = computed(() => this.variantResult().suffix());\n /** @internal */\n readonly subscriptWrapperClasses = computed(() => this.variantResult().subscriptWrapper());\n /** @internal */\n readonly hintClasses = computed(() => this.variantResult().hint());\n /** @internal */\n readonly errorClasses = computed(() => this.variantResult().error());\n\n constructor() {\n // Push merged aria-describedby ids to the control whenever hint/error lists, the subscript mode, or per-error `match` visibility change.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl) return;\n const ids: string[] = [];\n if (this.subscriptMode() === 'error') {\n for (const e of this.errorChildren()) {\n // Filter by `shouldShow()` so `[twError match=\"…\"]` entries that\n // don't match the active validation keys are not announced.\n if (e.shouldShow()) ids.push(e.id);\n }\n } else {\n for (const h of this.hintChildren()) ids.push(h.id);\n }\n const userIds = ctrl.userAriaDescribedBy?.();\n if (userIds) {\n for (const id of userIds.split(/\\s+/)) {\n if (id) ids.push(id);\n }\n }\n untracked(() => ctrl.setDescribedByIds(ids));\n });\n\n // Push merged aria-labelledby ids (projected label id + user-supplied) to the control.\n // Native inputs ignore this in practice (the `for=`/`id` association wins) but non-native\n // triggers (combobox, date-picker) need the explicit attribute for screen readers.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl) return;\n const ids: string[] = [];\n const labelId = this.labelChild()?.id;\n if (labelId && this.shouldRenderLabelWrapper()) ids.push(labelId);\n const userIds = ctrl.userAriaLabelledby?.();\n if (userIds) {\n for (const id of userIds.split(/\\s+/)) {\n if (id) ids.push(id);\n }\n }\n untracked(() => ctrl.setLabelledByIds(ids));\n });\n\n // Dev-mode validation: at most one hint per alignment.\n // Reports via `console.error` instead of `throw` so an authoring mistake\n // surfaces during development without crashing the surrounding effect graph\n // (which would otherwise leave Angular in an unrecoverable error state).\n effect(() => {\n if (!isDevMode()) return;\n const hints = this.hintChildren();\n const startCount = hints.filter((h) => h.effectiveAlign() === 'start').length;\n const endCount = hints.filter((h) => h.effectiveAlign() === 'end').length;\n if (startCount > 1 || endCount > 1) {\n console.error(\n 'tw-form-field: only one twHint per alignment (\"start\" / \"end\") is allowed.',\n );\n }\n });\n\n // Track the infix's left offset so the resting label can sit right after any prefix.\n //\n // The measurement lives in `afterRenderEffect`'s `earlyRead` phase, NOT in a plain\n // `effect()`. `effect()` runs inside `refreshView` *after* this component's own template but\n // *before* its embedded views, content queries, host bindings and child components are\n // refreshed, so `offsetLeft` read there samples geometry that predates the very change that\n // triggered the run — a prefix appearing inside an `@if`, for instance. `earlyRead` runs\n // after the whole render has committed, which is what it exists for.\n //\n // `afterRenderEffect` is a *reactive* effect scheduled into a render phase, not an\n // every-render hook: it re-runs only when a tracked producer changes. The tracked producers\n // here are `prefixChildren()` and `infixRef()` — exactly the set the previous `effect()`\n // tracked, so this is a timing fix, not a coverage fix. A prefix that changes width without\n // changing the prefix set is invisible to the signal graph either way, which is why the\n // ResizeObserver below stays.\n afterRenderEffect({\n earlyRead: () => {\n if (this.prefixChildren().length === 0) return DEFAULT_RESTING_LABEL_OFFSET_PX;\n const infix = this.infixRef()?.nativeElement;\n // `null` means \"nothing measurable this run\" — leave the previous offset in place.\n return infix ? infix.offsetLeft : null;\n },\n write: (offset) => {\n const px = offset();\n if (px !== null) this.restingLabelOffset.set(px);\n },\n });\n\n // Keep the offset fresh when an already-mounted prefix changes size. Creating the observer\n // is a subscription, not a layout read, so a plain `effect()` is the right hook; the\n // callback itself is delivered after layout, so its `offsetLeft` read is safe. Note this\n // repairs *size* changes only — an infix that shifts position with no observed box resizing\n // is not covered here and not covered by the render effect above either.\n effect((onCleanup) => {\n const prefixes = this.prefixChildren();\n if (prefixes.length === 0) return;\n const infix = this.infixRef()?.nativeElement;\n if (!infix) return;\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() =>\n this.restingLabelOffset.set(infix.offsetLeft),\n );\n for (const p of prefixes) {\n ro.observe(p.elementRef.nativeElement);\n }\n ro.observe(infix);\n onCleanup(() => ro.disconnect());\n });\n }\n\n ngAfterContentInit(): void {\n if (isDevMode() && !this.control()) {\n throw new Error(\n 'tw-form-field requires a child control providing TW_FORM_FIELD_CONTROL. ' +\n 'Place a control (e.g. <input twInput />) inside the <tw-form-field>.',\n );\n }\n }\n\n /** @internal */\n _onContainerClick(event: MouseEvent): void {\n this.control()?.onContainerClick(event);\n }\n}\n","<div [class]=\"controlWrapperClasses()\">\n <ng-content select=\"[twPrefix]\" />\n <ng-content select=\"[twPrefixIcon]\" />\n <div #infix [class]=\"infixClasses()\">\n <ng-content />\n </div>\n <ng-content select=\"[twSuffix]\" />\n <ng-content select=\"[twSuffixIcon]\" />\n @if (shouldRenderLabelWrapper()) {\n <div [class]=\"labelWrapperClasses()\" [style.left]=\"labelLeft()\">\n <ng-content select=\"[twLabel]\" />\n @if (!hideRequiredMarker() && isRequired()) {\n <span [class]=\"requiredMarkerClasses()\" aria-hidden=\"true\">*</span>\n }\n </div>\n }\n</div>\n\n@if (shouldRenderSubscript()) {\n <div [class]=\"subscriptWrapperClasses()\">\n @if (subscriptMode() === 'error') {\n <ng-content select=\"[twError]\" />\n } @else {\n <ng-content select=\"[twHint]\" />\n }\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|