@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,136 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnInit, AfterViewInit, OnDestroy } from '@angular/core';
3
+ import { TwColor, TwSize } from '@cdevhub/ngx-tw/core';
4
+
5
+ /** Sort direction. `null` represents the cleared (unsorted) state. */
6
+ type SortDirection = 'asc' | 'desc' | null;
7
+ /** Shape that `SortHeaderComponent` implements when registering with a parent `SortDirective`. */
8
+ interface TwSortable {
9
+ /** Unique id identifying the column or field this header sorts. */
10
+ readonly id: string;
11
+ /** Header-level starting direction. `undefined` falls back to the parent directive's `start`. */
12
+ readonly start: 'asc' | 'desc' | undefined;
13
+ /** Header-level override for disabling the cleared state in the cycle. `undefined` falls back to the parent directive's `disableClear`. */
14
+ readonly disableClear: boolean | undefined;
15
+ /** Whether this header is disabled. */
16
+ readonly disabled: boolean;
17
+ }
18
+ /** Payload emitted by `SortDirective.sortChange` whenever a user interaction changes the sort state. */
19
+ interface TwSortEvent {
20
+ /** The new active header id, or `null` when the sort was cleared. */
21
+ active: string | null;
22
+ /** The new sort direction. */
23
+ direction: SortDirection;
24
+ /** Snapshot of the previous state, before this change. */
25
+ previous: {
26
+ /** Previous active header id. */
27
+ active: string | null;
28
+ /** Previous sort direction. */
29
+ direction: SortDirection;
30
+ };
31
+ }
32
+ /**
33
+ * Container directive that holds the current sort state (`active` id + `direction`) and
34
+ * coordinates with child `SortHeaderComponent` instances. Compose with any rendering layer —
35
+ * tables, lists, custom grids — by placing child headers inside an element marked `[twSort]`.
36
+ *
37
+ * @remarks
38
+ * **`tw*` input/output aliases.** Every `input()` / `output()` / `model()` on this directive
39
+ * carries a `tw*` alias (e.g. `'twSortActive'`, `'twSortDirection'`, `'twSortChange'`). The
40
+ * aliases namespace bindings under the directive selector so they cannot collide with
41
+ * attributes the host element already owns (a `<table>` consumer binding `[active]` would
42
+ * otherwise be ambiguous). This mirrors Angular Material's `mat*` aliasing precedent on
43
+ * `MatSort`. Compodoc surfaces both the field name and the alias; consumer templates MUST
44
+ * bind via the aliased name (`[twSortActive]`, `(twSortChange)`, …). Removing an alias is a
45
+ * breaking API change requiring a major version bump.
46
+ */
47
+ declare class SortDirective {
48
+ /** The id of the currently sorted header, or `null` when nothing is sorted. Two-way bindable via `[(twSortActive)]`. Defaults to `null`. */
49
+ readonly active: _angular_core.ModelSignal<string | null>;
50
+ /** Current sort direction. `null` represents the cleared state. Two-way bindable via `[(twSortDirection)]`. Defaults to `null`. */
51
+ readonly direction: _angular_core.ModelSignal<SortDirection>;
52
+ /** Starting direction used when a header becomes active for the first time. Per-header `start` overrides this. Defaults to `'asc'`. */
53
+ readonly start: _angular_core.InputSignal<"asc" | "desc">;
54
+ /** When true, the direction cycle skips the cleared (`null`) state — headers toggle between `'asc'` and `'desc'` only. Per-header `disableClear` overrides this. Defaults to `false`. */
55
+ readonly disableClear: _angular_core.InputSignal<boolean>;
56
+ /** When true, all child sort headers are disabled. Defaults to `false`. */
57
+ readonly disabled: _angular_core.InputSignal<boolean>;
58
+ /** Fires whenever the user changes `active` or `direction` by interacting with a header. Programmatic writes to `[(twSortActive)]` / `[(twSortDirection)]` do NOT emit. */
59
+ readonly sortChange: _angular_core.OutputEmitterRef<TwSortEvent>;
60
+ private readonly sortableIds;
61
+ /** Registers a header id so duplicates can be detected. Called by `SortHeaderComponent` on init. Throws in dev mode if another header with the same id is already registered. */
62
+ register(id: string): void;
63
+ /** Deregisters a header id. Called on destroy. */
64
+ deregister(id: string): void;
65
+ /** Cycles the direction for the given header and emits `sortChange`. No-op when the directive or the header is disabled. */
66
+ sort(sortable: TwSortable): void;
67
+ /** Returns the next direction in the cycle for the given header, based on the current state and header/parent overrides. */
68
+ getNextSortDirection(sortable: TwSortable): SortDirection;
69
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SortDirective, never>;
70
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SortDirective, "[twSort]", ["twSort"], { "active": { "alias": "twSortActive"; "required": false; "isSignal": true; }; "direction": { "alias": "twSortDirection"; "required": false; "isSignal": true; }; "start": { "alias": "twSortStart"; "required": false; "isSignal": true; }; "disableClear": { "alias": "twSortDisableClear"; "required": false; "isSignal": true; }; "disabled": { "alias": "twSortDisabled"; "required": false; "isSignal": true; }; }, { "active": "twSortActiveChange"; "direction": "twSortDirectionChange"; "sortChange": "twSortChange"; }, never, never, true, never>;
71
+ }
72
+
73
+ /** Position of the sort arrow relative to the header label. */
74
+ type TwSortArrowPosition = 'before' | 'after';
75
+ /**
76
+ * Turns any element (e.g., `<th>`, `<div>`, `<button>`) into a sortable header under a parent
77
+ * `SortDirective`. Renders the projected label plus an arrow that reflects the current direction.
78
+ * Triggers a sort cycle on click or Enter/Space.
79
+ */
80
+ declare class SortHeaderComponent implements OnInit, AfterViewInit, OnDestroy {
81
+ /** Unique id for this header. Required — identifies the field/column this header sorts. */
82
+ readonly id: _angular_core.InputSignal<string>;
83
+ /** Overrides the parent directive's `start` for this header only. `undefined` inherits from the parent. */
84
+ readonly start: _angular_core.InputSignal<"asc" | "desc" | undefined>;
85
+ /** Overrides the parent directive's `disableClear` for this header only. `undefined` inherits from the parent. */
86
+ readonly disableClear: _angular_core.InputSignal<boolean | undefined>;
87
+ /** When true, this header is disabled — clicks and keyboard activation are ignored. Defaults to `false`. */
88
+ readonly headerDisabled: _angular_core.InputSignal<boolean>;
89
+ /** Whether the sort arrow renders `'before'` or `'after'` the projected label. Defaults to `'after'`. */
90
+ readonly arrowPosition: _angular_core.InputSignal<TwSortArrowPosition>;
91
+ /** Semantic color used to tint the arrow when this header is active. Defaults to `'primary'`. */
92
+ readonly color: _angular_core.InputSignal<TwColor>;
93
+ /** Controls padding and font size. Uses the shared `TwSize` scale. Defaults to `'md'`. */
94
+ readonly size: _angular_core.InputSignal<TwSize>;
95
+ /** Accessible description applied via `AriaDescriber` so screen readers announce the sort action alongside the header text. Defaults to `'Sort'`. */
96
+ readonly sortActionDescription: _angular_core.InputSignal<string>;
97
+ private readonly parent;
98
+ private readonly focusMonitor;
99
+ private readonly ariaDescriber;
100
+ private readonly containerRef;
101
+ private _describedBy;
102
+ constructor();
103
+ /** Whether this header is currently the active (sorted) header. */
104
+ readonly isActive: _angular_core.Signal<boolean>;
105
+ /** Whether this header is disabled via its own input or the parent directive's `disabled`. */
106
+ readonly isDisabled: _angular_core.Signal<boolean>;
107
+ /** Active direction for *this* header (null when not active). */
108
+ readonly effectiveDirection: _angular_core.Signal<SortDirection>;
109
+ /** `aria-sort` value: `'ascending' | 'descending' | 'none'`. */
110
+ readonly ariaSort: _angular_core.Signal<"none" | "ascending" | "descending">;
111
+ /** Whether the arrow element should render. Active headers always render; inactive render when not disabled so hover reveals the affordance. */
112
+ readonly renderArrow: _angular_core.Signal<boolean>;
113
+ private readonly variantResult;
114
+ /** @internal */
115
+ readonly hostClasses: _angular_core.Signal<string>;
116
+ /** @internal */
117
+ readonly containerClasses: _angular_core.Signal<string>;
118
+ /** @internal */
119
+ readonly labelClasses: _angular_core.Signal<string>;
120
+ /** @internal */
121
+ readonly arrowClasses: _angular_core.Signal<string>;
122
+ /** @internal */
123
+ readonly arrowIconClasses: _angular_core.Signal<string>;
124
+ ngOnInit(): void;
125
+ ngAfterViewInit(): void;
126
+ ngOnDestroy(): void;
127
+ /** @internal */
128
+ handleClick(): void;
129
+ /** @internal */
130
+ handleKeydown(event: KeyboardEvent): void;
131
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SortHeaderComponent, never>;
132
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SortHeaderComponent, "[tw-sort-header]", ["twSortHeader"], { "id": { "alias": "id"; "required": true; "isSignal": true; }; "start": { "alias": "start"; "required": false; "isSignal": true; }; "disableClear": { "alias": "disableClear"; "required": false; "isSignal": true; }; "headerDisabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "arrowPosition": { "alias": "arrowPosition"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "sortActionDescription": { "alias": "sortActionDescription"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[twSortHeaderIcon]"], true, never>;
133
+ }
134
+
135
+ export { SortDirective, SortHeaderComponent };
136
+ export type { SortDirection, TwSortArrowPosition, TwSortEvent, TwSortable };
@@ -0,0 +1,50 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { TwColor, TwSize } from '@cdevhub/ngx-tw/core';
3
+
4
+ /** Visual style of the spinner. */
5
+ type SpinnerVariant = 'circular' | 'dots' | 'bars';
6
+ /** Semantic color for the spinner. `'current'` inherits from parent `currentColor`. */
7
+ type SpinnerColor = TwColor | 'current';
8
+ /** Size of the spinner. `'inherit'` sizes the spinner to `1em` so it scales with the surrounding font. */
9
+ type SpinnerSize = TwSize | 'inherit';
10
+ /**
11
+ * Indeterminate loading indicator.
12
+ *
13
+ * Designed to compose inside other ngx-tw components:
14
+ * - Inside `<button twButton [loading]="true">` — inherits the button's text color via `color="current"`.
15
+ * - Inside `<tw-form-field>` as `twSuffix` — indicates async validation / pending load.
16
+ * - Inline with text using `size="inherit"` — scales with the surrounding font.
17
+ * - Centered inside cards or overlay wrappers for region-level loading states.
18
+ *
19
+ * @example
20
+ * ```html
21
+ * <tw-spinner />
22
+ * <tw-spinner color="success" size="lg" />
23
+ * <tw-spinner twSuffix size="sm" label="Validating email" />
24
+ * ```
25
+ */
26
+ declare class SpinnerComponent {
27
+ /** Controls the visual style of the spinner. Defaults to `'circular'`. */
28
+ readonly variant: _angular_core.InputSignal<SpinnerVariant>;
29
+ /** Semantic color. `'current'` inherits the surrounding text color — required for composition inside buttons and form-field prefix/suffix slots. Defaults to `'current'`. */
30
+ readonly color: _angular_core.InputSignal<SpinnerColor>;
31
+ /** Sets the spinner dimensions. `'inherit'` sizes the spinner to `1em` so it matches the surrounding font size (useful for inline text indicators). Defaults to `'md'`. */
32
+ readonly size: _angular_core.InputSignal<SpinnerSize>;
33
+ /** When true, renders a subtle ring behind the rotating stroke. Without the track ring the spinner reads as a partial arc, not a loading indicator. Only applies to the `'circular'` variant. Defaults to `true`. */
34
+ readonly track: _angular_core.InputSignal<boolean>;
35
+ /** Accessible label announced by assistive technology. Rendered in a visually hidden span. Defaults to `'Loading'`. */
36
+ readonly label: _angular_core.InputSignal<string>;
37
+ private readonly variantResult;
38
+ readonly rootClasses: _angular_core.Signal<string>;
39
+ readonly svgClasses: _angular_core.Signal<string>;
40
+ readonly dotsClasses: _angular_core.Signal<string>;
41
+ readonly dotClasses: _angular_core.Signal<string>;
42
+ readonly barsClasses: _angular_core.Signal<string>;
43
+ readonly barClasses: _angular_core.Signal<string>;
44
+ readonly srLabelClasses: _angular_core.Signal<string>;
45
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpinnerComponent, never>;
46
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpinnerComponent, "tw-spinner", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "track": { "alias": "track"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
47
+ }
48
+
49
+ export { SpinnerComponent };
50
+ export type { SpinnerColor, SpinnerSize, SpinnerVariant };
@@ -0,0 +1,265 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Payload emitted on resizeStart and resizeEnd. */
4
+ interface SplitResizeEvent {
5
+ /** Ordered array of current pane sizes in the container's declared unit. */
6
+ sizes: number[];
7
+ /** The unit used by the container. */
8
+ unit: 'percent' | 'pixel';
9
+ /** Index of the pane immediately before the gutter being dragged. */
10
+ originPaneIndex: number;
11
+ /** What triggered the resize. */
12
+ cause: 'pointer' | 'touch' | 'keyboard' | 'programmatic';
13
+ }
14
+ /** Payload emitted on collapseChange. */
15
+ interface SplitCollapseEvent {
16
+ /** Index of the pane whose collapsed state changed. */
17
+ paneIndex: number;
18
+ /** True when the pane just collapsed, false when it just expanded. */
19
+ collapsed: boolean;
20
+ /** What triggered the collapse or expand. */
21
+ cause: 'snap' | 'keyboard' | 'programmatic';
22
+ }
23
+ /** Axis along which panes are laid out. */
24
+ type SplitDirection = 'horizontal' | 'vertical';
25
+ /** Unit in which pane sizes are expressed and reported. */
26
+ type SplitUnit = 'percent' | 'pixel';
27
+
28
+ /**
29
+ * A single resizable pane inside `<tw-split>`.
30
+ * Declare size constraints here; the parent container drives the actual sizing.
31
+ */
32
+ declare class SplitPaneComponent {
33
+ /** Initial size of this pane in the container's unit. Omit to use even distribution. */
34
+ readonly defaultSize: _angular_core.InputSignal<number | undefined>;
35
+ /** Minimum size in the container's unit. The gutter will not move past this. Defaults to `0`. */
36
+ readonly minSize: _angular_core.InputSignal<number>;
37
+ /** Maximum size in the container's unit. The gutter will not move past this. Defaults to `Infinity`. */
38
+ readonly maxSize: _angular_core.InputSignal<number>;
39
+ /** When true, the pane may collapse to `collapsedSize` via snap, keyboard, or API. Defaults to `false`. */
40
+ readonly collapsible: _angular_core.InputSignal<boolean>;
41
+ /** Size to use when the pane is collapsed. May be `> 0` for rail-style collapse. Defaults to `0`. */
42
+ readonly collapsedSize: _angular_core.InputSignal<number>;
43
+ /**
44
+ * If `> 0`, dragging within `snapSize` units of `collapsedSize` snaps the pane closed.
45
+ * Dragging back out past `snapSize` re-expands it. Defaults to `0` (snap disabled).
46
+ */
47
+ readonly snapSize: _angular_core.InputSignal<number>;
48
+ /**
49
+ * Stable ordering token used by the container when content-projection order and
50
+ * resize math must stay consistent across change detection. Defaults to declaration order.
51
+ */
52
+ readonly order: _angular_core.InputSignal<number | undefined>;
53
+ /** Fires when this pane's size changes, in the container's unit. */
54
+ readonly sizeChange: _angular_core.OutputEmitterRef<number>;
55
+ /** Fires when this pane's collapsed state changes. */
56
+ readonly collapsedChange: _angular_core.OutputEmitterRef<boolean>;
57
+ /**
58
+ * @internal
59
+ * Written by the parent SplitComponent to set this pane's current flex-basis.
60
+ * Not part of the public API.
61
+ */
62
+ readonly _basis: _angular_core.WritableSignal<string>;
63
+ /**
64
+ * @internal
65
+ * Current size in the container's unit. Written by the parent SplitComponent.
66
+ * Not part of the public API.
67
+ */
68
+ readonly _size: _angular_core.WritableSignal<number>;
69
+ /**
70
+ * @internal
71
+ * Written by the parent SplitComponent to reflect collapsed state on the host.
72
+ * Not part of the public API.
73
+ */
74
+ readonly _collapsed: _angular_core.WritableSignal<boolean>;
75
+ /**
76
+ * @internal
77
+ * Size recorded immediately before this pane collapses, restored on expand.
78
+ * `null` whenever the pane is not collapsed or no pre-collapse size was captured.
79
+ */
80
+ readonly _preCollapseSize: _angular_core.WritableSignal<number | null>;
81
+ /**
82
+ * @internal
83
+ * Pane's positional index. Drives flex `order` so gutters can interleave via
84
+ * order = index * 2 + 1.
85
+ */
86
+ readonly _index: _angular_core.WritableSignal<number>;
87
+ /**
88
+ * @internal
89
+ * DOM id used by the parent gutter's `aria-controls` reference.
90
+ * Assigned by the parent SplitComponent on content reconciliation.
91
+ */
92
+ readonly _paneId: _angular_core.WritableSignal<string | null>;
93
+ /**
94
+ * @internal — idempotent id assignment. Re-using the existing id when the
95
+ * pane is re-reconciled keeps aria-controls stable across CD. The current
96
+ * id is read via `untracked` so callers running inside an `effect()` don't
97
+ * subscribe to `_paneId` and re-fire when it transitions from `null`.
98
+ */
99
+ _ensureId(componentId: string, index: number): void;
100
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SplitPaneComponent, never>;
101
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SplitPaneComponent, "tw-split-pane", never, { "defaultSize": { "alias": "defaultSize"; "required": false; "isSignal": true; }; "minSize": { "alias": "minSize"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "collapsedSize": { "alias": "collapsedSize"; "required": false; "isSignal": true; }; "snapSize": { "alias": "snapSize"; "required": false; "isSignal": true; }; "order": { "alias": "order"; "required": false; "isSignal": true; }; }, { "sizeChange": "sizeChange"; "collapsedChange": "collapsedChange"; }, never, ["*"], true, never>;
102
+ }
103
+
104
+ /**
105
+ * Container component that lays out two or more panes along a single axis and
106
+ * lets the user resize them by dragging the gutters between them.
107
+ *
108
+ * @example
109
+ * ```html
110
+ * <tw-split direction="horizontal" [gutterSize]="6">
111
+ * <tw-split-pane [defaultSize]="30" [minSize]="15">…</tw-split-pane>
112
+ * <tw-split-pane [defaultSize]="70">…</tw-split-pane>
113
+ * </tw-split>
114
+ * ```
115
+ */
116
+ declare class SplitComponent {
117
+ /** Axis along which panes are laid out. `'horizontal'` = side-by-side; `'vertical'` = stacked. Defaults to `'horizontal'`. */
118
+ readonly direction: _angular_core.InputSignal<SplitDirection>;
119
+ /** How sizes are expressed and reported. A single unit governs the whole container. Defaults to `'percent'`. */
120
+ readonly unit: _angular_core.InputSignal<SplitUnit>;
121
+ /** Thickness of each gutter in pixels, perpendicular to the split axis. Defaults to `6`. */
122
+ readonly gutterSize: _angular_core.InputSignal<number>;
123
+ /** When true, all resize interactions are disabled. Gutters are not focusable and do not respond to input. Defaults to `false`. */
124
+ readonly disabled: _angular_core.InputSignal<boolean>;
125
+ /** How much to move the gutter per arrow-key press, in the container's declared unit. Defaults to `10`. */
126
+ readonly keyboardStep: _angular_core.InputSignal<number>;
127
+ /** Step size for `PageUp` / `PageDown` key presses, in the container's declared unit. Defaults to `50`. */
128
+ readonly keyboardStepLarge: _angular_core.InputSignal<number>;
129
+ /**
130
+ * If non-null, pane sizes are persisted to `localStorage` under this key and restored on init.
131
+ * Defaults to `null` (persistence disabled).
132
+ */
133
+ readonly storageKey: _angular_core.InputSignal<string | null>;
134
+ /**
135
+ * When true, horizontal direction is visually reversed (RTL layout).
136
+ * Defaults to `null`, which means the value is inherited from the nearest ancestor `dir` attribute.
137
+ */
138
+ readonly rtl: _angular_core.InputSignal<boolean | null>;
139
+ /**
140
+ * Fires after any committed resize with the ordered array of current pane sizes.
141
+ * Does **not** fire on every pointer move during drag — only on commit (release, keyboard step, programmatic call).
142
+ */
143
+ readonly sizesChange: _angular_core.OutputEmitterRef<number[]>;
144
+ /** Fires on pointer/touch down or keyboard-initiated resize start. */
145
+ readonly resizeStart: _angular_core.OutputEmitterRef<SplitResizeEvent>;
146
+ /** Fires on pointer/touch up, blur, or keyboard resize commit. */
147
+ readonly resizeEnd: _angular_core.OutputEmitterRef<SplitResizeEvent>;
148
+ /** Fires when a pane collapses or expands via snap, keyboard, or programmatic API. */
149
+ readonly collapseChange: _angular_core.OutputEmitterRef<SplitCollapseEvent>;
150
+ private readonly _elRef;
151
+ private readonly _ngZone;
152
+ private readonly _destroyRef;
153
+ private readonly _directionality;
154
+ private readonly _isBrowser;
155
+ readonly _panes: _angular_core.Signal<readonly SplitPaneComponent[]>;
156
+ /** Stable id used to namespace per-pane DOM ids inside this container. */
157
+ private readonly _componentId;
158
+ /**
159
+ * @internal
160
+ * Container dimension in pixels along the split axis, updated by ResizeObserver.
161
+ * Starts at 0 until the first observation fires.
162
+ */
163
+ readonly _containerSizePx: _angular_core.WritableSignal<number>;
164
+ /**
165
+ * @internal
166
+ * Current pane sizes in the container's declared unit.
167
+ * Percent mode: values sum to 100 (within epsilon).
168
+ * Pixel mode: values are absolute pixel sizes.
169
+ */
170
+ readonly _sizes: _angular_core.WritableSignal<number[]>;
171
+ /** Tracks the live `dir` attribute resolved through CDK Directionality. */
172
+ private readonly _cdkDir;
173
+ /** Resolves the effective RTL state: explicit `rtl` input overrides CDK `dir`. */
174
+ readonly _isRtl: _angular_core.Signal<boolean>;
175
+ private _prevPaneRefs;
176
+ /** True until the first pane-list reconciliation has run; gates persistence hydration. */
177
+ private _initialReconciled;
178
+ /** Resolved class strings from tailwind-variants. */
179
+ private readonly _classes;
180
+ readonly _rootClass: _angular_core.Signal<string>;
181
+ readonly _gutterClass: _angular_core.Signal<string>;
182
+ /** Indices `0..panes.length - 2` representing the gutter between pane[i] and pane[i+1]. */
183
+ readonly _gutterIndices: _angular_core.Signal<number[]>;
184
+ /** @internal — drag state for the active pointer. */
185
+ private _drag;
186
+ constructor();
187
+ /**
188
+ * @internal — exposed for testing; do not call from application code.
189
+ * Called by the ResizeObserver when the container's pixel size changes.
190
+ */
191
+ _onContainerResize(newSizePx: number): void;
192
+ /**
193
+ * @internal — exposed for testing; do not call from application code.
194
+ * Called by the contentChildren effect when the pane list changes.
195
+ */
196
+ _onPanesChange(panes: readonly SplitPaneComponent[], containerPx: number): void;
197
+ private _initializeSizes;
198
+ private _reconcilePanes;
199
+ private _applyToPanes;
200
+ /**
201
+ * Programmatically set all pane sizes.
202
+ * The array length must equal the current pane count and sizes must be
203
+ * compatible with the declared unit. Throws on mismatch.
204
+ */
205
+ setSizes(sizes: number[]): void;
206
+ /**
207
+ * Collapse the pane at `paneIndex` to its `collapsedSize`.
208
+ * The pane must have `collapsible = true`. Throws if the index is out of range.
209
+ */
210
+ collapse(paneIndex: number): void;
211
+ /**
212
+ * Restore the pane at `paneIndex` to its pre-collapse size, or its `defaultSize` if none is recorded.
213
+ * Throws if the index is out of range.
214
+ */
215
+ expand(paneIndex: number): void;
216
+ /**
217
+ * Restore all panes to their declared `defaultSize` values.
218
+ * Clears any persisted sizes if `storageKey` is set.
219
+ */
220
+ reset(): void;
221
+ /** @internal — `aria-valuenow` for the gutter between pane i and i+1. Reports the LEFT pane size as a percent. */
222
+ _ariaValueNow(gutterIndex: number): number | null;
223
+ /** @internal — `aria-controls` references the two adjacent panes' DOM ids. */
224
+ _ariaControls(gutterIndex: number): string | null;
225
+ /** @internal — accessible name fallback for the separator handle. */
226
+ _ariaLabel(gutterIndex: number): string;
227
+ /** @internal */
228
+ _onGutterPointerDown(event: PointerEvent, gutterIndex: number): void;
229
+ private _onGutterPointerMove;
230
+ private _onGutterPointerUp;
231
+ /** @internal */
232
+ _onGutterKeydown(event: KeyboardEvent, gutterIndex: number): void;
233
+ private _setCollapsed;
234
+ private _maybeSnap;
235
+ private _readPersistedSizes;
236
+ private _writePersistedSizes;
237
+ private _clearPersistedSizes;
238
+ private _commit;
239
+ private _setNoSelect;
240
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SplitComponent, never>;
241
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SplitComponent, "tw-split", never, { "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "gutterSize": { "alias": "gutterSize"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "keyboardStep": { "alias": "keyboardStep"; "required": false; "isSignal": true; }; "keyboardStepLarge": { "alias": "keyboardStepLarge"; "required": false; "isSignal": true; }; "storageKey": { "alias": "storageKey"; "required": false; "isSignal": true; }; "rtl": { "alias": "rtl"; "required": false; "isSignal": true; }; }, { "sizesChange": "sizesChange"; "resizeStart": "resizeStart"; "resizeEnd": "resizeEnd"; "collapseChange": "collapseChange"; }, ["_panes"], ["*"], true, never>;
242
+ }
243
+
244
+ /**
245
+ * Marker directive for a custom gutter projection slot.
246
+ * Attach to content inside `<tw-split>` to provide custom gutter visuals.
247
+ * The container still owns all interaction logic.
248
+ */
249
+ declare class SplitGutterDirective {
250
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SplitGutterDirective, never>;
251
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SplitGutterDirective, "[twSplitGutter]", never, {}, {}, never, never, true, never>;
252
+ }
253
+
254
+ /**
255
+ * Marker directive for an optional header region inside `<tw-split-pane>`.
256
+ * A parent Dock or Panel component may key off this region; the split pane
257
+ * itself does not apply any styling to it.
258
+ */
259
+ declare class SplitPaneHeaderDirective {
260
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SplitPaneHeaderDirective, never>;
261
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SplitPaneHeaderDirective, "[twSplitPaneHeader]", never, {}, {}, never, never, true, never>;
262
+ }
263
+
264
+ export { SplitComponent, SplitGutterDirective, SplitPaneComponent, SplitPaneHeaderDirective };
265
+ export type { SplitCollapseEvent, SplitDirection, SplitResizeEvent, SplitUnit };
@@ -0,0 +1,140 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ElementRef } from '@angular/core';
3
+ import { TwSize } from '@cdevhub/ngx-tw/core';
4
+
5
+ /** Surface treatment for the stat tile. */
6
+ type StatVariant = 'plain' | 'outlined' | 'elevated' | 'filled';
7
+ /** Direction of trend conveyed by the delta indicator. */
8
+ type StatDeltaDirection = 'up' | 'down' | 'neutral';
9
+ /** Display style of the trend delta. */
10
+ type StatDeltaVariant = 'badge' | 'inline' | 'icon-only';
11
+ /** Label slot — short caption ("Revenue", "Active users"). Projected into `<dt>`. */
12
+ declare class StatLabelDirective {
13
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatLabelDirective, never>;
14
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StatLabelDirective, "[twStatLabel]", never, {}, {}, never, never, true, never>;
15
+ }
16
+ /** Value slot — the dominant numeric/text element. Projected into `<dd>`. */
17
+ declare class StatValueDirective {
18
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatValueDirective, never>;
19
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StatValueDirective, "[twStatValue]", never, {}, {}, never, never, true, never>;
20
+ }
21
+ /** Description slot — optional secondary text under the value. Projected into a second `<dd>`. */
22
+ declare class StatDescriptionDirective {
23
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatDescriptionDirective, never>;
24
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StatDescriptionDirective, "[twStatDescription]", never, {}, {}, never, never, true, never>;
25
+ }
26
+ /** Icon slot — optional leading icon. Triggers the icon-leading layout. */
27
+ declare class StatIconDirective {
28
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatIconDirective, never>;
29
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StatIconDirective, "[twStatIcon]", never, {}, {}, never, never, true, never>;
30
+ }
31
+ /** Footer slot — optional auxiliary region (sparklines, tags, metadata). Always renders, even during loading. */
32
+ declare class StatFooterDirective {
33
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatFooterDirective, never>;
34
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<StatFooterDirective, "[twStatFooter]", never, {}, {}, never, never, true, never>;
35
+ }
36
+ /**
37
+ * Compact trend indicator — direction + projected delta text + optional
38
+ * comparison label. Usable standalone or projected into a `<tw-stat>` tile.
39
+ *
40
+ * Sentiment is conveyed by both icon direction and color; consumers running
41
+ * "lower is better" metrics (bounce rate, latency, churn) set `inverted` to
42
+ * swap the success/error color mapping without changing the literal direction
43
+ * or the announced verb.
44
+ */
45
+ declare class StatDeltaComponent {
46
+ /** Direction of change. `'up'` renders an up-chevron and (by default) the `success` color; `'down'` renders a down-chevron and the `error` color; `'neutral'` renders a horizontal-line glyph and the neutral color. Defaults to `'neutral'`. */
47
+ readonly direction: _angular_core.InputSignal<StatDeltaDirection>;
48
+ /** When true, swaps success/error semantics so `down` reads as success and `up` reads as error — use for metrics where lower is better (bounce rate, error rate, latency, churn). `neutral` direction is unaffected. Defaults to `false`. */
49
+ readonly inverted: _angular_core.InputSignalWithTransform<boolean, unknown>;
50
+ /** Display style. `'badge'` (default) wraps the delta in a pill chip; `'inline'` is icon + text only with no chip; `'icon-only'` shows just the chevron for ultra-dense layouts. */
51
+ readonly variant: _angular_core.InputSignal<StatDeltaVariant>;
52
+ /** Optional comparison label rendered next to the delta value (e.g. `"vs last week"`, `"since launch"`). Defaults to `undefined`. */
53
+ readonly comparisonLabel: _angular_core.InputSignal<string | undefined>;
54
+ /** Explicit accessible label. When omitted, the component composes one from `direction` + projected text + `comparisonLabel`. Override when projected content is purely symbolic or already localized. Defaults to `undefined`. */
55
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
56
+ /** @internal */
57
+ protected readonly textEl: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
58
+ /** @internal */
59
+ protected readonly projectedText: _angular_core.WritableSignal<string>;
60
+ constructor();
61
+ /** @internal */
62
+ protected readonly effectiveColor: _angular_core.Signal<"neutral" | "success" | "error">;
63
+ /** @internal */
64
+ protected readonly iconSizeClass: _angular_core.Signal<"size-4" | "size-3">;
65
+ /** @internal */
66
+ protected readonly composedAriaLabel: _angular_core.Signal<string>;
67
+ private readonly variantResult;
68
+ protected readonly rootClasses: _angular_core.Signal<string>;
69
+ protected readonly iconClasses: _angular_core.Signal<string>;
70
+ protected readonly textClasses: _angular_core.Signal<string>;
71
+ protected readonly comparisonClasses: _angular_core.Signal<string>;
72
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatDeltaComponent, never>;
73
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatDeltaComponent, "tw-stat-delta", never, { "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "inverted": { "alias": "inverted"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "comparisonLabel": { "alias": "comparisonLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
74
+ }
75
+ /**
76
+ * KPI tile — a compact display tile surfacing a single key performance
77
+ * indicator with an optional trend delta. Composes a `<dl>` / `<dt>` / `<dd>`
78
+ * definition list internally so the label-to-value pairing is announced
79
+ * naturally by assistive technology.
80
+ *
81
+ * Slots:
82
+ * - `[twStatLabel]` — caption (rendered as `<dt>`).
83
+ * - `[twStatValue]` — dominant value (rendered as `<dd>`).
84
+ * - `[twStatDescription]` — optional secondary text (second `<dd>`).
85
+ * - `[twStatIcon]` — optional leading icon (switches to icon-leading layout).
86
+ * - `[twStatFooter]` — optional auxiliary region (sparklines, tags).
87
+ * - `<tw-stat-delta>` — projected trend indicator alongside the value.
88
+ *
89
+ * Loading state replaces label/value/delta with `<tw-skeleton>` placeholders
90
+ * sized to match the density. Footer always renders during loading so
91
+ * consumers can compose their own skeleton charts.
92
+ */
93
+ declare class StatComponent {
94
+ /** Surface treatment. `'plain'` removes border and background; `'outlined'` (default) adds a border on the surface token; `'elevated'` adds shadow and uses the raised surface; `'filled'` uses the muted surface with no border. */
95
+ readonly variant: _angular_core.InputSignal<StatVariant>;
96
+ /** Density scale — drives padding, internal gaps, value/label typography, and the skeleton placeholder dimensions. Defaults to `'md'`. */
97
+ readonly size: _angular_core.InputSignal<TwSize>;
98
+ /** When true, replaces label, value, and delta regions with `<tw-skeleton>` placeholders and toggles `aria-busy="true"` on the host. Projected footer content still renders. Defaults to `false`. */
99
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
100
+ /** @internal */
101
+ protected readonly labelSlot: _angular_core.Signal<StatLabelDirective | undefined>;
102
+ /** @internal */
103
+ protected readonly valueSlot: _angular_core.Signal<StatValueDirective | undefined>;
104
+ /** @internal */
105
+ protected readonly descriptionSlot: _angular_core.Signal<StatDescriptionDirective | undefined>;
106
+ /** @internal */
107
+ protected readonly iconSlot: _angular_core.Signal<StatIconDirective | undefined>;
108
+ /** @internal */
109
+ protected readonly footerSlot: _angular_core.Signal<StatFooterDirective | undefined>;
110
+ /** @internal */
111
+ protected readonly deltaSlot: _angular_core.Signal<StatDeltaComponent | undefined>;
112
+ protected readonly hasLabel: _angular_core.Signal<boolean>;
113
+ protected readonly hasValue: _angular_core.Signal<boolean>;
114
+ protected readonly hasDescription: _angular_core.Signal<boolean>;
115
+ protected readonly hasIcon: _angular_core.Signal<boolean>;
116
+ protected readonly hasFooter: _angular_core.Signal<boolean>;
117
+ protected readonly hasDelta: _angular_core.Signal<boolean>;
118
+ protected readonly iconLeading: _angular_core.Signal<boolean>;
119
+ /** Skeleton width during loading state — scales with the size axis. */
120
+ protected readonly loadingValueWidth: _angular_core.Signal<"4rem" | "5rem" | "6rem" | "8rem" | "10rem">;
121
+ /** Skeleton height during loading state — matches the value font size. */
122
+ protected readonly loadingValueHeight: _angular_core.Signal<"0.75rem" | "0.875rem" | "1rem">;
123
+ private readonly variantResult;
124
+ protected readonly rootClasses: _angular_core.Signal<string>;
125
+ protected readonly iconFlexClasses: _angular_core.Signal<string>;
126
+ protected readonly iconWrapperClasses: _angular_core.Signal<string>;
127
+ protected readonly contentStackClasses: _angular_core.Signal<string>;
128
+ protected readonly dlClasses: _angular_core.Signal<string>;
129
+ protected readonly labelClasses: _angular_core.Signal<string>;
130
+ protected readonly valueRowClasses: _angular_core.Signal<string>;
131
+ protected readonly valueClasses: _angular_core.Signal<string>;
132
+ protected readonly descriptionClasses: _angular_core.Signal<string>;
133
+ protected readonly deltaClasses: _angular_core.Signal<string>;
134
+ protected readonly footerClasses: _angular_core.Signal<string>;
135
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatComponent, never>;
136
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatComponent, "tw-stat", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, ["labelSlot", "valueSlot", "descriptionSlot", "iconSlot", "footerSlot", "deltaSlot"], ["[twStatIcon]", "[twStatFooter]", "[twStatLabel]", "[twStatValue]", "tw-stat-delta", "[twStatDescription]"], true, never>;
137
+ }
138
+
139
+ export { StatComponent, StatDeltaComponent, StatDescriptionDirective, StatFooterDirective, StatIconDirective, StatLabelDirective, StatValueDirective };
140
+ export type { StatDeltaDirection, StatDeltaVariant, StatVariant };