@cdevhub/ngx-tw 0.2.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.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
  4. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
  6. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
  7. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
  9. package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
  11. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
  13. package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
  15. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
  17. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
  18. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
  20. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
  22. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
  24. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
  26. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
  28. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
  30. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
  32. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
  38. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
  42. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
  44. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
  45. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
  47. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
  49. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
  51. package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
  53. package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
  55. package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
  57. package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
  59. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
  60. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
  61. package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
  62. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
  63. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
  64. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
  65. package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
  66. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
  67. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
  68. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
  69. package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
  70. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
  71. package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
  72. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
  73. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
  74. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
  75. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
  76. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
  77. package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
  78. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
  79. package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
  80. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
  81. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
  82. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
  83. package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
  84. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
  85. package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
  86. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
  87. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
  88. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
  89. package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
  90. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
  91. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
  92. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
  93. package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
  94. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
  95. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
  96. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
  97. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
  98. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
  99. package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
  100. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
  101. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
  102. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
  103. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
  104. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
  105. package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
  106. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
  107. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
  108. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
  109. package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
  110. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
  111. package/package.json +265 -0
  112. package/theme/_base.css +394 -0
  113. package/theme/_dark.css +510 -0
  114. package/theme/_high-contrast.css +290 -0
  115. package/theme/_semantic.css +317 -0
  116. package/theme/_typography.css +9 -0
  117. package/theme/index.css +54 -0
  118. package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
  119. package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
  120. package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
  121. package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
  122. package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
  123. package/types/cdevhub-ngx-tw-button.d.ts +74 -0
  124. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
  125. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
  126. package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
  127. package/types/cdevhub-ngx-tw-card.d.ts +48 -0
  128. package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
  129. package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
  130. package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
  131. package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
  132. package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
  133. package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
  134. package/types/cdevhub-ngx-tw-core.d.ts +719 -0
  135. package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
  136. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
  137. package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
  138. package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
  139. package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
  140. package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
  141. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
  142. package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
  143. package/types/cdevhub-ngx-tw-input.d.ts +110 -0
  144. package/types/cdevhub-ngx-tw-item.d.ts +70 -0
  145. package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
  146. package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
  147. package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
  148. package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
  149. package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
  150. package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
  151. package/types/cdevhub-ngx-tw-select.d.ts +384 -0
  152. package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
  153. package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
  154. package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
  155. package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
  156. package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
  157. package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
  158. package/types/cdevhub-ngx-tw-split.d.ts +265 -0
  159. package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
  160. package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
  161. package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
  162. package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
  163. package/types/cdevhub-ngx-tw-table.d.ts +479 -0
  164. package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
  165. package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
  166. package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
  167. package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
  168. package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
  169. package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
  170. package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
  171. package/types/cdevhub-ngx-tw.d.ts +49 -0
