@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,210 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Signal, AfterContentInit, ElementRef, InjectionToken } from '@angular/core';
3
+ import { TwSize, TwColor } from '@cdevhub/ngx-tw/core';
4
+
5
+ /** Visual appearance of the form-field container. */
6
+ type FormFieldAppearance = 'outline' | 'filled';
7
+ /** Floating label behavior. `'never'` disables floating entirely; the label wrapper is not rendered and the wrapped control's placeholder is always visible. */
8
+ type FloatLabel = 'auto' | 'always' | 'never';
9
+ /** Subscript (hint/error row) sizing strategy. `'fixed'` always reserves vertical space; `'dynamic'` collapses the row when no hint/error is projected. */
10
+ type SubscriptSizing = 'fixed' | 'dynamic';
11
+ /**
12
+ * Contract every ngx-tw form-field-compatible control must implement. A
13
+ * concrete control provides itself under {@link TW_FORM_FIELD_CONTROL} so the
14
+ * surrounding `FormFieldComponent` can mirror its state and wire ARIA.
15
+ */
16
+ declare abstract class FormFieldControl<T = unknown> {
17
+ /** Unique id on the control's host element. Used by the form-field label `for` attribute and `aria-describedby` wiring. */
18
+ abstract readonly id: Signal<string>;
19
+ /** Current value of the control. */
20
+ abstract readonly value: Signal<T | null>;
21
+ /** Whether the control currently has focus. Typically driven by CDK `FocusMonitor`. */
22
+ abstract readonly focused: Signal<boolean>;
23
+ /** Whether the control's value is considered empty. Drives the floating-label state. */
24
+ abstract readonly empty: Signal<boolean>;
25
+ /** Whether the control is disabled. */
26
+ abstract readonly disabled: Signal<boolean>;
27
+ /** Whether the control is marked required. */
28
+ abstract readonly required: Signal<boolean>;
29
+ /** Whether the control should be rendered as invalid. Usually derived from `NgControl.invalid` combined with `touched`/`submitted`. */
30
+ abstract readonly errorState: Signal<boolean>;
31
+ /** Active validation errors map keyed by validator name (e.g. `{ required: true, email: true }`). Returns `null` when the control has no validation errors. Drives `[twError match="…"]` filtering inside the form-field. Optional — controls without a backing `NgControl` may omit it. */
32
+ readonly errors?: Signal<Record<string, unknown> | null>;
33
+ /** Optional control-type identifier (e.g. `'input'`, `'select'`). When set, the form-field appends `tw-form-field-type-{controlType}` to its host for styling hooks. */
34
+ abstract readonly controlType?: string;
35
+ /** Optional consumer-supplied `aria-describedby` ids the form-field preserves when merging in hint/error ids. */
36
+ abstract readonly userAriaDescribedBy?: Signal<string | undefined>;
37
+ /** Optional consumer-supplied `aria-labelledby` ids the form-field preserves when merging in the projected label id. Controls that consume label pushdown (non-native triggers) override this. */
38
+ readonly userAriaLabelledby?: Signal<string | undefined>;
39
+ /** Called by the form-field to push the merged `aria-describedby` ids back onto the control's host element. */
40
+ abstract setDescribedByIds(ids: string[]): void;
41
+ /** Called when the form-field container is clicked. Concrete controls typically focus their underlying native element or open a panel. */
42
+ abstract onContainerClick(event: MouseEvent): void;
43
+ /**
44
+ * Called by the form-field to push the merged `aria-labelledby` ids onto the control's host element.
45
+ * Default is a no-op — native `<input>` controls rely on the label's `for=` attribute for the canonical association.
46
+ * Non-native controls (combobox triggers, date-pickers, etc.) override this to set the attribute explicitly.
47
+ */
48
+ setLabelledByIds(_ids: string[]): void;
49
+ }
50
+ /**
51
+ * Injection token matching {@link FormFieldControl}. Controls register via
52
+ * `providers: [{ provide: TW_FORM_FIELD_CONTROL, useExisting: MyControl }]`.
53
+ */
54
+ declare const TW_FORM_FIELD_CONTROL: InjectionToken<FormFieldControl<unknown>>;
55
+ declare class LabelDirective {
56
+ private readonly formField;
57
+ private readonly elementRef;
58
+ /** @internal */
59
+ readonly id: string;
60
+ /** @internal */
61
+ readonly controlId: Signal<string | null>;
62
+ /** @internal */
63
+ readonly classes: Signal<string>;
64
+ constructor();
65
+ static ɵfac: i0.ɵɵFactoryDeclaration<LabelDirective, never>;
66
+ static ɵdir: i0.ɵɵDirectiveDeclaration<LabelDirective, "[twLabel]", never, {}, {}, never, never, true, never>;
67
+ }
68
+ declare class HintDirective {
69
+ private readonly formField;
70
+ /** @internal */
71
+ readonly id: string;
72
+ /** Alignment within the subscript row. `'end'` pushes the hint to the right. When unset, the form-field's `hintAlign` input supplies the default. */
73
+ readonly align: i0.InputSignal<"start" | "end" | undefined>;
74
+ /** @internal */
75
+ readonly effectiveAlign: Signal<"start" | "end">;
76
+ /** @internal */
77
+ readonly classes: Signal<string>;
78
+ static ɵfac: i0.ɵɵFactoryDeclaration<HintDirective, never>;
79
+ static ɵdir: i0.ɵɵDirectiveDeclaration<HintDirective, "[twHint]", never, { "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
80
+ }
81
+ declare class ErrorDirective {
82
+ private readonly formField;
83
+ /** @internal */
84
+ readonly id: string;
85
+ /** Validation error key this message is bound to (e.g. `'required'`, `'email'`, `'minlength'`). When set, the error renders only while the surrounding control reports that key in its active validation errors. When omitted, the error displays whenever the form-field is in an error state — useful as a generic fallback. */
86
+ readonly match: i0.InputSignal<string | undefined>;
87
+ /** @internal Whether this error should display given the control's active error keys. */
88
+ readonly shouldShow: Signal<boolean>;
89
+ /** @internal */
90
+ readonly classes: Signal<string>;
91
+ static ɵfac: i0.ɵɵFactoryDeclaration<ErrorDirective, never>;
92
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ErrorDirective, "[twError]", never, { "match": { "alias": "match"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
93
+ }
94
+ declare class PrefixDirective {
95
+ protected readonly formField: FormFieldComponent;
96
+ /** @internal Used by the form-field to measure the prefix area and align the resting label after it. */
97
+ readonly elementRef: ElementRef<any>;
98
+ /** @internal */
99
+ readonly prefixClasses: Signal<string>;
100
+ static ɵfac: i0.ɵɵFactoryDeclaration<PrefixDirective, never>;
101
+ static ɵdir: i0.ɵɵDirectiveDeclaration<PrefixDirective, "[twPrefix]", never, {}, {}, never, never, true, never>;
102
+ }
103
+ declare class SuffixDirective {
104
+ protected readonly formField: FormFieldComponent;
105
+ /** @internal */
106
+ readonly suffixClasses: Signal<string>;
107
+ static ɵfac: i0.ɵɵFactoryDeclaration<SuffixDirective, never>;
108
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SuffixDirective, "[twSuffix]", never, {}, {}, never, never, true, never>;
109
+ }
110
+ declare class PrefixIconDirective extends PrefixDirective {
111
+ /** @internal */
112
+ readonly prefixClasses: Signal<string>;
113
+ static ɵfac: i0.ɵɵFactoryDeclaration<PrefixIconDirective, never>;
114
+ static ɵdir: i0.ɵɵDirectiveDeclaration<PrefixIconDirective, "[twPrefixIcon]", never, {}, {}, never, never, true, never>;
115
+ }
116
+ declare class SuffixIconDirective extends SuffixDirective {
117
+ /** @internal */
118
+ readonly suffixClasses: Signal<string>;
119
+ static ɵfac: i0.ɵɵFactoryDeclaration<SuffixIconDirective, never>;
120
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SuffixIconDirective, "[twSuffixIcon]", never, {}, {}, never, never, true, never>;
121
+ }
122
+ declare class FormFieldComponent implements AfterContentInit {
123
+ /** Visual appearance of the field container. `'outline'` draws a full border around the control; `'filled'` uses a filled surface with a bottom border. Defaults to `'outline'`. */
124
+ readonly appearance: i0.InputSignal<FormFieldAppearance>;
125
+ /** Density of the field container. Maps to the inline-padding scale (`px-2 py-1` xs … `px-5 py-3` xl) and the floating-label font scale. Defaults to `'md'`. */
126
+ readonly size: i0.InputSignal<TwSize>;
127
+ /** Floating label behavior. `'auto'` floats when focused or non-empty; `'always'` stays floated; `'never'` disables floating entirely (the label wrapper is not rendered and the wrapped control's placeholder is always visible). Defaults to `'auto'`. */
128
+ readonly floatLabel: i0.InputSignal<FloatLabel>;
129
+ /** Subscript sizing strategy. `'fixed'` always reserves a 20px row for hints/errors so adjacent fields align; `'dynamic'` collapses the row when no hint/error is projected. Defaults to `'fixed'`. */
130
+ readonly subscriptSizing: i0.InputSignal<SubscriptSizing>;
131
+ /** Hides the visual required marker (`*`) even when the wrapped control is required. `aria-required` on the control is unaffected. Defaults to `false`. */
132
+ readonly hideRequiredMarker: i0.InputSignal<boolean>;
133
+ /** Semantic color for focused/active accents (focused border, floated label). Defaults to `'primary'`. */
134
+ readonly color: i0.InputSignal<TwColor>;
135
+ /** Default alignment for a `twHint` element that does not specify its own `align`. Defaults to `'start'`. */
136
+ readonly hintAlign: i0.InputSignal<"start" | "end">;
137
+ /** @internal */
138
+ readonly control: Signal<FormFieldControl<unknown> | undefined>;
139
+ /** @internal */
140
+ readonly labelChild: Signal<LabelDirective | undefined>;
141
+ /** @internal */
142
+ readonly hintChildren: Signal<readonly HintDirective[]>;
143
+ /** @internal */
144
+ readonly errorChildren: Signal<readonly ErrorDirective[]>;
145
+ /** @internal */
146
+ readonly prefixChildren: Signal<readonly PrefixDirective[]>;
147
+ /** @internal */
148
+ readonly infixRef: Signal<ElementRef<HTMLElement> | undefined>;
149
+ /** @internal */
150
+ readonly hasLabel: Signal<boolean>;
151
+ /** @internal */
152
+ readonly hasPrefix: Signal<boolean>;
153
+ /** @internal Resting-label left offset in pixels, mirroring the infix's `offsetLeft` so the label sits right after any prefix. */
154
+ private readonly restingLabelOffset;
155
+ /** @internal */
156
+ readonly isFocused: Signal<boolean>;
157
+ /** @internal */
158
+ readonly isInvalid: Signal<boolean>;
159
+ /** @internal */
160
+ readonly isDisabled: Signal<boolean>;
161
+ /** @internal */
162
+ readonly isRequired: Signal<boolean>;
163
+ /** @internal Whether the floating label wrapper should render at all. `'never'` opts out entirely. */
164
+ readonly shouldRenderLabelWrapper: Signal<boolean>;
165
+ /** @internal */
166
+ readonly shouldLabelFloat: Signal<boolean>;
167
+ /** @internal Inline `left` value for the label wrapper. Floated labels pin to the container edge; resting labels align with the infix's left (after any prefix). */
168
+ readonly labelLeft: Signal<string>;
169
+ /** @internal */
170
+ readonly subscriptMode: Signal<"hint" | "error">;
171
+ /** @internal Set of validation error keys currently active on the bound control (e.g. `Set('required', 'email')`). Empty when the control has no `errors` signal or no active errors. Read by `[twError match="…"]` to decide whether to display. */
172
+ readonly activeErrorKeys: Signal<ReadonlySet<string>>;
173
+ /** @internal Whether the subscript row has anything to render right now. */
174
+ readonly hasSubscriptContent: Signal<boolean>;
175
+ /** @internal Whether the subscript wrapper renders. In `'fixed'` mode it always renders to reserve vertical space; in `'dynamic'` mode it collapses when empty. */
176
+ readonly shouldRenderSubscript: Signal<boolean>;
177
+ private readonly controlTypeClass;
178
+ private readonly variantResult;
179
+ /** @internal */
180
+ readonly rootClasses: Signal<string>;
181
+ /** @internal */
182
+ readonly controlWrapperClasses: Signal<string>;
183
+ /** @internal */
184
+ readonly infixClasses: Signal<string>;
185
+ /** @internal */
186
+ readonly labelWrapperClasses: Signal<string>;
187
+ /** @internal */
188
+ readonly labelClasses: Signal<string>;
189
+ /** @internal */
190
+ readonly requiredMarkerClasses: Signal<string>;
191
+ /** @internal */
192
+ readonly prefixClasses: Signal<string>;
193
+ /** @internal */
194
+ readonly suffixClasses: Signal<string>;
195
+ /** @internal */
196
+ readonly subscriptWrapperClasses: Signal<string>;
197
+ /** @internal */
198
+ readonly hintClasses: Signal<string>;
199
+ /** @internal */
200
+ readonly errorClasses: Signal<string>;
201
+ constructor();
202
+ ngAfterContentInit(): void;
203
+ /** @internal */
204
+ _onContainerClick(event: MouseEvent): void;
205
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormFieldComponent, never>;
206
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormFieldComponent, "tw-form-field", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "subscriptSizing": { "alias": "subscriptSizing"; "required": false; "isSignal": true; }; "hideRequiredMarker": { "alias": "hideRequiredMarker"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "hintAlign": { "alias": "hintAlign"; "required": false; "isSignal": true; }; }, {}, ["control", "labelChild", "hintChildren", "errorChildren", "prefixChildren"], ["[twPrefix]", "[twPrefixIcon]", "*", "[twSuffix]", "[twSuffixIcon]", "[twLabel]", "[twError]", "[twHint]"], true, never>;
207
+ }
208
+
209
+ export { ErrorDirective, FormFieldComponent, FormFieldControl, HintDirective, LabelDirective, PrefixDirective, PrefixIconDirective, SuffixDirective, SuffixIconDirective, TW_FORM_FIELD_CONTROL };
210
+ export type { FloatLabel, FormFieldAppearance, SubscriptSizing };
@@ -0,0 +1,29 @@
1
+ import { Provider } from '@angular/core';
2
+ import { LucideIconData, LucideIcons } from 'lucide-angular';
3
+ import { TwIconData } from '@cdevhub/ngx-tw/icon';
4
+
5
+ /**
6
+ * Converts a single Lucide icon to the generic `TwIconData` format.
7
+ *
8
+ * Lucide's `LucideIconData` is structurally identical to `TwIconData`.
9
+ * This function exists for type-level conversion and explicit intent.
10
+ */
11
+ declare function fromLucideIcon(icon: LucideIconData): TwIconData;
12
+ /**
13
+ * Registers Lucide icons for use with `tw-icon`.
14
+ *
15
+ * Drop-in replacement for `provideTwIcons` that accepts Lucide icon imports directly.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { provideTwLucideIcons } from '@cdevhub/ngx-tw/icon/lucide';
20
+ * import { ChevronRight, Star, Check } from 'lucide-angular';
21
+ *
22
+ * export const appConfig = {
23
+ * providers: [provideTwLucideIcons({ ChevronRight, Star, Check })]
24
+ * };
25
+ * ```
26
+ */
27
+ declare function provideTwLucideIcons(icons: LucideIcons): Provider[];
28
+
29
+ export { fromLucideIcon, provideTwLucideIcons };
@@ -0,0 +1,134 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, Provider } from '@angular/core';
3
+ import { TwColor, TwSize } from '@cdevhub/ngx-tw/core';
4
+
5
+ /** A single SVG element: [tagName, attributes]. */
6
+ type TwIconNode = readonly [string, Readonly<Record<string, string | number>>];
7
+ /** Icon data: array of SVG child elements rendered inside the `<svg>` wrapper. */
8
+ type TwIconData = readonly TwIconNode[];
9
+ /** Map of PascalCase icon names to their SVG data. */
10
+ type TwIconMap = Record<string, TwIconData>;
11
+ /** Color options for the icon component: any semantic color plus `'current'` for color inheritance. */
12
+ type TwIconColor = TwColor | 'current';
13
+ /**
14
+ * SVG-author configuration grouped into a single input to keep the icon's
15
+ * top-level surface small. All fields are optional; unset fields fall back to
16
+ * sensible defaults (`strokeWidth: 2`, `absoluteStrokeWidth: false`,
17
+ * `viewBox: '0 0 24 24'`).
18
+ */
19
+ interface TwIconSvgConfig {
20
+ /** SVG stroke width. Defaults to `2`. */
21
+ readonly strokeWidth?: number;
22
+ /** When true, stroke width scales inversely with icon size to maintain consistent visual weight. Defaults to `false`. */
23
+ readonly absoluteStrokeWidth?: boolean;
24
+ /** SVG viewBox attribute. Defaults to `'0 0 24 24'`. */
25
+ readonly viewBox?: string;
26
+ }
27
+
28
+ /**
29
+ * Renders SVG icons from a registry or from direct icon data.
30
+ *
31
+ * Icons inherit `currentColor` by default. Use the `color` input for semantic
32
+ * color variants that respond to theme changes.
33
+ *
34
+ * Register icons tree-shakably via `provideTwIcons()` (raw SVG data) or
35
+ * `provideTwLucideIcons()` from `ngx-tw/icon/lucide` (Lucide adapter).
36
+ *
37
+ * @example
38
+ * ```html
39
+ * <tw-icon name="star" />
40
+ * <tw-icon name="check" color="success" size="lg" />
41
+ * <tw-icon name="alert-triangle" color="warning" ariaLabel="Warning" />
42
+ * <tw-icon name="star" [svg]="{ strokeWidth: 1.5, absoluteStrokeWidth: true }" />
43
+ * ```
44
+ */
45
+ declare class IconComponent {
46
+ private readonly doc;
47
+ private readonly renderer;
48
+ private readonly elRef;
49
+ private readonly registry;
50
+ private readonly _registrar;
51
+ /** Icon name in kebab-case (e.g. `'chevron-right'`). Resolved via the registry. Defaults to `undefined`. */
52
+ readonly name: _angular_core.InputSignal<string | undefined>;
53
+ /** Direct icon data (SVG element tuples). Takes precedence over `name`. Defaults to `undefined`. */
54
+ readonly img: _angular_core.InputSignal<TwIconData | undefined>;
55
+ /** Semantic color. `'current'` inherits from parent text color. Defaults to `'current'`. */
56
+ readonly color: _angular_core.InputSignal<TwIconColor>;
57
+ /** Icon size. Defaults to `'md'` (20px). */
58
+ readonly size: _angular_core.InputSignal<TwSize>;
59
+ /** Accessible label. When set, removes `aria-hidden` and applies `aria-label` to the SVG. Defaults to `undefined` (icon is decorative, `aria-hidden="true"`). */
60
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
61
+ /**
62
+ * SVG-author configuration: `strokeWidth`, `absoluteStrokeWidth`, `viewBox`.
63
+ * Unset fields fall back to `{ strokeWidth: 2, absoluteStrokeWidth: false, viewBox: '0 0 24 24' }`.
64
+ */
65
+ readonly svg: _angular_core.InputSignal<TwIconSvgConfig | undefined>;
66
+ /** Resolves icon data from `img` (priority) or `name` (registry lookup). */
67
+ protected readonly resolvedIcon: _angular_core.Signal<TwIconData | undefined>;
68
+ /** Pixel size for the current `size` input. */
69
+ protected readonly sizeInPx: _angular_core.Signal<number>;
70
+ /** Effective stroke width, accounting for `absoluteStrokeWidth`. */
71
+ protected readonly effectiveStrokeWidth: _angular_core.Signal<number>;
72
+ /** Effective viewBox. */
73
+ protected readonly effectiveViewBox: _angular_core.Signal<string>;
74
+ /** Host class string from tv(). */
75
+ readonly classes: _angular_core.Signal<string>;
76
+ /** Tracks the previous render state to avoid unnecessary DOM rebuilds. */
77
+ private prevIconData;
78
+ private prevStrokeWidth;
79
+ private prevViewBox;
80
+ private prevAriaLabel;
81
+ private currentSvg;
82
+ constructor();
83
+ private renderSvg;
84
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IconComponent, never>;
85
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<IconComponent, "tw-icon", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "img": { "alias": "img"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "svg": { "alias": "svg"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
86
+ }
87
+
88
+ /**
89
+ * Stores icon data (SVG element tuples) for use by `tw-icon`.
90
+ *
91
+ * Not provided in root — use `provideTwIcons()` or `provideTwLucideIcons()`
92
+ * to register icons and supply this service.
93
+ */
94
+ declare class IconRegistry {
95
+ private readonly icons;
96
+ /** Merges the given icons into the registry. */
97
+ register(icons: TwIconMap): void;
98
+ /** Returns the icon data for the given PascalCase name, or `null` if not registered. */
99
+ get(name: string): TwIconData | null;
100
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IconRegistry, never>;
101
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<IconRegistry>;
102
+ }
103
+
104
+ /**
105
+ * Multi-provider token whose factories register icons into the `IconRegistry`.
106
+ * Injected by `IconComponent` to trigger factory execution. The token value is never read.
107
+ */
108
+ declare const TW_ICON_REGISTRAR: InjectionToken<void[]>;
109
+ /**
110
+ * Registers icons for use with `tw-icon`.
111
+ *
112
+ * Returns an array of providers that includes the `IconRegistry` service
113
+ * and a multi-provider factory that merges the given icons into it.
114
+ * Angular deduplicates the class provider, so multiple calls are safe.
115
+ *
116
+ * Works at all injector levels: app root, lazy route, and component.
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * import { provideTwIcons } from '@cdevhub/ngx-tw/icon';
121
+ *
122
+ * const myIcons = {
123
+ * Star: [['polygon', { points: '12 2 15.09 8.26 ...' }]],
124
+ * };
125
+ *
126
+ * export const appConfig = {
127
+ * providers: [provideTwIcons(myIcons)]
128
+ * };
129
+ * ```
130
+ */
131
+ declare function provideTwIcons(icons: TwIconMap): Provider[];
132
+
133
+ export { IconComponent, IconRegistry, TW_ICON_REGISTRAR, provideTwIcons };
134
+ export type { TwIconColor, TwIconData, TwIconMap, TwIconNode, TwIconSvgConfig };
@@ -0,0 +1,110 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnInit, Signal, InjectionToken, WritableSignal } from '@angular/core';
3
+ import { TwSize, ErrorStateMatcher } from '@cdevhub/ngx-tw/core';
4
+ import { FormFieldControl } from '@cdevhub/ngx-tw/form-field';
5
+
6
+ /**
7
+ * Extension point for directives that wrap an `<input twInput>` and need to
8
+ * own how its value is read and written. The directive's `value` property can
9
+ * be a plain object slot (`{ value: T }`) or a `WritableSignal<T>`. Mirrors
10
+ * Angular Material's `MAT_INPUT_VALUE_ACCESSOR`.
11
+ */
12
+ declare const TW_INPUT_VALUE_ACCESSOR: InjectionToken<{
13
+ value: unknown | WritableSignal<unknown>;
14
+ }>;
15
+ /**
16
+ * Adapts a native `<input>` or `<textarea>` into an ngx-tw form-field-compatible
17
+ * control. Works standalone (applies its own border and focus styling) or
18
+ * inside a `<tw-form-field>` (strips its chrome and provides signals the
19
+ * form-field uses to float the label and wire `aria-describedby`).
20
+ *
21
+ * Extension points:
22
+ * - Implement a completely custom control → extend {@link FormFieldControl}
23
+ * and provide under `TW_FORM_FIELD_CONTROL`.
24
+ * - Swap value storage for an existing `<input twInput>` (masked input,
25
+ * date parser, etc.) → provide {@link TW_INPUT_VALUE_ACCESSOR}.
26
+ * - Change when errors show → override {@link TW_ERROR_STATE_MATCHER} at any
27
+ * injector level, or pass `errorStateMatcher` per instance.
28
+ *
29
+ * Forms integration is inherited: Angular's native value accessors attach to
30
+ * the underlying element, so the directive works with template-driven,
31
+ * reactive, and signal-based forms without additional glue.
32
+ */
33
+ declare class InputDirective extends FormFieldControl<string> implements OnInit {
34
+ private readonly elementRef;
35
+ private readonly focusMonitor;
36
+ private readonly autofillMonitor;
37
+ private readonly platform;
38
+ private readonly destroyRef;
39
+ private readonly formField;
40
+ private readonly ngControl;
41
+ private readonly parentForm;
42
+ private readonly parentFormGroup;
43
+ private readonly defaultMatcher;
44
+ private readonly valueAccessor;
45
+ /** @internal */
46
+ readonly _isTextarea: boolean;
47
+ /** Contract value — `'input'` for `<input>` and `'textarea'` for `<textarea>`. Form-field appends it as `tw-form-field-type-*` for styling hooks. */
48
+ readonly controlType: string;
49
+ private readonly uid;
50
+ /** Id on the underlying element. Auto-generated as `tw-input-N` when not provided. Used by the form-field's `<label for>` attribute. */
51
+ readonly idInput: _angular_core.InputSignal<string | undefined>;
52
+ /** Native HTML input `type`. Defaults to `'text'`. Dev-mode throws on unsupported values (`checkbox`, `radio`, `submit`, etc.) — use the dedicated component instead. Ignored on `<textarea>`. */
53
+ readonly type: _angular_core.InputSignal<string>;
54
+ /** Density of a standalone field. Maps to the inline-padding scale (`px-2 py-1` xs … `px-6 py-3` xl) and font scale (`text-xs` xs, `text-sm` sm/md, `text-base` lg/xl). Ignored inside a `<tw-form-field>` — the wrapper's `size` carries density. Defaults to `'md'`. */
55
+ readonly size: _angular_core.InputSignal<TwSize>;
56
+ /** Disables the control. Also reflects `ngControl.disabled` when the element is bound to a reactive form. Defaults to `false`. */
57
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
58
+ /** Marks the control as required. Also inferred from `Validators.required` on a bound `NgControl`. Defaults to `false`. */
59
+ readonly requiredInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
60
+ /** Makes the control read-only (native `readonly` attribute). Defaults to `false`. */
61
+ readonly readonlyInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
62
+ /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the directive uses the `TW_ERROR_STATE_MATCHER` token's value. */
63
+ readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
64
+ /** Consumer-supplied `aria-describedby` ids. The form-field preserves these when merging hint and error ids. Alias: `aria-describedby`. */
65
+ readonly userAriaDescribedBy: _angular_core.InputSignal<string | undefined>;
66
+ /** Consumer-supplied `aria-labelledby` ids. The form-field preserves these when merging in the projected label id. Alias: `aria-labelledby`. */
67
+ readonly userAriaLabelledby: _angular_core.InputSignal<string | undefined>;
68
+ private readonly _value;
69
+ private readonly _focused;
70
+ private readonly _autofilled;
71
+ private readonly _ngControlRev;
72
+ private readonly _formSubmitRev;
73
+ /** @internal */
74
+ readonly id: Signal<string>;
75
+ /** @internal */
76
+ readonly value: Signal<string | null>;
77
+ /** @internal */
78
+ readonly focused: Signal<boolean>;
79
+ /** @internal */
80
+ readonly empty: Signal<boolean>;
81
+ /** @internal */
82
+ readonly disabled: Signal<boolean>;
83
+ /** @internal */
84
+ readonly required: Signal<boolean>;
85
+ /** @internal */
86
+ readonly errorState: Signal<boolean>;
87
+ /** @internal Active validation errors map from the bound `NgControl` (or `null` when the control reports none / is unbound). Recomputes on every `_ngControlRev` tick so `[twError match="…"]` reacts to validator transitions, including rules that fire/clear without flipping `VALID`/`INVALID`. */
88
+ readonly errors: Signal<Record<string, unknown> | null>;
89
+ /** @internal */
90
+ readonly classes: Signal<string>;
91
+ constructor();
92
+ ngOnInit(): void;
93
+ /** Moves focus to the underlying element. */
94
+ focus(options?: FocusOptions): void;
95
+ /** @internal Called when `<tw-form-field>` has computed the merged describedby ids. */
96
+ setDescribedByIds(ids: string[]): void;
97
+ /** @internal Called when `<tw-form-field>` has computed the merged labelledby ids. The native `<label for>` association covers most cases; this attribute is mainly useful when a consumer also supplies `aria-labelledby` for an external label. */
98
+ setLabelledByIds(ids: string[]): void;
99
+ /** @internal Called when the form-field container is clicked. */
100
+ onContainerClick(_event: MouseEvent): void;
101
+ /** @internal */
102
+ _onInput(): void;
103
+ private _currentValue;
104
+ private _readInitialValue;
105
+ private _stringify;
106
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputDirective, never>;
107
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<InputDirective, "input[twInput], textarea[twInput]", ["twInput"], { "idInput": { "alias": "id"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "requiredInput": { "alias": "required"; "required": false; "isSignal": true; }; "readonlyInput": { "alias": "readonly"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "userAriaDescribedBy": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "userAriaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
108
+ }
109
+
110
+ export { InputDirective, TW_INPUT_VALUE_ACCESSOR };
@@ -0,0 +1,70 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnInit } from '@angular/core';
3
+ import { TwSize } from '@cdevhub/ngx-tw/core';
4
+
5
+ /** Density / typography scale for `tw-item`. A narrower subset of `TwSize` — the three sizes that match real use cases (table row, list item, section header). */
6
+ type ItemSize = Extract<TwSize, 'sm' | 'md' | 'lg'>;
7
+ /** Vertical alignment of the leading and trailing slots relative to the title/description stack. */
8
+ type ItemAlign = 'start' | 'center';
9
+ declare class ItemComponent implements OnInit {
10
+ /** Density and typography scale. `'sm'` is compact with truncated single-line title and description (table rows). `'md'` is the default list-item size. `'lg'` is the section-header scale with a larger title. Defaults to `'md'`. */
11
+ readonly size: _angular_core.InputSignal<ItemSize>;
12
+ /** Vertical alignment of the leading and trailing slots relative to the content stack. `'start'` aligns them with the title baseline (recommended when a description is present). `'center'` vertically centers them on the whole block (recommended for single-line items). Defaults to `'start'`. */
13
+ readonly align: _angular_core.InputSignal<ItemAlign>;
14
+ /**
15
+ * When `true`, the item is keyboard-activatable: adds `role="button"`, `tabindex="0"`, a hover background, pointer cursor, and a visible focus ring. Click and Enter/Space emit `selected`. Defaults to `false`.
16
+ *
17
+ * Do not project additional focusable elements (buttons, links, inputs) into `[twItemLeading]` or `[twItemTrailing]` when this is `true` — they create nested interactive controls that fail AXE. For action-row patterns, keep `interactive` as `false` and let the projected control carry the semantics instead.
18
+ *
19
+ * For `role="menuitem"`, `role="option"`, or other listbox/menu semantics, do not use `tw-item` — the menu, select, and command-palette components own those roles and the keyboard contracts that come with them.
20
+ */
21
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
22
+ /** Disables an interactive item. Applies `opacity-50`, `pointer-events-none`, and sets `aria-disabled`. Only meaningful when `interactive` is `true`. Defaults to `false`. */
23
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
24
+ /** When `true`, marks the item as the visually highlighted "current" row (e.g. selected list entry, active settings tab). Applies a low-prominence primary tint, an inset ring, and `aria-current="true"`. Stacks cleanly with `interactive` (the focus ring sits on top of the current ring). Defaults to `false`. */
25
+ readonly current: _angular_core.InputSignalWithTransform<boolean, unknown>;
26
+ /** Fires when an interactive item is activated via click, Enter, or Space. Payload is the originating DOM event. Does not emit when `interactive` is `false` or `disabled` is `true`. */
27
+ readonly selected: _angular_core.OutputEmitterRef<Event>;
28
+ private readonly elementRef;
29
+ private readonly focusMonitor;
30
+ private readonly destroyRef;
31
+ private readonly variantResult;
32
+ readonly rootClasses: _angular_core.Signal<string>;
33
+ readonly leadingClasses: _angular_core.Signal<string>;
34
+ readonly contentClasses: _angular_core.Signal<string>;
35
+ readonly titleClasses: _angular_core.Signal<string>;
36
+ readonly descriptionClasses: _angular_core.Signal<string>;
37
+ readonly trailingClasses: _angular_core.Signal<string>;
38
+ ngOnInit(): void;
39
+ onActivate(event: Event): void;
40
+ onKeydown(event: KeyboardEvent): void;
41
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemComponent, never>;
42
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ItemComponent, "tw-item", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "current": { "alias": "current"; "required": false; "isSignal": true; }; }, { "selected": "selected"; }, never, ["[twItemLeading]", "[twItemTitle]", "[twItemDescription]", "[twItemTrailing]"], true, never>;
43
+ }
44
+ declare class ItemLeadingDirective {
45
+ private readonly item;
46
+ readonly classes: _angular_core.Signal<string>;
47
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemLeadingDirective, never>;
48
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ItemLeadingDirective, "[twItemLeading]", never, {}, {}, never, never, true, never>;
49
+ }
50
+ declare class ItemTitleDirective {
51
+ private readonly item;
52
+ readonly classes: _angular_core.Signal<string>;
53
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemTitleDirective, never>;
54
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ItemTitleDirective, "[twItemTitle]", never, {}, {}, never, never, true, never>;
55
+ }
56
+ declare class ItemDescriptionDirective {
57
+ private readonly item;
58
+ readonly classes: _angular_core.Signal<string>;
59
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemDescriptionDirective, never>;
60
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ItemDescriptionDirective, "[twItemDescription]", never, {}, {}, never, never, true, never>;
61
+ }
62
+ declare class ItemTrailingDirective {
63
+ private readonly item;
64
+ readonly classes: _angular_core.Signal<string>;
65
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ItemTrailingDirective, never>;
66
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ItemTrailingDirective, "[twItemTrailing]", never, {}, {}, never, never, true, never>;
67
+ }
68
+
69
+ export { ItemComponent, ItemDescriptionDirective, ItemLeadingDirective, ItemTitleDirective, ItemTrailingDirective };
70
+ export type { ItemAlign, ItemSize };