@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,48 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { TwColor, TwSize } from '@cdevhub/ngx-tw/core';
3
+
4
+ /** Visual style of the card container. */
5
+ type CardVariant = 'elevated' | 'outlined' | 'ghost';
6
+ declare class CardComponent {
7
+ /** Controls the visual elevation style. Defaults to `'elevated'`. */
8
+ readonly variant: _angular_core.InputSignal<CardVariant>;
9
+ /** Sets the semantic color for bordered regions. Only applies to `outlined` variant borders. Defaults to `'neutral'`. */
10
+ readonly color: _angular_core.InputSignal<TwColor>;
11
+ /** Controls padding of header, body, and footer sections. Defaults to `'md'`. */
12
+ readonly size: _angular_core.InputSignal<TwSize>;
13
+ private readonly variantResult;
14
+ readonly rootClasses: _angular_core.Signal<string>;
15
+ readonly headerClasses: _angular_core.Signal<string>;
16
+ readonly bodyClasses: _angular_core.Signal<string>;
17
+ readonly footerClasses: _angular_core.Signal<string>;
18
+ readonly mediaClasses: _angular_core.Signal<string>;
19
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardComponent, never>;
20
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardComponent, "tw-card", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
21
+ }
22
+ declare class CardHeaderDirective {
23
+ private readonly card;
24
+ readonly classes: _angular_core.Signal<string>;
25
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardHeaderDirective, never>;
26
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardHeaderDirective, "[twCardHeader]", never, {}, {}, never, never, true, never>;
27
+ }
28
+ declare class CardBodyDirective {
29
+ private readonly card;
30
+ readonly classes: _angular_core.Signal<string>;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardBodyDirective, never>;
32
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardBodyDirective, "[twCardBody]", never, {}, {}, never, never, true, never>;
33
+ }
34
+ declare class CardFooterDirective {
35
+ private readonly card;
36
+ readonly classes: _angular_core.Signal<string>;
37
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardFooterDirective, never>;
38
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardFooterDirective, "[twCardFooter]", never, {}, {}, never, never, true, never>;
39
+ }
40
+ declare class CardMediaDirective {
41
+ private readonly card;
42
+ readonly classes: _angular_core.Signal<string>;
43
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardMediaDirective, never>;
44
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardMediaDirective, "[twCardMedia]", never, {}, {}, never, never, true, never>;
45
+ }
46
+
47
+ export { CardBodyDirective, CardComponent, CardFooterDirective, CardHeaderDirective, CardMediaDirective };
48
+ export type { CardVariant };
@@ -0,0 +1,406 @@
1
+ import * as tailwind_variants from 'tailwind-variants';
2
+ import * as tailwind_merge from 'tailwind-merge';
3
+ import * as _angular_core from '@angular/core';
4
+ import { Signal, ElementRef } from '@angular/core';
5
+ import { TwOrientation, TwSize, TwColor } from '@cdevhub/ngx-tw/core';
6
+
7
+ /** Visual style of the indicators row rendered by `<tw-carousel-indicators>`. */
8
+ type TwCarouselIndicatorVariant = 'dots' | 'lines' | 'numbers';
9
+ /** Where the indicators sit relative to the carousel viewport. */
10
+ type TwCarouselIndicatorPosition = 'overlay' | 'below';
11
+ /** What triggered an `activeIndex` change. */
12
+ type TwCarouselSlideChangeTrigger = 'pointer' | 'keyboard' | 'autoplay' | 'indicator' | 'button' | 'programmatic';
13
+ /** Payload emitted by `CarouselComponent.slideChange`. */
14
+ interface TwCarouselSlideChangeEvent {
15
+ /** Previous active slide index (0-based). */
16
+ from: number;
17
+ /** New active slide index (0-based). */
18
+ to: number;
19
+ /** What triggered the change. */
20
+ trigger: TwCarouselSlideChangeTrigger;
21
+ }
22
+ /** Reason emitted when autoplay transitions running → paused. */
23
+ type TwCarouselAutoplayReason = 'hover' | 'focus' | 'interaction' | 'visibility' | 'manual';
24
+ /** Localizable strings for the carousel. */
25
+ interface TwCarouselLabels {
26
+ /** Accessible label for the Previous-slide directive host. Default: `'Previous slide'`. */
27
+ previous: string;
28
+ /** Accessible label for the Next-slide directive host. Default: `'Next slide'`. */
29
+ next: string;
30
+ /** Accessible label for the autoplay pause control. Default: `'Pause autoplay'`. */
31
+ pauseAutoplay: string;
32
+ /** Accessible label for the autoplay resume control. Default: `'Resume autoplay'`. */
33
+ resumeAutoplay: string;
34
+ /** Template for indicator-button accessible names. Variable: `{page}` (1-based). Default: `'Go to slide {page}'`. */
35
+ indicator: string;
36
+ /** Template for per-slide accessible names with a custom label. Variables: `{index}` (1-based), `{total}`, `{label}`. Default: `'{index} of {total}: {label}'`. */
37
+ slideOfWithLabel: string;
38
+ /** Template for per-slide accessible names without a custom label. Variables: `{index}` (1-based), `{total}`. Default: `'{index} of {total}'`. */
39
+ slideOf: string;
40
+ }
41
+ /** Default English labels used when consumers do not override via the `labels` input. */
42
+ declare const DEFAULT_CAROUSEL_LABELS: Readonly<TwCarouselLabels>;
43
+ /**
44
+ * A single slide inside a `<tw-carousel>`. Projects arbitrary content via its
45
+ * default slot. Reports its visibility back to the carousel container via a
46
+ * shared `IntersectionObserver`; hidden slides receive `aria-hidden="true"` and
47
+ * the `inert` attribute so their focusable descendants are removed from the tab
48
+ * order.
49
+ */
50
+ declare class CarouselSlideComponent {
51
+ /** Optional human-readable label for the slide. When provided, used in the slide's `aria-label` as `"{index + 1} of {total}: {label}"`. When `null`, uses `"{index + 1} of {total}"` only. Defaults to `null`. */
52
+ readonly label: _angular_core.InputSignal<string | null>;
53
+ /** When `true`, the slide is rendered but skipped by Prev/Next, Indicators, keyboard nav, and autoplay. Programmatic `scrollTo` still lands on it. Visually muted (`opacity-50`, `cursor-not-allowed`). Defaults to `false`. */
54
+ readonly disabled: _angular_core.InputSignal<boolean>;
55
+ /** @internal Direct parent carousel. A `tw-carousel-slide` outside a `tw-carousel` is a programmer error — the DI failure throws naturally. */
56
+ readonly carousel: CarouselComponent;
57
+ /** @internal Host element reference used by the carousel's `IntersectionObserver`. */
58
+ readonly _hostEl: any;
59
+ /** @internal Visibility flag set by the carousel's IntersectionObserver. Initial value is `true` so the first paint does not flash `inert` on every slide. */
60
+ readonly _isVisible: _angular_core.WritableSignal<boolean>;
61
+ readonly _isHidden: Signal<boolean>;
62
+ /** @internal 0-based index in the parent carousel's slide content. -1 until contentChildren materialises. */
63
+ readonly index: Signal<number>;
64
+ /** @internal Resolved `aria-label` per the `slideOf` / `slideOfWithLabel` template. */
65
+ readonly accessibleName: Signal<string>;
66
+ readonly slideClasses: Signal<string>;
67
+ /** @internal Per-slide `flex-basis`. Reads from the carousel so each slide sizes along the viewport's main axis (width for horizontal, height for vertical via `flex-direction`). */
68
+ readonly _basis: Signal<string>;
69
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CarouselSlideComponent, never>;
70
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CarouselSlideComponent, "tw-carousel-slide", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
71
+ }
72
+ /**
73
+ * Slide / swipe gallery primitive. Renders projected `<tw-carousel-slide>`
74
+ * children in a horizontally (or vertically) scrolling viewport with native
75
+ * CSS scroll-snap, optional autoplay, mouse-pointer drag, keyboard navigation,
76
+ * prev/next directive hosts, and an `<tw-carousel-indicators>` companion.
77
+ * Implements the W3C APG carousel pattern: `role="region"` +
78
+ * `aria-roledescription="carousel"` on the host; the inner viewport carries
79
+ * `tabindex="0"` and a polite `aria-live` region when autoplay is off.
80
+ */
81
+ declare class CarouselComponent {
82
+ /** Axis along which slides flow. `'horizontal'` is the canonical case; `'vertical'` is supported for tickers and feature lists. Defaults to `'horizontal'`. */
83
+ readonly orientation: _angular_core.InputSignal<TwOrientation>;
84
+ /** Number of slides visible in the viewport. May be fractional (e.g. `1.2` for a "peek" of the next slide). Values below `0.5` are clamped to `0.5`; values above the slide count are clamped to the slide count. Defaults to `1`. */
85
+ readonly slidesPerView: _angular_core.InputSignal<number>;
86
+ /** Number of slides advanced per navigation action (button click, keyboard, indicator). Non-integer values are floored. Defaults to `1`. */
87
+ readonly slidesToScroll: _angular_core.InputSignal<number>;
88
+ /** Inter-slide gap on the scroll axis. Mapped via the canonical spacing scale. Defaults to `'md'`. */
89
+ readonly gap: _angular_core.InputSignal<TwSize>;
90
+ /** When `true`, navigation wraps around at the boundaries. Prev at slide 0 jumps to the last page; Next at the last page jumps to slide 0. Implementation is jumpless via a brief opacity mask. Defaults to `false`. */
91
+ readonly loop: _angular_core.InputSignal<boolean>;
92
+ /** When `true`, the carousel auto-advances by `slidesToScroll` every `autoplayInterval` ms. Pauses on hover, focus-in, drag, document hidden, or user interaction. Defaults to `false`. */
93
+ readonly autoplay: _angular_core.InputSignal<boolean>;
94
+ /** Milliseconds between autoplay advances. Values below `1000` are clamped to `1000` per WCAG 2.2.2. Defaults to `5000`. */
95
+ readonly autoplayInterval: _angular_core.InputSignal<number>;
96
+ /** Pauses autoplay while the pointer is over the container. Defaults to `true` because losing autoplay on hover is the expected gallery behavior — opt-out is the special case. */
97
+ readonly pauseOnHover: _angular_core.InputSignal<boolean>;
98
+ /** Pauses autoplay while keyboard focus is anywhere inside the container. Defaults to `true` for WCAG 2.2.2 compliance — opt-out is the special case. */
99
+ readonly pauseOnFocusIn: _angular_core.InputSignal<boolean>;
100
+ /** When `true`, the user may pan the slides via mouse pointer drag; touch is left to native scroll. Pointer events are intercepted only when the drag exceeds a 6-pixel threshold so clicks inside slides still work. Defaults to `true` because galleries are draggable by user expectation — opt-out is the special case. */
101
+ readonly draggable: _angular_core.InputSignal<boolean>;
102
+ /** When `true`, the viewport responds to Arrow / Home / End / PageUp / PageDown when focus is inside it. Defaults to `true` for keyboard accessibility — opt-out is the special case. */
103
+ readonly keyboard: _angular_core.InputSignal<boolean>;
104
+ /** CSS `scroll-snap-align` value applied to each slide. `'start'` is the standard gallery behavior; `'center'` is used for peek/preview layouts. Defaults to `'start'`. */
105
+ readonly snapAlign: _angular_core.InputSignal<"start" | "center" | "end">;
106
+ /** Two-way bound 0-based index of the first visible slide in the current page. Setting from the parent scrolls the viewport smoothly to align that slide; reading reflects user-driven scroll position after `scrollend`. Defaults to `0`. */
107
+ readonly activeIndex: _angular_core.ModelSignal<number>;
108
+ /** Accessible name for the carousel region. If both this and `ariaLabelledBy` are `null`, a one-time dev-mode `console.warn` is logged (production builds never log). Defaults to `null`. */
109
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
110
+ /** ID of an element labeling the carousel. Either `ariaLabel` or `ariaLabelledBy` SHOULD be provided. Defaults to `null`. */
111
+ readonly ariaLabelledBy: _angular_core.InputSignal<string | null>;
112
+ /** Localizable strings for prev/next/pause/resume/indicator/slide-of templates. Unset keys fall back to the English defaults in `DEFAULT_CAROUSEL_LABELS`. Defaults to `{}`. */
113
+ readonly labels: _angular_core.InputSignal<Partial<TwCarouselLabels>>;
114
+ /** Fires when the active index changes. Payload identifies the previous and new index plus the trigger source. */
115
+ readonly slideChange: _angular_core.OutputEmitterRef<TwCarouselSlideChangeEvent>;
116
+ /** Fires when autoplay transitions from running to paused. Payload is the pause reason. */
117
+ readonly autoplayPaused: _angular_core.OutputEmitterRef<TwCarouselAutoplayReason>;
118
+ /** Fires when autoplay transitions from paused to running. */
119
+ readonly autoplayResumed: _angular_core.OutputEmitterRef<void>;
120
+ private readonly _destroyRef;
121
+ /** @internal The scrollable viewport element. */
122
+ readonly _viewportRef: Signal<ElementRef<HTMLDivElement>>;
123
+ /** @internal Projected slides in DOM order. */
124
+ readonly slides: Signal<readonly CarouselSlideComponent[]>;
125
+ /** @internal Resolved label record with English defaults filled in. */
126
+ readonly resolvedLabels: Signal<TwCarouselLabels>;
127
+ /** @internal Effective `slidesPerView` clamped to `[0.5, slideCount]`. */
128
+ readonly _effectiveSlidesPerView: Signal<number>;
129
+ /** @internal Effective `slidesToScroll` floored to a positive integer. Read by child indicators directive (`CarouselIndicatorsComponent._onClick`) as a signal. */
130
+ readonly _effectiveSlidesToScroll: Signal<number>;
131
+ /** @internal Autoplay interval clamped to ≥ 1000 ms per WCAG 2.2.2. */
132
+ readonly _effectiveAutoplayInterval: Signal<number>;
133
+ /** Number of distinct pages (groups of `slidesToScroll` slides) the carousel can land on. Reactive. */
134
+ readonly pageCount: Signal<number>;
135
+ /** 0-based page index that contains `activeIndex`. Reactive. */
136
+ readonly activePage: Signal<number>;
137
+ /** The highest slide index the carousel can land on given the current `slidesPerView`. Equals `max(0, slideCount - ceil(effectiveSlidesPerView))`. Reactive. Every site that asks "where is the last legal landing position?" goes through this signal. */
138
+ readonly lastReachableIndex: Signal<number>;
139
+ /** @internal `true` when the carousel is at slide 0 (drives prev directive `disabled`). */
140
+ readonly isAtStart: Signal<boolean>;
141
+ /** @internal `true` when the carousel is at the last reachable slide (drives next directive `disabled`). */
142
+ readonly isAtEnd: Signal<boolean>;
143
+ /** @internal Per-slide `flex-basis`. Read by each `CarouselSlideComponent` host style binding to size slides along the viewport's main axis. Reactive. */
144
+ readonly slideBasis: Signal<string>;
145
+ private readonly _variantResult;
146
+ /** @internal Slot-class accessor used by child slides and indicators. */
147
+ readonly _slotClasses: Signal<{
148
+ root: (slotProps?: ({
149
+ variant?: "dots" | "lines" | "numbers" | undefined;
150
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
151
+ orientation?: "horizontal" | "vertical" | undefined;
152
+ position?: "overlay" | "below" | undefined;
153
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
154
+ snapAlign?: "start" | "center" | "end" | undefined;
155
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
156
+ viewport: (slotProps?: ({
157
+ variant?: "dots" | "lines" | "numbers" | undefined;
158
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
159
+ orientation?: "horizontal" | "vertical" | undefined;
160
+ position?: "overlay" | "below" | undefined;
161
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
162
+ snapAlign?: "start" | "center" | "end" | undefined;
163
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
164
+ slide: (slotProps?: ({
165
+ variant?: "dots" | "lines" | "numbers" | undefined;
166
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
167
+ orientation?: "horizontal" | "vertical" | undefined;
168
+ position?: "overlay" | "below" | undefined;
169
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
170
+ snapAlign?: "start" | "center" | "end" | undefined;
171
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
172
+ pauseControl: (slotProps?: ({
173
+ variant?: "dots" | "lines" | "numbers" | undefined;
174
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
175
+ orientation?: "horizontal" | "vertical" | undefined;
176
+ position?: "overlay" | "below" | undefined;
177
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
178
+ snapAlign?: "start" | "center" | "end" | undefined;
179
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
180
+ indicators: (slotProps?: ({
181
+ variant?: "dots" | "lines" | "numbers" | undefined;
182
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
183
+ orientation?: "horizontal" | "vertical" | undefined;
184
+ position?: "overlay" | "below" | undefined;
185
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
186
+ snapAlign?: "start" | "center" | "end" | undefined;
187
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
188
+ indicator: (slotProps?: ({
189
+ variant?: "dots" | "lines" | "numbers" | undefined;
190
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
191
+ orientation?: "horizontal" | "vertical" | undefined;
192
+ position?: "overlay" | "below" | undefined;
193
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
194
+ snapAlign?: "start" | "center" | "end" | undefined;
195
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
196
+ } & {
197
+ root: (slotProps?: ({
198
+ variant?: "dots" | "lines" | "numbers" | undefined;
199
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
200
+ orientation?: "horizontal" | "vertical" | undefined;
201
+ position?: "overlay" | "below" | undefined;
202
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
203
+ snapAlign?: "start" | "center" | "end" | undefined;
204
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
205
+ viewport: (slotProps?: ({
206
+ variant?: "dots" | "lines" | "numbers" | undefined;
207
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
208
+ orientation?: "horizontal" | "vertical" | undefined;
209
+ position?: "overlay" | "below" | undefined;
210
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
211
+ snapAlign?: "start" | "center" | "end" | undefined;
212
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
213
+ slide: (slotProps?: ({
214
+ variant?: "dots" | "lines" | "numbers" | undefined;
215
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
216
+ orientation?: "horizontal" | "vertical" | undefined;
217
+ position?: "overlay" | "below" | undefined;
218
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
219
+ snapAlign?: "start" | "center" | "end" | undefined;
220
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
221
+ pauseControl: (slotProps?: ({
222
+ variant?: "dots" | "lines" | "numbers" | undefined;
223
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
224
+ orientation?: "horizontal" | "vertical" | undefined;
225
+ position?: "overlay" | "below" | undefined;
226
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
227
+ snapAlign?: "start" | "center" | "end" | undefined;
228
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
229
+ indicators: (slotProps?: ({
230
+ variant?: "dots" | "lines" | "numbers" | undefined;
231
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
232
+ orientation?: "horizontal" | "vertical" | undefined;
233
+ position?: "overlay" | "below" | undefined;
234
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
235
+ snapAlign?: "start" | "center" | "end" | undefined;
236
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
237
+ indicator: (slotProps?: ({
238
+ variant?: "dots" | "lines" | "numbers" | undefined;
239
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
240
+ orientation?: "horizontal" | "vertical" | undefined;
241
+ position?: "overlay" | "below" | undefined;
242
+ gap?: "xs" | "sm" | "md" | "lg" | "xl" | undefined;
243
+ snapAlign?: "start" | "center" | "end" | undefined;
244
+ } & tailwind_variants.ClassProp<tailwind_merge.ClassNameValue>) | undefined) => string;
245
+ } & {}>;
246
+ readonly rootClasses: Signal<string>;
247
+ readonly viewportClasses: Signal<string>;
248
+ readonly pauseControlClasses: Signal<string>;
249
+ /** @internal Last interaction source — written before any navigation triggers scroll, read by the settle handler. */
250
+ private readonly _lastInteractionSource;
251
+ /** @internal Suppresses the scroll-end recompute during a loop-jump. */
252
+ private readonly _isLoopJumping;
253
+ private readonly _isHovered;
254
+ private readonly _hasFocusInside;
255
+ private readonly _isTabVisible;
256
+ private readonly _isDragging;
257
+ private readonly _isManuallyPaused;
258
+ private readonly _postInteractionPauseUntil;
259
+ /** @internal RTL sign factor applied to scroll-position math. `+1` LTR, `-1` RTL. */
260
+ private readonly _rtlSign;
261
+ readonly _pauseControlAriaLabel: Signal<string>;
262
+ /** @internal Public accessor for the template. */
263
+ readonly _isManuallyPausedView: Signal<boolean>;
264
+ /**
265
+ * @internal Sets the "last interaction source" signal so the upcoming
266
+ * navigation call emits `slideChange` with the correct trigger. Called by
267
+ * `[twCarouselPrev]`, `[twCarouselNext]`, and the indicators before they
268
+ * invoke `next()` / `prev()` / `scrollTo()`.
269
+ */
270
+ _setLastInteractionSource(source: TwCarouselSlideChangeTrigger): void;
271
+ constructor();
272
+ private readonly _isPaused;
273
+ private _currentPauseReason;
274
+ private _intersectionObserver;
275
+ private _resizeObserver;
276
+ private _onScrollEndBound;
277
+ private _onScrollDebouncedBound;
278
+ private _scrollDebounceTimer;
279
+ private _onVisibilityChangeBound;
280
+ private _setupViewport;
281
+ private _teardownViewport;
282
+ private _reobserveSlides;
283
+ private _logicalOffset;
284
+ private _currentLogicalScroll;
285
+ private _findClosestSlideIndex;
286
+ private _handleScrollSettled;
287
+ private _emitSlideChange;
288
+ /** Advance by `slidesToScroll`. Wraps if `loop` is `true`; no-op at the last page when `loop` is `false`. Emits `slideChange` with trigger `'programmatic'` when called externally. */
289
+ next(): void;
290
+ /** Retreat by `slidesToScroll`. Wraps if `loop` is `true`; no-op at slide 0 when `loop` is `false`. Emits `slideChange` with trigger `'programmatic'` when called externally. */
291
+ prev(): void;
292
+ /** Jump to a specific 0-based slide index. `opts.behavior` is `'smooth' | 'instant'`; default is `'smooth'` unless `prefers-reduced-motion: reduce` is set, in which case the default is `'instant'`. */
293
+ scrollTo(index: number, opts?: {
294
+ behavior?: 'smooth' | 'instant';
295
+ }): void;
296
+ /** Pause autoplay. `reason` defaults to `'manual'`. */
297
+ pause(_reason?: TwCarouselAutoplayReason): void;
298
+ /** Resume autoplay if `autoplay` input is `true`. */
299
+ resume(): void;
300
+ private _findNextEnabled;
301
+ private _scrollToIndex;
302
+ /**
303
+ * @internal Resolves the effective scroll behavior. Explicit caller-supplied
304
+ * values are honoured verbatim; otherwise checks
305
+ * `matchMedia('(prefers-reduced-motion: reduce)')` and returns `'instant'`
306
+ * when the user has reduced-motion enabled, `'smooth'` otherwise. See B(d).
307
+ */
308
+ private _resolveBehavior;
309
+ private _loopJumpHandle;
310
+ private _loopJumpSafetyHandle;
311
+ private _loopJumpTo;
312
+ _onPointerEnter(): void;
313
+ _onPointerLeave(): void;
314
+ _onFocusIn(): void;
315
+ _onFocusOut(event: FocusEvent): void;
316
+ private _dragStart;
317
+ private _dragCleanup;
318
+ _onPointerDown(event: PointerEvent): void;
319
+ private _onPointerMove;
320
+ private _onPointerUp;
321
+ _onKeydown(event: KeyboardEvent): void;
322
+ _togglePauseControl(): void;
323
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CarouselComponent, never>;
324
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CarouselComponent, "tw-carousel", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "slidesPerView": { "alias": "slidesPerView"; "required": false; "isSignal": true; }; "slidesToScroll": { "alias": "slidesToScroll"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "autoplay": { "alias": "autoplay"; "required": false; "isSignal": true; }; "autoplayInterval": { "alias": "autoplayInterval"; "required": false; "isSignal": true; }; "pauseOnHover": { "alias": "pauseOnHover"; "required": false; "isSignal": true; }; "pauseOnFocusIn": { "alias": "pauseOnFocusIn"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "keyboard": { "alias": "keyboard"; "required": false; "isSignal": true; }; "snapAlign": { "alias": "snapAlign"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "activeIndex": "activeIndexChange"; "slideChange": "slideChange"; "autoplayPaused": "autoplayPaused"; "autoplayResumed": "autoplayResumed"; }, ["slides"], ["tw-carousel-slide", "[twCarouselPrev], [twCarouselNext], tw-carousel-indicators", "*"], true, never>;
325
+ }
326
+ /**
327
+ * Renders one button per **page** (not per slide) inside a `<tw-carousel>`.
328
+ * The active button is marked with `aria-current="true"` and a distinguishing
329
+ * scale / width / fill so it is identifiable beyond color alone (WCAG 1.4.1).
330
+ */
331
+ declare class CarouselIndicatorsComponent {
332
+ /** Visual style. `'dots'` = small filled circles; `'lines'` = short horizontal/vertical bars; `'numbers'` = text 1, 2, 3 inside small pills. Defaults to `'dots'`. */
333
+ readonly variant: _angular_core.InputSignal<TwCarouselIndicatorVariant>;
334
+ /** Color of the active indicator. Inactive indicators use neutral `fg-muted` tokens. Defaults to `'primary'`. */
335
+ readonly color: _angular_core.InputSignal<TwColor>;
336
+ /** Indicator size (diameter/length and gap between indicators). Defaults to `'md'`. */
337
+ readonly size: _angular_core.InputSignal<TwSize>;
338
+ /** When `'overlay'`, the indicators float absolutely-positioned over the carousel with a `bg-overlay-control` translucent capsule backdrop for contrast. When `'below'`, they sit below the carousel as a normal block. Defaults to `'below'`. */
339
+ readonly position: _angular_core.InputSignal<TwCarouselIndicatorPosition>;
340
+ /** @internal Direct parent carousel. */
341
+ readonly carousel: CarouselComponent;
342
+ private readonly _variantResult;
343
+ readonly rootClasses: Signal<string>;
344
+ /**
345
+ * @internal Sequence of page indices to render. Returns `[]` when the
346
+ * parent carousel's `slidesPerView` is not `1` — a single dot can never
347
+ * match a viewport that shows two or more slides, so the indicator UX is
348
+ * unambiguously broken at multi-item display (issue A1). The host element
349
+ * stays mounted so layout doesn't reflow if the consumer toggles
350
+ * `slidesPerView` back to `1` — the buttons reappear at that point without
351
+ * a remount.
352
+ */
353
+ readonly _pages: Signal<number[]>;
354
+ constructor();
355
+ _buttonClasses(page: number): string;
356
+ _buttonLabel(page: number): string;
357
+ _onClick(page: number): void;
358
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CarouselIndicatorsComponent, never>;
359
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CarouselIndicatorsComponent, "tw-carousel-indicators", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
360
+ }
361
+ /**
362
+ * Apply to any focusable element (typically `<button>`) inside a `<tw-carousel>`
363
+ * to navigate to the previous page. Auto-disables at the first slide when the
364
+ * carousel is not looping. Sets `aria-label` to `labels.previous` unless the
365
+ * host already carries `aria-label` or `aria-labelledby`.
366
+ */
367
+ declare class CarouselPrevDirective {
368
+ /** @internal Parent carousel. */
369
+ readonly carousel: CarouselComponent;
370
+ private readonly _hostEl;
371
+ private readonly _consumerLabel;
372
+ private readonly _hasLabelledBy;
373
+ private readonly _isButton;
374
+ /** @internal True when prev is unavailable (at start and !loop). */
375
+ readonly _isDisabled: Signal<boolean>;
376
+ _ariaLabel(): string | null;
377
+ _isButtonDisabled(): string | null;
378
+ _isTabindex(): string | null;
379
+ _onClick(event: Event): void;
380
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CarouselPrevDirective, never>;
381
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CarouselPrevDirective, "[twCarouselPrev]", never, {}, {}, never, never, true, never>;
382
+ }
383
+ /**
384
+ * Apply to any focusable element (typically `<button>`) inside a `<tw-carousel>`
385
+ * to navigate to the next page. Auto-disables at the last page when the
386
+ * carousel is not looping. Sets `aria-label` to `labels.next` unless the host
387
+ * already carries `aria-label` or `aria-labelledby`.
388
+ */
389
+ declare class CarouselNextDirective {
390
+ /** @internal Parent carousel. */
391
+ readonly carousel: CarouselComponent;
392
+ private readonly _hostEl;
393
+ private readonly _consumerLabel;
394
+ private readonly _hasLabelledBy;
395
+ private readonly _isButton;
396
+ readonly _isDisabled: Signal<boolean>;
397
+ _ariaLabel(): string | null;
398
+ _isButtonDisabled(): string | null;
399
+ _isTabindex(): string | null;
400
+ _onClick(event: Event): void;
401
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CarouselNextDirective, never>;
402
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CarouselNextDirective, "[twCarouselNext]", never, {}, {}, never, never, true, never>;
403
+ }
404
+
405
+ export { CarouselComponent, CarouselIndicatorsComponent, CarouselNextDirective, CarouselPrevDirective, CarouselSlideComponent, DEFAULT_CAROUSEL_LABELS };
406
+ export type { TwCarouselAutoplayReason, TwCarouselIndicatorPosition, TwCarouselIndicatorVariant, TwCarouselLabels, TwCarouselSlideChangeEvent, TwCarouselSlideChangeTrigger };
@@ -0,0 +1,136 @@
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
+ import { FormFieldControl } from '@cdevhub/ngx-tw/form-field';
6
+
7
+ /** Visual style of the checkbox when checked or indeterminate. */
8
+ type CheckboxVariant = 'solid' | 'outline';
9
+ /** Position of the label relative to the checkbox control. */
10
+ type CheckboxLabelPosition = 'before' | 'after';
11
+ declare class CheckboxComponent extends FormFieldControl<boolean> implements ControlValueAccessor, OnInit {
12
+ /** Sets the semantic color for the checked and indeterminate box fill/border. Defaults to `'primary'`. */
13
+ readonly color: _angular_core.InputSignal<TwColor>;
14
+ /** Controls the overall scale of the box, check icon, and label typography. Defaults to `'md'`. */
15
+ readonly size: _angular_core.InputSignal<TwSize>;
16
+ /** Visual style when checked or indeterminate. `'solid'` fills the box with the color; `'outline'` keeps a transparent fill with a colored border and check. Defaults to `'solid'`. */
17
+ readonly variant: _angular_core.InputSignal<CheckboxVariant>;
18
+ /** When true, prevents interaction and applies muted styling. Defaults to `false`. */
19
+ readonly disabled: _angular_core.InputSignal<boolean>;
20
+ /** When true, sets `aria-required="true"` so assistive tech announces the control as required. Defaults to `false`. */
21
+ readonly requiredInput: _angular_core.InputSignal<boolean>;
22
+ /** Optional inline label rendered next to the checkbox. Use default content projection for rich label content instead. Projection takes precedence. */
23
+ readonly label: _angular_core.InputSignal<string | undefined>;
24
+ /** Optional secondary description rendered under the label. Use `[slot="description"]` content projection for rich content instead. Projection takes precedence. */
25
+ readonly description: _angular_core.InputSignal<string | undefined>;
26
+ /** Position of the label/description relative to the checkbox. Defaults to `'after'`. */
27
+ readonly labelPosition: _angular_core.InputSignal<CheckboxLabelPosition>;
28
+ /** Optional name attribute, applied to the hidden native `<input type="checkbox">` so native form submission includes the control. */
29
+ readonly name: _angular_core.InputSignal<string | undefined>;
30
+ /** Id on the host element. Auto-generated as `tw-checkbox-N` when not provided. Used by the form-field's `<label for>` attribute. */
31
+ readonly idInput: _angular_core.InputSignal<string | undefined>;
32
+ /** Accessible name when no visible label is provided. Mirrored to `aria-label`. */
33
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
34
+ /** ID of an external element that labels the checkbox. Mirrored to `aria-labelledby`. */
35
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
36
+ /** ID of an external element that describes the checkbox. Mirrored to `aria-describedby`. Form-field merges its hint/error ids alongside. */
37
+ readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
38
+ /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the directive uses the `TW_ERROR_STATE_MATCHER` token's value. */
39
+ readonly errorStateMatcher: _angular_core.InputSignal<ErrorStateMatcher | undefined>;
40
+ /** Two-way bound checked state. Updates when the user toggles via click or Space. */
41
+ readonly checked: _angular_core.ModelSignal<boolean>;
42
+ /** Two-way bound indeterminate state. When true, the box shows a dash and the host exposes `aria-checked="mixed"`. Any user toggle clears indeterminate and sets `checked` to `true`. */
43
+ readonly indeterminate: _angular_core.ModelSignal<boolean>;
44
+ /** Fires after the checked state changes from a user interaction. Does not fire when the value is updated programmatically via `writeValue`. */
45
+ readonly change: _angular_core.OutputEmitterRef<boolean>;
46
+ private readonly focusMonitor;
47
+ private readonly elementRef;
48
+ private readonly destroyRef;
49
+ private readonly ngControl;
50
+ private readonly parentForm;
51
+ private readonly parentFormGroup;
52
+ private readonly defaultMatcher;
53
+ private onChange;
54
+ private onTouched;
55
+ private readonly cvaDisabled;
56
+ private readonly _focused;
57
+ private readonly _ngControlRev;
58
+ private readonly _formSubmitRev;
59
+ private readonly describedByIdsSignal;
60
+ private readonly uid;
61
+ /** @internal Fallback id used when the consumer does not set `[id]`. */
62
+ readonly hostId: string;
63
+ /** @internal Resolved id on the host element. */
64
+ readonly id: Signal<string>;
65
+ /** @internal Id of the internal label `<span>`, derived from the resolved host id. */
66
+ readonly labelElementId: Signal<string>;
67
+ /** @internal Id of the internal description `<span>`, derived from the resolved host id. */
68
+ readonly descriptionElementId: Signal<string>;
69
+ constructor();
70
+ /** @internal */
71
+ readonly isDisabled: Signal<boolean>;
72
+ /**
73
+ * @internal Visible-state mirror of the `checked` model. `linkedSignal` keeps it
74
+ * synced with parent updates (including `writeValue` from reactive forms), while
75
+ * also accepting explicit `set()` calls from `toggle()` / `writeValue()` so the
76
+ * DOM reflects the new state synchronously — before `checkedChange` propagates
77
+ * through the host binding round-trip. Reading this signal in host bindings
78
+ * (`aria-checked`, `data-checked`, box classes) decouples render from the
79
+ * model's notification cadence.
80
+ */
81
+ readonly internalChecked: _angular_core.WritableSignal<boolean>;
82
+ /**
83
+ * @internal Visible-state mirror of the `indeterminate` model. Same rationale as
84
+ * `internalChecked` — `toggle()` and `writeValue()` clear it synchronously so
85
+ * `aria-checked="mixed"` flips off in the same microtask as `aria-checked="true"`.
86
+ */
87
+ readonly internalIndeterminate: _angular_core.WritableSignal<boolean>;
88
+ readonly ariaCheckedValue: Signal<"true" | "false" | "mixed">;
89
+ readonly effectiveAriaLabelledby: Signal<string | undefined>;
90
+ readonly effectiveAriaDescribedby: Signal<string | undefined>;
91
+ private readonly isActive;
92
+ /** @internal */
93
+ readonly value: Signal<boolean | null>;
94
+ /** @internal */
95
+ readonly focused: Signal<boolean>;
96
+ /** @internal Checkboxes are never empty in the form-field sense — they always have a boolean value. */
97
+ readonly empty: Signal<boolean>;
98
+ /** @internal */
99
+ readonly required: Signal<boolean>;
100
+ /** @internal */
101
+ readonly errorState: Signal<boolean>;
102
+ /** @internal */
103
+ readonly controlType = "checkbox";
104
+ /** @internal */
105
+ readonly userAriaDescribedBy: Signal<string | undefined>;
106
+ private readonly variantResult;
107
+ readonly rootClasses: Signal<string>;
108
+ readonly boxWrapClasses: Signal<string>;
109
+ readonly iconClasses: Signal<string>;
110
+ readonly labelWrapClasses: Signal<string>;
111
+ readonly labelClasses: Signal<string>;
112
+ readonly descriptionClasses: Signal<string>;
113
+ readonly boxClasses: Signal<string>;
114
+ readonly iconColorClasses: Signal<string>;
115
+ /** Toggles the checked state. Clears indeterminate if set. No-op when disabled. */
116
+ toggle(): void;
117
+ /** Handles keyboard activation. Only Space toggles — matches native checkbox semantics. */
118
+ onKeydown(event: KeyboardEvent): void;
119
+ /** @internal Called on host blur to notify forms the control has been touched and recompute errorState. */
120
+ onBlur(): void;
121
+ writeValue(value: boolean | null | undefined): void;
122
+ registerOnChange(fn: (value: boolean) => void): void;
123
+ registerOnTouched(fn: () => void): void;
124
+ setDisabledState(isDisabled: boolean): void;
125
+ /** @internal Called by the form-field once it has computed the merged describedby ids. */
126
+ setDescribedByIds(ids: string[]): void;
127
+ /** @internal Called when the form-field container is clicked — focus the host without toggling. */
128
+ onContainerClick(event: MouseEvent): void;
129
+ ngOnInit(): void;
130
+ private hasAccessibleNameHint;
131
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxComponent, never>;
132
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "tw-checkbox", never, { "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; }; "requiredInput": { "alias": "required"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "idInput": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "indeterminate": "indeterminateChange"; "change": "change"; }, never, ["[slot='indeterminate-icon']", "[slot='check-icon']", "*", "[slot='description']"], true, never>;
133
+ }
134
+
135
+ export { CheckboxComponent };
136
+ export type { CheckboxLabelPosition, CheckboxVariant };