@tx-angular-design-system/ui-kit 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-angular-design-system-ui-kit.mjs","sources":["../../../projects/ui-kit/src/lib/core/unique-id.ts","../../../projects/ui-kit/src/lib/core/option.ts","../../../projects/ui-kit/src/lib/core/merge-config.ts","../../../projects/ui-kit/src/lib/core/control-classes.ts","../../../projects/ui-kit/src/lib/core/control-value-bridge.ts","../../../projects/ui-kit/src/lib/form-field/form-field.types.ts","../../../projects/ui-kit/src/lib/core/form-field-binding.ts","../../../projects/ui-kit/src/lib/overlay/overlay.types.ts","../../../projects/ui-kit/src/lib/overlay/connected-overlay.directive.ts","../../../projects/ui-kit/src/lib/icon/icon.types.ts","../../../projects/ui-kit/src/lib/icon/default-icons.ts","../../../projects/ui-kit/src/lib/icon/icon-registry.service.ts","../../../projects/ui-kit/src/lib/icon/icon.component.ts","../../../projects/ui-kit/src/lib/form-field/form-field.component.ts","../../../projects/ui-kit/src/lib/button/button.types.ts","../../../projects/ui-kit/src/lib/spinner/spinner.component.ts","../../../projects/ui-kit/src/lib/button/button.component.ts","../../../projects/ui-kit/src/lib/input/input.types.ts","../../../projects/ui-kit/src/lib/input/input.component.ts","../../../projects/ui-kit/src/lib/textarea/textarea.component.ts","../../../projects/ui-kit/src/lib/checkbox/checkbox.component.ts","../../../projects/ui-kit/src/lib/radio/radio-group.component.ts","../../../projects/ui-kit/src/lib/switch/switch.component.ts","../../../projects/ui-kit/src/lib/core/popup-classes.ts","../../../projects/ui-kit/src/lib/select/select.types.ts","../../../projects/ui-kit/src/lib/select/select.component.ts","../../../projects/ui-kit/src/lib/core/selection-summary.ts","../../../projects/ui-kit/src/lib/select/multiselect.component.ts","../../../projects/ui-kit/src/lib/tree/tree.types.ts","../../../projects/ui-kit/src/lib/tree/tree.component.ts","../../../projects/ui-kit/src/lib/dropdown-tree/dropdown-tree.component.ts","../../../projects/ui-kit/src/lib/chips-input/chips-input.component.ts","../../../projects/ui-kit/src/lib/datepicker/date-utils.ts","../../../projects/ui-kit/src/lib/datepicker/datepicker.component.ts","../../../projects/ui-kit/src/lib/table/table.types.ts","../../../projects/ui-kit/src/lib/table/table-utils.ts","../../../projects/ui-kit/src/lib/table/table-slots.directive.ts","../../../projects/ui-kit/src/lib/pagination/pagination-utils.ts","../../../projects/ui-kit/src/lib/pagination/pagination.component.ts","../../../projects/ui-kit/src/lib/skeleton/skeleton.component.ts","../../../projects/ui-kit/src/lib/table/table.component.ts","../../../projects/ui-kit/src/lib/reorder-list/reorder-list.component.ts","../../../projects/ui-kit/src/lib/alert/alert.component.ts","../../../projects/ui-kit/src/lib/tooltip/tooltip.directive.ts","../../../projects/ui-kit/src/lib/toast/toast.service.ts","../../../projects/ui-kit/src/lib/dialog/dialog.component.ts","../../../projects/ui-kit/src/lib/dialog/dialog.service.ts","../../../projects/ui-kit/src/lib/badge/badge.component.ts","../../../projects/ui-kit/src/lib/divider/divider.component.ts","../../../projects/ui-kit/src/lib/card/card.component.ts","../../../projects/ui-kit/src/lib/empty-state/empty-state.component.ts","../../../projects/ui-kit/src/lib/breadcrumb/breadcrumb.component.ts","../../../projects/ui-kit/src/lib/tabs/tabs.component.ts","../../../projects/ui-kit/src/lib/accordion/accordion.component.ts","../../../projects/ui-kit/src/lib/header/header.component.ts","../../../projects/ui-kit/src/lib/sidebar/sidebar.component.ts","../../../projects/ui-kit/src/public-api.ts","../../../projects/ui-kit/src/tx-angular-design-system-ui-kit.ts"],"sourcesContent":["let counter = 0;\r\n\r\n/**\r\n * A process-unique DOM id.\r\n *\r\n * Used for label/control/description wiring. Ids only ever need to be unique\r\n * within a document, and every id the kit generates carries the `tx-` prefix so\r\n * it cannot collide with an application's own.\r\n */\r\nexport function txUniqueId(prefix: string): string {\r\n counter += 1;\r\n return `tx-${prefix}-${counter}`;\r\n}\r\n","/**\r\n * One selectable option.\r\n *\r\n * Options are *data*, not configuration, so components take them through their\r\n * own `options` input rather than as a field on a config object. That keeps the\r\n * config interface to simple property-level variation, and lets an application\r\n * pass an options array straight from a data source without wrapping it.\r\n *\r\n * Anything structural — a custom option template — is a `TemplateRef` input on\r\n * the component, never a field here.\r\n */\r\nexport interface TxOption<T = string> {\r\n /** The value carried into the component's `value` model. */\r\n value: T;\r\n /** Visible text. Also what typeahead matches against. */\r\n label: string;\r\n /** Optional second line, shown smaller and muted. */\r\n description?: string;\r\n /** Registered icon name shown before the label. */\r\n icon?: string;\r\n /** Short text rendered as a badge after the label, e.g. a count or status. */\r\n badge?: string;\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * A group of options with a heading. Accepted anywhere a flat option list is,\r\n * for components that support grouping.\r\n */\r\nexport interface TxOptionGroup<T = string> {\r\n label: string;\r\n options: TxOption<T>[];\r\n}\r\n\r\n/** Narrows a mixed list entry to a group. */\r\nexport function isTxOptionGroup<T>(\r\n entry: TxOption<T> | TxOptionGroup<T>,\r\n): entry is TxOptionGroup<T> {\r\n return (entry as TxOptionGroup<T>).options !== undefined;\r\n}\r\n\r\n/** Flattens a mixed option/group list into plain options, in display order. */\r\nexport function flattenTxOptions<T>(\r\n entries: readonly (TxOption<T> | TxOptionGroup<T>)[],\r\n): TxOption<T>[] {\r\n const flat: TxOption<T>[] = [];\r\n for (const entry of entries) {\r\n if (isTxOptionGroup(entry)) {\r\n flat.push(...entry.options);\r\n } else {\r\n flat.push(entry);\r\n }\r\n }\r\n return flat;\r\n}\r\n","/**\r\n * Merges a caller's partial config over a component's defaults.\r\n *\r\n * Use this rather than `{ ...DEFAULTS, ...config }`. Object spread copies keys\r\n * whose value is `undefined`, so a consumer binding an optional value:\r\n *\r\n * ```html\r\n * <tx-button [config]=\"{ label: 'Save', variant: chosenVariant }\" />\r\n * ```\r\n *\r\n * would wipe the default whenever `chosenVariant` happens to be `undefined` —\r\n * a bug that only shows up for some data. This treats an explicitly-undefined\r\n * key as absent, which is what the call site reads as.\r\n *\r\n * `null`, `false`, `0` and `''` are all kept: those are deliberate values, and\r\n * falling back from them is the `||` bug this exists to avoid.\r\n */\r\nexport function txMergeConfig<T extends object>(\r\n // `NoInfer` keeps `T` pinned to the caller's annotation — usually the\r\n // `computed<TxSomethingConfig>(…)` around the call — rather than being\r\n // narrowed to the shape of the defaults constant, which would then reject a\r\n // config carrying required fields the defaults do not supply.\r\n defaults: Partial<NoInfer<T>>,\r\n config: Partial<NoInfer<T>>,\r\n): T {\r\n const merged = { ...defaults } as T;\r\n for (const key of Object.keys(config) as (keyof T)[]) {\r\n const value = (config as T)[key];\r\n if (value !== undefined) {\r\n merged[key] = value;\r\n }\r\n }\r\n return merged;\r\n}\r\n","/**\r\n * Shared styling for the text-like control shell.\r\n *\r\n * Input, textarea, select, dropdown-tree, chips input and the datepicker\r\n * trigger all present the same bordered surface with the same focus ring and\r\n * the same error treatment. Building that string in one place is what stops\r\n * them drifting apart, and keeps every value a token.\r\n */\r\n\r\n/** Size of a control. Matches the form field's size vocabulary. */\r\nexport type TxControlSize = 'sm' | 'md' | 'lg';\r\n\r\n/** Height + padding + type size per control size. */\r\nconst SIZE_CLASSES: Record<TxControlSize, string> = {\r\n sm: 'min-h-tx-control-sm px-tx-2 py-tx-1 text-tx-sm',\r\n md: 'min-h-tx-control-md px-tx-2-5 py-tx-1-5 text-tx-base',\r\n lg: 'min-h-tx-control-lg px-tx-3 py-tx-2 text-tx-lg',\r\n};\r\n\r\n/** Fixed-height variant, for controls that never wrap (input, select trigger). */\r\nconst FIXED_HEIGHT_CLASSES: Record<TxControlSize, string> = {\r\n sm: 'h-tx-control-sm px-tx-2 text-tx-sm',\r\n md: 'h-tx-control-md px-tx-2-5 text-tx-base',\r\n lg: 'h-tx-control-lg px-tx-3 text-tx-lg',\r\n};\r\n\r\nexport interface TxControlShellOptions {\r\n size: TxControlSize;\r\n /** Renders the error border and keeps the focus ring in the danger colour. */\r\n invalid: boolean;\r\n /** Whether the control grows with its content (textarea, chips input). */\r\n height?: 'fixed' | 'auto';\r\n}\r\n\r\n/**\r\n * The bordered control surface: border, background, radius, focus ring,\r\n * placeholder colour and disabled treatment.\r\n *\r\n * Disabled and invalid are styled from real DOM state — the `disabled`\r\n * attribute and `aria-invalid` — rather than from classes toggled in\r\n * TypeScript, so the visual state can never disagree with the accessible one.\r\n */\r\nexport function txControlShellClass(options: TxControlShellOptions): string {\r\n const { size, invalid, height = 'fixed' } = options;\r\n\r\n return [\r\n 'w-full min-w-0 rounded-tx-sm border bg-tx-surface',\r\n 'text-tx-text-primary placeholder:text-tx-text-disabled',\r\n 'transition-[color,background-color,border-color,box-shadow] duration-150 ease-tx-standard',\r\n 'focus:outline-none focus-visible:outline-none',\r\n height === 'fixed' ? FIXED_HEIGHT_CLASSES[size] : SIZE_CLASSES[size],\r\n invalid\r\n ? 'border-tx-danger focus:border-tx-danger focus:shadow-tx-focus-danger'\r\n : 'border-tx-border hover:border-tx-border-strong focus:border-tx-primary focus:shadow-tx-focus',\r\n 'disabled:cursor-not-allowed disabled:border-tx-border disabled:bg-tx-surface-sunken',\r\n 'disabled:text-tx-text-disabled disabled:hover:border-tx-border',\r\n 'aria-disabled:cursor-not-allowed aria-disabled:border-tx-border',\r\n 'aria-disabled:bg-tx-surface-sunken aria-disabled:text-tx-text-disabled',\r\n ].join(' ');\r\n}\r\n\r\n/** Icon size that pairs with each control size. */\r\nexport const CONTROL_ICON_SIZE: Record<TxControlSize, 'sm' | 'md'> = {\r\n sm: 'sm',\r\n md: 'md',\r\n lg: 'md',\r\n};\r\n\r\n/* -------------------------------------------------------------------------- *\r\n * Dropdown trigger affordances\r\n *\r\n * Shared by select, multiselect and dropdown tree so the chevron and clear\r\n * button never end up in a different order, or at a different inset, in one of\r\n * them.\r\n *\r\n * Both are ordinary flex children of the trigger, laid out as\r\n * `[value] [clear] [chevron]`. That is deliberate: the trigger's own horizontal\r\n * padding then sets the chevron's inset, so it matches the text inset exactly\r\n * at every size with no hand-picked offsets to keep in step. An earlier version\r\n * positioned them absolutely and drifted — the chevron ended up 8px from the\r\n * border against a 10px text inset, and the clear button crowded it.\r\n *\r\n * The clear button lives inside the `role=\"combobox\"` element, which is the\r\n * conventional pattern. The trigger takes its accessible name from\r\n * `aria-label`/`aria-labelledby` supplied by the form field, so a nested button\r\n * adds nothing to that name; its click and keydown are stopped from bubbling so\r\n * the combobox does not also toggle.\r\n * -------------------------------------------------------------------------- */\r\n\r\n/**\r\n * The chevron. Rotates from `aria-expanded` on the trigger, which carries `group`.\r\n *\r\n * `flex` on the wrapper is load-bearing, not decoration. `tx-icon` is an\r\n * inline-flex box, so inside a wrapper that establishes an inline formatting\r\n * context it sits on the text baseline and the line box adds the strut's\r\n * descender space *below* it — around 3px at the control's 14px/1.55 text,\r\n * which pushes the glyph that far above the trigger's centre line and then\r\n * visibly shifts it again when `rotate-180` flips it about the wrapper's own\r\n * centre. Making the wrapper a flex container removes the line box entirely,\r\n * so its height is the icon's height and `items-center` on the trigger centres\r\n * the glyph exactly, open or closed.\r\n */\r\nexport const TX_TRIGGER_CHEVRON_CLASS = [\r\n 'pointer-events-none flex shrink-0 items-center text-tx-text-subtle',\r\n 'transition-transform duration-150 ease-tx-standard',\r\n 'group-aria-expanded:rotate-180',\r\n].join(' ');\r\n\r\n/** The clear button, sitting immediately before the chevron. */\r\nexport const TX_TRIGGER_CLEAR_CLASS = [\r\n 'inline-grid shrink-0 cursor-pointer place-items-center rounded-tx-xs p-tx-0-5',\r\n 'text-tx-text-subtle transition-colors',\r\n 'hover:bg-tx-hover-fill hover:text-tx-text-primary',\r\n 'focus-visible:bg-tx-hover-fill focus-visible:text-tx-text-primary',\r\n].join(' ');\r\n","import { WritableSignal, signal } from '@angular/core';\r\n\r\n/**\r\n * Bridges a `model()` signal to `@angular/forms`.\r\n *\r\n * Kit controls expose their value as a `model()` so template-driven signal\r\n * binding works, and implement `ControlValueAccessor` so reactive forms do too.\r\n * This holds the small amount of state that both need to agree on, in one\r\n * place that can be unit-tested without rendering a component.\r\n *\r\n * @example\r\n * ```ts\r\n * export class TxInputComponent implements ControlValueAccessor {\r\n * readonly value = model('');\r\n * private readonly forms = new TxControlValueBridge<string>((v) => this.value.set(v));\r\n *\r\n * writeValue(value: string): void { this.forms.writeValue(value); }\r\n * registerOnChange(fn: (value: string) => void): void { this.forms.registerOnChange(fn); }\r\n * registerOnTouched(fn: () => void): void { this.forms.registerOnTouched(fn); }\r\n * setDisabledState(isDisabled: boolean): void { this.forms.setDisabledState(isDisabled); }\r\n * }\r\n * ```\r\n */\r\nexport class TxControlValueBridge<T> {\r\n private onChange: (value: T) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /**\r\n * Disabled state pushed down by a `FormControl`.\r\n *\r\n * Kept separate from the config's own `disabled` so the two can be OR'd\r\n * rather than fighting: a control disabled by its form stays disabled even if\r\n * the config says otherwise, and vice versa.\r\n */\r\n readonly formDisabled: WritableSignal<boolean> = signal(false);\r\n\r\n constructor(private readonly applyValue: (value: T) => void) {}\r\n\r\n /** Called by forms to push a value in. Does not echo back through onChange. */\r\n writeValue(value: T): void {\r\n this.applyValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: T) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.formDisabled.set(isDisabled);\r\n }\r\n\r\n /** Called by the control when the user changes the value. */\r\n emit(value: T): void {\r\n this.onChange(value);\r\n }\r\n\r\n /** Called by the control on blur. */\r\n touch(): void {\r\n this.onTouched();\r\n }\r\n}\r\n","import { InjectionToken, Signal } from '@angular/core';\r\n\r\n/** Vertical rhythm/size of a form field and the control inside it. */\r\nexport type TxFormFieldSize = 'sm' | 'md' | 'lg';\r\n\r\n/** How the label sits relative to the control. */\r\nexport type TxFormFieldLayout = 'stacked' | 'inline';\r\n\r\n/**\r\n * Simple property configuration for {@link TxFormFieldComponent}.\r\n *\r\n * Everything here is optional: a form field with no label is a legitimate way\r\n * to get consistent hint/error placement around a control.\r\n */\r\nexport interface TxFormFieldConfig {\r\n /** Visible label text. */\r\n label?: string;\r\n /**\r\n * Keeps the label available to screen readers while hiding it visually —\r\n * for a control whose purpose is already obvious from context, such as a\r\n * search box with a magnifier icon.\r\n */\r\n labelVisibility?: 'visible' | 'screen-reader-only';\r\n /** Helper text under the control. Hidden while an error is showing. */\r\n hint?: string;\r\n /**\r\n * Error message. A non-empty value puts the field into its error state and\r\n * marks the control `aria-invalid` — there is no separate `invalid` flag to\r\n * keep in step with it.\r\n */\r\n error?: string;\r\n /** Renders a required marker and sets `aria-required` on the control. */\r\n required?: boolean;\r\n /** Greys out the label/hint. The control still needs its own `disabled`. */\r\n disabled?: boolean;\r\n /** Defaults to `stacked`. */\r\n layout?: TxFormFieldLayout;\r\n /** Defaults to `md`. Controls inside inherit this unless they override it. */\r\n size?: TxFormFieldSize;\r\n}\r\n\r\nexport const TX_FORM_FIELD_DEFAULTS = {\r\n labelVisibility: 'visible',\r\n layout: 'stacked',\r\n size: 'md',\r\n} as const satisfies Partial<TxFormFieldConfig>;\r\n\r\n/**\r\n * What a form field exposes to the control projected inside it.\r\n *\r\n * Controls inject this optionally: used bare, a control falls back to its own\r\n * generated id and no described-by, so nothing depends on being wrapped.\r\n */\r\nexport interface TxFormFieldApi {\r\n /** Id the label's `for` points at. The control must adopt it. */\r\n readonly controlId: Signal<string>;\r\n /** Space-joined ids of the hint and/or error, for `aria-describedby`. */\r\n readonly describedBy: Signal<string | null>;\r\n /** True while `error` is a non-empty string. */\r\n readonly invalid: Signal<boolean>;\r\n readonly required: Signal<boolean>;\r\n readonly disabled: Signal<boolean>;\r\n readonly size: Signal<TxFormFieldSize>;\r\n}\r\n\r\nexport const TX_FORM_FIELD = new InjectionToken<TxFormFieldApi>('TX_FORM_FIELD');\r\n","import { Signal, computed, inject } from '@angular/core';\r\n\r\nimport { TX_FORM_FIELD, TxFormFieldSize } from '../form-field/form-field.types';\r\nimport { txUniqueId } from './unique-id';\r\n\r\n/**\r\n * What a control inherits from a surrounding {@link TxFormFieldComponent}.\r\n * Every value falls back to a standalone default, so no kit control depends on\r\n * being wrapped.\r\n */\r\nexport interface TxFormFieldBinding {\r\n /** The control's `id`; the field's label points its `for` at this. */\r\n readonly id: Signal<string>;\r\n /** For `aria-describedby` — the hint's or error's id, whichever is showing. */\r\n readonly describedBy: Signal<string | null>;\r\n /** True when the field is showing an error. Drives `aria-invalid`. */\r\n readonly invalid: Signal<boolean>;\r\n /** Required marker set on the field. Drives `aria-required`. */\r\n readonly required: Signal<boolean>;\r\n /** The field's size, or `null` when there is no field to inherit from. */\r\n readonly size: Signal<TxFormFieldSize | null>;\r\n}\r\n\r\n/**\r\n * Connects a control to its surrounding form field.\r\n *\r\n * Must be called from an injection context (a field initialiser or the\r\n * constructor).\r\n */\r\nexport function txBindFormField(idPrefix: string): TxFormFieldBinding {\r\n const field = inject(TX_FORM_FIELD, { optional: true });\r\n const fallbackId = txUniqueId(idPrefix);\r\n\r\n return {\r\n id: computed(() => field?.controlId() ?? fallbackId),\r\n describedBy: computed(() => field?.describedBy() ?? null),\r\n invalid: computed(() => field?.invalid() ?? false),\r\n required: computed(() => field?.required() ?? false),\r\n size: computed(() => field?.size() ?? null),\r\n };\r\n}\r\n","/**\r\n * Shared overlay vocabulary for every popup surface in the kit — select,\r\n * multiselect, dropdown tree, chips input, autocomplete, menu, datepicker and\r\n * tooltip all position through the same directive.\r\n */\r\n\r\n/**\r\n * Preferred placement of the popup relative to its trigger. Each one carries\r\n * its own fallback ladder, so a popup near a viewport edge flips rather than\r\n * being clipped.\r\n */\r\nexport type TxOverlayPlacement =\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'bottom-center'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'top-center'\r\n | 'right-start'\r\n | 'left-start';\r\n\r\n/**\r\n * How the popup's width relates to its trigger.\r\n *\r\n * - `trigger` — exactly the trigger's width. Selects and dropdown trees.\r\n * - `min-trigger` — at least the trigger's width, wider if content needs it.\r\n * - `content` — sized purely by content. Menus, tooltips, datepickers.\r\n */\r\nexport type TxOverlayWidth = 'trigger' | 'min-trigger' | 'content';\r\n\r\n/** Why the popup closed. Lets a trigger decide whether to restore focus. */\r\nexport type TxOverlayCloseReason = 'escape' | 'outside-click' | 'detach';\r\n\r\n/**\r\n * Simple property configuration for a connected overlay.\r\n *\r\n * Structural content is NOT configured here — the popup body is a\r\n * `TemplateRef` passed to the directive, never a field on this object.\r\n */\r\nexport interface TxOverlayConfig {\r\n /** Preferred placement; falls back through a ladder if it does not fit. */\r\n placement: TxOverlayPlacement;\r\n /** How the popup's width relates to the trigger's. */\r\n width: TxOverlayWidth;\r\n /** Gap between trigger and popup, expressed as a spacing token step. */\r\n gap: 'none' | 'sm' | 'md';\r\n /** Close when a pointer event lands outside the popup and its trigger. */\r\n closeOnOutsideClick: boolean;\r\n /** Close when Escape is pressed while the popup has focus or activedescendant. */\r\n closeOnEscape: boolean;\r\n /** Reposition the popup as ancestors scroll, instead of leaving it behind. */\r\n repositionOnScroll: boolean;\r\n}\r\n\r\nexport const TX_OVERLAY_DEFAULTS: TxOverlayConfig = {\r\n placement: 'bottom-start',\r\n width: 'trigger',\r\n gap: 'sm',\r\n closeOnOutsideClick: true,\r\n closeOnEscape: true,\r\n repositionOnScroll: true,\r\n};\r\n","import {\r\n ConnectedPosition,\r\n OverlayRef,\r\n createFlexibleConnectedPositionStrategy,\r\n createNoopScrollStrategy,\r\n createOverlayRef,\r\n createRepositionScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n Injector,\r\n TemplateRef,\r\n ViewContainerRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n untracked,\r\n} from '@angular/core';\r\n\r\nimport {\r\n TX_OVERLAY_DEFAULTS,\r\n TxOverlayCloseReason,\r\n TxOverlayConfig,\r\n TxOverlayPlacement,\r\n TxOverlayWidth,\r\n} from './overlay.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * Positions a popup template against a trigger element using the CDK overlay.\r\n *\r\n * ## Why the portal is attached eagerly\r\n *\r\n * `@angular/aria`'s `ComboboxPopup` registers itself with its `Combobox` in\r\n * `ngOnInit`, and that registration is what gives the trigger its\r\n * `aria-controls`, its `aria-expanded` wiring and — most importantly — its\r\n * forwarding of arrow keys into the popup widget. If the popup template were\r\n * only instantiated on first open, the very first ArrowDown on a closed\r\n * trigger would have nothing to forward to.\r\n *\r\n * So the `TemplatePortal` is attached as soon as the directive initialises,\r\n * and stays attached for the directive's lifetime. Aria's own `DeferredContent`\r\n * still creates and destroys the popup *body* in step with `expanded`, so the\r\n * pane is genuinely empty (and zero-sized) while closed. `open` therefore\r\n * drives positioning and the scroll strategy, not attachment.\r\n *\r\n * The alternative — letting Aria render the popup inline and moving the live\r\n * node into an overlay with `DomPortal` — was rejected because detaching has\r\n * to be sequenced against Aria destroying that same view, and we do not\r\n * control that ordering.\r\n *\r\n * @example\r\n * ```html\r\n * <div ngCombobox #cb=\"ngCombobox\" [(expanded)]=\"expanded\"\r\n * [txConnectedOverlay]=\"popup\" [txOverlayOpen]=\"expanded()\">\r\n * {{ label() }}\r\n * </div>\r\n *\r\n * <ng-template #popup>\r\n * <ng-template ngComboboxPopup [combobox]=\"cb\">\r\n * <div ngComboboxWidget ngListbox>…</div>\r\n * </ng-template>\r\n * </ng-template>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[txConnectedOverlay]',\r\n exportAs: 'txConnectedOverlay',\r\n})\r\nexport class TxConnectedOverlayDirective {\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly injector = inject(Injector);\r\n\r\n /** The popup body. Structural, so it is a template — never a config field. */\r\n readonly template = input.required<TemplateRef<unknown>>({ alias: 'txConnectedOverlay' });\r\n\r\n /** Whether the popup is currently shown. */\r\n readonly open = input(false, { alias: 'txOverlayOpen' });\r\n\r\n /** Trigger to position against. Defaults to the element the directive is on. */\r\n readonly origin = input<HTMLElement | undefined>(undefined, { alias: 'txOverlayOrigin' });\r\n\r\n /** Simple property configuration; merged over {@link TX_OVERLAY_DEFAULTS}. */\r\n readonly config = input<Partial<TxOverlayConfig>>({}, { alias: 'txOverlayConfig' });\r\n\r\n /** Emitted when the popup asks to close. The trigger owns the open state. */\r\n readonly closed = output<TxOverlayCloseReason>();\r\n\r\n protected readonly resolved = computed<TxOverlayConfig>(() =>\r\n txMergeConfig(TX_OVERLAY_DEFAULTS, this.config()),\r\n );\r\n\r\n private overlayRef: OverlayRef | null = null;\r\n\r\n private get originElement(): HTMLElement {\r\n return this.origin() ?? this.host.nativeElement;\r\n }\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n destroyRef.onDestroy(() => {\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n });\r\n\r\n // Attach once, then let `open` drive geometry only. See the class docs.\r\n effect(() => {\r\n const config = this.resolved();\r\n const isOpen = this.open();\r\n const template = this.template();\r\n\r\n untracked(() => {\r\n const overlayRef = this.ensureOverlay(config, template);\r\n this.applyOpenState(overlayRef, config, isOpen);\r\n });\r\n });\r\n }\r\n\r\n /** Recomputes position and size. Call after the popup's content changes. */\r\n reposition(): void {\r\n if (!this.overlayRef?.hasAttached()) {\r\n return;\r\n }\r\n this.applyWidth(this.overlayRef, this.resolved().width);\r\n this.overlayRef.updatePosition();\r\n }\r\n\r\n private ensureOverlay(config: TxOverlayConfig, template: TemplateRef<unknown>): OverlayRef {\r\n if (this.overlayRef) {\r\n return this.overlayRef;\r\n }\r\n\r\n const positionStrategy = createFlexibleConnectedPositionStrategy(\r\n this.injector,\r\n this.originElement,\r\n )\r\n .withPositions(positionsFor(config.placement, config.gap))\r\n .withViewportMargin(readTokenPx(this.host.nativeElement, '--spacing-tx-2'))\r\n // Push a popup back inside the viewport rather than letting it hang off\r\n // the edge — this is what keeps dropdowns usable at 360px.\r\n .withPush(true)\r\n .withFlexibleDimensions(true)\r\n .withGrowAfterOpen(true);\r\n\r\n const overlayRef = createOverlayRef(this.injector, {\r\n positionStrategy,\r\n scrollStrategy: createNoopScrollStrategy(),\r\n panelClass: 'tx-overlay-pane',\r\n disposeOnNavigation: true,\r\n });\r\n\r\n overlayRef.attach(new TemplatePortal(template, this.viewContainerRef));\r\n\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape' && this.open() && this.resolved().closeOnEscape) {\r\n this.closed.emit('escape');\r\n }\r\n });\r\n\r\n overlayRef.outsidePointerEvents().subscribe((event) => {\r\n if (!this.open() || !this.resolved().closeOnOutsideClick) {\r\n return;\r\n }\r\n // Clicking the trigger itself is the trigger's business to toggle;\r\n // treating it as an outside click would close then instantly reopen.\r\n const target = event.target as Node | null;\r\n if (target && this.originElement.contains(target)) {\r\n return;\r\n }\r\n this.closed.emit('outside-click');\r\n });\r\n\r\n this.overlayRef = overlayRef;\r\n return overlayRef;\r\n }\r\n\r\n private applyOpenState(overlayRef: OverlayRef, config: TxOverlayConfig, isOpen: boolean): void {\r\n overlayRef.updateScrollStrategy(\r\n isOpen && config.repositionOnScroll\r\n ? createRepositionScrollStrategy(this.injector)\r\n : createNoopScrollStrategy(),\r\n );\r\n\r\n if (!isOpen) {\r\n return;\r\n }\r\n\r\n this.applyWidth(overlayRef, config.width);\r\n overlayRef.updatePosition();\r\n }\r\n\r\n private applyWidth(overlayRef: OverlayRef, width: TxOverlayWidth): void {\r\n if (width === 'content') {\r\n return;\r\n }\r\n const triggerWidth = this.originElement.getBoundingClientRect().width;\r\n overlayRef.updateSize(\r\n width === 'trigger' ? { width: triggerWidth } : { minWidth: triggerWidth },\r\n );\r\n }\r\n}\r\n\r\n/* -------------------------------------------------------------------------- *\r\n * Placement ladders\r\n *\r\n * Each preferred placement lists its fallbacks in order. The per-position\r\n * `panelClass` is what creates the gap between trigger and popup: the class\r\n * applies padding from a spacing token on the pane, so the gap stays a design\r\n * token instead of a pixel constant compiled into TypeScript.\r\n * -------------------------------------------------------------------------- */\r\n\r\ntype Gap = TxOverlayConfig['gap'];\r\n\r\nfunction gapClass(edge: 'top' | 'bottom' | 'left' | 'right', gap: Gap): string[] {\r\n return gap === 'none' ? [] : [`tx-overlay-gap-${edge}-${gap}`];\r\n}\r\n\r\nfunction below(x: 'start' | 'end' | 'center', gap: Gap): ConnectedPosition {\r\n return {\r\n originX: x,\r\n originY: 'bottom',\r\n overlayX: x,\r\n overlayY: 'top',\r\n panelClass: gapClass('top', gap),\r\n };\r\n}\r\n\r\nfunction above(x: 'start' | 'end' | 'center', gap: Gap): ConnectedPosition {\r\n return {\r\n originX: x,\r\n originY: 'top',\r\n overlayX: x,\r\n overlayY: 'bottom',\r\n panelClass: gapClass('bottom', gap),\r\n };\r\n}\r\n\r\nfunction positionsFor(placement: TxOverlayPlacement, gap: Gap): ConnectedPosition[] {\r\n switch (placement) {\r\n case 'bottom-start':\r\n return [below('start', gap), above('start', gap), below('end', gap), above('end', gap)];\r\n case 'bottom-end':\r\n return [below('end', gap), above('end', gap), below('start', gap), above('start', gap)];\r\n case 'bottom-center':\r\n return [below('center', gap), above('center', gap), below('start', gap), above('start', gap)];\r\n case 'top-start':\r\n return [above('start', gap), below('start', gap), above('end', gap), below('end', gap)];\r\n case 'top-end':\r\n return [above('end', gap), below('end', gap), above('start', gap), below('start', gap)];\r\n case 'top-center':\r\n return [above('center', gap), below('center', gap), above('start', gap), below('start', gap)];\r\n case 'right-start':\r\n return [\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n panelClass: gapClass('left', gap),\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n panelClass: gapClass('right', gap),\r\n },\r\n below('start', gap),\r\n ];\r\n case 'left-start':\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n panelClass: gapClass('right', gap),\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n panelClass: gapClass('left', gap),\r\n },\r\n below('end', gap),\r\n ];\r\n }\r\n}\r\n\r\n/**\r\n * Resolves a spacing token to pixels for the few CDK options that only accept\r\n * numbers. Reads the token rather than duplicating its value, so re-spacing the\r\n * kit through `theme.css` moves the viewport margin too.\r\n */\r\nfunction readTokenPx(element: HTMLElement, token: string): number {\r\n const raw = getComputedStyle(element).getPropertyValue(token).trim();\r\n if (!raw) {\r\n return 0;\r\n }\r\n const value = Number.parseFloat(raw);\r\n if (Number.isNaN(value)) {\r\n return 0;\r\n }\r\n if (raw.endsWith('rem')) {\r\n const rootSize = Number.parseFloat(getComputedStyle(document.documentElement).fontSize);\r\n return value * (Number.isNaN(rootSize) ? 16 : rootSize);\r\n }\r\n return value;\r\n}\r\n","/**\r\n * A registered icon.\r\n *\r\n * Only the *inner* markup is stored — the `<svg>` wrapper, its viewBox and its\r\n * paint attributes are rendered by `TxIconComponent`, so a registered icon can\r\n * never override the element's sizing or accessibility attributes.\r\n */\r\nexport interface TxIconDefinition {\r\n /**\r\n * Inner SVG markup: `<path>`, `<circle>`, `<rect>`, `<g>` and friends.\r\n * Must NOT include an `<svg>` wrapper.\r\n */\r\n body: string;\r\n /** Defaults to the kit's 24x24 grid. */\r\n viewBox?: string;\r\n /**\r\n * `stroke` (default) matches the kit's line-drawn icon language;\r\n * `fill` suits solid glyphs and brand marks.\r\n */\r\n paint?: 'stroke' | 'fill';\r\n}\r\n\r\n/** Icon size, aligned to the control heights so icons sit on the text baseline. */\r\nexport type TxIconSize = 'sm' | 'md' | 'lg' | 'inherit';\r\n\r\n/**\r\n * Simple property configuration for {@link TxIconComponent}.\r\n *\r\n * `name` is genuinely required — an icon with no name has nothing to draw.\r\n */\r\nexport interface TxIconConfig {\r\n /** Registered icon name. Unknown names render nothing and warn in dev mode. */\r\n name: string;\r\n /** Defaults to `md`. `inherit` scales with the surrounding font size. */\r\n size?: TxIconSize;\r\n /**\r\n * Accessible label. Omit for decorative icons (the default), which are\r\n * marked `aria-hidden` so screen readers skip them.\r\n */\r\n label?: string;\r\n}\r\n\r\nexport const TX_ICON_DEFAULTS = {\r\n size: 'md',\r\n} as const satisfies Partial<TxIconConfig>;\r\n","import { TxIconDefinition } from './icon.types';\r\n\r\n/**\r\n * The icon set every consumer gets for free.\r\n *\r\n * Drawn on a 24x24 grid in one line-drawn language (round caps and joins,\r\n * `currentColor` stroke) so a mixed row of icons reads as one family. Names are\r\n * descriptive of the glyph, never of a use case — `clipboard-check`, not\r\n * `reports` — so no application's vocabulary leaks into the library.\r\n *\r\n * Register your own with `TxIconRegistry.register()`; a custom icon of the same\r\n * name replaces the default.\r\n */\r\nexport const TX_DEFAULT_ICONS: Readonly<Record<string, TxIconDefinition>> = {\r\n /* ---- direction ----\r\n * Each chevron is centred on the 24x24 grid — 6 units either side of 12 on\r\n * both axes. A chevron drawn off-centre visibly jumps when a dropdown\r\n * trigger rotates it 180 degrees, because the rotation happens about the\r\n * box's centre rather than the glyph's. */\r\n 'chevron-down': { body: '<path d=\"M6 9l6 6 6-6\"/>' },\r\n 'chevron-up': { body: '<path d=\"M18 15l-6-6-6 6\"/>' },\r\n 'chevron-left': { body: '<path d=\"M15 18l-6-6 6-6\"/>' },\r\n 'chevron-right': { body: '<path d=\"M9 6l6 6-6 6\"/>' },\r\n 'chevrons-left': { body: '<path d=\"M11 18l-6-6 6-6\"/><path d=\"M19 18l-6-6 6-6\"/>' },\r\n 'chevrons-right': { body: '<path d=\"M13 6l6 6-6 6\"/><path d=\"M5 6l6 6-6 6\"/>' },\r\n 'arrow-left': { body: '<path d=\"M19 12H5\"/><path d=\"M11 18l-6-6 6-6\"/>' },\r\n 'arrow-right': { body: '<path d=\"M5 12h14\"/><path d=\"M13 6l6 6-6 6\"/>' },\r\n 'arrow-up': { body: '<path d=\"M12 19V5\"/><path d=\"M6 11l6-6 6 6\"/>' },\r\n 'arrow-down': { body: '<path d=\"M12 5v14\"/><path d=\"M18 13l-6 6-6-6\"/>' },\r\n\r\n /* ---- status & feedback ---- */\r\n check: { body: '<path d=\"M4.5 12.5l5 5 10-11\"/>' },\r\n 'check-circle': { body: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M8 12.2l2.7 2.7L16 9.5\"/>' },\r\n close: { body: '<path d=\"M6 6l12 12M18 6L6 18\"/>' },\r\n 'x-circle': { body: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M9 9l6 6M15 9l-6 6\"/>' },\r\n info: { body: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5.5\"/><path d=\"M12 7.6h.01\"/>' },\r\n 'alert-triangle': {\r\n body: '<path d=\"M12 4.2 2.8 19.4h18.4z\"/><path d=\"M12 10v4.2\"/><path d=\"M12 17.3h.01\"/>',\r\n },\r\n 'alert-circle': {\r\n body: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7.5v5.2\"/><path d=\"M12 16.4h.01\"/>',\r\n },\r\n 'help-circle': {\r\n body: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M9.6 9.6a2.5 2.5 0 1 1 3.3 2.4c-.6.2-.9.8-.9 1.4v.4\"/><path d=\"M12 16.8h.01\"/>',\r\n },\r\n\r\n /* ---- actions ---- */\r\n plus: { body: '<path d=\"M12 5v14M5 12h14\"/>' },\r\n minus: { body: '<path d=\"M5 12h14\"/>' },\r\n edit: {\r\n body: '<path d=\"M4.5 19.5h3.6L19.3 8.3a1.9 1.9 0 0 0 0-2.7l-.9-.9a1.9 1.9 0 0 0-2.7 0L4.5 15.9v3.6z\"/><path d=\"M14.3 6.7l3.6 3.6\"/>',\r\n },\r\n trash: {\r\n body: '<path d=\"M4 7h16\"/><path d=\"M10 4h4a1 1 0 0 1 1 1v2H9V5a1 1 0 0 1 1-1z\"/><path d=\"M6.5 7l.9 12a2 2 0 0 0 2 1.9h5.2a2 2 0 0 0 2-1.9l.9-12\"/><path d=\"M10 11v6M14 11v6\"/>',\r\n },\r\n eye: { body: '<path d=\"M2 12s3.6-6.6 10-6.6S22 12 22 12s-3.6 6.6-10 6.6S2 12 2 12z\"/><circle cx=\"12\" cy=\"12\" r=\"2.9\"/>' },\r\n 'eye-off': {\r\n body: '<path d=\"M10.6 6.6A9.9 9.9 0 0 1 12 5.4c6.4 0 10 6.6 10 6.6a18 18 0 0 1-3.1 4\"/><path d=\"M6.4 7.9A17.6 17.6 0 0 0 2 12s3.6 6.6 10 6.6a9.8 9.8 0 0 0 4-.8\"/><path d=\"M9.9 9.9a2.9 2.9 0 0 0 4.1 4.1\"/><path d=\"M3 3l18 18\"/>',\r\n },\r\n search: { body: '<circle cx=\"11\" cy=\"11\" r=\"6.4\"/><path d=\"M15.6 15.6 20.5 20.5\"/>' },\r\n filter: { body: '<path d=\"M3.5 5.5h17l-6.6 7.6v5.6l-3.8 2v-7.6z\"/>' },\r\n download: { body: '<path d=\"M12 4v11\"/><path d=\"M7.5 10.5 12 15l4.5-4.5\"/><path d=\"M4.5 19.5h15\"/>' },\r\n upload: { body: '<path d=\"M12 20V9\"/><path d=\"M7.5 13.5 12 9l4.5 4.5\"/><path d=\"M4.5 4.5h15\"/>' },\r\n refresh: {\r\n body: '<path d=\"M20 12a8 8 0 1 1-2.3-5.6\"/><path d=\"M20 4v4.6h-4.6\"/>',\r\n },\r\n copy: {\r\n body: '<rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M15 9V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3\"/>',\r\n },\r\n 'external-link': {\r\n body: '<path d=\"M14 4h6v6\"/><path d=\"M20 4 11 13\"/><path d=\"M18 14v4a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4\"/>',\r\n },\r\n 'drag-handle': {\r\n body: '<circle cx=\"9\" cy=\"6\" r=\"1.4\"/><circle cx=\"15\" cy=\"6\" r=\"1.4\"/><circle cx=\"9\" cy=\"12\" r=\"1.4\"/><circle cx=\"15\" cy=\"12\" r=\"1.4\"/><circle cx=\"9\" cy=\"18\" r=\"1.4\"/><circle cx=\"15\" cy=\"18\" r=\"1.4\"/>',\r\n paint: 'fill',\r\n },\r\n 'dots-vertical': {\r\n body: '<circle cx=\"12\" cy=\"5.5\" r=\"1.5\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\"/><circle cx=\"12\" cy=\"18.5\" r=\"1.5\"/>',\r\n paint: 'fill',\r\n },\r\n menu: { body: '<path d=\"M4 7h16M4 12h16M4 17h16\"/>' },\r\n\r\n /* ---- sorting ---- */\r\n 'sort-ascending': { body: '<path d=\"M8 18V6\"/><path d=\"M4.5 9.5 8 6l3.5 3.5\"/><path d=\"M14 8h6M14 12h5M14 16h4\"/>' },\r\n 'sort-descending': { body: '<path d=\"M8 6v12\"/><path d=\"M4.5 14.5 8 18l3.5-3.5\"/><path d=\"M14 8h6M14 12h5M14 16h4\"/>' },\r\n 'sort-none': { body: '<path d=\"M9 9.5 12 6l3 3.5\"/><path d=\"M9 14.5 12 18l3-3.5\"/>' },\r\n\r\n /* ---- objects & navigation ---- */\r\n calendar: {\r\n body: '<rect x=\"3.5\" y=\"5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M3.5 9.5h17\"/><path d=\"M8 3.5v3M16 3.5v3\"/>',\r\n },\r\n clock: { body: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.2V12l3.2 2\"/>' },\r\n user: { body: '<circle cx=\"12\" cy=\"8\" r=\"3.4\"/><path d=\"M5 19.5c0-3.2 3.1-5 7-5s7 1.8 7 5\"/>' },\r\n users: {\r\n body: '<circle cx=\"9\" cy=\"8\" r=\"3.2\"/><path d=\"M2.8 19c0-3 2.8-4.7 6.2-4.7s6.2 1.7 6.2 4.7\"/><path d=\"M16.4 11.1a3 3 0 1 0-1.1-5.6\"/><path d=\"M18 19c0-2.2-.8-3.7-2.3-4.5\"/>',\r\n },\r\n settings: {\r\n body: '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 14.4a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.9 2.9l-.1-.1a1.7 1.7 0 0 0-2.9 1.2v.2a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-3-1.2l-.1.1a2 2 0 1 1-2.9-2.9l.1-.1a1.7 1.7 0 0 0-1.2-2.9h-.2a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.2-3l-.1-.1a2 2 0 1 1 2.9-2.9l.1.1a1.7 1.7 0 0 0 2.9-1.2v-.2a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 3 1.2l.1-.1a2 2 0 1 1 2.9 2.9l-.1.1a1.7 1.7 0 0 0 1.2 2.9h.2a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.6 1.1z\"/>',\r\n },\r\n home: { body: '<path d=\"M4 10.5 12 4l8 6.5\"/><path d=\"M6 9.6V20h12V9.6\"/><path d=\"M10 20v-5h4v5\"/>' },\r\n folder: { body: '<path d=\"M3.5 7a2 2 0 0 1 2-2h3.3l2 2.4h7.7a2 2 0 0 1 2 2V18a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z\"/>' },\r\n file: { body: '<path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\"/><path d=\"M14 3v5h5\"/>' },\r\n 'file-plus': {\r\n body: '<path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\"/><path d=\"M14 3v5h5\"/><path d=\"M12 11v6M9 14h6\"/>',\r\n },\r\n 'clipboard-check': {\r\n body: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M7 9.5l2 2 3.5-3.5\"/><path d=\"M7 15h4\"/><path d=\"M14.5 15H17\"/>',\r\n },\r\n 'list-checks': {\r\n body: '<path d=\"M3 6.5 4.4 8 7 5\"/><path d=\"M3 12.5 4.4 14 7 11\"/><path d=\"M3 18.5 4.4 20 7 17\"/><path d=\"M10.5 6.5h10M10.5 12.5h10M10.5 18.5h10\"/>',\r\n },\r\n 'layout-sidebar': {\r\n body: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M9 4v16\"/>',\r\n },\r\n columns: {\r\n body: '<path d=\"M12 3 3 8h18z\"/><path d=\"M3 8h18\"/><path d=\"M6 11v6M10 11v6M14 11v6M18 11v6\"/><path d=\"M3 20h18\"/>',\r\n },\r\n toggles: {\r\n body: '<path d=\"M3 6h10M18 6h3\"/><circle cx=\"15.5\" cy=\"6\" r=\"2.1\"/><path d=\"M3 12h4M11 12h10\"/><circle cx=\"9\" cy=\"12\" r=\"2.1\"/><path d=\"M3 18h8M16 18h5\"/><circle cx=\"13.5\" cy=\"18\" r=\"2.1\"/>',\r\n },\r\n braces: {\r\n body: '<path d=\"M9 4H8a2 2 0 0 0-2 2v3.4L4 12l2 2.6V18a2 2 0 0 0 2 2h1\"/><path d=\"M15 4h1a2 2 0 0 1 2 2v3.4l2 2.6-2 2.6V18a2 2 0 0 1-2 2h-1\"/>',\r\n },\r\n tag: {\r\n body: '<path d=\"M11.6 3.5H20v8.4l-8.7 8.7a1.6 1.6 0 0 1-2.3 0l-6.1-6.1a1.6 1.6 0 0 1 0-2.3z\"/><circle cx=\"16.2\" cy=\"7.8\" r=\"1.3\"/>',\r\n },\r\n inbox: {\r\n body: '<path d=\"M3.5 13.5h4l1.4 2.6h6.2l1.4-2.6h4\"/><path d=\"M5.6 5h12.8l2.1 8.5V18a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2v-4.5z\"/>',\r\n },\r\n 'chart-bar': {\r\n body: '<path d=\"M4 20V10M10 20V4M16 20v-7M22 20H2\"/>',\r\n },\r\n logout: {\r\n body: '<path d=\"M10 4.5H6a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h4\"/><path d=\"M15 8.5l3.5 3.5L15 15.5\"/><path d=\"M18.5 12H9\"/>',\r\n },\r\n};\r\n","import { Injectable, isDevMode, signal } from '@angular/core';\r\n\r\nimport { TX_DEFAULT_ICONS } from './default-icons';\r\nimport { TxIconDefinition } from './icon.types';\r\n\r\n/** Elements an icon body is allowed to contain. Anything else is dropped. */\r\nconst ALLOWED_ELEMENTS = new Set([\r\n 'circle',\r\n 'defs',\r\n 'ellipse',\r\n 'g',\r\n 'line',\r\n 'linearGradient',\r\n 'mask',\r\n 'path',\r\n 'polygon',\r\n 'polyline',\r\n 'radialGradient',\r\n 'rect',\r\n 'stop',\r\n 'svg',\r\n 'symbol',\r\n 'title',\r\n 'use',\r\n]);\r\n\r\n/**\r\n * Holds the kit's icons and any the application registers.\r\n *\r\n * Icon bodies are parsed once into real SVG nodes and cached. Nothing goes\r\n * through `innerHTML` or `bypassSecurityTrust*`: the parsed tree is walked and\r\n * every element outside {@link ALLOWED_ELEMENTS}, every `on*` handler and every\r\n * scripting URL is stripped before the fragment is ever attached. Registering\r\n * an icon is therefore safe even for markup you did not author, though the\r\n * intended use is still SVG you control.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class TxIconRegistry {\r\n private readonly definitions = new Map<string, TxIconDefinition>(\r\n Object.entries(TX_DEFAULT_ICONS),\r\n );\r\n private readonly parsed = new Map<string, DocumentFragment>();\r\n\r\n /** Bumped on every mutation so rendered icons re-resolve their name. */\r\n readonly revision = signal(0);\r\n\r\n /** Registers (or replaces) a single icon. */\r\n register(name: string, definition: TxIconDefinition | string): void {\r\n this.definitions.set(name, typeof definition === 'string' ? { body: definition } : definition);\r\n this.parsed.delete(name);\r\n this.revision.update((value) => value + 1);\r\n }\r\n\r\n /**\r\n * Registers (or replaces) many icons at once.\r\n *\r\n * @example\r\n * ```ts\r\n * inject(TxIconRegistry).registerAll({\r\n * 'company-logo': { body: '<path d=\"…\"/>', paint: 'fill' },\r\n * });\r\n * ```\r\n */\r\n registerAll(icons: Record<string, TxIconDefinition | string>): void {\r\n for (const [name, definition] of Object.entries(icons)) {\r\n this.definitions.set(name, typeof definition === 'string' ? { body: definition } : definition);\r\n this.parsed.delete(name);\r\n }\r\n this.revision.update((value) => value + 1);\r\n }\r\n\r\n /** Whether an icon is registered under this name. */\r\n has(name: string): boolean {\r\n return this.definitions.has(name);\r\n }\r\n\r\n /** Every registered name, sorted. Useful for building an icon browser. */\r\n names(): string[] {\r\n return [...this.definitions.keys()].sort((a, b) => a.localeCompare(b));\r\n }\r\n\r\n /** The raw definition, for reading `viewBox` and `paint`. */\r\n definition(name: string): TxIconDefinition | undefined {\r\n return this.definitions.get(name);\r\n }\r\n\r\n /**\r\n * A fresh clone of the icon's sanitised nodes, ready to append.\r\n * Returns `null` for an unknown name.\r\n */\r\n resolve(name: string): DocumentFragment | null {\r\n const definition = this.definitions.get(name);\r\n if (!definition) {\r\n if (isDevMode()) {\r\n console.warn(\r\n `[tx-icon] No icon registered as \"${name}\". ` +\r\n `Register it with TxIconRegistry.register('${name}', { body: '<path …/>' }).`,\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n let fragment = this.parsed.get(name);\r\n if (!fragment) {\r\n fragment = parseIconBody(definition.body);\r\n this.parsed.set(name, fragment);\r\n }\r\n return fragment.cloneNode(true) as DocumentFragment;\r\n }\r\n}\r\n\r\n/** Parses icon markup into sanitised SVG nodes. */\r\nfunction parseIconBody(body: string): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n const doc = new DOMParser().parseFromString(\r\n `<svg xmlns=\"http://www.w3.org/2000/svg\">${body}</svg>`,\r\n 'image/svg+xml',\r\n );\r\n\r\n if (doc.querySelector('parsererror')) {\r\n if (isDevMode()) {\r\n console.warn('[tx-icon] Could not parse icon body; it is not well-formed SVG.');\r\n }\r\n return fragment;\r\n }\r\n\r\n const root = doc.documentElement;\r\n for (const child of Array.from(root.childNodes)) {\r\n const clean = sanitiseNode(child);\r\n if (clean) {\r\n fragment.appendChild(clean);\r\n }\r\n }\r\n return fragment;\r\n}\r\n\r\n/** Recursively drops disallowed elements, event handlers and scripting URLs. */\r\nfunction sanitiseNode(node: Node): Node | null {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n return node.cloneNode(false);\r\n }\r\n if (node.nodeType !== Node.ELEMENT_NODE) {\r\n return null;\r\n }\r\n\r\n const element = node as Element;\r\n if (!ALLOWED_ELEMENTS.has(element.localName)) {\r\n return null;\r\n }\r\n\r\n const clone = element.cloneNode(false) as Element;\r\n for (const attribute of Array.from(clone.attributes)) {\r\n const name = attribute.name.toLowerCase();\r\n const value = attribute.value.replace(/\\s+/g, '').toLowerCase();\r\n const isScriptUrl = value.startsWith('javascript:') || value.startsWith('data:text/html');\r\n if (name.startsWith('on') || isScriptUrl) {\r\n clone.removeAttribute(attribute.name);\r\n }\r\n }\r\n\r\n for (const child of Array.from(element.childNodes)) {\r\n const clean = sanitiseNode(child);\r\n if (clean) {\r\n clone.appendChild(clean);\r\n }\r\n }\r\n return clone;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { TxIconRegistry } from './icon-registry.service';\r\nimport { TX_ICON_DEFAULTS, TxIconConfig, TxIconSize } from './icon.types';\r\n\r\nconst SIZE_CLASSES: Record<TxIconSize, string> = {\r\n sm: 'size-tx-icon-sm',\r\n md: 'size-tx-icon-md',\r\n lg: 'size-tx-icon-lg',\r\n inherit: 'size-[1em]',\r\n};\r\n\r\n/**\r\n * Renders a registered icon.\r\n *\r\n * Decorative by default (`aria-hidden`); give the config a `label` to expose it\r\n * as an image to assistive technology. Colour comes from `currentColor`, so an\r\n * icon inherits whatever text colour its context sets — no icon ever needs a\r\n * colour of its own.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-icon [config]=\"{ name: 'chevron-down' }\" />\r\n * <tx-icon [config]=\"{ name: 'trash', size: 'sm', label: 'Delete row' }\" />\r\n * ```\r\n *\r\n * Config is a signal input, so update it by replacing the object:\r\n * `this.iconConfig = { ...this.iconConfig, name: 'check' }`.\r\n */\r\n@Component({\r\n selector: 'tx-icon',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'inline-flex shrink-0 items-center justify-center',\r\n },\r\n template: `\r\n <svg\r\n #svg\r\n [attr.viewBox]=\"viewBox()\"\r\n [class]=\"svgClass()\"\r\n [attr.aria-hidden]=\"label() ? null : 'true'\"\r\n [attr.role]=\"label() ? 'img' : null\"\r\n [attr.aria-label]=\"label()\"\r\n focusable=\"false\"\r\n ></svg>\r\n `,\r\n})\r\nexport class TxIconComponent {\r\n private readonly registry = inject(TxIconRegistry);\r\n private readonly svg = viewChild.required<ElementRef<SVGElement>>('svg');\r\n\r\n readonly config = input.required<TxIconConfig>();\r\n\r\n protected readonly label = computed(() => this.config().label ?? null);\r\n\r\n protected readonly viewBox = computed(\r\n () => this.registry.definition(this.config().name)?.viewBox ?? '0 0 24 24',\r\n );\r\n\r\n protected readonly svgClass = computed(() => {\r\n const size = this.config().size ?? TX_ICON_DEFAULTS.size;\r\n const paint = this.registry.definition(this.config().name)?.paint ?? 'stroke';\r\n return [\r\n 'block',\r\n SIZE_CLASSES[size],\r\n paint === 'stroke'\r\n ? 'fill-none stroke-current [stroke-linecap:round] [stroke-linejoin:round] [stroke-width:1.6]'\r\n : 'fill-current stroke-none',\r\n ].join(' ');\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const name = this.config().name;\r\n // Re-resolve when the application registers or replaces icons.\r\n this.registry.revision();\r\n\r\n const element = this.svg().nativeElement;\r\n element.replaceChildren();\r\n\r\n const content = this.registry.resolve(name);\r\n if (content) {\r\n element.appendChild(content);\r\n }\r\n });\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\n\r\nimport { txUniqueId } from '../core/unique-id';\r\nimport {\r\n TX_FORM_FIELD,\r\n TX_FORM_FIELD_DEFAULTS,\r\n TxFormFieldApi,\r\n TxFormFieldConfig,\r\n} from './form-field.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * Label / hint / error / required-marker chrome around a form control.\r\n *\r\n * Wraps any control — the kit's or your own — and wires up the accessible\r\n * relationships: the label's `for`, `aria-describedby` for the hint and error,\r\n * and `aria-invalid` / `aria-required` on the control. Kit controls pick these\r\n * up by injecting {@link TX_FORM_FIELD}; a plain `<input>` can use the exported\r\n * `controlId` from the template reference instead.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Part number', required: true, hint: 'As printed on the label' }\">\r\n * <tx-input [config]=\"{ placeholder: 'e.g. 44-2201' }\" [(value)]=\"partNumber\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input, so update it by replacing the object rather than\r\n * mutating it: `this.fieldConfig = { ...this.fieldConfig, error: 'Required' }`.\r\n */\r\n@Component({\r\n selector: 'tx-form-field',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{ provide: TX_FORM_FIELD, useExisting: TxFormFieldComponent }],\r\n host: {\r\n class: 'block min-w-0',\r\n },\r\n template: `\r\n <div [class]=\"wrapperClass()\">\r\n @if (label(); as text) {\r\n <label\r\n [for]=\"controlId()\"\r\n [class]=\"labelClass()\"\r\n >\r\n {{ text }}\r\n @if (required()) {\r\n <span class=\"text-tx-danger-text\" aria-hidden=\"true\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <ng-content />\r\n\r\n @if (error(); as message) {\r\n <p\r\n [id]=\"errorId\"\r\n class=\"mt-tx-1 flex items-start gap-tx-1 text-tx-xs leading-tx-snug text-tx-danger-text\"\r\n >\r\n {{ message }}\r\n </p>\r\n } @else if (hint(); as message) {\r\n <p [id]=\"hintId\" [class]=\"hintClass()\">{{ message }}</p>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class TxFormFieldComponent implements TxFormFieldApi {\r\n readonly config = input<Partial<TxFormFieldConfig>>({});\r\n\r\n private readonly resolved = computed<TxFormFieldConfig>(() =>\r\n txMergeConfig(TX_FORM_FIELD_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly hintId = txUniqueId('hint');\r\n protected readonly errorId = txUniqueId('error');\r\n\r\n /** Stable for the component's lifetime; the label's `for` and the control's `id`. */\r\n readonly controlId = computed(() => this.generatedId);\r\n private readonly generatedId = txUniqueId('control');\r\n\r\n protected readonly label = computed(() => this.resolved().label ?? null);\r\n protected readonly hint = computed(() => this.resolved().hint ?? null);\r\n protected readonly error = computed(() => nonEmpty(this.resolved().error));\r\n\r\n readonly invalid = computed(() => this.error() !== null);\r\n readonly required = computed(() => this.resolved().required === true);\r\n readonly disabled = computed(() => this.resolved().disabled === true);\r\n readonly size = computed(() => this.resolved().size ?? TX_FORM_FIELD_DEFAULTS.size);\r\n\r\n readonly describedBy = computed(() => {\r\n if (this.error()) {\r\n return this.errorId;\r\n }\r\n return this.hint() ? this.hintId : null;\r\n });\r\n\r\n protected readonly wrapperClass = computed(() =>\r\n this.resolved().layout === 'inline'\r\n ? 'flex flex-col gap-tx-1 sm:flex-row sm:items-baseline sm:gap-tx-3'\r\n : 'flex flex-col gap-tx-1-5',\r\n );\r\n\r\n protected readonly labelClass = computed(() => {\r\n const base =\r\n 'font-tx-mono text-tx-2xs uppercase tracking-tx-widest ' +\r\n (this.disabled() ? 'text-tx-text-disabled' : 'text-tx-text-muted');\r\n const layout =\r\n this.resolved().layout === 'inline' ? 'sm:w-tx-sidebar sm:shrink-0 sm:pt-tx-2' : '';\r\n const hidden = this.resolved().labelVisibility === 'screen-reader-only' ? 'sr-only' : '';\r\n return [base, layout, hidden].filter(Boolean).join(' ');\r\n });\r\n\r\n protected readonly hintClass = computed(\r\n () =>\r\n 'mt-tx-1 text-tx-xs leading-tx-snug ' +\r\n (this.disabled() ? 'text-tx-text-disabled' : 'text-tx-text-muted'),\r\n );\r\n}\r\n\r\nfunction nonEmpty(value: string | undefined): string | null {\r\n return value && value.trim().length > 0 ? value : null;\r\n}\r\n","/**\r\n * Visual weight of a button.\r\n *\r\n * `primary` is the emphasis action (outlined in the brand colour, filling on\r\n * hover); `accent` is the solid dark button used for a page's single dominant\r\n * action; `secondary` is the neutral outlined default; `ghost` is the quiet\r\n * action that only gains a border on hover; `danger` is destructive.\r\n */\r\nexport type TxButtonVariant = 'primary' | 'accent' | 'secondary' | 'ghost' | 'danger';\r\n\r\nexport type TxButtonSize = 'sm' | 'md' | 'lg';\r\n\r\n/** Where an icon sits relative to the label. */\r\nexport type TxButtonIconPosition = 'leading' | 'trailing';\r\n\r\n/**\r\n * Whether the label is rendered or used only as the accessible name.\r\n * `icon-only` requires `icon` to be set.\r\n */\r\nexport type TxButtonDisplay = 'label' | 'icon-only';\r\n\r\n/**\r\n * Simple property configuration for {@link TxButtonComponent}.\r\n *\r\n * `label` is genuinely required, including for `icon-only` buttons where it\r\n * becomes the accessible name — an unlabelled icon button is unusable with a\r\n * screen reader, so there is no way to omit it.\r\n */\r\nexport interface TxButtonConfig {\r\n label: string;\r\n /** Defaults to `secondary`. */\r\n variant?: TxButtonVariant;\r\n /** Defaults to `md`. */\r\n size?: TxButtonSize;\r\n /** Registered icon name. */\r\n icon?: string;\r\n /** Defaults to `leading`. Ignored when `display` is `icon-only`. */\r\n iconPosition?: TxButtonIconPosition;\r\n /** Defaults to `label`. */\r\n display?: TxButtonDisplay;\r\n /** Native button type. Defaults to `button` so it never submits by accident. */\r\n type?: 'button' | 'submit' | 'reset';\r\n /** Defaults to `auto`. `full` stretches to the container. */\r\n width?: 'auto' | 'full';\r\n disabled?: boolean;\r\n /** Swaps the icon for a spinner, marks `aria-busy` and blocks activation. */\r\n loading?: boolean;\r\n}\r\n\r\nexport const TX_BUTTON_DEFAULTS = {\r\n variant: 'secondary',\r\n size: 'md',\r\n iconPosition: 'leading',\r\n display: 'label',\r\n type: 'button',\r\n width: 'auto',\r\n} as const satisfies Partial<TxButtonConfig>;\r\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Diameter of the spinner, aligned to the icon sizes. */\r\nexport type TxSpinnerSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Colour of the spinner. `current` inherits the surrounding text colour, which\r\n * is what lets the same component sit inside a button of any variant.\r\n */\r\nexport type TxSpinnerTone = 'current' | 'primary' | 'muted' | 'inverse';\r\n\r\n/** Simple property configuration for {@link TxSpinnerComponent}. */\r\nexport interface TxSpinnerConfig {\r\n /** Defaults to `md`. */\r\n size?: TxSpinnerSize;\r\n /** Defaults to `current`. */\r\n tone?: TxSpinnerTone;\r\n /**\r\n * Accessible label announced to screen readers. Defaults to `Loading`.\r\n * Set `labelVisibility: 'visible'` to also show it beside the spinner.\r\n */\r\n label?: string;\r\n /** Defaults to `screen-reader-only`. */\r\n labelVisibility?: 'visible' | 'screen-reader-only';\r\n}\r\n\r\nexport const TX_SPINNER_DEFAULTS = {\r\n size: 'md',\r\n tone: 'current',\r\n label: 'Loading',\r\n labelVisibility: 'screen-reader-only',\r\n} as const satisfies TxSpinnerConfig;\r\n\r\nconst SIZE_CLASSES: Record<TxSpinnerSize, string> = {\r\n sm: 'size-tx-icon-sm',\r\n md: 'size-tx-icon-md',\r\n lg: 'size-tx-icon-lg',\r\n};\r\n\r\nconst TONE_CLASSES: Record<TxSpinnerTone, string> = {\r\n current: 'text-current',\r\n primary: 'text-tx-primary',\r\n muted: 'text-tx-text-muted',\r\n inverse: 'text-tx-text-inverse',\r\n};\r\n\r\n/**\r\n * An indeterminate loading indicator.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-spinner [config]=\"{ size: 'lg', tone: 'primary', label: 'Loading reports' }\" />\r\n * ```\r\n *\r\n * Config is a signal input — update it by replacing the object:\r\n * `this.spinnerConfig = { ...this.spinnerConfig, size: 'sm' }`.\r\n */\r\n@Component({\r\n selector: 'tx-spinner',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'inline-flex items-center gap-tx-2',\r\n role: 'status',\r\n },\r\n template: `\r\n <svg\r\n [class]=\"svgClass()\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"9.5\"\r\n class=\"stroke-current opacity-25\"\r\n fill=\"none\"\r\n [attr.stroke-width]=\"2\"\r\n />\r\n <path\r\n d=\"M21.5 12a9.5 9.5 0 0 0-9.5-9.5\"\r\n class=\"stroke-current\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n [attr.stroke-width]=\"2\"\r\n />\r\n </svg>\r\n <span [class]=\"labelClass()\">{{ label() }}</span>\r\n `,\r\n})\r\nexport class TxSpinnerComponent {\r\n readonly config = input<Partial<TxSpinnerConfig>>({});\r\n\r\n private readonly resolved = computed<TxSpinnerConfig>(() =>\r\n txMergeConfig(TX_SPINNER_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly label = computed(() => this.resolved().label);\r\n\r\n protected readonly svgClass = computed(() => {\r\n const { size, tone } = this.resolved();\r\n return [\r\n 'block animate-spin',\r\n SIZE_CLASSES[size ?? TX_SPINNER_DEFAULTS.size],\r\n TONE_CLASSES[tone ?? TX_SPINNER_DEFAULTS.tone],\r\n ].join(' ');\r\n });\r\n\r\n protected readonly labelClass = computed(() =>\r\n this.resolved().labelVisibility === 'visible'\r\n ? 'text-tx-base text-tx-text-muted'\r\n : 'sr-only',\r\n );\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TxSpinnerComponent } from '../spinner/spinner.component';\r\nimport {\r\n TX_BUTTON_DEFAULTS,\r\n TxButtonConfig,\r\n TxButtonSize,\r\n TxButtonVariant,\r\n} from './button.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * Per-variant classes. Every hover affordance is paired with a focus-visible\r\n * counterpart so a keyboard user sees the same state a mouse user does.\r\n */\r\nconst VARIANT_CLASSES: Record<TxButtonVariant, string> = {\r\n primary:\r\n 'border border-tx-primary bg-tx-surface font-semibold text-tx-primary-text ' +\r\n 'hover:bg-tx-primary hover:text-tx-text-on-primary ' +\r\n 'focus-visible:bg-tx-primary focus-visible:text-tx-text-on-primary ' +\r\n 'active:bg-tx-primary-hover active:text-tx-text-on-primary',\r\n accent:\r\n 'border border-transparent bg-tx-accent font-medium text-tx-text-on-accent ' +\r\n 'hover:bg-tx-accent-hover focus-visible:bg-tx-accent-hover active:bg-tx-accent-active',\r\n secondary:\r\n 'border border-tx-border bg-tx-surface font-medium text-tx-text-primary ' +\r\n 'hover:border-tx-border-strong focus-visible:border-tx-border-strong ' +\r\n 'active:bg-tx-surface-sunken',\r\n ghost:\r\n 'border border-transparent bg-transparent font-medium text-tx-text-muted ' +\r\n 'hover:border-tx-border hover:bg-tx-surface-sunken hover:text-tx-text-primary ' +\r\n 'focus-visible:border-tx-border focus-visible:text-tx-text-primary ' +\r\n 'active:bg-tx-hover-fill',\r\n danger:\r\n 'border border-tx-danger-border bg-tx-surface font-medium text-tx-danger-text ' +\r\n 'hover:bg-tx-danger hover:text-tx-text-on-danger ' +\r\n 'focus-visible:bg-tx-danger focus-visible:text-tx-text-on-danger ' +\r\n 'active:bg-tx-danger-hover active:text-tx-text-on-danger',\r\n};\r\n\r\nconst SIZE_CLASSES: Record<TxButtonSize, string> = {\r\n sm: 'h-tx-control-sm gap-tx-1-5 px-tx-2-5 text-tx-sm',\r\n md: 'h-tx-control-md gap-tx-2 px-tx-3-5 text-tx-md',\r\n lg: 'h-tx-control-lg gap-tx-2 px-tx-4 text-tx-lg',\r\n};\r\n\r\nconst ICON_ONLY_SIZE_CLASSES: Record<TxButtonSize, string> = {\r\n sm: 'size-tx-control-sm',\r\n md: 'size-tx-control-md',\r\n lg: 'size-tx-control-lg',\r\n};\r\n\r\nconst ICON_SIZE: Record<TxButtonSize, 'sm' | 'md' | 'lg'> = {\r\n sm: 'sm',\r\n md: 'md',\r\n lg: 'md',\r\n};\r\n\r\n/**\r\n * A button.\r\n *\r\n * Renders a native `<button>`, so keyboard activation, form participation and\r\n * the disabled semantics are the platform's rather than ours.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-button [config]=\"saveConfig\" (clicked)=\"save()\" />\r\n * ```\r\n * ```ts\r\n * saveConfig: TxButtonConfig = { label: 'Save', variant: 'primary', icon: 'check' };\r\n * ```\r\n *\r\n * Config is a signal input, so updates happen by passing a new object\r\n * reference, never by mutating in place:\r\n * ```ts\r\n * this.saveConfig = { ...this.saveConfig, loading: true };\r\n * ```\r\n */\r\n@Component({\r\n selector: 'tx-button',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent, TxSpinnerComponent],\r\n host: {\r\n '[class]': 'hostClass()',\r\n },\r\n template: `\r\n <button\r\n [type]=\"type()\"\r\n [class]=\"buttonClass()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-busy]=\"loading() ? 'true' : null\"\r\n [attr.aria-label]=\"iconOnly() ? label() : null\"\r\n [title]=\"iconOnly() ? label() : ''\"\r\n (click)=\"clicked.emit($event)\"\r\n >\r\n @if (loading()) {\r\n <tx-spinner [config]=\"{ size: iconSize(), tone: 'current', label: label() }\" />\r\n } @else if (icon(); as name) {\r\n @if (iconPosition() === 'leading' || iconOnly()) {\r\n <tx-icon [config]=\"{ name, size: iconSize() }\" />\r\n }\r\n }\r\n\r\n @if (!iconOnly()) {\r\n <span class=\"truncate\">{{ label() }}</span>\r\n }\r\n\r\n @if (!loading() && !iconOnly() && iconPosition() === 'trailing' && icon(); as name) {\r\n <tx-icon [config]=\"{ name, size: iconSize() }\" />\r\n }\r\n </button>\r\n `,\r\n})\r\nexport class TxButtonComponent {\r\n readonly config = input.required<TxButtonConfig>();\r\n\r\n /** Native click. Behaviour never lives in the config object. */\r\n readonly clicked = output<MouseEvent>();\r\n\r\n private readonly resolved = computed<TxButtonConfig>(() =>\r\n txMergeConfig(TX_BUTTON_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly label = computed(() => this.resolved().label);\r\n protected readonly icon = computed(() => this.resolved().icon ?? null);\r\n protected readonly iconPosition = computed(() => this.resolved().iconPosition);\r\n protected readonly type = computed(() => this.resolved().type);\r\n protected readonly loading = computed(() => this.resolved().loading === true);\r\n protected readonly iconOnly = computed(() => this.resolved().display === 'icon-only');\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.loading(),\r\n );\r\n\r\n protected readonly iconSize = computed(\r\n () => ICON_SIZE[this.resolved().size ?? TX_BUTTON_DEFAULTS.size],\r\n );\r\n\r\n protected readonly hostClass = computed(() =>\r\n this.resolved().width === 'full' ? 'block w-full' : 'inline-block',\r\n );\r\n\r\n protected readonly buttonClass = computed(() => {\r\n const { variant, size, width } = this.resolved();\r\n const key = variant ?? TX_BUTTON_DEFAULTS.variant;\r\n const sizeKey = size ?? TX_BUTTON_DEFAULTS.size;\r\n\r\n return [\r\n 'inline-flex cursor-pointer items-center justify-center rounded-tx-sm',\r\n 'leading-tx-tight whitespace-nowrap',\r\n 'transition-colors duration-150 ease-tx-standard',\r\n // Disabled is the native attribute, so this reads real platform state\r\n // rather than a class we toggle from TypeScript.\r\n 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-45',\r\n this.iconOnly() ? ICON_ONLY_SIZE_CLASSES[sizeKey] : SIZE_CLASSES[sizeKey],\r\n VARIANT_CLASSES[key],\r\n width === 'full' ? 'w-full' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n}\r\n","import { TxControlSize } from '../core/control-classes';\r\n\r\n/** Text-like input types. Checkbox/radio/date have their own components. */\r\nexport type TxInputType = 'text' | 'email' | 'password' | 'search' | 'tel' | 'url' | 'number';\r\n\r\n/**\r\n * Simple property configuration for {@link TxInputComponent}.\r\n *\r\n * Everything is optional: `<tx-input />` with no config is a valid text box.\r\n */\r\nexport interface TxInputConfig {\r\n /** Defaults to `text`. */\r\n type?: TxInputType;\r\n placeholder?: string;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n /**\r\n * Marks the input required. A surrounding form field's `required` also\r\n * applies, so this only needs setting on a bare input.\r\n */\r\n required?: boolean;\r\n /**\r\n * Forces the error appearance on a bare input. Inside a form field the\r\n * field's `error` message already drives this, and the two are OR'd.\r\n */\r\n invalid?: boolean;\r\n /** Registered icon name shown inside the leading edge. */\r\n iconStart?: string;\r\n /** Registered icon name shown inside the trailing edge. */\r\n iconEnd?: string;\r\n /** Shows a clear button once the input has a value. */\r\n clearable?: boolean;\r\n /** Native `name`, for uncontrolled form submission. */\r\n name?: string;\r\n /** Native `autocomplete` token. */\r\n autocomplete?: string;\r\n maxLength?: number;\r\n /** Native `min`/`max`/`step`, meaningful for `type: 'number'`. */\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n /** Accessible name for a bare input with no surrounding form field. */\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_INPUT_DEFAULTS = {\r\n type: 'text',\r\n} as const satisfies Partial<TxInputConfig>;\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { CONTROL_ICON_SIZE, txControlShellClass } from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TX_INPUT_DEFAULTS, TxInputConfig } from './input.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * A single-line text input.\r\n *\r\n * Renders a native `<input>`. Works three ways: with `[(value)]`, with\r\n * `[formControl]` / `formControlName`, or uncontrolled with a `name`.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Part number', required: true }\">\r\n * <tx-input [config]=\"{ placeholder: 'e.g. 44-2201', iconStart: 'search', clearable: true }\"\r\n * [(value)]=\"partNumber\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object to change it:\r\n * `this.inputConfig = { ...this.inputConfig, disabled: true }`.\r\n */\r\n@Component({\r\n selector: 'tx-input',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxInputComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div class=\"relative flex items-center\">\r\n @if (iconStart(); as name) {\r\n <span\r\n class=\"pointer-events-none absolute left-tx-2-5 flex text-tx-text-subtle\"\r\n aria-hidden=\"true\"\r\n >\r\n <tx-icon [config]=\"{ name, size: iconSize() }\" />\r\n </span>\r\n }\r\n\r\n <input\r\n #field\r\n [id]=\"fieldId()\"\r\n [type]=\"type()\"\r\n [class]=\"inputClass()\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"isReadonly()\"\r\n [attr.placeholder]=\"placeholder()\"\r\n [attr.name]=\"config().name ?? null\"\r\n [attr.autocomplete]=\"config().autocomplete ?? null\"\r\n [attr.maxlength]=\"config().maxLength ?? null\"\r\n [attr.min]=\"config().min ?? null\"\r\n [attr.max]=\"config().max ?? null\"\r\n [attr.step]=\"config().step ?? null\"\r\n [attr.inputmode]=\"type() === 'number' ? 'decimal' : null\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n (input)=\"onInput($event)\"\r\n (change)=\"changed.emit(value())\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n @if (showClear()) {\r\n <button\r\n type=\"button\"\r\n class=\"absolute right-tx-1-5 inline-grid cursor-pointer place-items-center\r\n rounded-tx-xs p-tx-1 text-tx-text-subtle transition-colors\r\n hover:bg-tx-hover-fill hover:text-tx-text-primary\r\n focus-visible:bg-tx-hover-fill focus-visible:text-tx-text-primary\"\r\n [attr.aria-label]=\"'Clear'\"\r\n (click)=\"clear()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n } @else if (iconEnd(); as name) {\r\n <span\r\n class=\"pointer-events-none absolute right-tx-2-5 flex text-tx-text-subtle\"\r\n aria-hidden=\"true\"\r\n >\r\n <tx-icon [config]=\"{ name, size: iconSize() }\" />\r\n </span>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TxInputComponent implements ControlValueAccessor {\r\n readonly config = input<Partial<TxInputConfig>>({});\r\n\r\n /** Two-way bindable value. Also driven by `formControl` via CVA. */\r\n readonly value = model('');\r\n\r\n /** Fires on the native `change` event, i.e. on commit rather than per key. */\r\n readonly changed = output<string>();\r\n /** Fires when the clear button empties the input. */\r\n readonly cleared = output<void>();\r\n\r\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\r\n private readonly formField = txBindFormField('input');\r\n private readonly forms = new TxControlValueBridge<string>((next) => this.value.set(next ?? ''));\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n\r\n private readonly resolved = computed<TxInputConfig>(() =>\r\n txMergeConfig(TX_INPUT_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly type = computed(() => this.resolved().type);\r\n protected readonly placeholder = computed(() => this.resolved().placeholder ?? null);\r\n protected readonly iconStart = computed(() => this.resolved().iconStart ?? null);\r\n protected readonly iconEnd = computed(() => this.resolved().iconEnd ?? null);\r\n protected readonly isReadonly = computed(() => this.resolved().readonly === true);\r\n\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n protected readonly iconSize = computed(() => CONTROL_ICON_SIZE[this.size()]);\r\n\r\n protected readonly showClear = computed(\r\n () =>\r\n this.resolved().clearable === true &&\r\n this.value().length > 0 &&\r\n !this.isDisabled() &&\r\n !this.isReadonly(),\r\n );\r\n\r\n protected readonly inputClass = computed(() => {\r\n const size = this.size();\r\n return [\r\n txControlShellClass({ size, invalid: this.isInvalid() }),\r\n this.iconStart() ? PADDING_START[size] : '',\r\n this.iconEnd() || this.showClear() ? PADDING_END[size] : '',\r\n 'read-only:bg-tx-surface-sunken read-only:text-tx-text-muted',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n /** Moves focus into the input. */\r\n focus(): void {\r\n this.field().nativeElement.focus();\r\n }\r\n\r\n protected onInput(event: Event): void {\r\n const next = (event.target as HTMLInputElement).value;\r\n this.value.set(next);\r\n this.forms.emit(next);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.forms.touch();\r\n }\r\n\r\n protected clear(): void {\r\n this.value.set('');\r\n this.forms.emit('');\r\n this.cleared.emit();\r\n this.focus();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: string): void {\r\n this.forms.writeValue(value);\r\n }\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n\r\n/** Extra inline padding so text clears an icon slot. */\r\nconst PADDING_START: Record<'sm' | 'md' | 'lg', string> = {\r\n sm: 'pl-tx-7',\r\n md: 'pl-tx-8',\r\n lg: 'pl-tx-8',\r\n};\r\n\r\nconst PADDING_END: Record<'sm' | 'md' | 'lg', string> = {\r\n sm: 'pr-tx-7',\r\n md: 'pr-tx-8',\r\n lg: 'pr-tx-8',\r\n};\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n effect,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { TxControlSize, txControlShellClass } from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** How the textarea handles growth. */\r\nexport type TxTextareaResize = 'vertical' | 'none' | 'auto';\r\n\r\n/** Simple property configuration for {@link TxTextareaComponent}. */\r\nexport interface TxTextareaConfig {\r\n placeholder?: string;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Visible rows before scrolling. Defaults to 3. */\r\n rows?: number;\r\n /**\r\n * `vertical` (default) lets the user drag to resize; `none` locks the height;\r\n * `auto` grows the textarea to fit its content and hides the drag handle.\r\n */\r\n resize?: TxTextareaResize;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n required?: boolean;\r\n invalid?: boolean;\r\n maxLength?: number;\r\n /** Shows a live \"n / max\" counter. Requires `maxLength`. */\r\n showCount?: boolean;\r\n name?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_TEXTAREA_DEFAULTS = {\r\n rows: 3,\r\n resize: 'vertical',\r\n} as const satisfies Partial<TxTextareaConfig>;\r\n\r\nconst RESIZE_CLASSES: Record<TxTextareaResize, string> = {\r\n vertical: 'resize-y',\r\n none: 'resize-none',\r\n auto: 'resize-none overflow-hidden',\r\n};\r\n\r\n/**\r\n * A multi-line text input.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Failure description', required: true }\">\r\n * <tx-textarea [config]=\"{ rows: 5, maxLength: 500, showCount: true }\"\r\n * [(value)]=\"description\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-textarea',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxTextareaComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <textarea\r\n #field\r\n [id]=\"fieldId()\"\r\n [class]=\"textareaClass()\"\r\n [rows]=\"rows()\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"isReadonly()\"\r\n [attr.placeholder]=\"placeholder()\"\r\n [attr.name]=\"config().name ?? null\"\r\n [attr.maxlength]=\"config().maxLength ?? null\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n (input)=\"onInput($event)\"\r\n (change)=\"changed.emit(value())\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n\r\n @if (showCount()) {\r\n <p\r\n class=\"mt-tx-1 text-right font-tx-mono text-tx-2xs tabular-nums\"\r\n [class.text-tx-text-muted]=\"!overLimit()\"\r\n [class.text-tx-danger-text]=\"overLimit()\"\r\n aria-live=\"polite\"\r\n >\r\n {{ value().length }} / {{ config().maxLength }}\r\n </p>\r\n }\r\n `,\r\n})\r\nexport class TxTextareaComponent implements ControlValueAccessor {\r\n readonly config = input<Partial<TxTextareaConfig>>({});\r\n readonly value = model('');\r\n\r\n readonly changed = output<string>();\r\n\r\n private readonly field = viewChild.required<ElementRef<HTMLTextAreaElement>>('field');\r\n private readonly formField = txBindFormField('textarea');\r\n private readonly forms = new TxControlValueBridge<string>((next) => this.value.set(next ?? ''));\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n\r\n private readonly resolved = computed<TxTextareaConfig>(() =>\r\n txMergeConfig(TX_TEXTAREA_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly rows = computed(() => this.resolved().rows);\r\n protected readonly placeholder = computed(() => this.resolved().placeholder ?? null);\r\n protected readonly isReadonly = computed(() => this.resolved().readonly === true);\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n\r\n protected readonly showCount = computed(\r\n () => this.resolved().showCount === true && this.resolved().maxLength !== undefined,\r\n );\r\n protected readonly overLimit = computed(() => {\r\n const max = this.resolved().maxLength;\r\n return max !== undefined && this.value().length >= max;\r\n });\r\n\r\n protected readonly textareaClass = computed(() =>\r\n [\r\n txControlShellClass({ size: this.size(), invalid: this.isInvalid(), height: 'auto' }),\r\n RESIZE_CLASSES[this.resolved().resize ?? TX_TEXTAREA_DEFAULTS.resize],\r\n 'leading-tx-normal read-only:bg-tx-surface-sunken read-only:text-tx-text-muted',\r\n ].join(' '),\r\n );\r\n\r\n constructor() {\r\n // Auto-grow keeps the whole value visible without a scrollbar.\r\n effect(() => {\r\n const value = this.value();\r\n if (this.resolved().resize !== 'auto') {\r\n return;\r\n }\r\n const element = this.field().nativeElement;\r\n element.style.height = 'auto';\r\n element.style.height = `${element.scrollHeight}px`;\r\n void value;\r\n });\r\n }\r\n\r\n /** Moves focus into the textarea. */\r\n focus(): void {\r\n this.field().nativeElement.focus();\r\n }\r\n\r\n protected onInput(event: Event): void {\r\n const next = (event.target as HTMLTextAreaElement).value;\r\n this.value.set(next);\r\n this.forms.emit(next);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.forms.touch();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: string): void {\r\n this.forms.writeValue(value);\r\n }\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n effect,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { TxControlSize } from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\n\r\n/** Simple property configuration for {@link TxCheckboxComponent}. */\r\nexport interface TxCheckboxConfig {\r\n /**\r\n * Inline label beside the box. Omit when a surrounding form field already\r\n * labels the control.\r\n */\r\n label?: string;\r\n /** Second line under the label, for the \"what does this actually do\" text. */\r\n description?: string;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Defaults to `after`. */\r\n labelPosition?: 'after' | 'before';\r\n /**\r\n * Renders the mixed state. Indeterminate is a presentation of a tri-state\r\n * parent, so it is separate from `value` rather than a third value.\r\n */\r\n indeterminate?: boolean;\r\n disabled?: boolean;\r\n required?: boolean;\r\n invalid?: boolean;\r\n name?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nconst BOX_SIZE: Record<TxControlSize, string> = {\r\n sm: 'size-tx-3-5',\r\n md: 'size-tx-4',\r\n lg: 'size-tx-icon-md',\r\n};\r\n\r\nconst TEXT_SIZE: Record<TxControlSize, string> = {\r\n sm: 'text-tx-sm',\r\n md: 'text-tx-base',\r\n lg: 'text-tx-lg',\r\n};\r\n\r\n/**\r\n * A checkbox.\r\n *\r\n * A native `input[type=checkbox]` tinted with `accent-color` from the theme, so\r\n * the platform provides the checked, indeterminate, focus and disabled visuals\r\n * rather than a re-implementation of them.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-checkbox [config]=\"{ label: 'Include retired parts' }\" [(checked)]=\"includeRetired\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-checkbox',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxCheckboxComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <label [class]=\"labelClass()\">\r\n <input\r\n #box\r\n type=\"checkbox\"\r\n [id]=\"fieldId()\"\r\n [class]=\"boxClass()\"\r\n [checked]=\"checked()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.name]=\"config().name ?? null\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n (change)=\"onChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n @if (label() || description()) {\r\n <span class=\"min-w-0 flex-1\">\r\n @if (label(); as text) {\r\n <span [class]=\"textClass()\">{{ text }}</span>\r\n }\r\n @if (description(); as text) {\r\n <span class=\"mt-tx-0-5 block text-tx-xs leading-tx-snug text-tx-text-muted\">\r\n {{ text }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n </label>\r\n `,\r\n})\r\nexport class TxCheckboxComponent implements ControlValueAccessor {\r\n readonly config = input<Partial<TxCheckboxConfig>>({});\r\n readonly checked = model(false);\r\n\r\n readonly changed = output<boolean>();\r\n\r\n private readonly box = viewChild.required<ElementRef<HTMLInputElement>>('box');\r\n private readonly formField = txBindFormField('checkbox');\r\n private readonly forms = new TxControlValueBridge<boolean>((next) =>\r\n this.checked.set(next === true),\r\n );\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n\r\n private readonly resolved = computed<TxCheckboxConfig>(() => this.config());\r\n\r\n protected readonly label = computed(() => this.resolved().label ?? null);\r\n protected readonly description = computed(() => this.resolved().description ?? null);\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n\r\n protected readonly labelClass = computed(() =>\r\n [\r\n 'flex w-fit min-w-0 items-start gap-tx-2-5',\r\n this.resolved().labelPosition === 'before' ? 'flex-row-reverse' : '',\r\n this.isDisabled() ? 'cursor-not-allowed text-tx-text-disabled' : 'cursor-pointer',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly boxClass = computed(() =>\r\n [\r\n BOX_SIZE[this.size()],\r\n // A hair of top margin lines the box up with the first line of the label\r\n // at every size, rather than centring against a multi-line block.\r\n 'mt-tx-0-5 shrink-0 cursor-[inherit] accent-tx-primary-hover',\r\n 'disabled:cursor-not-allowed',\r\n this.isInvalid() ? 'accent-tx-danger outline outline-tx-danger' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly textClass = computed(() =>\r\n [TEXT_SIZE[this.size()], 'leading-tx-snug', this.isDisabled() ? '' : 'text-tx-text-primary']\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n constructor() {\r\n // `indeterminate` is a DOM property with no attribute, so it has to be set\r\n // imperatively — there is no way to bind it from the template.\r\n effect(() => {\r\n this.box().nativeElement.indeterminate = this.resolved().indeterminate === true;\r\n });\r\n }\r\n\r\n /** Moves focus onto the checkbox. */\r\n focus(): void {\r\n this.box().nativeElement.focus();\r\n }\r\n\r\n protected onChange(event: Event): void {\r\n const next = (event.target as HTMLInputElement).checked;\r\n this.checked.set(next);\r\n this.forms.emit(next);\r\n this.changed.emit(next);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.forms.touch();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: boolean): void {\r\n this.forms.writeValue(value);\r\n }\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { TxControlSize } from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { TxOption } from '../core/option';\r\nimport { txUniqueId } from '../core/unique-id';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * How each option is presented.\r\n *\r\n * `plain` is a bare radio and label; `card` is a bordered tile that tints when\r\n * selected, which reads far better when options carry descriptions.\r\n */\r\nexport type TxRadioAppearance = 'plain' | 'card';\r\n\r\n/** Simple property configuration for {@link TxRadioGroupComponent}. */\r\nexport interface TxRadioGroupConfig {\r\n /** Defaults to `vertical`. */\r\n orientation?: 'vertical' | 'horizontal';\r\n /** Defaults to `plain`. */\r\n appearance?: TxRadioAppearance;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Disables every option at once. Individual options can also be disabled. */\r\n disabled?: boolean;\r\n required?: boolean;\r\n invalid?: boolean;\r\n /** Shared `name` for the radios. Generated when omitted. */\r\n name?: string;\r\n /** Accessible name when there is no surrounding form field. */\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_RADIO_GROUP_DEFAULTS = {\r\n orientation: 'vertical',\r\n appearance: 'plain',\r\n} as const satisfies Partial<TxRadioGroupConfig>;\r\n\r\nconst TEXT_SIZE: Record<TxControlSize, string> = {\r\n sm: 'text-tx-sm',\r\n md: 'text-tx-base',\r\n lg: 'text-tx-lg',\r\n};\r\n\r\nconst BOX_SIZE: Record<TxControlSize, string> = {\r\n sm: 'size-tx-3-5',\r\n md: 'size-tx-4',\r\n lg: 'size-tx-icon-md',\r\n};\r\n\r\n/**\r\n * A group of mutually exclusive options, built from native radio inputs so\r\n * arrow-key navigation and the roving tab stop come from the platform.\r\n *\r\n * Options are passed as data through `options`, not as a config field.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Origin', required: true }\">\r\n * <tx-radio-group\r\n * [options]=\"[{ value: 'field', label: 'Field' }, { value: 'qc', label: 'QC' }]\"\r\n * [config]=\"{ orientation: 'horizontal' }\"\r\n * [(value)]=\"origin\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-radio-group',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxRadioGroupComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div\r\n role=\"radiogroup\"\r\n [class]=\"groupClass()\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n [attr.aria-orientation]=\"orientation()\"\r\n >\r\n @for (option of options(); track option.value) {\r\n <label [class]=\"optionClass(option)\">\r\n <input\r\n type=\"radio\"\r\n [name]=\"groupName()\"\r\n [class]=\"boxClass()\"\r\n [checked]=\"value() === option.value\"\r\n [disabled]=\"isOptionDisabled(option)\"\r\n [value]=\"String(option.value)\"\r\n (change)=\"select(option)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span class=\"min-w-0 flex-1\">\r\n <span [class]=\"labelClass(option)\">{{ option.label }}</span>\r\n @if (option.description; as text) {\r\n <span class=\"mt-tx-0-5 block text-tx-xs leading-tx-snug text-tx-text-muted\">\r\n {{ text }}\r\n </span>\r\n }\r\n </span>\r\n </label>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TxRadioGroupComponent<T = string> implements ControlValueAccessor {\r\n readonly config = input<Partial<TxRadioGroupConfig>>({});\r\n\r\n /** The selectable options. Data, so it is its own input. */\r\n readonly options = input.required<readonly TxOption<T>[]>();\r\n\r\n /** Currently selected value, or `null` when nothing is selected. */\r\n readonly value = model<T | null>(null);\r\n\r\n readonly changed = output<T>();\r\n\r\n private readonly formField = txBindFormField('radio-group');\r\n private readonly forms = new TxControlValueBridge<T | null>((next) => this.value.set(next));\r\n private readonly fallbackName = txUniqueId('radio');\r\n\r\n protected readonly describedBy = this.formField.describedBy;\r\n protected readonly String = String;\r\n\r\n private readonly resolved = computed<TxRadioGroupConfig>(() =>\r\n txMergeConfig(TX_RADIO_GROUP_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly orientation = computed(() => this.resolved().orientation);\r\n protected readonly groupName = computed(() => this.resolved().name ?? this.fallbackName);\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n\r\n protected readonly groupClass = computed(() =>\r\n [\r\n 'flex min-w-0',\r\n this.orientation() === 'horizontal' ? 'flex-wrap items-start gap-tx-4' : 'flex-col gap-tx-2',\r\n ].join(' '),\r\n );\r\n\r\n protected readonly boxClass = computed(() =>\r\n [\r\n BOX_SIZE[this.size()],\r\n 'mt-tx-0-5 shrink-0 cursor-[inherit] accent-tx-primary-hover disabled:cursor-not-allowed',\r\n ].join(' '),\r\n );\r\n\r\n protected isOptionDisabled(option: TxOption<T>): boolean {\r\n return this.isDisabled() || option.disabled === true;\r\n }\r\n\r\n protected optionClass(option: TxOption<T>): string {\r\n const disabled = this.isOptionDisabled(option);\r\n const selected = this.value() === option.value;\r\n const base = ['flex min-w-0 items-start gap-tx-2-5', disabled ? 'cursor-not-allowed' : 'cursor-pointer'];\r\n\r\n if (this.resolved().appearance !== 'card') {\r\n return base.join(' ');\r\n }\r\n\r\n return [\r\n ...base,\r\n 'rounded-tx-sm border p-tx-3 transition-colors',\r\n selected\r\n ? 'border-tx-primary-border bg-tx-primary-subtle'\r\n : 'border-tx-border bg-tx-surface',\r\n disabled\r\n ? 'opacity-60'\r\n : 'hover:border-tx-border-strong focus-within:border-tx-primary focus-within:shadow-tx-focus',\r\n ].join(' ');\r\n }\r\n\r\n protected labelClass(option: TxOption<T>): string {\r\n const selected = this.value() === option.value;\r\n const card = this.resolved().appearance === 'card';\r\n return [\r\n TEXT_SIZE[this.size()],\r\n 'block leading-tx-snug',\r\n card ? 'font-semibold' : '',\r\n this.isOptionDisabled(option)\r\n ? 'text-tx-text-disabled'\r\n : selected && card\r\n ? 'text-tx-primary-text'\r\n : 'text-tx-text-primary',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n protected select(option: TxOption<T>): void {\r\n if (this.isOptionDisabled(option)) {\r\n return;\r\n }\r\n this.value.set(option.value);\r\n this.forms.emit(option.value);\r\n this.changed.emit(option.value);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.forms.touch();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: T | null): void {\r\n this.forms.writeValue(value);\r\n }\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { TxControlSize } from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\n\r\n/** Simple property configuration for {@link TxSwitchComponent}. */\r\nexport interface TxSwitchConfig {\r\n /** Inline label beside the switch. */\r\n label?: string;\r\n /** Second line under the label. */\r\n description?: string;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Defaults to `after`. */\r\n labelPosition?: 'after' | 'before';\r\n disabled?: boolean;\r\n required?: boolean;\r\n name?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nconst TRACK_SIZE: Record<TxControlSize, string> = {\r\n sm: 'h-tx-4 w-tx-7',\r\n md: 'h-tx-5 w-tx-8',\r\n lg: 'h-tx-6 w-tx-10',\r\n};\r\n\r\n/**\r\n * Thumb geometry per size. The travel is the track width minus the thumb width\r\n * minus twice the inset, expressed as a spacing token:\r\n * sm 28 − 12 − 4 = 12px (tx-3)\r\n * md 32 − 16 − 4 = 12px (tx-3)\r\n * lg 40 − 20 − 4 = 16px (tx-4)\r\n *\r\n * Written as complete literal class strings on purpose: Tailwind scans source\r\n * text, so a class assembled at runtime would never be generated.\r\n */\r\nconst THUMB_SIZE: Record<TxControlSize, string> = {\r\n sm: 'size-tx-3 peer-checked:translate-x-tx-3',\r\n md: 'size-tx-4 peer-checked:translate-x-tx-3',\r\n lg: 'size-tx-5 peer-checked:translate-x-tx-4',\r\n};\r\n\r\nconst TEXT_SIZE: Record<TxControlSize, string> = {\r\n sm: 'text-tx-sm',\r\n md: 'text-tx-base',\r\n lg: 'text-tx-lg',\r\n};\r\n\r\n/**\r\n * An on/off switch.\r\n *\r\n * A native `input[type=checkbox]` carrying `role=\"switch\"`, as the brief\r\n * requires — the platform provides keyboard activation, the checked state and\r\n * the form value, and only the track/thumb appearance is ours. The visual state\r\n * is driven entirely by the `checked:` variant reading the element's real\r\n * state, never by classes toggled from TypeScript.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-switch [config]=\"{ label: 'Notify on new failures' }\" [(checked)]=\"notify\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-switch',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxSwitchComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <label [class]=\"labelClass()\">\r\n <span [class]=\"wrapperClass()\">\r\n <input\r\n #control\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n [id]=\"fieldId()\"\r\n [class]=\"trackClass()\"\r\n [checked]=\"checked()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.name]=\"config().name ?? null\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n (change)=\"onChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span [class]=\"thumbClass()\" aria-hidden=\"true\"></span>\r\n </span>\r\n\r\n @if (label() || description()) {\r\n <span class=\"min-w-0 flex-1\">\r\n @if (label(); as text) {\r\n <span [class]=\"textClass()\">{{ text }}</span>\r\n }\r\n @if (description(); as text) {\r\n <span class=\"mt-tx-0-5 block text-tx-xs leading-tx-snug text-tx-text-muted\">\r\n {{ text }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n </label>\r\n `,\r\n})\r\nexport class TxSwitchComponent implements ControlValueAccessor {\r\n readonly config = input<Partial<TxSwitchConfig>>({});\r\n readonly checked = model(false);\r\n\r\n readonly changed = output<boolean>();\r\n\r\n private readonly control = viewChild.required<ElementRef<HTMLInputElement>>('control');\r\n private readonly formField = txBindFormField('switch');\r\n private readonly forms = new TxControlValueBridge<boolean>((next) =>\r\n this.checked.set(next === true),\r\n );\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n\r\n private readonly resolved = computed<TxSwitchConfig>(() => this.config());\r\n\r\n protected readonly label = computed(() => this.resolved().label ?? null);\r\n protected readonly description = computed(() => this.resolved().description ?? null);\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n\r\n protected readonly labelClass = computed(() =>\r\n [\r\n 'flex w-fit min-w-0 items-start gap-tx-2-5',\r\n this.resolved().labelPosition === 'before' ? 'flex-row-reverse' : '',\r\n this.isDisabled() ? 'cursor-not-allowed' : 'cursor-pointer',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly wrapperClass = computed(() =>\r\n ['relative inline-flex shrink-0 items-center', TRACK_SIZE[this.size()]].join(' '),\r\n );\r\n\r\n protected readonly trackClass = computed(() =>\r\n [\r\n 'peer m-0 h-full w-full cursor-[inherit] appearance-none rounded-tx-full',\r\n 'border border-tx-border bg-tx-control-off',\r\n 'transition-colors duration-150 ease-tx-standard',\r\n 'checked:border-tx-primary checked:bg-tx-primary',\r\n 'disabled:cursor-not-allowed disabled:opacity-50',\r\n ].join(' '),\r\n );\r\n\r\n protected readonly thumbClass = computed(() =>\r\n [\r\n 'pointer-events-none absolute top-1/2 left-tx-0-5 -translate-y-1/2',\r\n 'rounded-tx-full bg-tx-surface shadow-tx-sm',\r\n 'transition-transform duration-150 ease-tx-standard',\r\n THUMB_SIZE[this.size()],\r\n ].join(' '),\r\n );\r\n\r\n protected readonly textClass = computed(() =>\r\n [\r\n TEXT_SIZE[this.size()],\r\n 'block leading-tx-snug',\r\n this.isDisabled() ? 'text-tx-text-disabled' : 'text-tx-text-primary',\r\n ].join(' '),\r\n );\r\n\r\n /** Moves focus onto the switch. */\r\n focus(): void {\r\n this.control().nativeElement.focus();\r\n }\r\n\r\n protected onChange(event: Event): void {\r\n const next = (event.target as HTMLInputElement).checked;\r\n this.checked.set(next);\r\n this.forms.emit(next);\r\n this.changed.emit(next);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.forms.touch();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: boolean): void {\r\n this.forms.writeValue(value);\r\n }\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","/**\r\n * Shared appearance for every popup surface — select, multiselect, dropdown\r\n * tree, chips input, autocomplete, menu and the datepicker.\r\n *\r\n * Interaction state is styled from the attributes `@angular/aria` already\r\n * emits, never from booleans mirrored into TypeScript:\r\n *\r\n * `aria-selected` / `aria-disabled` / `aria-expanded` — Tailwind's built-in\r\n * aria variants match `=\"true\"` exactly, so a `false` attribute (which\r\n * Angular still renders) does not match.\r\n *\r\n * `data-active` — the roving \"active descendant\" marker. This one must be\r\n * written as `data-[active=true]:`, because Aria binds a boolean and Angular\r\n * renders `data-active=\"false\"` rather than removing the attribute, which\r\n * would make a bare `data-active:` match at all times.\r\n */\r\n\r\n/** Popup height, chosen per component through its config. */\r\nexport type TxPopupHeight = 'sm' | 'md' | 'lg';\r\n\r\nexport const TX_POPUP_MAX_HEIGHT: Record<TxPopupHeight, string> = {\r\n sm: 'max-h-tx-popup-sm',\r\n md: 'max-h-tx-popup-md',\r\n lg: 'max-h-tx-popup-lg',\r\n};\r\n\r\n/**\r\n * The popup card itself. `min-h-0` matters: the CDK pane sets a max-height when\r\n * the popup would otherwise leave the viewport, and without it the panel would\r\n * refuse to shrink and the list would overflow the screen instead of scrolling.\r\n */\r\nexport const TX_POPUP_PANEL_CLASS = [\r\n 'flex min-h-0 w-full min-w-0 flex-col overflow-hidden',\r\n 'rounded-tx-sm border border-tx-border bg-tx-surface-raised shadow-tx-popup',\r\n].join(' ');\r\n\r\n/** The scrollable list inside the popup. */\r\nexport const TX_POPUP_LIST_CLASS = [\r\n 'min-h-0 flex-1 overflow-y-auto overscroll-contain p-tx-1',\r\n 'focus:outline-none',\r\n].join(' ');\r\n\r\n/** One option row. */\r\nexport const TX_POPUP_OPTION_CLASS = [\r\n 'flex cursor-pointer items-start gap-tx-2 rounded-tx-xs px-tx-2-5 py-tx-1-5',\r\n 'text-tx-base leading-tx-snug text-tx-text-primary',\r\n 'transition-colors duration-150 ease-tx-standard',\r\n 'data-[active=true]:bg-tx-hover-fill',\r\n 'aria-selected:bg-tx-primary-subtle aria-selected:font-semibold aria-selected:text-tx-primary-text',\r\n 'aria-disabled:cursor-not-allowed aria-disabled:bg-transparent aria-disabled:text-tx-text-disabled',\r\n].join(' ');\r\n\r\n/** Group heading inside a popup list. */\r\nexport const TX_POPUP_GROUP_CLASS = [\r\n 'px-tx-2-5 pt-tx-2-5 pb-tx-1 font-tx-mono text-tx-2xs tracking-tx-widest uppercase',\r\n 'text-tx-text-subtle',\r\n].join(' ');\r\n\r\n/** \"No results\" / \"No options\" row. */\r\nexport const TX_POPUP_EMPTY_CLASS = 'px-tx-3 py-tx-5 text-center text-tx-base text-tx-text-muted';\r\n","import { TxControlSize } from '../core/control-classes';\r\nimport { TxPopupHeight } from '../core/popup-classes';\r\n\r\n/**\r\n * Simple property configuration for {@link TxSelectComponent} and\r\n * {@link TxMultiselectComponent}.\r\n *\r\n * Options are data and come through the component's own `options` input; a\r\n * custom option renderer is structural and comes through `optionTemplate`.\r\n * Neither belongs here.\r\n */\r\nexport interface TxSelectConfig {\r\n /** Shown in the trigger when nothing is selected. */\r\n placeholder?: string;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Defaults to `md`. */\r\n popupHeight?: TxPopupHeight;\r\n /** Shows a clear button in the trigger once something is selected. */\r\n clearable?: boolean;\r\n disabled?: boolean;\r\n required?: boolean;\r\n invalid?: boolean;\r\n /** Message shown in the popup when `options` is empty. */\r\n emptyText?: string;\r\n /** Accessible name when there is no surrounding form field. */\r\n ariaLabel?: string;\r\n name?: string;\r\n}\r\n\r\nexport const TX_SELECT_DEFAULTS = {\r\n placeholder: 'Select…',\r\n popupHeight: 'md',\r\n emptyText: 'No options',\r\n} as const satisfies Partial<TxSelectConfig>;\r\n\r\n/**\r\n * How a multiselect summarises its selection in the closed trigger.\r\n *\r\n * A union rather than a pair of booleans, so the states stay mutually\r\n * exclusive as more are added.\r\n */\r\nexport type TxMultiselectSummary = 'chips' | 'comma' | 'count';\r\n\r\n/** Simple property configuration for {@link TxMultiselectComponent}. */\r\nexport interface TxMultiselectConfig extends TxSelectConfig {\r\n /** Defaults to `chips`. */\r\n summary?: TxMultiselectSummary;\r\n /**\r\n * Above this many selections a `chips` trigger collapses to a count, so a\r\n * long selection cannot push the trigger to an unusable height. Defaults to 3.\r\n */\r\n maxVisibleChips?: number;\r\n}\r\n\r\nexport const TX_MULTISELECT_DEFAULTS = {\r\n ...TX_SELECT_DEFAULTS,\r\n placeholder: 'Select…',\r\n summary: 'chips',\r\n maxVisibleChips: 3,\r\n} as const satisfies Partial<TxMultiselectConfig>;\r\n","import { Combobox, ComboboxPopup, ComboboxWidget } from '@angular/aria/combobox';\r\nimport { Listbox, Option } from '@angular/aria/listbox';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n TemplateRef,\r\n computed,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport {\r\n CONTROL_ICON_SIZE,\r\n TX_TRIGGER_CHEVRON_CLASS,\r\n TX_TRIGGER_CLEAR_CLASS,\r\n txControlShellClass,\r\n} from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { TxOption } from '../core/option';\r\nimport {\r\n TX_POPUP_EMPTY_CLASS,\r\n TX_POPUP_LIST_CLASS,\r\n TX_POPUP_MAX_HEIGHT,\r\n TX_POPUP_OPTION_CLASS,\r\n TX_POPUP_PANEL_CLASS,\r\n} from '../core/popup-classes';\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TxConnectedOverlayDirective } from '../overlay/connected-overlay.directive';\r\nimport { TxOverlayCloseReason, TxOverlayConfig } from '../overlay/overlay.types';\r\nimport { TX_SELECT_DEFAULTS, TxSelectConfig } from './select.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * A single-select dropdown.\r\n *\r\n * Behaviour is `@angular/aria`'s: `ngCombobox` on the trigger provides\r\n * `role=\"combobox\"`, `aria-expanded`, `aria-controls`, `aria-activedescendant`\r\n * and key forwarding into the popup; `ngListbox`/`ngOption` provide roving\r\n * activation, typeahead and selection. Positioning is\r\n * {@link TxConnectedOverlayDirective}, which hosts the Aria popup template in a\r\n * CDK overlay so it escapes `overflow` clipping and flips near a viewport edge.\r\n *\r\n * Every visual state is styled from the attributes Aria emits —\r\n * `aria-selected`, `aria-disabled`, `aria-expanded`, `data-active` — so nothing\r\n * is mirrored into a boolean and toggled from TypeScript.\r\n *\r\n * The trigger is deliberately assembled so a search box can be added inside it\r\n * later without changing this public API: typed-text filtering is out of scope\r\n * for v1.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Disposition', required: true }\">\r\n * <tx-select [options]=\"dispositions\" [config]=\"{ clearable: true }\" [(value)]=\"disposition\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it:\r\n * `this.selectConfig = { ...this.selectConfig, disabled: true }`.\r\n */\r\n@Component({\r\n selector: 'tx-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n Combobox,\r\n ComboboxPopup,\r\n ComboboxWidget,\r\n Listbox,\r\n Option,\r\n NgTemplateOutlet,\r\n TxIconComponent,\r\n TxConnectedOverlayDirective,\r\n ],\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxSelectComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div\r\n class=\"flex min-w-0\"\r\n [txConnectedOverlay]=\"popup\"\r\n [txOverlayOpen]=\"expanded()\"\r\n [txOverlayConfig]=\"overlayConfig\"\r\n (closed)=\"onOverlayClosed($event)\"\r\n >\r\n <div\r\n #trigger\r\n ngCombobox\r\n #combobox=\"ngCombobox\"\r\n [id]=\"fieldId()\"\r\n [class]=\"triggerClass()\"\r\n [(expanded)]=\"expanded\"\r\n [disabled]=\"isDisabled()\"\r\n [softDisabled]=\"true\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n >\r\n <span [class]=\"valueClass()\">{{ triggerLabel() }}</span>\r\n @if (showClear()) {\r\n <button\r\n type=\"button\"\r\n [class]=\"clearClass\"\r\n aria-label=\"Clear selection\"\r\n (click)=\"clear($event)\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n\r\n <span [class]=\"chevronClass\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: 'chevron-down', size: iconSize() }\" />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!--\r\n The popup template is handed to the overlay directive, which attaches it\r\n eagerly. That is what lets ngComboboxPopup register with the combobox\r\n before the first keystroke; Aria's own DeferredContent still creates and\r\n destroys the list in step with the expanded state.\r\n -->\r\n <ng-template #popup>\r\n <ng-template ngComboboxPopup [combobox]=\"combobox\" popupType=\"listbox\">\r\n <div [class]=\"panelClass()\">\r\n <div\r\n ngComboboxWidget\r\n ngListbox\r\n #listbox=\"ngListbox\"\r\n focusMode=\"activedescendant\"\r\n selectionMode=\"explicit\"\r\n [class]=\"listClass\"\r\n [value]=\"listboxValue()\"\r\n (valueChange)=\"onListboxValue($event)\"\r\n [activeDescendant]=\"listbox.activeDescendant()\"\r\n >\r\n @for (option of options(); track option.value) {\r\n <div\r\n ngOption\r\n [value]=\"option.value\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.disabled === true\"\r\n [class]=\"optionClass\"\r\n >\r\n @if (optionTemplate(); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: option,\r\n selected: value() === option.value\r\n }\"\r\n />\r\n } @else {\r\n @if (option.icon; as name) {\r\n <span class=\"mt-tx-0-5 flex shrink-0 text-tx-text-subtle\">\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n </span>\r\n }\r\n <span class=\"min-w-0 flex-1\">\r\n <span class=\"block truncate\">{{ option.label }}</span>\r\n @if (option.description; as text) {\r\n <span class=\"block truncate text-tx-xs font-normal text-tx-text-muted\">\r\n {{ text }}\r\n </span>\r\n }\r\n </span>\r\n @if (option.badge; as badge) {\r\n <span\r\n class=\"shrink-0 rounded-tx-full border border-tx-border bg-tx-surface-sunken\r\n px-tx-1-5 font-tx-mono text-tx-2xs font-normal text-tx-text-muted\"\r\n >{{ badge }}</span\r\n >\r\n }\r\n }\r\n </div>\r\n } @empty {\r\n <p [class]=\"emptyClass\">{{ emptyText() }}</p>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n `,\r\n})\r\nexport class TxSelectComponent<T = string> implements ControlValueAccessor {\r\n readonly config = input<Partial<TxSelectConfig>>({});\r\n\r\n /** The selectable options. Data, so it is its own input. */\r\n readonly options = input.required<readonly TxOption<T>[]>();\r\n\r\n /**\r\n * Custom option renderer. Structural, so it is a `TemplateRef` input rather\r\n * than a config field. Context: `$implicit` is the option, `selected` is a\r\n * boolean.\r\n */\r\n readonly optionTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n /** Selected value, or `null`. */\r\n readonly value = model<T | null>(null);\r\n\r\n readonly changed = output<T | null>();\r\n readonly openedChange = output<boolean>();\r\n\r\n protected readonly expanded = signal(false);\r\n\r\n private readonly trigger = viewChild.required<ElementRef<HTMLElement>>('trigger');\r\n private readonly formField = txBindFormField('select');\r\n private readonly forms = new TxControlValueBridge<T | null>((next) =>\r\n this.value.set(next ?? null),\r\n );\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n protected readonly optionClass = TX_POPUP_OPTION_CLASS;\r\n protected readonly emptyClass = TX_POPUP_EMPTY_CLASS;\r\n protected readonly listClass = TX_POPUP_LIST_CLASS;\r\n\r\n protected readonly overlayConfig: Partial<TxOverlayConfig> = {\r\n placement: 'bottom-start',\r\n width: 'trigger',\r\n };\r\n\r\n private readonly resolved = computed<TxSelectConfig>(() =>\r\n txMergeConfig(TX_SELECT_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly emptyText = computed(() => this.resolved().emptyText);\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n protected readonly iconSize = computed(() => CONTROL_ICON_SIZE[this.size()]);\r\n\r\n private readonly selectedOption = computed(\r\n () => this.options().find((option) => option.value === this.value()) ?? null,\r\n );\r\n\r\n protected readonly triggerLabel = computed(\r\n () => this.selectedOption()?.label ?? this.resolved().placeholder ?? '',\r\n );\r\n\r\n protected readonly showClear = computed(\r\n () => this.resolved().clearable === true && this.value() !== null && !this.isDisabled(),\r\n );\r\n\r\n /** Aria's listbox always models its value as an array, even single-select. */\r\n protected readonly listboxValue = computed<T[]>(() =>\r\n this.value() === null ? [] : [this.value() as T],\r\n );\r\n\r\n protected readonly triggerClass = computed(() =>\r\n [\r\n txControlShellClass({ size: this.size(), invalid: this.isInvalid() }),\r\n 'group flex cursor-pointer items-center gap-tx-2 text-left',\r\n this.isDisabled() ? 'pointer-events-none' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly chevronClass = TX_TRIGGER_CHEVRON_CLASS;\r\n protected readonly clearClass = TX_TRIGGER_CLEAR_CLASS;\r\n\r\n protected readonly valueClass = computed(() =>\r\n [\r\n 'min-w-0 flex-1 truncate',\r\n this.selectedOption() ? 'text-tx-text-primary' : 'text-tx-text-disabled',\r\n ].join(' '),\r\n );\r\n\r\n protected readonly panelClass = computed(() =>\r\n [TX_POPUP_PANEL_CLASS, TX_POPUP_MAX_HEIGHT[this.resolved().popupHeight ?? 'md']].join(' '),\r\n );\r\n\r\n protected onListboxValue(next: T[]): void {\r\n const selected = next.length > 0 ? next[0] : null;\r\n if (selected === this.value()) {\r\n return;\r\n }\r\n this.value.set(selected);\r\n this.forms.emit(selected);\r\n this.changed.emit(selected);\r\n // Single-select commits and closes; focus returns to the trigger so the\r\n // next Tab continues from the right place.\r\n this.close(true);\r\n }\r\n\r\n protected onOverlayClosed(reason: TxOverlayCloseReason): void {\r\n // Escape returns focus to the trigger; an outside click does not, because\r\n // the user has already chosen where to go.\r\n this.close(reason === 'escape');\r\n }\r\n\r\n private close(restoreFocus: boolean): void {\r\n if (!this.expanded()) {\r\n return;\r\n }\r\n this.expanded.set(false);\r\n this.forms.touch();\r\n this.openedChange.emit(false);\r\n if (restoreFocus) {\r\n this.trigger().nativeElement.focus();\r\n }\r\n }\r\n\r\n protected clear(event: MouseEvent): void {\r\n // The combobox's own click handler would otherwise toggle the popup open.\r\n event.stopPropagation();\r\n this.value.set(null);\r\n this.forms.emit(null);\r\n this.changed.emit(null);\r\n this.trigger().nativeElement.focus();\r\n }\r\n\r\n /** Moves focus onto the trigger. */\r\n focus(): void {\r\n this.trigger().nativeElement.focus();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: T | null): void {\r\n this.forms.writeValue(value);\r\n }\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","/**\r\n * Builds the text a closed multi-select trigger shows.\r\n *\r\n * Shared by the multiselect and the dropdown tree so the two never drift into\r\n * summarising the same selection differently.\r\n */\r\nexport function txSelectionSummary(\r\n labels: readonly string[],\r\n mode: 'comma' | 'count',\r\n noun = 'selected',\r\n): string {\r\n if (labels.length === 0) {\r\n return '';\r\n }\r\n if (mode === 'comma') {\r\n return labels.join(', ');\r\n }\r\n return `${labels.length} ${noun}`;\r\n}\r\n\r\n/**\r\n * Splits labels into the chips to render and the number hidden behind a\r\n * \"+n\" pill, so a long selection cannot grow the trigger without bound.\r\n */\r\nexport function txVisibleChips(\r\n labels: readonly string[],\r\n maxVisible: number,\r\n): { visible: string[]; overflow: number } {\r\n if (labels.length <= maxVisible) {\r\n return { visible: [...labels], overflow: 0 };\r\n }\r\n return {\r\n visible: labels.slice(0, maxVisible),\r\n overflow: labels.length - maxVisible,\r\n };\r\n}\r\n","import { Combobox, ComboboxPopup, ComboboxWidget } from '@angular/aria/combobox';\r\nimport { Listbox, Option } from '@angular/aria/listbox';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n TemplateRef,\r\n computed,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport {\r\n CONTROL_ICON_SIZE,\r\n TX_TRIGGER_CHEVRON_CLASS,\r\n TX_TRIGGER_CLEAR_CLASS,\r\n txControlShellClass,\r\n} from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { TxOption } from '../core/option';\r\nimport {\r\n TX_POPUP_EMPTY_CLASS,\r\n TX_POPUP_LIST_CLASS,\r\n TX_POPUP_MAX_HEIGHT,\r\n TX_POPUP_OPTION_CLASS,\r\n TX_POPUP_PANEL_CLASS,\r\n} from '../core/popup-classes';\r\nimport { txSelectionSummary, txVisibleChips } from '../core/selection-summary';\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TxConnectedOverlayDirective } from '../overlay/connected-overlay.directive';\r\nimport { TxOverlayCloseReason, TxOverlayConfig } from '../overlay/overlay.types';\r\nimport { TX_MULTISELECT_DEFAULTS, TxMultiselectConfig } from './select.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * A multi-select dropdown.\r\n *\r\n * Same Aria machinery as {@link TxSelectComponent}, with `multi` on the listbox\r\n * and a popup that stays open across selections. The closed trigger summarises\r\n * the selection as chips, a comma-joined list or a count, chosen through the\r\n * config's `summary` union rather than a set of booleans.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Symptoms' }\">\r\n * <tx-multiselect [options]=\"symptoms\" [config]=\"{ summary: 'chips' }\" [(value)]=\"selected\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-multiselect',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n Combobox,\r\n ComboboxPopup,\r\n ComboboxWidget,\r\n Listbox,\r\n Option,\r\n NgTemplateOutlet,\r\n TxIconComponent,\r\n TxConnectedOverlayDirective,\r\n ],\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxMultiselectComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div\r\n class=\"flex min-w-0\"\r\n [txConnectedOverlay]=\"popup\"\r\n [txOverlayOpen]=\"expanded()\"\r\n [txOverlayConfig]=\"overlayConfig\"\r\n (closed)=\"onOverlayClosed($event)\"\r\n >\r\n <div\r\n #trigger\r\n ngCombobox\r\n #combobox=\"ngCombobox\"\r\n [id]=\"fieldId()\"\r\n [class]=\"triggerClass()\"\r\n [(expanded)]=\"expanded\"\r\n [disabled]=\"isDisabled()\"\r\n [softDisabled]=\"true\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n >\r\n @if (value().length === 0) {\r\n <span class=\"min-w-0 flex-1 truncate text-tx-text-disabled\">{{ placeholder() }}</span>\r\n } @else if (summary() === 'chips') {\r\n <span class=\"flex min-w-0 flex-1 flex-wrap items-center gap-tx-1\">\r\n @for (label of chips().visible; track label) {\r\n <span\r\n class=\"inline-flex max-w-full items-center rounded-tx-full border border-tx-border\r\n bg-tx-surface-sunken px-tx-2 py-tx-0-5 text-tx-xs text-tx-text-primary\"\r\n >\r\n <span class=\"truncate\">{{ label }}</span>\r\n </span>\r\n }\r\n @if (chips().overflow > 0) {\r\n <span\r\n class=\"inline-flex shrink-0 items-center rounded-tx-full border\r\n border-tx-primary-border bg-tx-primary-subtle px-tx-2 py-tx-0-5\r\n font-tx-mono text-tx-2xs text-tx-primary-text\"\r\n >+{{ chips().overflow }}</span\r\n >\r\n }\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-tx-text-primary\">{{ summaryText() }}</span>\r\n }\r\n\r\n @if (showClear()) {\r\n <button\r\n type=\"button\"\r\n [class]=\"clearClass\"\r\n aria-label=\"Clear selection\"\r\n (click)=\"clear($event)\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n\r\n <span [class]=\"chevronClass\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: 'chevron-down', size: iconSize() }\" />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #popup>\r\n <ng-template ngComboboxPopup [combobox]=\"combobox\" popupType=\"listbox\">\r\n <div [class]=\"panelClass()\">\r\n <div\r\n ngComboboxWidget\r\n ngListbox\r\n #listbox=\"ngListbox\"\r\n [multi]=\"true\"\r\n focusMode=\"activedescendant\"\r\n selectionMode=\"explicit\"\r\n [class]=\"listClass\"\r\n [value]=\"value()\"\r\n (valueChange)=\"onListboxValue($event)\"\r\n [activeDescendant]=\"listbox.activeDescendant()\"\r\n >\r\n @for (option of options(); track option.value) {\r\n <div\r\n ngOption\r\n [value]=\"option.value\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.disabled === true\"\r\n [class]=\"optionClass\"\r\n >\r\n @if (optionTemplate(); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: option,\r\n selected: value().includes(option.value)\r\n }\"\r\n />\r\n } @else {\r\n <!--\r\n A visual indicator, not an input: the row already carries\r\n aria-selected, and a real checkbox would announce twice.\r\n -->\r\n <span\r\n class=\"mt-tx-0-5 grid size-tx-4 shrink-0 place-items-center rounded-tx-xs\r\n border border-tx-border bg-tx-surface text-transparent\r\n transition-colors in-aria-selected:border-tx-primary\r\n in-aria-selected:bg-tx-primary in-aria-selected:text-tx-text-on-primary\"\r\n aria-hidden=\"true\"\r\n >\r\n <tx-icon [config]=\"{ name: 'check', size: 'sm' }\" />\r\n </span>\r\n <span class=\"min-w-0 flex-1\">\r\n <span class=\"block truncate\">{{ option.label }}</span>\r\n @if (option.description; as text) {\r\n <span class=\"block truncate text-tx-xs font-normal text-tx-text-muted\">\r\n {{ text }}\r\n </span>\r\n }\r\n </span>\r\n @if (option.badge; as badge) {\r\n <span\r\n class=\"shrink-0 rounded-tx-full border border-tx-border bg-tx-surface-sunken\r\n px-tx-1-5 font-tx-mono text-tx-2xs font-normal text-tx-text-muted\"\r\n >{{ badge }}</span\r\n >\r\n }\r\n }\r\n </div>\r\n } @empty {\r\n <p [class]=\"emptyClass\">{{ emptyText() }}</p>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n `,\r\n})\r\nexport class TxMultiselectComponent<T = string> implements ControlValueAccessor {\r\n readonly config = input<Partial<TxMultiselectConfig>>({});\r\n\r\n /** The selectable options. Data, so it is its own input. */\r\n readonly options = input.required<readonly TxOption<T>[]>();\r\n\r\n /** Custom option renderer. Structural, so a template rather than config. */\r\n readonly optionTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n /** Selected values. */\r\n readonly value = model<T[]>([]);\r\n\r\n readonly changed = output<T[]>();\r\n readonly openedChange = output<boolean>();\r\n\r\n protected readonly expanded = signal(false);\r\n\r\n private readonly trigger = viewChild.required<ElementRef<HTMLElement>>('trigger');\r\n private readonly formField = txBindFormField('multiselect');\r\n private readonly forms = new TxControlValueBridge<T[]>((next) => this.value.set(next ?? []));\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n protected readonly optionClass = TX_POPUP_OPTION_CLASS;\r\n protected readonly emptyClass = TX_POPUP_EMPTY_CLASS;\r\n protected readonly listClass = TX_POPUP_LIST_CLASS;\r\n\r\n protected readonly overlayConfig: Partial<TxOverlayConfig> = {\r\n placement: 'bottom-start',\r\n width: 'trigger',\r\n };\r\n\r\n private readonly resolved = computed<TxMultiselectConfig>(() =>\r\n txMergeConfig(TX_MULTISELECT_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly placeholder = computed(() => this.resolved().placeholder);\r\n protected readonly summary = computed(() => this.resolved().summary);\r\n protected readonly emptyText = computed(() => this.resolved().emptyText);\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n protected readonly iconSize = computed(() => CONTROL_ICON_SIZE[this.size()]);\r\n\r\n private readonly selectedLabels = computed(() => {\r\n const selected = new Set(this.value());\r\n return this.options()\r\n .filter((option) => selected.has(option.value))\r\n .map((option) => option.label);\r\n });\r\n\r\n protected readonly chips = computed(() =>\r\n txVisibleChips(this.selectedLabels(), this.resolved().maxVisibleChips ?? 3),\r\n );\r\n\r\n protected readonly summaryText = computed(() =>\r\n txSelectionSummary(this.selectedLabels(), this.summary() === 'comma' ? 'comma' : 'count'),\r\n );\r\n\r\n protected readonly showClear = computed(\r\n () => this.resolved().clearable === true && this.value().length > 0 && !this.isDisabled(),\r\n );\r\n\r\n protected readonly triggerClass = computed(() =>\r\n [\r\n txControlShellClass({ size: this.size(), invalid: this.isInvalid(), height: 'auto' }),\r\n 'group flex cursor-pointer items-center gap-tx-2 text-left',\r\n this.isDisabled() ? 'pointer-events-none' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly chevronClass = TX_TRIGGER_CHEVRON_CLASS;\r\n protected readonly clearClass = TX_TRIGGER_CLEAR_CLASS;\r\n\r\n protected readonly panelClass = computed(() =>\r\n [TX_POPUP_PANEL_CLASS, TX_POPUP_MAX_HEIGHT[this.resolved().popupHeight ?? 'md']].join(' '),\r\n );\r\n\r\n protected onListboxValue(next: T[]): void {\r\n this.value.set(next);\r\n this.forms.emit(next);\r\n this.changed.emit(next);\r\n // Deliberately stays open: picking several options is the whole point.\r\n }\r\n\r\n protected onOverlayClosed(reason: TxOverlayCloseReason): void {\r\n if (!this.expanded()) {\r\n return;\r\n }\r\n this.expanded.set(false);\r\n this.forms.touch();\r\n this.openedChange.emit(false);\r\n if (reason === 'escape') {\r\n this.trigger().nativeElement.focus();\r\n }\r\n }\r\n\r\n protected clear(event: MouseEvent): void {\r\n // The combobox's own click handler would otherwise toggle the popup open.\r\n event.stopPropagation();\r\n this.value.set([]);\r\n this.forms.emit([]);\r\n this.changed.emit([]);\r\n this.trigger().nativeElement.focus();\r\n }\r\n\r\n /** Moves focus onto the trigger. */\r\n focus(): void {\r\n this.trigger().nativeElement.focus();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: T[]): void {\r\n this.forms.writeValue(value ?? []);\r\n }\r\n registerOnChange(fn: (value: T[]) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","/**\r\n * One node in a {@link TxTreeComponent}.\r\n *\r\n * Nodes are data. Anything structural about how a node is drawn — a leading\r\n * control, a badge, trailing actions — is a `TemplateRef` slot on the component,\r\n * never a field here.\r\n */\r\nexport interface TxTreeNode<T = string> {\r\n /** Unique across the whole tree. Carried in the selection value. */\r\n id: T;\r\n label: string;\r\n children?: readonly TxTreeNode<T>[];\r\n /** Registered icon name shown before the label. */\r\n icon?: string;\r\n /** Short text rendered in the default badge slot. */\r\n badge?: string;\r\n disabled?: boolean;\r\n /** Defaults to true. Set false for a node that is a container only. */\r\n selectable?: boolean;\r\n /** Application payload. Passed back in slot contexts and in outputs. */\r\n data?: unknown;\r\n}\r\n\r\n/**\r\n * How many nodes may be selected.\r\n *\r\n * A union rather than a `multi` boolean, so `none` is a first-class state\r\n * instead of an absence that has to be inferred.\r\n */\r\nexport type TxTreeSelection = 'none' | 'single' | 'multiple';\r\n\r\n/**\r\n * Whether the built-in checkbox indicator fills the leading slot, and for which\r\n * nodes. Ignored when a `leadingTemplate` is supplied.\r\n */\r\nexport type TxTreeCheckboxes = 'none' | 'all' | 'leaf';\r\n\r\n/** Whether branches can be collapsed. */\r\nexport type TxTreeExpansion = 'collapsible' | 'static';\r\n\r\n/** Whether connector lines are drawn between parents and children. */\r\nexport type TxTreeGuides = 'lines' | 'none';\r\n\r\n/** Simple property configuration for {@link TxTreeComponent}. */\r\nexport interface TxTreeConfig {\r\n /** Defaults to `single`. */\r\n selection?: TxTreeSelection;\r\n /** Defaults to `none`. Pairs naturally with `selection: 'multiple'`. */\r\n checkboxes?: TxTreeCheckboxes;\r\n /** Defaults to `collapsible`. */\r\n expansion?: TxTreeExpansion;\r\n /** Defaults to `lines`, matching the reference tree of parts. */\r\n guides?: TxTreeGuides;\r\n /** Defaults to `md`. */\r\n size?: 'sm' | 'md';\r\n disabled?: boolean;\r\n /** Message shown when `nodes` is empty. */\r\n emptyText?: string;\r\n /** Accessible name for the tree. */\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_TREE_DEFAULTS = {\r\n selection: 'single',\r\n checkboxes: 'none',\r\n expansion: 'collapsible',\r\n guides: 'lines',\r\n size: 'md',\r\n emptyText: 'No items',\r\n} as const satisfies Partial<TxTreeConfig>;\r\n\r\n/**\r\n * Context handed to every tree slot template.\r\n *\r\n * `$implicit` is the node, so `let-node` works without naming the key.\r\n */\r\nexport interface TxTreeSlotContext<T = string> {\r\n $implicit: TxTreeNode<T>;\r\n node: TxTreeNode<T>;\r\n /** 1-based depth, matching `aria-level`. */\r\n level: number;\r\n selected: boolean;\r\n expanded: boolean;\r\n hasChildren: boolean;\r\n}\r\n\r\n/** Flattens a node tree into visible rows, honouring collapsed branches. */\r\nexport function flattenTxTree<T>(\r\n nodes: readonly TxTreeNode<T>[],\r\n isExpanded: (node: TxTreeNode<T>) => boolean,\r\n level = 1,\r\n): { node: TxTreeNode<T>; level: number }[] {\r\n const rows: { node: TxTreeNode<T>; level: number }[] = [];\r\n for (const node of nodes) {\r\n rows.push({ node, level });\r\n if (node.children?.length && isExpanded(node)) {\r\n rows.push(...flattenTxTree(node.children, isExpanded, level + 1));\r\n }\r\n }\r\n return rows;\r\n}\r\n\r\n/** Every node id in the tree, depth-first. */\r\nexport function txTreeNodeIds<T>(nodes: readonly TxTreeNode<T>[]): T[] {\r\n const ids: T[] = [];\r\n for (const node of nodes) {\r\n ids.push(node.id);\r\n if (node.children?.length) {\r\n ids.push(...txTreeNodeIds(node.children));\r\n }\r\n }\r\n return ids;\r\n}\r\n\r\n/** Ids of every node that has children, depth-first. */\r\nexport function txTreeBranchIds<T>(nodes: readonly TxTreeNode<T>[]): T[] {\r\n const ids: T[] = [];\r\n for (const node of nodes) {\r\n if (node.children?.length) {\r\n ids.push(node.id, ...txTreeBranchIds(node.children));\r\n }\r\n }\r\n return ids;\r\n}\r\n\r\n/** Finds a node by id, searching depth-first. */\r\nexport function findTxTreeNode<T>(\r\n nodes: readonly TxTreeNode<T>[],\r\n id: T,\r\n): TxTreeNode<T> | null {\r\n for (const node of nodes) {\r\n if (node.id === id) {\r\n return node;\r\n }\r\n const found = node.children?.length ? findTxTreeNode(node.children, id) : null;\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n}\r\n","import { Combobox, ComboboxWidget } from '@angular/aria/combobox';\r\nimport { Tree, TreeItem, TreeItemGroup } from '@angular/aria/tree';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n TemplateRef,\r\n computed,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TX_TREE_DEFAULTS, TxTreeConfig, TxTreeNode, txTreeBranchIds } from './tree.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * A hierarchical tree of nodes.\r\n *\r\n * Behaviour is `@angular/aria`'s `ngTree` / `ngTreeItem` / `ngTreeItemGroup`:\r\n * roving focus, typeahead, arrow-key expansion, deferred rendering of collapsed\r\n * branches, and the full `treeitem` ARIA contract. Every visual state is read\r\n * off the attributes Aria emits — `aria-selected`, `aria-expanded`,\r\n * `aria-disabled`, `data-active` — so nothing is mirrored into a boolean and\r\n * toggled from TypeScript.\r\n *\r\n * ## Slots\r\n *\r\n * Structural customisation goes through `TemplateRef` inputs, not config:\r\n * `leadingTemplate` (before the label), `badgeTemplate` (after the label) and\r\n * `actionsTemplate` (trailing). Each receives a {@link TxTreeSlotContext}. The\r\n * `checkboxes` config fills the leading slot with a built-in indicator when no\r\n * `leadingTemplate` is given, so the common case needs no template at all.\r\n *\r\n * ## Reuse by the dropdown tree\r\n *\r\n * `comboboxHost` is the extension point that lets {@link TxDropdownTreeComponent}\r\n * compose this component into a combobox popup rather than re-implementing node\r\n * rendering. Setting it applies `ngComboboxWidget` to the `role=\"tree\"` element\r\n * so the combobox's `aria-controls` points at the tree itself. Only the two\r\n * `<ul>` declarations differ between the modes; every node is rendered by the\r\n * one recursive template below.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-tree\r\n * [nodes]=\"parts\"\r\n * [config]=\"{ selection: 'multiple', checkboxes: 'all' }\"\r\n * [(selectedIds)]=\"selected\"\r\n * [actionsTemplate]=\"rowActions\" />\r\n *\r\n * <ng-template #rowActions let-node>\r\n * <tx-button [config]=\"{ label: 'Rename ' + node.label, icon: 'edit',\r\n * display: 'icon-only', variant: 'ghost', size: 'sm' }\" />\r\n * </ng-template>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-tree',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [Tree, TreeItem, TreeItemGroup, ComboboxWidget, NgTemplateOutlet, TxIconComponent],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n @if (nodes().length === 0) {\r\n <p class=\"px-tx-3 py-tx-5 text-center text-tx-base text-tx-text-muted\">{{ emptyText() }}</p>\r\n } @else if (comboboxHost(); as combobox) {\r\n <!--\r\n Combobox-popup mode. ngComboboxWidget must sit on the role=\"tree\"\r\n element so the combobox's aria-controls references the tree itself, and\r\n focus stays on the trigger via aria-activedescendant.\r\n -->\r\n <ul\r\n ngTree\r\n #ariaTree=\"ngTree\"\r\n ngComboboxWidget\r\n [activeDescendant]=\"ariaTree.activeDescendant()\"\r\n focusMode=\"activedescendant\"\r\n selectionMode=\"explicit\"\r\n [class]=\"treeClass()\"\r\n [multi]=\"isMulti()\"\r\n [disabled]=\"isDisabled()\"\r\n [value]=\"selectedIds()\"\r\n (valueChange)=\"onValue($event)\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"nodeList\"\r\n [ngTemplateOutletContext]=\"{ list: nodes(), parent: ariaTree, level: 1 }\"\r\n />\r\n </ul>\r\n } @else {\r\n <ul\r\n ngTree\r\n #ariaTree=\"ngTree\"\r\n focusMode=\"roving\"\r\n selectionMode=\"explicit\"\r\n [class]=\"treeClass()\"\r\n [multi]=\"isMulti()\"\r\n [disabled]=\"isDisabled()\"\r\n [value]=\"selectedIds()\"\r\n (valueChange)=\"onValue($event)\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"nodeList\"\r\n [ngTemplateOutletContext]=\"{ list: nodes(), parent: ariaTree, level: 1 }\"\r\n />\r\n </ul>\r\n }\r\n\r\n <!--\r\n The single source of node rendering, shared by both modes above and by the\r\n dropdown tree. Recurses through itself for children.\r\n\r\n Aria's TreeItem takes the Tree for a root and the owning TreeItemGroup for\r\n a child, never the parent TreeItem — hence the group reference threaded\r\n through the recursion context.\r\n -->\r\n <ng-template #nodeList let-list=\"list\" let-parent=\"parent\" let-level=\"level\">\r\n @for (node of list; track node.id) {\r\n <li\r\n ngTreeItem\r\n #item=\"ngTreeItem\"\r\n class=\"block\"\r\n [parent]=\"parent\"\r\n [value]=\"node.id\"\r\n [label]=\"node.label\"\r\n [disabled]=\"node.disabled === true\"\r\n [selectable]=\"node.selectable !== false && selectionEnabled()\"\r\n [expanded]=\"isExpanded(node.id)\"\r\n (expandedChange)=\"setExpanded(node.id, $event)\"\r\n >\r\n <!--\r\n The visual row. Aria's state attributes live on the <li>, which also\r\n wraps this node's children, so a plain descendant variant would let a\r\n selected parent bleed into every row beneath it. The direct-child\r\n arbitrary variants below scope each state to its own row.\r\n -->\r\n <div [class]=\"rowClass()\">\r\n @if (node.children?.length && collapsible()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-grid size-tx-icon-md shrink-0 cursor-pointer place-items-center\r\n rounded-tx-xs text-tx-text-subtle transition-colors\r\n hover:bg-tx-hover-fill hover:text-tx-text-heading\r\n focus-visible:bg-tx-hover-fill focus-visible:text-tx-text-heading\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"(isExpanded(node.id) ? 'Collapse ' : 'Expand ') + node.label\"\r\n (click)=\"toggle(node.id, $event)\"\r\n >\r\n <tx-icon\r\n [config]=\"{\r\n name: isExpanded(node.id) ? 'chevron-down' : 'chevron-right',\r\n size: 'sm'\r\n }\"\r\n />\r\n </button>\r\n } @else {\r\n <span class=\"size-tx-icon-md shrink-0\" aria-hidden=\"true\"></span>\r\n }\r\n\r\n @if (leadingTemplate(); as tpl) {\r\n <span class=\"flex shrink-0 items-center\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"slotContext(node, level)\"\r\n />\r\n </span>\r\n } @else if (showCheckbox(node)) {\r\n <!--\r\n A visual indicator, not an input: the row already carries\r\n aria-selected, and a real checkbox here would announce the state\r\n a second time. [[aria-selected=true]>*>&] walks up exactly two\r\n levels — this row's own <li> — so a selected ancestor never\r\n lights up its descendants' boxes.\r\n -->\r\n <span\r\n class=\"grid size-tx-4 shrink-0 place-items-center rounded-tx-xs border\r\n border-tx-border bg-tx-surface text-transparent transition-colors\r\n [[aria-selected=true]>*>&]:border-tx-primary\r\n [[aria-selected=true]>*>&]:bg-tx-primary\r\n [[aria-selected=true]>*>&]:text-tx-text-on-primary\"\r\n aria-hidden=\"true\"\r\n >\r\n <tx-icon [config]=\"{ name: 'check', size: 'sm' }\" />\r\n </span>\r\n }\r\n\r\n @if (node.icon; as name) {\r\n <span class=\"flex shrink-0 text-tx-text-subtle\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n </span>\r\n }\r\n\r\n <span class=\"min-w-0 flex-1 truncate\">{{ node.label }}</span>\r\n\r\n @if (badgeTemplate(); as tpl) {\r\n <span class=\"shrink-0\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"slotContext(node, level)\"\r\n />\r\n </span>\r\n } @else if (node.badge; as badge) {\r\n <span\r\n class=\"shrink-0 rounded-tx-full border border-tx-border bg-tx-surface-sunken\r\n px-tx-1-5 font-tx-mono text-tx-2xs font-normal text-tx-text-muted\"\r\n >{{ badge }}</span\r\n >\r\n }\r\n\r\n <!--\r\n Trailing actions: quiet until this row is hovered, focused within\r\n or selected — every hover affordance paired with a focus one — and\r\n always visible below md, where there is no hover at all.\r\n -->\r\n @if (actionsTemplate(); as tpl) {\r\n <span\r\n class=\"ml-auto flex shrink-0 items-center gap-tx-1 opacity-0 transition-opacity\r\n group-hover/txrow:opacity-100 group-focus-within/txrow:opacity-100\r\n [[aria-selected=true]>*>&]:opacity-100 max-md:opacity-100\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"slotContext(node, level)\"\r\n />\r\n </span>\r\n }\r\n </div>\r\n\r\n @if (node.children?.length) {\r\n <ul role=\"group\">\r\n <ng-template ngTreeItemGroup #group=\"ngTreeItemGroup\" [ownedBy]=\"item\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"nodeList\"\r\n [ngTemplateOutletContext]=\"{\r\n list: node.children,\r\n parent: group,\r\n level: level + 1\r\n }\"\r\n />\r\n </ng-template>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n </ng-template>\r\n `,\r\n})\r\nexport class TxTreeComponent<T = string> {\r\n readonly config = input<Partial<TxTreeConfig>>({});\r\n\r\n /** The node hierarchy. Data, so it is its own input. */\r\n readonly nodes = input.required<readonly TxTreeNode<T>[]>();\r\n\r\n /** Selected node ids. Always an array, including in single-select. */\r\n readonly selectedIds = model<T[]>([]);\r\n\r\n /** Expanded branch ids. Two-way, so a page can expand or collapse all. */\r\n readonly expandedIds = model<T[]>([]);\r\n\r\n /* ---- structural slots ---- */\r\n\r\n /** Before the label. Replaces the built-in checkbox indicator. */\r\n readonly leadingTemplate = input<TemplateRef<unknown> | null>(null);\r\n /** After the label. Replaces the node's `badge` text. */\r\n readonly badgeTemplate = input<TemplateRef<unknown> | null>(null);\r\n /** Trailing row actions. Revealed on hover, focus-within or selection. */\r\n readonly actionsTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n /**\r\n * Extension point for {@link TxDropdownTreeComponent}: the combobox this tree\r\n * is the popup widget for. Leave unset for a standalone tree.\r\n */\r\n readonly comboboxHost = input<Combobox | null>(null);\r\n\r\n readonly selectionChange = output<T[]>();\r\n readonly expansionChange = output<T[]>();\r\n\r\n private readonly resolved = computed<TxTreeConfig>(() =>\r\n txMergeConfig(TX_TREE_DEFAULTS, this.config()),\r\n );\r\n\r\n private readonly expandedSet = computed(() => new Set(this.expandedIds()));\r\n\r\n protected readonly emptyText = computed(() => this.resolved().emptyText);\r\n protected readonly isDisabled = computed(() => this.resolved().disabled === true);\r\n protected readonly selectionEnabled = computed(() => this.resolved().selection !== 'none');\r\n protected readonly isMulti = computed(() => this.resolved().selection === 'multiple');\r\n protected readonly collapsible = computed(() => this.resolved().expansion === 'collapsible');\r\n\r\n protected readonly treeClass = computed(() =>\r\n [\r\n 'm-0 list-none p-0 focus:outline-none',\r\n this.resolved().guides === 'lines' ? 'tx-tree-guides' : 'tx-tree-plain',\r\n ].join(' '),\r\n );\r\n\r\n protected readonly rowClass = computed(() =>\r\n [\r\n 'group/txrow flex cursor-pointer items-center gap-tx-2 rounded-tx-sm',\r\n 'border border-transparent',\r\n this.resolved().size === 'sm'\r\n ? 'px-tx-1-5 py-tx-0-5 text-tx-sm'\r\n : 'px-tx-2 py-tx-1 text-tx-base',\r\n 'leading-tx-snug text-tx-text-primary transition-colors duration-150 ease-tx-standard',\r\n 'hover:bg-tx-hover-fill',\r\n // Direct-child variants: state lives on this row's own <li>, never an\r\n // ancestor's, so nothing bleeds down the tree.\r\n '[[data-active=true]>&]:bg-tx-hover-fill',\r\n '[[aria-selected=true]>&]:border-tx-primary-border',\r\n '[[aria-selected=true]>&]:bg-tx-selected-fill',\r\n '[[aria-selected=true]>&]:font-medium',\r\n '[[aria-selected=true]>&]:text-tx-primary-text',\r\n '[[aria-disabled=true]>&]:cursor-not-allowed',\r\n '[[aria-disabled=true]>&]:bg-transparent',\r\n '[[aria-disabled=true]>&]:text-tx-text-disabled',\r\n ].join(' '),\r\n );\r\n\r\n /** Expands every branch. */\r\n expandAll(): void {\r\n this.setExpansion(txTreeBranchIds(this.nodes()));\r\n }\r\n\r\n /** Collapses every branch. */\r\n collapseAll(): void {\r\n this.setExpansion([]);\r\n }\r\n\r\n protected isExpanded(id: T): boolean {\r\n // A static tree has no collapsed state to represent.\r\n return !this.collapsible() || this.expandedSet().has(id);\r\n }\r\n\r\n protected setExpanded(id: T, expanded: boolean): void {\r\n if (!this.collapsible() || this.isExpanded(id) === expanded) {\r\n return;\r\n }\r\n const next = new Set(this.expandedIds());\r\n if (expanded) {\r\n next.add(id);\r\n } else {\r\n next.delete(id);\r\n }\r\n this.setExpansion([...next]);\r\n }\r\n\r\n protected toggle(id: T, event: MouseEvent): void {\r\n // The tree's own click handler would otherwise also select the row.\r\n event.stopPropagation();\r\n this.setExpanded(id, !this.isExpanded(id));\r\n }\r\n\r\n protected showCheckbox(node: TxTreeNode<T>): boolean {\r\n const mode = this.resolved().checkboxes;\r\n if (mode === 'none' || !this.selectionEnabled()) {\r\n return false;\r\n }\r\n return mode === 'all' || !node.children?.length;\r\n }\r\n\r\n protected slotContext(node: TxTreeNode<T>, level: number) {\r\n return {\r\n $implicit: node,\r\n node,\r\n level,\r\n selected: this.selectedIds().includes(node.id),\r\n expanded: this.isExpanded(node.id),\r\n hasChildren: (node.children?.length ?? 0) > 0,\r\n };\r\n }\r\n\r\n protected onValue(next: T[]): void {\r\n this.selectedIds.set(next);\r\n this.selectionChange.emit(next);\r\n }\r\n\r\n private setExpansion(ids: T[]): void {\r\n this.expandedIds.set(ids);\r\n this.expansionChange.emit(ids);\r\n }\r\n}\r\n","import { Combobox, ComboboxPopup } from '@angular/aria/combobox';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n TemplateRef,\r\n computed,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport {\r\n CONTROL_ICON_SIZE,\r\n TX_TRIGGER_CHEVRON_CLASS,\r\n TX_TRIGGER_CLEAR_CLASS,\r\n TxControlSize,\r\n txControlShellClass,\r\n} from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { TX_POPUP_MAX_HEIGHT, TX_POPUP_PANEL_CLASS, TxPopupHeight } from '../core/popup-classes';\r\nimport { txSelectionSummary, txVisibleChips } from '../core/selection-summary';\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TxConnectedOverlayDirective } from '../overlay/connected-overlay.directive';\r\nimport { TxOverlayCloseReason, TxOverlayConfig } from '../overlay/overlay.types';\r\nimport { TxTreeComponent } from '../tree/tree.component';\r\nimport {\r\n TxTreeCheckboxes,\r\n TxTreeExpansion,\r\n TxTreeGuides,\r\n TxTreeNode,\r\n findTxTreeNode,\r\n} from '../tree/tree.types';\r\nimport { TxMultiselectSummary } from '../select/select.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Simple property configuration for {@link TxDropdownTreeComponent}. */\r\nexport interface TxDropdownTreeConfig {\r\n /** Shown in the trigger when nothing is selected. */\r\n placeholder?: string;\r\n /**\r\n * Defaults to `single`: the popup closes on selection. `multiple` keeps the\r\n * popup open and turns on the tree's leading checkbox indicator.\r\n */\r\n selection?: 'single' | 'multiple';\r\n /** How a multiple selection is summarised in the closed trigger. Defaults to `chips`. */\r\n summary?: TxMultiselectSummary;\r\n /** Chips shown before collapsing to a \"+n\" pill. Defaults to 3. */\r\n maxVisibleChips?: number;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Defaults to `md`. */\r\n popupHeight?: TxPopupHeight;\r\n /** Forwarded to the tree. Defaults to `all` when selection is `multiple`. */\r\n checkboxes?: TxTreeCheckboxes;\r\n /** Forwarded to the tree. Defaults to `collapsible`. */\r\n expansion?: TxTreeExpansion;\r\n /** Forwarded to the tree. Defaults to `lines`. */\r\n guides?: TxTreeGuides;\r\n clearable?: boolean;\r\n disabled?: boolean;\r\n required?: boolean;\r\n invalid?: boolean;\r\n emptyText?: string;\r\n ariaLabel?: string;\r\n name?: string;\r\n}\r\n\r\nexport const TX_DROPDOWN_TREE_DEFAULTS = {\r\n placeholder: 'Select…',\r\n selection: 'single',\r\n summary: 'chips',\r\n maxVisibleChips: 3,\r\n popupHeight: 'md',\r\n expansion: 'collapsible',\r\n guides: 'lines',\r\n emptyText: 'No items',\r\n} as const satisfies Partial<TxDropdownTreeConfig>;\r\n\r\n/**\r\n * A select-style trigger whose popup contains a tree.\r\n *\r\n * Assembled from the pieces that already exist rather than reimplemented: the\r\n * combobox trigger and {@link TxConnectedOverlayDirective} from the select, and\r\n * {@link TxTreeComponent} for everything inside the popup. No node-rendering\r\n * logic is duplicated — the tree's `comboboxHost` input is the extension point\r\n * that lets it act as the combobox's popup widget, so `aria-controls` points at\r\n * the real `role=\"tree\"` element and its collapsible behaviour, badge slot and\r\n * leading-checkbox slot all work exactly as they do standalone.\r\n *\r\n * Single-select closes the popup on selection and shows the node's label.\r\n * Multi-select keeps the popup open, turns on the tree's checkbox indicator and\r\n * summarises the selection in the trigger.\r\n *\r\n * Typed-text filtering inside the trigger is out of scope for v1. The trigger is\r\n * laid out so a search box can be added inside the popup later without changing\r\n * this public API.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Failed part' }\">\r\n * <tx-dropdown-tree\r\n * [nodes]=\"assemblyTree\"\r\n * [config]=\"{ selection: 'multiple', summary: 'chips', clearable: true }\"\r\n * [(selectedIds)]=\"failedParts\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-dropdown-tree',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n Combobox,\r\n ComboboxPopup,\r\n TxIconComponent,\r\n TxConnectedOverlayDirective,\r\n TxTreeComponent,\r\n ],\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxDropdownTreeComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div\r\n class=\"flex min-w-0\"\r\n [txConnectedOverlay]=\"popup\"\r\n [txOverlayOpen]=\"expanded()\"\r\n [txOverlayConfig]=\"overlayConfig\"\r\n (closed)=\"onOverlayClosed($event)\"\r\n >\r\n <div\r\n #trigger\r\n ngCombobox\r\n #combobox=\"ngCombobox\"\r\n [id]=\"fieldId()\"\r\n [class]=\"triggerClass()\"\r\n [(expanded)]=\"expanded\"\r\n [disabled]=\"isDisabled()\"\r\n [softDisabled]=\"true\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n >\r\n @if (selectedIds().length === 0) {\r\n <span class=\"min-w-0 flex-1 truncate text-tx-text-disabled\">{{ placeholder() }}</span>\r\n } @else if (isMultiple() && summary() === 'chips') {\r\n <span class=\"flex min-w-0 flex-1 flex-wrap items-center gap-tx-1\">\r\n @for (label of chips().visible; track label) {\r\n <span\r\n class=\"inline-flex max-w-full items-center rounded-tx-full border border-tx-border\r\n bg-tx-surface-sunken px-tx-2 py-tx-0-5 text-tx-xs text-tx-text-primary\"\r\n >\r\n <span class=\"truncate\">{{ label }}</span>\r\n </span>\r\n }\r\n @if (chips().overflow > 0) {\r\n <span\r\n class=\"inline-flex shrink-0 items-center rounded-tx-full border\r\n border-tx-primary-border bg-tx-primary-subtle px-tx-2 py-tx-0-5\r\n font-tx-mono text-tx-2xs text-tx-primary-text\"\r\n >+{{ chips().overflow }}</span\r\n >\r\n }\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-tx-text-primary\">{{ triggerText() }}</span>\r\n }\r\n\r\n @if (showClear()) {\r\n <button\r\n type=\"button\"\r\n [class]=\"clearClass\"\r\n aria-label=\"Clear selection\"\r\n (click)=\"clear($event)\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n\r\n <span [class]=\"chevronClass\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: 'chevron-down', size: iconSize() }\" />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #popup>\r\n <ng-template ngComboboxPopup [combobox]=\"combobox\" popupType=\"tree\">\r\n <div [class]=\"panelClass()\">\r\n <div class=\"min-h-0 flex-1 overflow-auto overscroll-contain p-tx-1-5\">\r\n <tx-tree\r\n [nodes]=\"nodes()\"\r\n [config]=\"treeConfig()\"\r\n [comboboxHost]=\"combobox\"\r\n [selectedIds]=\"selectedIds()\"\r\n (selectionChange)=\"onTreeSelection($event)\"\r\n [expandedIds]=\"expandedIds()\"\r\n (expansionChange)=\"expandedIds.set($event)\"\r\n [leadingTemplate]=\"leadingTemplate()\"\r\n [badgeTemplate]=\"badgeTemplate()\"\r\n [actionsTemplate]=\"actionsTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n `,\r\n})\r\nexport class TxDropdownTreeComponent<T = string> implements ControlValueAccessor {\r\n readonly config = input<Partial<TxDropdownTreeConfig>>({});\r\n\r\n /** The node hierarchy. Data, so it is its own input. */\r\n readonly nodes = input.required<readonly TxTreeNode<T>[]>();\r\n\r\n /** Selected node ids. Always an array, including in single-select. */\r\n readonly selectedIds = model<T[]>([]);\r\n\r\n /** Expanded branch ids, forwarded to the tree. */\r\n readonly expandedIds = model<T[]>([]);\r\n\r\n /* ---- slots, forwarded to the tree unchanged ---- */\r\n readonly leadingTemplate = input<TemplateRef<unknown> | null>(null);\r\n readonly badgeTemplate = input<TemplateRef<unknown> | null>(null);\r\n readonly actionsTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n readonly changed = output<T[]>();\r\n readonly openedChange = output<boolean>();\r\n\r\n protected readonly expanded = signal(false);\r\n\r\n private readonly trigger = viewChild.required<ElementRef<HTMLElement>>('trigger');\r\n private readonly formField = txBindFormField('dropdown-tree');\r\n private readonly forms = new TxControlValueBridge<T[]>((next) =>\r\n this.selectedIds.set(next ?? []),\r\n );\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n\r\n protected readonly overlayConfig: Partial<TxOverlayConfig> = {\r\n placement: 'bottom-start',\r\n width: 'min-trigger',\r\n };\r\n\r\n private readonly resolved = computed<TxDropdownTreeConfig>(() =>\r\n txMergeConfig(TX_DROPDOWN_TREE_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly placeholder = computed(() => this.resolved().placeholder);\r\n protected readonly summary = computed(() => this.resolved().summary);\r\n protected readonly isMultiple = computed(() => this.resolved().selection === 'multiple');\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n protected readonly iconSize = computed(() => CONTROL_ICON_SIZE[this.size()]);\r\n\r\n /** Everything the tree needs, derived from this component's own config. */\r\n protected readonly treeConfig = computed(() => {\r\n const config = this.resolved();\r\n return {\r\n selection: config.selection === 'multiple' ? ('multiple' as const) : ('single' as const),\r\n checkboxes: config.checkboxes ?? (this.isMultiple() ? ('all' as const) : ('none' as const)),\r\n expansion: config.expansion,\r\n guides: config.guides,\r\n emptyText: config.emptyText,\r\n size: this.size() === 'sm' ? ('sm' as const) : ('md' as const),\r\n disabled: this.isDisabled(),\r\n };\r\n });\r\n\r\n private readonly selectedLabels = computed(() =>\r\n this.selectedIds()\r\n .map((id) => findTxTreeNode(this.nodes(), id)?.label)\r\n .filter((label): label is string => label !== undefined),\r\n );\r\n\r\n protected readonly chips = computed(() =>\r\n txVisibleChips(this.selectedLabels(), this.resolved().maxVisibleChips ?? 3),\r\n );\r\n\r\n protected readonly triggerText = computed(() => {\r\n const labels = this.selectedLabels();\r\n if (!this.isMultiple()) {\r\n return labels[0] ?? this.placeholder() ?? '';\r\n }\r\n return txSelectionSummary(labels, this.summary() === 'comma' ? 'comma' : 'count');\r\n });\r\n\r\n protected readonly showClear = computed(\r\n () =>\r\n this.resolved().clearable === true && this.selectedIds().length > 0 && !this.isDisabled(),\r\n );\r\n\r\n protected readonly triggerClass = computed(() =>\r\n [\r\n txControlShellClass({\r\n size: this.size(),\r\n invalid: this.isInvalid(),\r\n height: this.isMultiple() && this.summary() === 'chips' ? 'auto' : 'fixed',\r\n }),\r\n 'group flex cursor-pointer items-center gap-tx-2 text-left',\r\n this.isDisabled() ? 'pointer-events-none' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly chevronClass = TX_TRIGGER_CHEVRON_CLASS;\r\n protected readonly clearClass = TX_TRIGGER_CLEAR_CLASS;\r\n\r\n protected readonly panelClass = computed(() =>\r\n [TX_POPUP_PANEL_CLASS, TX_POPUP_MAX_HEIGHT[this.resolved().popupHeight ?? 'md']].join(' '),\r\n );\r\n\r\n protected onTreeSelection(next: T[]): void {\r\n this.selectedIds.set(next);\r\n this.forms.emit(next);\r\n this.changed.emit(next);\r\n if (!this.isMultiple()) {\r\n this.close(true);\r\n }\r\n }\r\n\r\n protected onOverlayClosed(reason: TxOverlayCloseReason): void {\r\n this.close(reason === 'escape');\r\n }\r\n\r\n private close(restoreFocus: boolean): void {\r\n if (!this.expanded()) {\r\n return;\r\n }\r\n this.expanded.set(false);\r\n this.forms.touch();\r\n this.openedChange.emit(false);\r\n if (restoreFocus) {\r\n this.trigger().nativeElement.focus();\r\n }\r\n }\r\n\r\n protected clear(event: MouseEvent): void {\r\n // The combobox's own click handler would otherwise toggle the popup open.\r\n event.stopPropagation();\r\n this.selectedIds.set([]);\r\n this.forms.emit([]);\r\n this.changed.emit([]);\r\n this.trigger().nativeElement.focus();\r\n }\r\n\r\n /** Moves focus onto the trigger. */\r\n focus(): void {\r\n this.trigger().nativeElement.focus();\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: T[]): void {\r\n this.forms.writeValue(value ?? []);\r\n }\r\n registerOnChange(fn: (value: T[]) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","import { Combobox, ComboboxPopup, ComboboxWidget } from '@angular/aria/combobox';\r\nimport { Listbox, Option } from '@angular/aria/listbox';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { TxControlSize, txControlShellClass } from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { TxOption } from '../core/option';\r\nimport {\r\n TX_POPUP_EMPTY_CLASS,\r\n TX_POPUP_LIST_CLASS,\r\n TX_POPUP_MAX_HEIGHT,\r\n TX_POPUP_OPTION_CLASS,\r\n TX_POPUP_PANEL_CLASS,\r\n TxPopupHeight,\r\n} from '../core/popup-classes';\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TxConnectedOverlayDirective } from '../overlay/connected-overlay.directive';\r\nimport { TxOverlayCloseReason, TxOverlayConfig } from '../overlay/overlay.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * Where new chip values may come from.\r\n *\r\n * A union rather than `allowFreeText` + `allowSuggestions` booleans, so the\r\n * three states stay mutually exclusive as they are added to.\r\n */\r\nexport type TxChipsSource = 'free-text' | 'suggestions' | 'both';\r\n\r\n/** Simple property configuration for {@link TxChipsInputComponent}. */\r\nexport interface TxChipsInputConfig {\r\n placeholder?: string;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Defaults to `both`. */\r\n source?: TxChipsSource;\r\n /** Defaults to `md`. */\r\n popupHeight?: TxPopupHeight;\r\n /** Refuses a value already present. Defaults to true. */\r\n unique?: boolean;\r\n /** Maximum number of chips. Further input is refused once reached. */\r\n max?: number;\r\n /** Keys that commit the typed text. Defaults to Enter and comma. */\r\n commitKeys?: readonly string[];\r\n disabled?: boolean;\r\n required?: boolean;\r\n invalid?: boolean;\r\n /** Message shown in the popup when nothing matches. */\r\n emptyText?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_CHIPS_INPUT_DEFAULTS = {\r\n placeholder: 'Add…',\r\n source: 'both',\r\n popupHeight: 'md',\r\n unique: true,\r\n commitKeys: ['Enter', ','],\r\n emptyText: 'No matches',\r\n} as const satisfies Partial<TxChipsInputConfig>;\r\n\r\n/**\r\n * A text field that turns entries into removable chips, with an optional\r\n * suggestion popup.\r\n *\r\n * The popup is `@angular/aria`'s combobox and listbox — the same primitives and\r\n * the same overlay as the select — driven by an editable `<input>` rather than a\r\n * static trigger, which is exactly the autocomplete shape Aria's combobox is\r\n * built for. Suggestions filter as you type.\r\n *\r\n * Backspace on an empty field removes the last chip, matching every chips input\r\n * people already know.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Symptoms' }\">\r\n * <tx-chips-input\r\n * [suggestions]=\"symptomOptions\"\r\n * [config]=\"{ placeholder: 'Add a symptom…', max: 8 }\"\r\n * [(value)]=\"symptoms\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-chips-input',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n Combobox,\r\n ComboboxPopup,\r\n ComboboxWidget,\r\n Listbox,\r\n Option,\r\n TxIconComponent,\r\n TxConnectedOverlayDirective,\r\n ],\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxChipsInputComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div\r\n #shell\r\n [class]=\"shellClass()\"\r\n [txConnectedOverlay]=\"popup\"\r\n [txOverlayOpen]=\"expanded() && filtered().length > 0\"\r\n [txOverlayConfig]=\"overlayConfig\"\r\n (closed)=\"onOverlayClosed($event)\"\r\n (click)=\"focus()\"\r\n >\r\n @for (chip of value(); track chip) {\r\n <span\r\n class=\"inline-flex max-w-full items-center gap-tx-1-5 rounded-tx-full border\r\n border-tx-border bg-tx-surface-sunken py-tx-0-5 pr-tx-1 pl-tx-2-5\r\n text-tx-xs text-tx-text-primary\"\r\n >\r\n <span class=\"truncate\">{{ labelFor(chip) }}</span>\r\n @if (!isDisabled()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-grid size-tx-4 shrink-0 cursor-pointer place-items-center\r\n rounded-tx-full bg-tx-accent text-tx-text-on-accent transition-colors\r\n hover:bg-tx-danger focus-visible:bg-tx-danger\"\r\n [attr.aria-label]=\"'Remove ' + labelFor(chip)\"\r\n (click)=\"remove(chip, $event)\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n </span>\r\n }\r\n\r\n <input\r\n #field\r\n ngCombobox\r\n #combobox=\"ngCombobox\"\r\n [id]=\"fieldId()\"\r\n class=\"min-w-tx-20 flex-1 border-none bg-transparent p-0 text-tx-base\r\n text-tx-text-primary placeholder:text-tx-text-disabled focus:outline-none\r\n disabled:cursor-not-allowed\"\r\n [(expanded)]=\"expanded\"\r\n [(value)]=\"query\"\r\n [disabled]=\"isDisabled() || atMax()\"\r\n [attr.placeholder]=\"value().length === 0 || !atMax() ? placeholder() : ''\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <ng-template #popup>\r\n <ng-template ngComboboxPopup [combobox]=\"combobox\" popupType=\"listbox\">\r\n <div [class]=\"panelClass()\">\r\n <div\r\n ngComboboxWidget\r\n ngListbox\r\n #listbox=\"ngListbox\"\r\n focusMode=\"activedescendant\"\r\n selectionMode=\"explicit\"\r\n [class]=\"listClass\"\r\n [value]=\"[]\"\r\n (valueChange)=\"onSuggestionPicked($event)\"\r\n [activeDescendant]=\"listbox.activeDescendant()\"\r\n >\r\n @for (option of filtered(); track option.value) {\r\n <div\r\n ngOption\r\n [value]=\"option.value\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.disabled === true\"\r\n [class]=\"optionClass\"\r\n >\r\n <span class=\"min-w-0 flex-1\">\r\n <span class=\"block truncate\">{{ option.label }}</span>\r\n @if (option.description; as text) {\r\n <span class=\"block truncate text-tx-xs font-normal text-tx-text-muted\">\r\n {{ text }}\r\n </span>\r\n }\r\n </span>\r\n </div>\r\n } @empty {\r\n <p [class]=\"emptyClass\">{{ emptyText() }}</p>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n `,\r\n})\r\nexport class TxChipsInputComponent implements ControlValueAccessor {\r\n readonly config = input<Partial<TxChipsInputConfig>>({});\r\n\r\n /** Optional suggestions. Data, so it is its own input. */\r\n readonly suggestions = input<readonly TxOption<string>[]>([]);\r\n\r\n /** The committed chip values. */\r\n readonly value = model<string[]>([]);\r\n\r\n readonly changed = output<string[]>();\r\n /** Emitted when a value is refused — duplicate, or over `max`. */\r\n readonly rejected = output<{ value: string; reason: 'duplicate' | 'max' }>();\r\n\r\n protected readonly expanded = signal(false);\r\n protected readonly query = signal('');\r\n\r\n private readonly shell = viewChild.required<ElementRef<HTMLElement>>('shell');\r\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\r\n private readonly formField = txBindFormField('chips');\r\n private readonly forms = new TxControlValueBridge<string[]>((next) =>\r\n this.value.set(next ?? []),\r\n );\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n protected readonly optionClass = TX_POPUP_OPTION_CLASS;\r\n protected readonly emptyClass = TX_POPUP_EMPTY_CLASS;\r\n protected readonly listClass = TX_POPUP_LIST_CLASS;\r\n\r\n protected readonly overlayConfig: Partial<TxOverlayConfig> = {\r\n placement: 'bottom-start',\r\n width: 'trigger',\r\n };\r\n\r\n private readonly resolved = computed<TxChipsInputConfig>(() =>\r\n txMergeConfig(TX_CHIPS_INPUT_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly placeholder = computed(() => this.resolved().placeholder);\r\n protected readonly emptyText = computed(() => this.resolved().emptyText);\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n\r\n protected readonly atMax = computed(() => {\r\n const max = this.resolved().max;\r\n return max !== undefined && this.value().length >= max;\r\n });\r\n\r\n /** Suggestions matching the query and not already chosen. */\r\n protected readonly filtered = computed(() => {\r\n if (this.resolved().source === 'free-text') {\r\n return [];\r\n }\r\n const query = this.query().trim().toLowerCase();\r\n const chosen = new Set(this.value());\r\n return this.suggestions().filter(\r\n (option) =>\r\n !chosen.has(option.value) &&\r\n (query.length === 0 || option.label.toLowerCase().includes(query)),\r\n );\r\n });\r\n\r\n protected readonly shellClass = computed(() =>\r\n [\r\n txControlShellClass({ size: this.size(), invalid: this.isInvalid(), height: 'auto' }),\r\n 'flex cursor-text flex-wrap items-center gap-tx-1-5',\r\n this.isDisabled() ? 'pointer-events-none opacity-70' : '',\r\n // The shell is not itself focusable; it shows the ring when the inner\r\n // input has focus, so the whole control reads as one field.\r\n 'focus-within:border-tx-primary focus-within:shadow-tx-focus',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly panelClass = computed(() =>\r\n [TX_POPUP_PANEL_CLASS, TX_POPUP_MAX_HEIGHT[this.resolved().popupHeight ?? 'md']].join(' '),\r\n );\r\n\r\n /** The suggestion's label if the chip came from one, else the raw value. */\r\n protected labelFor(value: string): string {\r\n return this.suggestions().find((option) => option.value === value)?.label ?? value;\r\n }\r\n\r\n /** Moves focus into the text field. */\r\n focus(): void {\r\n if (!this.isDisabled() && !this.atMax()) {\r\n this.field().nativeElement.focus();\r\n }\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const commitKeys = this.resolved().commitKeys ?? TX_CHIPS_INPUT_DEFAULTS.commitKeys;\r\n\r\n // Backspace on an empty field removes the last chip.\r\n if (event.key === 'Backspace' && this.query().length === 0 && this.value().length > 0) {\r\n event.preventDefault();\r\n this.commitValue(this.value().slice(0, -1));\r\n return;\r\n }\r\n\r\n if (!commitKeys.includes(event.key)) {\r\n return;\r\n }\r\n\r\n // While a suggestion is active, let Aria's combobox handle Enter so the\r\n // highlighted option wins over the raw text.\r\n const activeDescendant = this.field().nativeElement.getAttribute('aria-activedescendant');\r\n if (event.key === 'Enter' && activeDescendant) {\r\n return;\r\n }\r\n\r\n if (this.resolved().source === 'suggestions') {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n this.add(this.query());\r\n }\r\n\r\n protected onSuggestionPicked(picked: string[]): void {\r\n const value = picked[0];\r\n if (value !== undefined) {\r\n this.add(value);\r\n }\r\n }\r\n\r\n /** Adds a value as a chip, applying the uniqueness and max rules. */\r\n add(raw: string): void {\r\n const value = raw.trim();\r\n if (value.length === 0) {\r\n return;\r\n }\r\n if (this.atMax()) {\r\n this.rejected.emit({ value, reason: 'max' });\r\n return;\r\n }\r\n if (this.resolved().unique !== false && this.value().includes(value)) {\r\n this.rejected.emit({ value, reason: 'duplicate' });\r\n this.query.set('');\r\n return;\r\n }\r\n this.commitValue([...this.value(), value]);\r\n this.query.set('');\r\n }\r\n\r\n protected remove(chip: string, event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.commitValue(this.value().filter((item) => item !== chip));\r\n this.focus();\r\n }\r\n\r\n protected onOverlayClosed(reason: TxOverlayCloseReason): void {\r\n this.expanded.set(false);\r\n if (reason === 'escape') {\r\n this.focus();\r\n }\r\n }\r\n\r\n protected onBlur(): void {\r\n this.forms.touch();\r\n }\r\n\r\n private commitValue(next: string[]): void {\r\n this.value.set(next);\r\n this.forms.emit(next);\r\n this.changed.emit(next);\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: string[]): void {\r\n this.forms.writeValue(value ?? []);\r\n }\r\n registerOnChange(fn: (value: string[]) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n","/**\r\n * Pure date helpers for {@link TxDatepickerComponent}.\r\n *\r\n * Everything here is local-time and constructed with `new Date(y, m, d)` rather\r\n * than by parsing strings, so a date never shifts a day across a timezone\r\n * boundary. Kept separate from the component because parsing and grid building\r\n * are exactly the sort of logic that is easy to get subtly wrong, and are the\r\n * part worth unit-testing.\r\n */\r\n\r\n/** Supported input/display formats. */\r\nexport type TxDateFormat = 'iso' | 'dmy' | 'mdy';\r\n\r\n/** 0 = Sunday … 6 = Saturday. */\r\nexport type TxWeekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;\r\n\r\n/** Midnight local time on the same calendar day. */\r\nexport function txStartOfDay(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n}\r\n\r\n/** Whether two dates fall on the same calendar day. */\r\nexport function txIsSameDay(a: Date | null, b: Date | null): boolean {\r\n if (!a || !b) {\r\n return false;\r\n }\r\n return (\r\n a.getFullYear() === b.getFullYear() &&\r\n a.getMonth() === b.getMonth() &&\r\n a.getDate() === b.getDate()\r\n );\r\n}\r\n\r\n/** Whether two dates fall in the same calendar month. */\r\nexport function txIsSameMonth(a: Date, b: Date): boolean {\r\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\r\n}\r\n\r\n/** The first day of `date`'s month. */\r\nexport function txStartOfMonth(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n}\r\n\r\n/**\r\n * Adds whole months, clamping the day so that adding a month to 31 January\r\n * gives 28/29 February rather than rolling into March.\r\n */\r\nexport function txAddMonths(date: Date, months: number): Date {\r\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\r\n const lastDay = txDaysInMonth(target.getFullYear(), target.getMonth());\r\n return new Date(target.getFullYear(), target.getMonth(), Math.min(date.getDate(), lastDay));\r\n}\r\n\r\n/** Adds whole days. */\r\nexport function txAddDays(date: Date, days: number): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\r\n}\r\n\r\n/** Number of days in a given month. `month` is 0-based. */\r\nexport function txDaysInMonth(year: number, month: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n}\r\n\r\n/** Restricts a date to the inclusive `[min, max]` range. */\r\nexport function txClampDate(date: Date, min?: Date | null, max?: Date | null): Date {\r\n if (min && date < txStartOfDay(min)) {\r\n return txStartOfDay(min);\r\n }\r\n if (max && date > txStartOfDay(max)) {\r\n return txStartOfDay(max);\r\n }\r\n return date;\r\n}\r\n\r\n/** Whether a date falls inside the inclusive `[min, max]` range. */\r\nexport function txIsWithin(date: Date, min?: Date | null, max?: Date | null): boolean {\r\n const day = txStartOfDay(date);\r\n if (min && day < txStartOfDay(min)) {\r\n return false;\r\n }\r\n if (max && day > txStartOfDay(max)) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Formats a date for display and for the text input.\r\n *\r\n * Always zero-padded and always four-digit years, so the output round-trips\r\n * back through {@link txParseDate} unchanged.\r\n */\r\nexport function txFormatDate(date: Date | null, format: TxDateFormat): string {\r\n if (!date || Number.isNaN(date.getTime())) {\r\n return '';\r\n }\r\n const year = String(date.getFullYear()).padStart(4, '0');\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n\r\n switch (format) {\r\n case 'iso':\r\n return `${year}-${month}-${day}`;\r\n case 'dmy':\r\n return `${day}/${month}/${year}`;\r\n case 'mdy':\r\n return `${month}/${day}/${year}`;\r\n }\r\n}\r\n\r\n/** The placeholder that matches a format, e.g. `dd/mm/yyyy`. */\r\nexport function txFormatPlaceholder(format: TxDateFormat): string {\r\n switch (format) {\r\n case 'iso':\r\n return 'yyyy-mm-dd';\r\n case 'dmy':\r\n return 'dd/mm/yyyy';\r\n case 'mdy':\r\n return 'mm/dd/yyyy';\r\n }\r\n}\r\n\r\n/**\r\n * Parses user-typed text.\r\n *\r\n * Accepts `-`, `/` and `.` as separators regardless of format, and one- or\r\n * two-digit day/month parts, because people type `1/2/2026` far more often than\r\n * `01/02/2026`. Returns `null` for anything that is not a real calendar date —\r\n * notably 31 February, which a naive `new Date` would silently roll into March.\r\n */\r\nexport function txParseDate(text: string, format: TxDateFormat): Date | null {\r\n const trimmed = text.trim();\r\n if (trimmed.length === 0) {\r\n return null;\r\n }\r\n\r\n const parts = trimmed.split(/[-/.]/).filter((part) => part.length > 0);\r\n if (parts.length !== 3 || parts.some((part) => !/^\\d+$/.test(part))) {\r\n return null;\r\n }\r\n\r\n const numbers = parts.map(Number);\r\n let year: number;\r\n let month: number;\r\n let day: number;\r\n\r\n switch (format) {\r\n case 'iso':\r\n [year, month, day] = numbers;\r\n break;\r\n case 'dmy':\r\n [day, month, year] = numbers;\r\n break;\r\n case 'mdy':\r\n [month, day, year] = numbers;\r\n break;\r\n }\r\n\r\n if (parts[format === 'iso' ? 0 : 2].length !== 4) {\r\n return null;\r\n }\r\n if (month < 1 || month > 12 || day < 1) {\r\n return null;\r\n }\r\n if (day > txDaysInMonth(year, month - 1)) {\r\n return null;\r\n }\r\n\r\n return new Date(year, month - 1, day);\r\n}\r\n\r\n/** One cell of the month grid. */\r\nexport interface TxCalendarDay {\r\n date: Date;\r\n /** False for the leading/trailing days borrowed from adjacent months. */\r\n inMonth: boolean;\r\n}\r\n\r\n/**\r\n * Builds a six-week grid covering `month`, padded with adjacent months' days.\r\n *\r\n * Always six rows, so the popup does not change height as the user pages\r\n * through months.\r\n */\r\nexport function txBuildMonthGrid(\r\n year: number,\r\n month: number,\r\n firstDayOfWeek: TxWeekday = 1,\r\n): TxCalendarDay[][] {\r\n const firstOfMonth = new Date(year, month, 1);\r\n const offset = (firstOfMonth.getDay() - firstDayOfWeek + 7) % 7;\r\n const start = txAddDays(firstOfMonth, -offset);\r\n\r\n const weeks: TxCalendarDay[][] = [];\r\n let cursor = start;\r\n for (let week = 0; week < 6; week++) {\r\n const row: TxCalendarDay[] = [];\r\n for (let day = 0; day < 7; day++) {\r\n row.push({ date: cursor, inMonth: cursor.getMonth() === month });\r\n cursor = txAddDays(cursor, 1);\r\n }\r\n weeks.push(row);\r\n }\r\n return weeks;\r\n}\r\n\r\n/** Weekday initials starting from `firstDayOfWeek`, in the given locale. */\r\nexport function txWeekdayLabels(firstDayOfWeek: TxWeekday = 1, locale?: string): string[] {\r\n const formatter = new Intl.DateTimeFormat(locale, { weekday: 'short' });\r\n // 2024-01-07 was a Sunday, giving a stable reference week.\r\n const sunday = new Date(2024, 0, 7);\r\n return Array.from({ length: 7 }, (_, index) =>\r\n formatter.format(txAddDays(sunday, (index + firstDayOfWeek) % 7)),\r\n );\r\n}\r\n\r\n/** Month and year heading, e.g. `February 2026`. */\r\nexport function txMonthLabel(date: Date, locale?: string): string {\r\n return new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(date);\r\n}\r\n\r\n/** Full date for an accessible label, e.g. `Monday, 2 February 2026`. */\r\nexport function txFullDateLabel(date: Date, locale?: string): string {\r\n return new Intl.DateTimeFormat(locale, {\r\n weekday: 'long',\r\n day: 'numeric',\r\n month: 'long',\r\n year: 'numeric',\r\n }).format(date);\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n effect,\r\n forwardRef,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { CONTROL_ICON_SIZE, TxControlSize, txControlShellClass } from '../core/control-classes';\r\nimport { TxControlValueBridge } from '../core/control-value-bridge';\r\nimport { txBindFormField } from '../core/form-field-binding';\r\nimport { TX_POPUP_PANEL_CLASS } from '../core/popup-classes';\r\nimport { txUniqueId } from '../core/unique-id';\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TxConnectedOverlayDirective } from '../overlay/connected-overlay.directive';\r\nimport { TxOverlayCloseReason, TxOverlayConfig } from '../overlay/overlay.types';\r\nimport {\r\n TxDateFormat,\r\n TxWeekday,\r\n txAddDays,\r\n txAddMonths,\r\n txBuildMonthGrid,\r\n txClampDate,\r\n txFormatDate,\r\n txFormatPlaceholder,\r\n txFullDateLabel,\r\n txIsSameDay,\r\n txIsSameMonth,\r\n txIsWithin,\r\n txMonthLabel,\r\n txParseDate,\r\n txStartOfDay,\r\n txWeekdayLabels,\r\n} from './date-utils';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * How a date may be entered.\r\n *\r\n * A union rather than a `readonly` boolean, so a third mode can be added\r\n * without the two existing ones becoming ambiguous.\r\n */\r\nexport type TxDatepickerEntry = 'typed' | 'picker-only';\r\n\r\n/** Simple property configuration for {@link TxDatepickerComponent}. */\r\nexport interface TxDatepickerConfig {\r\n /** Defaults to the placeholder implied by `format`, e.g. `dd/mm/yyyy`. */\r\n placeholder?: string;\r\n /** Defaults to the surrounding form field's size, else `md`. */\r\n size?: TxControlSize;\r\n /** Display and parse format. Defaults to `iso`. */\r\n format?: TxDateFormat;\r\n /** Earliest selectable date, inclusive. */\r\n min?: Date | null;\r\n /** Latest selectable date, inclusive. */\r\n max?: Date | null;\r\n /** 0 = Sunday … 6 = Saturday. Defaults to Monday. */\r\n firstDayOfWeek?: TxWeekday;\r\n /** BCP 47 tag for month and weekday names. Defaults to the browser's. */\r\n locale?: string;\r\n /** Defaults to `typed`. */\r\n entry?: TxDatepickerEntry;\r\n /** Shows a \"Today\" shortcut in the calendar footer. Defaults to true. */\r\n showToday?: boolean;\r\n clearable?: boolean;\r\n disabled?: boolean;\r\n required?: boolean;\r\n invalid?: boolean;\r\n ariaLabel?: string;\r\n name?: string;\r\n}\r\n\r\nexport const TX_DATEPICKER_DEFAULTS = {\r\n format: 'iso',\r\n firstDayOfWeek: 1,\r\n entry: 'typed',\r\n showToday: true,\r\n} as const satisfies Partial<TxDatepickerConfig>;\r\n\r\n/**\r\n * A date field with a calendar popup.\r\n *\r\n * `@angular/aria` has no datepicker, so the popup is a CDK overlay positioned by\r\n * {@link TxConnectedOverlayDirective} — the same one the select uses, which is\r\n * what keeps a datepicker inside a scrolling panel from being clipped. The\r\n * calendar is a `role=\"grid\"` with a roving tab stop, matching the ARIA date\r\n * picker dialog pattern.\r\n *\r\n * Parsing and formatting live in `date-utils`, away from the component, because\r\n * they are the part that is easy to get subtly wrong — and they are unit-tested\r\n * there rather than through the DOM.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-form-field [config]=\"{ label: 'Failure date', required: true }\">\r\n * <tx-datepicker [config]=\"{ format: 'dmy', max: today, clearable: true }\" [(value)]=\"failedOn\" />\r\n * </tx-form-field>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-datepicker',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent, TxConnectedOverlayDirective],\r\n host: { class: 'block' },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TxDatepickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n template: `\r\n <div\r\n class=\"flex min-w-0\"\r\n [txConnectedOverlay]=\"popup\"\r\n [txOverlayOpen]=\"expanded()\"\r\n [txOverlayConfig]=\"overlayConfig\"\r\n (closed)=\"onOverlayClosed($event)\"\r\n >\r\n <div [class]=\"shellClass()\">\r\n <input\r\n #field\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n autocomplete=\"off\"\r\n [id]=\"fieldId()\"\r\n class=\"min-w-0 flex-1 border-none bg-transparent p-0 text-[inherit]\r\n text-tx-text-primary placeholder:text-tx-text-disabled focus:outline-none\r\n disabled:cursor-not-allowed read-only:cursor-pointer\"\r\n [value]=\"text()\"\r\n [disabled]=\"isDisabled()\"\r\n [readOnly]=\"isPickerOnly()\"\r\n [attr.placeholder]=\"placeholder()\"\r\n [attr.name]=\"config().name ?? null\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-describedby]=\"describedBy()\"\r\n [attr.aria-invalid]=\"isInvalid() ? 'true' : null\"\r\n [attr.aria-required]=\"isRequired() ? 'true' : null\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onFieldKeydown($event)\"\r\n (click)=\"isPickerOnly() ? open() : undefined\"\r\n />\r\n\r\n @if (showClear()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-grid shrink-0 cursor-pointer place-items-center rounded-tx-xs p-tx-0-5\r\n text-tx-text-subtle transition-colors hover:bg-tx-hover-fill\r\n hover:text-tx-text-primary focus-visible:bg-tx-hover-fill\r\n focus-visible:text-tx-text-primary\"\r\n aria-label=\"Clear date\"\r\n (click)=\"clear()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n\r\n <button\r\n #trigger\r\n type=\"button\"\r\n class=\"inline-grid shrink-0 cursor-pointer place-items-center rounded-tx-xs p-tx-0-5\r\n text-tx-text-subtle transition-colors hover:bg-tx-hover-fill\r\n hover:text-tx-text-primary focus-visible:bg-tx-hover-fill\r\n focus-visible:text-tx-text-primary\"\r\n [disabled]=\"isDisabled()\"\r\n aria-haspopup=\"dialog\"\r\n [attr.aria-expanded]=\"expanded()\"\r\n [attr.aria-label]=\"expanded() ? 'Close calendar' : 'Open calendar'\"\r\n (click)=\"toggle()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'calendar', size: iconSize() }\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <ng-template #popup>\r\n @if (expanded()) {\r\n <div\r\n [class]=\"panelClass\"\r\n role=\"dialog\"\r\n [attr.aria-label]=\"'Choose a date'\"\r\n (keydown)=\"onCalendarKeydown($event)\"\r\n >\r\n <!-- month navigation -->\r\n <div class=\"flex items-center gap-tx-1 border-b border-tx-border px-tx-2 py-tx-2\">\r\n <button\r\n type=\"button\"\r\n [class]=\"navClass\"\r\n [disabled]=\"!canGoPrevious()\"\r\n aria-label=\"Previous month\"\r\n (click)=\"shiftMonth(-1)\"\r\n >\r\n <tx-icon [config]=\"{ name: 'chevron-left', size: 'sm' }\" />\r\n </button>\r\n <span\r\n class=\"flex-1 text-center font-tx-display text-tx-base font-semibold\r\n text-tx-text-heading\"\r\n aria-live=\"polite\"\r\n >{{ monthLabel() }}</span\r\n >\r\n <button\r\n type=\"button\"\r\n [class]=\"navClass\"\r\n [disabled]=\"!canGoNext()\"\r\n aria-label=\"Next month\"\r\n (click)=\"shiftMonth(1)\"\r\n >\r\n <tx-icon [config]=\"{ name: 'chevron-right', size: 'sm' }\" />\r\n </button>\r\n </div>\r\n\r\n <div class=\"p-tx-2\">\r\n <div role=\"grid\" [attr.aria-labelledby]=\"gridLabelId\">\r\n <span [id]=\"gridLabelId\" class=\"sr-only\">{{ monthLabel() }}</span>\r\n\r\n <div role=\"row\" class=\"grid grid-cols-7\">\r\n @for (day of weekdays(); track day) {\r\n <span\r\n role=\"columnheader\"\r\n [attr.aria-label]=\"day\"\r\n class=\"grid h-tx-7 place-items-center font-tx-mono text-tx-2xs\r\n tracking-tx-wide uppercase text-tx-text-subtle\"\r\n >{{ day.slice(0, 2) }}</span\r\n >\r\n }\r\n </div>\r\n\r\n @for (week of weeks(); track $index) {\r\n <div role=\"row\" class=\"grid grid-cols-7\">\r\n @for (cell of week; track cell.date.getTime()) {\r\n <span role=\"gridcell\" class=\"grid place-items-center\">\r\n <button\r\n type=\"button\"\r\n [class]=\"dayClass(cell.date, cell.inMonth)\"\r\n [disabled]=\"!selectable(cell.date)\"\r\n [tabindex]=\"isFocused(cell.date) ? 0 : -1\"\r\n [attr.aria-selected]=\"txIsSameDay(cell.date, value()) ? 'true' : 'false'\"\r\n [attr.aria-current]=\"isToday(cell.date) ? 'date' : null\"\r\n [attr.aria-label]=\"fullLabel(cell.date)\"\r\n [attr.data-focused]=\"isFocused(cell.date) ? 'true' : null\"\r\n (click)=\"pick(cell.date)\"\r\n >\r\n {{ cell.date.getDate() }}\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showToday()) {\r\n <div class=\"flex justify-end gap-tx-2 border-t border-tx-border px-tx-2 py-tx-2\">\r\n <button type=\"button\" [class]=\"footerClass\" (click)=\"pick(todayDate)\">Today</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n `,\r\n})\r\nexport class TxDatepickerComponent implements ControlValueAccessor {\r\n readonly config = input<Partial<TxDatepickerConfig>>({});\r\n\r\n /** The selected date, or `null`. */\r\n readonly value = model<Date | null>(null);\r\n\r\n readonly changed = output<Date | null>();\r\n readonly openedChange = output<boolean>();\r\n\r\n protected readonly expanded = signal(false);\r\n protected readonly text = signal('');\r\n /** The day the roving tab stop is on. Drives arrow-key navigation. */\r\n protected readonly focusedDate = signal<Date>(txStartOfDay(new Date()));\r\n /** First of the visible month. */\r\n protected readonly viewMonth = signal<Date>(txStartOfDay(new Date()));\r\n\r\n protected readonly todayDate = txStartOfDay(new Date());\r\n protected readonly gridLabelId = txUniqueId('calendar');\r\n protected readonly panelClass = TX_POPUP_PANEL_CLASS;\r\n protected readonly txIsSameDay = txIsSameDay;\r\n\r\n protected readonly navClass = [\r\n 'inline-grid size-tx-control-sm shrink-0 cursor-pointer place-items-center rounded-tx-sm',\r\n 'text-tx-text-muted transition-colors hover:bg-tx-hover-fill hover:text-tx-text-heading',\r\n 'focus-visible:bg-tx-hover-fill focus-visible:text-tx-text-heading',\r\n 'disabled:pointer-events-none disabled:opacity-40',\r\n ].join(' ');\r\n\r\n protected readonly footerClass = [\r\n 'cursor-pointer rounded-tx-sm border border-tx-border bg-tx-surface px-tx-2-5 py-tx-1',\r\n 'text-tx-sm text-tx-text-primary transition-colors',\r\n 'hover:border-tx-border-strong focus-visible:border-tx-border-strong',\r\n ].join(' ');\r\n\r\n protected readonly overlayConfig: Partial<TxOverlayConfig> = {\r\n placement: 'bottom-start',\r\n width: 'content',\r\n };\r\n\r\n private readonly field = viewChild.required<ElementRef<HTMLInputElement>>('field');\r\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\r\n private readonly formField = txBindFormField('datepicker');\r\n private readonly forms = new TxControlValueBridge<Date | null>((next) =>\r\n this.value.set(next ?? null),\r\n );\r\n\r\n protected readonly fieldId = this.formField.id;\r\n protected readonly describedBy = this.formField.describedBy;\r\n\r\n private readonly resolved = computed<TxDatepickerConfig>(() =>\r\n txMergeConfig(TX_DATEPICKER_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly format = computed(() => this.resolved().format ?? 'iso');\r\n protected readonly showToday = computed(() => this.resolved().showToday !== false);\r\n protected readonly isPickerOnly = computed(() => this.resolved().entry === 'picker-only');\r\n protected readonly placeholder = computed(\r\n () => this.resolved().placeholder ?? txFormatPlaceholder(this.format()),\r\n );\r\n protected readonly isDisabled = computed(\r\n () => this.resolved().disabled === true || this.forms.formDisabled(),\r\n );\r\n protected readonly isInvalid = computed(\r\n () => this.resolved().invalid === true || this.formField.invalid(),\r\n );\r\n protected readonly isRequired = computed(\r\n () => this.resolved().required === true || this.formField.required(),\r\n );\r\n protected readonly size = computed(\r\n () => this.resolved().size ?? this.formField.size() ?? 'md',\r\n );\r\n protected readonly iconSize = computed(() => CONTROL_ICON_SIZE[this.size()]);\r\n\r\n protected readonly showClear = computed(\r\n () => this.resolved().clearable === true && this.value() !== null && !this.isDisabled(),\r\n );\r\n\r\n protected readonly shellClass = computed(() =>\r\n [\r\n txControlShellClass({ size: this.size(), invalid: this.isInvalid() }),\r\n 'flex items-center gap-tx-1-5',\r\n // The shell is not focusable itself; it shows the ring when the inner\r\n // input or a button inside it has focus, so it reads as one control.\r\n 'focus-within:border-tx-primary focus-within:shadow-tx-focus',\r\n this.isDisabled() ? 'pointer-events-none' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly weekdays = computed(() =>\r\n txWeekdayLabels(this.resolved().firstDayOfWeek ?? 1, this.resolved().locale),\r\n );\r\n\r\n protected readonly monthLabel = computed(() =>\r\n txMonthLabel(this.viewMonth(), this.resolved().locale),\r\n );\r\n\r\n protected readonly weeks = computed(() =>\r\n txBuildMonthGrid(\r\n this.viewMonth().getFullYear(),\r\n this.viewMonth().getMonth(),\r\n this.resolved().firstDayOfWeek ?? 1,\r\n ),\r\n );\r\n\r\n protected readonly canGoPrevious = computed(() => {\r\n const min = this.resolved().min;\r\n if (!min) {\r\n return true;\r\n }\r\n const previous = txAddMonths(this.viewMonth(), -1);\r\n return (\r\n previous.getFullYear() > min.getFullYear() ||\r\n (previous.getFullYear() === min.getFullYear() && previous.getMonth() >= min.getMonth())\r\n );\r\n });\r\n\r\n protected readonly canGoNext = computed(() => {\r\n const max = this.resolved().max;\r\n if (!max) {\r\n return true;\r\n }\r\n const next = txAddMonths(this.viewMonth(), 1);\r\n return (\r\n next.getFullYear() < max.getFullYear() ||\r\n (next.getFullYear() === max.getFullYear() && next.getMonth() <= max.getMonth())\r\n );\r\n });\r\n\r\n constructor() {\r\n // Keep the text field in step with the value, except while the user is\r\n // mid-edit — retyping their input under them would be hostile.\r\n effect(() => {\r\n const value = this.value();\r\n const format = this.format();\r\n untracked(() => {\r\n if (document.activeElement !== this.field().nativeElement) {\r\n this.text.set(txFormatDate(value, format));\r\n }\r\n if (value) {\r\n this.focusedDate.set(txStartOfDay(value));\r\n this.viewMonth.set(txStartOfDay(value));\r\n }\r\n });\r\n });\r\n }\r\n\r\n protected selectable(date: Date): boolean {\r\n return txIsWithin(date, this.resolved().min, this.resolved().max);\r\n }\r\n\r\n protected isToday(date: Date): boolean {\r\n return txIsSameDay(date, this.todayDate);\r\n }\r\n\r\n protected isFocused(date: Date): boolean {\r\n return txIsSameDay(date, this.focusedDate());\r\n }\r\n\r\n protected fullLabel(date: Date): string {\r\n return txFullDateLabel(date, this.resolved().locale);\r\n }\r\n\r\n protected dayClass(date: Date, inMonth: boolean): string {\r\n return [\r\n 'grid size-tx-8 cursor-pointer place-items-center rounded-tx-sm text-tx-base',\r\n 'tabular-nums transition-colors duration-150 ease-tx-standard',\r\n inMonth ? 'text-tx-text-primary' : 'text-tx-text-disabled',\r\n 'hover:bg-tx-hover-fill',\r\n // Read from the element's own state rather than a mirrored boolean.\r\n 'aria-selected:bg-tx-primary aria-selected:font-semibold',\r\n 'aria-selected:text-tx-text-on-primary aria-selected:hover:bg-tx-primary-hover',\r\n 'aria-[current=date]:ring-1 aria-[current=date]:ring-tx-primary-border',\r\n 'disabled:pointer-events-none disabled:text-tx-text-disabled disabled:opacity-40',\r\n ].join(' ');\r\n }\r\n\r\n /** Opens the calendar. */\r\n open(): void {\r\n if (this.isDisabled() || this.expanded()) {\r\n return;\r\n }\r\n const anchor = this.value() ?? this.todayDate;\r\n const start = txClampDate(txStartOfDay(anchor), this.resolved().min, this.resolved().max);\r\n this.focusedDate.set(start);\r\n this.viewMonth.set(start);\r\n this.expanded.set(true);\r\n this.openedChange.emit(true);\r\n this.focusActiveDay();\r\n }\r\n\r\n /** Closes the calendar. */\r\n close(restoreFocus = true): void {\r\n if (!this.expanded()) {\r\n return;\r\n }\r\n this.expanded.set(false);\r\n this.openedChange.emit(false);\r\n if (restoreFocus) {\r\n this.trigger().nativeElement.focus();\r\n }\r\n }\r\n\r\n protected toggle(): void {\r\n this.expanded() ? this.close() : this.open();\r\n }\r\n\r\n protected onOverlayClosed(reason: TxOverlayCloseReason): void {\r\n this.close(reason === 'escape');\r\n }\r\n\r\n protected onInput(event: Event): void {\r\n const next = (event.target as HTMLInputElement).value;\r\n this.text.set(next);\r\n const parsed = txParseDate(next, this.format());\r\n // Only commit a complete, in-range date; partial input leaves the value be.\r\n if (parsed && this.selectable(parsed)) {\r\n this.commit(parsed);\r\n } else if (next.trim().length === 0) {\r\n this.commit(null);\r\n }\r\n }\r\n\r\n protected onBlur(): void {\r\n this.forms.touch();\r\n // Snap the text back to the canonical rendering of whatever was committed,\r\n // so half-typed or unparseable input never lingers.\r\n this.text.set(txFormatDate(this.value(), this.format()));\r\n }\r\n\r\n protected onFieldKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowDown' && event.altKey) {\r\n event.preventDefault();\r\n this.open();\r\n return;\r\n }\r\n if (event.key === 'Escape' && this.expanded()) {\r\n event.preventDefault();\r\n this.close(false);\r\n }\r\n }\r\n\r\n protected onCalendarKeydown(event: KeyboardEvent): void {\r\n const current = this.focusedDate();\r\n let next: Date | null = null;\r\n\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n next = txAddDays(current, -1);\r\n break;\r\n case 'ArrowRight':\r\n next = txAddDays(current, 1);\r\n break;\r\n case 'ArrowUp':\r\n next = txAddDays(current, -7);\r\n break;\r\n case 'ArrowDown':\r\n next = txAddDays(current, 7);\r\n break;\r\n case 'Home':\r\n next = txAddDays(current, -dayOffset(current, this.resolved().firstDayOfWeek ?? 1));\r\n break;\r\n case 'End':\r\n next = txAddDays(current, 6 - dayOffset(current, this.resolved().firstDayOfWeek ?? 1));\r\n break;\r\n case 'PageUp':\r\n next = txAddMonths(current, event.shiftKey ? -12 : -1);\r\n break;\r\n case 'PageDown':\r\n next = txAddMonths(current, event.shiftKey ? 12 : 1);\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n if (this.selectable(current)) {\r\n this.pick(current);\r\n }\r\n return;\r\n case 'Escape':\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const clamped = txClampDate(next, this.resolved().min, this.resolved().max);\r\n this.focusedDate.set(clamped);\r\n if (!txIsSameMonth(clamped, this.viewMonth())) {\r\n this.viewMonth.set(clamped);\r\n }\r\n this.focusActiveDay();\r\n }\r\n\r\n protected shiftMonth(delta: number): void {\r\n this.viewMonth.set(txAddMonths(this.viewMonth(), delta));\r\n }\r\n\r\n protected pick(date: Date): void {\r\n if (!this.selectable(date)) {\r\n return;\r\n }\r\n const day = txStartOfDay(date);\r\n this.commit(day);\r\n this.text.set(txFormatDate(day, this.format()));\r\n this.close();\r\n }\r\n\r\n protected clear(): void {\r\n this.commit(null);\r\n this.text.set('');\r\n this.field().nativeElement.focus();\r\n }\r\n\r\n /** Moves focus onto the text field. */\r\n focus(): void {\r\n this.field().nativeElement.focus();\r\n }\r\n\r\n private commit(date: Date | null): void {\r\n this.value.set(date);\r\n this.forms.emit(date);\r\n this.changed.emit(date);\r\n }\r\n\r\n /**\r\n * Moves DOM focus onto the day carrying the roving tab stop, once the grid\r\n * has rendered the new month.\r\n */\r\n private focusActiveDay(): void {\r\n requestAnimationFrame(() => {\r\n const day = document.querySelector<HTMLButtonElement>('[data-focused=\"true\"]');\r\n day?.focus();\r\n });\r\n }\r\n\r\n /* ---- ControlValueAccessor ---- */\r\n writeValue(value: Date | string | null): void {\r\n // Reactive forms and JSON payloads routinely carry an ISO string rather\r\n // than a Date, so accept both and normalise on the way in.\r\n if (typeof value === 'string') {\r\n this.forms.writeValue(txParseDate(value, 'iso'));\r\n return;\r\n }\r\n this.forms.writeValue(value ?? null);\r\n }\r\n registerOnChange(fn: (value: Date | null) => void): void {\r\n this.forms.registerOnChange(fn);\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.forms.registerOnTouched(fn);\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.forms.setDisabledState(isDisabled);\r\n }\r\n}\r\n\r\n/** Index of `date` within its week, given the week's first day. */\r\nfunction dayOffset(date: Date, firstDayOfWeek: TxWeekday): number {\r\n return (date.getDay() - firstDayOfWeek + 7) % 7;\r\n}\r\n","/** Sort direction. `null` means unsorted. */\r\nexport type TxSortDirection = 'asc' | 'desc';\r\n\r\n/** Which column is sorted, and which way. */\r\nexport interface TxTableSort {\r\n column: string;\r\n direction: TxSortDirection;\r\n}\r\n\r\n/** Horizontal alignment of a column's cells. */\r\nexport type TxColumnAlign = 'start' | 'center' | 'end';\r\n\r\n/**\r\n * How a column's text is rendered.\r\n *\r\n * `mono` is the reference design's treatment for part numbers, serials and\r\n * identifiers; `numeric` right-aligns and uses tabular figures so columns of\r\n * numbers line up.\r\n */\r\nexport type TxColumnVariant = 'text' | 'mono' | 'numeric';\r\n\r\n/**\r\n * The breakpoint at or above which a column appears.\r\n *\r\n * This is the documented column-priority approach to narrow screens: rather\r\n * than letting a wide table overflow, low-priority columns drop out and the\r\n * rest stay readable. Pair it with the table's `responsive` config.\r\n */\r\nexport type TxColumnPriority = 'always' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * One column.\r\n *\r\n * Columns are *data*, so they come through the table's own `columns` input\r\n * rather than as a field on the config object. `value` and `compare` are\r\n * projections of a row, not behaviour — event handlers stay as `output()`s on\r\n * the component. Anything structural (a custom cell) is a projected\r\n * `ng-template[txTableCell]`, never a field here.\r\n */\r\nexport interface TxTableColumn<T = Record<string, unknown>> {\r\n /**\r\n * Unique key. Doubles as the property name read from each row unless `value`\r\n * is supplied, and as the name a `txTableCell` template matches on.\r\n */\r\n key: string;\r\n /** Column heading. */\r\n header: string;\r\n /** Derives the display value. Defaults to `row[key]`. */\r\n value?: (row: T) => string | number | boolean | null | undefined;\r\n /** Whether this column can be sorted. Defaults to false. */\r\n sortable?: boolean;\r\n /**\r\n * Custom comparator, for when the display value does not sort correctly —\r\n * a formatted date, or a status that has a rank rather than an alphabet.\r\n */\r\n compare?: (a: T, b: T) => number;\r\n /** Defaults to `start`, or `end` when the variant is `numeric`. */\r\n align?: TxColumnAlign;\r\n /** Defaults to `text`. */\r\n variant?: TxColumnVariant;\r\n /** Defaults to `always`. */\r\n priority?: TxColumnPriority;\r\n /** Stops the cell wrapping. Useful for timestamps and identifiers. */\r\n noWrap?: boolean;\r\n /** Accessible description of the column, announced with the header. */\r\n headerLabel?: string;\r\n}\r\n\r\n/** Row selection mode. */\r\nexport type TxTableSelection = 'none' | 'single' | 'multiple';\r\n\r\n/** Simple property configuration for {@link TxTableComponent}. */\r\nexport interface TxTableConfig {\r\n /** Defaults to `none`. */\r\n selection?: TxTableSelection;\r\n /** Defaults to `comfortable`. */\r\n density?: 'comfortable' | 'compact';\r\n /**\r\n * `client` sorts the rows given to the table; `server` only reports the\r\n * requested sort through the `sortChange` output and leaves `rows` alone.\r\n * Defaults to `client`.\r\n */\r\n sort?: 'none' | 'client' | 'server';\r\n /** Same split as `sort`. Defaults to `none`. */\r\n pagination?: 'none' | 'client' | 'server';\r\n /** Page sizes offered in the footer. */\r\n pageSizeOptions?: readonly number[];\r\n /**\r\n * How the table copes with a narrow viewport.\r\n *\r\n * `scroll` puts the table in a horizontal scroller; `sticky-first` also pins\r\n * the first column so the row stays identifiable while scrolling; `priority`\r\n * drops low-priority columns instead of scrolling at all.\r\n * Defaults to `sticky-first`.\r\n */\r\n responsive?: 'scroll' | 'sticky-first' | 'priority';\r\n /** Highlights the row under the pointer. Defaults to true. */\r\n hoverable?: boolean;\r\n /** Replaces the body with a loading state. */\r\n loading?: boolean;\r\n /** Rows rendered as skeletons while loading. Defaults to 5. */\r\n loadingRows?: number;\r\n /** Shown when there are no rows and the table is not loading. */\r\n emptyText?: string;\r\n /** Registered icon name shown above `emptyText`. */\r\n emptyIcon?: string;\r\n /** Adds a trailing action column fed by the `txTableActions` template. */\r\n actionColumn?: 'none' | 'end';\r\n /** Heading for the action column. Defaults to a visually hidden \"Actions\". */\r\n actionColumnHeader?: string;\r\n /** Noun used by the footer's range summary, e.g. \"84 reports\". */\r\n itemLabel?: string;\r\n /** Accessible name for the table. */\r\n ariaLabel?: string;\r\n /** Visible caption above the table. */\r\n caption?: string;\r\n}\r\n\r\nexport const TX_TABLE_DEFAULTS = {\r\n selection: 'none',\r\n density: 'comfortable',\r\n sort: 'client',\r\n pagination: 'none',\r\n responsive: 'sticky-first',\r\n hoverable: true,\r\n loadingRows: 5,\r\n emptyText: 'Nothing to show',\r\n emptyIcon: 'inbox',\r\n actionColumn: 'none',\r\n actionColumnHeader: 'Actions',\r\n itemLabel: 'rows',\r\n} as const satisfies Partial<TxTableConfig>;\r\n","import { TxSortDirection, TxTableColumn } from './table.types';\r\n\r\n/**\r\n * Pure sorting helpers.\r\n *\r\n * Comparators are the classic source of quiet bugs — nulls sorting to the top,\r\n * numbers compared as strings so `10` lands before `9`, a sort that is not\r\n * stable so equal rows shuffle on every re-sort. Kept out of the component and\r\n * unit-tested directly.\r\n */\r\n\r\n/** Reads a column's display value from a row. */\r\nexport function txColumnValue<T>(\r\n column: TxTableColumn<T>,\r\n row: T,\r\n): string | number | boolean | null | undefined {\r\n if (column.value) {\r\n return column.value(row);\r\n }\r\n return (row as Record<string, unknown>)[column.key] as\r\n | string\r\n | number\r\n | boolean\r\n | null\r\n | undefined;\r\n}\r\n\r\n/**\r\n * Compares two cell values.\r\n *\r\n * Nulls and empty strings always sort last regardless of direction, because a\r\n * missing value is not \"smaller\" — burying blanks at the bottom is what people\r\n * actually expect. Numbers compare numerically, strings with `localeCompare`\r\n * so accents and case behave, and numeric strings are compared as numbers so\r\n * `10` does not sort before `9`.\r\n */\r\nexport function txCompareValues(a: unknown, b: unknown): number {\r\n const aEmpty = a === null || a === undefined || a === '';\r\n const bEmpty = b === null || b === undefined || b === '';\r\n if (aEmpty && bEmpty) {\r\n return 0;\r\n }\r\n if (aEmpty) {\r\n return 1;\r\n }\r\n if (bEmpty) {\r\n return -1;\r\n }\r\n\r\n if (typeof a === 'boolean' || typeof b === 'boolean') {\r\n return Number(a) - Number(b);\r\n }\r\n\r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() - b.getTime();\r\n }\r\n\r\n const aNumber = toNumber(a);\r\n const bNumber = toNumber(b);\r\n if (aNumber !== null && bNumber !== null) {\r\n return aNumber - bNumber;\r\n }\r\n\r\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\r\n}\r\n\r\nfunction toNumber(value: unknown): number | null {\r\n if (typeof value === 'number') {\r\n return Number.isNaN(value) ? null : value;\r\n }\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n const parsed = Number(value);\r\n return Number.isNaN(parsed) ? null : parsed;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Returns a sorted copy of `rows`.\r\n *\r\n * Never mutates the input — the caller owns that array — and the sort is stable\r\n * (`Array.prototype.sort` has been required to be stable since ES2019), so rows\r\n * that compare equal keep the order they were given in. \"Empty last\" is applied\r\n * before the direction flip, so blanks stay at the bottom either way.\r\n */\r\nexport function txSortRows<T>(\r\n rows: readonly T[],\r\n column: TxTableColumn<T> | undefined,\r\n direction: TxSortDirection,\r\n): T[] {\r\n if (!column) {\r\n return [...rows];\r\n }\r\n\r\n const sign = direction === 'asc' ? 1 : -1;\r\n const compare = column.compare;\r\n\r\n return [...rows].sort((a, b) => {\r\n if (compare) {\r\n return compare(a, b) * sign;\r\n }\r\n const aValue = txColumnValue(column, a);\r\n const bValue = txColumnValue(column, b);\r\n\r\n // Keep blanks at the bottom in both directions.\r\n const aEmpty = aValue === null || aValue === undefined || aValue === '';\r\n const bEmpty = bValue === null || bValue === undefined || bValue === '';\r\n if (aEmpty !== bEmpty) {\r\n return aEmpty ? 1 : -1;\r\n }\r\n\r\n return txCompareValues(aValue, bValue) * sign;\r\n });\r\n}\r\n\r\n/**\r\n * The sort state after clicking a column header.\r\n *\r\n * Cycles ascending → descending → unsorted, so a user can always get back to\r\n * the original order without reloading.\r\n */\r\nexport function txNextSort(\r\n current: { column: string; direction: TxSortDirection } | null,\r\n column: string,\r\n): { column: string; direction: TxSortDirection } | null {\r\n if (!current || current.column !== column) {\r\n return { column, direction: 'asc' };\r\n }\r\n if (current.direction === 'asc') {\r\n return { column, direction: 'desc' };\r\n }\r\n return null;\r\n}\r\n\r\n/** The `aria-sort` value for a header cell. */\r\nexport function txAriaSort(\r\n current: { column: string; direction: TxSortDirection } | null,\r\n column: string,\r\n sortable: boolean,\r\n): 'ascending' | 'descending' | 'none' | null {\r\n if (!sortable) {\r\n return null;\r\n }\r\n if (!current || current.column !== column) {\r\n return 'none';\r\n }\r\n return current.direction === 'asc' ? 'ascending' : 'descending';\r\n}\r\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\r\n\r\n/**\r\n * Marks an `ng-template` as the renderer for one column's cells.\r\n *\r\n * Structural customisation by projection rather than by config: a table can\r\n * have any number of custom cells, and each one is a template with the row in\r\n * scope, so a cell can contain badges, links, nested controls — anything.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-table [columns]=\"columns\" [rows]=\"reports\">\r\n * <ng-template txTableCell=\"status\" let-row>\r\n * <tx-badge [config]=\"{ label: row.status, variant: toneFor(row.status) }\" />\r\n * </ng-template>\r\n * </tx-table>\r\n * ```\r\n *\r\n * Context: `$implicit` and `row` are the row; `column` is the column; `value`\r\n * is what the table would otherwise have rendered.\r\n */\r\n@Directive({\r\n selector: 'ng-template[txTableCell]',\r\n})\r\nexport class TxTableCellDirective {\r\n /** The `key` of the column this template renders. */\r\n readonly column = input.required<string>({ alias: 'txTableCell' });\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n\r\n/**\r\n * Marks an `ng-template` as the content of the table's action column.\r\n *\r\n * Turned on with the table's `actionColumn: 'end'` config. Actions are quiet\r\n * until the row is hovered, focused within or selected, and always visible on\r\n * touch-sized screens where there is no hover at all.\r\n *\r\n * @example\r\n * ```html\r\n * <ng-template txTableActions let-row>\r\n * <tx-button [config]=\"{ label: 'Edit ' + row.id, icon: 'edit',\r\n * display: 'icon-only', variant: 'ghost', size: 'sm' }\"\r\n * (clicked)=\"edit(row)\" />\r\n * </ng-template>\r\n * ```\r\n */\r\n@Directive({\r\n selector: 'ng-template[txTableActions]',\r\n})\r\nexport class TxTableActionsDirective {\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","/**\r\n * Pure pagination arithmetic.\r\n *\r\n * Off-by-one errors here are invisible until someone lands on an empty last\r\n * page, so this is kept out of the component and unit-tested directly.\r\n *\r\n * Page indexes are zero-based throughout; only the rendered label is 1-based.\r\n */\r\n\r\n/** Number of pages needed to hold `total` rows. Always at least 1. */\r\nexport function txPageCount(total: number, pageSize: number): number {\r\n if (pageSize <= 0) {\r\n return 1;\r\n }\r\n return Math.max(1, Math.ceil(Math.max(0, total) / pageSize));\r\n}\r\n\r\n/**\r\n * Restricts a page index to one that exists.\r\n *\r\n * Called after the row count changes — deleting the last row of the last page\r\n * would otherwise leave the user stranded on a page past the end.\r\n */\r\nexport function txClampPageIndex(index: number, total: number, pageSize: number): number {\r\n const last = txPageCount(total, pageSize) - 1;\r\n if (!Number.isFinite(index)) {\r\n return 0;\r\n }\r\n return Math.min(Math.max(0, Math.trunc(index)), last);\r\n}\r\n\r\n/** The slice of rows on a given page. */\r\nexport function txPaginate<T>(\r\n rows: readonly T[],\r\n pageIndex: number,\r\n pageSize: number,\r\n): T[] {\r\n if (pageSize <= 0) {\r\n return [...rows];\r\n }\r\n const index = txClampPageIndex(pageIndex, rows.length, pageSize);\r\n const start = index * pageSize;\r\n return rows.slice(start, start + pageSize);\r\n}\r\n\r\n/** Inclusive 1-based row range on a page, for a \"n–m of t\" label. */\r\nexport interface TxPageRange {\r\n /** 1-based index of the first row, or 0 when there are none. */\r\n from: number;\r\n /** 1-based index of the last row, or 0 when there are none. */\r\n to: number;\r\n total: number;\r\n}\r\n\r\nexport function txPageRange(pageIndex: number, pageSize: number, total: number): TxPageRange {\r\n const count = Math.max(0, total);\r\n if (count === 0 || pageSize <= 0) {\r\n return { from: count === 0 ? 0 : 1, to: count, total: count };\r\n }\r\n const index = txClampPageIndex(pageIndex, count, pageSize);\r\n const from = index * pageSize + 1;\r\n const to = Math.min(from + pageSize - 1, count);\r\n return { from, to, total: count };\r\n}\r\n\r\n/**\r\n * The page buttons to render: page indexes plus `'gap'` markers.\r\n *\r\n * Always shows the first and last page, and a window of `siblings` either side\r\n * of the current one, so the control's width stays stable no matter how many\r\n * pages there are.\r\n */\r\nexport function txPageItems(\r\n pageIndex: number,\r\n pageCount: number,\r\n siblings = 1,\r\n): (number | 'gap')[] {\r\n const last = Math.max(0, pageCount - 1);\r\n const current = Math.min(Math.max(0, pageIndex), last);\r\n\r\n // Small enough to show every page without gaps.\r\n const maxWithoutGaps = siblings * 2 + 5;\r\n if (pageCount <= maxWithoutGaps) {\r\n return Array.from({ length: pageCount }, (_, index) => index);\r\n }\r\n\r\n const windowStart = Math.max(1, current - siblings);\r\n const windowEnd = Math.min(last - 1, current + siblings);\r\n\r\n const items: (number | 'gap')[] = [0];\r\n if (windowStart > 1) {\r\n items.push('gap');\r\n }\r\n for (let page = windowStart; page <= windowEnd; page++) {\r\n items.push(page);\r\n }\r\n if (windowEnd < last - 1) {\r\n items.push('gap');\r\n }\r\n items.push(last);\r\n return items;\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txPageCount, txPageItems, txPageRange } from './pagination-utils';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * How much of the control is shown.\r\n *\r\n * A union rather than a set of `showX` booleans, so the variants stay mutually\r\n * exclusive as more are added.\r\n */\r\nexport type TxPaginationAppearance = 'full' | 'compact' | 'simple';\r\n\r\n/** Simple property configuration for {@link TxPaginationComponent}. */\r\nexport interface TxPaginationConfig {\r\n /**\r\n * `full` shows numbered pages, a range summary and a page-size selector;\r\n * `compact` drops the numbers; `simple` is just previous/next.\r\n * Defaults to `full`.\r\n */\r\n appearance?: TxPaginationAppearance;\r\n /** Page sizes offered in the selector. Omit to hide the selector. */\r\n pageSizeOptions?: readonly number[];\r\n /** Pages shown either side of the current one. Defaults to 1. */\r\n siblings?: number;\r\n /** Noun used in the range summary, e.g. \"12–20 of 84 reports\". */\r\n itemLabel?: string;\r\n disabled?: boolean;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_PAGINATION_DEFAULTS = {\r\n appearance: 'full',\r\n siblings: 1,\r\n itemLabel: 'items',\r\n ariaLabel: 'Pagination',\r\n} as const satisfies Partial<TxPaginationConfig>;\r\n\r\n/**\r\n * A standalone pagination control.\r\n *\r\n * Used on its own, and by {@link TxTableComponent} for its footer — the table\r\n * does not reimplement any of this.\r\n *\r\n * All arithmetic lives in `pagination-utils` and is unit-tested there: page\r\n * clamping in particular matters, because deleting the last row of the last\r\n * page would otherwise strand the user on a page that no longer exists.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-pagination\r\n * [total]=\"reports().length\"\r\n * [(pageIndex)]=\"pageIndex\"\r\n * [(pageSize)]=\"pageSize\"\r\n * [config]=\"{ pageSizeOptions: [10, 25, 50], itemLabel: 'reports' }\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-pagination',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { class: 'block' },\r\n template: `\r\n <nav\r\n [attr.aria-label]=\"config().ariaLabel ?? 'Pagination'\"\r\n class=\"flex flex-wrap items-center gap-x-tx-3 gap-y-tx-2\"\r\n >\r\n @if (appearance() === 'full') {\r\n <p class=\"text-tx-base text-tx-text-muted\" aria-live=\"polite\">\r\n @if (range().total === 0) {\r\n No {{ itemLabel() }}\r\n } @else {\r\n {{ range().from }}–{{ range().to }} of {{ range().total }} {{ itemLabel() }}\r\n }\r\n </p>\r\n\r\n @if (pageSizeOptions().length > 0) {\r\n <label class=\"flex items-center gap-tx-2 text-tx-base text-tx-text-muted\">\r\n <span class=\"whitespace-nowrap\">Per page</span>\r\n <select\r\n [class]=\"selectClass\"\r\n [value]=\"pageSize()\"\r\n [disabled]=\"isDisabled()\"\r\n (change)=\"onPageSize($event)\"\r\n >\r\n @for (option of pageSizeOptions(); track option) {\r\n <option [value]=\"option\">{{ option }}</option>\r\n }\r\n </select>\r\n </label>\r\n }\r\n }\r\n\r\n <span class=\"flex-1\"></span>\r\n\r\n <div class=\"flex items-center gap-tx-1\">\r\n <button\r\n type=\"button\"\r\n [class]=\"navClass\"\r\n [disabled]=\"isDisabled() || pageIndex() === 0\"\r\n aria-label=\"Previous page\"\r\n (click)=\"goTo(pageIndex() - 1)\"\r\n >\r\n <tx-icon [config]=\"{ name: 'chevron-left', size: 'sm' }\" />\r\n </button>\r\n\r\n @if (appearance() === 'full') {\r\n @for (item of items(); track $index) {\r\n @if (item === 'gap') {\r\n <span class=\"px-tx-1 text-tx-base text-tx-text-subtle\" aria-hidden=\"true\">…</span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n [class]=\"pageClass\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-current]=\"item === pageIndex() ? 'page' : null\"\r\n [attr.aria-label]=\"'Page ' + (item + 1)\"\r\n (click)=\"goTo(item)\"\r\n >\r\n {{ item + 1 }}\r\n </button>\r\n }\r\n }\r\n } @else {\r\n <span class=\"px-tx-2 text-tx-base whitespace-nowrap text-tx-text-muted\">\r\n {{ pageIndex() + 1 }} / {{ pageCount() }}\r\n </span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n [class]=\"navClass\"\r\n [disabled]=\"isDisabled() || pageIndex() >= pageCount() - 1\"\r\n aria-label=\"Next page\"\r\n (click)=\"goTo(pageIndex() + 1)\"\r\n >\r\n <tx-icon [config]=\"{ name: 'chevron-right', size: 'sm' }\" />\r\n </button>\r\n </div>\r\n </nav>\r\n `,\r\n})\r\nexport class TxPaginationComponent {\r\n readonly config = input<Partial<TxPaginationConfig>>({});\r\n\r\n /** Total number of rows across all pages. */\r\n readonly total = input.required<number>();\r\n\r\n /** Zero-based current page. */\r\n readonly pageIndex = model(0);\r\n readonly pageSize = model(10);\r\n\r\n /** Emitted whenever the page or the page size changes. */\r\n readonly pageChange = output<{ pageIndex: number; pageSize: number }>();\r\n\r\n private readonly resolved = computed<TxPaginationConfig>(() =>\r\n txMergeConfig(TX_PAGINATION_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly appearance = computed(() => this.resolved().appearance);\r\n protected readonly itemLabel = computed(() => this.resolved().itemLabel);\r\n protected readonly isDisabled = computed(() => this.resolved().disabled === true);\r\n protected readonly pageSizeOptions = computed(() => this.resolved().pageSizeOptions ?? []);\r\n\r\n protected readonly pageCount = computed(() => txPageCount(this.total(), this.pageSize()));\r\n protected readonly range = computed(() =>\r\n txPageRange(this.pageIndex(), this.pageSize(), this.total()),\r\n );\r\n protected readonly items = computed(() =>\r\n txPageItems(this.pageIndex(), this.pageCount(), this.resolved().siblings ?? 1),\r\n );\r\n\r\n protected readonly navClass = [\r\n 'inline-grid size-tx-control-md shrink-0 cursor-pointer place-items-center rounded-tx-sm',\r\n 'border border-tx-border bg-tx-surface text-tx-text-muted transition-colors',\r\n 'hover:border-tx-border-strong hover:text-tx-text-primary',\r\n 'focus-visible:border-tx-border-strong focus-visible:text-tx-text-primary',\r\n 'disabled:pointer-events-none disabled:opacity-40',\r\n ].join(' ');\r\n\r\n protected readonly pageClass = [\r\n 'inline-grid h-tx-control-md min-w-tx-control-md cursor-pointer place-items-center',\r\n 'rounded-tx-sm border border-transparent px-tx-2 text-tx-base tabular-nums',\r\n 'text-tx-text-primary transition-colors',\r\n 'hover:bg-tx-hover-fill focus-visible:bg-tx-hover-fill',\r\n // Current page is read from aria-current, not a mirrored boolean.\r\n 'aria-[current=page]:border-tx-primary aria-[current=page]:bg-tx-primary-subtle',\r\n 'aria-[current=page]:font-semibold aria-[current=page]:text-tx-primary-text',\r\n 'disabled:pointer-events-none disabled:opacity-40',\r\n ].join(' ');\r\n\r\n protected readonly selectClass = [\r\n 'h-tx-control-md cursor-pointer rounded-tx-sm border border-tx-border bg-tx-surface',\r\n 'px-tx-2 text-tx-base text-tx-text-primary transition-colors',\r\n 'hover:border-tx-border-strong focus:border-tx-primary focus:shadow-tx-focus focus:outline-none',\r\n 'disabled:pointer-events-none disabled:opacity-40',\r\n ].join(' ');\r\n\r\n /** Moves to a page, clamped to one that exists. */\r\n goTo(index: number): void {\r\n const next = Math.min(Math.max(0, index), this.pageCount() - 1);\r\n if (next === this.pageIndex()) {\r\n return;\r\n }\r\n this.pageIndex.set(next);\r\n this.pageChange.emit({ pageIndex: next, pageSize: this.pageSize() });\r\n }\r\n\r\n protected onPageSize(event: Event): void {\r\n const size = Number((event.target as HTMLSelectElement).value);\r\n if (!Number.isFinite(size) || size <= 0) {\r\n return;\r\n }\r\n // Keep the first visible row visible rather than jumping to a random page.\r\n const firstRow = this.pageIndex() * this.pageSize();\r\n const nextIndex = Math.floor(firstRow / size);\r\n this.pageSize.set(size);\r\n this.pageIndex.set(nextIndex);\r\n this.pageChange.emit({ pageIndex: nextIndex, pageSize: size });\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Shape of the placeholder. */\r\nexport type TxSkeletonShape = 'text' | 'heading' | 'block' | 'circle' | 'pill';\r\n\r\n/** Simple property configuration for {@link TxSkeletonComponent}. */\r\nexport interface TxSkeletonConfig {\r\n /** Defaults to `text`. */\r\n shape?: TxSkeletonShape;\r\n /**\r\n * Number of lines. Only meaningful for `text`; the last line is rendered\r\n * short so a block of them reads as a paragraph rather than a grid.\r\n * Defaults to 1.\r\n */\r\n lines?: number;\r\n /** CSS width, e.g. `60%`. Defaults to full width (or a square for `circle`). */\r\n width?: string;\r\n /** CSS height. Defaults to a sensible height for the shape. */\r\n height?: string;\r\n /** Set false for a static placeholder. Defaults to true. */\r\n animated?: boolean;\r\n /**\r\n * Announced to screen readers while content loads. Defaults to `Loading`;\r\n * set to an empty string when a nearby live region already says so.\r\n */\r\n label?: string;\r\n}\r\n\r\nexport const TX_SKELETON_DEFAULTS = {\r\n shape: 'text',\r\n lines: 1,\r\n animated: true,\r\n label: 'Loading',\r\n} as const satisfies Partial<TxSkeletonConfig>;\r\n\r\nconst SHAPE_CLASSES: Record<TxSkeletonShape, string> = {\r\n text: 'h-tx-3-5 rounded-tx-xs',\r\n heading: 'h-tx-5 rounded-tx-xs',\r\n block: 'h-tx-16 rounded-tx-md',\r\n circle: 'size-tx-8 rounded-tx-full',\r\n pill: 'h-tx-5 rounded-tx-full',\r\n};\r\n\r\n/**\r\n * A placeholder shown in the shape of the content that is loading.\r\n *\r\n * Used on its own, and by {@link TxTableComponent} for its loading rows.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-skeleton [config]=\"{ shape: 'text', lines: 3 }\" />\r\n * <tx-skeleton [config]=\"{ shape: 'circle' }\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-skeleton',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block',\r\n role: 'status',\r\n '[attr.aria-busy]': 'true',\r\n },\r\n template: `\r\n @if (label()) {\r\n <span class=\"sr-only\">{{ label() }}</span>\r\n }\r\n @for (line of lines(); track $index) {\r\n <span\r\n [class]=\"lineClass($index)\"\r\n [style.width]=\"widthFor($index)\"\r\n [style.height]=\"height()\"\r\n aria-hidden=\"true\"\r\n ></span>\r\n }\r\n `,\r\n})\r\nexport class TxSkeletonComponent {\r\n readonly config = input<Partial<TxSkeletonConfig>>({});\r\n\r\n private readonly resolved = computed<TxSkeletonConfig>(() =>\r\n txMergeConfig(TX_SKELETON_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly label = computed(() => this.resolved().label);\r\n protected readonly height = computed(() => this.resolved().height ?? null);\r\n\r\n protected readonly lines = computed(() => {\r\n const shape = this.resolved().shape ?? 'text';\r\n const count = shape === 'text' ? Math.max(1, this.resolved().lines ?? 1) : 1;\r\n return Array.from({ length: count });\r\n });\r\n\r\n protected lineClass(index: number): string {\r\n const { shape, animated } = this.resolved();\r\n return [\r\n 'block bg-tx-skeleton',\r\n SHAPE_CLASSES[shape ?? 'text'],\r\n index > 0 ? 'mt-tx-2' : '',\r\n animated === false ? '' : 'animate-pulse',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n protected widthFor(index: number): string | null {\r\n const { shape, width, lines } = this.resolved();\r\n if (width) {\r\n return width;\r\n }\r\n if (shape === 'circle') {\r\n return null;\r\n }\r\n // The last line of a paragraph runs short, which is what makes a stack of\r\n // bars read as text rather than as a table.\r\n const count = Math.max(1, lines ?? 1);\r\n return shape === 'text' && count > 1 && index === count - 1 ? '62%' : null;\r\n }\r\n}\r\n","import {\r\n CdkCell,\r\n CdkCellDef,\r\n CdkColumnDef,\r\n CdkHeaderCell,\r\n CdkHeaderCellDef,\r\n CdkHeaderRow,\r\n CdkHeaderRowDef,\r\n CdkNoDataRow,\r\n CdkRow,\r\n CdkRowDef,\r\n CdkTable,\r\n} from '@angular/cdk/table';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n contentChildren,\r\n effect,\r\n input,\r\n model,\r\n output,\r\n untracked,\r\n} from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { TxPaginationComponent } from '../pagination/pagination.component';\r\nimport { txClampPageIndex, txPaginate } from '../pagination/pagination-utils';\r\nimport { TxSkeletonComponent } from '../skeleton/skeleton.component';\r\nimport { TxTableActionsDirective, TxTableCellDirective } from './table-slots.directive';\r\nimport { txAriaSort, txColumnValue, txNextSort, txSortRows } from './table-utils';\r\nimport {\r\n TX_TABLE_DEFAULTS,\r\n TxColumnPriority,\r\n TxTableColumn,\r\n TxTableConfig,\r\n TxTableSort,\r\n} from './table.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\nconst SELECT_COLUMN = '__tx_select';\r\nconst ACTION_COLUMN = '__tx_actions';\r\n\r\n/** Column-priority classes. The documented way a wide table narrows. */\r\nconst PRIORITY_CLASSES: Record<TxColumnPriority, string> = {\r\n always: '',\r\n sm: 'hidden sm:table-cell',\r\n md: 'hidden md:table-cell',\r\n lg: 'hidden lg:table-cell',\r\n xl: 'hidden xl:table-cell',\r\n};\r\n\r\n/**\r\n * A data table.\r\n *\r\n * Built on `@angular/cdk/table` in its native-`<table>` form, so the markup is a\r\n * real table with real `th`/`td` semantics rather than a grid of divs.\r\n *\r\n * ## What is config and what is a slot\r\n *\r\n * Sorting, pagination, density, selection mode, loading and the empty state are\r\n * simple property variation and live in {@link TxTableConfig}. Columns are data\r\n * and come through `columns`. Anything structural is projected: a custom cell is\r\n * an `ng-template[txTableCell=\"key\"]`, and the action column's content is an\r\n * `ng-template[txTableActions]`.\r\n *\r\n * ## Narrow screens\r\n *\r\n * `responsive` picks the strategy rather than leaving it to chance:\r\n * `sticky-first` (default) scrolls horizontally with the first column pinned so\r\n * the row stays identifiable; `scroll` scrolls plainly; `priority` drops columns\r\n * by their `priority` instead of scrolling at all.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-table\r\n * [columns]=\"columns\"\r\n * [rows]=\"reports()\"\r\n * [config]=\"{ sort: 'client', pagination: 'client', actionColumn: 'end' }\"\r\n * [(sort)]=\"sort\"\r\n * [(selectedRows)]=\"selected\">\r\n * <ng-template txTableCell=\"status\" let-row>\r\n * <tx-badge [config]=\"{ label: row.status }\" />\r\n * </ng-template>\r\n * <ng-template txTableActions let-row>\r\n * <tx-button [config]=\"{ label: 'Edit', icon: 'edit', display: 'icon-only' }\" />\r\n * </ng-template>\r\n * </tx-table>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-table',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CdkTable,\r\n CdkColumnDef,\r\n CdkHeaderCell,\r\n CdkHeaderCellDef,\r\n CdkCell,\r\n CdkCellDef,\r\n CdkHeaderRow,\r\n CdkHeaderRowDef,\r\n CdkRow,\r\n CdkRowDef,\r\n CdkNoDataRow,\r\n NgTemplateOutlet,\r\n TxIconComponent,\r\n TxSkeletonComponent,\r\n TxPaginationComponent,\r\n ],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n <div\r\n class=\"flex min-w-0 flex-col overflow-hidden rounded-tx-md border border-tx-border\r\n bg-tx-surface shadow-tx-md\"\r\n >\r\n @if (caption(); as text) {\r\n <div class=\"flex items-center gap-tx-2 border-b border-tx-border px-tx-4 py-tx-3\">\r\n <h3 class=\"text-tx-base font-semibold tracking-tx-wider uppercase\">{{ text }}</h3>\r\n </div>\r\n }\r\n\r\n <div [class]=\"scrollerClass()\">\r\n <table cdk-table [dataSource]=\"visibleRows()\" [class]=\"tableClass()\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n [attr.aria-busy]=\"isLoading() ? 'true' : null\">\r\n <!-- selection -->\r\n @if (selectionMode() !== 'none') {\r\n <ng-container [cdkColumnDef]=\"selectColumn\" [sticky]=\"stickyFirst()\">\r\n <th cdk-header-cell *cdkHeaderCellDef [class]=\"headerCellClass('center', true)\">\r\n @if (selectionMode() === 'multiple') {\r\n <input\r\n type=\"checkbox\"\r\n class=\"size-tx-4 cursor-pointer accent-tx-primary-hover\"\r\n [checked]=\"allSelected()\"\r\n [indeterminate]=\"someSelected() && !allSelected()\"\r\n aria-label=\"Select all rows\"\r\n (change)=\"toggleAll()\"\r\n />\r\n } @else {\r\n <span class=\"sr-only\">Selected</span>\r\n }\r\n </th>\r\n <td cdk-cell *cdkCellDef=\"let row\" [class]=\"bodyCellClass('center', 'text', true)\">\r\n <input\r\n [type]=\"selectionMode() === 'multiple' ? 'checkbox' : 'radio'\"\r\n class=\"size-tx-4 cursor-pointer accent-tx-primary-hover\"\r\n [checked]=\"isSelected(row)\"\r\n [attr.aria-label]=\"'Select row'\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleRow(row)\"\r\n />\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @for (column of columns(); track column.key) {\r\n <ng-container [cdkColumnDef]=\"column.key\" [sticky]=\"isStickyColumn(column)\">\r\n <th\r\n cdk-header-cell\r\n *cdkHeaderCellDef\r\n [class]=\"headerCellClass(alignOf(column), isStickyColumn(column), column.priority)\"\r\n [attr.aria-sort]=\"ariaSort(column)\"\r\n >\r\n @if (column.sortable && sortEnabled()) {\r\n <button\r\n type=\"button\"\r\n [class]=\"sortButtonClass\"\r\n [attr.aria-label]=\"sortLabel(column)\"\r\n (click)=\"toggleSort(column)\"\r\n >\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n <tx-icon [config]=\"{ name: sortIcon(column), size: 'sm' }\" />\r\n </button>\r\n } @else {\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n @if (column.headerLabel; as label) {\r\n <span class=\"sr-only\">{{ label }}</span>\r\n }\r\n }\r\n </th>\r\n <td\r\n cdk-cell\r\n *cdkCellDef=\"let row\"\r\n [class]=\"\r\n bodyCellClass(\r\n alignOf(column),\r\n column.variant ?? 'text',\r\n isStickyColumn(column),\r\n column.priority,\r\n column.noWrap\r\n )\r\n \"\r\n >\r\n @if (cellTemplateFor(column.key); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: row,\r\n row: row,\r\n column: column,\r\n value: display(column, row)\r\n }\"\r\n />\r\n } @else {\r\n {{ display(column, row) }}\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <!-- actions -->\r\n @if (hasActionColumn()) {\r\n <ng-container [cdkColumnDef]=\"actionColumn\" stickyEnd>\r\n <th cdk-header-cell *cdkHeaderCellDef [class]=\"headerCellClass('end', false)\">\r\n <span class=\"sr-only\">{{ actionHeader() }}</span>\r\n </th>\r\n <td cdk-cell *cdkCellDef=\"let row\" [class]=\"bodyCellClass('end', 'text', false)\">\r\n <!--\r\n Quiet until the row is hovered, focused within or selected, and\r\n always visible below md where there is no hover at all. Every\r\n hover affordance has a focus counterpart.\r\n -->\r\n <span\r\n class=\"flex items-center justify-end gap-tx-1 opacity-0 transition-opacity\r\n group-hover/txtr:opacity-100 group-focus-within/txtr:opacity-100\r\n [[aria-selected=true]_&]:opacity-100 max-md:opacity-100\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (actionsTemplate(); as slot) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"slot.template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, row: row }\"\r\n />\r\n }\r\n </span>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr cdk-header-row *cdkHeaderRowDef=\"displayedColumns()\" [class]=\"headerRowClass\"></tr>\r\n <tr\r\n cdk-row\r\n *cdkRowDef=\"let row; columns: displayedColumns()\"\r\n [class]=\"rowClass()\"\r\n [attr.aria-selected]=\"selectionMode() === 'none' ? null : isSelected(row)\"\r\n [attr.tabindex]=\"selectionMode() === 'none' ? null : 0\"\r\n (click)=\"onRowActivate(row)\"\r\n (keydown)=\"onRowKeydown(row, $event)\"\r\n ></tr>\r\n\r\n <!-- CDK renders this when the data source is empty, which covers both\r\n the loading and the genuinely-empty cases. -->\r\n <tr *cdkNoDataRow>\r\n <td [attr.colspan]=\"displayedColumns().length\" class=\"p-0\">\r\n @if (isLoading()) {\r\n <div class=\"flex flex-col gap-tx-3 p-tx-4\">\r\n @for (row of loadingRows(); track $index) {\r\n <tx-skeleton [config]=\"{ shape: 'text', label: $index === 0 ? 'Loading rows' : '' }\" />\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col items-center gap-tx-2 px-tx-4 py-tx-10 text-center\">\r\n @if (emptyIcon(); as icon) {\r\n <span class=\"flex text-tx-text-subtle\">\r\n <tx-icon [config]=\"{ name: icon, size: 'lg' }\" />\r\n </span>\r\n }\r\n <p class=\"text-tx-base text-tx-text-muted\">{{ emptyText() }}</p>\r\n </div>\r\n }\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n @if (paginationEnabled()) {\r\n <div class=\"border-t border-tx-border px-tx-3 py-tx-2-5\">\r\n <tx-pagination\r\n [total]=\"totalRows()\"\r\n [(pageIndex)]=\"pageIndex\"\r\n [(pageSize)]=\"pageSize\"\r\n [config]=\"{\r\n pageSizeOptions: config().pageSizeOptions,\r\n itemLabel: itemLabel(),\r\n disabled: isLoading()\r\n }\"\r\n (pageChange)=\"pageChange.emit($event)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TxTableComponent<T = Record<string, unknown>> {\r\n readonly config = input<Partial<TxTableConfig>>({});\r\n\r\n /** Column descriptors. Data, so they are their own input. */\r\n readonly columns = input.required<readonly TxTableColumn<T>[]>();\r\n\r\n /** The rows to show. */\r\n readonly rows = input.required<readonly T[]>();\r\n\r\n /**\r\n * Identity for selection and tracking. Defaults to the row object itself,\r\n * which is right when rows are stable references; supply one when rows are\r\n * re-created on every fetch.\r\n */\r\n readonly trackBy = input<(row: T) => unknown>((row) => row);\r\n\r\n /**\r\n * Total row count for server-side pagination. Ignored when paginating on the\r\n * client, where the row count is simply `rows().length`.\r\n */\r\n readonly total = input<number | null>(null);\r\n\r\n readonly sort = model<TxTableSort | null>(null);\r\n readonly pageIndex = model(0);\r\n readonly pageSize = model(10);\r\n readonly selectedRows = model<T[]>([]);\r\n\r\n // No explicit sortChange output: the `sort` model already emits one, and\r\n // declaring both is what server-side consumers would bind to ambiguously.\r\n readonly pageChange = output<{ pageIndex: number; pageSize: number }>();\r\n readonly selectionChange = output<T[]>();\r\n /** A row was clicked or activated with Enter/Space. */\r\n readonly rowActivate = output<T>();\r\n\r\n private readonly cellTemplates = contentChildren(TxTableCellDirective);\r\n protected readonly actionsTemplate = contentChild(TxTableActionsDirective);\r\n\r\n protected readonly selectColumn = SELECT_COLUMN;\r\n protected readonly actionColumn = ACTION_COLUMN;\r\n\r\n private readonly resolved = computed<TxTableConfig>(() =>\r\n txMergeConfig(TX_TABLE_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly caption = computed(() => this.resolved().caption ?? null);\r\n protected readonly emptyText = computed(() => this.resolved().emptyText);\r\n protected readonly emptyIcon = computed(() => this.resolved().emptyIcon ?? null);\r\n protected readonly itemLabel = computed(() => this.resolved().itemLabel);\r\n protected readonly isLoading = computed(() => this.resolved().loading === true);\r\n protected readonly selectionMode = computed(() => this.resolved().selection ?? 'none');\r\n protected readonly sortEnabled = computed(() => this.resolved().sort !== 'none');\r\n protected readonly paginationEnabled = computed(() => this.resolved().pagination !== 'none');\r\n protected readonly hasActionColumn = computed(() => this.resolved().actionColumn === 'end');\r\n protected readonly actionHeader = computed(() => this.resolved().actionColumnHeader);\r\n protected readonly stickyFirst = computed(() => this.resolved().responsive === 'sticky-first');\r\n\r\n protected readonly loadingRows = computed(() =>\r\n Array.from({ length: this.resolved().loadingRows ?? 5 }),\r\n );\r\n\r\n /** Rows after client-side sorting. Server modes leave the input untouched. */\r\n private readonly sortedRows = computed(() => {\r\n const sort = this.sort();\r\n if (this.resolved().sort !== 'client' || !sort) {\r\n return [...this.rows()];\r\n }\r\n const column = this.columns().find((candidate) => candidate.key === sort.column);\r\n return txSortRows(this.rows(), column, sort.direction);\r\n });\r\n\r\n /** Total for the pagination footer. */\r\n protected readonly totalRows = computed(() =>\r\n this.resolved().pagination === 'server' ? (this.total() ?? this.rows().length) : this.rows().length,\r\n );\r\n\r\n /** Rows actually rendered. Empty while loading, so the no-data row shows. */\r\n protected readonly visibleRows = computed<readonly T[]>(() => {\r\n if (this.isLoading()) {\r\n return [];\r\n }\r\n const sorted = this.sortedRows();\r\n if (this.resolved().pagination !== 'client') {\r\n return sorted;\r\n }\r\n return txPaginate(sorted, this.pageIndex(), this.pageSize());\r\n });\r\n\r\n protected readonly displayedColumns = computed(() => {\r\n const keys: string[] = [];\r\n if (this.selectionMode() !== 'none') {\r\n keys.push(SELECT_COLUMN);\r\n }\r\n keys.push(...this.columns().map((column) => column.key));\r\n if (this.hasActionColumn()) {\r\n keys.push(ACTION_COLUMN);\r\n }\r\n return keys;\r\n });\r\n\r\n constructor() {\r\n // Deleting the last row of the last page would otherwise strand the user on\r\n // a page that no longer exists.\r\n effect(() => {\r\n const total = this.totalRows();\r\n const size = this.pageSize();\r\n untracked(() => {\r\n const clamped = txClampPageIndex(this.pageIndex(), total, size);\r\n if (clamped !== this.pageIndex()) {\r\n this.pageIndex.set(clamped);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /* ---- rendering helpers ---- */\r\n\r\n protected alignOf(column: TxTableColumn<T>): 'start' | 'center' | 'end' {\r\n return column.align ?? (column.variant === 'numeric' ? 'end' : 'start');\r\n }\r\n\r\n protected isStickyColumn(column: TxTableColumn<T>): boolean {\r\n return (\r\n this.stickyFirst() &&\r\n this.selectionMode() === 'none' &&\r\n this.columns()[0]?.key === column.key\r\n );\r\n }\r\n\r\n protected display(column: TxTableColumn<T>, row: T): string {\r\n const value = txColumnValue(column, row);\r\n return value === null || value === undefined ? '' : String(value);\r\n }\r\n\r\n protected cellTemplateFor(key: string) {\r\n return this.cellTemplates().find((slot) => slot.column() === key)?.template ?? null;\r\n }\r\n\r\n protected ariaSort(column: TxTableColumn<T>) {\r\n return txAriaSort(this.sort(), column.key, column.sortable === true && this.sortEnabled());\r\n }\r\n\r\n protected sortIcon(column: TxTableColumn<T>): string {\r\n const sort = this.sort();\r\n if (!sort || sort.column !== column.key) {\r\n return 'sort-none';\r\n }\r\n return sort.direction === 'asc' ? 'sort-ascending' : 'sort-descending';\r\n }\r\n\r\n protected sortLabel(column: TxTableColumn<T>): string {\r\n const next = txNextSort(this.sort(), column.key);\r\n if (!next) {\r\n return `${column.header}: remove sort`;\r\n }\r\n return `${column.header}: sort ${next.direction === 'asc' ? 'ascending' : 'descending'}`;\r\n }\r\n\r\n /* ---- class builders ---- */\r\n\r\n protected readonly headerRowClass = 'border-b-2 border-tx-accent';\r\n\r\n protected readonly sortButtonClass = [\r\n 'flex w-full cursor-pointer items-center gap-tx-1-5 text-left',\r\n 'text-[inherit] tracking-[inherit] uppercase transition-colors',\r\n 'hover:text-tx-text-heading focus-visible:text-tx-text-heading',\r\n ].join(' ');\r\n\r\n protected scrollerClass(): string {\r\n return this.resolved().responsive === 'priority'\r\n ? 'min-w-0'\r\n : 'min-w-0 overflow-x-auto overscroll-x-contain';\r\n }\r\n\r\n protected tableClass(): string {\r\n return [\r\n 'w-full border-collapse text-tx-base',\r\n this.resolved().responsive === 'priority' ? '' : 'min-w-max',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n protected headerCellClass(\r\n align: 'start' | 'center' | 'end',\r\n sticky: boolean,\r\n priority?: TxColumnPriority,\r\n ): string {\r\n return [\r\n 'border-b-2 border-tx-accent bg-tx-surface px-tx-2-5 py-tx-2 align-bottom',\r\n 'font-tx-mono text-tx-2xs font-normal tracking-tx-widest whitespace-nowrap uppercase',\r\n 'text-tx-text-muted',\r\n ALIGN_CLASSES[align],\r\n // A sticky cell needs its own background or rows scroll through it.\r\n sticky ? 'sticky left-0 z-20 bg-tx-surface' : '',\r\n PRIORITY_CLASSES[priority ?? 'always'],\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n protected bodyCellClass(\r\n align: 'start' | 'center' | 'end',\r\n variant: 'text' | 'mono' | 'numeric',\r\n sticky: boolean,\r\n priority?: TxColumnPriority,\r\n noWrap?: boolean,\r\n ): string {\r\n const dense = this.resolved().density === 'compact';\r\n return [\r\n 'border-b border-tx-border-subtle align-top text-tx-text-primary',\r\n dense ? 'px-tx-2 py-tx-1-5' : 'px-tx-2-5 py-tx-2-5',\r\n ALIGN_CLASSES[align],\r\n variant === 'mono' ? 'font-tx-mono text-tx-sm' : '',\r\n variant === 'numeric' ? 'tabular-nums' : '',\r\n noWrap ? 'whitespace-nowrap' : '',\r\n // Inherit the row's background so a selected or hovered row reads through\r\n // the sticky column instead of being covered by an opaque strip.\r\n sticky ? 'sticky left-0 z-10 bg-[inherit]' : '',\r\n PRIORITY_CLASSES[priority ?? 'always'],\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n protected rowClass(): string {\r\n return [\r\n 'group/txtr bg-tx-surface transition-colors',\r\n this.resolved().hoverable === false ? '' : 'hover:bg-tx-surface-sunken',\r\n this.selectionMode() === 'none' ? '' : 'cursor-pointer',\r\n 'focus-visible:outline-none focus-visible:bg-tx-hover-fill',\r\n 'aria-selected:bg-tx-selected-fill',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n /* ---- interaction ---- */\r\n\r\n protected toggleSort(column: TxTableColumn<T>): void {\r\n // Setting the model emits `sortChange`, which is what a server-side\r\n // consumer listens to in order to refetch.\r\n this.sort.set(txNextSort(this.sort(), column.key));\r\n }\r\n\r\n protected isSelected(row: T): boolean {\r\n const id = this.trackBy()(row);\r\n return this.selectedRows().some((candidate) => this.trackBy()(candidate) === id);\r\n }\r\n\r\n protected allSelected(): boolean {\r\n const rows = this.rows();\r\n return rows.length > 0 && rows.every((row) => this.isSelected(row));\r\n }\r\n\r\n protected someSelected(): boolean {\r\n return this.selectedRows().length > 0;\r\n }\r\n\r\n protected toggleRow(row: T): void {\r\n const mode = this.selectionMode();\r\n if (mode === 'none') {\r\n return;\r\n }\r\n if (mode === 'single') {\r\n this.commitSelection(this.isSelected(row) ? [] : [row]);\r\n return;\r\n }\r\n const id = this.trackBy()(row);\r\n const next = this.isSelected(row)\r\n ? this.selectedRows().filter((candidate) => this.trackBy()(candidate) !== id)\r\n : [...this.selectedRows(), row];\r\n this.commitSelection(next);\r\n }\r\n\r\n protected toggleAll(): void {\r\n this.commitSelection(this.allSelected() ? [] : [...this.rows()]);\r\n }\r\n\r\n protected onRowActivate(row: T): void {\r\n this.rowActivate.emit(row);\r\n if (this.selectionMode() !== 'none') {\r\n this.toggleRow(row);\r\n }\r\n }\r\n\r\n protected onRowKeydown(row: T, event: KeyboardEvent): void {\r\n if (event.key !== 'Enter' && event.key !== ' ') {\r\n return;\r\n }\r\n // Let a control inside the row handle its own keys.\r\n if (event.target !== event.currentTarget) {\r\n return;\r\n }\r\n event.preventDefault();\r\n this.onRowActivate(row);\r\n }\r\n\r\n private commitSelection(next: T[]): void {\r\n this.selectedRows.set(next);\r\n this.selectionChange.emit(next);\r\n }\r\n}\r\n\r\nconst ALIGN_CLASSES: Record<'start' | 'center' | 'end', string> = {\r\n start: 'text-left',\r\n center: 'text-center',\r\n end: 'text-right',\r\n};\r\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\r\nimport {\r\n CdkDrag,\r\n CdkDragDrop,\r\n CdkDragHandle,\r\n CdkDragPlaceholder,\r\n CdkDropList,\r\n moveItemInArray,\r\n} from '@angular/cdk/drag-drop';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n TemplateRef,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * One reorderable item.\r\n *\r\n * Items are data. Anything structural — per-item actions, a custom body — is a\r\n * `TemplateRef` slot on the component, never a field here.\r\n */\r\nexport interface TxReorderItem<T = unknown> {\r\n /** Unique within the list. */\r\n id: string;\r\n label: string;\r\n /** Optional second line. */\r\n description?: string;\r\n /** Registered icon name shown before the label. */\r\n icon?: string;\r\n /** Excluded from dragging and from the move buttons. */\r\n disabled?: boolean;\r\n /** Application payload, passed back in slot contexts and outputs. */\r\n data?: T;\r\n}\r\n\r\n/**\r\n * What the user grabs to drag.\r\n *\r\n * A union rather than a `dragAnywhere` boolean, so a third mode stays possible.\r\n */\r\nexport type TxReorderHandle = 'handle' | 'row';\r\n\r\n/** Simple property configuration for {@link TxReorderListComponent}. */\r\nexport interface TxReorderListConfig {\r\n /** Defaults to `handle`. */\r\n handle?: TxReorderHandle;\r\n /** Defaults to `md`. */\r\n size?: 'sm' | 'md';\r\n /** Shows the 1-based position before each item. */\r\n showIndex?: boolean;\r\n disabled?: boolean;\r\n emptyText?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_REORDER_LIST_DEFAULTS = {\r\n handle: 'handle',\r\n size: 'md',\r\n emptyText: 'Nothing to reorder',\r\n ariaLabel: 'Reorderable list',\r\n} as const satisfies Partial<TxReorderListConfig>;\r\n\r\n/**\r\n * A list whose items can be reordered.\r\n *\r\n * Dragging is `@angular/cdk/drag-drop`. Dragging alone is not accessible, so\r\n * every row also carries move-up and move-down buttons: they are the keyboard\r\n * path, they are reachable by Tab, and they appear on focus as well as on hover.\r\n * Each move is announced through the CDK's `LiveAnnouncer`, so a screen-reader\r\n * user hears where the item landed rather than being left to guess.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-reorder-list [(items)]=\"steps\" [config]=\"{ showIndex: true }\"\r\n * [actionsTemplate]=\"rowActions\" />\r\n *\r\n * <ng-template #rowActions let-item>\r\n * <tx-button [config]=\"{ label: 'Remove ' + item.label, icon: 'trash',\r\n * display: 'icon-only', variant: 'danger', size: 'sm' }\" />\r\n * </ng-template>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-reorder-list',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CdkDropList,\r\n CdkDrag,\r\n CdkDragHandle,\r\n CdkDragPlaceholder,\r\n NgTemplateOutlet,\r\n TxIconComponent,\r\n ],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n @if (items().length === 0) {\r\n <p class=\"px-tx-3 py-tx-5 text-center text-tx-base text-tx-text-muted\">{{ emptyText() }}</p>\r\n } @else {\r\n <ul\r\n cdkDropList\r\n [cdkDropListDisabled]=\"isDisabled()\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n class=\"flex list-none flex-col gap-tx-1-5 p-0\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n >\r\n @for (item of items(); track item.id; let index = $index) {\r\n <li\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"isDisabled() || item.disabled === true\"\r\n [class]=\"rowClass()\"\r\n >\r\n <!-- Rendered in place of the row while it is being dragged. -->\r\n <div\r\n *cdkDragPlaceholder\r\n class=\"h-tx-10 rounded-tx-sm border border-dashed border-tx-primary\r\n bg-tx-primary-subtle\"\r\n ></div>\r\n\r\n <!--\r\n With no cdkDragHandle anywhere on the row, CdkDrag makes the whole\r\n row draggable. The handle glyph still shows in both modes so the\r\n affordance is visible either way.\r\n -->\r\n @if (grabWholeRow()) {\r\n <span [class]=\"handleClass()\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: 'drag-handle', size: 'sm' }\" />\r\n </span>\r\n } @else {\r\n <span cdkDragHandle [class]=\"handleClass()\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: 'drag-handle', size: 'sm' }\" />\r\n </span>\r\n }\r\n\r\n @if (showIndex()) {\r\n <span\r\n class=\"w-tx-6 shrink-0 text-right font-tx-mono text-tx-2xs tabular-nums\r\n text-tx-text-subtle\"\r\n aria-hidden=\"true\"\r\n >{{ index + 1 }}</span\r\n >\r\n }\r\n\r\n @if (itemTemplate(); as tpl) {\r\n <span class=\"min-w-0 flex-1\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"slotContext(item, index)\"\r\n />\r\n </span>\r\n } @else {\r\n @if (item.icon; as name) {\r\n <span class=\"flex shrink-0 text-tx-text-subtle\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n </span>\r\n }\r\n <span class=\"min-w-0 flex-1\">\r\n <span class=\"block truncate text-tx-base\">{{ item.label }}</span>\r\n @if (item.description; as text) {\r\n <span class=\"block truncate text-tx-xs text-tx-text-muted\">{{ text }}</span>\r\n }\r\n </span>\r\n }\r\n\r\n <!--\r\n The keyboard path. Quiet until the row is hovered or focused\r\n within, and always visible below md where there is no hover.\r\n -->\r\n <span [class]=\"moveGroupClass()\">\r\n <button\r\n type=\"button\"\r\n [class]=\"moveButtonClass\"\r\n [disabled]=\"isDisabled() || item.disabled === true || index === 0\"\r\n [attr.aria-label]=\"'Move ' + item.label + ' up'\"\r\n (click)=\"move(index, index - 1)\"\r\n >\r\n <tx-icon [config]=\"{ name: 'arrow-up', size: 'sm' }\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"moveButtonClass\"\r\n [disabled]=\"\r\n isDisabled() || item.disabled === true || index === items().length - 1\r\n \"\r\n [attr.aria-label]=\"'Move ' + item.label + ' down'\"\r\n (click)=\"move(index, index + 1)\"\r\n >\r\n <tx-icon [config]=\"{ name: 'arrow-down', size: 'sm' }\" />\r\n </button>\r\n\r\n @if (actionsTemplate(); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"slotContext(item, index)\"\r\n />\r\n }\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n `,\r\n})\r\nexport class TxReorderListComponent<T = unknown> {\r\n private readonly announcer = inject(LiveAnnouncer);\r\n\r\n readonly config = input<Partial<TxReorderListConfig>>({});\r\n\r\n /** The ordered items. Two-way, so the new order flows straight back out. */\r\n readonly items = model.required<TxReorderItem<T>[]>();\r\n\r\n /** Replaces the default label/description body. */\r\n readonly itemTemplate = input<TemplateRef<unknown> | null>(null);\r\n /** Per-item action buttons, rendered after the move buttons. */\r\n readonly actionsTemplate = input<TemplateRef<unknown> | null>(null);\r\n\r\n /** Emitted with the new order whenever an item moves. */\r\n readonly reordered = output<{ item: TxReorderItem<T>; from: number; to: number; items: TxReorderItem<T>[] }>();\r\n\r\n private readonly resolved = computed<TxReorderListConfig>(() =>\r\n txMergeConfig(TX_REORDER_LIST_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly emptyText = computed(() => this.resolved().emptyText);\r\n protected readonly isDisabled = computed(() => this.resolved().disabled === true);\r\n protected readonly showIndex = computed(() => this.resolved().showIndex === true);\r\n protected readonly grabWholeRow = computed(() => this.resolved().handle === 'row');\r\n\r\n protected readonly moveButtonClass = [\r\n 'inline-grid size-tx-control-sm shrink-0 cursor-pointer place-items-center rounded-tx-xs',\r\n 'text-tx-text-subtle transition-colors',\r\n 'hover:bg-tx-hover-fill hover:text-tx-text-primary',\r\n 'focus-visible:bg-tx-hover-fill focus-visible:text-tx-text-primary',\r\n 'disabled:pointer-events-none disabled:opacity-30',\r\n ].join(' ');\r\n\r\n protected rowClass(): string {\r\n return [\r\n 'group/txri flex items-center gap-tx-2 rounded-tx-sm border border-tx-border',\r\n 'bg-tx-surface transition-colors',\r\n this.resolved().size === 'sm' ? 'px-tx-2 py-tx-1' : 'px-tx-2-5 py-tx-2',\r\n this.isDisabled() ? 'opacity-60' : 'hover:border-tx-border-strong',\r\n // CDK adds this while the row is being dragged.\r\n '[&.cdk-drag-preview]:shadow-tx-lg',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n protected handleClass(): string {\r\n return [\r\n 'inline-grid shrink-0 place-items-center rounded-tx-xs p-tx-0-5 text-tx-text-subtle',\r\n this.isDisabled() ? 'cursor-not-allowed' : 'cursor-grab active:cursor-grabbing',\r\n 'hover:bg-tx-hover-fill hover:text-tx-text-primary',\r\n ].join(' ');\r\n }\r\n\r\n protected moveGroupClass(): string {\r\n return [\r\n 'ml-auto flex shrink-0 items-center gap-tx-0-5 opacity-0 transition-opacity',\r\n 'group-hover/txri:opacity-100 group-focus-within/txri:opacity-100',\r\n 'max-md:opacity-100',\r\n ].join(' ');\r\n }\r\n\r\n protected slotContext(item: TxReorderItem<T>, index: number) {\r\n return {\r\n $implicit: item,\r\n item,\r\n index,\r\n first: index === 0,\r\n last: index === this.items().length - 1,\r\n };\r\n }\r\n\r\n protected onDrop(event: CdkDragDrop<unknown>): void {\r\n this.move(event.previousIndex, event.currentIndex);\r\n }\r\n\r\n /** Moves an item, clamped to the list's bounds. Also the keyboard path. */\r\n move(from: number, to: number): void {\r\n const items = this.items();\r\n const target = Math.min(Math.max(0, to), items.length - 1);\r\n if (from === target || from < 0 || from >= items.length) {\r\n return;\r\n }\r\n\r\n const next = [...items];\r\n moveItemInArray(next, from, target);\r\n const item = next[target];\r\n\r\n this.items.set(next);\r\n this.reordered.emit({ item, from, to: target, items: next });\r\n\r\n // Dragging is silent to a screen reader, and so is a button that reorders\r\n // content elsewhere on the page — say what happened.\r\n this.announcer.announce(\r\n `${item.label} moved to position ${target + 1} of ${next.length}`,\r\n 'assertive',\r\n );\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Severity of the message. Drives colour, default icon and the ARIA role. */\r\nexport type TxAlertVariant = 'info' | 'success' | 'warning' | 'danger';\r\n\r\n/**\r\n * How prominent the alert is.\r\n *\r\n * `subtle` is a tinted panel; `solid` fills with the variant colour for\r\n * something that must not be missed; `bare` drops the surface and keeps only\r\n * the icon and text, for use inside an already-bordered container.\r\n */\r\nexport type TxAlertAppearance = 'subtle' | 'solid' | 'bare';\r\n\r\n/** Simple property configuration for {@link TxAlertComponent}. */\r\nexport interface TxAlertConfig {\r\n /** Genuinely required: an alert with no severity has no meaning. */\r\n variant: TxAlertVariant;\r\n /** Bold first line. Omit for a single-line alert. */\r\n title?: string;\r\n /** Body text. Omit and project content instead for anything richer. */\r\n message?: string;\r\n /** Defaults to `subtle`. */\r\n appearance?: TxAlertAppearance;\r\n /** Registered icon name. Defaults to the variant's icon; `null` hides it. */\r\n icon?: string | null;\r\n /** Shows a close button and enables the `dismissed` output. */\r\n dismissible?: boolean;\r\n /**\r\n * `polite` (default) waits for a pause; `assertive` interrupts; `none`\r\n * renders no live region, for an alert present on first paint that would\r\n * otherwise be announced twice.\r\n */\r\n announce?: 'polite' | 'assertive' | 'none';\r\n}\r\n\r\nexport const TX_ALERT_DEFAULTS = {\r\n appearance: 'subtle',\r\n announce: 'polite',\r\n} as const satisfies Partial<TxAlertConfig>;\r\n\r\nconst DEFAULT_ICONS: Record<TxAlertVariant, string> = {\r\n info: 'info',\r\n success: 'check-circle',\r\n warning: 'alert-triangle',\r\n danger: 'alert-circle',\r\n};\r\n\r\nconst SUBTLE_CLASSES: Record<TxAlertVariant, string> = {\r\n info: 'border-tx-info-border bg-tx-info-subtle text-tx-text-primary',\r\n success: 'border-tx-success-border bg-tx-success-subtle text-tx-text-primary',\r\n warning: 'border-tx-warning-border bg-tx-warning-subtle text-tx-text-primary',\r\n danger: 'border-tx-danger-border bg-tx-danger-subtle text-tx-text-primary',\r\n};\r\n\r\nconst SOLID_CLASSES: Record<TxAlertVariant, string> = {\r\n info: 'border-transparent bg-tx-info text-tx-text-inverse',\r\n success: 'border-transparent bg-tx-success-hover text-tx-text-inverse',\r\n warning: 'border-transparent bg-tx-warning-hover text-tx-text-inverse',\r\n danger: 'border-transparent bg-tx-danger text-tx-text-on-danger',\r\n};\r\n\r\nconst ICON_TONE: Record<TxAlertVariant, string> = {\r\n info: 'text-tx-info-text',\r\n success: 'text-tx-success-text',\r\n warning: 'text-tx-warning-text',\r\n danger: 'text-tx-danger-text',\r\n};\r\n\r\n/**\r\n * An inline message about the state of the page or a region of it.\r\n *\r\n * Use `message` for plain text, or project content for anything richer — a\r\n * link, a list, a button. Both can be used together.\r\n *\r\n * `danger` and `warning` render as `role=\"alert\"` so they interrupt; the others\r\n * are `role=\"status\"`. Set `announce: 'none'` for an alert that is present on\r\n * first paint, which a live region would otherwise announce twice.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-alert [config]=\"{ variant: 'warning', title: 'Unsaved changes',\r\n * message: 'Leaving now discards them.', dismissible: true }\"\r\n * (dismissed)=\"hide()\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-alert',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { class: 'block' },\r\n template: `\r\n <div\r\n [class]=\"rootClass()\"\r\n [attr.role]=\"role()\"\r\n [attr.aria-live]=\"ariaLive()\"\r\n >\r\n @if (iconName(); as name) {\r\n <span [class]=\"iconClass()\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'md' }\" />\r\n </span>\r\n }\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n @if (title(); as text) {\r\n <p class=\"text-tx-base font-semibold leading-tx-snug\">{{ text }}</p>\r\n }\r\n @if (message(); as text) {\r\n <p [class]=\"messageClass()\">{{ text }}</p>\r\n }\r\n <ng-content />\r\n </div>\r\n\r\n @if (config().dismissible) {\r\n <button\r\n type=\"button\"\r\n [class]=\"closeClass()\"\r\n aria-label=\"Dismiss\"\r\n (click)=\"dismissed.emit()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TxAlertComponent {\r\n readonly config = input.required<TxAlertConfig>();\r\n\r\n /** Emitted when the close button is used. The parent owns visibility. */\r\n readonly dismissed = output<void>();\r\n\r\n private readonly resolved = computed<TxAlertConfig>(() =>\r\n txMergeConfig(TX_ALERT_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly title = computed(() => this.resolved().title ?? null);\r\n protected readonly message = computed(() => this.resolved().message ?? null);\r\n\r\n protected readonly iconName = computed(() => {\r\n const icon = this.resolved().icon;\r\n if (icon === null) {\r\n return null;\r\n }\r\n return icon ?? DEFAULT_ICONS[this.resolved().variant];\r\n });\r\n\r\n protected readonly role = computed(() => {\r\n const { variant, announce } = this.resolved();\r\n if (announce === 'none') {\r\n return null;\r\n }\r\n return variant === 'danger' || variant === 'warning' ? 'alert' : 'status';\r\n });\r\n\r\n protected readonly ariaLive = computed(() => {\r\n const announce = this.resolved().announce;\r\n return announce === 'none' ? null : announce;\r\n });\r\n\r\n private readonly isSolid = computed(() => this.resolved().appearance === 'solid');\r\n\r\n protected readonly rootClass = computed(() => {\r\n const { variant, appearance } = this.resolved();\r\n const base = 'flex items-start gap-tx-2-5 rounded-tx-sm text-tx-base';\r\n if (appearance === 'bare') {\r\n return `${base} border-none bg-transparent p-0`;\r\n }\r\n const tone = appearance === 'solid' ? SOLID_CLASSES[variant] : SUBTLE_CLASSES[variant];\r\n return `${base} border px-tx-3 py-tx-2-5 ${tone}`;\r\n });\r\n\r\n protected readonly iconClass = computed(() =>\r\n [\r\n 'mt-tx-0-5 flex shrink-0',\r\n this.isSolid() ? 'text-current' : ICON_TONE[this.resolved().variant],\r\n ].join(' '),\r\n );\r\n\r\n protected readonly messageClass = computed(() =>\r\n [\r\n 'leading-tx-normal',\r\n this.title() ? 'mt-tx-0-5' : '',\r\n this.isSolid() ? 'text-current' : 'text-tx-text-muted',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly closeClass = computed(() =>\r\n [\r\n 'inline-grid shrink-0 cursor-pointer place-items-center rounded-tx-xs p-tx-0-5',\r\n 'transition-colors',\r\n this.isSolid()\r\n ? 'text-current hover:bg-white/20 focus-visible:bg-white/20'\r\n : 'text-tx-text-subtle hover:bg-tx-hover-fill hover:text-tx-text-primary ' +\r\n 'focus-visible:bg-tx-hover-fill focus-visible:text-tx-text-primary',\r\n ].join(' '),\r\n );\r\n}\r\n","import {\r\n ConnectedPosition,\r\n OverlayRef,\r\n createFlexibleConnectedPositionStrategy,\r\n createOverlayRef,\r\n createRepositionScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n Injector,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n} from '@angular/core';\r\n\r\nimport { txUniqueId } from '../core/unique-id';\r\nimport { TxOverlayPlacement } from '../overlay/overlay.types';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Simple property configuration for {@link TxTooltipDirective}. */\r\nexport interface TxTooltipConfig {\r\n /** The text. Genuinely required — a tooltip with no text does nothing. */\r\n text: string;\r\n /** Defaults to `top-center`. Falls back through a ladder if it does not fit. */\r\n placement?: TxOverlayPlacement;\r\n /** Milliseconds before showing on hover. Defaults to 300. */\r\n showDelay?: number;\r\n /** Milliseconds before hiding. Defaults to 100. */\r\n hideDelay?: number;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const TX_TOOLTIP_DEFAULTS = {\r\n placement: 'top-center',\r\n showDelay: 300,\r\n hideDelay: 100,\r\n} as const satisfies Partial<TxTooltipConfig>;\r\n\r\n/** The floating bubble. Rendered into the overlay by the directive. */\r\n@Component({\r\n selector: 'tx-tooltip-panel',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n [id]=\"id\"\r\n role=\"tooltip\"\r\n class=\"max-w-[16rem] rounded-tx-sm bg-tx-surface-inverse px-tx-2-5 py-tx-1-5\r\n text-tx-sm leading-tx-snug text-tx-text-inverse shadow-tx-popup\"\r\n >\r\n {{ text() }}\r\n </div>\r\n `,\r\n})\r\nexport class TxTooltipPanelComponent {\r\n readonly text = signal('');\r\n id = '';\r\n}\r\n\r\nconst PLACEMENTS: Record<string, ConnectedPosition> = {\r\n 'top-center': { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' },\r\n 'bottom-center': { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' },\r\n 'left-start': { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' },\r\n 'right-start': { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' },\r\n};\r\n\r\n/**\r\n * A text tooltip on hover and on keyboard focus.\r\n *\r\n * Aria has no tooltip, so this is a CDK overlay. It attaches on demand rather\r\n * than eagerly — unlike the dropdown overlays, nothing needs to register with\r\n * it before first use.\r\n *\r\n * Shows on `focus-visible` as well as hover, so a tooltip is never information\r\n * available only to a mouse, and hides on Escape. The host gets\r\n * `aria-describedby` while the tooltip is up, which is how the text reaches a\r\n * screen reader — note that a tooltip *describes* a control, so the control\r\n * still needs its own accessible name.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-button [config]=\"{ label: 'Export', icon: 'download', display: 'icon-only' }\"\r\n * [txTooltip]=\"{ text: 'Export as CSV' }\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Directive({\r\n selector: '[txTooltip]',\r\n exportAs: 'txTooltip',\r\n host: {\r\n '(mouseenter)': 'show()',\r\n '(mouseleave)': 'hide()',\r\n '(focus)': 'onFocus($event)',\r\n '(blur)': 'hide()',\r\n '(keydown.escape)': 'hide()',\r\n '[attr.aria-describedby]': 'visible() ? panelId : null',\r\n },\r\n})\r\nexport class TxTooltipDirective {\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly injector = inject(Injector);\r\n\r\n readonly config = input.required<TxTooltipConfig>({ alias: 'txTooltip' });\r\n\r\n protected readonly panelId = txUniqueId('tooltip');\r\n protected readonly visible = signal(false);\r\n\r\n private overlayRef: OverlayRef | null = null;\r\n private panel: TxTooltipPanelComponent | null = null;\r\n private timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n private readonly resolved = computed<TxTooltipConfig>(() =>\r\n txMergeConfig(TX_TOOLTIP_DEFAULTS, this.config()),\r\n );\r\n\r\n constructor() {\r\n inject(DestroyRef).onDestroy(() => this.dispose());\r\n\r\n // Keep an open tooltip's text in step with its config.\r\n effect(() => {\r\n const text = this.resolved().text;\r\n untracked(() => this.panel?.text.set(text));\r\n });\r\n }\r\n\r\n /** Shows the tooltip after the configured delay. */\r\n show(): void {\r\n if (this.resolved().disabled || this.visible()) {\r\n return;\r\n }\r\n this.clearTimer();\r\n this.timer = setTimeout(() => this.attach(), this.resolved().showDelay ?? 300);\r\n }\r\n\r\n /** Hides the tooltip after the configured delay. */\r\n hide(): void {\r\n this.clearTimer();\r\n this.timer = setTimeout(() => this.detach(), this.resolved().hideDelay ?? 100);\r\n }\r\n\r\n /**\r\n * Only a keyboard focus should show a tooltip. A click focuses the element\r\n * too, and a bubble appearing under the pointer you just clicked with is\r\n * noise rather than help.\r\n */\r\n protected onFocus(event: FocusEvent): void {\r\n const target = event.target as Element | null;\r\n if (target?.matches(':focus-visible')) {\r\n this.show();\r\n }\r\n }\r\n\r\n private attach(): void {\r\n if (this.visible() || this.resolved().disabled) {\r\n return;\r\n }\r\n\r\n const preferred = PLACEMENTS[this.resolved().placement ?? 'top-center'] ?? PLACEMENTS['top-center'];\r\n const positionStrategy = createFlexibleConnectedPositionStrategy(\r\n this.injector,\r\n this.host.nativeElement,\r\n )\r\n .withPositions([\r\n preferred,\r\n PLACEMENTS['bottom-center'],\r\n PLACEMENTS['top-center'],\r\n PLACEMENTS['right-start'],\r\n PLACEMENTS['left-start'],\r\n ])\r\n .withPush(true);\r\n\r\n this.overlayRef = createOverlayRef(this.injector, {\r\n positionStrategy,\r\n scrollStrategy: createRepositionScrollStrategy(this.injector),\r\n panelClass: ['tx-overlay-pane', 'tx-overlay-gap-top-sm'],\r\n disposeOnNavigation: true,\r\n });\r\n\r\n const ref = this.overlayRef.attach(new ComponentPortal(TxTooltipPanelComponent));\r\n this.panel = ref.instance;\r\n this.panel.id = this.panelId;\r\n this.panel.text.set(this.resolved().text);\r\n ref.changeDetectorRef.markForCheck();\r\n this.visible.set(true);\r\n }\r\n\r\n private detach(): void {\r\n this.visible.set(false);\r\n this.panel = null;\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n }\r\n\r\n private clearTimer(): void {\r\n if (this.timer !== null) {\r\n clearTimeout(this.timer);\r\n this.timer = null;\r\n }\r\n }\r\n\r\n private dispose(): void {\r\n this.clearTimer();\r\n this.detach();\r\n }\r\n}\r\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\r\nimport { OverlayRef, createGlobalPositionStrategy, createOverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Injectable,\r\n Injector,\r\n computed,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txUniqueId } from '../core/unique-id';\r\n\r\n/** Severity of a toast. Drives colour, default icon and announcement urgency. */\r\nexport type TxToastVariant = 'info' | 'success' | 'warning' | 'danger';\r\n\r\n/** Where the stack sits. Set once through {@link TxToastService.configure}. */\r\nexport type TxToastPosition =\r\n | 'top-start'\r\n | 'top-center'\r\n | 'top-end'\r\n | 'bottom-start'\r\n | 'bottom-center'\r\n | 'bottom-end';\r\n\r\n/**\r\n * Simple property configuration for a toast.\r\n *\r\n * Deliberately no `onAction` callback: behaviour never lives in a config\r\n * object. `show()` returns a {@link TxToastRef} whose `action` promise resolves\r\n * when the action button is used.\r\n */\r\nexport interface TxToastConfig {\r\n /** Genuinely required: a toast with no message says nothing. */\r\n message: string;\r\n /** Defaults to `info`. */\r\n variant?: TxToastVariant;\r\n /** Bold first line above the message. */\r\n title?: string;\r\n /** Registered icon name. Defaults to the variant's icon; `null` hides it. */\r\n icon?: string | null;\r\n /**\r\n * Milliseconds before auto-dismissal. `0` keeps it until dismissed, which is\r\n * what `danger` defaults to — an error that vanishes is an error missed.\r\n */\r\n duration?: number;\r\n /** Shows a close button. Defaults to true. */\r\n dismissible?: boolean;\r\n /** Label for an action button, e.g. \"Undo\". */\r\n actionLabel?: string;\r\n}\r\n\r\nconst DEFAULT_ICONS: Record<TxToastVariant, string> = {\r\n info: 'info',\r\n success: 'check-circle',\r\n warning: 'alert-triangle',\r\n danger: 'alert-circle',\r\n};\r\n\r\nconst ACCENT: Record<TxToastVariant, string> = {\r\n info: 'border-l-tx-info',\r\n success: 'border-l-tx-success',\r\n warning: 'border-l-tx-warning',\r\n danger: 'border-l-tx-danger',\r\n};\r\n\r\n/** Why a toast closed. */\r\nexport type TxToastCloseReason = 'timeout' | 'dismissed' | 'action' | 'cleared';\r\n\r\n/** Handle to a live toast. */\r\nexport interface TxToastRef {\r\n readonly id: string;\r\n /** Resolves when the toast closes, with the reason. */\r\n readonly closed: Promise<TxToastCloseReason>;\r\n /** Resolves only if the action button is used. Never rejects. */\r\n readonly action: Promise<void>;\r\n /** Closes the toast early. */\r\n dismiss(): void;\r\n}\r\n\r\ninterface ToastEntry {\r\n id: string;\r\n config: Required<Pick<TxToastConfig, 'message'>> & TxToastConfig;\r\n variant: TxToastVariant;\r\n timer: ReturnType<typeof setTimeout> | null;\r\n close: (reason: TxToastCloseReason) => void;\r\n fireAction: () => void;\r\n}\r\n\r\n/** Service-level settings, applied to every toast. */\r\nexport interface TxToastServiceConfig {\r\n /** Defaults to `bottom-center`, matching the reference design. */\r\n position?: TxToastPosition;\r\n /** Most toasts on screen at once. Oldest are dropped first. Defaults to 4. */\r\n max?: number;\r\n /** Default duration in ms for non-danger toasts. Defaults to 5000. */\r\n duration?: number;\r\n}\r\n\r\nconst POSITION_CLASSES: Record<TxToastPosition, string> = {\r\n 'top-start': 'items-start',\r\n 'top-center': 'items-center',\r\n 'top-end': 'items-end',\r\n 'bottom-start': 'items-start',\r\n 'bottom-center': 'items-center',\r\n 'bottom-end': 'items-end',\r\n};\r\n\r\n/**\r\n * The stack. One instance, attached to a global CDK overlay on first use.\r\n */\r\n@Component({\r\n selector: 'tx-toast-stack',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n template: `\r\n <div [class]=\"stackClass()\">\r\n @for (entry of entries(); track entry.id) {\r\n <div\r\n [class]=\"toastClass(entry.variant)\"\r\n role=\"group\"\r\n [attr.aria-label]=\"entry.config.title ?? entry.config.message\"\r\n >\r\n @if (iconFor(entry); as name) {\r\n <span class=\"mt-tx-0-5 flex shrink-0 text-tx-text-inverse\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'md' }\" />\r\n </span>\r\n }\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n @if (entry.config.title; as title) {\r\n <p class=\"text-tx-base font-semibold leading-tx-snug\">{{ title }}</p>\r\n }\r\n <p class=\"text-tx-base leading-tx-snug\">{{ entry.config.message }}</p>\r\n </div>\r\n\r\n @if (entry.config.actionLabel; as label) {\r\n <button\r\n type=\"button\"\r\n class=\"shrink-0 cursor-pointer rounded-tx-xs border border-tx-border-inverse\r\n px-tx-2 py-tx-0-5 text-tx-sm font-medium text-tx-text-inverse\r\n transition-colors hover:bg-white/15 focus-visible:bg-white/15\"\r\n (click)=\"entry.fireAction()\"\r\n >\r\n {{ label }}\r\n </button>\r\n }\r\n\r\n @if (entry.config.dismissible !== false) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-grid shrink-0 cursor-pointer place-items-center rounded-tx-xs\r\n p-tx-0-5 text-tx-text-inverse opacity-70 transition-opacity\r\n hover:opacity-100 focus-visible:opacity-100\"\r\n aria-label=\"Dismiss notification\"\r\n (click)=\"entry.close('dismissed')\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TxToastStackComponent {\r\n readonly entries = signal<ToastEntry[]>([]);\r\n readonly position = signal<TxToastPosition>('bottom-center');\r\n\r\n protected readonly stackClass = computed(() =>\r\n [\r\n 'pointer-events-none flex w-screen flex-col gap-tx-2 p-tx-4',\r\n 'max-w-[min(28rem,100vw)]',\r\n POSITION_CLASSES[this.position()],\r\n this.position().startsWith('bottom') ? 'flex-col-reverse' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected iconFor(entry: ToastEntry): string | null {\r\n const icon = entry.config.icon;\r\n if (icon === null) {\r\n return null;\r\n }\r\n return icon ?? DEFAULT_ICONS[entry.variant];\r\n }\r\n\r\n protected toastClass(variant: TxToastVariant): string {\r\n return [\r\n 'pointer-events-auto flex w-full items-start gap-tx-2-5 rounded-tx-sm',\r\n 'border-l-4 bg-tx-surface-inverse px-tx-3 py-tx-2-5',\r\n 'text-tx-text-inverse shadow-tx-lg',\r\n ACCENT[variant],\r\n ].join(' ');\r\n }\r\n}\r\n\r\n/**\r\n * Shows transient notifications.\r\n *\r\n * Aria has no toaster, so this is a CDK global overlay plus the CDK's\r\n * `LiveAnnouncer`. The announcement matters: a toast that only appears visually\r\n * is invisible to a screen-reader user, and `danger` toasts are announced\r\n * assertively while the rest are polite.\r\n *\r\n * Behaviour never lives in the config object — `show()` returns a\r\n * {@link TxToastRef} whose `action` and `closed` promises are how a caller\r\n * responds.\r\n *\r\n * @example\r\n * ```ts\r\n * const toast = inject(TxToastService);\r\n *\r\n * toast.success('Report saved');\r\n *\r\n * const ref = toast.show({ message: 'Report deleted', actionLabel: 'Undo' });\r\n * ref.action.then(() => this.restore());\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class TxToastService {\r\n private readonly injector = inject(Injector);\r\n private readonly announcer = inject(LiveAnnouncer);\r\n\r\n private overlayRef: OverlayRef | null = null;\r\n private stack: TxToastStackComponent | null = null;\r\n private settings: Required<TxToastServiceConfig> = {\r\n position: 'bottom-center',\r\n max: 4,\r\n duration: 5000,\r\n };\r\n\r\n /** Sets stack position, capacity and default duration for the whole app. */\r\n configure(config: TxToastServiceConfig): void {\r\n this.settings = { ...this.settings, ...config };\r\n this.stack?.position.set(this.settings.position);\r\n this.applyPosition();\r\n }\r\n\r\n /** Shows a toast. */\r\n show(config: TxToastConfig): TxToastRef {\r\n const stack = this.ensureStack();\r\n const variant = config.variant ?? 'info';\r\n const id = txUniqueId('toast');\r\n\r\n let resolveClosed!: (reason: TxToastCloseReason) => void;\r\n const closed = new Promise<TxToastCloseReason>((resolve) => (resolveClosed = resolve));\r\n let resolveAction!: () => void;\r\n const action = new Promise<void>((resolve) => (resolveAction = resolve));\r\n\r\n const entry: ToastEntry = {\r\n id,\r\n config,\r\n variant,\r\n timer: null,\r\n close: (reason) => this.remove(id, reason, resolveClosed),\r\n fireAction: () => {\r\n resolveAction();\r\n this.remove(id, 'action', resolveClosed);\r\n },\r\n };\r\n\r\n // An error that vanishes on its own is an error missed, so danger toasts\r\n // stay until dismissed unless a duration is given explicitly.\r\n const duration =\r\n config.duration ?? (variant === 'danger' ? 0 : this.settings.duration);\r\n if (duration > 0) {\r\n entry.timer = setTimeout(() => entry.close('timeout'), duration);\r\n }\r\n\r\n const next = [...stack.entries(), entry];\r\n // Drop the oldest rather than letting the stack grow off-screen.\r\n while (next.length > this.settings.max) {\r\n const dropped = next.shift();\r\n if (dropped?.timer) {\r\n clearTimeout(dropped.timer);\r\n }\r\n dropped?.close('cleared');\r\n }\r\n stack.entries.set(next);\r\n\r\n this.announcer.announce(\r\n [config.title, config.message].filter(Boolean).join('. '),\r\n variant === 'danger' ? 'assertive' : 'polite',\r\n );\r\n\r\n return { id, closed, action, dismiss: () => entry.close('dismissed') };\r\n }\r\n\r\n /** Shorthand for an informational toast. */\r\n info(message: string, config: Omit<TxToastConfig, 'message' | 'variant'> = {}): TxToastRef {\r\n return this.show({ ...config, message, variant: 'info' });\r\n }\r\n\r\n /** Shorthand for a success toast. */\r\n success(message: string, config: Omit<TxToastConfig, 'message' | 'variant'> = {}): TxToastRef {\r\n return this.show({ ...config, message, variant: 'success' });\r\n }\r\n\r\n /** Shorthand for a warning toast. */\r\n warning(message: string, config: Omit<TxToastConfig, 'message' | 'variant'> = {}): TxToastRef {\r\n return this.show({ ...config, message, variant: 'warning' });\r\n }\r\n\r\n /** Shorthand for an error toast. Stays until dismissed by default. */\r\n danger(message: string, config: Omit<TxToastConfig, 'message' | 'variant'> = {}): TxToastRef {\r\n return this.show({ ...config, message, variant: 'danger' });\r\n }\r\n\r\n /** Removes every toast on screen. */\r\n clear(): void {\r\n const stack = this.stack;\r\n if (!stack) {\r\n return;\r\n }\r\n for (const entry of stack.entries()) {\r\n if (entry.timer) {\r\n clearTimeout(entry.timer);\r\n }\r\n entry.close('cleared');\r\n }\r\n stack.entries.set([]);\r\n }\r\n\r\n private remove(\r\n id: string,\r\n reason: TxToastCloseReason,\r\n resolveClosed: (reason: TxToastCloseReason) => void,\r\n ): void {\r\n const stack = this.stack;\r\n if (!stack) {\r\n return;\r\n }\r\n const entry = stack.entries().find((candidate) => candidate.id === id);\r\n if (entry?.timer) {\r\n clearTimeout(entry.timer);\r\n }\r\n stack.entries.set(stack.entries().filter((candidate) => candidate.id !== id));\r\n resolveClosed(reason);\r\n }\r\n\r\n private ensureStack(): TxToastStackComponent {\r\n if (this.stack) {\r\n return this.stack;\r\n }\r\n\r\n this.overlayRef = createOverlayRef(this.injector, {\r\n positionStrategy: createGlobalPositionStrategy(this.injector),\r\n // The pane must not swallow clicks over the rest of the page; each toast\r\n // re-enables pointer events for itself.\r\n panelClass: 'tx-toast-pane',\r\n hasBackdrop: false,\r\n });\r\n\r\n const ref = this.overlayRef.attach(new ComponentPortal(TxToastStackComponent));\r\n this.stack = ref.instance;\r\n this.stack.position.set(this.settings.position);\r\n this.applyPosition();\r\n return this.stack;\r\n }\r\n\r\n private applyPosition(): void {\r\n const overlayRef = this.overlayRef;\r\n if (!overlayRef) {\r\n return;\r\n }\r\n const strategy = createGlobalPositionStrategy(this.injector);\r\n const position = this.settings.position;\r\n\r\n if (position.startsWith('top')) {\r\n strategy.top();\r\n } else {\r\n strategy.bottom();\r\n }\r\n if (position.endsWith('start')) {\r\n strategy.left();\r\n } else if (position.endsWith('end')) {\r\n strategy.right();\r\n } else {\r\n strategy.centerHorizontally();\r\n }\r\n\r\n overlayRef.updatePositionStrategy(strategy);\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Width of the dialog. */\r\nexport type TxDialogSize = 'sm' | 'md' | 'lg' | 'full';\r\n\r\n/** Tone of the header icon, for a dialog that carries consequence. */\r\nexport type TxDialogTone = 'default' | 'info' | 'warning' | 'danger';\r\n\r\n/** Simple property configuration for {@link TxDialogComponent}. */\r\nexport interface TxDialogConfig {\r\n /** Genuinely required: it names the dialog for assistive technology. */\r\n title: string;\r\n /** Secondary line under the title. */\r\n description?: string;\r\n /** Defaults to `md`. */\r\n size?: TxDialogSize;\r\n /** Defaults to `default`. */\r\n tone?: TxDialogTone;\r\n /** Registered icon name shown beside the title. */\r\n icon?: string;\r\n /** Shows the header close button. Defaults to true. */\r\n dismissible?: boolean;\r\n}\r\n\r\nexport const TX_DIALOG_DEFAULTS = {\r\n size: 'md',\r\n tone: 'default',\r\n dismissible: true,\r\n} as const satisfies Partial<TxDialogConfig>;\r\n\r\nconst SIZE_CLASSES: Record<TxDialogSize, string> = {\r\n sm: 'max-w-[24rem]',\r\n md: 'max-w-[32rem]',\r\n lg: 'max-w-[48rem]',\r\n full: 'max-w-[min(64rem,100%)]',\r\n};\r\n\r\nconst TONE_CLASSES: Record<TxDialogTone, string> = {\r\n default: 'text-tx-text-subtle',\r\n info: 'text-tx-info-text',\r\n warning: 'text-tx-warning-text',\r\n danger: 'text-tx-danger-text',\r\n};\r\n\r\n/**\r\n * The chrome of a dialog: header, scrolling body and footer.\r\n *\r\n * Put this inside the component you open with {@link TxDialogService}; it does\r\n * not open anything itself. The body is projected, and the footer is a named\r\n * slot, so a dialog can hold anything without this component knowing about it.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-dialog [config]=\"{ title: 'Edit report', description: 'R-1042' }\"\r\n * (dismissed)=\"ref.close()\">\r\n * <tx-form-field [config]=\"{ label: 'Summary' }\">…</tx-form-field>\r\n *\r\n * <ng-container txDialogFooter>\r\n * <tx-button [config]=\"{ label: 'Cancel', variant: 'secondary' }\" (clicked)=\"ref.close()\" />\r\n * <tx-button [config]=\"{ label: 'Save', variant: 'primary' }\" (clicked)=\"save()\" />\r\n * </ng-container>\r\n * </tx-dialog>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-dialog',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { class: 'block' },\r\n template: `\r\n <div [class]=\"rootClass()\">\r\n <header class=\"flex items-start gap-tx-3 border-b border-tx-border px-tx-4 py-tx-3\">\r\n @if (config().icon; as name) {\r\n <span [class]=\"iconClass()\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'lg' }\" />\r\n </span>\r\n }\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <!--\r\n The id here is what TxDialogService points aria-labelledby at, so the\r\n dialog is named by its visible title rather than by a duplicate\r\n aria-label that can drift out of step with it.\r\n -->\r\n <h2 id=\"tx-dialog-title\" class=\"text-tx-xl leading-tx-snug\">{{ config().title }}</h2>\r\n @if (config().description; as text) {\r\n <p id=\"tx-dialog-description\" class=\"mt-tx-1 text-tx-base text-tx-text-muted\">\r\n {{ text }}\r\n </p>\r\n }\r\n </div>\r\n\r\n @if (isDismissible()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-grid shrink-0 cursor-pointer place-items-center rounded-tx-xs p-tx-1\r\n text-tx-text-subtle transition-colors hover:bg-tx-hover-fill\r\n hover:text-tx-text-primary focus-visible:bg-tx-hover-fill\r\n focus-visible:text-tx-text-primary\"\r\n aria-label=\"Close dialog\"\r\n (click)=\"dismissed.emit()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'md' }\" />\r\n </button>\r\n }\r\n </header>\r\n\r\n <div class=\"min-h-0 flex-1 overflow-y-auto px-tx-4 py-tx-4\">\r\n <ng-content />\r\n </div>\r\n\r\n <footer\r\n class=\"flex flex-wrap items-center justify-end gap-tx-2 border-t border-tx-border\r\n px-tx-4 py-tx-3 empty:hidden\"\r\n >\r\n <ng-content select=\"[txDialogFooter]\" />\r\n </footer>\r\n </div>\r\n `,\r\n})\r\nexport class TxDialogComponent {\r\n readonly config = input.required<TxDialogConfig>();\r\n\r\n /** The header close button was used. The opener owns closing. */\r\n readonly dismissed = output<void>();\r\n\r\n private readonly resolved = computed<TxDialogConfig>(() =>\r\n txMergeConfig(TX_DIALOG_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly isDismissible = computed(() => this.resolved().dismissible !== false);\r\n\r\n protected readonly rootClass = computed(() =>\r\n [\r\n 'flex max-h-[88vh] w-full flex-col overflow-hidden rounded-tx-lg',\r\n 'bg-tx-surface-raised shadow-tx-lg',\r\n SIZE_CLASSES[this.resolved().size ?? 'md'],\r\n ].join(' '),\r\n );\r\n\r\n protected readonly iconClass = computed(() =>\r\n ['mt-tx-0-5 flex shrink-0', TONE_CLASSES[this.resolved().tone ?? 'default']].join(' '),\r\n );\r\n}\r\n","import { Dialog, DialogConfig, DialogRef } from '@angular/cdk/dialog';\r\nimport { ComponentType } from '@angular/cdk/portal';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Injectable,\r\n computed,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { TxButtonComponent } from '../button/button.component';\r\nimport { TxButtonVariant } from '../button/button.types';\r\nimport { TxDialogComponent, TxDialogConfig, TxDialogSize, TxDialogTone } from './dialog.component';\r\n\r\n/** Options for opening any dialog. */\r\nexport interface TxDialogOpenConfig<D = unknown> {\r\n /** Data injected into the dialog component via `DIALOG_DATA`. */\r\n data?: D;\r\n /** Defaults to `md`. Only used for the backdrop/panel sizing hints. */\r\n size?: TxDialogSize;\r\n /** Clicking the backdrop or pressing Escape closes. Defaults to true. */\r\n dismissible?: boolean;\r\n /** Extra classes for the overlay pane. */\r\n panelClass?: string | string[];\r\n /** Accessible name, when the dialog does not render a TxDialogComponent. */\r\n ariaLabel?: string;\r\n}\r\n\r\n/** Simple property configuration for a confirmation dialog. */\r\nexport interface TxConfirmDialogConfig {\r\n /** Genuinely required: it names the dialog. */\r\n title: string;\r\n /** The question or consequence. */\r\n message: string;\r\n /** Defaults to `Confirm`. */\r\n confirmLabel?: string;\r\n /** Defaults to `Cancel`. */\r\n cancelLabel?: string;\r\n /**\r\n * Visual weight of the confirm button. Defaults to `primary`, or `danger`\r\n * when `tone` is `danger` — so a destructive confirmation looks destructive\r\n * without the caller having to say it twice.\r\n */\r\n confirmVariant?: TxButtonVariant;\r\n /** Defaults to `warning`. */\r\n tone?: TxDialogTone;\r\n /** Registered icon name. Defaults to the tone's icon. */\r\n icon?: string;\r\n /** Defaults to `sm`. */\r\n size?: TxDialogSize;\r\n}\r\n\r\nconst TONE_ICONS: Record<TxDialogTone, string> = {\r\n default: 'help-circle',\r\n info: 'info',\r\n warning: 'alert-triangle',\r\n danger: 'alert-circle',\r\n};\r\n\r\n/** The built-in confirmation dialog body. */\r\n@Component({\r\n selector: 'tx-confirm-dialog',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxDialogComponent, TxButtonComponent],\r\n template: `\r\n <tx-dialog [config]=\"dialogConfig()\" (dismissed)=\"close(false)\">\r\n <p class=\"text-tx-base leading-tx-normal text-tx-text-primary\">{{ config().message }}</p>\r\n\r\n <ng-container txDialogFooter>\r\n <tx-button\r\n [config]=\"{ label: config().cancelLabel ?? 'Cancel', variant: 'secondary' }\"\r\n (clicked)=\"close(false)\"\r\n />\r\n <tx-button\r\n [config]=\"{ label: config().confirmLabel ?? 'Confirm', variant: confirmVariant() }\"\r\n (clicked)=\"close(true)\"\r\n />\r\n </ng-container>\r\n </tx-dialog>\r\n `,\r\n})\r\nexport class TxConfirmDialogComponent {\r\n private readonly ref = inject<DialogRef<boolean>>(DialogRef);\r\n\r\n readonly config = signal<TxConfirmDialogConfig>({ title: '', message: '' });\r\n\r\n protected readonly dialogConfig = computed<TxDialogConfig>(() => {\r\n const config = this.config();\r\n const tone = config.tone ?? 'warning';\r\n return {\r\n title: config.title,\r\n size: config.size ?? 'sm',\r\n tone,\r\n icon: config.icon ?? TONE_ICONS[tone],\r\n dismissible: true,\r\n };\r\n });\r\n\r\n protected readonly confirmVariant = computed<TxButtonVariant>(() => {\r\n const config = this.config();\r\n if (config.confirmVariant) {\r\n return config.confirmVariant;\r\n }\r\n return (config.tone ?? 'warning') === 'danger' ? 'danger' : 'primary';\r\n });\r\n\r\n protected close(result: boolean): void {\r\n this.ref.close(result);\r\n }\r\n}\r\n\r\n/**\r\n * Opens dialogs.\r\n *\r\n * Wraps `@angular/cdk/dialog`, which provides the overlay, the focus trap,\r\n * focus restoration on close, and the `Escape` handling. This adds the kit's\r\n * sizing, the scrim token, and a ready-made confirmation.\r\n *\r\n * @example\r\n * ```ts\r\n * const dialogs = inject(TxDialogService);\r\n *\r\n * // A custom dialog component\r\n * const ref = dialogs.open(EditReportDialog, { data: { id: 'R-1042' }, size: 'lg' });\r\n * ref.closed.subscribe((result) => …);\r\n *\r\n * // The built-in confirmation\r\n * if (await dialogs.confirm({\r\n * title: 'Delete report?',\r\n * message: 'This cannot be undone.',\r\n * tone: 'danger',\r\n * confirmLabel: 'Delete',\r\n * })) {\r\n * this.remove();\r\n * }\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class TxDialogService {\r\n private readonly dialog = inject(Dialog);\r\n\r\n /** Opens a component as a dialog. */\r\n open<T, D = unknown, R = unknown>(\r\n component: ComponentType<T>,\r\n config: TxDialogOpenConfig<D> = {},\r\n ): DialogRef<R, T> {\r\n const dismissible = config.dismissible !== false;\r\n\r\n const dialogConfig: DialogConfig<D, DialogRef<R, T>> = {\r\n data: config.data,\r\n disableClose: !dismissible,\r\n hasBackdrop: true,\r\n backdropClass: ['cdk-overlay-dark-backdrop'],\r\n // CDK leaves this false by default. Everything opened here is modal —\r\n // it has a backdrop and a focus trap — so the attribute should say so,\r\n // or a screen reader will still offer the page behind it.\r\n ariaModal: true,\r\n panelClass: ['tx-dialog-pane', ...toArray(config.panelClass)],\r\n // TxDialogComponent renders these ids on its title and description, so\r\n // the dialog is named by what the user can see.\r\n ariaLabelledBy: config.ariaLabel ? undefined : 'tx-dialog-title',\r\n ariaLabel: config.ariaLabel,\r\n ariaDescribedBy: 'tx-dialog-description',\r\n autoFocus: 'first-tabbable',\r\n restoreFocus: true,\r\n };\r\n\r\n return this.dialog.open<R, D, T>(component, dialogConfig);\r\n }\r\n\r\n /**\r\n * Opens a confirmation and resolves to the user's answer.\r\n *\r\n * Resolves `false` when dismissed by Escape or the backdrop, so a caller can\r\n * treat \"closed without answering\" and \"declined\" the same way.\r\n */\r\n async confirm(config: TxConfirmDialogConfig): Promise<boolean> {\r\n const ref = this.open<TxConfirmDialogComponent, undefined, boolean>(\r\n TxConfirmDialogComponent,\r\n { size: config.size ?? 'sm' },\r\n );\r\n ref.componentInstance?.config.set(config);\r\n\r\n const result = await new Promise<boolean | undefined>((resolve) => {\r\n ref.closed.subscribe((value) => resolve(value));\r\n });\r\n return result === true;\r\n }\r\n\r\n /** Closes every open dialog. */\r\n closeAll(): void {\r\n this.dialog.closeAll();\r\n }\r\n}\r\n\r\nfunction toArray(value: string | string[] | undefined): string[] {\r\n if (!value) {\r\n return [];\r\n }\r\n return Array.isArray(value) ? value : [value];\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Semantic colour of a badge. */\r\nexport type TxBadgeVariant =\r\n | 'neutral'\r\n | 'primary'\r\n | 'accent'\r\n | 'info'\r\n | 'success'\r\n | 'warning'\r\n | 'danger';\r\n\r\n/** How the badge is filled. */\r\nexport type TxBadgeAppearance = 'subtle' | 'solid' | 'outline';\r\n\r\n/** Simple property configuration for {@link TxBadgeComponent}. */\r\nexport interface TxBadgeConfig {\r\n /** Genuinely required: a badge with no text is decoration, not information. */\r\n label: string;\r\n /** Defaults to `neutral`. */\r\n variant?: TxBadgeVariant;\r\n /** Defaults to `subtle`. */\r\n appearance?: TxBadgeAppearance;\r\n /** Defaults to `md`. */\r\n size?: 'sm' | 'md';\r\n /** Registered icon name shown before the label. */\r\n icon?: string;\r\n /** Small filled circle before the label, for a status pip. */\r\n dot?: boolean;\r\n /** Strikes the label through, for a retired or superseded item. */\r\n struck?: boolean;\r\n /** Shows a remove button and enables the `removed` output. */\r\n removable?: boolean;\r\n}\r\n\r\nexport const TX_BADGE_DEFAULTS = {\r\n variant: 'neutral',\r\n appearance: 'subtle',\r\n size: 'md',\r\n} as const satisfies Partial<TxBadgeConfig>;\r\n\r\nconst SUBTLE: Record<TxBadgeVariant, string> = {\r\n neutral: 'border-tx-border bg-tx-surface-sunken text-tx-text-muted',\r\n primary: 'border-tx-primary-border bg-tx-primary-subtle text-tx-primary-text',\r\n accent: 'border-tx-accent-border bg-tx-accent-subtle text-tx-accent-text',\r\n info: 'border-tx-info-border bg-tx-info-subtle text-tx-info-text',\r\n success: 'border-tx-success-border bg-tx-success-subtle text-tx-success-text',\r\n warning: 'border-tx-warning-border bg-tx-warning-subtle text-tx-warning-text',\r\n danger: 'border-tx-danger-border bg-tx-danger-subtle text-tx-danger-text',\r\n};\r\n\r\nconst SOLID: Record<TxBadgeVariant, string> = {\r\n neutral: 'border-transparent bg-tx-text-muted text-tx-text-inverse',\r\n primary: 'border-transparent bg-tx-primary text-tx-text-on-primary',\r\n accent: 'border-transparent bg-tx-accent text-tx-text-on-accent',\r\n info: 'border-transparent bg-tx-info text-tx-text-inverse',\r\n success: 'border-transparent bg-tx-success-hover text-tx-text-inverse',\r\n warning: 'border-transparent bg-tx-warning-hover text-tx-text-inverse',\r\n danger: 'border-transparent bg-tx-danger text-tx-text-on-danger',\r\n};\r\n\r\nconst OUTLINE: Record<TxBadgeVariant, string> = {\r\n neutral: 'border-tx-border bg-transparent text-tx-text-muted',\r\n primary: 'border-tx-primary bg-transparent text-tx-primary-text',\r\n accent: 'border-tx-accent bg-transparent text-tx-accent-text',\r\n info: 'border-tx-info bg-transparent text-tx-info-text',\r\n success: 'border-tx-success bg-transparent text-tx-success-text',\r\n warning: 'border-tx-warning bg-transparent text-tx-warning-text',\r\n danger: 'border-tx-danger bg-transparent text-tx-danger-text',\r\n};\r\n\r\nconst DOT: Record<TxBadgeVariant, string> = {\r\n neutral: 'bg-tx-text-muted',\r\n primary: 'bg-tx-primary',\r\n accent: 'bg-tx-accent',\r\n info: 'bg-tx-info',\r\n success: 'bg-tx-success',\r\n warning: 'bg-tx-warning',\r\n danger: 'bg-tx-danger',\r\n};\r\n\r\n/**\r\n * A small status pill or tag.\r\n *\r\n * Rendered in the mono face at the smallest type step, matching the reference\r\n * design's treatment for statuses, counts and part classifications.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-badge [config]=\"{ label: 'critical', variant: 'danger' }\" />\r\n * <tx-badge [config]=\"{ label: 'Gearbox', removable: true }\" (removed)=\"drop()\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-badge',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { class: 'inline-flex max-w-full align-middle' },\r\n template: `\r\n <span [class]=\"rootClass()\">\r\n @if (config().dot) {\r\n <span [class]=\"dotClass()\" aria-hidden=\"true\"></span>\r\n }\r\n @if (config().icon; as name) {\r\n <span class=\"flex shrink-0\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n </span>\r\n }\r\n\r\n <span [class]=\"labelClass()\">{{ config().label }}</span>\r\n\r\n @if (config().removable) {\r\n <button\r\n type=\"button\"\r\n [class]=\"removeClass()\"\r\n [attr.aria-label]=\"'Remove ' + config().label\"\r\n (click)=\"removed.emit()\"\r\n >\r\n <tx-icon [config]=\"{ name: 'close', size: 'sm' }\" />\r\n </button>\r\n }\r\n </span>\r\n `,\r\n})\r\nexport class TxBadgeComponent {\r\n readonly config = input.required<TxBadgeConfig>();\r\n\r\n /** Emitted by the remove button. The parent owns the list. */\r\n readonly removed = output<void>();\r\n\r\n private readonly resolved = computed<TxBadgeConfig>(() =>\r\n txMergeConfig(TX_BADGE_DEFAULTS, this.config()),\r\n );\r\n\r\n private readonly variant = computed(() => this.resolved().variant ?? 'neutral');\r\n\r\n protected readonly rootClass = computed(() => {\r\n const { appearance, size, removable } = this.resolved();\r\n const tone =\r\n appearance === 'solid'\r\n ? SOLID[this.variant()]\r\n : appearance === 'outline'\r\n ? OUTLINE[this.variant()]\r\n : SUBTLE[this.variant()];\r\n return [\r\n 'inline-flex min-w-0 items-center gap-tx-1-5 rounded-tx-full border',\r\n 'font-tx-mono whitespace-nowrap',\r\n size === 'sm' ? 'py-0 text-tx-2xs' : 'py-tx-0-5 text-tx-2xs',\r\n // Tighter trailing padding when a remove button sits inside.\r\n removable ? 'pr-tx-1 pl-tx-2' : 'px-tx-2',\r\n tone,\r\n ].join(' ');\r\n });\r\n\r\n protected readonly labelClass = computed(() =>\r\n ['truncate', this.resolved().struck ? 'line-through' : ''].filter(Boolean).join(' '),\r\n );\r\n\r\n protected readonly dotClass = computed(() =>\r\n ['size-tx-1-5 shrink-0 rounded-tx-full', DOT[this.variant()]].join(' '),\r\n );\r\n\r\n protected readonly removeClass = computed(() =>\r\n [\r\n 'inline-grid size-tx-4 shrink-0 cursor-pointer place-items-center rounded-tx-full',\r\n 'transition-colors',\r\n this.resolved().appearance === 'solid'\r\n ? 'hover:bg-white/25 focus-visible:bg-white/25'\r\n : 'hover:bg-tx-danger hover:text-tx-text-on-danger ' +\r\n 'focus-visible:bg-tx-danger focus-visible:text-tx-text-on-danger',\r\n ].join(' '),\r\n );\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * Visual treatment of the rule.\r\n *\r\n * `groove` is the reference design's one ornament — a diagonal tread band. It\r\n * is the brand's signature, so it ships as a divider variant rather than being\r\n * re-cut by hand wherever it is wanted.\r\n */\r\nexport type TxDividerVariant = 'line' | 'subtle' | 'groove';\r\n\r\n/** Simple property configuration for {@link TxDividerComponent}. */\r\nexport interface TxDividerConfig {\r\n /** Defaults to `horizontal`. */\r\n orientation?: 'horizontal' | 'vertical';\r\n /** Defaults to `line`. */\r\n variant?: TxDividerVariant;\r\n /** Text set into the rule. Horizontal only; ignored by `groove`. */\r\n label?: string;\r\n /** Where the label sits. Defaults to `center`. */\r\n labelPosition?: 'start' | 'center' | 'end';\r\n /** Vertical margin around the rule. Defaults to `md`. */\r\n spacing?: 'none' | 'sm' | 'md' | 'lg';\r\n}\r\n\r\nexport const TX_DIVIDER_DEFAULTS = {\r\n orientation: 'horizontal',\r\n variant: 'line',\r\n labelPosition: 'center',\r\n spacing: 'md',\r\n} as const satisfies Partial<TxDividerConfig>;\r\n\r\nconst SPACING: Record<'none' | 'sm' | 'md' | 'lg', string> = {\r\n none: 'my-0',\r\n sm: 'my-tx-2',\r\n md: 'my-tx-4',\r\n lg: 'my-tx-6',\r\n};\r\n\r\nconst VERTICAL_SPACING: Record<'none' | 'sm' | 'md' | 'lg', string> = {\r\n none: 'mx-0',\r\n sm: 'mx-tx-2',\r\n md: 'mx-tx-3',\r\n lg: 'mx-tx-4',\r\n};\r\n\r\n/**\r\n * A rule between sections.\r\n *\r\n * `separator` role only when it carries no label; a labelled divider is a\r\n * heading in disguise and is announced as its text instead.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-divider />\r\n * <tx-divider [config]=\"{ label: 'Failed parts' }\" />\r\n * <tx-divider [config]=\"{ variant: 'groove', spacing: 'none' }\" />\r\n * <tx-divider [config]=\"{ orientation: 'vertical', spacing: 'sm' }\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-divider',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class]': 'hostClass()',\r\n '[attr.role]': 'label() ? null : \"separator\"',\r\n '[attr.aria-orientation]': 'label() ? null : orientation()',\r\n },\r\n template: `\r\n @if (variant() === 'groove') {\r\n <span [class]=\"grooveClass\" aria-hidden=\"true\"></span>\r\n } @else if (label(); as text) {\r\n <span class=\"flex w-full items-center gap-tx-3\">\r\n @if (labelPosition() !== 'start') {\r\n <span [class]=\"ruleClass()\"></span>\r\n }\r\n <span\r\n class=\"shrink-0 font-tx-mono text-tx-2xs tracking-tx-widest uppercase\r\n text-tx-text-subtle\"\r\n >{{ text }}</span\r\n >\r\n @if (labelPosition() !== 'end') {\r\n <span [class]=\"ruleClass()\"></span>\r\n }\r\n </span>\r\n } @else {\r\n <span [class]=\"ruleClass()\" aria-hidden=\"true\"></span>\r\n }\r\n `,\r\n})\r\nexport class TxDividerComponent {\r\n readonly config = input<Partial<TxDividerConfig>>({});\r\n\r\n private readonly resolved = computed<TxDividerConfig>(() =>\r\n txMergeConfig(TX_DIVIDER_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly label = computed(() =>\r\n this.resolved().orientation === 'vertical' ? null : (this.resolved().label ?? null),\r\n );\r\n protected readonly orientation = computed(() => this.resolved().orientation);\r\n protected readonly variant = computed(() => this.resolved().variant);\r\n protected readonly labelPosition = computed(() => this.resolved().labelPosition);\r\n\r\n /**\r\n * The tread band: diagonal brand-coloured strokes over a tinted ground.\r\n * Built from gradients rather than an image so it re-themes with the tokens.\r\n */\r\n protected readonly grooveClass = 'tx-groove';\r\n\r\n protected readonly hostClass = computed(() => {\r\n const { orientation, spacing } = this.resolved();\r\n if (orientation === 'vertical') {\r\n return ['inline-block w-px self-stretch', VERTICAL_SPACING[spacing ?? 'md']].join(' ');\r\n }\r\n return ['block w-full', SPACING[spacing ?? 'md']].join(' ');\r\n });\r\n\r\n protected readonly ruleClass = computed(() => {\r\n const colour = this.resolved().variant === 'subtle' ? 'bg-tx-border-subtle' : 'bg-tx-border';\r\n if (this.resolved().orientation === 'vertical') {\r\n return `block h-full w-px ${colour}`;\r\n }\r\n return `block h-px min-w-0 flex-1 ${colour}`;\r\n });\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Surface treatment of the card. */\r\nexport type TxCardAppearance = 'panel' | 'plain' | 'sunken';\r\n\r\n/** Simple property configuration for {@link TxCardComponent}. */\r\nexport interface TxCardConfig {\r\n /** Heading. Rendered in the reference design's uppercase panel-header style. */\r\n title?: string;\r\n /** Secondary line under the title. */\r\n description?: string;\r\n /** Registered icon name shown before the title. */\r\n icon?: string;\r\n /** Defaults to `panel`. */\r\n appearance?: TxCardAppearance;\r\n /** Body padding. Defaults to `md`. `none` suits a table or list body. */\r\n padding?: 'none' | 'sm' | 'md' | 'lg';\r\n /** Adds a chevron that collapses the body. */\r\n collapsible?: boolean;\r\n /** Short muted text beside the title, e.g. the current selection. */\r\n summary?: string;\r\n /**\r\n * Leading accent bar in a semantic colour, matching the reference design's\r\n * failed-part card.\r\n */\r\n accent?: 'none' | 'primary' | 'danger' | 'warning' | 'info';\r\n}\r\n\r\nexport const TX_CARD_DEFAULTS = {\r\n appearance: 'panel',\r\n padding: 'md',\r\n accent: 'none',\r\n} as const satisfies Partial<TxCardConfig>;\r\n\r\nconst PADDING: Record<'none' | 'sm' | 'md' | 'lg', string> = {\r\n none: 'p-0',\r\n sm: 'p-tx-3',\r\n md: 'p-tx-4',\r\n lg: 'p-tx-5',\r\n};\r\n\r\nconst ACCENT: Record<string, string> = {\r\n none: '',\r\n primary: 'border-l-4 border-l-tx-primary',\r\n danger: 'border-l-4 border-l-tx-danger',\r\n warning: 'border-l-4 border-l-tx-warning',\r\n info: 'border-l-4 border-l-tx-info',\r\n};\r\n\r\n/**\r\n * A bordered panel with an optional header, and slots for header actions and a\r\n * footer.\r\n *\r\n * The header's action slot is a projected `[txCardActions]`, not a config\r\n * field, so a panel header can carry arbitrary buttons — which is exactly the\r\n * case config could never cover.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-card [config]=\"{ title: 'Failed parts', collapsible: true }\">\r\n * <ng-container txCardActions>\r\n * <tx-button [config]=\"{ label: 'Add', icon: 'plus', size: 'sm' }\" />\r\n * </ng-container>\r\n *\r\n * <p>Body</p>\r\n *\r\n * <ng-container txCardFooter>\r\n * <tx-button [config]=\"{ label: 'Save', variant: 'primary' }\" />\r\n * </ng-container>\r\n * </tx-card>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-card',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n <section [class]=\"rootClass()\">\r\n @if (hasHeader()) {\r\n <header [class]=\"headerClass()\">\r\n @if (config().collapsible) {\r\n <button\r\n type=\"button\"\r\n class=\"group inline-grid size-tx-icon-md shrink-0 cursor-pointer place-items-center\r\n rounded-tx-xs text-tx-text-muted transition-colors\r\n hover:bg-tx-hover-fill hover:text-tx-text-heading\r\n focus-visible:bg-tx-hover-fill focus-visible:text-tx-text-heading\"\r\n [attr.aria-expanded]=\"expanded()\"\r\n [attr.aria-label]=\"(expanded() ? 'Collapse ' : 'Expand ') + (config().title ?? 'section')\"\r\n (click)=\"toggle()\"\r\n >\r\n <!-- Rotation reads the button's own aria-expanded, not a mirrored flag. -->\r\n <span\r\n class=\"flex -rotate-90 transition-transform duration-150 ease-tx-standard\r\n group-aria-expanded:rotate-0\"\r\n >\r\n <tx-icon [config]=\"{ name: 'chevron-down', size: 'sm' }\" />\r\n </span>\r\n </button>\r\n }\r\n\r\n @if (config().icon; as name) {\r\n <span class=\"flex shrink-0 text-tx-text-subtle\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'md' }\" />\r\n </span>\r\n }\r\n\r\n <div class=\"min-w-0\">\r\n @if (config().title; as title) {\r\n <h3\r\n class=\"truncate text-tx-base font-semibold tracking-tx-wider uppercase\r\n text-tx-text-heading\"\r\n >\r\n {{ title }}\r\n </h3>\r\n }\r\n @if (config().description; as text) {\r\n <p class=\"mt-tx-0-5 truncate text-tx-xs text-tx-text-muted\">{{ text }}</p>\r\n }\r\n </div>\r\n\r\n @if (config().summary; as text) {\r\n <span class=\"max-w-[22ch] truncate text-tx-sm text-tx-text-muted\">{{ text }}</span>\r\n }\r\n\r\n <span class=\"flex-1\"></span>\r\n\r\n <span class=\"flex shrink-0 items-center gap-tx-2\">\r\n <ng-content select=\"[txCardActions]\" />\r\n </span>\r\n </header>\r\n }\r\n\r\n @if (expanded()) {\r\n <div [class]=\"bodyClass()\">\r\n <ng-content />\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-wrap items-center justify-end gap-tx-2 border-t border-tx-border\r\n px-tx-4 py-tx-3 empty:hidden\"\r\n >\r\n <ng-content select=\"[txCardFooter]\" />\r\n </div>\r\n }\r\n </section>\r\n `,\r\n})\r\nexport class TxCardComponent {\r\n readonly config = input<Partial<TxCardConfig>>({});\r\n\r\n /** Whether the body is shown. Two-way, so a page can collapse every card. */\r\n readonly expanded = model(true);\r\n\r\n readonly toggled = output<boolean>();\r\n\r\n private readonly resolved = computed<TxCardConfig>(() =>\r\n txMergeConfig(TX_CARD_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly hasHeader = computed(() => {\r\n const { title, description, icon, collapsible, summary } = this.resolved();\r\n return Boolean(title || description || icon || collapsible || summary);\r\n });\r\n\r\n protected readonly rootClass = computed(() => {\r\n const { appearance, accent } = this.resolved();\r\n const surface =\r\n appearance === 'plain'\r\n ? 'border-transparent bg-transparent shadow-none'\r\n : appearance === 'sunken'\r\n ? 'border-tx-border-subtle bg-tx-surface-sunken shadow-none'\r\n : 'border-tx-border bg-tx-surface shadow-tx-md';\r\n return [\r\n 'flex min-w-0 flex-col overflow-hidden rounded-tx-md border',\r\n surface,\r\n ACCENT[accent ?? 'none'],\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n protected readonly headerClass = computed(() =>\r\n [\r\n 'flex flex-wrap items-center gap-x-tx-2-5 gap-y-tx-1-5 px-tx-4 py-tx-3',\r\n this.expanded() ? 'border-b border-tx-border' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n\r\n protected readonly bodyClass = computed(() =>\r\n ['min-w-0', PADDING[this.resolved().padding ?? 'md']].join(' '),\r\n );\r\n\r\n protected toggle(): void {\r\n const next = !this.expanded();\r\n this.expanded.set(next);\r\n this.toggled.emit(next);\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Simple property configuration for {@link TxEmptyStateComponent}. */\r\nexport interface TxEmptyStateConfig {\r\n /** Genuinely required: an empty state with no message explains nothing. */\r\n title: string;\r\n /** What to do about it. */\r\n description?: string;\r\n /** Registered icon name. Defaults to `inbox`; `null` hides it. */\r\n icon?: string | null;\r\n /** Defaults to `md`. `sm` suits an empty panel body or popup. */\r\n size?: 'sm' | 'md' | 'lg';\r\n /** Defaults to `dashed`. */\r\n appearance?: 'dashed' | 'plain';\r\n}\r\n\r\nexport const TX_EMPTY_STATE_DEFAULTS = {\r\n icon: 'inbox',\r\n size: 'md',\r\n appearance: 'dashed',\r\n} as const satisfies Partial<TxEmptyStateConfig>;\r\n\r\nconst PADDING: Record<'sm' | 'md' | 'lg', string> = {\r\n sm: 'px-tx-4 py-tx-6',\r\n md: 'px-tx-5 py-tx-10',\r\n lg: 'px-tx-6 py-tx-16',\r\n};\r\n\r\nconst TITLE_SIZE: Record<'sm' | 'md' | 'lg', string> = {\r\n sm: 'text-tx-lg',\r\n md: 'text-tx-xl',\r\n lg: 'text-tx-2xl',\r\n};\r\n\r\n/**\r\n * The \"there is nothing here\" panel.\r\n *\r\n * Actions are projected rather than configured, so an empty state can offer\r\n * whatever the situation calls for — a button, a link, a short form.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-empty-state [config]=\"{ title: 'No reports yet',\r\n * description: 'Create one to get started.' }\">\r\n * <tx-button [config]=\"{ label: 'New report', variant: 'primary', icon: 'plus' }\" />\r\n * </tx-empty-state>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-empty-state',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n <div [class]=\"rootClass()\">\r\n @if (iconName(); as name) {\r\n <span class=\"flex text-tx-text-subtle\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'lg' }\" />\r\n </span>\r\n }\r\n\r\n <h3 [class]=\"titleClass()\">{{ config().title }}</h3>\r\n\r\n @if (config().description; as text) {\r\n <p class=\"max-w-[52ch] text-tx-base text-tx-text-muted\">{{ text }}</p>\r\n }\r\n\r\n <div class=\"flex flex-wrap items-center justify-center gap-tx-2 empty:hidden\">\r\n <ng-content />\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class TxEmptyStateComponent {\r\n readonly config = input.required<TxEmptyStateConfig>();\r\n\r\n private readonly resolved = computed<TxEmptyStateConfig>(() =>\r\n txMergeConfig(TX_EMPTY_STATE_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly iconName = computed(() => {\r\n const icon = this.resolved().icon;\r\n return icon === null ? null : (icon ?? 'inbox');\r\n });\r\n\r\n protected readonly rootClass = computed(() => {\r\n const { size, appearance } = this.resolved();\r\n return [\r\n 'flex flex-col items-center gap-tx-3 rounded-tx-md text-center',\r\n PADDING[size ?? 'md'],\r\n appearance === 'plain'\r\n ? 'border-none bg-transparent'\r\n : 'border border-dashed border-tx-border bg-tx-surface',\r\n ].join(' ');\r\n });\r\n\r\n protected readonly titleClass = computed(() =>\r\n [TITLE_SIZE[this.resolved().size ?? 'md'], 'text-tx-text-heading'].join(' '),\r\n );\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * One step in the trail.\r\n *\r\n * Items are data. A crumb navigates by `routerLink` or `href`, or by nothing at\r\n * all — in which case the component emits `selected` and the application\r\n * decides. No callback ever lives on the item.\r\n */\r\nexport interface TxBreadcrumbItem {\r\n label: string;\r\n /** Angular router target. Takes precedence over `href`. */\r\n routerLink?: string | readonly unknown[];\r\n /** Plain link target, for anything outside the router. */\r\n href?: string;\r\n /** Registered icon name shown before the label. */\r\n icon?: string;\r\n}\r\n\r\n/** Simple property configuration for {@link TxBreadcrumbComponent}. */\r\nexport interface TxBreadcrumbConfig {\r\n /** Registered icon name used between crumbs. Defaults to `chevron-right`. */\r\n separator?: string;\r\n /**\r\n * Above this many crumbs the middle ones collapse behind an ellipsis, so a\r\n * deep trail cannot wrap onto three lines. `0` disables collapsing.\r\n * Defaults to 4.\r\n */\r\n maxVisible?: number;\r\n /** Defaults to `md`. */\r\n size?: 'sm' | 'md';\r\n /** Accessible name. Defaults to `Breadcrumb`. */\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_BREADCRUMB_DEFAULTS = {\r\n separator: 'chevron-right',\r\n maxVisible: 4,\r\n size: 'md',\r\n ariaLabel: 'Breadcrumb',\r\n} as const satisfies Partial<TxBreadcrumbConfig>;\r\n\r\n/**\r\n * A crumb, or the ellipsis standing in for the ones that were collapsed.\r\n *\r\n * A nullable `item` rather than a discriminated union: Angular's template type\r\n * checker narrows cleanly through `@if (crumb.item; as item)`, whereas a `kind`\r\n * discriminant does not survive an `@else if` chain.\r\n */\r\ninterface Crumb {\r\n /** `null` for the ellipsis placeholder. */\r\n item: TxBreadcrumbItem | null;\r\n}\r\n\r\n/**\r\n * A trail of ancestor links.\r\n *\r\n * The last crumb is the current page: it is never a link, and carries\r\n * `aria-current=\"page\"`.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-breadcrumb\r\n * [items]=\"[{ label: 'Reports', routerLink: '/reports' }, { label: 'R-1042' }]\" />\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-breadcrumb',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [RouterLink, TxIconComponent],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n <nav [attr.aria-label]=\"config().ariaLabel ?? 'Breadcrumb'\">\r\n <ol [class]=\"listClass()\">\r\n @for (crumb of crumbs(); track $index; let last = $last) {\r\n <li class=\"flex min-w-0 items-center gap-tx-1-5\">\r\n @if (crumb.item; as item) {\r\n @if (last) {\r\n <span [class]=\"currentClass()\" aria-current=\"page\">\r\n @if (item.icon; as name) {\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n }\r\n <span class=\"truncate\">{{ item.label }}</span>\r\n </span>\r\n } @else if (item.routerLink) {\r\n <a [routerLink]=\"item.routerLink\" [class]=\"linkClass()\">\r\n @if (item.icon; as name) {\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n }\r\n <span class=\"truncate\">{{ item.label }}</span>\r\n </a>\r\n } @else if (item.href) {\r\n <a [href]=\"item.href\" [class]=\"linkClass()\">\r\n @if (item.icon; as name) {\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n }\r\n <span class=\"truncate\">{{ item.label }}</span>\r\n </a>\r\n } @else {\r\n <button type=\"button\" [class]=\"linkClass()\" (click)=\"selected.emit(item)\">\r\n @if (item.icon; as name) {\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n }\r\n <span class=\"truncate\">{{ item.label }}</span>\r\n </button>\r\n }\r\n } @else {\r\n <span class=\"px-tx-0-5 text-tx-text-subtle\" aria-hidden=\"true\">…</span>\r\n <span class=\"sr-only\">{{ hiddenCount() }} more levels</span>\r\n }\r\n\r\n @if (!last) {\r\n <span class=\"flex shrink-0 text-tx-text-subtle\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: separator(), size: 'sm' }\" />\r\n </span>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n `,\r\n})\r\nexport class TxBreadcrumbComponent {\r\n readonly config = input<Partial<TxBreadcrumbConfig>>({});\r\n\r\n /** The trail, root first. Data, so it is its own input. */\r\n readonly items = input.required<readonly TxBreadcrumbItem[]>();\r\n\r\n /** Emitted when a crumb with no link target is activated. */\r\n readonly selected = output<TxBreadcrumbItem>();\r\n\r\n private readonly resolved = computed<TxBreadcrumbConfig>(() =>\r\n txMergeConfig(TX_BREADCRUMB_DEFAULTS, this.config()),\r\n );\r\n\r\n // The spread defaults supply this, but the interface still types it optional.\r\n protected readonly separator = computed(\r\n () => this.resolved().separator ?? TX_BREADCRUMB_DEFAULTS.separator,\r\n );\r\n\r\n protected readonly hiddenCount = computed(() => {\r\n const max = this.resolved().maxVisible ?? 4;\r\n const total = this.items().length;\r\n return max > 0 && total > max ? total - (max - 1) : 0;\r\n });\r\n\r\n /** First crumb, an ellipsis, then the tail — so the trail never wraps. */\r\n protected readonly crumbs = computed<Crumb[]>(() => {\r\n const items = this.items();\r\n const max = this.resolved().maxVisible ?? 4;\r\n\r\n if (max <= 0 || items.length <= max) {\r\n return items.map((item) => ({ item }));\r\n }\r\n\r\n const tailCount = max - 2;\r\n return [\r\n { item: items[0] },\r\n { item: null },\r\n ...items.slice(items.length - tailCount).map((item) => ({ item })),\r\n ];\r\n });\r\n\r\n protected readonly listClass = computed(() =>\r\n [\r\n 'flex min-w-0 list-none flex-wrap items-center gap-x-tx-1-5 gap-y-tx-1 p-0',\r\n this.resolved().size === 'sm' ? 'text-tx-sm' : 'text-tx-base',\r\n ].join(' '),\r\n );\r\n\r\n protected readonly linkClass = computed(() =>\r\n [\r\n 'flex min-w-0 cursor-pointer items-center gap-tx-1-5 rounded-tx-xs',\r\n 'text-tx-text-muted no-underline transition-colors',\r\n 'hover:text-tx-primary-text hover:underline',\r\n 'focus-visible:text-tx-primary-text',\r\n ].join(' '),\r\n );\r\n\r\n protected readonly currentClass = computed(() =>\r\n ['flex min-w-0 items-center gap-tx-1-5 font-medium text-tx-text-primary'].join(' '),\r\n );\r\n}\r\n","import { Tab, TabContent, TabList, TabPanel, Tabs } from '@angular/aria/tabs';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n TemplateRef,\r\n computed,\r\n contentChildren,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * One tab.\r\n *\r\n * Tabs are data; each panel's *content* is a projected\r\n * `ng-template[txTabPanel=\"value\"]`, because content is structural and could\r\n * never be a config field.\r\n */\r\nexport interface TxTab {\r\n /** Unique value. Also what a `txTabPanel` template matches on. */\r\n value: string;\r\n label: string;\r\n /** Registered icon name shown before the label. */\r\n icon?: string;\r\n /** Short count or status after the label. */\r\n badge?: string;\r\n disabled?: boolean;\r\n}\r\n\r\n/** Visual treatment of the tab strip. */\r\nexport type TxTabsAppearance = 'underline' | 'pills' | 'enclosed';\r\n\r\n/** Simple property configuration for {@link TxTabsComponent}. */\r\nexport interface TxTabsConfig {\r\n /** Defaults to `underline`. */\r\n appearance?: TxTabsAppearance;\r\n /** Defaults to `horizontal`. */\r\n orientation?: 'horizontal' | 'vertical';\r\n /** Defaults to `md`. */\r\n size?: 'sm' | 'md';\r\n /**\r\n * `follow` selects a tab as soon as it is focused, which is the usual\r\n * behaviour for cheap panels; `explicit` waits for Enter or Space, which is\r\n * right when switching tabs costs a fetch. Defaults to `follow`.\r\n */\r\n activation?: 'follow' | 'explicit';\r\n /** Stretches tabs to fill the strip. Defaults to false. */\r\n stretch?: boolean;\r\n disabled?: boolean;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_TABS_DEFAULTS = {\r\n appearance: 'underline',\r\n orientation: 'horizontal',\r\n size: 'md',\r\n activation: 'follow',\r\n} as const satisfies Partial<TxTabsConfig>;\r\n\r\n/**\r\n * Marks an `ng-template` as one tab's panel content.\r\n *\r\n * @example\r\n * ```html\r\n * <ng-template txTabPanel=\"details\">…</ng-template>\r\n * ```\r\n */\r\n@Directive({ selector: 'ng-template[txTabPanel]' })\r\nexport class TxTabPanelDirective {\r\n /** The `value` of the tab this template belongs to. */\r\n readonly tab = input.required<string>({ alias: 'txTabPanel' });\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n\r\nconst TRIGGER_BASE = [\r\n 'relative flex cursor-pointer items-center gap-tx-2 whitespace-nowrap',\r\n 'transition-colors duration-150 ease-tx-standard',\r\n // Every state is read from the attributes Aria emits.\r\n 'aria-disabled:cursor-not-allowed aria-disabled:opacity-45',\r\n].join(' ');\r\n\r\nconst APPEARANCE: Record<TxTabsAppearance, string> = {\r\n underline: [\r\n 'border-b-2 border-transparent text-tx-text-muted',\r\n 'hover:border-tx-border-strong hover:text-tx-text-primary',\r\n 'focus-visible:text-tx-text-primary',\r\n 'aria-selected:border-tx-primary aria-selected:font-semibold',\r\n 'aria-selected:text-tx-primary-text',\r\n ].join(' '),\r\n pills: [\r\n 'rounded-tx-full border border-transparent text-tx-text-muted',\r\n 'hover:bg-tx-hover-fill hover:text-tx-text-primary',\r\n 'focus-visible:bg-tx-hover-fill',\r\n 'aria-selected:border-tx-primary-border aria-selected:bg-tx-primary-subtle',\r\n 'aria-selected:font-semibold aria-selected:text-tx-primary-text',\r\n ].join(' '),\r\n enclosed: [\r\n 'rounded-t-tx-sm border border-transparent border-b-0 text-tx-text-muted',\r\n 'hover:bg-tx-hover-fill hover:text-tx-text-primary',\r\n 'focus-visible:bg-tx-hover-fill',\r\n 'aria-selected:border-tx-border aria-selected:bg-tx-surface',\r\n 'aria-selected:font-semibold aria-selected:text-tx-text-primary',\r\n ].join(' '),\r\n};\r\n\r\n/**\r\n * Tabs.\r\n *\r\n * Behaviour is `@angular/aria`'s `ngTabs` / `ngTabList` / `ngTab` /\r\n * `ngTabPanel`: the roving tab stop, arrow-key navigation, Home/End, and the\r\n * `aria-controls` / `aria-labelledby` pairing between each tab and its panel.\r\n * Every visual state is read off `aria-selected` and `aria-disabled` rather\r\n * than mirrored into TypeScript.\r\n *\r\n * Panel content is deferred by Aria, so a panel is only created once its tab is\r\n * first selected.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-tabs [tabs]=\"tabs\" [(selected)]=\"current\">\r\n * <ng-template txTabPanel=\"details\">…</ng-template>\r\n * <ng-template txTabPanel=\"history\">…</ng-template>\r\n * </tx-tabs>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-tabs',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [Tabs, TabList, Tab, TabPanel, TabContent, NgTemplateOutlet, TxIconComponent],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n <div ngTabs [class]=\"rootClass()\">\r\n <div\r\n ngTabList\r\n [orientation]=\"orientation()\"\r\n [selectionMode]=\"activation()\"\r\n [disabled]=\"isDisabled()\"\r\n [(selectedTab)]=\"selected\"\r\n [class]=\"listClass()\"\r\n [attr.aria-label]=\"config().ariaLabel ?? null\"\r\n >\r\n @for (tab of tabs(); track tab.value) {\r\n <button\r\n type=\"button\"\r\n ngTab\r\n [value]=\"tab.value\"\r\n [disabled]=\"tab.disabled === true\"\r\n [class]=\"triggerClass()\"\r\n >\r\n @if (tab.icon; as name) {\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n }\r\n <span class=\"truncate\">{{ tab.label }}</span>\r\n @if (tab.badge; as badge) {\r\n <span\r\n class=\"rounded-tx-full border border-tx-border bg-tx-surface-sunken px-tx-1-5\r\n font-tx-mono text-tx-2xs font-normal text-tx-text-muted\"\r\n >{{ badge }}</span\r\n >\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <div [class]=\"panelsClass()\">\r\n @for (tab of tabs(); track tab.value) {\r\n <div ngTabPanel [value]=\"tab.value\" class=\"min-w-0 focus:outline-none\">\r\n <ng-template ngTabContent>\r\n @if (panelFor(tab.value); as tpl) {\r\n <ng-container [ngTemplateOutlet]=\"tpl\" />\r\n }\r\n </ng-template>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class TxTabsComponent {\r\n readonly config = input<Partial<TxTabsConfig>>({});\r\n\r\n /** The tabs. Data, so they are their own input. */\r\n readonly tabs = input.required<readonly TxTab[]>();\r\n\r\n /** The selected tab's `value`. */\r\n readonly selected = model<string | undefined>(undefined);\r\n\r\n readonly selectedChanged = output<string | undefined>();\r\n\r\n private readonly panels = contentChildren(TxTabPanelDirective);\r\n\r\n private readonly resolved = computed<TxTabsConfig>(() =>\r\n txMergeConfig(TX_TABS_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly orientation = computed(() => this.resolved().orientation ?? 'horizontal');\r\n protected readonly activation = computed(() =>\r\n this.resolved().activation === 'explicit' ? ('explicit' as const) : ('follow' as const),\r\n );\r\n protected readonly isDisabled = computed(() => this.resolved().disabled === true);\r\n\r\n protected panelFor(value: string) {\r\n return this.panels().find((panel) => panel.tab() === value)?.template ?? null;\r\n }\r\n\r\n protected readonly rootClass = computed(() =>\r\n ['flex min-w-0', this.orientation() === 'vertical' ? 'flex-row gap-tx-5' : 'flex-col'].join(\r\n ' ',\r\n ),\r\n );\r\n\r\n protected readonly listClass = computed(() => {\r\n const { appearance, stretch } = this.resolved();\r\n const vertical = this.orientation() === 'vertical';\r\n return [\r\n 'flex min-w-0',\r\n vertical ? 'shrink-0 flex-col gap-tx-1' : 'flex-row gap-tx-1 overflow-x-auto',\r\n // The underline strip carries the baseline rule the selected tab sits on.\r\n appearance === 'underline' && !vertical ? 'border-b border-tx-border' : '',\r\n appearance === 'underline' && vertical ? 'border-r border-tx-border' : '',\r\n appearance === 'enclosed' && !vertical ? 'border-b border-tx-border' : '',\r\n stretch && !vertical ? '[&>*]:flex-1 [&>*]:justify-center' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n protected readonly triggerClass = computed(() => {\r\n const { appearance, size } = this.resolved();\r\n return [\r\n TRIGGER_BASE,\r\n size === 'sm' ? 'px-tx-2-5 py-tx-1-5 text-tx-sm' : 'px-tx-3 py-tx-2 text-tx-base',\r\n APPEARANCE[appearance ?? 'underline'],\r\n // A vertical underline strip needs the accent on the trailing edge.\r\n appearance === 'underline' && this.orientation() === 'vertical'\r\n ? 'border-b-0 border-r-2 -mr-px'\r\n : '',\r\n appearance === 'enclosed' ? '-mb-px' : '',\r\n appearance === 'underline' && this.orientation() === 'horizontal' ? '-mb-px' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n protected readonly panelsClass = computed(() =>\r\n [\r\n 'min-w-0 flex-1',\r\n this.orientation() === 'vertical' ? '' : 'pt-tx-4',\r\n this.resolved().appearance === 'enclosed'\r\n ? 'rounded-b-tx-sm border border-t-0 border-tx-border bg-tx-surface p-tx-4'\r\n : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n );\r\n}\r\n","import {\r\n AccordionContent,\r\n AccordionGroup,\r\n AccordionPanel,\r\n AccordionTrigger,\r\n} from '@angular/aria/accordion';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n TemplateRef,\r\n computed,\r\n contentChildren,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * One accordion section.\r\n *\r\n * Sections are data. Both the body and any header buttons are projected\r\n * templates, because a header that \"must accept arbitrary buttons\" is exactly\r\n * what a config field can never express.\r\n */\r\nexport interface TxAccordionItem {\r\n /** Unique value. Also what the content and header-action templates match on. */\r\n value: string;\r\n label: string;\r\n /** Secondary line under the label. */\r\n description?: string;\r\n /** Registered icon name shown before the label. */\r\n icon?: string;\r\n /** Short count or status shown after the label. */\r\n badge?: string;\r\n disabled?: boolean;\r\n}\r\n\r\n/** Visual treatment. */\r\nexport type TxAccordionAppearance = 'separated' | 'contained' | 'flush';\r\n\r\n/** Simple property configuration for {@link TxAccordionComponent}. */\r\nexport interface TxAccordionConfig {\r\n /** Defaults to `separated`. */\r\n appearance?: TxAccordionAppearance;\r\n /** Defaults to `md`. */\r\n size?: 'sm' | 'md';\r\n /** More than one section open at a time. Defaults to true. */\r\n multiple?: boolean;\r\n /** Which side the chevron sits on. Defaults to `start`. */\r\n chevronPosition?: 'start' | 'end';\r\n disabled?: boolean;\r\n}\r\n\r\nexport const TX_ACCORDION_DEFAULTS = {\r\n appearance: 'separated',\r\n size: 'md',\r\n multiple: true,\r\n chevronPosition: 'start',\r\n} as const satisfies Partial<TxAccordionConfig>;\r\n\r\n/** Marks an `ng-template` as one section's body. */\r\n@Directive({ selector: 'ng-template[txAccordionContent]' })\r\nexport class TxAccordionContentDirective {\r\n /** The `value` of the section this template belongs to. */\r\n readonly item = input.required<string>({ alias: 'txAccordionContent' });\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n\r\n/**\r\n * Marks an `ng-template` as buttons for one section's header.\r\n *\r\n * Rendered outside the trigger button, because a button inside a button is\r\n * invalid and unreachable — which is why this is a slot rather than a config\r\n * field.\r\n */\r\n@Directive({ selector: 'ng-template[txAccordionHeaderActions]' })\r\nexport class TxAccordionHeaderActionsDirective {\r\n /** The `value` of the section these actions belong to. */\r\n readonly item = input.required<string>({ alias: 'txAccordionHeaderActions' });\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n\r\n/**\r\n * A stack of collapsible sections.\r\n *\r\n * Behaviour is `@angular/aria`'s `ngAccordionGroup` / `ngAccordionPanel` /\r\n * `ngAccordionTrigger` / `ngAccordionContent`: arrow-key navigation between\r\n * headers, Home/End, the `aria-expanded` / `aria-controls` pairing, and\r\n * deferred rendering so a collapsed body is never created.\r\n *\r\n * Header actions are projected and rendered *beside* the trigger, never inside\r\n * it: nesting a button in a button is invalid HTML and the inner one cannot be\r\n * reached by keyboard.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-accordion [items]=\"sections\" [(expanded)]=\"open\">\r\n * <ng-template txAccordionContent=\"symptoms\">…</ng-template>\r\n * <ng-template txAccordionHeaderActions=\"symptoms\">\r\n * <tx-button [config]=\"{ label: 'Add symptom', icon: 'plus', size: 'sm' }\" />\r\n * </ng-template>\r\n * </tx-accordion>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-accordion',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n AccordionGroup,\r\n AccordionPanel,\r\n AccordionTrigger,\r\n AccordionContent,\r\n NgTemplateOutlet,\r\n TxIconComponent,\r\n ],\r\n host: { class: 'block min-w-0' },\r\n template: `\r\n <div\r\n ngAccordionGroup\r\n [multiExpandable]=\"isMultiple()\"\r\n [disabled]=\"isDisabled()\"\r\n [class]=\"rootClass()\"\r\n >\r\n @for (item of items(); track item.value) {\r\n <div ngAccordionPanel #panel=\"ngAccordionPanel\" [class]=\"sectionClass()\">\r\n <div [class]=\"headerClass()\">\r\n <button\r\n type=\"button\"\r\n ngAccordionTrigger\r\n [panel]=\"panel\"\r\n [disabled]=\"item.disabled === true\"\r\n [expanded]=\"isExpanded(item.value)\"\r\n (expandedChange)=\"setExpanded(item.value, $event)\"\r\n [class]=\"triggerClass()\"\r\n >\r\n @if (chevronStart()) {\r\n <span [class]=\"chevronClass\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: 'chevron-down', size: 'sm' }\" />\r\n </span>\r\n }\r\n\r\n @if (item.icon; as name) {\r\n <span class=\"flex shrink-0 text-tx-text-subtle\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n </span>\r\n }\r\n\r\n <span class=\"min-w-0 flex-1 text-left\">\r\n <span class=\"block truncate\">{{ item.label }}</span>\r\n @if (item.description; as text) {\r\n <span class=\"block truncate text-tx-xs font-normal text-tx-text-muted\">\r\n {{ text }}\r\n </span>\r\n }\r\n </span>\r\n\r\n @if (item.badge; as badge) {\r\n <span\r\n class=\"shrink-0 rounded-tx-full border border-tx-border bg-tx-surface-sunken\r\n px-tx-1-5 font-tx-mono text-tx-2xs font-normal text-tx-text-muted\"\r\n >{{ badge }}</span\r\n >\r\n }\r\n\r\n @if (!chevronStart()) {\r\n <span [class]=\"chevronClass\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name: 'chevron-down', size: 'sm' }\" />\r\n </span>\r\n }\r\n </button>\r\n\r\n <!--\r\n Outside the trigger: a button nested in a button is invalid HTML\r\n and the inner one is unreachable by keyboard.\r\n -->\r\n @if (headerActionsFor(item.value); as tpl) {\r\n <span class=\"flex shrink-0 items-center gap-tx-1 pr-tx-3\">\r\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\r\n </span>\r\n }\r\n </div>\r\n\r\n <ng-template ngAccordionContent>\r\n <div [class]=\"bodyClass()\">\r\n @if (contentFor(item.value); as tpl) {\r\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\r\n }\r\n </div>\r\n </ng-template>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TxAccordionComponent {\r\n readonly config = input<Partial<TxAccordionConfig>>({});\r\n\r\n /** The sections. Data, so they are their own input. */\r\n readonly items = input.required<readonly TxAccordionItem[]>();\r\n\r\n /** Values of the open sections. */\r\n readonly expanded = model<string[]>([]);\r\n\r\n readonly expandedChanged = output<string[]>();\r\n\r\n private readonly contents = contentChildren(TxAccordionContentDirective);\r\n private readonly headerActions = contentChildren(TxAccordionHeaderActionsDirective);\r\n\r\n private readonly resolved = computed<TxAccordionConfig>(() =>\r\n txMergeConfig(TX_ACCORDION_DEFAULTS, this.config()),\r\n );\r\n\r\n private readonly expandedSet = computed(() => new Set(this.expanded()));\r\n\r\n protected readonly isMultiple = computed(() => this.resolved().multiple !== false);\r\n protected readonly isDisabled = computed(() => this.resolved().disabled === true);\r\n protected readonly chevronStart = computed(\r\n () => (this.resolved().chevronPosition ?? 'start') === 'start',\r\n );\r\n\r\n protected readonly chevronClass =\r\n 'flex shrink-0 -rotate-90 text-tx-text-subtle transition-transform duration-150 ' +\r\n 'ease-tx-standard in-aria-expanded:rotate-0';\r\n\r\n protected contentFor(value: string) {\r\n return this.contents().find((entry) => entry.item() === value)?.template ?? null;\r\n }\r\n\r\n protected headerActionsFor(value: string) {\r\n return this.headerActions().find((entry) => entry.item() === value)?.template ?? null;\r\n }\r\n\r\n protected isExpanded(value: string): boolean {\r\n return this.expandedSet().has(value);\r\n }\r\n\r\n protected setExpanded(value: string, expanded: boolean): void {\r\n if (this.isExpanded(value) === expanded) {\r\n return;\r\n }\r\n const next = new Set(this.expanded());\r\n if (expanded) {\r\n // Aria enforces single-expansion itself; this keeps our model in step.\r\n if (!this.isMultiple()) {\r\n next.clear();\r\n }\r\n next.add(value);\r\n } else {\r\n next.delete(value);\r\n }\r\n const list = [...next];\r\n this.expanded.set(list);\r\n this.expandedChanged.emit(list);\r\n }\r\n\r\n protected readonly rootClass = computed(() => {\r\n const appearance = this.resolved().appearance ?? 'separated';\r\n return [\r\n 'flex min-w-0 flex-col',\r\n appearance === 'separated' ? 'gap-tx-2' : '',\r\n appearance === 'contained'\r\n ? 'divide-y divide-tx-border overflow-hidden rounded-tx-md border border-tx-border bg-tx-surface'\r\n : '',\r\n appearance === 'flush' ? 'divide-y divide-tx-border-subtle' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n protected readonly sectionClass = computed(() => {\r\n const appearance = this.resolved().appearance ?? 'separated';\r\n return [\r\n 'min-w-0',\r\n appearance === 'separated'\r\n ? 'overflow-hidden rounded-tx-md border border-tx-border bg-tx-surface'\r\n : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n protected readonly headerClass = computed(() => 'flex min-w-0 items-center');\r\n\r\n protected readonly triggerClass = computed(() => {\r\n const size = this.resolved().size ?? 'md';\r\n return [\r\n 'flex min-w-0 flex-1 cursor-pointer items-center gap-tx-2-5 text-left',\r\n size === 'sm' ? 'px-tx-3 py-tx-2 text-tx-sm' : 'px-tx-4 py-tx-3 text-tx-base',\r\n 'font-medium text-tx-text-primary transition-colors',\r\n 'hover:bg-tx-hover-fill focus-visible:bg-tx-hover-fill',\r\n 'aria-disabled:cursor-not-allowed aria-disabled:text-tx-text-disabled',\r\n 'aria-disabled:hover:bg-transparent',\r\n 'aria-expanded:text-tx-text-heading',\r\n ].join(' ');\r\n });\r\n\r\n protected readonly bodyClass = computed(() => {\r\n const size = this.resolved().size ?? 'md';\r\n return [\r\n 'min-w-0 border-t border-tx-border-subtle text-tx-base text-tx-text-primary',\r\n size === 'sm' ? 'px-tx-3 py-tx-3' : 'px-tx-4 py-tx-4',\r\n ].join(' ');\r\n });\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/** Simple property configuration for {@link TxHeaderComponent}. */\r\nexport interface TxHeaderConfig {\r\n /**\r\n * Wordmark text. Rendered in the display face, uppercase and letter-spaced,\r\n * matching the reference design's lockup.\r\n */\r\n wordmark?: string;\r\n /**\r\n * A slice of the wordmark to accent in the brand colour, e.g. the `X` in\r\n * `TRAXTION`. Matched case-sensitively, first occurrence only.\r\n */\r\n wordmarkAccent?: string;\r\n /** Application name, shown after a divider. */\r\n appName?: string;\r\n /** Registered icon name shown before the wordmark. */\r\n icon?: string;\r\n /** Shows the menu button below `lg`, for toggling a sidebar. Defaults to true. */\r\n menuButton?: boolean;\r\n /** Reflected on the menu button as `aria-expanded`. */\r\n menuOpen?: boolean;\r\n /** Id of the element the menu button controls. */\r\n menuControls?: string;\r\n /** Sticks the header to the top of the viewport. Defaults to true. */\r\n sticky?: boolean;\r\n /** Adds the brand's tread band under the header. Defaults to false. */\r\n groove?: boolean;\r\n}\r\n\r\nexport const TX_HEADER_DEFAULTS = {\r\n menuButton: true,\r\n sticky: true,\r\n} as const satisfies Partial<TxHeaderConfig>;\r\n\r\n/**\r\n * The application header bar.\r\n *\r\n * The wordmark and app name are simple properties; everything else — search,\r\n * user chip, actions — is projected, because a header's contents are exactly\r\n * the sort of thing a config object could never anticipate.\r\n *\r\n * Slots: `[txHeaderStart]` after the wordmark, default content in the middle,\r\n * `[txHeaderEnd]` pinned to the trailing edge.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-header\r\n * [config]=\"{ wordmark: 'TRAXTION', wordmarkAccent: 'X', appName: 'UI Kit',\r\n * menuOpen: navOpen(), menuControls: 'app-nav' }\"\r\n * (menuToggled)=\"navOpen.set(!navOpen())\">\r\n * <div txHeaderEnd>\r\n * <tx-button [config]=\"{ label: 'Sign out', variant: 'ghost', size: 'sm' }\" />\r\n * </div>\r\n * </tx-header>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-header',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TxIconComponent],\r\n host: { '[class]': 'hostClass()' },\r\n template: `\r\n <div\r\n class=\"flex min-h-tx-control-lg flex-wrap items-center gap-x-tx-3 gap-y-tx-2\r\n border-b border-tx-border bg-tx-surface px-tx-3 py-tx-2 sm:px-tx-4\"\r\n >\r\n @if (showMenuButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-grid size-tx-control-md shrink-0 cursor-pointer place-items-center\r\n rounded-tx-sm border border-tx-border text-tx-text-muted transition-colors\r\n hover:border-tx-border-strong hover:text-tx-text-primary\r\n focus-visible:border-tx-border-strong lg:hidden\"\r\n [attr.aria-expanded]=\"config().menuOpen ?? false\"\r\n [attr.aria-controls]=\"config().menuControls ?? null\"\r\n [attr.aria-label]=\"(config().menuOpen ? 'Close' : 'Open') + ' navigation'\"\r\n (click)=\"menuToggled.emit(!(config().menuOpen ?? false))\"\r\n >\r\n <tx-icon [config]=\"{ name: config().menuOpen ? 'close' : 'menu' }\" />\r\n </button>\r\n }\r\n\r\n @if (config().icon; as name) {\r\n <span class=\"flex shrink-0 text-tx-accent-text\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'lg' }\" />\r\n </span>\r\n }\r\n\r\n @if (wordmarkParts(); as parts) {\r\n <span\r\n class=\"font-tx-display text-tx-xl font-bold tracking-tx-wide whitespace-nowrap\r\n uppercase text-tx-accent-text\"\r\n >\r\n {{ parts.before }}<span class=\"text-tx-primary-text\">{{ parts.accent }}</span\r\n >{{ parts.after }}\r\n </span>\r\n }\r\n\r\n @if (config().appName; as name) {\r\n <span class=\"hidden h-tx-5 w-px bg-tx-border sm:block\" aria-hidden=\"true\"></span>\r\n <span\r\n class=\"hidden font-tx-display text-tx-base font-semibold tracking-tx-wide uppercase\r\n text-tx-text-muted sm:block\"\r\n >{{ name }}</span\r\n >\r\n }\r\n\r\n <span class=\"flex shrink-0 items-center gap-tx-2 empty:hidden\">\r\n <ng-content select=\"[txHeaderStart]\" />\r\n </span>\r\n\r\n <span class=\"flex min-w-0 flex-1 items-center gap-tx-2\">\r\n <ng-content />\r\n </span>\r\n\r\n <span class=\"flex shrink-0 items-center gap-tx-2 empty:hidden\">\r\n <ng-content select=\"[txHeaderEnd]\" />\r\n </span>\r\n </div>\r\n\r\n @if (config().groove) {\r\n <span [class]=\"grooveClass\" aria-hidden=\"true\"></span>\r\n }\r\n `,\r\n})\r\nexport class TxHeaderComponent {\r\n readonly config = input<Partial<TxHeaderConfig>>({});\r\n\r\n /** Emitted with the requested state. The app owns whether the nav is open. */\r\n readonly menuToggled = output<boolean>();\r\n\r\n private readonly resolved = computed<TxHeaderConfig>(() =>\r\n txMergeConfig(TX_HEADER_DEFAULTS, this.config()),\r\n );\r\n\r\n protected readonly showMenuButton = computed(() => this.resolved().menuButton !== false);\r\n\r\n /** Splits the wordmark so one slice can carry the brand colour. */\r\n protected readonly wordmarkParts = computed(() => {\r\n const wordmark = this.resolved().wordmark;\r\n if (!wordmark) {\r\n return null;\r\n }\r\n const accent = this.resolved().wordmarkAccent;\r\n if (!accent) {\r\n return { before: wordmark, accent: '', after: '' };\r\n }\r\n const at = wordmark.indexOf(accent);\r\n if (at === -1) {\r\n return { before: wordmark, accent: '', after: '' };\r\n }\r\n return {\r\n before: wordmark.slice(0, at),\r\n accent,\r\n after: wordmark.slice(at + accent.length),\r\n };\r\n });\r\n\r\n protected readonly grooveClass = 'tx-groove';\r\n\r\n protected readonly hostClass = computed(() =>\r\n ['block w-full', this.resolved().sticky !== false ? 'sticky top-0 z-30' : ''].join(' '),\r\n );\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n TemplateRef,\r\n computed,\r\n input,\r\n model,\r\n output,\r\n} from '@angular/core';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\n\r\nimport { TxIconComponent } from '../icon/icon.component';\r\nimport { txMergeConfig } from '../core/merge-config';\r\n\r\n/**\r\n * One navigation entry.\r\n *\r\n * Items are data, and nest through `children`. A link navigates by\r\n * `routerLink` or `href`; an item with neither emits `selected` and the\r\n * application decides. No callback ever lives on the item.\r\n */\r\nexport interface TxNavItem {\r\n /** Unique within the sidebar. Used for expansion state. */\r\n id: string;\r\n label: string;\r\n /** Registered icon name. */\r\n icon?: string;\r\n /** Short count or status after the label. */\r\n badge?: string;\r\n /** Angular router target. Takes precedence over `href`. */\r\n routerLink?: string | readonly unknown[];\r\n /** Plain link target. */\r\n href?: string;\r\n /** Nested entries. A parent with children is a disclosure, not a link. */\r\n children?: readonly TxNavItem[];\r\n disabled?: boolean;\r\n}\r\n\r\n/** A titled block of entries. */\r\nexport interface TxNavGroup {\r\n /** Optional heading. Omit for an untitled block. */\r\n label?: string;\r\n items: readonly TxNavItem[];\r\n}\r\n\r\n/** Simple property configuration for {@link TxSidebarComponent}. */\r\nexport interface TxSidebarConfig {\r\n /**\r\n * Below this breakpoint the sidebar becomes an overlay drawer; at and above\r\n * it, a static column. Defaults to `lg`.\r\n */\r\n breakpoint?: 'sm' | 'md' | 'lg' | 'xl';\r\n /** Collapses the static sidebar to an icon rail. Defaults to false. */\r\n railed?: boolean;\r\n /** Defaults to `md`. */\r\n size?: 'sm' | 'md';\r\n /** Accessible name. Defaults to `Main`. */\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const TX_SIDEBAR_DEFAULTS = {\r\n breakpoint: 'lg',\r\n size: 'md',\r\n ariaLabel: 'Main',\r\n} as const satisfies Partial<TxSidebarConfig>;\r\n\r\n/**\r\n * Static-from / drawer-below classes per breakpoint.\r\n *\r\n * Written out in full rather than composed at runtime, because Tailwind scans\r\n * source text and would never generate a class assembled from a variable.\r\n */\r\nconst LAYOUT: Record<'sm' | 'md' | 'lg' | 'xl', { static_: string; drawer: string }> = {\r\n sm: {\r\n static_: 'sm:sticky sm:top-0 sm:z-auto sm:h-dvh sm:translate-x-0 sm:border-r sm:shadow-none',\r\n drawer: 'max-sm:fixed max-sm:inset-y-0 max-sm:left-0 max-sm:z-40 max-sm:shadow-tx-lg',\r\n },\r\n md: {\r\n static_: 'md:sticky md:top-0 md:z-auto md:h-dvh md:translate-x-0 md:border-r md:shadow-none',\r\n drawer: 'max-md:fixed max-md:inset-y-0 max-md:left-0 max-md:z-40 max-md:shadow-tx-lg',\r\n },\r\n lg: {\r\n static_: 'lg:sticky lg:top-0 lg:z-auto lg:h-dvh lg:translate-x-0 lg:border-r lg:shadow-none',\r\n drawer: 'max-lg:fixed max-lg:inset-y-0 max-lg:left-0 max-lg:z-40 max-lg:shadow-tx-lg',\r\n },\r\n xl: {\r\n static_: 'xl:sticky xl:top-0 xl:z-auto xl:h-dvh xl:translate-x-0 xl:border-r xl:shadow-none',\r\n drawer: 'max-xl:fixed max-xl:inset-y-0 max-xl:left-0 max-xl:z-40 max-xl:shadow-tx-lg',\r\n },\r\n};\r\n\r\nconst SCRIM: Record<'sm' | 'md' | 'lg' | 'xl', string> = {\r\n sm: 'sm:hidden',\r\n md: 'md:hidden',\r\n lg: 'lg:hidden',\r\n xl: 'xl:hidden',\r\n};\r\n\r\n/**\r\n * The application's navigation sidebar.\r\n *\r\n * A static column from its breakpoint up, and an overlay drawer below it, with\r\n * a scrim that closes on click. Nested entries are disclosures that carry\r\n * `aria-expanded`; the active route is marked with `aria-current=\"page\"` by\r\n * `RouterLinkActive`, and every selected/active style is read off that\r\n * attribute rather than from a mirrored boolean.\r\n *\r\n * Header and footer are projected slots, so a product can put a logo, a search\r\n * box or a user chip in without this component knowing about any of them.\r\n *\r\n * @example\r\n * ```html\r\n * <tx-sidebar\r\n * id=\"app-nav\"\r\n * [groups]=\"navGroups\"\r\n * [(open)]=\"navOpen\"\r\n * [config]=\"{ breakpoint: 'lg' }\">\r\n * <div txSidebarFooter>\r\n * <tx-button [config]=\"{ label: 'Sign out', variant: 'ghost', width: 'full' }\" />\r\n * </div>\r\n * </tx-sidebar>\r\n * ```\r\n *\r\n * Config is a signal input — replace the object rather than mutating it.\r\n */\r\n@Component({\r\n selector: 'tx-sidebar',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [RouterLink, RouterLinkActive, NgTemplateOutlet, TxIconComponent],\r\n host: { class: 'contents' },\r\n template: `\r\n <!-- Drawer scrim. Only below the breakpoint, where the sidebar overlays. -->\r\n @if (open()) {\r\n <button\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n [class]=\"scrimClass()\"\r\n (click)=\"setOpen(false)\"\r\n ></button>\r\n }\r\n\r\n <nav [class]=\"navClass()\" [attr.aria-label]=\"config().ariaLabel ?? 'Main'\">\r\n <div class=\"flex shrink-0 flex-col gap-tx-2 p-tx-3 empty:hidden\">\r\n <ng-content select=\"[txSidebarHeader]\" />\r\n </div>\r\n\r\n <div class=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-tx-3\">\r\n @for (group of groups(); track $index) {\r\n <div class=\"mb-tx-5 last:mb-0\">\r\n @if (group.label; as label) {\r\n <p\r\n class=\"mb-tx-1-5 px-tx-2 font-tx-mono text-tx-2xs tracking-tx-widest uppercase\r\n text-tx-text-subtle\"\r\n [class.sr-only]=\"isRailed()\"\r\n >\r\n {{ label }}\r\n </p>\r\n }\r\n\r\n <ul class=\"flex list-none flex-col gap-tx-0-5 p-0\">\r\n @for (item of group.items; track item.id) {\r\n <li>\r\n <ng-container\r\n [ngTemplateOutlet]=\"entry\"\r\n [ngTemplateOutletContext]=\"{ item: item, depth: 0 }\"\r\n />\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"shrink-0 border-t border-tx-border p-tx-3 empty:hidden\">\r\n <ng-content select=\"[txSidebarFooter]\" />\r\n </div>\r\n </nav>\r\n\r\n <!-- One renderer for every level; recurses for children. -->\r\n <ng-template #entry let-item=\"item\" let-depth=\"depth\">\r\n @if (item.children?.length) {\r\n <button\r\n type=\"button\"\r\n [class]=\"itemClass(depth)\"\r\n [disabled]=\"item.disabled === true\"\r\n [attr.aria-expanded]=\"isExpanded(item.id)\"\r\n (click)=\"toggle(item.id)\"\r\n >\r\n @if (item.icon; as name) {\r\n <span class=\"flex shrink-0\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n </span>\r\n }\r\n <span class=\"min-w-0 flex-1 truncate text-left\" [class.sr-only]=\"isRailed()\">\r\n {{ item.label }}\r\n </span>\r\n <span\r\n class=\"flex shrink-0 -rotate-90 transition-transform duration-150 ease-tx-standard\r\n in-aria-expanded:rotate-0\"\r\n [class.sr-only]=\"isRailed()\"\r\n aria-hidden=\"true\"\r\n >\r\n <tx-icon [config]=\"{ name: 'chevron-down', size: 'sm' }\" />\r\n </span>\r\n </button>\r\n\r\n @if (isExpanded(item.id)) {\r\n <ul class=\"mt-tx-0-5 flex list-none flex-col gap-tx-0-5 p-0\">\r\n @for (child of item.children; track child.id) {\r\n <li>\r\n <ng-container\r\n [ngTemplateOutlet]=\"entry\"\r\n [ngTemplateOutletContext]=\"{ item: child, depth: depth + 1 }\"\r\n />\r\n </li>\r\n }\r\n </ul>\r\n }\r\n } @else if (item.routerLink; as link) {\r\n <a\r\n [routerLink]=\"link\"\r\n routerLinkActive\r\n #rla=\"routerLinkActive\"\r\n ariaCurrentWhenActive=\"page\"\r\n [class]=\"itemClass(depth)\"\r\n (click)=\"onNavigate()\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"body\"\r\n [ngTemplateOutletContext]=\"{ item: item }\"\r\n />\r\n </a>\r\n } @else if (item.href; as href) {\r\n <a [href]=\"href\" [class]=\"itemClass(depth)\" (click)=\"onNavigate()\">\r\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ item: item }\" />\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n [class]=\"itemClass(depth)\"\r\n [disabled]=\"item.disabled === true\"\r\n (click)=\"selected.emit(item); onNavigate()\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"body\" [ngTemplateOutletContext]=\"{ item: item }\" />\r\n </button>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #body let-item=\"item\">\r\n @if (item.icon; as name) {\r\n <span class=\"flex shrink-0\" aria-hidden=\"true\">\r\n <tx-icon [config]=\"{ name, size: 'sm' }\" />\r\n </span>\r\n }\r\n <span class=\"min-w-0 flex-1 truncate text-left\" [class.sr-only]=\"isRailed()\">\r\n {{ item.label }}\r\n </span>\r\n @if (item.badge; as badge) {\r\n <span\r\n class=\"shrink-0 rounded-tx-full border border-tx-border bg-tx-surface-sunken px-tx-1-5\r\n font-tx-mono text-tx-2xs text-tx-text-muted\"\r\n [class.sr-only]=\"isRailed()\"\r\n >{{ badge }}</span\r\n >\r\n }\r\n </ng-template>\r\n `,\r\n})\r\nexport class TxSidebarComponent {\r\n readonly config = input<Partial<TxSidebarConfig>>({});\r\n\r\n /** The navigation tree, in groups. Data, so it is its own input. */\r\n readonly groups = input.required<readonly TxNavGroup[]>();\r\n\r\n /** Whether the drawer is open. Only meaningful below the breakpoint. */\r\n readonly open = model(false);\r\n\r\n /** Ids of the expanded parent entries. */\r\n readonly expandedIds = model<string[]>([]);\r\n\r\n /** Emitted for an entry that has no link target. */\r\n readonly selected = output<TxNavItem>();\r\n\r\n private readonly resolved = computed<TxSidebarConfig>(() =>\r\n txMergeConfig(TX_SIDEBAR_DEFAULTS, this.config()),\r\n );\r\n\r\n private readonly breakpoint = computed(() => this.resolved().breakpoint ?? 'lg');\r\n private readonly expandedSet = computed(() => new Set(this.expandedIds()));\r\n\r\n protected readonly isRailed = computed(() => this.resolved().railed === true);\r\n\r\n protected readonly navClass = computed(() => {\r\n const layout = LAYOUT[this.breakpoint()];\r\n return [\r\n 'flex shrink-0 flex-col border-tx-border bg-tx-surface',\r\n this.isRailed() ? 'w-tx-16' : 'w-tx-sidebar',\r\n layout.drawer,\r\n 'max-w-[85vw] transition-transform duration-200 ease-tx-standard',\r\n this.open() ? 'translate-x-0' : '-translate-x-full',\r\n layout.static_,\r\n 'max-h-dvh',\r\n ].join(' ');\r\n });\r\n\r\n protected readonly scrimClass = computed(() =>\r\n ['fixed inset-0 z-30 cursor-default bg-tx-scrim', SCRIM[this.breakpoint()]].join(' '),\r\n );\r\n\r\n protected itemClass(depth: number): string {\r\n return [\r\n 'flex w-full cursor-pointer items-center gap-tx-2-5 rounded-tx-sm',\r\n this.resolved().size === 'sm'\r\n ? 'px-tx-2 py-tx-1 text-tx-sm'\r\n : 'px-tx-2-5 py-tx-1-5 text-tx-base',\r\n depth > 0 ? 'pl-tx-8' : '',\r\n 'text-tx-text-primary no-underline transition-colors',\r\n 'hover:bg-tx-hover-fill focus-visible:bg-tx-hover-fill',\r\n 'disabled:pointer-events-none disabled:text-tx-text-disabled',\r\n // RouterLinkActive sets aria-current=\"page\"; the active pill is read from\r\n // that attribute rather than from a class toggled in TypeScript.\r\n 'aria-[current=page]:bg-tx-primary-subtle aria-[current=page]:font-semibold',\r\n 'aria-[current=page]:text-tx-primary-text',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n protected isExpanded(id: string): boolean {\r\n return this.expandedSet().has(id);\r\n }\r\n\r\n protected toggle(id: string): void {\r\n const next = new Set(this.expandedIds());\r\n if (next.has(id)) {\r\n next.delete(id);\r\n } else {\r\n next.add(id);\r\n }\r\n this.expandedIds.set([...next]);\r\n }\r\n\r\n protected setOpen(open: boolean): void {\r\n this.open.set(open);\r\n }\r\n\r\n /** Navigating from the drawer should close it; on desktop it is a no-op. */\r\n protected onNavigate(): void {\r\n if (this.open()) {\r\n this.open.set(false);\r\n }\r\n }\r\n}\r\n","/*\r\n * Public API — @tx-angular-design-system/ui-kit\r\n *\r\n * Nothing is usable by a consumer unless it is exported from this file.\r\n * Append-only within a major version: adding an export is fine, renaming or\r\n * removing one is a breaking change.\r\n */\r\n\r\n/* ---- core ---- */\r\nexport * from './lib/core/unique-id';\r\nexport * from './lib/core/option';\r\nexport * from './lib/core/merge-config';\r\nexport * from './lib/core/control-classes';\r\nexport * from './lib/core/control-value-bridge';\r\nexport * from './lib/core/form-field-binding';\r\n\r\n/* ---- overlay ---- */\r\nexport * from './lib/overlay/overlay.types';\r\nexport * from './lib/overlay/connected-overlay.directive';\r\n\r\n/* ---- foundations ---- */\r\nexport * from './lib/icon/icon.types';\r\nexport * from './lib/icon/default-icons';\r\nexport * from './lib/icon/icon-registry.service';\r\nexport * from './lib/icon/icon.component';\r\nexport * from './lib/form-field/form-field.types';\r\nexport * from './lib/form-field/form-field.component';\r\n\r\n/* ---- controls ---- */\r\nexport * from './lib/button/button.types';\r\nexport * from './lib/button/button.component';\r\nexport * from './lib/input/input.types';\r\nexport * from './lib/input/input.component';\r\nexport * from './lib/textarea/textarea.component';\r\nexport * from './lib/checkbox/checkbox.component';\r\nexport * from './lib/radio/radio-group.component';\r\nexport * from './lib/switch/switch.component';\r\nexport * from './lib/core/popup-classes';\r\nexport * from './lib/select/select.types';\r\nexport * from './lib/select/select.component';\r\nexport * from './lib/select/multiselect.component';\r\nexport * from './lib/core/selection-summary';\r\nexport * from './lib/dropdown-tree/dropdown-tree.component';\r\nexport * from './lib/chips-input/chips-input.component';\r\nexport * from './lib/datepicker/date-utils';\r\nexport * from './lib/datepicker/datepicker.component';\r\n\r\n/* ---- data ---- */\r\nexport * from './lib/tree/tree.types';\r\nexport * from './lib/tree/tree.component';\r\nexport * from './lib/table/table.types';\r\nexport * from './lib/table/table-utils';\r\nexport * from './lib/table/table-slots.directive';\r\nexport * from './lib/table/table.component';\r\nexport * from './lib/reorder-list/reorder-list.component';\r\n\r\n/* ---- feedback ---- */\r\nexport * from './lib/spinner/spinner.component';\r\nexport * from './lib/skeleton/skeleton.component';\r\nexport * from './lib/alert/alert.component';\r\nexport * from './lib/tooltip/tooltip.directive';\r\nexport * from './lib/toast/toast.service';\r\nexport * from './lib/dialog/dialog.component';\r\nexport * from './lib/dialog/dialog.service';\r\n\r\n/* ---- layout & navigation ---- */\r\nexport * from './lib/pagination/pagination-utils';\r\nexport * from './lib/pagination/pagination.component';\r\nexport * from './lib/badge/badge.component';\r\nexport * from './lib/divider/divider.component';\r\nexport * from './lib/card/card.component';\r\nexport * from './lib/empty-state/empty-state.component';\r\nexport * from './lib/breadcrumb/breadcrumb.component';\r\nexport * from './lib/tabs/tabs.component';\r\nexport * from './lib/accordion/accordion.component';\r\nexport * from './lib/header/header.component';\r\nexport * from './lib/sidebar/sidebar.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["SIZE_CLASSES","TONE_CLASSES","BOX_SIZE","TEXT_SIZE","DEFAULT_ICONS","ACCENT","PADDING"],"mappings":"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"}