forty-cdk 0.2.0 → 0.3.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 (220) hide show
  1. package/accordion/README.md +122 -0
  2. package/aspect-ratio/README.md +76 -0
  3. package/avatar/README.md +100 -0
  4. package/breadcrumbs/README.md +49 -0
  5. package/breakpoints/README.md +81 -0
  6. package/button/README.md +49 -0
  7. package/calendar/README.md +458 -0
  8. package/carousel/README.md +358 -0
  9. package/checkbox/README.md +146 -0
  10. package/combobox/README.md +535 -0
  11. package/context-menu/README.md +139 -0
  12. package/date-field/README.md +184 -0
  13. package/date-picker/README.md +338 -0
  14. package/dialog/README.md +388 -0
  15. package/disclosure/README.md +114 -0
  16. package/drag-drop/README.md +359 -0
  17. package/drawer/README.md +560 -0
  18. package/dropdown-menu/README.md +176 -0
  19. package/fesm2022/forty-cdk-accordion.mjs +348 -0
  20. package/fesm2022/forty-cdk-accordion.mjs.map +1 -0
  21. package/fesm2022/forty-cdk-aspect-ratio.mjs +74 -0
  22. package/fesm2022/forty-cdk-aspect-ratio.mjs.map +1 -0
  23. package/fesm2022/forty-cdk-avatar.mjs +308 -0
  24. package/fesm2022/forty-cdk-avatar.mjs.map +1 -0
  25. package/fesm2022/forty-cdk-breadcrumbs.mjs +125 -0
  26. package/fesm2022/forty-cdk-breadcrumbs.mjs.map +1 -0
  27. package/fesm2022/forty-cdk-breakpoints.mjs +117 -0
  28. package/fesm2022/forty-cdk-breakpoints.mjs.map +1 -0
  29. package/fesm2022/forty-cdk-button.mjs +134 -0
  30. package/fesm2022/forty-cdk-button.mjs.map +1 -0
  31. package/fesm2022/forty-cdk-calendar.mjs +2034 -0
  32. package/fesm2022/forty-cdk-calendar.mjs.map +1 -0
  33. package/fesm2022/forty-cdk-carousel.mjs +968 -0
  34. package/fesm2022/forty-cdk-carousel.mjs.map +1 -0
  35. package/fesm2022/forty-cdk-checkbox.mjs +226 -0
  36. package/fesm2022/forty-cdk-checkbox.mjs.map +1 -0
  37. package/fesm2022/forty-cdk-combobox.mjs +2596 -0
  38. package/fesm2022/forty-cdk-combobox.mjs.map +1 -0
  39. package/fesm2022/forty-cdk-context-menu.mjs +413 -0
  40. package/fesm2022/forty-cdk-context-menu.mjs.map +1 -0
  41. package/fesm2022/forty-cdk-core.mjs +9022 -0
  42. package/fesm2022/forty-cdk-core.mjs.map +1 -0
  43. package/fesm2022/forty-cdk-date-field.mjs +744 -0
  44. package/fesm2022/forty-cdk-date-field.mjs.map +1 -0
  45. package/fesm2022/forty-cdk-date-picker.mjs +1011 -0
  46. package/fesm2022/forty-cdk-date-picker.mjs.map +1 -0
  47. package/fesm2022/forty-cdk-dialog.mjs +707 -0
  48. package/fesm2022/forty-cdk-dialog.mjs.map +1 -0
  49. package/fesm2022/forty-cdk-disclosure.mjs +190 -0
  50. package/fesm2022/forty-cdk-disclosure.mjs.map +1 -0
  51. package/fesm2022/forty-cdk-drag-drop.mjs +1180 -0
  52. package/fesm2022/forty-cdk-drag-drop.mjs.map +1 -0
  53. package/fesm2022/forty-cdk-drawer.mjs +1641 -0
  54. package/fesm2022/forty-cdk-drawer.mjs.map +1 -0
  55. package/fesm2022/forty-cdk-dropdown-menu.mjs +350 -0
  56. package/fesm2022/forty-cdk-dropdown-menu.mjs.map +1 -0
  57. package/fesm2022/forty-cdk-field.mjs +425 -0
  58. package/fesm2022/forty-cdk-field.mjs.map +1 -0
  59. package/fesm2022/forty-cdk-fieldset.mjs +164 -0
  60. package/fesm2022/forty-cdk-fieldset.mjs.map +1 -0
  61. package/fesm2022/forty-cdk-file-upload.mjs +221 -0
  62. package/fesm2022/forty-cdk-file-upload.mjs.map +1 -0
  63. package/fesm2022/forty-cdk-hover-card.mjs +496 -0
  64. package/fesm2022/forty-cdk-hover-card.mjs.map +1 -0
  65. package/fesm2022/forty-cdk-input.mjs +274 -0
  66. package/fesm2022/forty-cdk-input.mjs.map +1 -0
  67. package/fesm2022/forty-cdk-internationalized-date.mjs +1 -1
  68. package/fesm2022/forty-cdk-internationalized-date.mjs.map +1 -1
  69. package/fesm2022/forty-cdk-listbox.mjs +1279 -0
  70. package/fesm2022/forty-cdk-listbox.mjs.map +1 -0
  71. package/fesm2022/forty-cdk-menu.mjs +1439 -0
  72. package/fesm2022/forty-cdk-menu.mjs.map +1 -0
  73. package/fesm2022/forty-cdk-menubar.mjs +787 -0
  74. package/fesm2022/forty-cdk-menubar.mjs.map +1 -0
  75. package/fesm2022/forty-cdk-meter.mjs +211 -0
  76. package/fesm2022/forty-cdk-meter.mjs.map +1 -0
  77. package/fesm2022/forty-cdk-navigation-menu.mjs +1145 -0
  78. package/fesm2022/forty-cdk-navigation-menu.mjs.map +1 -0
  79. package/fesm2022/forty-cdk-number-input.mjs +559 -0
  80. package/fesm2022/forty-cdk-number-input.mjs.map +1 -0
  81. package/fesm2022/forty-cdk-otp-input.mjs +527 -0
  82. package/fesm2022/forty-cdk-otp-input.mjs.map +1 -0
  83. package/fesm2022/forty-cdk-pagination.mjs +323 -0
  84. package/fesm2022/forty-cdk-pagination.mjs.map +1 -0
  85. package/fesm2022/forty-cdk-pane-resizer.mjs +297 -0
  86. package/fesm2022/forty-cdk-pane-resizer.mjs.map +1 -0
  87. package/fesm2022/forty-cdk-popover.mjs +698 -0
  88. package/fesm2022/forty-cdk-popover.mjs.map +1 -0
  89. package/fesm2022/forty-cdk-progress.mjs +226 -0
  90. package/fesm2022/forty-cdk-progress.mjs.map +1 -0
  91. package/fesm2022/forty-cdk-radio-group.mjs +378 -0
  92. package/fesm2022/forty-cdk-radio-group.mjs.map +1 -0
  93. package/fesm2022/forty-cdk-scroll-area.mjs +640 -0
  94. package/fesm2022/forty-cdk-scroll-area.mjs.map +1 -0
  95. package/fesm2022/forty-cdk-search.mjs +205 -0
  96. package/fesm2022/forty-cdk-search.mjs.map +1 -0
  97. package/fesm2022/forty-cdk-select.mjs +1661 -0
  98. package/fesm2022/forty-cdk-select.mjs.map +1 -0
  99. package/fesm2022/forty-cdk-separator.mjs +82 -0
  100. package/fesm2022/forty-cdk-separator.mjs.map +1 -0
  101. package/fesm2022/forty-cdk-signal-forms.mjs +97 -0
  102. package/fesm2022/forty-cdk-signal-forms.mjs.map +1 -0
  103. package/fesm2022/forty-cdk-slider.mjs +803 -0
  104. package/fesm2022/forty-cdk-slider.mjs.map +1 -0
  105. package/fesm2022/forty-cdk-stepper.mjs +886 -0
  106. package/fesm2022/forty-cdk-stepper.mjs.map +1 -0
  107. package/fesm2022/forty-cdk-switch.mjs +137 -0
  108. package/fesm2022/forty-cdk-switch.mjs.map +1 -0
  109. package/fesm2022/forty-cdk-table.mjs +1518 -0
  110. package/fesm2022/forty-cdk-table.mjs.map +1 -0
  111. package/fesm2022/forty-cdk-tabs.mjs +400 -0
  112. package/fesm2022/forty-cdk-tabs.mjs.map +1 -0
  113. package/fesm2022/forty-cdk-time-field.mjs +593 -0
  114. package/fesm2022/forty-cdk-time-field.mjs.map +1 -0
  115. package/fesm2022/forty-cdk-time-picker.mjs +1013 -0
  116. package/fesm2022/forty-cdk-time-picker.mjs.map +1 -0
  117. package/fesm2022/forty-cdk-toast.mjs +1153 -0
  118. package/fesm2022/forty-cdk-toast.mjs.map +1 -0
  119. package/fesm2022/forty-cdk-toggle.mjs +516 -0
  120. package/fesm2022/forty-cdk-toggle.mjs.map +1 -0
  121. package/fesm2022/forty-cdk-toolbar.mjs +374 -0
  122. package/fesm2022/forty-cdk-toolbar.mjs.map +1 -0
  123. package/fesm2022/forty-cdk-tooltip.mjs +672 -0
  124. package/fesm2022/forty-cdk-tooltip.mjs.map +1 -0
  125. package/fesm2022/forty-cdk-tree.mjs +2007 -0
  126. package/fesm2022/forty-cdk-tree.mjs.map +1 -0
  127. package/fesm2022/forty-cdk-virtualization.mjs +1 -1
  128. package/fesm2022/forty-cdk-virtualization.mjs.map +1 -1
  129. package/fesm2022/forty-cdk.mjs +0 -43310
  130. package/fesm2022/forty-cdk.mjs.map +1 -1
  131. package/field/README.md +97 -0
  132. package/fieldset/README.md +86 -0
  133. package/file-upload/README.md +73 -0
  134. package/hover-card/README.md +171 -0
  135. package/input/README.md +156 -0
  136. package/listbox/README.md +424 -0
  137. package/menu/README.md +181 -0
  138. package/menubar/README.md +140 -0
  139. package/meter/README.md +128 -0
  140. package/navigation-menu/README.md +253 -0
  141. package/number-input/README.md +171 -0
  142. package/otp-input/README.md +198 -0
  143. package/package.json +213 -1
  144. package/pagination/README.md +61 -0
  145. package/pane-resizer/README.md +136 -0
  146. package/popover/README.md +262 -0
  147. package/progress/README.md +115 -0
  148. package/radio-group/README.md +129 -0
  149. package/scroll-area/README.md +184 -0
  150. package/search/README.md +42 -0
  151. package/select/README.md +488 -0
  152. package/separator/README.md +84 -0
  153. package/signal-forms/README.md +72 -0
  154. package/slider/README.md +152 -0
  155. package/stepper/README.md +292 -0
  156. package/switch/README.md +116 -0
  157. package/table/README.md +769 -0
  158. package/tabs/README.md +130 -0
  159. package/time-field/README.md +157 -0
  160. package/time-picker/README.md +172 -0
  161. package/toast/README.md +398 -0
  162. package/toggle/README.md +224 -0
  163. package/toolbar/README.md +109 -0
  164. package/tooltip/README.md +274 -0
  165. package/tree/README.md +708 -0
  166. package/types/forty-cdk-accordion.d.ts +242 -0
  167. package/types/forty-cdk-aspect-ratio.d.ts +59 -0
  168. package/types/forty-cdk-avatar.d.ts +133 -0
  169. package/types/forty-cdk-breadcrumbs.d.ts +92 -0
  170. package/types/forty-cdk-breakpoints.d.ts +141 -0
  171. package/types/forty-cdk-button.d.ts +80 -0
  172. package/types/forty-cdk-calendar.d.ts +914 -0
  173. package/types/forty-cdk-carousel.d.ts +530 -0
  174. package/types/forty-cdk-checkbox.d.ts +141 -0
  175. package/types/forty-cdk-combobox.d.ts +1259 -0
  176. package/types/forty-cdk-context-menu.d.ts +313 -0
  177. package/types/forty-cdk-core.d.ts +5774 -0
  178. package/types/forty-cdk-date-field.d.ts +307 -0
  179. package/types/forty-cdk-date-picker.d.ts +622 -0
  180. package/types/forty-cdk-dialog.d.ts +546 -0
  181. package/types/forty-cdk-disclosure.d.ts +127 -0
  182. package/types/forty-cdk-drag-drop.d.ts +456 -0
  183. package/types/forty-cdk-drawer.d.ts +871 -0
  184. package/types/forty-cdk-dropdown-menu.d.ts +242 -0
  185. package/types/forty-cdk-field.d.ts +236 -0
  186. package/types/forty-cdk-fieldset.d.ts +119 -0
  187. package/types/forty-cdk-file-upload.d.ts +124 -0
  188. package/types/forty-cdk-hover-card.d.ts +320 -0
  189. package/types/forty-cdk-input.d.ts +169 -0
  190. package/types/forty-cdk-internationalized-date.d.ts +1 -1
  191. package/types/forty-cdk-listbox.d.ts +513 -0
  192. package/types/forty-cdk-menu.d.ts +629 -0
  193. package/types/forty-cdk-menubar.d.ts +451 -0
  194. package/types/forty-cdk-meter.d.ts +122 -0
  195. package/types/forty-cdk-navigation-menu.d.ts +514 -0
  196. package/types/forty-cdk-number-input.d.ts +319 -0
  197. package/types/forty-cdk-otp-input.d.ts +248 -0
  198. package/types/forty-cdk-pagination.d.ts +214 -0
  199. package/types/forty-cdk-pane-resizer.d.ts +145 -0
  200. package/types/forty-cdk-popover.d.ts +509 -0
  201. package/types/forty-cdk-progress.d.ts +143 -0
  202. package/types/forty-cdk-radio-group.d.ts +222 -0
  203. package/types/forty-cdk-scroll-area.d.ts +258 -0
  204. package/types/forty-cdk-search.d.ts +142 -0
  205. package/types/forty-cdk-select.d.ts +899 -0
  206. package/types/forty-cdk-separator.d.ts +59 -0
  207. package/types/forty-cdk-signal-forms.d.ts +58 -0
  208. package/types/forty-cdk-slider.d.ts +379 -0
  209. package/types/forty-cdk-stepper.d.ts +650 -0
  210. package/types/forty-cdk-switch.d.ts +87 -0
  211. package/types/forty-cdk-table.d.ts +723 -0
  212. package/types/forty-cdk-tabs.d.ts +235 -0
  213. package/types/forty-cdk-time-field.d.ts +307 -0
  214. package/types/forty-cdk-time-picker.d.ts +578 -0
  215. package/types/forty-cdk-toast.d.ts +598 -0
  216. package/types/forty-cdk-toggle.d.ts +310 -0
  217. package/types/forty-cdk-toolbar.d.ts +217 -0
  218. package/types/forty-cdk-tooltip.d.ts +436 -0
  219. package/types/forty-cdk-tree.d.ts +688 -0
  220. package/types/forty-cdk.d.ts +1 -19743
