@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,384 @@
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. Consumers using arbitrary objects override the accessor inputs instead. */
8
+ interface TwSelectOption<T> {
9
+ /** Visible label. */
10
+ label: string;
11
+ /** Value emitted via `value` / `valueChange`. */
12
+ value: T;
13
+ /** When true, the option cannot be focused or selected. */
14
+ disabled?: boolean;
15
+ /** Optional group name. Options sharing a group render under a labelled `role="group"` region. */
16
+ group?: string;
17
+ }
18
+ /** Visual style of the select trigger. */
19
+ type SelectVariant = 'default' | 'naked';
20
+ /** Origin of a selection change, used to distinguish user input from programmatic writes. */
21
+ type TwSelectSelectionSource = 'user' | 'reset' | 'programmatic';
22
+ /** Emitted by `selectionChange`. Generic over the option-value type. */
23
+ interface TwSelectSelectionChangeEvent<T> {
24
+ /** The current value. `null` when single-select has no selection; `T[]` in multi-select (possibly empty). */
25
+ value: T | readonly T[] | null;
26
+ /** The previous value, before this change. */
27
+ previousValue: T | readonly T[] | null;
28
+ /** Values newly added to the selection. Always empty when `source: 'reset'`. */
29
+ added: readonly T[];
30
+ /** Values removed from the selection. */
31
+ removed: readonly T[];
32
+ /** What triggered the change. */
33
+ source: TwSelectSelectionSource;
34
+ }
35
+ /** Emitted by `openedChange`. */
36
+ interface TwSelectOpenedEvent {
37
+ /** Whether the panel is now open. */
38
+ open: boolean;
39
+ /** The combobox trigger element — handy when coordinating multiple open panels. */
40
+ trigger: HTMLElement;
41
+ }
42
+ /** Emitted by `searchChange`. */
43
+ interface TwSelectSearchEvent {
44
+ /** The current search text passed to `filterPredicate`. */
45
+ search: string;
46
+ /** Number of options currently visible after filtering. */
47
+ visibleCount: number;
48
+ }
49
+ /** Context provided to an `*twSelectOption` template. */
50
+ interface TwSelectOptionContext<T, O = TwSelectOption<T>> {
51
+ /** The raw option object (or arbitrary record when using accessors). */
52
+ $implicit: O;
53
+ /** Resolved label from `optionLabel`. */
54
+ label: string;
55
+ /** Resolved value from `optionValue`. */
56
+ value: T;
57
+ /** Whether this option is currently selected. */
58
+ selected: boolean;
59
+ /** Whether this option is the active-descendant for keyboard nav. */
60
+ active: boolean;
61
+ /** Whether this option is disabled. */
62
+ disabled: boolean;
63
+ /** Index within `visibleOptions()`. */
64
+ index: number;
65
+ }
66
+ /** Context provided to a `*twSelectTrigger` template. */
67
+ interface TwSelectTriggerContext<T, O = TwSelectOption<T>> {
68
+ /** The current value. */
69
+ $implicit: T | readonly T[] | null;
70
+ /** Whether the panel is open. */
71
+ open: boolean;
72
+ /** Whether the current value is empty. */
73
+ empty: boolean;
74
+ /** The resolved option objects for the current value. */
75
+ selectedOptions: readonly O[];
76
+ }
77
+ /** Rendered row in the panel — either a group-label header or an option. */
78
+ type SelectRenderedRow<T, O = unknown> = {
79
+ readonly kind: 'group-label';
80
+ readonly group: string;
81
+ } | {
82
+ readonly kind: 'option';
83
+ readonly option: O;
84
+ readonly index: number;
85
+ readonly group?: string;
86
+ };
87
+ /** Internal: resolved option view paired with its position in `visibleOptions()`. */
88
+ interface SelectVisibleOption<T, O = unknown> {
89
+ readonly option: O;
90
+ readonly label: string;
91
+ readonly value: T;
92
+ readonly disabled: boolean;
93
+ readonly group?: string;
94
+ }
95
+ /** Structural directive projecting a custom template for each option in the panel. */
96
+ declare class SelectOptionTemplateDirective<T = unknown, O = TwSelectOption<T>> {
97
+ /** @internal */
98
+ readonly templateRef: TemplateRef<any>;
99
+ /** @internal Enables strict typing of `let-` bindings in the template. */
100
+ static ngTemplateContextGuard<T, O>(_dir: SelectOptionTemplateDirective<T, O>, _ctx: unknown): _ctx is TwSelectOptionContext<T, O>;
101
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectOptionTemplateDirective<any, any>, never>;
102
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectOptionTemplateDirective<any, any>, "[twSelectOption]", never, {}, {}, never, never, true, never>;
103
+ }
104
+ /** Structural directive projecting a custom template for the select's trigger content. */
105
+ declare class SelectTriggerTemplateDirective<T = unknown, O = TwSelectOption<T>> {
106
+ /** @internal */
107
+ readonly templateRef: TemplateRef<any>;
108
+ /** @internal */
109
+ static ngTemplateContextGuard<T, O>(_dir: SelectTriggerTemplateDirective<T, O>, _ctx: unknown): _ctx is TwSelectTriggerContext<T, O>;
110
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectTriggerTemplateDirective<any, any>, never>;
111
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectTriggerTemplateDirective<any, any>, "[twSelectTrigger]", never, {}, {}, never, never, true, never>;
112
+ }
113
+ /** Structural directive projecting a custom template for the panel's empty state. */
114
+ declare class SelectEmptyTemplateDirective {
115
+ /** @internal */
116
+ readonly templateRef: TemplateRef<any>;
117
+ /** @internal */
118
+ static ngTemplateContextGuard(_dir: SelectEmptyTemplateDirective, _ctx: unknown): _ctx is {
119
+ $implicit: string;
120
+ };
121
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectEmptyTemplateDirective, never>;
122
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectEmptyTemplateDirective, "[twSelectEmpty]", never, {}, {}, never, never, true, never>;
123
+ }
124
+ /** Structural directive projecting a custom header at the top of the panel. */
125
+ declare class SelectHeaderTemplateDirective {
126
+ /** @internal */
127
+ readonly templateRef: TemplateRef<any>;
128
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectHeaderTemplateDirective, never>;
129
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectHeaderTemplateDirective, "[twSelectHeader]", never, {}, {}, never, never, true, never>;
130
+ }
131
+ /** Structural directive projecting a custom footer at the bottom of the panel. */
132
+ declare class SelectFooterTemplateDirective {
133
+ /** @internal */
134
+ readonly templateRef: TemplateRef<any>;
135
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectFooterTemplateDirective, never>;
136
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectFooterTemplateDirective, "[twSelectFooter]", never, {}, {}, never, never, true, never>;
137
+ }
138
+ /**
139
+ * ARIA combobox with listbox popup. Supports single/multi selection, in-panel
140
+ * search filtering, custom option/trigger templates, and full integration with
141
+ * Angular forms (reactive, template-driven, signal-forms) plus `tw-form-field`.
142
+ */
143
+ declare class SelectComponent<T = unknown> implements ControlValueAccessor, FormFieldControl<T | readonly T[]>, OnInit {
144
+ /** Array of options to render in the panel. Accepts either `TwSelectOption<T>` objects or arbitrary records read via the accessor inputs. Defaults to an empty array. */
145
+ readonly options: _angular_core.InputSignal<readonly unknown[]>;
146
+ /** Accessor returning the visible label for an option. Override when passing arbitrary objects. */
147
+ readonly optionLabel: _angular_core.InputSignal<(option: unknown) => string>;
148
+ /** Accessor returning the value for an option. The result is what `value` / `valueChange` emit. */
149
+ readonly optionValue: _angular_core.InputSignal<(option: unknown) => T>;
150
+ /** Accessor returning the disabled state for an option. Defaults to reading `.disabled`. */
151
+ readonly optionDisabled: _angular_core.InputSignal<(option: unknown) => boolean>;
152
+ /** Accessor returning the group name for an option. Options sharing a group render under a labelled `role="group"` region. */
153
+ readonly optionGroup: _angular_core.InputSignal<(option: unknown) => string | undefined>;
154
+ /** When true, enables multi-selection. The `value` model becomes a `T[]` and the panel renders checkable options. Defaults to `false`. */
155
+ readonly multiple: _angular_core.InputSignal<boolean>;
156
+ /** When true, renders a search input at the top of the panel that filters options using `filterPredicate`. Defaults to `false`. */
157
+ readonly searchable: _angular_core.InputSignal<boolean>;
158
+ /** Custom filter function for the search input. Defaults to a case-insensitive substring match on the option label. */
159
+ readonly filterPredicate: _angular_core.InputSignal<(option: unknown, search: string) => boolean>;
160
+ /** Placeholder text shown in the trigger when no value is selected. */
161
+ readonly placeholder: _angular_core.InputSignal<string | undefined>;
162
+ /** When true, the trigger cannot be activated and the panel cannot open. Defaults to `false`. */
163
+ readonly disabledInput: _angular_core.InputSignal<boolean>;
164
+ /** When true, exposes `aria-required="true"` on the trigger. Defaults to `false`. */
165
+ readonly requiredInput: _angular_core.InputSignal<boolean>;
166
+ /** Controls trigger padding, font size, and panel option density. Defaults to `'md'`. */
167
+ readonly size: _angular_core.InputSignal<TwSize>;
168
+ /** Semantic color for focused trigger border, active-option background, and checkmarks. Defaults to `'primary'`. */
169
+ readonly color: _angular_core.InputSignal<TwColor>;
170
+ /** Visual style of the trigger. When inside a `tw-form-field` and left unset, auto-resolves to `'naked'`. Otherwise defaults to `'default'`. */
171
+ readonly variant: _angular_core.InputSignal<SelectVariant | undefined>;
172
+ /** Overlay panel width. `'trigger'` matches the trigger's measured width; `'auto'` lets content decide; a number is applied as pixels; a string is passed through as a CSS length. Defaults to `'trigger'`. */
173
+ readonly panelWidth: _angular_core.InputSignal<string | number>;
174
+ /** Extra class(es) applied to the overlay panel element. */
175
+ readonly panelClass: _angular_core.InputSignal<string | readonly string[]>;
176
+ /** Maximum height of the listbox scroll region in pixels. Defaults to `256`. */
177
+ readonly panelMaxHeight: _angular_core.InputSignal<number>;
178
+ /** Whether the panel closes after a selection is made. When unset, resolves to `true` for single-select and `false` for multi-select. */
179
+ readonly closeOnSelect: _angular_core.InputSignal<boolean | undefined>;
180
+ /** CDK scroll strategy for the overlay. Defaults to `'reposition'`. */
181
+ readonly scrollStrategy: _angular_core.InputSignal<"reposition" | "close" | "block">;
182
+ /** Pixel distance between trigger and panel. Defaults to `4`. */
183
+ readonly offset: _angular_core.InputSignal<number>;
184
+ /** Fallback message rendered when the filter yields no options and no `*twSelectEmpty` template is provided. */
185
+ readonly emptyMessage: _angular_core.InputSignal<string>;
186
+ /** Accessible name for the combobox trigger. */
187
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
188
+ /** ID of an external element that labels the combobox. */
189
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
190
+ /** ID of an external element that describes the combobox. */
191
+ readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
192
+ /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the select uses the `TW_ERROR_STATE_MATCHER` token's value. */
193
+ readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
194
+ /** Equality comparator for option values. Defaults to `Object.is`. */
195
+ readonly compareWith: _angular_core.InputSignal<(a: T, b: T) => boolean>;
196
+ /** Two-way bound selected value(s). Single-select: `T | null`. Multi-select: `T[]`. */
197
+ readonly value: _angular_core.ModelSignal<T | readonly T[] | null>;
198
+ /** Two-way bound open state of the panel. */
199
+ readonly open: _angular_core.ModelSignal<boolean>;
200
+ /** Fires when the panel's visibility finishes changing. */
201
+ readonly openedChange: _angular_core.OutputEmitterRef<TwSelectOpenedEvent>;
202
+ /** Fires after any selection change, with `added`, `removed`, `previousValue`, and a `source` discriminator. */
203
+ readonly selectionChange: _angular_core.OutputEmitterRef<TwSelectSelectionChangeEvent<T>>;
204
+ /** Fires whenever the search input changes (only when `searchable` is true). */
205
+ readonly searchChange: _angular_core.OutputEmitterRef<TwSelectSearchEvent>;
206
+ /** @internal */
207
+ readonly triggerTemplateChild: Signal<SelectTriggerTemplateDirective<any, any> | undefined>;
208
+ /** @internal */
209
+ readonly optionTemplateChild: Signal<SelectOptionTemplateDirective<any, any> | undefined>;
210
+ /** @internal */
211
+ readonly emptyTemplateChild: Signal<SelectEmptyTemplateDirective | undefined>;
212
+ /** @internal */
213
+ readonly headerTemplateChild: Signal<SelectHeaderTemplateDirective | undefined>;
214
+ /** @internal */
215
+ readonly footerTemplateChild: Signal<SelectFooterTemplateDirective | undefined>;
216
+ private readonly overlayService;
217
+ private readonly elementRef;
218
+ private readonly viewContainerRef;
219
+ private readonly injector;
220
+ private readonly destroyRef;
221
+ private readonly focusMonitor;
222
+ private readonly liveAnnouncer;
223
+ private readonly platform;
224
+ private readonly formField;
225
+ private readonly ngControl;
226
+ private readonly parentForm;
227
+ private readonly parentFormGroup;
228
+ private readonly defaultMatcher;
229
+ private readonly uid;
230
+ /** @internal */
231
+ readonly hostId: string;
232
+ /** @internal */
233
+ readonly listboxId: string;
234
+ /** @internal */
235
+ readonly searchInputId: string;
236
+ /** @internal */
237
+ readonly optionId: (index: number) => string;
238
+ /** @internal */
239
+ readonly internalValue: _angular_core.WritableSignal<T | readonly T[] | null>;
240
+ /** @internal */
241
+ readonly search: _angular_core.WritableSignal<string>;
242
+ /** @internal */
243
+ readonly activeIndex: _angular_core.WritableSignal<number>;
244
+ /** @internal */
245
+ readonly focusedSignal: _angular_core.WritableSignal<boolean>;
246
+ private readonly cvaDisabled;
247
+ private readonly _ngControlRev;
248
+ private readonly _formSubmitRev;
249
+ private readonly describedByIdsSignal;
250
+ private readonly labelledByIdsSignal;
251
+ private readonly closingSignal;
252
+ private onChange;
253
+ private onTouched;
254
+ private overlayRef;
255
+ private readonly overlayInstanceSignal;
256
+ private perOpenSubs;
257
+ private closeTimer;
258
+ private resizeObserver;
259
+ private get overlayInstance();
260
+ /** @internal */
261
+ readonly isDisabled: Signal<boolean>;
262
+ /** @internal Effective variant — auto-naked when wrapped in tw-form-field. */
263
+ readonly resolvedVariant: Signal<SelectVariant>;
264
+ /** @internal */
265
+ readonly isEmpty: Signal<boolean>;
266
+ /** @internal Visible (filtered) options with resolved view data. */
267
+ readonly visibleOptions: Signal<readonly SelectVisibleOption<T, unknown>[]>;
268
+ /** @internal Rows rendered in the panel (group labels + options). */
269
+ readonly renderedRows: Signal<readonly SelectRenderedRow<T, unknown>[]>;
270
+ /** @internal Resolved option objects that match the current value. */
271
+ readonly selectedOptions: Signal<readonly unknown[]>;
272
+ /** @internal */
273
+ readonly defaultTriggerText: Signal<string>;
274
+ /** @internal */
275
+ readonly showClearButton: Signal<boolean>;
276
+ /** @internal */
277
+ readonly activeDescendantId: Signal<string | null>;
278
+ /** @internal */
279
+ readonly describedBy: Signal<string>;
280
+ /** @internal Merged `aria-labelledby`: form-field-pushed label ids + consumer-supplied `aria-labelledby`. */
281
+ readonly labelledBy: Signal<string>;
282
+ /** @internal Resolved close-on-select behaviour. */
283
+ readonly resolvedCloseOnSelect: Signal<boolean>;
284
+ private readonly variantResult;
285
+ /** @internal */
286
+ readonly rootClasses: Signal<string>;
287
+ /** @internal */
288
+ readonly triggerClasses: Signal<string>;
289
+ /** @internal */
290
+ readonly valueTextClasses: Signal<string>;
291
+ /** @internal */
292
+ readonly placeholderTextClasses: Signal<string>;
293
+ /** @internal */
294
+ readonly chevronClasses: Signal<string>;
295
+ /** @internal */
296
+ readonly clearButtonClasses: Signal<string>;
297
+ /** @internal */
298
+ readonly optionSizeClass: Signal<"px-3 py-1.5 text-sm" | "px-2 py-1 text-xs gap-1.5" | "px-3 py-2 text-sm" | "px-4 py-2.5 text-base" | "px-4 py-3 text-base">;
299
+ /** @internal */
300
+ readonly checkmarkColorClass: Signal<string>;
301
+ /** @internal Class string applied to each option row. */
302
+ computeOptionClass: (selected: boolean, active: boolean, disabled: boolean) => string;
303
+ /** @internal */
304
+ readonly id: Signal<string>;
305
+ /** @internal */
306
+ readonly focused: Signal<boolean>;
307
+ /** @internal */
308
+ readonly empty: Signal<boolean>;
309
+ /** @internal */
310
+ readonly disabled: Signal<boolean>;
311
+ /** @internal */
312
+ readonly required: Signal<boolean>;
313
+ /** @internal Error-state per the configured `ErrorStateMatcher`. Reads the bound `NgControl.invalid` through the matcher. */
314
+ readonly errorState: Signal<boolean>;
315
+ /** @internal */
316
+ readonly controlType = "select";
317
+ /** @internal */
318
+ readonly userAriaDescribedBy: Signal<string | undefined>;
319
+ /** @internal */
320
+ readonly userAriaLabelledby: Signal<string | undefined>;
321
+ /** @internal Public read-only view of the current value for FormFieldControl. */
322
+ constructor();
323
+ /** Opens the overlay panel. No-op when disabled or already open. */
324
+ openPanel(): void;
325
+ /** Closes the overlay panel. No-op when already closed. */
326
+ closePanel(): void;
327
+ /** Toggles the panel's open state. */
328
+ toggle(): void;
329
+ /** Clears the current selection and emits `selectionChange` with `source: 'reset'`. */
330
+ clear(): void;
331
+ /** @internal Whether a visible-option index is currently selected. */
332
+ isVisibleOptionSelected(index: number): boolean;
333
+ /** @internal */
334
+ isValueSelected(value: T): boolean;
335
+ /** @internal */
336
+ selectByVisibleIndex(index: number, source?: TwSelectSelectionSource): void;
337
+ /** @internal */
338
+ onTriggerClick(): void;
339
+ /** @internal */
340
+ onClearClick(event: MouseEvent): void;
341
+ /** @internal */
342
+ onClearKeydown(event: KeyboardEvent): void;
343
+ /** @internal */
344
+ onTriggerKeydown(event: KeyboardEvent): void;
345
+ /** @internal Handles keyboard events from the trigger AND the search input inside the overlay. */
346
+ handleKeydown(event: KeyboardEvent): void;
347
+ private typeAheadBuffer;
348
+ private typeAheadTimer;
349
+ private applyTypeAhead;
350
+ private moveActive;
351
+ private moveActiveTo;
352
+ private findEnabledFrom;
353
+ /** @internal */
354
+ initActiveIndexOnOpen(): void;
355
+ private scrollActiveIntoView;
356
+ private commitSelection;
357
+ private openOverlay;
358
+ private closeOverlay;
359
+ private ensureOverlay;
360
+ private installResizeObserver;
361
+ private updateOverlaySize;
362
+ private attachOverlayComponent;
363
+ private subscribePerOpen;
364
+ private resolvePanelClass;
365
+ private clearCloseTimer;
366
+ /** @internal */
367
+ buildTriggerContext(): TwSelectTriggerContext<T>;
368
+ writeValue(value: T | readonly T[] | null): void;
369
+ registerOnChange(fn: (value: T | readonly T[] | null) => void): void;
370
+ registerOnTouched(fn: () => void): void;
371
+ setDisabledState(isDisabled: boolean): void;
372
+ /** @internal */
373
+ setDescribedByIds(ids: string[]): void;
374
+ /** @internal Receives the merged `aria-labelledby` ids from the wrapping form-field. The trigger needs explicit labelledby because it's a non-native combobox button — `<label for>` does not reach it. */
375
+ setLabelledByIds(ids: string[]): void;
376
+ /** @internal */
377
+ onContainerClick(event: MouseEvent): void;
378
+ ngOnInit(): void;
379
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent<any>, never>;
380
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent<any>, "tw-select", 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; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "filterPredicate": { "alias": "filterPredicate"; "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; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelMaxHeight": { "alias": "panelMaxHeight"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "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; }; "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; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "open": "openChange"; "openedChange": "openedChange"; "selectionChange": "selectionChange"; "searchChange": "searchChange"; }, ["triggerTemplateChild", "optionTemplateChild", "emptyTemplateChild", "headerTemplateChild", "footerTemplateChild"], ["*"], true, never>;
381
+ }
382
+
383
+ export { SelectComponent, SelectEmptyTemplateDirective, SelectFooterTemplateDirective, SelectHeaderTemplateDirective, SelectOptionTemplateDirective, SelectTriggerTemplateDirective };
384
+ export type { SelectRenderedRow, SelectVariant, SelectVisibleOption, TwSelectOpenedEvent, TwSelectOption, TwSelectOptionContext, TwSelectSearchEvent, TwSelectSelectionChangeEvent, TwSelectSelectionSource, TwSelectTriggerContext };
@@ -0,0 +1,28 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { TwColor } from '@cdevhub/ngx-tw/core';
3
+
4
+ /** Line style of the separator. */
5
+ type SeparatorVariant = 'solid' | 'dashed' | 'dotted';
6
+ /** Line thickness of the separator. */
7
+ type SeparatorWeight = 'thin' | 'medium' | 'thick';
8
+ declare class SeparatorComponent {
9
+ /** Controls layout direction. Defaults to `'horizontal'`. */
10
+ readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
11
+ /** Controls the line style. Defaults to `'solid'`. */
12
+ readonly variant: _angular_core.InputSignal<SeparatorVariant>;
13
+ /** Controls line thickness. Defaults to `'thin'`. */
14
+ readonly weight: _angular_core.InputSignal<SeparatorWeight>;
15
+ /** Sets the semantic color of the line. Defaults to `'neutral'`. */
16
+ readonly color: _angular_core.InputSignal<TwColor>;
17
+ /** When true, hides the separator from assistive technology. Defaults to `false`. */
18
+ readonly decorative: _angular_core.InputSignal<boolean>;
19
+ private readonly variantResult;
20
+ readonly rootClasses: _angular_core.Signal<string>;
21
+ readonly lineClasses: _angular_core.Signal<string>;
22
+ readonly labelClasses: _angular_core.Signal<string>;
23
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SeparatorComponent, never>;
24
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SeparatorComponent, "tw-separator", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "weight": { "alias": "weight"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "decorative": { "alias": "decorative"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
25
+ }
26
+
27
+ export { SeparatorComponent };
28
+ export type { SeparatorVariant, SeparatorWeight };