@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,335 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Signal, EventEmitter, ComponentRef, OnDestroy, TemplateRef, EnvironmentProviders, OnInit } from '@angular/core';
3
+ import { ComponentType } from '@angular/cdk/portal';
4
+ import { Observable } from 'rxjs';
5
+ import { DialogConfig, AutoFocusTarget, RestoreFocusValue, DialogRole, CdkDialogContainer, DialogRef } from '@angular/cdk/dialog';
6
+ import * as _cdevhub_ngx_tw_sheet from '@cdevhub/ngx-tw/sheet';
7
+ import { OverlayContainerState, OverlayContainerAnimationEvent, TwColor } from '@cdevhub/ngx-tw/core';
8
+ import * as i1 from '@angular/cdk/scrolling';
9
+
10
+ /** Edge the sheet anchors against. */
11
+ type SheetSide = 'top' | 'right' | 'bottom' | 'left';
12
+ /**
13
+ * Preset size for the sheet panel.
14
+ *
15
+ * Sizing is axis-dependent:
16
+ * - `'left' | 'right'` — controls panel width (height is always `100vh`).
17
+ * - `'top' | 'bottom'` — controls panel height (width is always `100vw`).
18
+ */
19
+ type SheetSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
20
+ /** ARIA role of the sheet element. Use `'alertdialog'` for destructive confirmation surfaces. */
21
+ type SheetRole = DialogRole;
22
+ /** Where to move focus when the sheet opens. */
23
+ type SheetAutoFocus = AutoFocusTarget | string | boolean;
24
+ /** How to restore focus on close. `true` restores to the previously focused element; a selector or element targets a specific node. */
25
+ type SheetRestoreFocus = RestoreFocusValue;
26
+ /** Scroll behavior for content underneath the sheet. */
27
+ type SheetScrollStrategy = 'block' | 'close' | 'reposition' | 'noop';
28
+ /**
29
+ * Configuration for opening a sheet with {@link Sheet.open}.
30
+ *
31
+ * Extends `@angular/cdk/dialog`'s `DialogConfig` with sheet-specific options
32
+ * (`side`, `size`, animation durations, split close flags).
33
+ */
34
+ declare class SheetConfig<D = unknown, R = unknown> extends DialogConfig<D, R> {
35
+ /** Edge the sheet anchors against. Defaults to `'right'`. */
36
+ side?: SheetSide;
37
+ /** Preset size for the sheet panel. Axis-dependent (width for left/right, height for top/bottom). Defaults to `'md'`. */
38
+ size?: SheetSize;
39
+ /** Duration of the open slide animation in ms. Defaults to `200`. Use `0` to disable. */
40
+ enterAnimationDuration?: number;
41
+ /**
42
+ * Duration of the close slide animation in ms. Defaults to `160`. Use `0` to disable.
43
+ * Asymmetric with `enterAnimationDuration` by design — the close transition is slightly
44
+ * faster so the sheet feels dismissive rather than reluctant.
45
+ */
46
+ exitAnimationDuration?: number;
47
+ /** Scroll strategy preset applied when `scrollStrategy` isn't set. Defaults to `'block'`. */
48
+ scrollBehavior?: SheetScrollStrategy;
49
+ /**
50
+ * Whether the sheet is modal — sets `aria-modal` on the container. Defaults to `true`:
51
+ * a sheet opened over the page is modal by default and the rest of the document is
52
+ * inert while it is open. Set to `false` only for non-modal surfaces.
53
+ */
54
+ ariaModal?: boolean;
55
+ /** Whether the sheet renders a backdrop. Defaults to `true`. */
56
+ hasBackdrop?: boolean;
57
+ /**
58
+ * Whether pressing `Escape` closes the sheet.
59
+ *
60
+ * Defaults to `true` — Escape is the universal dismiss key for modal surfaces; the
61
+ * "swallow Escape" variant is the special case. `disableClose` overrides this when
62
+ * `true`.
63
+ */
64
+ closeOnEscape?: boolean;
65
+ /**
66
+ * Whether clicking the backdrop closes the sheet.
67
+ *
68
+ * Defaults to `true` — clicking outside a modal sheet is the expected dismiss
69
+ * gesture; enforcing an explicit dismiss button is the special case. `disableClose`
70
+ * overrides this when `true`.
71
+ */
72
+ closeOnBackdropClick?: boolean;
73
+ /**
74
+ * Whether Escape AND backdrop clicks are blocked. Defaults to `false`.
75
+ * When `true`, this overrides both `closeOnEscape` and `closeOnBackdropClick`.
76
+ */
77
+ disableClose?: boolean;
78
+ /** Whether navigation (e.g. router) closes the sheet. Defaults to `true`. */
79
+ closeOnNavigation?: boolean;
80
+ /** Where to move focus when the sheet opens. Defaults to `'first-tabbable'`. */
81
+ autoFocus?: SheetAutoFocus;
82
+ /** Whether to restore focus to the previously focused element after close. Defaults to `true`. */
83
+ restoreFocus?: SheetRestoreFocus;
84
+ }
85
+ /** Injection token carrying the `data` value passed via {@link SheetConfig.data}. */
86
+ declare const SHEET_DATA: InjectionToken<unknown>;
87
+ /** Injection token for application-wide default sheet options. Set via `provideSheet()`. */
88
+ declare const SHEET_DEFAULT_OPTIONS: InjectionToken<Partial<SheetConfig<unknown, unknown>>>;
89
+
90
+ /** Lifecycle states a sheet passes through. */
91
+ type SheetState = OverlayContainerState;
92
+ /** Event emitted when the sheet's animation state transitions. */
93
+ type SheetAnimationEvent = OverlayContainerAnimationEvent;
94
+ /**
95
+ * Sheet container rendered inside the CDK overlay. Wraps the user-provided
96
+ * content in a Tailwind-styled, edge-anchored surface and coordinates slide
97
+ * enter/exit transitions with {@link SheetRef}.
98
+ *
99
+ * The animation state machine, `aria-describedby` queue, and panel-class
100
+ * merge are shared with `DialogContainer` via {@link OverlayContainerCoordinator}
101
+ * (component-scoped — see `providers: [OverlayContainerCoordinator]`).
102
+ *
103
+ * @docs-private
104
+ */
105
+ declare class SheetContainer extends CdkDialogContainer<SheetConfig> {
106
+ private readonly coordinator;
107
+ /** Lifecycle state of the sheet's enter/exit animation. */
108
+ readonly state: Signal<SheetState>;
109
+ /** Emits whenever the animation state transitions. */
110
+ readonly animationStateChanged: EventEmitter<SheetAnimationEvent>;
111
+ /** Resolved enter-animation duration in ms. */
112
+ readonly enterAnimationDuration: number;
113
+ /** Resolved exit-animation duration in ms. */
114
+ readonly exitAnimationDuration: number;
115
+ protected readonly sideAttr: Signal<_cdevhub_ngx_tw_sheet.SheetSide>;
116
+ private readonly variants;
117
+ protected readonly hostClasses: Signal<string>;
118
+ protected readonly ariaDescribedByAttr: Signal<string | null>;
119
+ protected readonly transitionDuration: Signal<number>;
120
+ constructor();
121
+ protected _contentAttached(): void;
122
+ /** Triggered by the sheet ref to play the exit transition before disposing the overlay. */
123
+ _startExitAnimation(): void;
124
+ /** Registers a description id for the container's `aria-describedby`. */
125
+ _addAriaDescribedBy(id: string): void;
126
+ /** Removes a previously registered description id. */
127
+ _removeAriaDescribedBy(id: string): void;
128
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetContainer, never>;
129
+ static ɵcmp: i0.ɵɵComponentDeclaration<SheetContainer, "tw-sheet-container", never, {}, {}, never, never, true, never>;
130
+ }
131
+
132
+ /**
133
+ * Reference to a sheet opened via {@link Sheet.open}. Drives the sheet
134
+ * lifecycle (close, state, observables) and forwards useful overlay streams.
135
+ */
136
+ declare class SheetRef<R = unknown, C = unknown> {
137
+ private readonly cdkRef;
138
+ readonly config: SheetConfig<unknown, R>;
139
+ readonly containerInstance: SheetContainer;
140
+ /** Unique ID of the sheet. */
141
+ readonly id: string;
142
+ /** Instance of the component rendered inside the sheet, or `null` for template sheets. */
143
+ componentInstance: C | null;
144
+ /** `ComponentRef` of the content component, or `null` for template sheets. */
145
+ readonly componentRef: ComponentRef<C> | null;
146
+ /** Current lifecycle state. Reactively readable. */
147
+ readonly state: Signal<SheetState>;
148
+ /** When `true`, close-via-escape AND close-via-backdrop are both disabled. */
149
+ disableClose: boolean | undefined;
150
+ /** When `false`, pressing Escape does not close the sheet. */
151
+ closeOnEscape: boolean | undefined;
152
+ /** When `false`, clicking the backdrop does not close the sheet. */
153
+ closeOnBackdropClick: boolean | undefined;
154
+ private readonly stateSignal;
155
+ private readonly afterOpenedSubject;
156
+ private readonly beforeClosedSubject;
157
+ private readonly afterClosedSubject;
158
+ private pendingResult;
159
+ private closeFocusOrigin;
160
+ constructor(cdkRef: DialogRef<R, C>, config: SheetConfig<unknown, R>, containerInstance: SheetContainer);
161
+ /**
162
+ * Closes the sheet. The exit slide animation runs before the overlay is disposed.
163
+ * @param result Value forwarded to `afterClosed()` subscribers.
164
+ */
165
+ close(result?: R): void;
166
+ /** Observable that emits once after the enter animation finishes. */
167
+ afterOpened(): Observable<void>;
168
+ /** Observable that emits once when the close animation starts. */
169
+ beforeClosed(): Observable<R | undefined>;
170
+ /** Observable that emits once after the sheet has fully closed and the overlay is disposed. */
171
+ afterClosed(): Observable<R | undefined>;
172
+ /** Backdrop click stream (emits even when `closeOnBackdropClick` / `disableClose` is set). */
173
+ backdropClick(): Observable<MouseEvent>;
174
+ /** Keydown event stream for the overlay. */
175
+ keydownEvents(): Observable<KeyboardEvent>;
176
+ /** Adds CSS classes to the overlay panel. */
177
+ addPanelClass(classes: string | string[]): this;
178
+ /** Removes CSS classes from the overlay panel. */
179
+ removePanelClass(classes: string | string[]): this;
180
+ private closeWithOrigin;
181
+ private finishClose;
182
+ }
183
+
184
+ /**
185
+ * Opens edge-anchored sheet (drawer) overlays. Composes `@angular/cdk/dialog`
186
+ * for focus trapping, portals, and overlay plumbing — adds a `GlobalPositionStrategy`
187
+ * pinned to the requested viewport edge, a Tailwind container with axis-aware
188
+ * sizing, slide enter/exit animations, and split close-behavior flags.
189
+ *
190
+ * Not `providedIn: 'root'` — register it via {@link provideSheet}.
191
+ */
192
+ declare class Sheet implements OnDestroy {
193
+ private readonly cdkDialog;
194
+ private readonly injector;
195
+ private readonly defaultOptions;
196
+ private readonly parentSheet;
197
+ private readonly openSheetsAtThisLevel;
198
+ private readonly afterOpenedSubject;
199
+ private readonly afterAllClosedSubject;
200
+ /** Reactively-readable list of currently-open sheets across the full sheet tree. */
201
+ readonly openSheets: Signal<readonly SheetRef<unknown, unknown>[]>;
202
+ /** Emits every time a sheet is opened. */
203
+ readonly afterOpened: Observable<SheetRef<unknown, unknown>>;
204
+ /**
205
+ * Emits when every open sheet has closed. Emits immediately on subscribe if
206
+ * there are none open.
207
+ */
208
+ readonly afterAllClosed: Observable<void>;
209
+ /**
210
+ * Opens a sheet using the given component or template.
211
+ * @param content Component class or `TemplateRef`.
212
+ * @param config Options merged over the application defaults.
213
+ * @returns Reference controlling the opened sheet.
214
+ */
215
+ open<R = unknown, D = unknown, C = unknown>(content: ComponentType<C> | TemplateRef<C>, config?: SheetConfig<D, R>): SheetRef<R, C>;
216
+ /** Closes every open sheet managed by this service (and child services). */
217
+ closeAll(): void;
218
+ /** Looks up an open sheet by its id. */
219
+ getSheetById<R = unknown, C = unknown>(id: string): SheetRef<R, C> | undefined;
220
+ ngOnDestroy(): void;
221
+ private registerOpen;
222
+ private unregister;
223
+ private getAfterAllClosedSource;
224
+ private resolveConfig;
225
+ private resolveScrollStrategy;
226
+ private resolvePositionStrategy;
227
+ static ɵfac: i0.ɵɵFactoryDeclaration<Sheet, never>;
228
+ static ɵprov: i0.ɵɵInjectableDeclaration<Sheet>;
229
+ }
230
+ /**
231
+ * Registers the {@link Sheet} service for dependency injection.
232
+ *
233
+ * @param defaultOptions Optional defaults merged into every `open()` call.
234
+ * @example
235
+ * ```ts
236
+ * provideSheet({ side: 'left', size: 'lg' })
237
+ * ```
238
+ */
239
+ declare function provideSheet(defaultOptions?: Partial<SheetConfig>): EnvironmentProviders;
240
+
241
+ /**
242
+ * Header wrapper for a sheet. Provides consistent padding and spacing for
243
+ * title + subtitle + leading icon, and separates the header from scrollable
244
+ * content below.
245
+ */
246
+ declare class SheetHeaderDirective {
247
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetHeaderDirective, never>;
248
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetHeaderDirective, "[twSheetHeader], tw-sheet-header", never, {}, {}, never, never, true, never>;
249
+ }
250
+ /**
251
+ * Decorative leading icon for a sheet header. Use with a semantic `color` to
252
+ * match destructive / informational / success sheets.
253
+ */
254
+ declare class SheetIconDirective {
255
+ /** Semantic color for the icon container. Defaults to a neutral surface. */
256
+ readonly color: i0.InputSignal<TwColor | undefined>;
257
+ protected readonly classes: i0.Signal<string>;
258
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetIconDirective, never>;
259
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetIconDirective, "[twSheetIcon]", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
260
+ }
261
+ /**
262
+ * Sheet title. Registers its ID with the container's `aria-labelledby` queue
263
+ * so screen readers announce it automatically.
264
+ */
265
+ declare class SheetTitleDirective implements OnInit, OnDestroy {
266
+ private readonly generatedId;
267
+ private readonly sheetRef;
268
+ private readonly container;
269
+ /** Custom id for the title element. Defaults to a generated unique id. */
270
+ readonly id: i0.InputSignal<string>;
271
+ ngOnInit(): void;
272
+ ngOnDestroy(): void;
273
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetTitleDirective, never>;
274
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetTitleDirective, "[twSheetTitle], tw-sheet-title", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
275
+ }
276
+ /** Secondary line beneath the sheet title — intended for a short description. */
277
+ declare class SheetSubtitleDirective {
278
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetSubtitleDirective, never>;
279
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetSubtitleDirective, "[twSheetSubtitle], tw-sheet-subtitle", never, {}, {}, never, never, true, never>;
280
+ }
281
+ /**
282
+ * Sheet description. Registers its ID with the container's `aria-describedby`
283
+ * queue so screen readers announce the descriptive paragraph after the title.
284
+ * Mirrors {@link SheetTitleDirective} but for `aria-describedby`.
285
+ */
286
+ declare class SheetDescriptionDirective implements OnInit, OnDestroy {
287
+ private readonly generatedId;
288
+ private readonly sheetRef;
289
+ private readonly container;
290
+ /** Custom id for the description element. Defaults to a generated unique id. */
291
+ readonly id: i0.InputSignal<string>;
292
+ ngOnInit(): void;
293
+ ngOnDestroy(): void;
294
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetDescriptionDirective, never>;
295
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetDescriptionDirective, "[twSheetDescription], tw-sheet-description", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
296
+ }
297
+ /**
298
+ * Scrollable content region of the sheet. Apply between the header and the
299
+ * actions bar. Inherits CDK's `CdkScrollable` to play nicely with scroll
300
+ * strategies and nested scrollables.
301
+ */
302
+ declare class SheetContentDirective {
303
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetContentDirective, never>;
304
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetContentDirective, "[twSheetContent], tw-sheet-content", never, {}, {}, never, never, true, [{ directive: typeof i1.CdkScrollable; inputs: {}; outputs: {}; }]>;
305
+ }
306
+ /** Horizontal alignment for sheet action buttons. */
307
+ type SheetActionsAlign = 'start' | 'center' | 'end';
308
+ /**
309
+ * Bottom action bar of a sheet. Use inside the sheet content or template to
310
+ * host Cancel/Confirm buttons. Stays pinned below scrollable content.
311
+ */
312
+ declare class SheetActionsDirective {
313
+ /** Horizontal alignment of the action buttons. Defaults to `'end'`. */
314
+ readonly align: i0.InputSignal<SheetActionsAlign>;
315
+ protected readonly classes: i0.Signal<string>;
316
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetActionsDirective, never>;
317
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetActionsDirective, "[twSheetActions], tw-sheet-actions", never, { "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
318
+ }
319
+ /**
320
+ * Closes the enclosing sheet when the host button is clicked. Provide a
321
+ * `[twSheetClose]` value to pass a result to `afterClosed()` subscribers.
322
+ */
323
+ declare class SheetCloseDirective {
324
+ /** Value passed to `afterClosed()` when the button is clicked. */
325
+ readonly twSheetClose: i0.InputSignal<unknown>;
326
+ /** Native button `type`. Defaults to `'button'` to avoid accidental form submission. */
327
+ readonly type: i0.InputSignal<"button" | "submit" | "reset">;
328
+ private readonly sheetRef;
329
+ protected onClick(): void;
330
+ static ɵfac: i0.ɵɵFactoryDeclaration<SheetCloseDirective, never>;
331
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SheetCloseDirective, "[twSheetClose]", never, { "twSheetClose": { "alias": "twSheetClose"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
332
+ }
333
+
334
+ export { SHEET_DATA, SHEET_DEFAULT_OPTIONS, Sheet, SheetActionsDirective, SheetCloseDirective, SheetConfig, SheetContainer, SheetContentDirective, SheetDescriptionDirective, SheetHeaderDirective, SheetIconDirective, SheetRef, SheetSubtitleDirective, SheetTitleDirective, provideSheet };
335
+ export type { SheetActionsAlign, SheetAnimationEvent, SheetAutoFocus, SheetRestoreFocus, SheetRole, SheetScrollStrategy, SheetSide, SheetSize, SheetState };
@@ -0,0 +1,52 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Geometric shape of the skeleton placeholder. */
4
+ type SkeletonShape = 'text' | 'rectangle' | 'circle';
5
+ /** Animation style applied to the skeleton. */
6
+ type SkeletonAnimation = 'pulse' | 'wave' | 'none';
7
+ /**
8
+ * Placeholder loading shape (the standard "shimmer" / "pulse") shown where real
9
+ * content will appear. Use inside lists, cards, tables, and detail views to
10
+ * communicate "this region is loading" without layout jump when content arrives.
11
+ *
12
+ * Three shapes (`text`, `rectangle`, `circle`), three animations (`pulse`,
13
+ * `wave`, `none`), arbitrary `width` / `height`, and an optional multi-line
14
+ * text mode. By default the skeleton is hidden from assistive technology
15
+ * (parent owns the announcement); set `announce` to expose `role="status"`.
16
+ *
17
+ * @example
18
+ * ```html
19
+ * <tw-skeleton />
20
+ * <tw-skeleton [lines]="3" />
21
+ * <tw-skeleton shape="circle" [width]="40" [height]="40" />
22
+ * <tw-skeleton shape="rectangle" animation="wave" height="12rem" />
23
+ * ```
24
+ */
25
+ declare class SkeletonComponent {
26
+ /** Geometric shape of the placeholder. `'text'` renders a short rectangle with text-line proportions; `'rectangle'` a free-form block sized by `width`/`height`; `'circle'` a perfect circle (avatar / icon placeholder). Defaults to `'text'`. */
27
+ readonly shape: _angular_core.InputSignal<SkeletonShape>;
28
+ /** Animation style. `'pulse'` fades opacity in and out; `'wave'` sweeps a shimmer across; `'none'` renders a static block. All animations are halted under `prefers-reduced-motion`. Defaults to `'pulse'`. */
29
+ readonly animation: _angular_core.InputSignal<SkeletonAnimation>;
30
+ /** Optional explicit width. Numbers are treated as pixels; strings pass through (e.g. `'50%'`, `'12rem'`, `'auto'`). When undefined, the skeleton fills its container's width (or its shape default for circle). */
31
+ readonly width: _angular_core.InputSignal<string | number | undefined>;
32
+ /** Optional explicit height. Numbers are treated as pixels; strings pass through. When undefined, the skeleton uses its shape default (text-line height for text, `1rem` for rectangle, equal-to-width for circle). */
33
+ readonly height: _angular_core.InputSignal<string | number | undefined>;
34
+ /** Number of stacked text rows to render. Only applies when `shape` is `'text'`. Values greater than 1 render N rows in a vertical stack with a `0.5rem` gap; the last row is rendered at 60% width to mimic a paragraph's final line. Ignored for `'rectangle'` and `'circle'`. Defaults to `1`. */
35
+ readonly lines: _angular_core.InputSignal<number>;
36
+ /** When true, the skeleton announces itself as a busy live region via `role="status"`, `aria-busy="true"`, `aria-live="polite"`, and a visually-hidden label. When false, the skeleton is fully hidden from assistive technology with `aria-hidden="true"` — appropriate when a parent already owns the loading announcement. Defaults to `false`. */
37
+ readonly announce: _angular_core.InputSignalWithTransform<boolean, unknown>;
38
+ protected readonly mode: _angular_core.Signal<"single" | "multi">;
39
+ private readonly variantResult;
40
+ protected readonly rootClasses: _angular_core.Signal<string>;
41
+ protected readonly srClasses: _angular_core.Signal<string>;
42
+ protected readonly rowsArray: _angular_core.Signal<any[]>;
43
+ protected readonly rootStyle: _angular_core.Signal<string>;
44
+ protected rowClass(index: number): string;
45
+ protected rowStyle(index: number): string;
46
+ private styleString;
47
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonComponent, never>;
48
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonComponent, "tw-skeleton", never, { "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "announce": { "alias": "announce"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
49
+ }
50
+
51
+ export { SkeletonComponent };
52
+ export type { SkeletonAnimation, SkeletonShape };
@@ -0,0 +1,258 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnInit, Signal } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
4
+ import { TwColor, TwSize, ErrorStateMatcher } from '@cdevhub/ngx-tw/core';
5
+
6
+ /** Visual style of the slider fill. */
7
+ type SliderVariant = 'solid' | 'soft' | 'outline';
8
+ /** Value emitted by the slider. A plain number for single mode, or `[start, end]` for range mode. */
9
+ type SliderValue = number | readonly [number, number];
10
+ /** A tick mark on the slider scale. Optionally carries a display label. */
11
+ interface SliderMark {
12
+ /** Numeric position of the mark on the slider scale. Must be within `[min, max]`. */
13
+ value: number;
14
+ /** Optional label rendered beneath the mark when `showMarkLabels` is true. */
15
+ label?: string;
16
+ }
17
+ /** Format function for the value displayed in the value bubble, min/max labels, and `aria-valuetext`. */
18
+ type SliderValueFormatter = (value: number) => string;
19
+ /** Identifies which thumb is the interaction target in range mode. */
20
+ type ThumbId = 'single' | 'start' | 'end';
21
+ /**
22
+ * Select a single value or a numeric range from a scale.
23
+ *
24
+ * @example
25
+ * ```html
26
+ * <tw-slider [(value)]="volume" [min]="0" [max]="100" [step]="5" />
27
+ * <tw-slider range [(value)]="priceRange" [min]="0" [max]="1000" [step]="10" showMinMax />
28
+ * <tw-slider [marks]="true" [step]="25" showMarkLabels label="Brightness" />
29
+ * ```
30
+ */
31
+ declare class SliderComponent implements ControlValueAccessor, OnInit {
32
+ /** Lower bound of the slider scale. Defaults to `0`. */
33
+ readonly min: _angular_core.InputSignal<number>;
34
+ /** Upper bound of the slider scale. Defaults to `100`. */
35
+ readonly max: _angular_core.InputSignal<number>;
36
+ /** Step increment used for snapping, keyboard nav, and auto-generated marks. Pass `null` for continuous values. Defaults to `1`. */
37
+ readonly step: _angular_core.InputSignal<number | null>;
38
+ /** Semantic color for the filled portion and thumb border. Defaults to `'primary'`. */
39
+ readonly color: _angular_core.InputSignal<TwColor>;
40
+ /** Overall scale of the rail, thumb, and typography. Defaults to `'md'`. */
41
+ readonly size: _angular_core.InputSignal<TwSize>;
42
+ /** Visual style of the fill: `'solid'` (vivid), `'soft'` (muted), or `'outline'` (rail bordered, fill color-500). Defaults to `'solid'`. */
43
+ readonly variant: _angular_core.InputSignal<SliderVariant>;
44
+ /** When true, prevents interaction and applies muted styling. Defaults to `false`. */
45
+ readonly disabled: _angular_core.InputSignal<boolean>;
46
+ /** When true, sets `aria-required="true"` on the thumb for assistive tech. Defaults to `false`. */
47
+ readonly required: _angular_core.InputSignal<boolean>;
48
+ /** When true, the slider selects a `[start, end]` range and renders two thumbs. Defaults to `false`. */
49
+ readonly range: _angular_core.InputSignal<boolean>;
50
+ /** Tick marks: `true` auto-generates one mark per step, an array supplies custom marks, `false` renders no marks. Defaults to `false`. */
51
+ readonly marks: _angular_core.InputSignal<boolean | SliderMark[]>;
52
+ /** When true, renders the mark labels beneath the rail. Requires `marks` to resolve to a list. Defaults to `false`. */
53
+ readonly showMarkLabels: _angular_core.InputSignal<boolean>;
54
+ /** When true, renders the min and max values at the ends of the scale. Defaults to `false`. */
55
+ readonly showMinMax: _angular_core.InputSignal<boolean>;
56
+ /** When true, renders a value bubble above the active thumb (on hover/focus/drag) and the current value in the header. Defaults to `false`. */
57
+ readonly showValue: _angular_core.InputSignal<boolean>;
58
+ /** Optional visible label rendered above the rail. When set, the slider is wired to the label via `aria-labelledby`. */
59
+ readonly label: _angular_core.InputSignal<string | undefined>;
60
+ /** Optional secondary description rendered under the label. Mirrored to `aria-describedby`. */
61
+ readonly description: _angular_core.InputSignal<string | undefined>;
62
+ /** Custom formatter for the value bubble, min/max labels, and `aria-valuetext`. Defaults to an integer or 2-decimal string. */
63
+ readonly valueFormatter: _angular_core.InputSignal<SliderValueFormatter | undefined>;
64
+ /** Optional form name attribute. Purely informational — the component does not render a native input. */
65
+ readonly name: _angular_core.InputSignal<string | undefined>;
66
+ /** Accessible name for the single-value thumb when no visible label is provided. */
67
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
68
+ /** ID of an external element labelling the single-value thumb. */
69
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
70
+ /** ID of an external element describing the slider. */
71
+ readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
72
+ /** Accessible name for the start (lower) thumb in range mode. Defaults to `"Minimum"`. */
73
+ readonly ariaLabelStart: _angular_core.InputSignal<string>;
74
+ /** Accessible name for the end (upper) thumb in range mode. Defaults to `"Maximum"`. */
75
+ readonly ariaLabelEnd: _angular_core.InputSignal<string>;
76
+ /** Two-way bound slider value. A `number` for single mode, or `[start, end]` for range mode. Updates on every interaction. */
77
+ readonly value: _angular_core.ModelSignal<SliderValue>;
78
+ /** Fires continuously while the user drags or holds a key. Payload matches the current `value`. Template event name is `input` — the TS-side identifier is `valueInput` to avoid shadowing the imported `input` factory. */
79
+ readonly valueInput: _angular_core.OutputEmitterRef<SliderValue>;
80
+ /** Fires when the user commits a change (pointer release, key release, or blur after keyboard change). Payload matches the current `value`. */
81
+ readonly change: _angular_core.OutputEmitterRef<SliderValue>;
82
+ /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the component uses the `TW_ERROR_STATE_MATCHER` token's value. */
83
+ readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
84
+ private readonly focusMonitor;
85
+ private readonly elementRef;
86
+ private readonly destroyRef;
87
+ private readonly directionality;
88
+ private readonly ngControl;
89
+ private readonly parentForm;
90
+ private readonly parentFormGroup;
91
+ private readonly defaultMatcher;
92
+ private readonly _ngControlRev;
93
+ private readonly _formSubmitRev;
94
+ /** Whether the form control is in an error state per the configured `ErrorStateMatcher`. */
95
+ readonly errorState: Signal<boolean>;
96
+ private readonly region;
97
+ private readonly startThumb;
98
+ private readonly endThumb;
99
+ private readonly singleThumb;
100
+ private onChange;
101
+ private onTouched;
102
+ private readonly cvaDisabled;
103
+ /** @internal ID of the host element. */
104
+ private readonly uid;
105
+ /** @internal */
106
+ readonly labelId: string;
107
+ /** @internal */
108
+ readonly descriptionId: string;
109
+ /** @internal */
110
+ readonly singleThumbId: string;
111
+ /** @internal */
112
+ readonly startThumbId: string;
113
+ /** @internal */
114
+ readonly endThumbId: string;
115
+ /** @internal Internal values during drag / interaction, independent of external model. */
116
+ private readonly internalStart;
117
+ private readonly internalEnd;
118
+ private readonly internalSingle;
119
+ /** @internal Which thumb currently has an active pointer gesture (or null). Bound in the template to drive the pressed-thumb styling. */
120
+ readonly activeThumb: _angular_core.WritableSignal<ThumbId | null>;
121
+ /** @internal Which thumb is focused (for bubble visibility). */
122
+ private readonly focusedThumb;
123
+ /** @internal Set of pointer IDs currently captured per-thumb for release tracking. */
124
+ private readonly capturedPointers;
125
+ /** @internal Tracks whether a keyboard interaction has mutated the value since last blur. */
126
+ private keyboardDirty;
127
+ constructor();
128
+ /** @internal Effective disabled state (input OR set via CVA). */
129
+ readonly isDisabled: Signal<boolean>;
130
+ /** @internal Whether a label/value header row should render. */
131
+ readonly hasHeader: Signal<boolean>;
132
+ /** @internal Effective step: min 0 (continuous). */
133
+ private readonly effectiveStep;
134
+ /** @internal Current scale range. */
135
+ private readonly scaleRange;
136
+ /** @internal Whether marks are resolved as a visible list. */
137
+ private readonly marksResolved;
138
+ /** @internal */
139
+ readonly resolvedMarks: Signal<SliderMark[]>;
140
+ /** @internal */
141
+ readonly hasVisibleMarks: Signal<boolean>;
142
+ /** @internal */
143
+ readonly hasMarkLabels: Signal<boolean>;
144
+ /** @internal Clamped current values. */
145
+ readonly startValue: Signal<number>;
146
+ /** @internal */
147
+ readonly endValue: Signal<number>;
148
+ /** @internal */
149
+ readonly singleValue: Signal<number>;
150
+ /** @internal aria-valuemax for the start thumb (cannot cross end thumb). */
151
+ readonly effectiveStartMax: Signal<number>;
152
+ /** @internal aria-valuemin for the end thumb (cannot go below start thumb). */
153
+ readonly effectiveEndMin: Signal<number>;
154
+ /** @internal Percentage position of the single thumb on the rail. */
155
+ readonly singlePct: Signal<number>;
156
+ /** @internal */
157
+ readonly startPct: Signal<number>;
158
+ /** @internal */
159
+ readonly endPct: Signal<number>;
160
+ /** @internal Fill segment position. */
161
+ readonly fillLeftPct: Signal<number>;
162
+ /** @internal */
163
+ readonly fillWidthPct: Signal<number>;
164
+ /** @internal Formatted display of the current value for the header. */
165
+ readonly headerValueText: Signal<string>;
166
+ private readonly variantResult;
167
+ /** @internal */
168
+ readonly rootClasses: Signal<string>;
169
+ /** @internal */
170
+ readonly headerClasses: Signal<string>;
171
+ /** @internal */
172
+ readonly labelClasses: Signal<string>;
173
+ /** @internal */
174
+ readonly valueTextClasses: Signal<string>;
175
+ /** @internal */
176
+ readonly descriptionClasses: Signal<string>;
177
+ /** @internal */
178
+ readonly regionClasses: Signal<string>;
179
+ /** @internal */
180
+ readonly railClasses: Signal<string>;
181
+ /** @internal */
182
+ readonly fillClasses: Signal<string>;
183
+ /** @internal */
184
+ readonly marksRowClasses: Signal<string>;
185
+ /** @internal */
186
+ readonly markLabelsRowClasses: Signal<string>;
187
+ /** @internal */
188
+ readonly markLabelClasses: Signal<string>;
189
+ /** @internal */
190
+ readonly minMaxRowClasses: Signal<string>;
191
+ /** @internal */
192
+ readonly thumbClasses: Signal<string>;
193
+ /**
194
+ * @internal Memoized class map for mark dots — keyed by mark value. Recomputed
195
+ * only when the variant slots, fill range, or marks list changes; lookups
196
+ * from the template (`markClassFor(markValue)`) are O(1) Map reads.
197
+ */
198
+ private readonly markClassMap;
199
+ /** @internal Mark dot color depends on whether it falls inside the filled segment. */
200
+ markClassFor(markValue: number): string;
201
+ /**
202
+ * @internal Memoized bubble classes per thumb — enumerated once per
203
+ * dependency change so each `bubbleClassFor(thumb)` is a single object
204
+ * property read.
205
+ */
206
+ private readonly bubbleClassMap;
207
+ /** @internal Bubble visibility depends on drag / focus / hover state. */
208
+ bubbleClassFor(thumb: ThumbId): string;
209
+ /** @internal */
210
+ readonly resolvedAriaDescribedby: Signal<string | null>;
211
+ /** @internal */
212
+ readonly resolvedSingleAriaLabel: Signal<string | null>;
213
+ /** @internal */
214
+ readonly resolvedSingleAriaLabelledby: Signal<string | null>;
215
+ /** @internal */
216
+ readonly resolvedStartAriaLabel: Signal<string | null>;
217
+ /** @internal */
218
+ readonly resolvedStartAriaLabelledby: Signal<string | null>;
219
+ /** @internal */
220
+ readonly resolvedEndAriaLabel: Signal<string | null>;
221
+ /** @internal */
222
+ readonly resolvedEndAriaLabelledby: Signal<string | null>;
223
+ /** Track click: move the nearest thumb to the clicked position and begin a drag. */
224
+ onTrackPointerDown(event: PointerEvent): void;
225
+ /** Thumb press: capture pointer and begin a drag gesture. */
226
+ onThumbPointerDown(event: PointerEvent, thumb: ThumbId): void;
227
+ private beginDrag;
228
+ private readonly onPointerMove;
229
+ private readonly onPointerUp;
230
+ /** Keyboard navigation: arrows for step, PageUp/Down for 10% jumps, Home/End for extremes. */
231
+ onThumbKeyDown(event: KeyboardEvent, thumb: ThumbId): void;
232
+ /** @internal */
233
+ onThumbBlur(): void;
234
+ /** @internal Clamp to min/max and snap to step. Returns a finite number. */
235
+ private clampAndSnap;
236
+ /** @internal Percent of value along the scale, in [0, 100]. */
237
+ valuePct(value: number): number;
238
+ /** @internal Format a single number using the configured formatter. */
239
+ format(value: number): string;
240
+ private getThumbValue;
241
+ private setThumbValue;
242
+ private updateValueFromClientX;
243
+ private thumbElementFor;
244
+ private nearestThumbFor;
245
+ private currentValue;
246
+ private commitValue;
247
+ private hasAccessibleName;
248
+ writeValue(value: SliderValue | null | undefined): void;
249
+ registerOnChange(fn: (value: SliderValue) => void): void;
250
+ registerOnTouched(fn: () => void): void;
251
+ setDisabledState(isDisabled: boolean): void;
252
+ ngOnInit(): void;
253
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SliderComponent, never>;
254
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SliderComponent, "tw-slider", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "marks": { "alias": "marks"; "required": false; "isSignal": true; }; "showMarkLabels": { "alias": "showMarkLabels"; "required": false; "isSignal": true; }; "showMinMax": { "alias": "showMinMax"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "valueFormatter": { "alias": "valueFormatter"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "ariaLabelStart": { "alias": "ariaLabelStart"; "required": false; "isSignal": true; }; "ariaLabelEnd": { "alias": "ariaLabelEnd"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueInput": "input"; "change": "change"; }, never, never, true, never>;
255
+ }
256
+
257
+ export { SliderComponent };
258
+ export type { SliderMark, SliderValue, SliderValueFormatter, SliderVariant };