@@ -0,0 +1,93 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Visual style of the code block container. */
4
+ type CodeBlockVariant = 'filled' | 'outlined';
5
+ /**
6
+ * Localizable strings used by the code block. Provide a partial override —
7
+ * any missing fields fall back to English defaults.
8
+ */
9
+ interface CodeBlockLabels {
10
+ /** aria-label for the copy button in its resting state. Defaults to `'Copy code'`. */
11
+ copy?: string;
12
+ /** aria-label for the copy button after a successful copy. Defaults to `'Copied'`. */
13
+ copied?: string;
14
+ /** Text passed to LiveAnnouncer after a successful copy. Defaults to `'Copied to clipboard'`. */
15
+ announcement?: string;
16
+ }
17
+ /**
18
+ * Marker directive for projected header content (e.g. filename, secondary
19
+ * actions). Sits alongside the language label inside the code block's
20
+ * header row.
21
+ *
22
+ * @remarks
23
+ * The host class (`inline-flex items-center gap-2 min-w-0`) styles the
24
+ * projected element's *own* children — e.g. a filename `<span>` next to a
25
+ * "modified" badge — and is distinct from the library's `headerStart` slot
26
+ * wrapper that contains this element. The two carry overlapping utility names
27
+ * (`items-center gap-2 min-w-0`) because both lay out flex children, but they
28
+ * apply to different DOM nodes (parent slot vs the projected element itself)
29
+ * and serve different jobs (slot row geometry vs the consumer's badge group).
30
+ */
31
+ declare class CodeBlockHeaderDirective {
32
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CodeBlockHeaderDirective, never>;
33
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CodeBlockHeaderDirective, "[twCodeBlockHeader]", never, {}, {}, never, never, true, never>;
34
+ }
35
+ /**
36
+ * Code-display surface with copy-to-clipboard, optional language label, and a
37
+ * projection slot for filename / extra actions.
38
+ *
39
+ * @remarks
40
+ * **`role="region"` ownership.** The outer host is a presentational container —
41
+ * the inner `<pre tabindex="0" role="region" aria-label="...">` owns the
42
+ * scrollable-content region semantics that screen readers and AXE care about.
43
+ * Promoting the host to `role="region"` as well would double-announce the
44
+ * landmark; the `<pre>` is the focusable, keyboard-reachable target, so the
45
+ * region role belongs there. This matches APG guidance for scroll-region
46
+ * widgets and Material's `pre`-as-region pattern.
47
+ */
48
+ declare class CodeBlockComponent {
49
+ /** The code string to display and copy to clipboard. */
50
+ readonly code: _angular_core.InputSignal<string>;
51
+ /** Optional language label displayed in the header (e.g. `'TypeScript'`, `'HTML'`). */
52
+ readonly language: _angular_core.InputSignal<string | undefined>;
53
+ /** Visual style of the container. Defaults to `'filled'`. */
54
+ readonly variant: _angular_core.InputSignal<CodeBlockVariant>;
55
+ /** When true, wraps long lines instead of horizontal scrolling. Defaults to `false`. */
56
+ readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
57
+ /**
58
+ * Localizable strings for the copy button's aria-labels and the
59
+ * screen-reader announcement. Provide a partial override; missing fields
60
+ * fall back to English defaults.
61
+ */
62
+ readonly labels: _angular_core.InputSignal<CodeBlockLabels>;
63
+ /** Fires when code is successfully copied to clipboard. */
64
+ readonly copied: _angular_core.OutputEmitterRef<void>;
65
+ /** Fires when the clipboard copy fails (e.g. user denied permission, no clipboard API available). Payload is an `Error` describing the failure. */
66
+ readonly copyFailed: _angular_core.OutputEmitterRef<Error>;
67
+ /** Whether the copy-to-clipboard button is currently in its "copied" confirmation state. Two-way bindable via `[(isCopied)]`. Set to `true` for ~2s after a successful copy, then auto-resets to `false`. Defaults to `false`. */
68
+ readonly isCopied: _angular_core.ModelSignal<boolean>;
69
+ private readonly clipboard;
70
+ private readonly liveAnnouncer;
71
+ private readonly destroyRef;
72
+ private timeoutId;
73
+ protected readonly resolvedLabels: _angular_core.Signal<{
74
+ copy: string;
75
+ copied: string;
76
+ announcement: string;
77
+ }>;
78
+ private readonly variantResult;
79
+ protected readonly rootClasses: _angular_core.Signal<string>;
80
+ protected readonly headerClasses: _angular_core.Signal<string>;
81
+ protected readonly headerStartClasses: _angular_core.Signal<string>;
82
+ protected readonly preClasses: _angular_core.Signal<string>;
83
+ protected readonly copyButtonClasses: _angular_core.Signal<string>;
84
+ protected readonly copyIconClasses: _angular_core.Signal<string>;
85
+ protected readonly preAriaLabel: _angular_core.Signal<string>;
86
+ constructor();
87
+ protected copyToClipboard(): void;
88
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CodeBlockComponent, never>;
89
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CodeBlockComponent, "tw-code-block", never, { "code": { "alias": "code"; "required": true; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "isCopied": { "alias": "isCopied"; "required": false; "isSignal": true; }; }, { "copied": "copied"; "copyFailed": "copyFailed"; "isCopied": "isCopiedChange"; }, never, ["[twCodeBlockHeader]"], true, never>;
90
+ }
91
+
92
+ export { CodeBlockComponent, CodeBlockHeaderDirective };
93
+ export type { CodeBlockLabels, CodeBlockVariant };
@@ -0,0 +1,151 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ElementRef } from '@angular/core';
3
+ import { FocusableOption } from '@angular/cdk/a11y';
4
+ import { TwColor, TwSize } from '@cdevhub/ngx-tw/core';
5
+
6
+ /** Visual style of the collapsible container. */
7
+ type CollapsibleVariant = 'default' | 'bordered' | 'ghost' | 'filled';
8
+ /** Decorative axes bundled into a single collapsible input. */
9
+ interface CollapsibleDisplay {
10
+ /** Visual style of the panel container. Defaults to `'default'`. */
11
+ variant?: CollapsibleVariant;
12
+ /** Semantic color; applies to the `bordered` and `filled` variants. Defaults to `'neutral'`. */
13
+ color?: TwColor;
14
+ /** Padding scale for the trigger and content sections. Defaults to `'md'`. */
15
+ size?: TwSize;
16
+ }
17
+ declare class CollapsibleIconDirective {
18
+ private readonly collapsible;
19
+ /** @internal */
20
+ readonly classes: _angular_core.Signal<string>;
21
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapsibleIconDirective, never>;
22
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CollapsibleIconDirective, "[twCollapsibleIcon]", never, {}, {}, never, never, true, never>;
23
+ }
24
+ /**
25
+ * Marks the toggle element inside a `<tw-collapsible>`. Apply this to a
26
+ * native `<button>`; the directive wires up ARIA, keyboard handling, and
27
+ * focus management. Custom hosts (e.g. `<div>`) are not supported.
28
+ */
29
+ declare class CollapsibleTriggerDirective implements FocusableOption {
30
+ /** @internal */
31
+ readonly collapsible: CollapsibleComponent;
32
+ readonly elementRef: ElementRef<any>;
33
+ /** @internal */
34
+ readonly classes: _angular_core.Signal<string>;
35
+ /** @internal */
36
+ readonly iconClasses: _angular_core.Signal<string>;
37
+ onClick(): void;
38
+ onKeydown(event: KeyboardEvent): void;
39
+ focus(): void;
40
+ /** @internal FocusableOption: lets FocusKeyManager skip disabled triggers. */
41
+ get disabled(): boolean;
42
+ /** @internal FocusableOption: text label for typeahead navigation. */
43
+ getLabel(): string;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapsibleTriggerDirective, never>;
45
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CollapsibleTriggerDirective, "[twCollapsibleTrigger]", never, {}, {}, never, ["*"], true, never>;
46
+ }
47
+ declare class CollapsibleComponent {
48
+ /** Unique identifier for this panel. Required when used inside a group. */
49
+ readonly value: _angular_core.InputSignal<string>;
50
+ /** Bundles decorative axes: `variant`, `color`, `size`. Accepts a partial; unset keys fall back to the defaults (`{ variant: 'default', color: 'neutral', size: 'md' }`). */
51
+ readonly display: _angular_core.InputSignal<CollapsibleDisplay>;
52
+ /** When true, the panel cannot be toggled and appears dimmed. Defaults to `false`. */
53
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
54
+ /** When true, content is rendered on first open and kept in the DOM across toggles. Defaults to `false`. */
55
+ readonly keepAlive: _angular_core.InputSignalWithTransform<boolean, unknown>;
56
+ /** Whether the panel is expanded. Two-way bindable. Defaults to `false`. */
57
+ readonly open: _angular_core.ModelSignal<boolean>;
58
+ /** Fires after the panel is toggled. Payload is the new open state. */
59
+ readonly toggled: _angular_core.OutputEmitterRef<boolean>;
60
+ /** @internal */
61
+ readonly group: CollapsibleGroupComponent | null;
62
+ private readonly liveAnnouncer;
63
+ /** @internal */
64
+ readonly customIcon: _angular_core.Signal<CollapsibleIconDirective | undefined>;
65
+ private readonly componentId;
66
+ readonly triggerId: string;
67
+ readonly panelId: string;
68
+ /**
69
+ * @internal Tracks whether the panel has been opened at least once (for keepAlive mode).
70
+ *
71
+ * Latches to `true` the first time `open` is `true` and stays `true` for the
72
+ * lifetime of the component. Implemented as a `linkedSignal` so the derivation
73
+ * lives next to the source — `activated()` reads cleanly as "derived from open".
74
+ */
75
+ readonly activated: _angular_core.WritableSignal<boolean>;
76
+ /** @internal Resolved decorative configuration. */
77
+ readonly resolvedDisplay: _angular_core.Signal<Required<CollapsibleDisplay>>;
78
+ private readonly variantResult;
79
+ readonly rootClasses: _angular_core.Signal<string>;
80
+ readonly triggerClasses: _angular_core.Signal<string>;
81
+ readonly iconClasses: _angular_core.Signal<string>;
82
+ readonly contentClasses: _angular_core.Signal<string>;
83
+ readonly contentWrapperClasses: _angular_core.Signal<string>;
84
+ /** @internal Toggle the open state. Called by the trigger directive. */
85
+ toggle(): void;
86
+ /** @internal Set the open state programmatically (used by group). */
87
+ setOpen(value: boolean): void;
88
+ /** @internal */
89
+ announceState(isOpen: boolean): void;
90
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapsibleComponent, never>;
91
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CollapsibleComponent, "tw-collapsible", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "keepAlive": { "alias": "keepAlive"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "toggled": "toggled"; }, ["customIcon"], ["[twCollapsibleTrigger]", "*"], true, never>;
92
+ }
93
+ declare class CollapsibleGroupComponent {
94
+ /**
95
+ * When true, only one panel can be open at a time.
96
+ *
97
+ * `AccordionComponent` (subclass) ignores this input and drives the same
98
+ * behaviour from its own `type` input via the `isAccordionMode()` /
99
+ * `canCollapseSingleMode()` virtual hooks below. Consumers using
100
+ * `<tw-collapsible-group>` directly should bind this input; consumers using
101
+ * `<tw-accordion>` should bind `type="single"` / `type="multiple"` instead.
102
+ *
103
+ * Defaults to `false`.
104
+ */
105
+ readonly accordion: _angular_core.InputSignalWithTransform<boolean, unknown>;
106
+ /** The value(s) of currently open panels. String in accordion mode, string array in independent mode. `null` when no panel is open in accordion mode. Two-way bindable. Defaults to `null`. */
107
+ readonly value: _angular_core.ModelSignal<string | string[] | null>;
108
+ /**
109
+ * @internal Wrapper `role` attribute. Subclasses may override (e.g.
110
+ * `AccordionComponent` returns `null` per APG — accordions don't carry
111
+ * `role="group"`).
112
+ */
113
+ readonly hostRole: _angular_core.Signal<string | null>;
114
+ /**
115
+ * @internal Host class string. Subclasses may override to provide their own
116
+ * variant-driven string (e.g. `AccordionComponent.rootClasses`).
117
+ */
118
+ readonly hostClasses: _angular_core.Signal<string>;
119
+ /** @internal */
120
+ readonly items: _angular_core.Signal<readonly CollapsibleComponent[]>;
121
+ /** @internal */
122
+ readonly triggers: _angular_core.Signal<readonly CollapsibleTriggerDirective[]>;
123
+ private keyManager;
124
+ /**
125
+ * @internal Whether the group is in single-open-panel mode.
126
+ *
127
+ * Subclasses override to bridge their own input surface (e.g. `AccordionComponent`
128
+ * returns `this.type() === 'single'`). All internal toggle/sync/warn logic reads
129
+ * the mode through this hook, never `accordion()` directly — that lets the
130
+ * subclass drive mode from `type` without redeclaring the parent's signal input.
131
+ */
132
+ protected isAccordionMode(): boolean;
133
+ /**
134
+ * @internal Whether re-clicking the open panel in single mode closes it.
135
+ *
136
+ * Defaults to `true` for the bare group component (re-clicking always closes).
137
+ * `AccordionComponent` overrides to honour its `collapsible` opt-out input.
138
+ */
139
+ protected canCollapseSingleMode(): boolean;
140
+ constructor();
141
+ private syncChildrenFromValue;
142
+ /** @internal Called by a child collapsible when it is toggled. */
143
+ toggleItem(item: CollapsibleComponent): void;
144
+ /** @internal Handle keyboard navigation within the group. */
145
+ onTriggerKeydown(event: KeyboardEvent): void;
146
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CollapsibleGroupComponent, never>;
147
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CollapsibleGroupComponent, "tw-collapsible-group", never, { "accordion": { "alias": "accordion"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["items", "triggers"], ["*"], true, never>;
148
+ }
149
+
150
+ export { CollapsibleComponent, CollapsibleGroupComponent, CollapsibleIconDirective, CollapsibleTriggerDirective };
151
+ export type { CollapsibleDisplay, CollapsibleVariant };
@@ -0,0 +1,389 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnInit, Signal, TemplateRef } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
4
+ import { TwSize, TwColor, ErrorStateMatcher } from '@cdevhub/ngx-tw/core';
5
+ import { FormFieldControl } from '@cdevhub/ngx-tw/form-field';
6
+
7
+ /** Canonical option shape for `tw-combobox`. Consumers using arbitrary records override the accessor inputs instead. */
8
+ interface TwComboboxOption<T> {
9
+ /** Visible label. Used by the default filter and trigger render. */
10
+ label: string;
11
+ /** Value emitted via `valueCommit` / `optionSelected` when this option is picked. */
12
+ value: T;
13
+ /** When true, the option cannot be highlighted, selected, or matched by the resolver. */
14
+ disabled?: boolean;
15
+ /** Optional group label. Options sharing a group render under a labelled `role="group"` region. */
16
+ group?: string;
17
+ /** Optional secondary description rendered under the label in the default option row. */
18
+ description?: string;
19
+ }
20
+ /** Discriminator for the origin of a `valueCommit` emission. */
21
+ type TwComboboxValueSource = 'option' | 'free-text' | 'reset' | 'programmatic';
22
+ /** Filter callback applied to `options` whenever `inputValue` changes. Return `true` to keep the option visible. */
23
+ type TwComboboxFilterFn = (option: unknown, query: string) => boolean;
24
+ /** Payload of the `optionSelected` output. */
25
+ interface TwComboboxOptionSelectedEvent<T> {
26
+ /** The raw option object (or arbitrary record when accessors are overridden). */
27
+ option: unknown;
28
+ /** Resolved value from `optionValue`. */
29
+ value: T;
30
+ /** Resolved label from `optionLabel`. */
31
+ label: string;
32
+ }
33
+ /** Payload of the `valueCommit` output. Distinguishes selection / free-text / reset / programmatic. */
34
+ interface TwComboboxValueCommitEvent<T> {
35
+ /** The committed value. */
36
+ value: T | string | null;
37
+ /** What triggered the commit. */
38
+ source: TwComboboxValueSource;
39
+ }
40
+ /** Payload of the `openedChange` output. */
41
+ interface TwComboboxOpenedEvent {
42
+ /** Whether the popover is now open. */
43
+ open: boolean;
44
+ /** The combobox input element. */
45
+ trigger: HTMLElement;
46
+ }
47
+ /** Template context passed to `*twComboboxOption` consumer templates. */
48
+ interface TwComboboxOptionContext<T, O = TwComboboxOption<T>> {
49
+ /** Raw option object (or arbitrary record). */
50
+ $implicit: O;
51
+ /** Same as `$implicit`, named for clarity. */
52
+ option: O;
53
+ /** Resolved label. */
54
+ label: string;
55
+ /** Resolved value. */
56
+ value: T;
57
+ /** Whether this option is the currently committed selection. */
58
+ selected: boolean;
59
+ /** Whether this option is the active descendant (keyboard highlight). */
60
+ active: boolean;
61
+ /** Whether this option is disabled. */
62
+ disabled: boolean;
63
+ /** Index within the visible (filtered) options. */
64
+ index: number;
65
+ }
66
+ /** Internal: resolved option view pairing the raw option with its derived fields. */
67
+ interface ComboboxVisibleOption<T> {
68
+ readonly option: unknown;
69
+ readonly label: string;
70
+ readonly value: T;
71
+ readonly disabled: boolean;
72
+ readonly group?: string;
73
+ readonly description?: string;
74
+ }
75
+ /** Internal rendered-row discriminated union — either a group header or an option row. */
76
+ type ComboboxRenderedRow<T> = {
77
+ readonly kind: 'group';
78
+ readonly group: string;
79
+ } | {
80
+ readonly kind: 'option';
81
+ readonly option: ComboboxVisibleOption<T>;
82
+ readonly index: number;
83
+ };
84
+
85
+ /** Structural directive projecting a custom template for each option row. Context: `TwComboboxOptionContext<T>`. */
86
+ declare class ComboboxOptionTemplateDirective<T = unknown, O = unknown> {
87
+ /** @internal */
88
+ readonly templateRef: TemplateRef<any>;
89
+ /** @internal */
90
+ static ngTemplateContextGuard<T, O>(_dir: ComboboxOptionTemplateDirective<T, O>, _ctx: unknown): _ctx is TwComboboxOptionContext<T, O>;
91
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxOptionTemplateDirective<any, any>, never>;
92
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ComboboxOptionTemplateDirective<any, any>, "[twComboboxOption]", never, {}, {}, never, never, true, never>;
93
+ }
94
+ /** Structural directive projecting a custom template for the empty-results state. Context: `{ $implicit: query }`. */
95
+ declare class ComboboxEmptyTemplateDirective {
96
+ /** @internal */
97
+ readonly templateRef: TemplateRef<any>;
98
+ /** @internal */
99
+ static ngTemplateContextGuard(_dir: ComboboxEmptyTemplateDirective, _ctx: unknown): _ctx is {
100
+ $implicit: string;
101
+ };
102
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxEmptyTemplateDirective, never>;
103
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ComboboxEmptyTemplateDirective, "[twComboboxEmpty]", never, {}, {}, never, never, true, never>;
104
+ }
105
+ /** Structural directive projecting a custom template above the list while `loading=true`. */
106
+ declare class ComboboxLoadingTemplateDirective {
107
+ /** @internal */
108
+ readonly templateRef: TemplateRef<any>;
109
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxLoadingTemplateDirective, never>;
110
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ComboboxLoadingTemplateDirective, "[twComboboxLoading]", never, {}, {}, never, never, true, never>;
111
+ }
112
+ /** Attribute directive marking a leading adornment projected inside the input row. */
113
+ declare class ComboboxPrefixDirective {
114
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxPrefixDirective, never>;
115
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ComboboxPrefixDirective, "[twComboboxPrefix]", never, {}, {}, never, never, true, never>;
116
+ }
117
+ /** Attribute directive marking a trailing adornment projected inside the input row, before the clear button. */
118
+ declare class ComboboxSuffixDirective {
119
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxSuffixDirective, never>;
120
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ComboboxSuffixDirective, "[twComboboxSuffix]", never, {}, {}, never, never, true, never>;
121
+ }
122
+ /**
123
+ * Editable single-select typeahead form control. Follows the WAI-ARIA 1.2
124
+ * combobox + listbox pattern with `aria-activedescendant` (DOM focus stays
125
+ * on the `<input>`). Supports local filtering, async result streams via
126
+ * `queryChange`, grouped options, strict and free-text modes, and full
127
+ * integration with template-driven, reactive, and signal forms plus
128
+ * `tw-form-field`.
129
+ */
130
+ declare class ComboboxComponent<T = unknown> implements ControlValueAccessor, FormFieldControl<T | string | null>, OnInit {
131
+ /** Array of options to render in the popover. Accepts plain records or `TwComboboxOption<T>`. */
132
+ readonly options: _angular_core.InputSignal<readonly unknown[]>;
133
+ /** Accessor returning the visible label for an option. Used by the default filter and the trigger label resolver. */
134
+ readonly optionLabel: _angular_core.InputSignal<(option: unknown) => string>;
135
+ /** Accessor returning the value emitted via `valueCommit` when this option is picked. */
136
+ readonly optionValue: _angular_core.InputSignal<(option: unknown) => T>;
137
+ /** Accessor returning whether an option is non-interactive. */
138
+ readonly optionDisabled: _angular_core.InputSignal<(option: unknown) => boolean>;
139
+ /** Accessor returning a group label. Options sharing a group render under a labelled `role="group"` region. */
140
+ readonly optionGroup: _angular_core.InputSignal<(option: unknown) => string | undefined>;
141
+ /** Accessor returning an optional secondary description rendered under the label in the default option row. */
142
+ readonly optionDescription: _angular_core.InputSignal<(option: unknown) => string | undefined>;
143
+ /** Filter function applied client-side whenever `inputValue` changes. Pass `null` to disable client filtering (async mode). Defaults to case-insensitive `startsWith` on the label. */
144
+ readonly filterFn: _angular_core.InputSignal<((option: unknown, query: string) => boolean) | null>;
145
+ /** When `true`, free-text commits are rejected — the input reverts to the last committed label on blur. */
146
+ readonly strict: _angular_core.InputSignal<boolean>;
147
+ /** Placeholder shown when the input is empty. */
148
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
149
+ /** Disables the input and prevents the popover from opening. */
150
+ readonly disabledInput: _angular_core.InputSignal<boolean>;
151
+ /** Sets `aria-required="true"` on the input. */
152
+ readonly requiredInput: _angular_core.InputSignal<boolean>;
153
+ /** Controls trigger padding and font size per the inline padding scale. */
154
+ readonly size: _angular_core.InputSignal<TwSize>;
155
+ /** Semantic color for the focus ring. */
156
+ readonly color: _angular_core.InputSignal<TwColor>;
157
+ /** Whether the trailing chevron affordance is rendered. */
158
+ readonly showChevron: _angular_core.InputSignal<boolean>;
159
+ /** Whether the inline clear (×) button appears while `inputValue` is non-empty. */
160
+ readonly clearable: _angular_core.InputSignal<boolean>;
161
+ /** When `true`, shows an in-popover spinner and an inline spinner in the trigger while the popover is open. */
162
+ readonly loading: _angular_core.InputSignal<boolean>;
163
+ /** Debounce window (ms) before `queryChange` emits. Local filtering is not debounced. */
164
+ readonly queryDebounce: _angular_core.InputSignal<number>;
165
+ /** Minimum query length before the popover opens automatically. `0` opens on focus. */
166
+ readonly minQueryLength: _angular_core.InputSignal<number>;
167
+ /** Whether the popover opens automatically when the input receives focus. */
168
+ readonly openOnFocus: _angular_core.InputSignal<boolean>;
169
+ /** Maximum height (px) of the popover scroll region. */
170
+ readonly panelMaxHeight: _angular_core.InputSignal<number>;
171
+ /** Overlay width strategy. `'trigger'` matches input width; `'auto'` lets content decide; a number is applied as px; a string is passed as a CSS length. */
172
+ readonly panelWidth: _angular_core.InputSignal<string | number>;
173
+ /** Extra class(es) appended to the overlay panel for consumer customization. */
174
+ readonly panelClass: _angular_core.InputSignal<string | readonly string[]>;
175
+ /** CDK overlay scroll strategy. */
176
+ readonly scrollStrategy: _angular_core.InputSignal<"reposition" | "close" | "block">;
177
+ /** Pixel offset between the input and the popover. */
178
+ readonly offset: _angular_core.InputSignal<number>;
179
+ /** Fallback empty-state message when no `*twComboboxEmpty` template is projected. */
180
+ readonly emptyMessage: _angular_core.InputSignal<string>;
181
+ /** Equality comparator used to reconcile `value` with options during `writeValue`. */
182
+ readonly compareWith: _angular_core.InputSignal<(a: T, b: T) => boolean>;
183
+ /** Accessible name for the combobox input. */
184
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
185
+ /** ID of an external label element. */
186
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
187
+ /** ID of an external descriptor element. */
188
+ readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
189
+ /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the combobox uses the `TW_ERROR_STATE_MATCHER` token's value. */
190
+ readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
191
+ /** Two-way bound committed value. May be an option's value (`T`), a typed string (free-text mode), or `null`. */
192
+ readonly value: _angular_core.ModelSignal<string | T | null>;
193
+ /** Two-way bound visible text in the input. Bound separately from `value` so async consumers can drive the query. */
194
+ readonly inputValue: _angular_core.ModelSignal<string>;
195
+ /** Two-way bound open state of the popover. */
196
+ readonly open: _angular_core.ModelSignal<boolean>;
197
+ /** Fires after the query text changes, debounced by `queryDebounce`. Async-mode consumers subscribe to this to fetch results. */
198
+ readonly queryChange: _angular_core.OutputEmitterRef<string>;
199
+ /** Fires when the user picks an option from the list (not on free-text commit). */
200
+ readonly optionSelected: _angular_core.OutputEmitterRef<TwComboboxOptionSelectedEvent<T>>;
201
+ /** Fires whenever `value` changes, with a `source` discriminator distinguishing option / free-text / reset / programmatic origin. */
202
+ readonly valueCommit: _angular_core.OutputEmitterRef<TwComboboxValueCommitEvent<T>>;
203
+ /** Fires when the popover opens or closes. */
204
+ readonly openedChange: _angular_core.OutputEmitterRef<TwComboboxOpenedEvent>;
205
+ /** @internal */
206
+ readonly optionTemplateChild: Signal<ComboboxOptionTemplateDirective<any, any> | undefined>;
207
+ /** @internal */
208
+ readonly emptyTemplateChild: Signal<ComboboxEmptyTemplateDirective | undefined>;
209
+ /** @internal */
210
+ readonly loadingTemplateChild: Signal<ComboboxLoadingTemplateDirective | undefined>;
211
+ private readonly inputRef;
212
+ private readonly triggerSurfaceRef;
213
+ private readonly overlayService;
214
+ private readonly elementRef;
215
+ private readonly viewContainerRef;
216
+ private readonly injector;
217
+ private readonly destroyRef;
218
+ private readonly focusMonitor;
219
+ private readonly liveAnnouncer;
220
+ private readonly platform;
221
+ private readonly formField;
222
+ private readonly ngControl;
223
+ private readonly parentForm;
224
+ private readonly parentFormGroup;
225
+ private readonly defaultMatcher;
226
+ private readonly uid;
227
+ /** @internal */
228
+ readonly hostId: string;
229
+ /** @internal */
230
+ readonly listboxId: string;
231
+ /** @internal */
232
+ readonly optionId: (index: number) => string;
233
+ /** @internal */
234
+ readonly groupHeaderId: (group: string) => string;
235
+ /** @internal */
236
+ readonly composing: _angular_core.WritableSignal<boolean>;
237
+ /** @internal */
238
+ readonly focusedSignal: _angular_core.WritableSignal<boolean>;
239
+ private readonly cvaDisabled;
240
+ private readonly _ngControlRev;
241
+ private readonly _formSubmitRev;
242
+ private readonly describedByIdsSignal;
243
+ private readonly labelledByIdsSignal;
244
+ /** @internal */
245
+ readonly lastCommittedLabel: _angular_core.WritableSignal<string>;
246
+ private readonly pendingWriteValue;
247
+ private readonly closingSignal;
248
+ /** Re-runs the input handler once after IME composition ends. */
249
+ private composingPendingValue;
250
+ private onChange;
251
+ private onTouched;
252
+ private overlayRef;
253
+ private readonly overlayInstanceSignal;
254
+ private closeTimer;
255
+ private queryDebounceTimer;
256
+ private announceTimer;
257
+ private resizeObserver;
258
+ private get overlayInstance();
259
+ /** @internal */
260
+ readonly isDisabled: Signal<boolean>;
261
+ /** @internal Auto-naked when wrapped in tw-form-field. */
262
+ readonly naked: Signal<boolean>;
263
+ /** @internal Resolved visible options (after filter, with derived view fields). */
264
+ readonly visibleOptions: Signal<readonly ComboboxVisibleOption<T>[]>;
265
+ /** @internal Rendered rows (group headers + option rows). */
266
+ readonly renderedRows: Signal<readonly ComboboxRenderedRow<T>[]>;
267
+ /** Returns the index of the first enabled option, or -1 when none. */
268
+ private firstEnabledIndex;
269
+ /** Returns the index of the last enabled option, or -1 when none. */
270
+ private lastEnabledIndex;
271
+ /** @internal Active descendant index, resets to the first enabled when the visible list changes. */
272
+ readonly activeIndex: _angular_core.WritableSignal<number>;
273
+ /** @internal */
274
+ readonly activeOption: Signal<ComboboxVisibleOption<T> | null>;
275
+ /** @internal */
276
+ readonly activeOptionId: Signal<string | null>;
277
+ /** @internal */
278
+ readonly isEmpty: Signal<boolean>;
279
+ /** @internal */
280
+ readonly showClearButton: Signal<boolean>;
281
+ /** @internal */
282
+ readonly showSpinner: Signal<boolean>;
283
+ /** @internal */
284
+ readonly resolvedDescribedBy: Signal<string>;
285
+ /** @internal */
286
+ readonly resolvedLabelledBy: Signal<string>;
287
+ /** @internal Error-state per the configured `ErrorStateMatcher`. Reads the bound `NgControl.invalid` through the matcher. */
288
+ readonly errorState: Signal<boolean>;
289
+ private readonly variantResult;
290
+ /** @internal */
291
+ readonly rootClasses: Signal<string>;
292
+ /** @internal */
293
+ readonly triggerClasses: Signal<string>;
294
+ /** @internal */
295
+ readonly inputClasses: Signal<string>;
296
+ /** @internal */
297
+ readonly clearButtonClasses: Signal<string>;
298
+ /** @internal */
299
+ readonly chevronClasses: Signal<string>;
300
+ /** @internal */
301
+ readonly spinnerClasses: Signal<string>;
302
+ /** @internal */
303
+ readonly id: Signal<string>;
304
+ /** @internal */
305
+ readonly focused: Signal<boolean>;
306
+ /** @internal */
307
+ readonly empty: Signal<boolean>;
308
+ /** @internal */
309
+ readonly disabled: Signal<boolean>;
310
+ /** @internal */
311
+ readonly required: Signal<boolean>;
312
+ /** @internal */
313
+ readonly controlType = "combobox";
314
+ /** @internal */
315
+ readonly userAriaDescribedBy: Signal<string | undefined>;
316
+ /** @internal */
317
+ readonly userAriaLabelledby: Signal<string | undefined>;
318
+ constructor();
319
+ /** Opens the popover. No-op when disabled or already open. */
320
+ openPanel(): void;
321
+ /** Closes the popover. No-op when already closed. */
322
+ closePanel(): void;
323
+ /** Programmatically focuses the input. */
324
+ focus(): void;
325
+ /** @internal */
326
+ isVisibleOptionSelected(index: number): boolean;
327
+ /** @internal */
328
+ onInput(event: Event): void;
329
+ /** @internal */
330
+ onCompositionStart(): void;
331
+ /** @internal */
332
+ onCompositionEnd(event: CompositionEvent): void;
333
+ /** @internal */
334
+ onFocus(): void;
335
+ /** @internal */
336
+ onBlur(): void;
337
+ /** @internal */
338
+ onKeydown(event: KeyboardEvent): void;
339
+ /** @internal — preventDefault to keep DOM focus on the input. */
340
+ onClearMousedown(event: MouseEvent): void;
341
+ /** @internal */
342
+ onClearClick(event: MouseEvent): void;
343
+ /** Clears the input and committed value, emitting `valueCommit({ source: 'reset' })`. */
344
+ clear(): void;
345
+ private moveActive;
346
+ private moveActiveTo;
347
+ private scrollActiveIntoView;
348
+ /** @internal */
349
+ commit(source: 'enter' | 'blur' | 'tab'): void;
350
+ /** @internal */
351
+ commitOption(option: ComboboxVisibleOption<T>, source: 'option'): void;
352
+ private scheduleQueryEmit;
353
+ private clearQueryDebounceTimer;
354
+ private clearAnnounceTimer;
355
+ private openOverlay;
356
+ private closeOverlay;
357
+ private ensureOverlay;
358
+ private installResizeObserver;
359
+ private updateOverlaySize;
360
+ private attachOverlayComponent;
361
+ private subscribeBackdrop;
362
+ /**
363
+ * Listens for `Escape` on the overlay's `keydownEvents()`. Mirrors
364
+ * `SelectComponent` so focus inside the overlay panel (e.g., if the user
365
+ * tabs into projected loading/empty templates) still dismisses cleanly.
366
+ * The combobox's own `<input>` keydown handler already short-circuits
367
+ * Escape when focus is on the input; this layer is the safety net for
368
+ * panel-internal focus.
369
+ */
370
+ private subscribeOverlayEscape;
371
+ private resolvePanelClass;
372
+ private clearCloseTimer;
373
+ writeValue(value: T | string | null): void;
374
+ registerOnChange(fn: (value: T | string | null) => void): void;
375
+ registerOnTouched(fn: () => void): void;
376
+ setDisabledState(isDisabled: boolean): void;
377
+ /** @internal */
378
+ setDescribedByIds(ids: string[]): void;
379
+ /** @internal */
380
+ setLabelledByIds(ids: string[]): void;
381
+ /** @internal */
382
+ onContainerClick(_event: MouseEvent): void;
383
+ ngOnInit(): void;
384
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxComponent<any>, never>;
385
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ComboboxComponent<any>, "tw-combobox", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; "isSignal": true; }; "optionGroup": { "alias": "optionGroup"; "required": false; "isSignal": true; }; "optionDescription": { "alias": "optionDescription"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "strict": { "alias": "strict"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "requiredInput": { "alias": "required"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "queryDebounce": { "alias": "queryDebounce"; "required": false; "isSignal": true; }; "minQueryLength": { "alias": "minQueryLength"; "required": false; "isSignal": true; }; "openOnFocus": { "alias": "openOnFocus"; "required": false; "isSignal": true; }; "panelMaxHeight": { "alias": "panelMaxHeight"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "scrollStrategy": { "alias": "scrollStrategy"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "inputValue": { "alias": "inputValue"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "inputValue": "inputValueChange"; "open": "openChange"; "queryChange": "queryChange"; "optionSelected": "optionSelected"; "valueCommit": "valueCommit"; "openedChange": "openedChange"; }, ["optionTemplateChild", "emptyTemplateChild", "loadingTemplateChild"], ["[twComboboxPrefix]", "[twComboboxSuffix]", "*"], true, never>;
386
+ }
387
+
388
+ export { ComboboxComponent, ComboboxEmptyTemplateDirective, ComboboxLoadingTemplateDirective, ComboboxOptionTemplateDirective, ComboboxPrefixDirective, ComboboxSuffixDirective };
389
+ export type { TwComboboxFilterFn, TwComboboxOpenedEvent, TwComboboxOption, TwComboboxOptionContext, TwComboboxOptionSelectedEvent, TwComboboxValueCommitEvent, TwComboboxValueSource };