@@ -0,0 +1,530 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, Signal, Provider } from '@angular/core';
3
+ import { WritingDirection, RovingTabindex, ListNavigationAction } from 'forty-cdk/core';
4
+ import * as forty_cdk_carousel from 'forty-cdk/carousel';
5
+
6
+ /** Alignment of the active slide within the viewport. */
7
+ type CarouselAlign = 'start' | 'center' | 'end';
8
+ /** Internal handle for a registered slide. */
9
+ interface ForCarouselSlideHandle {
10
+ readonly host: HTMLElement;
11
+ }
12
+ /** Internal handle for a registered indicator (dot). */
13
+ interface ForCarouselIndicatorHandle {
14
+ readonly host: HTMLElement;
15
+ readonly disabled: Signal<boolean>;
16
+ }
17
+ /**
18
+ * Coordination contract owned by `ForCarousel`. Slides and indicators
19
+ * register with the root so index lookups, geometry computations, and
20
+ * keyboard navigation are all driven from a single source of truth.
21
+ */
22
+ interface ForCarouselContext {
23
+ readonly activeIndex: Signal<number>;
24
+ readonly orientation: Signal<'horizontal' | 'vertical'>;
25
+ readonly dir: Signal<WritingDirection>;
26
+ readonly loop: Signal<boolean>;
27
+ readonly align: Signal<CarouselAlign>;
28
+ readonly slidesPerView: Signal<number>;
29
+ readonly slideCount: Signal<number>;
30
+ readonly roving: RovingTabindex;
31
+ /** Whether auto-rotation is currently "on" (user intent). Drives the rotation control's label. */
32
+ readonly playing: Signal<boolean>;
33
+ /** Whether the carousel is actively auto-rotating right now (`playing && !paused`). Drives the viewport's `aria-live`. */
34
+ readonly rotating: Signal<boolean>;
35
+ canScrollPrev(): boolean;
36
+ canScrollNext(): boolean;
37
+ scrollPrev(): void;
38
+ scrollNext(): void;
39
+ scrollTo(index: number): void;
40
+ navigate(currentIndicator: HTMLElement, action: ListNavigationAction): void;
41
+ /** Toggle auto-rotation on/off (the explicit, sticky user choice). Called by the rotation control. */
42
+ toggleAutoplay(): void;
43
+ registerSlide(handle: ForCarouselSlideHandle): void;
44
+ unregisterSlide(handle: ForCarouselSlideHandle): void;
45
+ registerIndicator(handle: ForCarouselIndicatorHandle): void;
46
+ unregisterIndicator(handle: ForCarouselIndicatorHandle): void;
47
+ setViewport(el: HTMLElement, id: string): void;
48
+ viewportId(): string | null;
49
+ indexOfSlide(host: HTMLElement): number;
50
+ indexOfIndicator(host: HTMLElement): number;
51
+ /** Resolve the positional slide `aria-label` (`"N of M"` by default). `position` is 1-based. */
52
+ slideLabel(position: number): string;
53
+ /** Resolve the indicator `aria-label` (`"Go to slide N"` by default). `position` is 1-based. */
54
+ indicatorLabel(position: number): string;
55
+ isCurrent(index: number): boolean;
56
+ isInView(index: number): boolean;
57
+ isFirstEnabledIndicator(el: HTMLElement): boolean;
58
+ hasCurrentIndicator(): boolean;
59
+ }
60
+ /** DI token providing the carousel context to descendant pieces. */
61
+ declare const FOR_CAROUSEL_CONTEXT: InjectionToken<ForCarouselContext>;
62
+
63
+ /**
64
+ * Root of the Carousel primitive. Owns the active index, slide collection,
65
+ * indicator collection, roving tabindex tracker, and computed geometry CSS
66
+ * variables. Provides the shared context to descendant pieces.
67
+ *
68
+ * Implements the [WAI-ARIA APG Carousel pattern](https://www.w3.org/WAI/ARIA/apg/patterns/carousel/).
69
+ *
70
+ * With no `[forCarouselIndicators]` rendered this is a basic carousel driven
71
+ * by prev/next buttons only. Adding an indicator group enables APG picker
72
+ * semantics: roving tabindex, arrow/Home/End navigation with automatic
73
+ * activation.
74
+ */
75
+ declare class ForCarousel implements ForCarouselContext {
76
+ #private;
77
+ /**
78
+ * Two-way bindable. The zero-based index of the current (leading) slide.
79
+ * The `model()` change emitter (`(activeIndexChange)`) fires only on internal
80
+ * navigation (prev/next button clicks, indicator arrow-key or click), never
81
+ * on consumer writes via `[(activeIndex)]`.
82
+ */
83
+ readonly activeIndex: _angular_core.ModelSignal<number>;
84
+ /** Scroll axis. `'horizontal'` (default) or `'vertical'`. */
85
+ readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
86
+ /**
87
+ * Whether index wrap-around is enabled. When `true`, `next` past the last
88
+ * slide wraps to index 0; `prev` before index 0 wraps to the last. Default
89
+ * comes from `provideForCarouselDefaults` or the library fallback (`false`).
90
+ */
91
+ readonly loop: _angular_core.InputSignalWithTransform<boolean, unknown>;
92
+ /**
93
+ * Alignment of the active slide within the viewport. Affects the
94
+ * `--for-carousel-offset` computation. Default from `provideForCarouselDefaults`
95
+ * or `'start'`.
96
+ */
97
+ readonly align: _angular_core.InputSignal<CarouselAlign>;
98
+ /**
99
+ * Number of slides simultaneously visible in the viewport. Slide width
100
+ * should be set to `calc(100% / var(--for-carousel-slides-per-view))` in
101
+ * the consumer's CSS. Default from `provideForCarouselDefaults` or `1`.
102
+ */
103
+ readonly slidesPerView: _angular_core.InputSignalWithTransform<number, unknown>;
104
+ /**
105
+ * When `true` and the carousel is not looping, clamps `--for-carousel-offset` so the
106
+ * trailing slides align flush to the viewport's trailing edge instead of overscrolling
107
+ * into empty space (relevant when `slidesPerView > 1`). The one-indicator-per-slide
108
+ * mapping is preserved — `activeIndex` still reaches the last slide; only the visual
109
+ * offset is contained. No effect when `loop` is enabled or `slidesPerView` is 1.
110
+ * Default from `provideForCarouselDefaults` or `false`.
111
+ */
112
+ readonly containScroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
113
+ /**
114
+ * Accessible label for the carousel root (`role="group"`). Should describe
115
+ * the carousel's purpose without using the word "carousel" (APG guidance).
116
+ * When null (default), no `aria-label` is emitted; use `aria-labelledby`
117
+ * instead when a visible heading labels the carousel.
118
+ */
119
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
120
+ /**
121
+ * Whether the carousel auto-rotates. When `true` and the user has not
122
+ * explicitly stopped it, rotation starts on mount — *unless*
123
+ * `prefers-reduced-motion: reduce` is set, which suppresses auto-start
124
+ * (the user can still start it via the rotation control). Default from
125
+ * `provideForCarouselDefaults` or `false`.
126
+ *
127
+ * APG requires a `[forCarouselRotationControl]` to be present whenever
128
+ * autoplay is enabled. The directive does not enforce this — see the README.
129
+ */
130
+ readonly autoplay: _angular_core.InputSignalWithTransform<boolean, unknown>;
131
+ /**
132
+ * Milliseconds between automatic slide advances while rotating. Values
133
+ * `<= 0` disable the timer. Default from `provideForCarouselDefaults` or `5000`.
134
+ */
135
+ readonly autoplayInterval: _angular_core.InputSignalWithTransform<number, unknown>;
136
+ /**
137
+ * Writing direction. When unset (default `null`), the inherited ambient
138
+ * direction is resolved from the nearest ancestor carrying a `dir` attribute
139
+ * (or `<html dir>`), defaulting to `'ltr'`. An explicit `[dir]` always wins.
140
+ * The resolved value is reflected to the host `dir` attribute and swaps
141
+ * ArrowLeft / ArrowRight semantics on the indicator group in RTL.
142
+ */
143
+ readonly _dirInput: _angular_core.InputSignal<WritingDirection | null>;
144
+ readonly dir: _angular_core.Signal<WritingDirection>;
145
+ /** Roving tabindex tracker for the indicator group. */
146
+ readonly roving: RovingTabindex;
147
+ /** Whether auto-rotation is "on" (user intent). Sticky once the user decides. */
148
+ readonly playing: _angular_core.Signal<boolean>;
149
+ /** Whether the carousel is actively auto-rotating right now. */
150
+ readonly rotating: _angular_core.Signal<boolean>;
151
+ /** Total number of registered slides. Reactive. */
152
+ readonly slideCount: _angular_core.Signal<number>;
153
+ /**
154
+ * The `--for-carousel-offset` value to apply via `transform` on the track.
155
+ * Pure arithmetic — no layout measurement — so it is safe in Vitest.
156
+ */
157
+ readonly offset: _angular_core.Signal<string>;
158
+ /** The measured viewport width, or `null` before first measurement / on the server. */
159
+ readonly viewportWidth: _angular_core.Signal<string | null>;
160
+ /** The measured viewport height, or `null` before first measurement / on the server. */
161
+ readonly viewportHeight: _angular_core.Signal<string | null>;
162
+ constructor();
163
+ /** Returns `true` when scrolling backward is possible given the current loop/index state. */
164
+ canScrollPrev(): boolean;
165
+ /** Returns `true` when scrolling forward is possible given the current loop/index state. */
166
+ canScrollNext(): boolean;
167
+ /** Navigate to the previous slide. No-op at index 0 when not looping. */
168
+ scrollPrev(): void;
169
+ /** Navigate to the next slide. No-op at the last index when not looping. */
170
+ scrollNext(): void;
171
+ /**
172
+ * Navigate to the slide at `index`. Clamps to `[0, slideCount-1]` when not
173
+ * looping; wraps modulo `slideCount` when looping.
174
+ */
175
+ scrollTo(index: number): void;
176
+ /**
177
+ * Move focus from `currentIndicator` according to `action` and activate the
178
+ * target slide (automatic activation). Used by `ForCarouselIndicator`'s
179
+ * keydown handler.
180
+ */
181
+ navigate(currentIndicator: HTMLElement, action: ListNavigationAction): void;
182
+ registerSlide(handle: ForCarouselSlideHandle): void;
183
+ unregisterSlide(handle: ForCarouselSlideHandle): void;
184
+ registerIndicator(handle: ForCarouselIndicatorHandle): void;
185
+ unregisterIndicator(handle: ForCarouselIndicatorHandle): void;
186
+ /** Called by `ForCarouselViewport` at construction to wire the geometry observer. */
187
+ setViewport(el: HTMLElement, id: string): void;
188
+ /** The id of the registered viewport element, or `null` if none is mounted. */
189
+ viewportId(): string | null;
190
+ /** DOM-order index of the registered slide whose host equals `host`, or -1. */
191
+ indexOfSlide(host: HTMLElement): number;
192
+ /** DOM-order index of the registered indicator whose host equals `host`, or -1. */
193
+ indexOfIndicator(host: HTMLElement): number;
194
+ /**
195
+ * Resolve the positional slide `aria-label` from the scope's defaults
196
+ * (`"N of M"` unless localized via `provideForCarouselDefaults`).
197
+ * `position` is the 1-based slide index.
198
+ */
199
+ slideLabel(position: number): string;
200
+ /**
201
+ * Resolve the indicator `aria-label` from the scope's defaults
202
+ * (`"Go to slide N"` unless localized via `provideForCarouselDefaults`).
203
+ * `position` is the 1-based slide index.
204
+ */
205
+ indicatorLabel(position: number): string;
206
+ /** Returns `true` when `index` is the current active slide index. */
207
+ isCurrent(index: number): boolean;
208
+ /**
209
+ * Returns `true` when `index` falls within the visible window
210
+ * `[activeIndex, activeIndex + slidesPerView - 1]`.
211
+ */
212
+ isInView(index: number): boolean;
213
+ /**
214
+ * Returns `true` when `el` is the host of the first non-disabled indicator
215
+ * in DOM order. Used by the tabindex fallback when no indicator is current.
216
+ */
217
+ isFirstEnabledIndicator(el: HTMLElement): boolean;
218
+ /**
219
+ * Returns `true` when at least one registered, non-disabled indicator
220
+ * matches the current `activeIndex`. Used by the tabindex ladder to decide
221
+ * whether the first-enabled fallback must reclaim the tab stop.
222
+ *
223
+ * Assumes the one-indicator-per-slide mapping the rest of the picker is built
224
+ * on: the indicator at DOM index `i` targets slide `i`. A mismatched indicator
225
+ * count is dev-guarded by a `console.warn` at construction.
226
+ */
227
+ hasCurrentIndicator(): boolean;
228
+ /** Start auto-rotation (explicit, sticky). Overrides the reduced-motion auto-start gate. */
229
+ play(): void;
230
+ /** Stop auto-rotation (explicit, sticky). Hover/focus/visibility changes will not restart it. */
231
+ pause(): void;
232
+ /** Toggle auto-rotation. Called by `[forCarouselRotationControl]`. */
233
+ toggleAutoplay(): void;
234
+ protected onAutoplayPause(reason: 'hover' | 'focus'): void;
235
+ protected onAutoplayResume(reason: 'hover' | 'focus'): void;
236
+ protected onAutoplayFocusOut(event: FocusEvent): void;
237
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarousel, never>;
238
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarousel, "[forCarousel]", ["forCarousel"], { "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "slidesPerView": { "alias": "slidesPerView"; "required": false; "isSignal": true; }; "containScroll": { "alias": "containScroll"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "autoplay": { "alias": "autoplay"; "required": false; "isSignal": true; }; "autoplayInterval": { "alias": "autoplayInterval"; "required": false; "isSignal": true; }; "_dirInput": { "alias": "dir"; "required": false; "isSignal": true; }; }, { "activeIndex": "activeIndexChange"; }, never, never, true, never>;
239
+ }
240
+
241
+ /**
242
+ * Clips the visible window of the carousel track. Acts as the APG-mandated
243
+ * live region for screen-reader announcements. `aria-live` flips between
244
+ * `"off"` while the carousel is actively auto-rotating (so advancing slides
245
+ * do not bombard the screen reader) and `"polite"` at all other times so
246
+ * manual navigation is announced. Also serves as the `aria-controls` target
247
+ * for the prev/next buttons.
248
+ *
249
+ * Registers itself with the carousel root on construction so the root's
250
+ * `injectElementSize` observer starts and prev/next's `aria-controls` resolves.
251
+ * There must be exactly one viewport per carousel.
252
+ */
253
+ declare class ForCarouselViewport {
254
+ #private;
255
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
256
+ /** The resolved id of this element — generated or adopted from a consumer-set static `id`. */
257
+ readonly id: _angular_core.Signal<string>;
258
+ constructor();
259
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselViewport, never>;
260
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselViewport, "[forCarouselViewport]", ["forCarouselViewport"], {}, {}, never, never, true, never>;
261
+ }
262
+
263
+ /**
264
+ * The flex container of slides. The consumer's CSS reads
265
+ * `--for-carousel-offset` (inherited from the root) and applies it as a
266
+ * `transform: translateX(...)` / `translateY(...)` on this element.
267
+ * The directive adds no animation or transform itself.
268
+ *
269
+ * Reflects `data-orientation` so the consumer can select the correct CSS
270
+ * axis via `[data-orientation="vertical"] [forCarouselTrack] { ... }`.
271
+ */
272
+ declare class ForCarouselTrack {
273
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
274
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselTrack, never>;
275
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselTrack, "[forCarouselTrack]", ["forCarouselTrack"], {}, {}, never, never, true, never>;
276
+ }
277
+
278
+ /**
279
+ * One slide in the carousel track. Carries `role="group"` and
280
+ * `aria-roledescription="slide"` per the WAI-ARIA APG Carousel pattern.
281
+ *
282
+ * The default `aria-label` is the positional `"N of M"` string (APG mandates
283
+ * a positional label on each slide). Set `ariaLabel` to override with a
284
+ * semantically richer label for the specific slide content.
285
+ *
286
+ * Off-view slides (outside `[activeIndex, activeIndex + slidesPerView - 1]`)
287
+ * are hidden from the accessibility tree and focus order via
288
+ * `aria-hidden="true"` + `inert`.
289
+ */
290
+ declare class ForCarouselSlide {
291
+ #private;
292
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
293
+ /**
294
+ * Override the default positional `aria-label` (`"N of M"`). Use this to
295
+ * provide a semantically richer label when the slide's content has a
296
+ * meaningful title (e.g. the product name). When `null` (default), the
297
+ * positional label is used automatically. Localize that default format
298
+ * app-wide via `provideForCarouselDefaults`'s `slideLabel`.
299
+ */
300
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
301
+ /** Whether this is the current (active) slide. */
302
+ protected readonly current: _angular_core.Signal<boolean>;
303
+ /** Whether this slide is within the visible window. */
304
+ protected readonly inView: _angular_core.Signal<boolean>;
305
+ /** The positional `"N of M"` label used when no explicit `ariaLabel` is set. */
306
+ protected readonly positionLabel: _angular_core.Signal<string | null>;
307
+ constructor();
308
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselSlide, never>;
309
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselSlide, "[forCarouselSlide]", ["forCarouselSlide"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
310
+ }
311
+
312
+ /**
313
+ * Previous-slide button. Apply on a `<button>` so Enter/Space activation is
314
+ * native. Disabled (via the native `disabled` attribute) at index 0 when the
315
+ * carousel is not looping. When `loop` is `true` it is never disabled.
316
+ *
317
+ * Points `aria-controls` at the viewport's id so screen readers announce the
318
+ * relationship. Clicking does not move focus (APG).
319
+ */
320
+ declare class ForCarouselPrevious {
321
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
322
+ /**
323
+ * Accessible label for this button (e.g. "Previous slide"). When `null`
324
+ * (default), no `aria-label` is emitted — the consumer should supply a
325
+ * visible label or set this input.
326
+ */
327
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
328
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
329
+ constructor();
330
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselPrevious, never>;
331
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselPrevious, "[forCarouselPrevious]", ["forCarouselPrevious"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
332
+ }
333
+
334
+ /**
335
+ * Next-slide button. Apply on a `<button>` so Enter/Space activation is
336
+ * native. Disabled (via the native `disabled` attribute) at the last index
337
+ * when the carousel is not looping. When `loop` is `true` it is never disabled.
338
+ *
339
+ * Points `aria-controls` at the viewport's id so screen readers announce the
340
+ * relationship. Clicking does not move focus (APG).
341
+ */
342
+ declare class ForCarouselNext {
343
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
344
+ /**
345
+ * Accessible label for this button (e.g. "Next slide"). When `null`
346
+ * (default), no `aria-label` is emitted — the consumer should supply a
347
+ * visible label or set this input.
348
+ */
349
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
350
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
351
+ constructor();
352
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselNext, never>;
353
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselNext, "[forCarouselNext]", ["forCarouselNext"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
354
+ }
355
+
356
+ /**
357
+ * The slide-picker group (dot navigation). Renders as `role="group"` and
358
+ * should receive an `ariaLabel` describing its purpose (e.g. "Choose slide
359
+ * to display") per the WAI-ARIA APG Carousel pattern.
360
+ *
361
+ * Keyboard navigation (ArrowLeft/Right, Home/End) and automatic activation
362
+ * live on each `[forCarouselIndicator]` child, not on this container.
363
+ */
364
+ declare class ForCarouselIndicators {
365
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
366
+ /**
367
+ * Accessible label for the picker group (e.g. "Choose slide to display").
368
+ * APG recommends labelling the group so screen readers can distinguish it
369
+ * from other landmarks.
370
+ */
371
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
372
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselIndicators, never>;
373
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselIndicators, "[forCarouselIndicators]", ["forCarouselIndicators"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
374
+ }
375
+
376
+ /**
377
+ * One indicator (dot) in the slide picker. Apply on a `<button>` so
378
+ * Enter/Space activation is native. Uses roving tabindex — only the current
379
+ * dot owns `tabindex=0`; all others have `tabindex=-1`. Arrow/Home/End
380
+ * navigation activates the target slide automatically (APG "grouped/tabbed
381
+ * picker" variant).
382
+ *
383
+ * The current indicator is marked with `aria-current="true"` (truthy-only).
384
+ * Disabled indicators receive `aria-disabled="true"` and `data-disabled` but
385
+ * stay focusable (custom-role rule) so assistive tech can announce them.
386
+ */
387
+ declare class ForCarouselIndicator {
388
+ #private;
389
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
390
+ /**
391
+ * Override the default positional `aria-label` (e.g. `"Go to slide 1"`).
392
+ * Use this to provide a more descriptive label when the slide has a title.
393
+ * Localize that default format app-wide via `provideForCarouselDefaults`'s
394
+ * `indicatorLabel`.
395
+ */
396
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
397
+ /**
398
+ * Disables this indicator. Disabled indicators remain focusable (for
399
+ * assistive tech) but ignore click and keyboard activation.
400
+ */
401
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
402
+ /** Whether this indicator corresponds to the current active slide. */
403
+ protected readonly current: _angular_core.Signal<boolean>;
404
+ /** Default positional label used when no explicit `ariaLabel` is set. */
405
+ protected readonly positionLabel: _angular_core.Signal<string | null>;
406
+ /**
407
+ * APG roving tabindex: user-driven roving owns it once any indicator has
408
+ * been focused. Before that, fall back to "current slide's indicator, else
409
+ * first enabled".
410
+ */
411
+ protected readonly tabindex: _angular_core.Signal<0 | -1>;
412
+ constructor();
413
+ protected onClick(): void;
414
+ protected onFocus(): void;
415
+ protected onKeyDown(event: KeyboardEvent): void;
416
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselIndicator, never>;
417
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselIndicator, "[forCarouselIndicator]", ["forCarouselIndicator"], { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
418
+ }
419
+
420
+ /**
421
+ * Play/pause control for carousel auto-rotation. Apply on a `<button>` so
422
+ * Enter/Space activation is native. Its accessible name swaps with the
423
+ * rotation state — `stopLabel` while rotating, `startLabel` while stopped —
424
+ * per the WAI-ARIA APG Carousel pattern, which forbids `aria-pressed` here.
425
+ *
426
+ * Place this control **first** in the carousel's DOM/tab order so assistive
427
+ * technology users meet it before the rotating content (APG requirement).
428
+ *
429
+ * Reflects a boolean `data-playing` attribute (present while rotation is on)
430
+ * as the styling hook for swapping a play/pause icon.
431
+ */
432
+ declare class ForCarouselRotationControl {
433
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
434
+ /** Accessible name shown while rotation is **stopped** (the button will start it). */
435
+ readonly startLabel: _angular_core.InputSignal<string>;
436
+ /** Accessible name shown while rotation is **playing** (the button will stop it). */
437
+ readonly stopLabel: _angular_core.InputSignal<string>;
438
+ /** The current accessible name — `stopLabel` while playing, else `startLabel`. */
439
+ protected readonly label: _angular_core.Signal<string>;
440
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselRotationControl, never>;
441
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselRotationControl, "[forCarouselRotationControl]", ["forCarouselRotationControl"], { "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "stopLabel": { "alias": "stopLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
442
+ }
443
+
444
+ /**
445
+ * Opt-in pointer drag / swipe directive for the Carousel viewport. Apply on the
446
+ * `[forCarouselViewport]` element to enable horizontal or vertical drag-to-navigate.
447
+ *
448
+ * Publishes `--for-carousel-drag` (px) during the gesture so the consumer can
449
+ * compose it with `--for-carousel-offset` for live track motion. Reflects
450
+ * `data-dragging` while the gesture is armed. Sets `touch-action` automatically
451
+ * to free the cross axis for page scrolling.
452
+ *
453
+ * Under `prefers-reduced-motion: reduce` the live offset is suppressed, but the
454
+ * gesture still snaps `activeIndex` on release (D3).
455
+ */
456
+ declare class ForCarouselDrag {
457
+ #private;
458
+ protected readonly ctx: forty_cdk_carousel.ForCarouselContext;
459
+ /** Disable pointer drag without removing the directive. Default `false`. */
460
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
461
+ /** Whether a drag gesture is currently armed (reflected as `data-dragging`). */
462
+ readonly dragging: _angular_core.Signal<boolean>;
463
+ /** `touch-action` for the viewport: capture the primary axis, free the cross axis. */
464
+ readonly touchAction: _angular_core.Signal<string | null>;
465
+ /** Live offset CSS var; suppressed at rest and under reduced motion (D3). */
466
+ readonly dragVar: _angular_core.Signal<string | null>;
467
+ constructor();
468
+ protected onDragStart(event: Event): void;
469
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCarouselDrag, never>;
470
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCarouselDrag, "[forCarouselDrag]", ["forCarouselDrag"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
471
+ }
472
+
473
+ /**
474
+ * Defaults inherited by descendant carousels in the surrounding injector scope.
475
+ * Configure with `provideForCarouselDefaults` either at the application root
476
+ * or in any component's `providers` array; partial overrides merge with
477
+ * the parent scope.
478
+ */
479
+ interface ForCarouselDefaults {
480
+ /**
481
+ * Whether index wrap-around is enabled. When `true`, `next` past the last
482
+ * slide wraps to index 0 and `prev` before index 0 wraps to the last slide.
483
+ */
484
+ loop: boolean;
485
+ /**
486
+ * Alignment of the active slide within the viewport. `'start'` (default):
487
+ * the active slide's leading edge aligns with the viewport's leading edge.
488
+ * `'center'` / `'end'` offset accordingly.
489
+ */
490
+ align: CarouselAlign;
491
+ /**
492
+ * Number of slides visible simultaneously in the viewport. Slide width is
493
+ * set to `100% / slidesPerView` by the consumer's CSS.
494
+ */
495
+ slidesPerView: number;
496
+ /**
497
+ * When `true` (and the carousel is not looping), clamps the track offset so the
498
+ * trailing slides align flush to the viewport's trailing edge instead of
499
+ * overscrolling into empty space when `slidesPerView > 1`. The indicator/slide
500
+ * mapping is unchanged — only the visual offset is contained. Default `false`.
501
+ */
502
+ containScroll: boolean;
503
+ /** Whether the carousel auto-rotates on mount (when not under reduced-motion). Default `false`. */
504
+ autoplay: boolean;
505
+ /** Milliseconds between automatic slide advances. Default `5000`. */
506
+ autoplayInterval: number;
507
+ /**
508
+ * Builds the default positional `aria-label` for each slide (`"N of M"`).
509
+ * Override to localize centrally. `position` is the 1-based slide index and
510
+ * `total` is the slide count. A per-slide `ariaLabel` still takes precedence.
511
+ */
512
+ slideLabel: (position: number, total: number) => string;
513
+ /**
514
+ * Builds the default `aria-label` for each indicator dot (`"Go to slide N"`).
515
+ * Override to localize centrally. `position` is the 1-based slide index. A
516
+ * per-indicator `ariaLabel` still takes precedence.
517
+ */
518
+ indicatorLabel: (position: number) => string;
519
+ }
520
+ /** Token holding the resolved carousel defaults for the current scope. */
521
+ declare const FOR_CAROUSEL_DEFAULTS: _angular_core.InjectionToken<ForCarouselDefaults>;
522
+ /**
523
+ * Configures forty-cdk carousel defaults for this injector scope. Partial
524
+ * overrides inherit unspecified keys from the parent scope (or library
525
+ * defaults at the root).
526
+ */
527
+ declare function provideForCarouselDefaults(defaults?: Partial<ForCarouselDefaults>): Provider[];
528
+
529
+ export { FOR_CAROUSEL_CONTEXT, FOR_CAROUSEL_DEFAULTS, ForCarousel, ForCarouselDrag, ForCarouselIndicator, ForCarouselIndicators, ForCarouselNext, ForCarouselPrevious, ForCarouselRotationControl, ForCarouselSlide, ForCarouselTrack, ForCarouselViewport, provideForCarouselDefaults };
530
+ export type { CarouselAlign, ForCarouselContext, ForCarouselDefaults };
@@ -0,0 +1,141 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, Provider } from '@angular/core';
3
+ import { FormCheckboxControl } from '@angular/forms/signals';
4
+ import { FormUiControlBase } from 'forty-cdk/core';
5
+
6
+ /**
7
+ * Injection key the `[forCheckboxIndicator]` uses to resolve its parent
8
+ * checkbox, decoupled from the concrete `ForCheckbox` class. `ForCheckbox`
9
+ * provides itself under this token, so a design system wrapping the checkbox
10
+ * by subclassing re-points it at the subclass with a single provider
11
+ * (`{ provide: FOR_CHECKBOX, useExisting: MtxCheckbox }`) and the indicator
12
+ * keeps resolving — see `docs/wrapping-form-primitives.md`.
13
+ */
14
+ declare const FOR_CHECKBOX: InjectionToken<ForCheckbox>;
15
+ /**
16
+ * Headless checkbox implementing the
17
+ * [WAI-ARIA Checkbox pattern](https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/)
18
+ * with optional tri-state (`indeterminate`) support, plus Angular's
19
+ * `FormCheckboxControl` from `@angular/forms/signals` for `[formField]`
20
+ * auto-wiring.
21
+ *
22
+ * Apply on a `<button type="button">`. The directive forces `type="button"`
23
+ * to avoid accidental form submission; Enter and Space activation come from
24
+ * native button behavior (APG only mandates Space, and Enter is harmless on
25
+ * a non-submit button).
26
+ *
27
+ * Tri-state: when `indeterminate` is `true`, `aria-checked="mixed"` is
28
+ * announced regardless of `checked`. Activating an indeterminate checkbox
29
+ * clears `indeterminate` and toggles `checked` from its current value
30
+ * (matches native `<input type="checkbox">` behavior).
31
+ *
32
+ * The accessible name is the consumer's responsibility — wrap the button in a
33
+ * `<label>` or use `aria-labelledby` / `aria-label`.
34
+ *
35
+ * @example
36
+ * ```html
37
+ * <button forCheckbox [(checked)]="agreed">
38
+ * <span class="indicator"></span>
39
+ * </button>
40
+ * I agree to the terms.
41
+ *
42
+ * <!-- With Signal Forms: -->
43
+ * <button forCheckbox [formField]="form.acceptTerms"></button>
44
+ * ```
45
+ */
46
+ declare class ForCheckbox extends FormUiControlBase implements FormCheckboxControl {
47
+ /** Two-way bindable on/off state. Required by `FormCheckboxControl`. */
48
+ readonly checked: _angular_core.ModelSignal<boolean>;
49
+ /**
50
+ * Two-way bindable indeterminate state. When true, `aria-checked="mixed"`
51
+ * is announced regardless of `checked`. Activation clears it.
52
+ *
53
+ * Not part of `FormCheckboxControl` — the field's value stays binary.
54
+ * Indeterminate is a UI-only concern (e.g. a parent "select all" reflecting
55
+ * children with mixed selection).
56
+ */
57
+ readonly indeterminate: _angular_core.ModelSignal<boolean>;
58
+ protected readonly ariaChecked: _angular_core.Signal<"true" | "false" | "mixed">;
59
+ /**
60
+ * Logical state reflected on `data-state`: `'checked'`, `'unchecked'`, or
61
+ * `'indeterminate'`. Exposed so `ForCheckboxIndicator` can mirror it without
62
+ * re-deriving the same mapping.
63
+ */
64
+ readonly dataState: _angular_core.Signal<"checked" | "indeterminate" | "unchecked">;
65
+ constructor();
66
+ protected onClick(): void;
67
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCheckbox, never>;
68
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCheckbox, "[forCheckbox]", ["forCheckbox"], { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "indeterminate": "indeterminateChange"; }, never, never, true, never>;
69
+ }
70
+
71
+ /**
72
+ * Optional indicator slot inside a `ForCheckbox`. Apply on the element
73
+ * the consumer wants to show only while the checkbox is `checked` or
74
+ * `indeterminate` (typically a check icon, dash, or filled square). The
75
+ * directive mirrors `data-state` from the parent so the consumer can
76
+ * style transitions without per-state bindings; hide the unchecked state
77
+ * via `[data-state="unchecked"] { display: none }` or `@if`.
78
+ *
79
+ * Purely a styling convenience — consumers happy with CSS `:has`
80
+ * selectors or `[data-state]` checks on the parent can skip it entirely.
81
+ */
82
+ declare class ForCheckboxIndicator {
83
+ protected readonly parent: ForCheckbox;
84
+ constructor();
85
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ForCheckboxIndicator, never>;
86
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ForCheckboxIndicator, "[forCheckboxIndicator]", ["forCheckboxIndicator"], {}, {}, never, never, true, never>;
87
+ }
88
+
89
+ /**
90
+ * Defaults inherited by descendant checkboxes in the surrounding injector
91
+ * scope. Configure with `provideForCheckboxDefaults`. The shape is a stub
92
+ * today — present so future per-scope tuning can land without churning the
93
+ * public surface.
94
+ */
95
+ interface ForCheckboxDefaults {
96
+ }
97
+ /** Token holding the resolved checkbox defaults for the current scope. */
98
+ declare const FOR_CHECKBOX_DEFAULTS: _angular_core.InjectionToken<ForCheckboxDefaults>;
99
+ /**
100
+ * Configures forty-cdk checkbox defaults for this injector scope. Partial
101
+ * overrides inherit unspecified keys from the parent scope (or library
102
+ * defaults at the root).
103
+ */
104
+ declare function provideForCheckboxDefaults(defaults?: Partial<ForCheckboxDefaults>): Provider[];
105
+
106
+ /**
107
+ * Exact public names of every `ForCheckbox` input, its models included. Spread it into the
108
+ * `inputs` array of a `hostDirectives` entry so a wrapper component re-exposes the
109
+ * primitive's full surface — the Signal Forms members `[formField]` binds among them —
110
+ * without hand-maintaining the list. Always spread into an inline object literal as shown
111
+ * below: the literal is what keeps the entry statically analyzable for consumers compiling
112
+ * against the published package. An anti-drift spec fails when this list no longer matches
113
+ * the directive's actual API. See `docs/wrapping-form-primitives.md` for both supported
114
+ * wrapping patterns.
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * @Component({
119
+ * selector: 'button[myCheckbox]',
120
+ * template: '',
121
+ * hostDirectives: [
122
+ * {
123
+ * directive: ForCheckbox,
124
+ * inputs: [...FOR_CHECKBOX_HOST_DIRECTIVE_INPUTS],
125
+ * outputs: [...FOR_CHECKBOX_HOST_DIRECTIVE_OUTPUTS],
126
+ * },
127
+ * ],
128
+ * })
129
+ * export class MyCheckbox {}
130
+ * ```
131
+ */
132
+ declare const FOR_CHECKBOX_HOST_DIRECTIVE_INPUTS: readonly ["checked", "indeterminate", "dirty", "disabled", "errors", "invalid", "name", "pending", "readonly", "required", "touched"];
133
+ /**
134
+ * Exact public names of every `ForCheckbox` output, the Signal Forms `touch` output
135
+ * included. Spread it into the `outputs` array of the same `hostDirectives` entry as
136
+ * {@link FOR_CHECKBOX_HOST_DIRECTIVE_INPUTS}.
137
+ */
138
+ declare const FOR_CHECKBOX_HOST_DIRECTIVE_OUTPUTS: readonly ["checkedChange", "indeterminateChange", "touchedChange", "touch"];
139
+
140
+ export { FOR_CHECKBOX, FOR_CHECKBOX_DEFAULTS, FOR_CHECKBOX_HOST_DIRECTIVE_INPUTS, FOR_CHECKBOX_HOST_DIRECTIVE_OUTPUTS, ForCheckbox, ForCheckboxIndicator, provideForCheckboxDefaults };
141
+ export type { ForCheckboxDefaults };