@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-command-palette.mjs","sources":["../../../projects/ngx-tw/command-palette/command-palette-tokens.ts","../../../projects/ngx-tw/command-palette/command-palette.ts","../../../projects/ngx-tw/command-palette/command-palette-overlay.html","../../../projects/ngx-tw/command-palette/cdevhub-ngx-tw-command-palette.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/** A single command palette entry. */\nexport interface CommandPaletteItem {\n /** Stable identifier used as the DOM id and for selection payloads. */\n id: string;\n /** Visible label used for rendering and default filtering. */\n label: string;\n /** Additional search keywords that match the query but are not rendered. */\n keywords?: readonly string[];\n /** Group header name. Items sharing a group render under one section. */\n group?: string;\n /** Disabled items render but cannot be activated. */\n disabled?: boolean;\n /** Shortcut hint to render on the right edge. */\n shortcut?: string | readonly string[];\n /** Secondary description text rendered under the label. */\n description?: string;\n /** Optional icon name (consumers decide how to render). */\n icon?: string;\n /** Activation callback invoked before `itemSelected` is emitted. */\n run?: () => void;\n}\n\n/** Filter signature. Receives the merged item list plus the current query; returns the filtered/reordered list. */\nexport type CommandPaletteFilterFn = (\n items: readonly CommandPaletteItem[],\n query: string,\n) => readonly CommandPaletteItem[];\n\n/** Control handle exposed inside the palette overlay (for future component-based content). */\nexport interface CommandPaletteRef {\n /** Closes the palette. */\n close(): void;\n /** Updates the search query programmatically. */\n setQuery(query: string): void;\n}\n\n/** Injection token providing a `CommandPaletteRef` to palette overlay content. */\nexport const COMMAND_PALETTE_REF = new InjectionToken<CommandPaletteRef>(\n 'COMMAND_PALETTE_REF',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n Directive,\n effect,\n type ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n type Signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { FocusTrapFactory, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport {\n COMMAND_PALETTE_REF,\n type CommandPaletteFilterFn,\n type CommandPaletteItem,\n type CommandPaletteRef,\n} from './command-palette-tokens';\n\n// ── Constants ──\n\n/** Duration of leave animation (ms) — matches scale-out/fade-out in theme/_base.css. */\nconst ANIMATION_DURATION = 120;\n\n/** Debounce window (ms) for live-region result announcements while typing. */\nconst ANNOUNCE_DEBOUNCE = 200;\n\nlet nextPaletteId = 0;\n\n// ── Types ──\n\n/** Resolved item shape used internally — merges declarative directive refs with data entries. */\ninterface ResolvedItem {\n readonly data: CommandPaletteItem;\n readonly directive?: CommandPaletteItemDirective;\n readonly template?: TemplateRef<unknown>;\n readonly shortcutKeys: readonly string[];\n}\n\n/** A rendered group in the filtered view. */\ninterface ResolvedGroup {\n readonly id: string;\n readonly label?: string;\n readonly items: readonly ResolvedItem[];\n}\n\n// ── Variant config ──\n\nconst commandPaletteVariants = tv(\n {\n slots: {\n panel:\n 'pointer-events-auto w-full max-w-xl mt-[15vh] bg-surface-overlay text-fg rounded-lg border border-border shadow-md overflow-hidden flex flex-col max-h-[70vh] outline-none',\n searchWrapper: 'flex items-center gap-3 border-b border-border px-4',\n searchInput:\n 'flex-1 bg-transparent border-0 outline-none text-fg placeholder:text-fg-subtle',\n searchIcon: 'size-5 shrink-0 text-fg-muted',\n list: 'flex-1 overflow-y-auto py-1',\n groupHeader:\n 'px-4 text-xs font-semibold uppercase tracking-wide text-fg-subtle',\n item:\n 'relative flex items-center gap-3 px-4 select-none transition-colors duration-normal motion-reduce:transition-none text-fg outline-none',\n itemBody: 'flex-1 min-w-0 flex flex-col',\n itemLabel: 'min-w-0 truncate',\n itemDescription: 'block text-xs text-fg-muted mt-0.5 min-w-0 truncate',\n itemShortcut: 'ml-auto flex items-center gap-1 pl-3 shrink-0',\n itemKbd:\n 'inline-flex items-center justify-center min-w-5 h-5 px-1 rounded-md border border-border bg-surface-muted text-fg-muted text-2xs font-mono',\n empty: 'px-4 py-10 text-center text-sm text-fg-muted',\n footer: 'border-t border-border px-4 py-2 bg-surface-muted',\n },\n variants: {\n size: {\n xs: {\n item: 'py-1 text-xs',\n searchInput: 'py-2 text-xs',\n groupHeader: 'pt-2 pb-0.5',\n },\n sm: {\n item: 'py-1.5 text-xs',\n searchInput: 'py-2.5 text-xs',\n groupHeader: 'pt-2 pb-0.5',\n },\n md: {\n item: 'py-2 text-sm',\n searchInput: 'py-3 text-sm',\n groupHeader: 'pt-3 pb-1',\n },\n lg: {\n item: 'py-2.5 text-sm',\n searchInput: 'py-3.5 text-base',\n groupHeader: 'pt-3 pb-1',\n },\n xl: {\n item: 'py-3 text-base',\n searchInput: 'py-4 text-base',\n groupHeader: 'pt-4 pb-1',\n },\n },\n // Active option uses `bg-surface-sunken` (one step recessed from `bg-surface-muted`)\n // so the activedescendant-listbox carve-out remains unambiguously distinguishable\n // from the hovered non-active state — DOM focus stays on the combobox input, so\n // this background shift is the only visual signal for the keyboard-active option.\n active: {\n true: { item: 'bg-surface-sunken' },\n false: { item: '' },\n },\n disabled: {\n true: { item: 'opacity-50 pointer-events-none cursor-default' },\n false: { item: 'cursor-pointer hover:bg-surface-muted' },\n },\n },\n compoundVariants: [\n {\n // When an item is BOTH active and enabled, drop the non-active hover token so\n // hovering the keyboard-active option doesn't visually demote it to the\n // hovered-non-active state. Without this, twMerge keeps both background classes\n // and the active sunken fill flips to muted on hover.\n active: true,\n disabled: false,\n class: { item: 'hover:bg-surface-sunken' },\n },\n ],\n defaultVariants: { size: 'md', active: false, disabled: false },\n },\n { twMerge: true },\n);\n\n// ── Helpers ──\n\nfunction normalizeShortcut(\n value: string | readonly string[] | undefined,\n): readonly string[] {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value as string];\n}\n\nfunction defaultFilter(\n items: readonly CommandPaletteItem[],\n query: string,\n): readonly CommandPaletteItem[] {\n const trimmed = query.trim().toLowerCase();\n if (!trimmed) return items;\n return items.filter((item) => {\n if (item.label.toLowerCase().includes(trimmed)) return true;\n if (item.group && item.group.toLowerCase().includes(trimmed)) return true;\n if (item.keywords) {\n for (const keyword of item.keywords) {\n if (keyword.toLowerCase().includes(trimmed)) return true;\n }\n }\n return false;\n });\n}\n\nfunction findFirstEnabled(items: readonly ResolvedItem[]): number {\n for (let i = 0; i < items.length; i++) {\n if (!items[i].data.disabled) return i;\n }\n return 0;\n}\n\nfunction findLastEnabled(items: readonly ResolvedItem[]): number {\n for (let i = items.length - 1; i >= 0; i--) {\n if (!items[i].data.disabled) return i;\n }\n return items.length - 1;\n}\n\n// ── Group directive ──\n\n/** Optional explicit grouping wrapper. Items placed inside inherit its label. */\n@Directive({\n selector: '[twCommandPaletteGroup]',\n})\nexport class CommandPaletteGroupDirective {\n /** Group heading text shown above the items. Required. */\n readonly label = input.required<string>();\n}\n\n// ── Item directive (component with projection) ──\n\n/** A declarative palette item. Consumers project its rendered content as children. */\n@Component({\n selector: 'tw-command-palette-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n style: 'display: none',\n },\n template: `<ng-template #content><ng-content /></ng-template>`,\n})\nexport class CommandPaletteItemDirective {\n /** Stable identifier for the item. Used as DOM id and in selection payloads. Required. */\n readonly id = input.required<string>();\n\n /** Plain-text label used for filtering and default rendering. Defaults to `''`. */\n readonly label = input<string>('');\n\n /** Additional search keywords that match the query but are not rendered. Defaults to `[]`. */\n readonly keywords = input<readonly string[]>([]);\n\n /** Explicit group name. Overrides any enclosing `twCommandPaletteGroup`. Defaults to `undefined`. */\n readonly group = input<string | undefined>(undefined);\n\n /** Whether the item is disabled. Disabled items render but cannot be activated. Defaults to `false`. */\n readonly disabled = input<boolean>(false);\n\n /** Keyboard shortcut hint. A string renders as one kbd; an array renders each key separately. Defaults to `undefined`. */\n readonly shortcut = input<string | readonly string[] | undefined>(undefined);\n\n /** Secondary description text rendered under the label. Defaults to `''`. */\n readonly description = input<string>('');\n\n /** Callback run before `activated` emits. Defaults to `undefined`. */\n readonly run = input<(() => void) | undefined>(undefined);\n\n /** Fires when this specific item is activated (Enter or click). */\n readonly activated = output<void>();\n\n /** Projected template used by the palette overlay to render this item's content. */\n readonly contentTemplate = viewChild<TemplateRef<unknown>>('content');\n\n private readonly parentGroup = inject(CommandPaletteGroupDirective, {\n optional: true,\n skipSelf: true,\n });\n\n /** Resolved CommandPaletteItem data derived from inputs + parent group. */\n readonly data: Signal<CommandPaletteItem> = computed(() => ({\n id: this.id(),\n label: this.label(),\n keywords: this.keywords(),\n group: this.group() ?? this.parentGroup?.label() ?? undefined,\n disabled: this.disabled(),\n shortcut: this.shortcut(),\n description: this.description() || undefined,\n run: this.run(),\n }));\n}\n\n// ── Item decoration directives ──\n\n/** Styles a leading icon inside a palette item. */\n@Directive({\n selector: '[twCommandPaletteItemIcon]',\n host: {\n class: 'size-4 shrink-0 text-fg-muted',\n },\n})\nexport class CommandPaletteItemIconDirective {}\n\n/** Styles secondary description text inside a palette item. */\n@Directive({\n selector: '[twCommandPaletteItemDescription]',\n host: {\n class: 'block text-xs text-fg-muted mt-0.5 min-w-0 truncate',\n },\n})\nexport class CommandPaletteItemDescriptionDirective {}\n\n// ── Template directives ──\n\n/** Structural directive — consumer template rendered when no items match the query. */\n@Directive({\n selector: '[twCommandPaletteEmpty]',\n})\nexport class CommandPaletteEmptyDirective {\n readonly template = inject(TemplateRef<{ $implicit: string }>);\n}\n\n/** Structural directive — consumer template rendered as a sticky footer inside the palette. */\n@Directive({\n selector: '[twCommandPaletteFooter]',\n})\nexport class CommandPaletteFooterDirective {\n readonly template = inject(TemplateRef<void>);\n}\n\n// ── Overlay component (private, not exported) ──\n\n@Component({\n selector: 'tw-command-palette-overlay',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n class:\n 'fixed inset-0 flex items-start justify-center p-4 pointer-events-none origin-top',\n '[attr.data-command-palette-overlay]': '\"\"',\n '[animate.enter]': '\"scale-in\"',\n '[animate.leave]': '\"scale-out\"',\n },\n templateUrl: './command-palette-overlay.html',\n})\nclass CommandPaletteOverlayComponent {\n /** Host palette instance — provided via the content injector on attach. */\n readonly palette = inject(CommandPaletteComponent);\n\n readonly listId = `tw-command-palette-list-${nextPaletteId++}`;\n\n readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n private readonly variantResult = computed(() =>\n commandPaletteVariants({ size: this.palette.size() }),\n );\n\n protected readonly panelClasses = computed(() => {\n const base = this.variantResult().panel();\n const custom = this.palette.panelClassResolved();\n return custom ? `${base} ${custom}` : base;\n });\n protected readonly searchWrapperClasses = computed(() =>\n this.variantResult().searchWrapper(),\n );\n protected readonly searchInputClasses = computed(() =>\n this.variantResult().searchInput(),\n );\n protected readonly searchIconClasses = computed(() =>\n this.variantResult().searchIcon(),\n );\n protected readonly listClasses = computed(() => this.variantResult().list());\n protected readonly groupHeaderClasses = computed(() =>\n this.variantResult().groupHeader(),\n );\n protected readonly itemBodyClasses = computed(() =>\n this.variantResult().itemBody(),\n );\n protected readonly itemLabelClasses = computed(() =>\n this.variantResult().itemLabel(),\n );\n protected readonly itemDescriptionClasses = computed(() =>\n this.variantResult().itemDescription(),\n );\n protected readonly itemShortcutClasses = computed(() =>\n this.variantResult().itemShortcut(),\n );\n protected readonly itemKbdClasses = computed(() =>\n this.variantResult().itemKbd(),\n );\n protected readonly emptyClasses = computed(() => this.variantResult().empty());\n protected readonly footerClasses = computed(() => this.variantResult().footer());\n\n protected itemClasses(active: boolean, disabled: boolean): string {\n return commandPaletteVariants({\n size: this.palette.size(),\n active,\n disabled,\n }).item();\n }\n\n protected onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.palette.query.set(value);\n }\n\n protected onItemClick(item: ResolvedItem): void {\n this.palette.selectItem(item);\n }\n\n protected onItemHover(item: ResolvedItem): void {\n this.palette.setActiveItem(item);\n }\n\n /** Focuses the search input (called by the palette after attach). */\n focusSearch(): void {\n this.searchInputRef()?.nativeElement.focus();\n }\n}\n\n// ── Public palette component ──\n\n@Component({\n selector: 'tw-command-palette',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n style: 'display: none',\n },\n template: `<ng-content />`,\n})\nexport class CommandPaletteComponent {\n /** Controls item density and padding across the palette. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Placeholder text shown inside the search input. Defaults to `'Type a command or search…'`. */\n readonly placeholder = input<string>('Type a command or search…');\n\n /** Two-way bindable search query. Reads or resets the current filter. Defaults to `''`. */\n readonly query = model<string>('');\n\n /** Two-way bindable open state. Setting to `true` opens the palette; closing updates it to `false`. Defaults to `false`. */\n readonly open = model<boolean>(false);\n\n /** Data-driven command list. Merged with projected items and filtered by `query`. Defaults to `[]`. */\n readonly commands = input<readonly CommandPaletteItem[]>([]);\n\n /** Custom filter function. Receives the merged item list and current query, returns the filtered result. Defaults to `undefined` (case-insensitive substring match). */\n readonly filterFn = input<CommandPaletteFilterFn | undefined>(undefined);\n\n /** Whether the palette closes automatically after an item is activated. Defaults to `true` — a command palette is a fire-and-dismiss surface; the special case is a \"run many\" launcher that opts out. */\n readonly closeOnSelect = input<boolean>(true);\n\n /** Whether Escape closes the palette. Defaults to `true` — Escape is the universal dismiss key for modal surfaces; the special case is a non-dismissible palette. */\n readonly closeOnEscape = input<boolean>(true);\n\n /** Whether clicking the backdrop closes the palette. Defaults to `true` — clicking outside a modal is the expected dismiss gesture; the special case is enforcing an explicit choice. */\n readonly closeOnBackdropClick = input<boolean>(true);\n\n /** Whether the search input is auto-focused when the palette opens. Defaults to `true` — without auto-focus the user must click into the input before typing, defeating the keyboard-first design. */\n readonly autoFocus = input<boolean>(true);\n\n /** Accessible label used for the dialog role. Defaults to `'Command palette'`. */\n readonly ariaLabel = input<string>('Command palette');\n\n /** Accessible label applied to the search input (`role=\"combobox\"`). Defaults to `'Search commands'`. */\n readonly searchAriaLabel = input<string>('Search commands');\n\n /** Additional classes appended to the overlay panel for consumer customization. Defaults to `''`. */\n readonly panelClass = input<string | string[]>('');\n\n /** Fires when a command is activated (via click or Enter). Payload is the resolved `CommandPaletteItem`. */\n readonly itemSelected = output<CommandPaletteItem>();\n\n /** Fires after the palette becomes fully visible. */\n readonly opened = output<void>();\n\n /** Fires after the palette is fully removed from the DOM. */\n readonly closed = output<void>();\n\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private readonly announcer = inject(LiveAnnouncer);\n\n private readonly declarativeItems = contentChildren(CommandPaletteItemDirective, {\n descendants: true,\n });\n private readonly emptyDirective = contentChild(CommandPaletteEmptyDirective);\n private readonly footerDirective = contentChild(CommandPaletteFooterDirective);\n\n private overlayRef: OverlayRef | null = null;\n private overlayInstance: CommandPaletteOverlayComponent | null = null;\n private focusTrap: ReturnType<FocusTrapFactory['create']> | null = null;\n private perOpenSubs: Subscription | null = null;\n private previousFocus: HTMLElement | null = null;\n private closing = false;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private announceTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly isAttached = signal(false);\n\n /** Merged (declarative + data-array) items keyed by id — declarative wins on collision. */\n private readonly allItems = computed<readonly ResolvedItem[]>(() => {\n const declarative = this.declarativeItems();\n const declarativeResolved: ResolvedItem[] = declarative.map((dir) => ({\n data: dir.data(),\n directive: dir,\n template: dir.contentTemplate(),\n shortcutKeys: normalizeShortcut(dir.shortcut()),\n }));\n const seenIds = new Set<string>(declarativeResolved.map((it) => it.data.id));\n\n const arrayItems = this.commands();\n const arrayResolved: ResolvedItem[] = [];\n for (const data of arrayItems) {\n if (seenIds.has(data.id)) continue;\n seenIds.add(data.id);\n arrayResolved.push({\n data,\n shortcutKeys: normalizeShortcut(data.shortcut),\n });\n }\n return [...declarativeResolved, ...arrayResolved];\n });\n\n /** Items after applying the filter function. */\n readonly filteredItems = computed<readonly ResolvedItem[]>(() => {\n const all = this.allItems();\n const q = this.query();\n const dataList = all.map((r) => r.data);\n const fn = this.filterFn();\n const filtered = fn ? fn(dataList, q) : defaultFilter(dataList, q);\n const byId = new Map<string, ResolvedItem>();\n for (const r of all) byId.set(r.data.id, r);\n const result: ResolvedItem[] = [];\n for (const data of filtered) {\n const resolved = byId.get(data.id);\n if (resolved) result.push(resolved);\n }\n return result;\n });\n\n /** Filtered items grouped by their `group` field. */\n readonly grouped = computed<readonly ResolvedGroup[]>(() => {\n const items = this.filteredItems();\n const groups: { id: string; label?: string; items: ResolvedItem[] }[] = [];\n const byKey = new Map<string, { id: string; label?: string; items: ResolvedItem[] }>();\n for (const item of items) {\n const label = item.data.group;\n const key = label ?? '__ungrouped__';\n let g = byKey.get(key);\n if (!g) {\n g = { id: `group-${key}`, label, items: [] };\n byKey.set(key, g);\n groups.push(g);\n }\n g.items.push(item);\n }\n return groups;\n });\n\n /**\n * Active item index, auto-resets to the first enabled item when the filtered\n * *id set* changes. Keyed off the id sequence (not the array reference) so a\n * re-emission of `filteredItems` with identical ids preserves the user's\n * keyboard selection; only when ids actually shift do we recompute. When the\n * previously-active id is still present in the new sequence its index is\n * carried over; otherwise we fall back to the first enabled item.\n */\n readonly activeIndex = linkedSignal<readonly string[], number>({\n source: () => this.filteredItems().map((i) => i.data.id),\n computation: (ids, previous) => {\n const items = this.filteredItems();\n if (!previous) return findFirstEnabled(items);\n const prevId = previous.source[previous.value];\n if (prevId) {\n const carriedIndex = ids.indexOf(prevId);\n if (carriedIndex >= 0) return carriedIndex;\n }\n return findFirstEnabled(items);\n },\n });\n\n /** Id of the currently active item (for `aria-activedescendant`). */\n readonly activeItemId = computed<string | null>(() => {\n const idx = this.activeIndex();\n const items = this.filteredItems();\n return items[idx]?.data.id ?? null;\n });\n\n /** Template-ref of the projected empty state (if any). */\n readonly emptyTemplate = computed<TemplateRef<{ $implicit: string }> | null>(\n () => this.emptyDirective()?.template ?? null,\n );\n\n /** Template-ref of the projected footer (if any). */\n readonly footerTemplate = computed<TemplateRef<void> | null>(\n () => this.footerDirective()?.template ?? null,\n );\n\n /** Resolved panel-class string (array merged into a single string). */\n readonly panelClassResolved = computed<string>(() => {\n const raw = this.panelClass();\n return Array.isArray(raw) ? raw.join(' ') : raw;\n });\n\n constructor() {\n // React to model changes from the consumer\n effect(() => {\n const shouldOpen = this.open();\n if (shouldOpen && this.closing && this.overlayInstance) {\n // Reopened before the leave animation finished — cancel the pending\n // close rather than letting its deferred callback write `false` back\n // over the consumer's `true`. Same shape as `popover.ts`.\n this.cancelPendingClose();\n return;\n }\n if (shouldOpen && !this.overlayInstance && !this.closing) {\n this.openPalette();\n } else if (!shouldOpen && this.overlayInstance && !this.closing) {\n this.closePalette();\n }\n });\n\n // Debounced live-region announcements while the palette is open\n effect(() => {\n const q = this.query();\n const count = this.filteredItems().length;\n untracked(() => {\n if (!this.isAttached()) return;\n this.clearAnnounceTimer();\n this.announceTimer = setTimeout(() => {\n const message =\n count === 0\n ? `No commands match ${q}`\n : `${count} ${count === 1 ? 'result' : 'results'} for ${q}`;\n this.announcer.announce(message, 'polite');\n }, ANNOUNCE_DEBOUNCE);\n });\n });\n\n this.destroyRef.onDestroy(() => {\n this.clearCloseTimer();\n this.clearAnnounceTimer();\n this.destroyFocusTrap();\n this.perOpenSubs?.unsubscribe();\n this.disposeOverlay();\n });\n }\n\n // ── Public API ──\n\n /** Open the palette programmatically. */\n show(): void {\n if (this.overlayInstance || this.closing) return;\n this.open.set(true);\n }\n\n /** Close the palette programmatically. */\n hide(): void {\n if (!this.overlayInstance || this.closing) return;\n this.closePalette();\n }\n\n /** Toggle the current open state. */\n toggle(): void {\n if (this.overlayInstance || this.closing) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /** Force the palette to reapply focus to the search input. */\n focusSearch(): void {\n this.overlayInstance?.focusSearch();\n }\n\n // ── Internal wiring (used by overlay) ──\n\n /** Activate an item: run callbacks, emit events, optionally close. */\n selectItem(item: ResolvedItem): void {\n if (item.data.disabled) return;\n item.data.run?.();\n item.directive?.activated.emit();\n this.itemSelected.emit(item.data);\n if (this.closeOnSelect()) this.hide();\n }\n\n /** Move the active descendant to the given item (used on hover). */\n setActiveItem(item: ResolvedItem): void {\n if (item.data.disabled) return;\n const idx = this.filteredItems().indexOf(item);\n if (idx >= 0) this.activeIndex.set(idx);\n }\n\n // ── Private ──\n\n private openPalette(): void {\n this.previousFocus =\n (document.activeElement as HTMLElement | null) ?? null;\n this.ensureOverlay();\n this.attachContent();\n this.subscribePerOpen();\n this.isAttached.set(true);\n this.setupFocusTrap();\n if (this.autoFocus()) {\n queueMicrotask(() => this.overlayInstance?.focusSearch());\n }\n this.announcer.announce(\n `Command palette opened. ${this.filteredItems().length} commands available.`,\n 'polite',\n );\n this.opened.emit();\n }\n\n private closePalette(): void {\n if (this.closing) return;\n this.closing = true;\n\n this.destroyFocusTrap();\n\n this.previousFocus?.focus();\n this.previousFocus = null;\n\n this.closeTimer = setTimeout(() => {\n this.closeTimer = null;\n\n // Guard against teardown during the animation window. `destroyRef.onDestroy`\n // calls `clearCloseTimer()` so this branch only fires when the timer survived;\n // even so, `isAttached` is the authoritative signal — if the overlay already\n // detached (programmatic disposeOverlay, double-close race), skip writes that\n // would touch a destroyed instance or re-emit `open=false`.\n if (!this.isAttached()) {\n this.closing = false;\n return;\n }\n\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n }\n\n this.perOpenSubs?.unsubscribe();\n this.perOpenSubs = null;\n this.overlayInstance = null;\n this.isAttached.set(false);\n\n untracked(() => this.open.set(false));\n\n this.closed.emit();\n this.closing = false;\n }, ANIMATION_DURATION);\n }\n\n private ensureOverlay(): void {\n if (this.overlayRef) return;\n const positionStrategy = this.overlay.position().global();\n const scrollStrategy = this.overlay.scrollStrategies.block();\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy,\n hasBackdrop: true,\n backdropClass: 'tw-dialog-backdrop',\n panelClass: 'tw-command-palette-panel',\n });\n }\n\n private attachContent(): void {\n if (!this.overlayRef) return;\n const paletteRef: CommandPaletteRef = {\n close: () => this.hide(),\n setQuery: (q) => this.query.set(q),\n };\n const contentInjector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: CommandPaletteComponent, useValue: this },\n { provide: COMMAND_PALETTE_REF, useValue: paletteRef },\n ],\n });\n const portal = new ComponentPortal(\n CommandPaletteOverlayComponent,\n this.viewContainerRef,\n contentInjector,\n );\n const ref = this.overlayRef.attach(portal);\n this.overlayInstance = ref.instance;\n }\n\n private subscribePerOpen(): void {\n this.perOpenSubs?.unsubscribe();\n this.perOpenSubs = new Subscription();\n\n this.perOpenSubs.add(\n this.overlayRef!.backdropClick().subscribe(() => {\n if (this.closeOnBackdropClick()) this.hide();\n }),\n );\n\n this.perOpenSubs.add(\n this.overlayRef!.keydownEvents().subscribe((event) =>\n this.handleOverlayKeydown(event),\n ),\n );\n }\n\n private handleOverlayKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n if (this.closeOnEscape()) {\n event.preventDefault();\n this.hide();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(findFirstEnabled(this.filteredItems()));\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(findLastEnabled(this.filteredItems()));\n break;\n case 'Enter':\n event.preventDefault();\n this.activateActive();\n break;\n // Tab is intentionally NOT handled here — the FocusTrap installed in\n // `setupFocusTrap()` cycles focus through the modal's focusable elements,\n // so the user cannot accidentally tab out of the palette. Closing on Tab\n // (the previous behaviour) ran counter to the universal \"Tab moves focus\n // within a modal\" convention and surprised keyboard users.\n }\n }\n\n private moveActive(delta: 1 | -1): void {\n const items = this.filteredItems();\n if (items.length === 0) return;\n const n = items.length;\n let idx = this.activeIndex();\n for (let i = 0; i < n; i++) {\n idx = (idx + delta + n) % n;\n if (!items[idx].data.disabled) {\n this.activeIndex.set(idx);\n return;\n }\n }\n }\n\n private activateActive(): void {\n const items = this.filteredItems();\n const item = items[this.activeIndex()];\n if (item && !item.data.disabled) this.selectItem(item);\n }\n\n private setupFocusTrap(): void {\n if (!this.overlayRef) return;\n this.focusTrap = this.focusTrapFactory.create(this.overlayRef.overlayElement);\n }\n\n private destroyFocusTrap(): void {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n }\n\n private disposeOverlay(): void {\n this.overlayRef?.dispose();\n this.overlayRef = null;\n this.overlayInstance = null;\n }\n\n /**\n * Aborts an in-flight close, leaving the palette open.\n *\n * The overlay is still attached (only the detach is deferred), so this\n * restores the focus trap that `closePalette` tore down up front.\n */\n private cancelPendingClose(): void {\n this.clearCloseTimer();\n this.closing = false;\n this.setupFocusTrap();\n }\n\n private clearCloseTimer(): void {\n if (this.closeTimer !== null) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private clearAnnounceTimer(): void {\n if (this.announceTimer !== null) {\n clearTimeout(this.announceTimer);\n this.announceTimer = null;\n }\n }\n}\n","<div [class]=\"panelClasses()\" role=\"dialog\" [attr.aria-modal]=\"'true'\" [attr.aria-label]=\"palette.ariaLabel()\">\n <div [class]=\"searchWrapperClasses()\">\n <svg [class]=\"searchIconClasses()\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z\" clip-rule=\"evenodd\" />\n </svg>\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n [class]=\"searchInputClasses()\"\n [placeholder]=\"palette.placeholder()\"\n [value]=\"palette.query()\"\n (input)=\"onSearchInput($event)\"\n [attr.aria-label]=\"palette.searchAriaLabel()\"\n [attr.aria-expanded]=\"'true'\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"palette.activeItemId()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n <div [class]=\"listClasses()\" role=\"listbox\" [id]=\"listId\">\n @if (palette.grouped().length === 0) {\n @if (palette.emptyTemplate(); as emptyTpl) {\n <div [class]=\"emptyClasses()\">\n <ng-container [ngTemplateOutlet]=\"emptyTpl\" [ngTemplateOutletContext]=\"{ $implicit: palette.query() }\" />\n </div>\n } @else {\n <div [class]=\"emptyClasses()\">No results found</div>\n }\n } @else {\n @for (group of palette.grouped(); track group.id) {\n <div role=\"group\" [attr.aria-label]=\"group.label ?? null\">\n @if (group.label) {\n <div [class]=\"groupHeaderClasses()\" role=\"presentation\">{{ group.label }}</div>\n }\n @for (item of group.items; track item.data.id) {\n <!-- ARIA activedescendant listbox: navigation lives on the search\n input above; option elements never receive DOM focus and have\n no keyboard handlers of their own. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [id]=\"item.data.id\"\n role=\"option\"\n [class]=\"itemClasses(item.data.id === palette.activeItemId(), item.data.disabled ?? false)\"\n [attr.aria-selected]=\"item.data.id === palette.activeItemId()\"\n [attr.aria-disabled]=\"(item.data.disabled ?? false) ? 'true' : null\"\n (click)=\"onItemClick(item)\"\n (mousemove)=\"onItemHover(item)\"\n >\n <span [class]=\"itemBodyClasses()\">\n @if (item.template; as tpl) {\n <span [class]=\"itemLabelClasses()\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </span>\n } @else {\n <span [class]=\"itemLabelClasses()\">{{ item.data.label }}</span>\n }\n @if (item.data.description) {\n <span [class]=\"itemDescriptionClasses()\">{{ item.data.description }}</span>\n }\n </span>\n @if (item.shortcutKeys.length > 0) {\n <span [class]=\"itemShortcutClasses()\" aria-hidden=\"true\">\n @for (key of item.shortcutKeys; track $index) {\n <kbd [class]=\"itemKbdClasses()\">{{ key }}</kbd>\n }\n </span>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n @if (palette.footerTemplate(); as footerTpl) {\n <div [class]=\"footerClasses()\">\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-command-palette.mjs","sources":["../../../projects/ngx-tw/command-palette/command-palette-tokens.ts","../../../projects/ngx-tw/command-palette/command-palette.ts","../../../projects/ngx-tw/command-palette/command-palette-overlay.html","../../../projects/ngx-tw/command-palette/cdevhub-ngx-tw-command-palette.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/** A single command palette entry. */\nexport interface CommandPaletteItem {\n /** Stable identifier used as the DOM id and for selection payloads. */\n id: string;\n /** Visible label used for rendering and default filtering. */\n label: string;\n /** Additional search keywords that match the query but are not rendered. */\n keywords?: readonly string[];\n /** Group header name. Items sharing a group render under one section. */\n group?: string;\n /** Disabled items render but cannot be activated. */\n disabled?: boolean;\n /** Shortcut hint to render on the right edge. */\n shortcut?: string | readonly string[];\n /** Secondary description text rendered under the label. */\n description?: string;\n /** Optional icon name (consumers decide how to render). */\n icon?: string;\n /** Activation callback invoked before `itemSelected` is emitted. */\n run?: () => void;\n}\n\n/** Filter signature. Receives the merged item list plus the current query; returns the filtered/reordered list. */\nexport type CommandPaletteFilterFn = (\n items: readonly CommandPaletteItem[],\n query: string,\n) => readonly CommandPaletteItem[];\n\n/** Control handle exposed inside the palette overlay (for future component-based content). */\nexport interface CommandPaletteRef {\n /** Closes the palette. */\n close(): void;\n /** Updates the search query programmatically. */\n setQuery(query: string): void;\n}\n\n/** Injection token providing a `CommandPaletteRef` to palette overlay content. */\nexport const TW_COMMAND_PALETTE_REF = new InjectionToken<CommandPaletteRef>(\n 'TW_COMMAND_PALETTE_REF',\n);\n\n/**\n * @deprecated Renamed to {@link TW_COMMAND_PALETTE_REF} for consistency with\n * every other ngx-tw injection token. This is the *same token instance*, not a\n * copy — providing under either name and injecting under the other resolves —\n * so the rename is safe to adopt incrementally. Removed in the next major.\n */\nexport const COMMAND_PALETTE_REF = TW_COMMAND_PALETTE_REF;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n Directive,\n effect,\n type ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n PLATFORM_ID,\n ViewContainerRef,\n type Signal,\n} from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { FocusTrapFactory, LiveAnnouncer } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport {\n TW_COMMAND_PALETTE_REF,\n type CommandPaletteFilterFn,\n type CommandPaletteItem,\n type CommandPaletteRef,\n} from './command-palette-tokens';\n\n// ── Constants ──\n\n/** Duration of leave animation (ms) — matches scale-out/fade-out in theme/_base.css. */\nconst ANIMATION_DURATION = 120;\n\n/** Debounce window (ms) for live-region result announcements while typing. */\nconst ANNOUNCE_DEBOUNCE = 200;\n\nlet nextPaletteId = 0;\n\n// ── Types ──\n\n/**\n * One entry of the palette's resolved item list — the merge of a declarative\n * `*twCommandPaletteItem` directive with a `commands` array entry.\n *\n * Public because it is the element type of {@link CommandPaletteComponent.filteredItems}\n * and the parameter type of `selectItem()` / `setActiveItem()`. Re-exported\n * from the entry point as `CommandPaletteResolvedItem`.\n */\nexport interface ResolvedItem {\n /** The underlying item data, whether declared inline or supplied via `commands`. */\n readonly data: CommandPaletteItem;\n /** The declarative directive backing this item, when it came from a template. */\n readonly directive?: CommandPaletteItemDirective;\n /** The custom row template to render instead of the default row, when one was supplied. */\n readonly template?: TemplateRef<unknown>;\n /** The item's shortcut, normalised to a key list. Empty when the item declares none. */\n readonly shortcutKeys: readonly string[];\n}\n\n/**\n * A rendered group in the filtered view.\n *\n * Public because it is the element type of {@link CommandPaletteComponent.grouped}.\n * Re-exported from the entry point as `CommandPaletteResolvedGroup`.\n */\nexport interface ResolvedGroup {\n /** Stable DOM id for the group's section element. */\n readonly id: string;\n /** The group header text, or `undefined` for the implicit ungrouped bucket. */\n readonly label?: string;\n /** The group's items, in filtered order. */\n readonly items: readonly ResolvedItem[];\n}\n\n// ── Variant config ──\n\nconst commandPaletteVariants = tv(\n {\n slots: {\n panel:\n 'pointer-events-auto w-full max-w-xl mt-[15vh] bg-surface-overlay text-fg rounded-lg border border-border shadow-md overflow-hidden flex flex-col max-h-[70vh] outline-none',\n searchWrapper: 'flex items-center gap-3 border-b border-border px-4',\n searchInput:\n 'flex-1 bg-transparent border-0 outline-none text-fg placeholder:text-fg-subtle',\n searchIcon: 'size-5 shrink-0 text-fg-muted',\n list: 'flex-1 overflow-y-auto py-1',\n groupHeader:\n 'px-4 text-xs font-semibold uppercase tracking-wide text-fg-subtle',\n item:\n 'relative flex items-center gap-3 px-4 select-none transition-colors duration-normal motion-reduce:transition-none text-fg outline-none',\n itemBody: 'flex-1 min-w-0 flex flex-col',\n itemLabel: 'min-w-0 truncate',\n itemDescription: 'block text-xs text-fg-muted mt-0.5 min-w-0 truncate',\n itemShortcut: 'ml-auto flex items-center gap-1 pl-3 shrink-0',\n itemKbd:\n 'inline-flex items-center justify-center min-w-5 h-5 px-1 rounded-md border border-border bg-surface-muted text-fg-muted text-2xs font-mono',\n empty: 'px-4 py-10 text-center text-sm text-fg-muted',\n footer: 'border-t border-border px-4 py-2 bg-surface-muted',\n },\n variants: {\n // The search input's `py-*` runs one full step above the item rows\n // (8/10/12/14/16px vs 4/6/8/10/12px) — it is the palette's primary\n // control, not a list row. `lg`'s `py-3.5` is the half-step that keeps\n // that ramp monotonic: `py-3` collides with `md` and `py-4` with `xl`,\n // either of which collapses `lg` into a neighbouring density and leaves\n // the five-step size axis with only four distinct search-field heights.\n size: {\n xs: {\n item: 'py-1 text-xs',\n searchInput: 'py-2 text-xs',\n groupHeader: 'pt-2 pb-0.5',\n },\n sm: {\n item: 'py-1.5 text-xs',\n searchInput: 'py-2.5 text-xs',\n groupHeader: 'pt-2 pb-0.5',\n },\n md: {\n item: 'py-2 text-sm',\n searchInput: 'py-3 text-sm',\n groupHeader: 'pt-3 pb-1',\n },\n lg: {\n item: 'py-2.5 text-sm',\n searchInput: 'py-3.5 text-base',\n groupHeader: 'pt-3 pb-1',\n },\n xl: {\n item: 'py-3 text-base',\n searchInput: 'py-4 text-base',\n groupHeader: 'pt-4 pb-1',\n },\n },\n // Active option uses `bg-surface-sunken` (one step recessed from `bg-surface-muted`)\n // so the activedescendant-listbox carve-out remains unambiguously distinguishable\n // from the hovered non-active state — DOM focus stays on the combobox input, so\n // this background shift is the only visual signal for the keyboard-active option.\n active: {\n true: { item: 'bg-surface-sunken' },\n false: { item: '' },\n },\n disabled: {\n true: { item: 'opacity-50 pointer-events-none cursor-default' },\n false: { item: 'cursor-pointer hover:bg-surface-muted' },\n },\n },\n compoundVariants: [\n {\n // When an item is BOTH active and enabled, drop the non-active hover token so\n // hovering the keyboard-active option doesn't visually demote it to the\n // hovered-non-active state. Without this, twMerge keeps both background classes\n // and the active sunken fill flips to muted on hover.\n active: true,\n disabled: false,\n class: { item: 'hover:bg-surface-sunken' },\n },\n ],\n defaultVariants: { size: 'md', active: false, disabled: false },\n },\n { twMerge: true },\n);\n\n// ── Helpers ──\n\nfunction normalizeShortcut(\n value: string | readonly string[] | undefined,\n): readonly string[] {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value as string];\n}\n\nfunction defaultFilter(\n items: readonly CommandPaletteItem[],\n query: string,\n): readonly CommandPaletteItem[] {\n const trimmed = query.trim().toLowerCase();\n if (!trimmed) return items;\n return items.filter((item) => {\n if (item.label.toLowerCase().includes(trimmed)) return true;\n if (item.group && item.group.toLowerCase().includes(trimmed)) return true;\n if (item.keywords) {\n for (const keyword of item.keywords) {\n if (keyword.toLowerCase().includes(trimmed)) return true;\n }\n }\n return false;\n });\n}\n\nfunction findFirstEnabled(items: readonly ResolvedItem[]): number {\n for (let i = 0; i < items.length; i++) {\n if (!items[i].data.disabled) return i;\n }\n return 0;\n}\n\nfunction findLastEnabled(items: readonly ResolvedItem[]): number {\n for (let i = items.length - 1; i >= 0; i--) {\n if (!items[i].data.disabled) return i;\n }\n return items.length - 1;\n}\n\n// ── Group directive ──\n\n/** Optional explicit grouping wrapper. Items placed inside inherit its label. */\n@Directive({\n selector: '[twCommandPaletteGroup]',\n})\nexport class CommandPaletteGroupDirective {\n /** Group heading text shown above the items. Required. */\n readonly label = input.required<string>();\n}\n\n// ── Item directive (component with projection) ──\n\n/** A declarative palette item. Consumers project its rendered content as children. */\n@Component({\n selector: 'tw-command-palette-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n style: 'display: none',\n },\n template: `<ng-template #content><ng-content /></ng-template>`,\n})\nexport class CommandPaletteItemDirective {\n /** Stable identifier for the item. Used as DOM id and in selection payloads. Required. */\n readonly id = input.required<string>();\n\n /** Plain-text label used for filtering and default rendering. Defaults to `''`. */\n readonly label = input<string>('');\n\n /** Additional search keywords that match the query but are not rendered. Defaults to `[]`. */\n readonly keywords = input<readonly string[]>([]);\n\n /** Explicit group name. Overrides any enclosing `twCommandPaletteGroup`. Defaults to `undefined`. */\n readonly group = input<string | undefined>(undefined);\n\n /** Whether the item is disabled. Disabled items render but cannot be activated. Defaults to `false`. */\n readonly disabled = input<boolean>(false);\n\n /** Keyboard shortcut hint. A string renders as one kbd; an array renders each key separately. Defaults to `undefined`. */\n readonly shortcut = input<string | readonly string[] | undefined>(undefined);\n\n /** Secondary description text rendered under the label. Defaults to `''`. */\n readonly description = input<string>('');\n\n /** Callback run before `activated` emits. Defaults to `undefined`. */\n readonly run = input<(() => void) | undefined>(undefined);\n\n /** Fires when this specific item is activated (Enter or click). */\n readonly activated = output<void>();\n\n /** Projected template used by the palette overlay to render this item's content. */\n readonly contentTemplate = viewChild<TemplateRef<unknown>>('content');\n\n private readonly parentGroup = inject(CommandPaletteGroupDirective, {\n optional: true,\n skipSelf: true,\n });\n\n /** Resolved CommandPaletteItem data derived from inputs + parent group. */\n readonly data: Signal<CommandPaletteItem> = computed(() => ({\n id: this.id(),\n label: this.label(),\n keywords: this.keywords(),\n group: this.group() ?? this.parentGroup?.label() ?? undefined,\n disabled: this.disabled(),\n shortcut: this.shortcut(),\n description: this.description() || undefined,\n run: this.run(),\n }));\n}\n\n// ── Item decoration directives ──\n\n/** Styles a leading icon inside a palette item. */\n@Directive({\n selector: '[twCommandPaletteItemIcon]',\n host: {\n class: 'size-4 shrink-0 text-fg-muted',\n },\n})\nexport class CommandPaletteItemIconDirective {}\n\n/** Styles secondary description text inside a palette item. */\n@Directive({\n selector: '[twCommandPaletteItemDescription]',\n host: {\n class: 'block text-xs text-fg-muted mt-0.5 min-w-0 truncate',\n },\n})\nexport class CommandPaletteItemDescriptionDirective {}\n\n// ── Template directives ──\n\n/** Structural directive — consumer template rendered when no items match the query. */\n@Directive({\n selector: '[twCommandPaletteEmpty]',\n})\nexport class CommandPaletteEmptyDirective {\n readonly template = inject(TemplateRef<{ $implicit: string }>);\n}\n\n/** Structural directive — consumer template rendered as a sticky footer inside the palette. */\n@Directive({\n selector: '[twCommandPaletteFooter]',\n})\nexport class CommandPaletteFooterDirective {\n readonly template = inject(TemplateRef<void>);\n}\n\n// ── Overlay component (private, not exported) ──\n\n@Component({\n selector: 'tw-command-palette-overlay',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n class:\n 'fixed inset-0 flex items-start justify-center p-4 pointer-events-none origin-top',\n '[attr.data-command-palette-overlay]': '\"\"',\n '[animate.enter]': '\"scale-in\"',\n '[animate.leave]': '\"scale-out\"',\n },\n templateUrl: './command-palette-overlay.html',\n})\nclass CommandPaletteOverlayComponent {\n /** Host palette instance — provided via the content injector on attach. */\n readonly palette = inject(CommandPaletteComponent);\n\n readonly listId = `tw-command-palette-list-${nextPaletteId++}`;\n\n readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n private readonly variantResult = computed(() =>\n commandPaletteVariants({ size: this.palette.size() }),\n );\n\n protected readonly panelClasses = computed(() => {\n const base = this.variantResult().panel();\n const custom = this.palette.panelClassResolved();\n return custom ? `${base} ${custom}` : base;\n });\n protected readonly searchWrapperClasses = computed(() =>\n this.variantResult().searchWrapper(),\n );\n protected readonly searchInputClasses = computed(() =>\n this.variantResult().searchInput(),\n );\n protected readonly searchIconClasses = computed(() =>\n this.variantResult().searchIcon(),\n );\n protected readonly listClasses = computed(() => this.variantResult().list());\n protected readonly groupHeaderClasses = computed(() =>\n this.variantResult().groupHeader(),\n );\n protected readonly itemBodyClasses = computed(() =>\n this.variantResult().itemBody(),\n );\n protected readonly itemLabelClasses = computed(() =>\n this.variantResult().itemLabel(),\n );\n protected readonly itemDescriptionClasses = computed(() =>\n this.variantResult().itemDescription(),\n );\n protected readonly itemShortcutClasses = computed(() =>\n this.variantResult().itemShortcut(),\n );\n protected readonly itemKbdClasses = computed(() =>\n this.variantResult().itemKbd(),\n );\n protected readonly emptyClasses = computed(() => this.variantResult().empty());\n protected readonly footerClasses = computed(() => this.variantResult().footer());\n\n protected itemClasses(active: boolean, disabled: boolean): string {\n return commandPaletteVariants({\n size: this.palette.size(),\n active,\n disabled,\n }).item();\n }\n\n protected onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.palette.query.set(value);\n }\n\n protected onItemClick(item: ResolvedItem): void {\n this.palette.selectItem(item);\n }\n\n protected onItemHover(item: ResolvedItem): void {\n this.palette.setActiveItem(item);\n }\n\n /** Focuses the search input (called by the palette after attach). */\n focusSearch(): void {\n this.searchInputRef()?.nativeElement.focus();\n }\n}\n\n// ── Public palette component ──\n\n@Component({\n selector: 'tw-command-palette',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n style: 'display: none',\n },\n template: `<ng-content />`,\n})\nexport class CommandPaletteComponent {\n /** Controls item density and padding across the palette. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Placeholder text shown inside the search input. Defaults to `'Type a command or search…'`. */\n readonly placeholder = input<string>('Type a command or search…');\n\n /** Two-way bindable search query. Writes back on every keystroke in the search input. Opening and closing the palette leave it untouched — reset it yourself if each open should start empty. Defaults to `''`. */\n readonly query = model<string>('');\n\n /** Two-way bindable open state. Setting to `true` opens the palette; closing updates it to `false`. Defaults to `false`. */\n readonly open = model<boolean>(false);\n\n /** Data-driven command list. Merged with projected items and filtered by `query`. Defaults to `[]`. */\n readonly commands = input<readonly CommandPaletteItem[]>([]);\n\n /** Custom filter function. Receives the merged item list and current query, returns the filtered result. Defaults to `undefined` (case-insensitive substring match). */\n readonly filterFn = input<CommandPaletteFilterFn | undefined>(undefined);\n\n /** Whether the palette closes automatically after an item is activated. Defaults to `true` — a command palette is a fire-and-dismiss surface; the special case is a \"run many\" launcher that opts out. */\n readonly closeOnSelect = input<boolean>(true);\n\n /** Whether Escape closes the palette. Defaults to `true` — Escape is the universal dismiss key for modal surfaces; the special case is a non-dismissible palette. */\n readonly closeOnEscape = input<boolean>(true);\n\n /** Whether clicking the backdrop closes the palette. Defaults to `true` — clicking outside a modal is the expected dismiss gesture; the special case is enforcing an explicit choice. */\n readonly closeOnBackdropClick = input<boolean>(true);\n\n /** Whether the search input is auto-focused when the palette opens. Defaults to `true` — without auto-focus the user must click into the input before typing, defeating the keyboard-first design. */\n readonly autoFocus = input<boolean>(true);\n\n /** Accessible label used for the dialog role. Defaults to `'Command palette'`. */\n readonly ariaLabel = input<string>('Command palette');\n\n /** Accessible label applied to the search input (`role=\"combobox\"`). Defaults to `'Search commands'`. */\n readonly searchAriaLabel = input<string>('Search commands');\n\n /** Additional classes appended to the overlay panel for consumer customization. Defaults to `''`. */\n readonly panelClass = input<string | string[]>('');\n\n /** Fires when a command is activated (via click or Enter). Payload is the resolved `CommandPaletteItem`. */\n readonly itemSelected = output<CommandPaletteItem>();\n\n /** Fires after the palette becomes fully visible. */\n readonly opened = output<void>();\n\n /** Fires after the palette is fully removed from the DOM. */\n readonly closed = output<void>();\n\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private readonly announcer = inject(LiveAnnouncer);\n private readonly document = inject(DOCUMENT);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly declarativeItems = contentChildren(CommandPaletteItemDirective, {\n descendants: true,\n });\n private readonly emptyDirective = contentChild(CommandPaletteEmptyDirective);\n private readonly footerDirective = contentChild(CommandPaletteFooterDirective);\n\n private overlayRef: OverlayRef | null = null;\n private overlayInstance: CommandPaletteOverlayComponent | null = null;\n private focusTrap: ReturnType<FocusTrapFactory['create']> | null = null;\n private perOpenSubs: Subscription | null = null;\n private previousFocus: HTMLElement | null = null;\n private closing = false;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private announceTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly isAttached = signal(false);\n\n /** Merged (declarative + data-array) items keyed by id — declarative wins on collision. */\n private readonly allItems = computed<readonly ResolvedItem[]>(() => {\n const declarative = this.declarativeItems();\n const declarativeResolved: ResolvedItem[] = declarative.map((dir) => ({\n data: dir.data(),\n directive: dir,\n template: dir.contentTemplate(),\n shortcutKeys: normalizeShortcut(dir.shortcut()),\n }));\n const seenIds = new Set<string>(declarativeResolved.map((it) => it.data.id));\n\n const arrayItems = this.commands();\n const arrayResolved: ResolvedItem[] = [];\n for (const data of arrayItems) {\n if (seenIds.has(data.id)) continue;\n seenIds.add(data.id);\n arrayResolved.push({\n data,\n shortcutKeys: normalizeShortcut(data.shortcut),\n });\n }\n return [...declarativeResolved, ...arrayResolved];\n });\n\n /** Items after applying the filter function. */\n readonly filteredItems = computed<readonly ResolvedItem[]>(() => {\n const all = this.allItems();\n const q = this.query();\n const dataList = all.map((r) => r.data);\n const fn = this.filterFn();\n const filtered = fn ? fn(dataList, q) : defaultFilter(dataList, q);\n const byId = new Map<string, ResolvedItem>();\n for (const r of all) byId.set(r.data.id, r);\n const result: ResolvedItem[] = [];\n for (const data of filtered) {\n const resolved = byId.get(data.id);\n if (resolved) result.push(resolved);\n }\n return result;\n });\n\n /** Filtered items grouped by their `group` field. */\n readonly grouped = computed<readonly ResolvedGroup[]>(() => {\n const items = this.filteredItems();\n const groups: { id: string; label?: string; items: ResolvedItem[] }[] = [];\n const byKey = new Map<string, { id: string; label?: string; items: ResolvedItem[] }>();\n for (const item of items) {\n const label = item.data.group;\n const key = label ?? '__ungrouped__';\n let g = byKey.get(key);\n if (!g) {\n g = { id: `group-${key}`, label, items: [] };\n byKey.set(key, g);\n groups.push(g);\n }\n g.items.push(item);\n }\n return groups;\n });\n\n /**\n * Active item index, auto-resets to the first enabled item when the filtered\n * *id set* changes. Keyed off the id sequence (not the array reference) so a\n * re-emission of `filteredItems` with identical ids preserves the user's\n * keyboard selection; only when ids actually shift do we recompute. When the\n * previously-active id is still present in the new sequence its index is\n * carried over; otherwise we fall back to the first enabled item.\n */\n readonly activeIndex = linkedSignal<readonly string[], number>({\n source: () => this.filteredItems().map((i) => i.data.id),\n computation: (ids, previous) => {\n const items = this.filteredItems();\n if (!previous) return findFirstEnabled(items);\n const prevId = previous.source[previous.value];\n if (prevId) {\n const carriedIndex = ids.indexOf(prevId);\n if (carriedIndex >= 0) return carriedIndex;\n }\n return findFirstEnabled(items);\n },\n });\n\n /** Id of the currently active item (for `aria-activedescendant`). */\n readonly activeItemId = computed<string | null>(() => {\n const idx = this.activeIndex();\n const items = this.filteredItems();\n return items[idx]?.data.id ?? null;\n });\n\n /** Template-ref of the projected empty state (if any). */\n readonly emptyTemplate = computed<TemplateRef<{ $implicit: string }> | null>(\n () => this.emptyDirective()?.template ?? null,\n );\n\n /** Template-ref of the projected footer (if any). */\n readonly footerTemplate = computed<TemplateRef<void> | null>(\n () => this.footerDirective()?.template ?? null,\n );\n\n /** Resolved panel-class string (array merged into a single string). */\n readonly panelClassResolved = computed<string>(() => {\n const raw = this.panelClass();\n return Array.isArray(raw) ? raw.join(' ') : raw;\n });\n\n constructor() {\n // React to model changes from the consumer\n effect(() => {\n const shouldOpen = this.open();\n if (shouldOpen && this.closing && this.overlayInstance) {\n // Reopened before the leave animation finished — cancel the pending\n // close rather than letting its deferred callback write `false` back\n // over the consumer's `true`. Same shape as `popover.ts`.\n this.cancelPendingClose();\n return;\n }\n if (shouldOpen && !this.overlayInstance && !this.closing) {\n this.openPalette();\n } else if (!shouldOpen && this.overlayInstance && !this.closing) {\n this.closePalette();\n }\n });\n\n // Debounced live-region announcements while the palette is open\n effect(() => {\n const q = this.query();\n const count = this.filteredItems().length;\n untracked(() => {\n if (!this.isAttached()) return;\n this.clearAnnounceTimer();\n this.announceTimer = setTimeout(() => {\n const message =\n count === 0\n ? `No commands match ${q}`\n : `${count} ${count === 1 ? 'result' : 'results'} for ${q}`;\n this.announcer.announce(message, 'polite');\n }, ANNOUNCE_DEBOUNCE);\n });\n });\n\n this.destroyRef.onDestroy(() => {\n this.clearCloseTimer();\n this.clearAnnounceTimer();\n this.destroyFocusTrap();\n this.perOpenSubs?.unsubscribe();\n this.disposeOverlay();\n });\n }\n\n // ── Public API ──\n\n /** Open the palette programmatically. */\n show(): void {\n if (this.overlayInstance || this.closing) return;\n this.open.set(true);\n }\n\n /** Close the palette programmatically. */\n hide(): void {\n if (!this.overlayInstance || this.closing) return;\n this.closePalette();\n }\n\n /** Toggle the current open state. */\n toggle(): void {\n if (this.overlayInstance || this.closing) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /** Force the palette to reapply focus to the search input. */\n focusSearch(): void {\n this.overlayInstance?.focusSearch();\n }\n\n // ── Internal wiring (used by overlay) ──\n\n /** Activate an item: run callbacks, emit events, optionally close. */\n selectItem(item: ResolvedItem): void {\n if (item.data.disabled) return;\n item.data.run?.();\n item.directive?.activated.emit();\n this.itemSelected.emit(item.data);\n if (this.closeOnSelect()) this.hide();\n }\n\n /** Move the active descendant to the given item (used on hover). */\n setActiveItem(item: ResolvedItem): void {\n if (item.data.disabled) return;\n const idx = this.filteredItems().indexOf(item);\n if (idx >= 0) this.activeIndex.set(idx);\n }\n\n // ── Private ──\n\n private openPalette(): void {\n // SSR guard. `openPalette()` is reachable from the constructor `effect()`\n // below, and effects run during server render (only `afterRender*` hooks\n // are client-only) — so a consumer deep-linking the palette with a bound\n // `[open]=\"true\"` executed this path on Node. A CDK overlay is a\n // browser-only construct and there is nothing meaningful to serialize, so\n // bail out entirely; the client instance re-runs the same effect during\n // hydration and opens then. Matches `split.ts` / `theme.service.ts`, which\n // gate on the same `isPlatformBrowser(inject(PLATFORM_ID))` flag.\n if (!this.isBrowser) return;\n // `document` is injected rather than read as a global so the reference is\n // testable and consistent with the rest of the library.\n this.previousFocus =\n (this.document.activeElement as HTMLElement | null) ?? null;\n this.ensureOverlay();\n this.attachContent();\n this.subscribePerOpen();\n this.isAttached.set(true);\n this.setupFocusTrap();\n if (this.autoFocus()) {\n queueMicrotask(() => this.overlayInstance?.focusSearch());\n }\n this.announcer.announce(\n `Command palette opened. ${this.filteredItems().length} commands available.`,\n 'polite',\n );\n this.opened.emit();\n }\n\n private closePalette(): void {\n if (this.closing) return;\n this.closing = true;\n\n this.destroyFocusTrap();\n\n this.previousFocus?.focus();\n this.previousFocus = null;\n\n this.closeTimer = setTimeout(() => {\n this.closeTimer = null;\n\n // Guard against teardown during the animation window. `destroyRef.onDestroy`\n // calls `clearCloseTimer()` so this branch only fires when the timer survived;\n // even so, `isAttached` is the authoritative signal — if the overlay already\n // detached (programmatic disposeOverlay, double-close race), skip writes that\n // would touch a destroyed instance or re-emit `open=false`.\n if (!this.isAttached()) {\n this.closing = false;\n return;\n }\n\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n }\n\n this.perOpenSubs?.unsubscribe();\n this.perOpenSubs = null;\n this.overlayInstance = null;\n this.isAttached.set(false);\n\n untracked(() => this.open.set(false));\n\n this.closed.emit();\n this.closing = false;\n }, ANIMATION_DURATION);\n }\n\n private ensureOverlay(): void {\n if (this.overlayRef) return;\n const positionStrategy = this.overlay.position().global();\n const scrollStrategy = this.overlay.scrollStrategies.block();\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy,\n hasBackdrop: true,\n backdropClass: 'tw-dialog-backdrop',\n panelClass: 'tw-command-palette-panel',\n });\n }\n\n private attachContent(): void {\n if (!this.overlayRef) return;\n const paletteRef: CommandPaletteRef = {\n close: () => this.hide(),\n setQuery: (q) => this.query.set(q),\n };\n const contentInjector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: CommandPaletteComponent, useValue: this },\n { provide: TW_COMMAND_PALETTE_REF, useValue: paletteRef },\n ],\n });\n const portal = new ComponentPortal(\n CommandPaletteOverlayComponent,\n this.viewContainerRef,\n contentInjector,\n );\n const ref = this.overlayRef.attach(portal);\n this.overlayInstance = ref.instance;\n }\n\n private subscribePerOpen(): void {\n this.perOpenSubs?.unsubscribe();\n this.perOpenSubs = new Subscription();\n\n this.perOpenSubs.add(\n this.overlayRef!.backdropClick().subscribe(() => {\n if (this.closeOnBackdropClick()) this.hide();\n }),\n );\n\n this.perOpenSubs.add(\n this.overlayRef!.keydownEvents().subscribe((event) =>\n this.handleOverlayKeydown(event),\n ),\n );\n }\n\n private handleOverlayKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Escape':\n if (this.closeOnEscape()) {\n event.preventDefault();\n this.hide();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(findFirstEnabled(this.filteredItems()));\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(findLastEnabled(this.filteredItems()));\n break;\n case 'Enter':\n event.preventDefault();\n this.activateActive();\n break;\n // Tab is intentionally NOT handled here — the FocusTrap installed in\n // `setupFocusTrap()` cycles focus through the modal's focusable elements,\n // so the user cannot accidentally tab out of the palette. Closing on Tab\n // (the previous behaviour) ran counter to the universal \"Tab moves focus\n // within a modal\" convention and surprised keyboard users.\n }\n }\n\n private moveActive(delta: 1 | -1): void {\n const items = this.filteredItems();\n if (items.length === 0) return;\n const n = items.length;\n let idx = this.activeIndex();\n for (let i = 0; i < n; i++) {\n idx = (idx + delta + n) % n;\n if (!items[idx].data.disabled) {\n this.activeIndex.set(idx);\n return;\n }\n }\n }\n\n private activateActive(): void {\n const items = this.filteredItems();\n const item = items[this.activeIndex()];\n if (item && !item.data.disabled) this.selectItem(item);\n }\n\n private setupFocusTrap(): void {\n if (!this.overlayRef) return;\n this.focusTrap = this.focusTrapFactory.create(this.overlayRef.overlayElement);\n }\n\n private destroyFocusTrap(): void {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n }\n\n private disposeOverlay(): void {\n this.overlayRef?.dispose();\n this.overlayRef = null;\n this.overlayInstance = null;\n }\n\n /**\n * Aborts an in-flight close, leaving the palette open.\n *\n * The overlay is still attached (only the detach is deferred), so this\n * restores the focus trap that `closePalette` tore down up front.\n */\n private cancelPendingClose(): void {\n this.clearCloseTimer();\n this.closing = false;\n this.setupFocusTrap();\n }\n\n private clearCloseTimer(): void {\n if (this.closeTimer !== null) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n\n private clearAnnounceTimer(): void {\n if (this.announceTimer !== null) {\n clearTimeout(this.announceTimer);\n this.announceTimer = null;\n }\n }\n}\n","<div [class]=\"panelClasses()\" role=\"dialog\" [attr.aria-modal]=\"'true'\" [attr.aria-label]=\"palette.ariaLabel()\">\n <div [class]=\"searchWrapperClasses()\">\n <svg [class]=\"searchIconClasses()\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z\" clip-rule=\"evenodd\" />\n </svg>\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n [class]=\"searchInputClasses()\"\n [placeholder]=\"palette.placeholder()\"\n [value]=\"palette.query()\"\n (input)=\"onSearchInput($event)\"\n [attr.aria-label]=\"palette.searchAriaLabel()\"\n [attr.aria-expanded]=\"'true'\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"palette.activeItemId()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n <div [class]=\"listClasses()\" role=\"listbox\" [id]=\"listId\">\n @if (palette.grouped().length === 0) {\n @if (palette.emptyTemplate(); as emptyTpl) {\n <div [class]=\"emptyClasses()\">\n <ng-container [ngTemplateOutlet]=\"emptyTpl\" [ngTemplateOutletContext]=\"{ $implicit: palette.query() }\" />\n </div>\n } @else {\n <div [class]=\"emptyClasses()\">No results found</div>\n }\n } @else {\n @for (group of palette.grouped(); track group.id) {\n <div role=\"group\" [attr.aria-label]=\"group.label ?? null\">\n @if (group.label) {\n <div [class]=\"groupHeaderClasses()\" role=\"presentation\">{{ group.label }}</div>\n }\n @for (item of group.items; track item.data.id) {\n <!-- ARIA activedescendant listbox: navigation lives on the search\n input above; option elements never receive DOM focus and have\n no keyboard handlers of their own. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n [id]=\"item.data.id\"\n role=\"option\"\n [class]=\"itemClasses(item.data.id === palette.activeItemId(), item.data.disabled ?? false)\"\n [attr.aria-selected]=\"item.data.id === palette.activeItemId()\"\n [attr.aria-disabled]=\"(item.data.disabled ?? false) ? 'true' : null\"\n (click)=\"onItemClick(item)\"\n (mousemove)=\"onItemHover(item)\"\n >\n <span [class]=\"itemBodyClasses()\">\n @if (item.template; as tpl) {\n <span [class]=\"itemLabelClasses()\">\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n </span>\n } @else {\n <span [class]=\"itemLabelClasses()\">{{ item.data.label }}</span>\n }\n @if (item.data.description) {\n <span [class]=\"itemDescriptionClasses()\">{{ item.data.description }}</span>\n }\n </span>\n @if (item.shortcutKeys.length > 0) {\n <span [class]=\"itemShortcutClasses()\" aria-hidden=\"true\">\n @for (key of item.shortcutKeys; track $index) {\n <kbd [class]=\"itemKbdClasses()\">{{ key }}</kbd>\n }\n </span>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n @if (palette.footerTemplate(); as footerTpl) {\n <div [class]=\"footerClasses()\">\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, DestroyRef, signal,
|
|
2
|
+
import { InjectionToken, inject, DestroyRef, signal, computed, Injectable, EventEmitter } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { Validators, NgForm, FormGroupDirective } from '@angular/forms';
|
|
5
|
+
import { merge, Subject } from 'rxjs';
|
|
3
6
|
import { filter, takeUntil } from 'rxjs/operators';
|
|
4
7
|
import { FocusTrapFactory, _IdGenerator } from '@angular/cdk/a11y';
|
|
5
8
|
import { Overlay } from '@angular/cdk/overlay';
|
|
6
9
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
7
|
-
import { Subject } from 'rxjs';
|
|
8
10
|
import { tv } from 'tailwind-variants';
|
|
9
11
|
|
|
10
12
|
/**
|
|
@@ -32,6 +34,108 @@ const TW_ERROR_STATE_MATCHER = new InjectionToken('TW_ERROR_STATE_MATCHER', {
|
|
|
32
34
|
factory: () => defaultErrorStateMatcher,
|
|
33
35
|
});
|
|
34
36
|
|
|
37
|
+
/** Default validator set consulted by {@link ErrorStateWiring.required}. */
|
|
38
|
+
const DEFAULT_REQUIRED_VALIDATORS = [Validators.required];
|
|
39
|
+
const NO_TRACKED_SOURCES = [];
|
|
40
|
+
/**
|
|
41
|
+
* Builds the error-state, required and errors signals every ngx-tw form control
|
|
42
|
+
* exposes to `<tw-form-field>`, plus the revision plumbing that keeps them live.
|
|
43
|
+
*
|
|
44
|
+
* Call it from an injection context (a field initializer or the constructor).
|
|
45
|
+
* It injects `DestroyRef`, `NgForm`/`FormGroupDirective` (both optional) and
|
|
46
|
+
* `TW_ERROR_STATE_MATCHER` on the host's behalf; it does **not** inject
|
|
47
|
+
* `NgControl`, because the host must keep ownership of that reference for
|
|
48
|
+
* `ControlValueAccessor` registration.
|
|
49
|
+
*
|
|
50
|
+
* Wiring an error-state-aware control takes three steps:
|
|
51
|
+
*
|
|
52
|
+
* ```ts
|
|
53
|
+
* private readonly ngControl = inject(NgControl, { optional: true, self: true });
|
|
54
|
+
* private readonly errorWiring = wireErrorState({
|
|
55
|
+
* ngControl: () => this.ngControl,
|
|
56
|
+
* matcher: () => this.errorStateMatcher(),
|
|
57
|
+
* required: () => this.requiredInput(),
|
|
58
|
+
* track: [this._focused],
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* readonly errorState = this.errorWiring.errorState;
|
|
62
|
+
* readonly required = this.errorWiring.required;
|
|
63
|
+
* readonly errors = this.errorWiring.errors;
|
|
64
|
+
*
|
|
65
|
+
* ngOnInit(): void {
|
|
66
|
+
* this.errorWiring.connect();
|
|
67
|
+
* }
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
function wireErrorState(options) {
|
|
71
|
+
const destroyRef = inject(DestroyRef);
|
|
72
|
+
const parentForm = inject(NgForm, { optional: true });
|
|
73
|
+
const parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
74
|
+
const defaultMatcher = inject(TW_ERROR_STATE_MATCHER);
|
|
75
|
+
const { ngControl, matcher, required: requiredInput, requiredValidators = DEFAULT_REQUIRED_VALIDATORS, track = NO_TRACKED_SOURCES, errorStateOverride, } = options;
|
|
76
|
+
// Revision counters. `controlRev` invalidates everything derived from the
|
|
77
|
+
// bound control; `submitRev` invalidates only the matcher's `form.submitted`
|
|
78
|
+
// arm. They are separate because a submit must not make `required`/`errors`
|
|
79
|
+
// recompute.
|
|
80
|
+
const controlRev = signal(0, /* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [{ debugName: "controlRev" }] : /* istanbul ignore next */ []));
|
|
82
|
+
const submitRev = signal(0, /* @ts-ignore */
|
|
83
|
+
...(ngDevMode ? [{ debugName: "submitRev" }] : /* istanbul ignore next */ []));
|
|
84
|
+
const errorState = computed(() => {
|
|
85
|
+
controlRev();
|
|
86
|
+
submitRev();
|
|
87
|
+
for (const source of track) {
|
|
88
|
+
source();
|
|
89
|
+
}
|
|
90
|
+
const overridden = errorStateOverride?.();
|
|
91
|
+
if (overridden !== undefined)
|
|
92
|
+
return overridden;
|
|
93
|
+
const resolved = matcher?.() ?? defaultMatcher;
|
|
94
|
+
const form = parentFormGroup ?? parentForm;
|
|
95
|
+
return resolved.isErrorState(ngControl()?.control ?? null, form);
|
|
96
|
+
}, /* @ts-ignore */
|
|
97
|
+
...(ngDevMode ? [{ debugName: "errorState" }] : /* istanbul ignore next */ []));
|
|
98
|
+
const required = computed(() => {
|
|
99
|
+
controlRev();
|
|
100
|
+
if (requiredInput?.())
|
|
101
|
+
return true;
|
|
102
|
+
const control = ngControl()?.control;
|
|
103
|
+
if (!control)
|
|
104
|
+
return false;
|
|
105
|
+
return requiredValidators.some((validator) => control.hasValidator(validator));
|
|
106
|
+
}, /* @ts-ignore */
|
|
107
|
+
...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
108
|
+
const errors = computed(() => {
|
|
109
|
+
controlRev();
|
|
110
|
+
return ngControl()?.control?.errors ?? null;
|
|
111
|
+
}, /* @ts-ignore */
|
|
112
|
+
...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
|
|
113
|
+
return {
|
|
114
|
+
errorState,
|
|
115
|
+
required,
|
|
116
|
+
errors,
|
|
117
|
+
rev: controlRev.asReadonly(),
|
|
118
|
+
bump: () => controlRev.update((n) => n + 1),
|
|
119
|
+
connect: () => {
|
|
120
|
+
const control = ngControl()?.control;
|
|
121
|
+
if (control) {
|
|
122
|
+
const streams = [control.statusChanges, control.valueChanges].filter((stream) => !!stream);
|
|
123
|
+
if (streams.length) {
|
|
124
|
+
merge(...streams)
|
|
125
|
+
.pipe(takeUntilDestroyed(destroyRef))
|
|
126
|
+
.subscribe(() => controlRev.update((n) => n + 1));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const submit = parentFormGroup?.ngSubmit ?? parentForm?.ngSubmit;
|
|
130
|
+
if (submit) {
|
|
131
|
+
submit
|
|
132
|
+
.pipe(takeUntilDestroyed(destroyRef))
|
|
133
|
+
.subscribe(() => submitRev.update((n) => n + 1));
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
35
139
|
/**
|
|
36
140
|
* DI token through which sort containers expose their state to consumers. Provided by
|
|
37
141
|
* `SortDirective` (`[twSort]`). Inject with `{ optional: true }` — components that need
|
|
@@ -125,18 +229,23 @@ const PICKER_LEAVE_DURATION = 120;
|
|
|
125
229
|
/**
|
|
126
230
|
* Coordinator that owns the CDK `OverlayRef`, focus trap, panel-id, and
|
|
127
231
|
* animation timing for an overlay-bearing form control. Consumed by
|
|
128
|
-
* `DatePickerComponent
|
|
129
|
-
* the coordinator at the
|
|
130
|
-
*
|
|
232
|
+
* `DatePickerComponent`, `DateRangePickerComponent`, `SelectComponent` and
|
|
233
|
+
* `ComboboxComponent`; every consumer registers the coordinator at the
|
|
234
|
+
* component level (`providers: [PickerOverlayCoordinator]`) so each instance
|
|
235
|
+
* owns its own coordinator state.
|
|
131
236
|
*
|
|
132
237
|
* Per the library "no `providedIn: 'root'` for services" rule (see
|
|
133
238
|
* `.claude/CLAUDE.md` → "What NOT To Do"): the coordinator holds per-overlay
|
|
134
239
|
* `OverlayRef` / `FocusTrap` state and MUST be component-scoped.
|
|
135
240
|
*
|
|
136
241
|
* Scope of responsibility:
|
|
137
|
-
* - Create / dispose the CDK `OverlayRef`.
|
|
242
|
+
* - Create / dispose the CDK `OverlayRef`. The ref is **disposed** on close and
|
|
243
|
+
* rebuilt on the next open, so every creation-time value (`positions`,
|
|
244
|
+
* `scrollStrategy`, `panelClass`, and the position strategy's origin) is
|
|
245
|
+
* re-read on every open. Nothing here is frozen at first open.
|
|
138
246
|
* - Attach a `ComponentPortal` and return the instance.
|
|
139
|
-
* - Set up / tear down a `FocusTrap` around the overlay element
|
|
247
|
+
* - Set up / tear down a `FocusTrap` around the overlay element, unless the
|
|
248
|
+
* consumer opts out via `focusTrap: false`.
|
|
140
249
|
* - Emit `opened$` after the enter animation completes (closes the
|
|
141
250
|
* synchronous-emit bug previously present in both pickers).
|
|
142
251
|
* - Expose `backdropClick$` / `overlayKeydown$` / `escape$` streams scoped
|
|
@@ -145,7 +254,11 @@ const PICKER_LEAVE_DURATION = 120;
|
|
|
145
254
|
* never touch a detached `OverlayRef` (mirrors the S14 command-palette
|
|
146
255
|
* pattern).
|
|
147
256
|
*
|
|
148
|
-
* Out of scope (stays in the consuming
|
|
257
|
+
* Out of scope (stays in the consuming component):
|
|
258
|
+
* - Panel width. `select` / `combobox` size their panel from a trigger
|
|
259
|
+
* measurement that only they can make (which of several host children is the
|
|
260
|
+
* measurable trigger differs per component), so they call
|
|
261
|
+
* `ref()?.updateSize(...)` themselves and own their `ResizeObserver`.
|
|
149
262
|
* - "Restore previous value on close" — semantics differ per picker.
|
|
150
263
|
* - Per-picker portal callbacks (calendar selection, action-bar buttons).
|
|
151
264
|
* - View-mode change-detection nudges (the range-picker calls
|
|
@@ -206,7 +319,9 @@ class PickerOverlayCoordinator {
|
|
|
206
319
|
this.openedSubject = new Subject();
|
|
207
320
|
this.attachedSignal.set(true);
|
|
208
321
|
this.openedSignal.set(false);
|
|
209
|
-
|
|
322
|
+
if (config.focusTrap !== false) {
|
|
323
|
+
this.setupFocusTrap();
|
|
324
|
+
}
|
|
210
325
|
this.scheduleOpenedEmission();
|
|
211
326
|
return {
|
|
212
327
|
overlayRef: this.overlayRef,
|
|
@@ -647,12 +762,17 @@ const tabTriggerVariants = tv({
|
|
|
647
762
|
trigger: 'rounded-md text-fg-muted hover:text-fg',
|
|
648
763
|
},
|
|
649
764
|
},
|
|
765
|
+
// Pinned control heights — see `docs/vertical-rhythm.md`. Vertical padding
|
|
766
|
+
// is deliberately absent: the height is declared, not derived, and the
|
|
767
|
+
// trigger's own border (`border-b-2` on underline, `border` on enclosed)
|
|
768
|
+
// sits *inside* it under Preflight's global `box-sizing: border-box`.
|
|
769
|
+
// `inline-flex items-center` on the base slot does the centring.
|
|
650
770
|
size: {
|
|
651
|
-
xs: { trigger: 'px-2
|
|
652
|
-
sm: { trigger: 'px-3
|
|
653
|
-
md: { trigger: 'px-4
|
|
654
|
-
lg: { trigger: 'px-5
|
|
655
|
-
xl: { trigger: 'px-6
|
|
771
|
+
xs: { trigger: 'px-2 text-xs h-6' },
|
|
772
|
+
sm: { trigger: 'px-3 text-sm h-8' },
|
|
773
|
+
md: { trigger: 'px-4 text-sm h-9' },
|
|
774
|
+
lg: { trigger: 'px-5 text-base h-11' },
|
|
775
|
+
xl: { trigger: 'px-6 text-base h-12' },
|
|
656
776
|
},
|
|
657
777
|
fitted: {
|
|
658
778
|
true: { trigger: 'flex-1 justify-center' },
|
|
@@ -862,5 +982,5 @@ function timeOfDaySeconds(hour, minute, second) {
|
|
|
862
982
|
* Generated bundle index. Do not edit.
|
|
863
983
|
*/
|
|
864
984
|
|
|
865
|
-
export { AriaIdQueue,
|
|
985
|
+
export { AriaIdQueue, OVERLAY_ANIMATION_FALLBACK_PADDING, OverlayContainerCoordinator, PICKER_ENTER_DURATION, PICKER_LEAVE_DURATION, PickerOverlayCoordinator, TW_ERROR_STATE_MATCHER, TW_SORT_HANDLE, appendDigit, buildSelectLikePositions, clamp, coerceOverlayDuration, consumeOverlayEscape, defaultErrorStateMatcher, fieldMax, fieldMin, from12h, getActiveTriggerClasses, getInactiveTriggerClasses, isTerminalDigit, mergeOverlayPanelClass, padTwo, parseField, resolveSelectScrollStrategy, stepWithWrap, tabTriggerVariants, timeOfDaySeconds, to12h, wireErrorState };
|
|
866
986
|
//# sourceMappingURL=cdevhub-ngx-tw-core.mjs.map
|