@cocoar/ui 0.1.0-beta.99 → 0.1.1

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 (43) hide show
  1. package/README.md +21 -11
  2. package/fesm2022/cocoar-ui-components.mjs +9549 -0
  3. package/fesm2022/cocoar-ui-components.mjs.map +1 -0
  4. package/fesm2022/cocoar-ui-menu.mjs +1082 -0
  5. package/fesm2022/cocoar-ui-menu.mjs.map +1 -0
  6. package/fesm2022/cocoar-ui-overlay.mjs +1284 -0
  7. package/fesm2022/cocoar-ui-overlay.mjs.map +1 -0
  8. package/fesm2022/cocoar-ui.mjs +8 -0
  9. package/fesm2022/cocoar-ui.mjs.map +1 -0
  10. package/llms-full.txt +2303 -0
  11. package/llms.txt +82 -0
  12. package/package.json +38 -19
  13. package/styles/all.css +9 -0
  14. package/styles/components.css +127 -0
  15. package/styles/tokens/all.css +38 -0
  16. package/styles/tokens/code-block.css +72 -0
  17. package/styles/tokens/colors-primitives-dark.css +84 -0
  18. package/styles/tokens/colors-primitives-light.css +75 -0
  19. package/styles/tokens/colors-usage.css +272 -0
  20. package/styles/tokens/components-shared.css +42 -0
  21. package/styles/tokens/elevation.css +30 -0
  22. package/styles/tokens/focus.css +30 -0
  23. package/styles/tokens/layers.css +17 -0
  24. package/styles/tokens/menu.css +53 -0
  25. package/styles/tokens/motion.css +93 -0
  26. package/styles/tokens/new-components.css +104 -0
  27. package/styles/tokens/radius.css +15 -0
  28. package/styles/tokens/select-overlay.css +40 -0
  29. package/styles/tokens/shadows.css +38 -0
  30. package/styles/tokens/sidebar.css +67 -0
  31. package/styles/tokens/spacing.css +16 -0
  32. package/styles/tokens/stroke-width.css +12 -0
  33. package/styles/tokens/type-primitives.css +23 -0
  34. package/styles/tokens/typography-responsive.css +44 -0
  35. package/styles/tokens/typography.css +41 -0
  36. package/types/cocoar-ui-components.d.ts +3719 -0
  37. package/types/cocoar-ui-menu.d.ts +326 -0
  38. package/types/cocoar-ui-overlay.d.ts +301 -0
  39. package/types/cocoar-ui.d.ts +3 -0
  40. package/src/index.d.ts +0 -4
  41. package/src/index.d.ts.map +0 -1
  42. package/src/index.js +0 -5
  43. package/src/index.js.map +0 -1
@@ -0,0 +1,3719 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { Type, Provider, ElementRef, AfterViewInit, OnDestroy, DestroyRef, TemplateRef, InjectionToken, PipeTransform, AfterContentInit, QueryList } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
4
+ import { SafeHtml } from '@angular/platform-browser';
5
+ import * as _cocoar_ui_components from '@cocoar/ui/components';
6
+ import { OverlayScrollbars } from 'overlayscrollbars';
7
+ import * as _cocoar_ui_overlay from '@cocoar/ui/overlay';
8
+ import { Placement, OverlayRef } from '@cocoar/ui/overlay';
9
+ import { Temporal } from '@js-temporal/polyfill';
10
+ import { CoarLocalizationService, CoarLocalizationDataStore, CoarTimeZoneService } from '@cocoar/localization';
11
+ import { Observable } from 'rxjs';
12
+ import { HttpClient } from '@angular/common/http';
13
+
14
+ declare function coarProvideValueAccessor(type: () => Type<ControlValueAccessor>): Provider;
15
+ declare abstract class CoarControlValueAccessor<T> implements ControlValueAccessor {
16
+ protected readonly cvaDisabled: _angular_core.WritableSignal<boolean>;
17
+ protected cvaOnChange: (value: T) => void;
18
+ protected cvaOnTouched: () => void;
19
+ registerOnChange(fn: (value: T) => void): void;
20
+ registerOnTouched(fn: () => void): void;
21
+ setDisabledState(isDisabled: boolean): void;
22
+ abstract writeValue(value: T | null): void;
23
+ }
24
+
25
+ type CoarTextInputSize = 'xs' | 's' | 'm' | 'l';
26
+ declare class CoarTextInputComponent extends CoarControlValueAccessor<string> {
27
+ /** Label text displayed above the input */
28
+ label: _angular_core.InputSignal<string>;
29
+ /** Placeholder text shown when input is empty */
30
+ placeholder: _angular_core.InputSignal<string>;
31
+ /** Current input value (two-way bindable with [(value)]) */
32
+ value: _angular_core.ModelSignal<string>;
33
+ /** Input size - matches button/checkbox sizes for consistent layouts */
34
+ size: _angular_core.InputSignal<CoarTextInputSize>;
35
+ /** Number of visible text rows (1 = single-line input, 2+ = textarea) */
36
+ rows: _angular_core.InputSignal<number>;
37
+ /** Disables the input (greyed out, not focusable) */
38
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
39
+ /** Makes the input read-only (focusable but not editable) */
40
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
41
+ /** Marks the input as required, shows asterisk on label */
42
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
43
+ /** Error message to display below the input */
44
+ error: _angular_core.InputSignal<string>;
45
+ /** Hint text displayed below the input */
46
+ hint: _angular_core.InputSignal<string>;
47
+ /** Show clear button when input has value and is focused/hovered */
48
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
49
+ /** Text or symbol displayed before the input value */
50
+ prefix: _angular_core.InputSignal<string>;
51
+ /** Text or symbol displayed after the input value */
52
+ suffix: _angular_core.InputSignal<string>;
53
+ /** HTML id attribute for the input element */
54
+ id: _angular_core.InputSignal<string>;
55
+ /** HTML name attribute for form submission */
56
+ name: _angular_core.InputSignal<string>;
57
+ /** HTML autocomplete attribute */
58
+ autocomplete: _angular_core.InputSignal<string>;
59
+ /** Maximum character length */
60
+ maxlength: _angular_core.InputSignal<number | undefined>;
61
+ /** Emits when input value changes */
62
+ valueChange: _angular_core.OutputEmitterRef<string>;
63
+ /** Emits when input loses focus */
64
+ blurred: _angular_core.OutputEmitterRef<FocusEvent>;
65
+ /** Emits when input gains focus */
66
+ focused: _angular_core.OutputEmitterRef<FocusEvent>;
67
+ /** Emits when clear button is clicked */
68
+ clear: _angular_core.OutputEmitterRef<void>;
69
+ protected isFocused: _angular_core.WritableSignal<boolean>;
70
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement | HTMLTextAreaElement> | undefined>;
71
+ protected isMultiline: _angular_core.Signal<boolean>;
72
+ protected isDisabled: _angular_core.Signal<boolean>;
73
+ protected showClearButton: _angular_core.Signal<boolean>;
74
+ protected hasError: _angular_core.Signal<boolean>;
75
+ protected displayMessage: _angular_core.Signal<string>;
76
+ private readonly autoId;
77
+ protected inputId: _angular_core.Signal<string>;
78
+ protected messageId: _angular_core.Signal<string>;
79
+ writeValue(value: string | null): void;
80
+ protected onInput(event: Event): void;
81
+ protected onFocus(event: FocusEvent): void;
82
+ protected onBlur(event: FocusEvent): void;
83
+ protected onClear(): void;
84
+ protected onLabelClick(): void;
85
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTextInputComponent, never>;
86
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTextInputComponent, "coar-text-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; "blurred": "blurred"; "focused": "focused"; "clear": "clear"; }, never, ["[prefix]", "[suffix]", "[suffixAction]"], true, never>;
87
+ }
88
+
89
+ type CoarIconSize = 'xs' | 's' | 'm' | 'l' | 'xl' | 'auto';
90
+ /**
91
+ * COAR Icon Component
92
+ *
93
+ * Icon component supporting DI-provided icon registries.
94
+ *
95
+ * Usage:
96
+ * ```html
97
+ * <coar-icon name="settings" size="m"></coar-icon>
98
+ * ```
99
+ *
100
+ * Size tokens:
101
+ * - xs = 12px
102
+ * - s = 16px
103
+ * - m = 20px (default)
104
+ * - l = 24px
105
+ * - xl = 32px
106
+ * - auto = fills parent container (use padding on parent to control)
107
+ */
108
+ declare class CoarIconComponent {
109
+ private readonly iconService;
110
+ private readonly sanitizer;
111
+ private iconLoadVersion;
112
+ /**
113
+ * Icon identifier.
114
+ * Examples: "settings", "user"
115
+ */
116
+ name: _angular_core.InputSignal<string | undefined>;
117
+ /**
118
+ * Optional icon source key.
119
+ *
120
+ * - If omitted, the default source is used.
121
+ * - If multiple sources are registered, this can be used to target a specific one.
122
+ */
123
+ source: _angular_core.InputSignal<string | undefined>;
124
+ /**
125
+ * Icon size. Defaults to 'm' (20px).
126
+ * Can be a preset token (xs, s, m, l, xl, auto) or a custom CSS value (e.g., '42px', '3rem').
127
+ */
128
+ size: _angular_core.InputSignal<string>;
129
+ /**
130
+ * Rotation angle in degrees (0, 90, 180, 270, or any number).
131
+ */
132
+ rotate: _angular_core.InputSignal<number>;
133
+ /**
134
+ * Rotation transition animation.
135
+ * - Empty/undefined: No animation
136
+ * - Number: Duration in milliseconds (e.g., 300)
137
+ * - String: Full CSS transition value (e.g., '0.3s ease-in-out', '500ms cubic-bezier(0.4, 0, 0.2, 1)')
138
+ */
139
+ rotateTransition: _angular_core.InputSignal<string | number | undefined>;
140
+ /**
141
+ * Enable continuous spinning animation.
142
+ */
143
+ spin: _angular_core.InputSignalWithTransform<boolean, unknown>;
144
+ /**
145
+ * Icon color. Can be any valid CSS color value.
146
+ * Examples: 'red', '#ff0000', 'rgb(255, 0, 0)', 'var(--coar-text-semantic-error-bold)'
147
+ * Use 'inherit' to inherit the parent element's color.
148
+ */
149
+ color: _angular_core.InputSignal<string>;
150
+ /**
151
+ * Optional text label to display next to the icon.
152
+ */
153
+ label: _angular_core.InputSignal<string | number | undefined>;
154
+ /**
155
+ * Signal holding the sanitized SVG HTML ready for rendering.
156
+ */
157
+ protected sanitizedSvg: _angular_core.WritableSignal<SafeHtml | null>;
158
+ /**
159
+ * Signal indicating whether an icon is currently being loaded.
160
+ */
161
+ protected isLoading: _angular_core.WritableSignal<boolean>;
162
+ /**
163
+ * Check if the size is a preset token (xs, s, m, l, xl, auto).
164
+ */
165
+ protected isPresetSize(size: string): boolean;
166
+ /**
167
+ * Compute the CSS transition value for rotation.
168
+ */
169
+ protected getRotateTransitionValue(): string | null;
170
+ constructor();
171
+ /**
172
+ * Resolve an icon name to an SVG string.
173
+ *
174
+ * This is kept as a single observable chain so callers can cancel it.
175
+ */
176
+ private resolveIcon$;
177
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarIconComponent, never>;
178
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarIconComponent, "coar-icon", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "source": { "alias": "source"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "rotate": { "alias": "rotate"; "required": false; "isSignal": true; }; "rotateTransition": { "alias": "rotateTransition"; "required": false; "isSignal": true; }; "spin": { "alias": "spin"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
179
+ }
180
+
181
+ /** Configuration for number formatting */
182
+ interface NumberFormatConfig {
183
+ readonly decimal: string;
184
+ readonly thousand: string;
185
+ }
186
+ type CoarNumberInputSize = 'xs' | 's' | 'm' | 'l';
187
+ type CoarNumberInputStepperButtons = 'none' | 'increment' | 'decrement' | 'both';
188
+ declare class CoarNumberInputComponent extends CoarControlValueAccessor<number | null> {
189
+ private readonly destroyRef;
190
+ private readonly localizationService;
191
+ private readonly currentLanguage;
192
+ private maskitoInstance?;
193
+ /** Label text displayed above the input */
194
+ label: _angular_core.InputSignal<string>;
195
+ /** Placeholder text shown when input is empty */
196
+ placeholder: _angular_core.InputSignal<string>;
197
+ /**
198
+ * Current numeric value.
199
+ * Using model() for two-way binding support.
200
+ */
201
+ value: _angular_core.ModelSignal<number | null>;
202
+ /** Input size - matches button/checkbox sizes for consistent layouts */
203
+ size: _angular_core.InputSignal<CoarNumberInputSize>;
204
+ /** Minimum allowed value */
205
+ min: _angular_core.InputSignal<number | undefined>;
206
+ /** Maximum allowed value */
207
+ max: _angular_core.InputSignal<number | undefined>;
208
+ /** Step increment for arrows and keyboard */
209
+ step: _angular_core.InputSignal<number>;
210
+ /** Number of decimal places to display */
211
+ decimals: _angular_core.InputSignal<number>;
212
+ /** Disables the input (greyed out, not focusable) */
213
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
214
+ /** Makes the input read-only (focusable but not editable) */
215
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
216
+ /** Marks the input as required, shows asterisk on label */
217
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
218
+ /** Error message to display below the input */
219
+ error: _angular_core.InputSignal<string>;
220
+ /** Hint text displayed below the input */
221
+ hint: _angular_core.InputSignal<string>;
222
+ /** Show clear button when input has value and is focused/hovered */
223
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
224
+ /**
225
+ * Controls visibility of increment/decrement stepper buttons.
226
+ * Supports both boolean attribute pattern and granular string control:
227
+ * - No attribute → no buttons
228
+ * - `stepperButtons` (attribute) → both buttons
229
+ * - `stepperButtons="increment"` → only increment
230
+ * - `stepperButtons="decrement"` → only decrement
231
+ * - `stepperButtons="both"` → both buttons (explicit)
232
+ * - `stepperButtons="none"` → no buttons (explicit)
233
+ */
234
+ stepperButtons: _angular_core.InputSignalWithTransform<CoarNumberInputStepperButtons, string | boolean>;
235
+ /** Text or symbol displayed before the input value */
236
+ prefix: _angular_core.InputSignal<string>;
237
+ /** Text or symbol displayed after the input value */
238
+ suffix: _angular_core.InputSignal<string>;
239
+ /**
240
+ * Locale identifier for number formatting (e.g., 'de-AT', 'en-US').
241
+ * Uses global locale service default if not specified.
242
+ */
243
+ locale: _angular_core.InputSignal<string | undefined>;
244
+ /**
245
+ * Number format configuration (decimal and thousand separators).
246
+ * If not provided, uses locale service default or falls back to { decimal: '.', thousand: '' }.
247
+ */
248
+ numberFormat: _angular_core.InputSignal<NumberFormatConfig | undefined>;
249
+ /** HTML id attribute for the input element */
250
+ id: _angular_core.InputSignal<string>;
251
+ /** HTML name attribute for form submission */
252
+ name: _angular_core.InputSignal<string>;
253
+ /** Emits when input value changes */
254
+ valueChange: _angular_core.OutputEmitterRef<number | null>;
255
+ /** Emits when input loses focus */
256
+ blurred: _angular_core.OutputEmitterRef<FocusEvent>;
257
+ /** Emits when input gains focus */
258
+ focused: _angular_core.OutputEmitterRef<FocusEvent>;
259
+ /** Emits when clear button is clicked */
260
+ clear: _angular_core.OutputEmitterRef<void>;
261
+ protected displayValue: _angular_core.WritableSignal<string>;
262
+ protected isFocused: _angular_core.WritableSignal<boolean>;
263
+ protected isDragging: _angular_core.WritableSignal<boolean>;
264
+ protected dragStartX: _angular_core.WritableSignal<number>;
265
+ protected dragStartValue: _angular_core.WritableSignal<number>;
266
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
267
+ protected isDisabled: _angular_core.Signal<boolean>;
268
+ protected showClearButton: _angular_core.Signal<boolean>;
269
+ protected hasError: _angular_core.Signal<boolean>;
270
+ protected displayMessage: _angular_core.Signal<string>;
271
+ private readonly autoId;
272
+ protected inputId: _angular_core.Signal<string>;
273
+ protected messageId: _angular_core.Signal<string>;
274
+ protected iconSize: _angular_core.Signal<CoarIconSize>;
275
+ protected showIncrementButton: _angular_core.Signal<boolean>;
276
+ protected showDecrementButton: _angular_core.Signal<boolean>;
277
+ protected canDecrement: _angular_core.Signal<boolean>;
278
+ protected canIncrement: _angular_core.Signal<boolean>;
279
+ constructor();
280
+ /**
281
+ * Cached number format configuration with priority chain:
282
+ * 1. numberFormat input (explicit config object)
283
+ * 2. Browser Intl.NumberFormat detection with locale
284
+ * 3. Hardcoded fallback { decimal: '.', thousand: '' }
285
+ */
286
+ private readonly resolvedNumberFormat;
287
+ private initializeMaskito;
288
+ protected formatValue(value: number | null): string;
289
+ /**
290
+ * Parse locale-formatted string (respects component's decimal/thousand separators).
291
+ * Used when user types or pastes into the input field.
292
+ */
293
+ protected parseValue(str: string): number | null;
294
+ protected clampValue(value: number): number;
295
+ protected onInput(event: Event): void;
296
+ protected onFocus(event: FocusEvent): void;
297
+ protected onBlur(event: FocusEvent): void;
298
+ protected commitValue(): void;
299
+ writeValue(value: number | null): void;
300
+ protected onClear(): void;
301
+ protected onLabelClick(): void;
302
+ protected increment(): void;
303
+ protected decrement(): void;
304
+ protected onKeyDown(event: KeyboardEvent): void;
305
+ protected onDragStart(event: MouseEvent): void;
306
+ protected onDragMove(event: MouseEvent): void;
307
+ protected onDragEnd(): void;
308
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarNumberInputComponent, never>;
309
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarNumberInputComponent, "coar-number-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "stepperButtons": { "alias": "stepperButtons"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "numberFormat": { "alias": "numberFormat"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; "blurred": "blurred"; "focused": "focused"; "clear": "clear"; }, never, ["[prefix]", "[suffix]"], true, never>;
310
+ }
311
+
312
+ type CoarPasswordInputSize = 'xs' | 's' | 'm' | 'l';
313
+ declare class CoarPasswordInputComponent extends CoarControlValueAccessor<string> {
314
+ /** Label text displayed above the input */
315
+ label: _angular_core.InputSignal<string>;
316
+ /** Placeholder text shown when input is empty */
317
+ placeholder: _angular_core.InputSignal<string>;
318
+ /**
319
+ * Current password value.
320
+ * Using model() for two-way binding support.
321
+ */
322
+ value: _angular_core.ModelSignal<string>;
323
+ /** Input size - matches other form elements for consistent layouts */
324
+ size: _angular_core.InputSignal<CoarPasswordInputSize>;
325
+ /** Disables the input (greyed out, not focusable) */
326
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
327
+ /** Makes the input read-only (focusable but not editable) */
328
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
329
+ /** Marks the input as required, shows asterisk on label */
330
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
331
+ /** Error message to display below the input */
332
+ error: _angular_core.InputSignal<string>;
333
+ /** Hint text displayed below the input */
334
+ hint: _angular_core.InputSignal<string>;
335
+ /** Show clear button when input has value and is focused/hovered */
336
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
337
+ /** HTML id attribute for the input element */
338
+ id: _angular_core.InputSignal<string>;
339
+ /** HTML name attribute for form submission */
340
+ name: _angular_core.InputSignal<string>;
341
+ /** HTML autocomplete attribute for browser autofill */
342
+ autocomplete: _angular_core.InputSignal<string>;
343
+ /** Maximum character length */
344
+ maxlength: _angular_core.InputSignal<number | undefined>;
345
+ /** Emits when password value changes */
346
+ valueChange: _angular_core.OutputEmitterRef<string>;
347
+ /** Emits when input loses focus */
348
+ blurred: _angular_core.OutputEmitterRef<FocusEvent>;
349
+ /** Emits when input gains focus */
350
+ focused: _angular_core.OutputEmitterRef<FocusEvent>;
351
+ /** Emits when clear button is clicked */
352
+ clear: _angular_core.OutputEmitterRef<void>;
353
+ protected isFocused: _angular_core.WritableSignal<boolean>;
354
+ protected showPassword: _angular_core.WritableSignal<boolean>;
355
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
356
+ protected inputType: _angular_core.Signal<"text" | "password">;
357
+ protected toggleIcon: _angular_core.Signal<"eye-open" | "eye-closed">;
358
+ protected toggleAriaLabel: _angular_core.Signal<"Hide password" | "Show password">;
359
+ protected isDisabled: _angular_core.Signal<boolean>;
360
+ protected showClearButton: _angular_core.Signal<boolean>;
361
+ protected hasError: _angular_core.Signal<boolean>;
362
+ protected displayMessage: _angular_core.Signal<string>;
363
+ private readonly autoId;
364
+ protected inputId: _angular_core.Signal<string>;
365
+ protected messageId: _angular_core.Signal<string>;
366
+ writeValue(value: string | null): void;
367
+ protected onInput(event: Event): void;
368
+ protected onFocus(event: FocusEvent): void;
369
+ protected onBlur(event: FocusEvent): void;
370
+ protected onClear(): void;
371
+ protected onLabelClick(): void;
372
+ protected togglePasswordVisibility(): void;
373
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPasswordInputComponent, never>;
374
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarPasswordInputComponent, "coar-password-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; "blurred": "blurred"; "focused": "focused"; "clear": "clear"; }, never, never, true, never>;
375
+ }
376
+
377
+ type CoarCheckboxSize = 'xs' | 's' | 'm' | 'l';
378
+ declare class CoarCheckboxComponent extends CoarControlValueAccessor<boolean | undefined> {
379
+ /** Label text displayed next to the checkbox */
380
+ label: _angular_core.InputSignal<string>;
381
+ /**
382
+ * Checkbox checked state: true for checked, false for unchecked, undefined for pristine.
383
+ * Using model() for two-way binding support.
384
+ */
385
+ checked: _angular_core.ModelSignal<boolean | undefined>;
386
+ /**
387
+ * Sets the checkbox to indeterminate state (visual only).
388
+ * Typically used for "select all" checkboxes when some children are selected.
389
+ * The indeterminate state is cleared when the user clicks the checkbox.
390
+ */
391
+ indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
392
+ /** Disables the checkbox (greyed out, not focusable) */
393
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
394
+ /** Prevents changes but keeps normal appearance and focus */
395
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
396
+ /** Marks as required, shows asterisk on label */
397
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
398
+ /** Error message to display below the checkbox */
399
+ error: _angular_core.InputSignal<string>;
400
+ /** Hint text displayed below the checkbox */
401
+ hint: _angular_core.InputSignal<string>;
402
+ /** Checkbox size - matches input/button heights for consistent layouts */
403
+ size: _angular_core.InputSignal<CoarCheckboxSize>;
404
+ /** HTML id attribute for the checkbox element */
405
+ id: _angular_core.InputSignal<string>;
406
+ /** HTML name attribute for form submission */
407
+ name: _angular_core.InputSignal<string>;
408
+ /** Value submitted with form when checked */
409
+ value: _angular_core.InputSignal<string>;
410
+ protected isFocused: _angular_core.WritableSignal<boolean>;
411
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
412
+ protected isDisabled: _angular_core.Signal<boolean>;
413
+ protected isChecked: _angular_core.Signal<boolean>;
414
+ protected isIndeterminate: _angular_core.Signal<boolean>;
415
+ protected hasError: _angular_core.Signal<boolean>;
416
+ protected displayMessage: _angular_core.Signal<string>;
417
+ private readonly autoId;
418
+ protected inputId: _angular_core.Signal<string>;
419
+ protected messageId: _angular_core.Signal<string>;
420
+ constructor();
421
+ writeValue(value: boolean | undefined | null): void;
422
+ protected onChange(event: Event): void;
423
+ protected onFocus(): void;
424
+ protected onBlur(): void;
425
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarCheckboxComponent, never>;
426
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarCheckboxComponent, "coar-checkbox", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
427
+ }
428
+
429
+ /**
430
+ * Individual radio button, must be used inside a coar-radio-group.
431
+ *
432
+ * @example
433
+ * ```html
434
+ * <coar-radio value="option1">Option 1</coar-radio>
435
+ * ```
436
+ */
437
+ declare class CoarRadioComponent<T = unknown> {
438
+ private readonly group;
439
+ /** Value of this radio option */
440
+ value: _angular_core.InputSignal<T>;
441
+ /** Disables this specific radio button */
442
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
443
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
444
+ protected isFocused: _angular_core.WritableSignal<boolean>;
445
+ protected isChecked: _angular_core.Signal<boolean>;
446
+ protected isDisabled: _angular_core.Signal<boolean>;
447
+ protected groupSize: _angular_core.Signal<_cocoar_ui_components.RadioGroupSize>;
448
+ protected groupHasError: _angular_core.Signal<boolean>;
449
+ protected radioName: _angular_core.Signal<string>;
450
+ private readonly autoId;
451
+ protected inputId: _angular_core.Signal<string>;
452
+ protected onClick(event: Event): void;
453
+ protected onInputChange(): void;
454
+ protected onFocus(): void;
455
+ protected onBlur(): void;
456
+ private select;
457
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarRadioComponent<any>, never>;
458
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarRadioComponent<any>, "coar-radio", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
459
+ }
460
+
461
+ type RadioGroupOrientation = 'horizontal' | 'vertical';
462
+ type RadioGroupSize = 's' | 'm' | 'l';
463
+ /**
464
+ * Radio group component for single-choice selection.
465
+ *
466
+ * @example
467
+ * ```html
468
+ * <coar-radio-group [(ngModel)]="selectedValue" name="options">
469
+ * <coar-radio value="a">Option A</coar-radio>
470
+ * <coar-radio value="b">Option B</coar-radio>
471
+ * <coar-radio value="c" [disabled]="true">Option C (disabled)</coar-radio>
472
+ * </coar-radio-group>
473
+ * ```
474
+ */
475
+ declare class CoarRadioGroupComponent<T = unknown> extends CoarControlValueAccessor<T> {
476
+ /** Currently selected value */
477
+ value: _angular_core.ModelSignal<T | undefined>;
478
+ /** Group name for radio inputs */
479
+ name: _angular_core.InputSignal<string>;
480
+ /** Accessible label for the group */
481
+ label: _angular_core.InputSignal<string>;
482
+ /** Layout orientation */
483
+ orientation: _angular_core.InputSignal<RadioGroupOrientation>;
484
+ /** Size of radio buttons */
485
+ size: _angular_core.InputSignal<RadioGroupSize>;
486
+ /** Disables all radio buttons in the group */
487
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
488
+ /** Marks the group as required */
489
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
490
+ /** Error message to display */
491
+ error: _angular_core.InputSignal<string>;
492
+ /** Hint text displayed below the group */
493
+ hint: _angular_core.InputSignal<string>;
494
+ /** Emits when selection changes */
495
+ valueChange: _angular_core.OutputEmitterRef<T>;
496
+ /** Query all child radio components */
497
+ private readonly radios;
498
+ protected isDisabled: _angular_core.Signal<boolean>;
499
+ protected hasError: _angular_core.Signal<boolean>;
500
+ protected displayMessage: _angular_core.Signal<string>;
501
+ protected hasMessage: _angular_core.Signal<boolean>;
502
+ private readonly autoId;
503
+ protected messageId: _angular_core.Signal<string>;
504
+ /** Called by child radio when selected */
505
+ selectValue(newValue: T): void;
506
+ /** Check if a value is currently selected */
507
+ isSelected(checkValue: T): boolean;
508
+ /** Check if group is disabled (exposed for child components) */
509
+ isGroupDisabled(): boolean;
510
+ writeValue(value: T): void;
511
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarRadioGroupComponent<any>, never>;
512
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarRadioGroupComponent<any>, "coar-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; }, ["radios"], ["*"], true, never>;
513
+ }
514
+
515
+ /**
516
+ * Theme options for the scrollbar appearance.
517
+ * - 'dark': Dark scrollbar theme (default)
518
+ * - 'light': Light scrollbar theme
519
+ */
520
+ type CoarScrollbarTheme = 'dark' | 'light';
521
+ /**
522
+ * Auto-hide behavior for the scrollbar.
523
+ * - 'never': Scrollbars are always visible
524
+ * - 'scroll': Scrollbars hide when not scrolling
525
+ * - 'leave': Scrollbars hide when pointer leaves the element
526
+ * - 'move': Scrollbars hide when pointer stops moving
527
+ */
528
+ type CoarScrollbarAutoHide = 'never' | 'scroll' | 'leave' | 'move';
529
+ /**
530
+ * Overflow behavior for each axis.
531
+ * - 'hidden': Content is clipped, no scrollbar
532
+ * - 'scroll': Always show scrollbar
533
+ * - 'visible-hidden': Content visible but no scrollbar
534
+ * - 'visible-scroll': Content visible with scrollbar
535
+ */
536
+ type CoarScrollbarOverflow = 'hidden' | 'scroll' | 'visible-hidden' | 'visible-scroll';
537
+ /**
538
+ * Directive that applies custom overlay scrollbars to an element.
539
+ *
540
+ * Uses OverlayScrollbars library to replace native scrollbars with
541
+ * styleable overlay scrollbars while preserving native scroll behavior.
542
+ *
543
+ * @example
544
+ * ```html
545
+ * <!-- Basic usage -->
546
+ * <div coarScrollbar>Scrollable content</div>
547
+ *
548
+ * <!-- With options -->
549
+ * <div coarScrollbar [theme]="'light'" [autoHide]="'scroll'">
550
+ * Scrollable content
551
+ * </div>
552
+ *
553
+ * <!-- Horizontal only -->
554
+ * <div coarScrollbar [overflowX]="'scroll'" [overflowY]="'hidden'">
555
+ * Horizontal scrollable content
556
+ * </div>
557
+ * ```
558
+ */
559
+ declare class CoarScrollbarDirective implements AfterViewInit, OnDestroy {
560
+ private readonly elementRef;
561
+ private readonly ngZone;
562
+ /** Theme for scrollbar appearance */
563
+ readonly theme: _angular_core.InputSignal<CoarScrollbarTheme>;
564
+ /** Auto-hide behavior for scrollbars */
565
+ readonly autoHide: _angular_core.InputSignal<CoarScrollbarAutoHide>;
566
+ /** Delay in ms before auto-hide triggers */
567
+ readonly autoHideDelay: _angular_core.InputSignal<number>;
568
+ /** Whether clicking the track scrolls to that position */
569
+ readonly clickScroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
570
+ /** Overflow behavior for x-axis */
571
+ readonly overflowX: _angular_core.InputSignal<CoarScrollbarOverflow>;
572
+ /** Overflow behavior for y-axis */
573
+ readonly overflowY: _angular_core.InputSignal<CoarScrollbarOverflow>;
574
+ /** Whether to defer initialization until browser is idle */
575
+ readonly defer: _angular_core.InputSignalWithTransform<boolean, unknown>;
576
+ /**
577
+ * Overscroll behavior to prevent scroll chaining to parent elements.
578
+ * - 'auto': Default browser behavior (scroll chains to parent)
579
+ * - 'contain': Prevents scroll chaining when reaching scroll boundaries
580
+ * - 'none': Prevents scroll chaining and disables bounce effects
581
+ */
582
+ readonly overscrollBehavior: _angular_core.InputSignal<"auto" | "none" | "contain">;
583
+ private osInstance;
584
+ private initialized;
585
+ private contentObserver;
586
+ private updateDebounceTimer;
587
+ constructor();
588
+ ngAfterViewInit(): void;
589
+ ngOnDestroy(): void;
590
+ /**
591
+ * Returns the OverlayScrollbars instance or null if not initialized.
592
+ */
593
+ getInstance(): OverlayScrollbars | null;
594
+ /**
595
+ * Scrolls to the specified position.
596
+ */
597
+ scrollTo(options: {
598
+ x?: number;
599
+ y?: number;
600
+ }): void;
601
+ /**
602
+ * Scrolls to the bottom of the scrollable content.
603
+ */
604
+ scrollToBottom(): void;
605
+ /**
606
+ * Scrolls to the top of the scrollable content.
607
+ */
608
+ scrollToTop(): void;
609
+ /**
610
+ * Updates the scrollbar (useful after dynamic content changes).
611
+ */
612
+ update(): void;
613
+ private deferInitialization;
614
+ private initialize;
615
+ private observeContentChanges;
616
+ private buildOptions;
617
+ private destroy;
618
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarScrollbarDirective, never>;
619
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarScrollbarDirective, "[coarScrollbar]", ["coarScrollbar"], { "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "autoHide": { "alias": "autoHide"; "required": false; "isSignal": true; }; "autoHideDelay": { "alias": "autoHideDelay"; "required": false; "isSignal": true; }; "clickScroll": { "alias": "clickScroll"; "required": false; "isSignal": true; }; "overflowX": { "alias": "overflowX"; "required": false; "isSignal": true; }; "overflowY": { "alias": "overflowY"; "required": false; "isSignal": true; }; "defer": { "alias": "defer"; "required": false; "isSignal": true; }; "overscrollBehavior": { "alias": "overscrollBehavior"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
620
+ }
621
+
622
+ /**
623
+ * Represents a selectable option in select components.
624
+ *
625
+ * @template T - The type of the option value
626
+ */
627
+ interface CoarSelectOption<T = unknown> {
628
+ /** The value stored when this option is selected */
629
+ value: T;
630
+ /** The display label shown in the dropdown and selected state */
631
+ label: string;
632
+ /** Whether this option is disabled and cannot be selected */
633
+ disabled?: boolean;
634
+ /** Optional group this option belongs to (for grouped options) */
635
+ group?: string;
636
+ /** Optional icon to display next to the label */
637
+ icon?: string;
638
+ }
639
+
640
+ type CoarSelectSize = 'xs' | 's' | 'm' | 'l';
641
+ /**
642
+ * Visual appearance of the select trigger.
643
+ * - 'outline': Default bordered input style
644
+ * - 'inline': Borderless, transparent background - blends into surrounding content
645
+ */
646
+ type CoarSelectAppearance = 'outline' | 'inline';
647
+ /** Dropdown position relative to the trigger */
648
+ type CoarDropdownPosition = 'top' | 'bottom';
649
+ /**
650
+ * Base class providing shared functionality for all select components.
651
+ * Handles dropdown state, keyboard navigation, and common styling.
652
+ * Subclasses override openDropdown() to use the overlay system.
653
+ */
654
+ declare abstract class CoarSelectBase<T> extends CoarControlValueAccessor<T> {
655
+ protected readonly elementRef: ElementRef<any>;
656
+ protected readonly destroyRef: DestroyRef;
657
+ /** Label text displayed above the select */
658
+ label: _angular_core.InputSignal<string>;
659
+ /** Placeholder text shown when no option is selected */
660
+ placeholder: _angular_core.InputSignal<string>;
661
+ /** Available options to choose from */
662
+ options: _angular_core.InputSignal<CoarSelectOption<unknown>[]>;
663
+ /** Select size - matches button/input heights for consistent layouts */
664
+ size: _angular_core.InputSignal<CoarSelectSize>;
665
+ /**
666
+ * Visual appearance of the select trigger.
667
+ * - 'outline': Default bordered input style
668
+ * - 'inline': Borderless, transparent - blends into surrounding content
669
+ */
670
+ appearance: _angular_core.InputSignal<CoarSelectAppearance>;
671
+ /** Disables the select (greyed out, not focusable) */
672
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
673
+ /** Makes the select read-only (focusable but not editable) */
674
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
675
+ /** Marks the select as required, shows asterisk on label */
676
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
677
+ /** Error message to display below the select */
678
+ error: _angular_core.InputSignal<string>;
679
+ /** Hint text displayed below the select */
680
+ hint: _angular_core.InputSignal<string>;
681
+ /** HTML id attribute for the select element */
682
+ id: _angular_core.InputSignal<string>;
683
+ /** HTML name attribute for form submission */
684
+ name: _angular_core.InputSignal<string>;
685
+ /** Enable search/filter functionality within the dropdown */
686
+ searchable: _angular_core.InputSignalWithTransform<boolean, unknown>;
687
+ /** Search input placeholder when searchable is enabled */
688
+ searchPlaceholder: _angular_core.InputSignal<string>;
689
+ /**
690
+ * Comparison function to match values with options.
691
+ * Use this when value objects come from different sources (e.g., API vs form).
692
+ *
693
+ * @example
694
+ * ```typescript
695
+ * // Compare Country objects by their ID
696
+ * compareById = (a: Country | null, b: Country | null) => a?.id === b?.id;
697
+ * ```
698
+ */
699
+ compareWith: _angular_core.InputSignal<((o1: unknown, o2: unknown) => boolean) | undefined>;
700
+ /** Force dropdown position ('auto' calculates based on available space) */
701
+ dropdownPositionPreference: _angular_core.InputSignal<"auto" | "top" | "bottom">;
702
+ /** Reference to the scrollbar directive for scroll control */
703
+ protected scrollbarRef: _angular_core.Signal<CoarScrollbarDirective | undefined>;
704
+ /** Reference to the options list container for scroll-into-view */
705
+ protected optionsListRef: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
706
+ /** Reference to the search input for focusing (when searchable) */
707
+ protected searchInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
708
+ /** DOM id for the dropdown search input (when searchable). */
709
+ protected searchInputId: _angular_core.Signal<string>;
710
+ /** Whether the dropdown is currently open */
711
+ protected isOpen: _angular_core.WritableSignal<boolean>;
712
+ /** Whether the select is focused */
713
+ protected isFocused: _angular_core.WritableSignal<boolean>;
714
+ /** Current search/filter query */
715
+ protected searchQuery: _angular_core.WritableSignal<string>;
716
+ /** Currently highlighted option index for keyboard navigation */
717
+ protected highlightedIndex: _angular_core.WritableSignal<number>;
718
+ /** Current dropdown position */
719
+ protected dropdownPosition: _angular_core.WritableSignal<CoarDropdownPosition>;
720
+ /** Combined disabled state from input and CVA */
721
+ protected isDisabled: _angular_core.Signal<boolean>;
722
+ /** Whether there's an error to display */
723
+ protected hasError: _angular_core.Signal<boolean>;
724
+ /** Message to display (error takes priority over hint) */
725
+ protected displayMessage: _angular_core.Signal<string>;
726
+ /** Generated unique ID for the select element */
727
+ private readonly autoId;
728
+ protected inputId: _angular_core.Signal<string>;
729
+ /** ID for the message element (for aria-describedby) */
730
+ protected messageId: _angular_core.Signal<string>;
731
+ /** ID for the listbox element */
732
+ protected listboxId: _angular_core.Signal<string>;
733
+ /** Filtered options based on search query */
734
+ protected filteredOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
735
+ /**
736
+ * Options for display, reversed when dropdown opens to top.
737
+ * This ensures the first option is always nearest to the trigger.
738
+ */
739
+ protected displayOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
740
+ /**
741
+ * Check if a display index is highlighted.
742
+ * When reversed, converts display index to data index.
743
+ */
744
+ protected isHighlighted(displayIndex: number): boolean;
745
+ /**
746
+ * Set highlight from display index.
747
+ * When reversed, converts display index to data index.
748
+ */
749
+ protected setHighlightFromDisplay(displayIndex: number): void;
750
+ constructor();
751
+ /** Toggle dropdown open/closed state */
752
+ protected toggleDropdown(): void;
753
+ /**
754
+ * Open the dropdown.
755
+ * Subclasses MUST override this method to implement overlay-based dropdown.
756
+ */
757
+ protected openDropdown(): void;
758
+ /**
759
+ * Close the dropdown.
760
+ * Subclasses MUST override this method to implement overlay-based dropdown.
761
+ */
762
+ protected closeDropdown(): void;
763
+ /** Handle keyboard navigation */
764
+ protected onKeyDown(event: KeyboardEvent): void;
765
+ /** Move highlight to the next available option */
766
+ protected highlightNextOption(): void;
767
+ /** Move highlight to the previous available option */
768
+ protected highlightPreviousOption(): void;
769
+ /** Move highlight to the first available option */
770
+ protected highlightFirstOption(): void;
771
+ /** Move highlight to the last available option */
772
+ protected highlightLastOption(): void;
773
+ /** Scroll the highlighted option into view */
774
+ protected scrollToHighlighted(): void;
775
+ protected focusSearchInput(): void;
776
+ protected scrollOptionsToBottom(): void;
777
+ protected getOptionsListElement(): HTMLDivElement | null;
778
+ /**
779
+ * CSS selector for the highlighted option element.
780
+ * Each component defines its own selector based on its CSS class naming.
781
+ */
782
+ protected abstract get highlightedOptionSelector(): string;
783
+ /** Handle focus event */
784
+ protected onFocus(): void;
785
+ /** Handle blur event */
786
+ protected onBlur(): void;
787
+ /** Handle search input changes */
788
+ protected onSearchInput(event: Event): void;
789
+ /** Whether this select should close on document clicks outside its host element. */
790
+ protected shouldCloseOnOutsideClick(): boolean;
791
+ /** Setup click outside handler to close dropdown. */
792
+ protected installOutsideClickHandler(): void;
793
+ /**
794
+ * Resolve dropdown placement based on available viewport space.
795
+ * Shared across all select subclasses that use the overlay system.
796
+ */
797
+ protected resolvePlacement(trigger: HTMLElement, estimatedPanelHeight: number): Placement;
798
+ /**
799
+ * ID of the currently highlighted option element, for `aria-activedescendant`.
800
+ * Converts the data-level highlightedIndex to the display-level DOM id.
801
+ * Subclasses that use a different options list (e.g. tag-select) override this.
802
+ */
803
+ protected activeDescendantId: _angular_core.Signal<string | null>;
804
+ /** Abstract method to select the currently highlighted option */
805
+ protected abstract selectHighlightedOption(): void;
806
+ /** Abstract method to get the display text for the current selection */
807
+ abstract getDisplayText(): string;
808
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSelectBase<any>, never>;
809
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarSelectBase<any>, never, never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "dropdownPositionPreference": { "alias": "dropdownPositionPreference"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
810
+ }
811
+
812
+ /**
813
+ * Single-select dropdown component.
814
+ *
815
+ * Allows selecting one option from a list with keyboard navigation,
816
+ * search/filter support, and full forms integration.
817
+ *
818
+ * @example
819
+ * ```html
820
+ * <coar-single-select
821
+ * label="Country"
822
+ * [options]="countries"
823
+ * [(value)]="selectedCountry"
824
+ * placeholder="Select a country"
825
+ * />
826
+ * ```
827
+ */
828
+ declare class CoarSingleSelectComponent<T = unknown> extends CoarSelectBase<T | null> {
829
+ private readonly overlayBuilder;
830
+ private readonly triggerRef;
831
+ private readonly dropdownTemplateRef;
832
+ private overlayRef;
833
+ /** Current selected value (two-way bindable with [(value)]) */
834
+ value: _angular_core.ModelSignal<T | null>;
835
+ /** Whether to show a clear button when a value is selected */
836
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
837
+ /** Emits when the selected value changes */
838
+ valueChange: _angular_core.OutputEmitterRef<T | null>;
839
+ /** CSS selector for highlighted option (used by base class scrollToHighlighted) */
840
+ protected get highlightedOptionSelector(): string;
841
+ /** The currently selected option object */
842
+ protected selectedOption: _angular_core.Signal<CoarSelectOption<unknown> | null>;
843
+ /** Whether to show the clear button */
844
+ protected showClearButton: _angular_core.Signal<boolean>;
845
+ /** Display text for the current selection */
846
+ getDisplayText(): string;
847
+ /** Write value from forms API */
848
+ writeValue(value: T | null): void;
849
+ /** Select an option by its value */
850
+ selectOption(option: CoarSelectOption<T>): void;
851
+ /** Select the currently highlighted option */
852
+ protected selectHighlightedOption(): void;
853
+ /** Clear the current selection */
854
+ protected clearSelection(event: Event): void;
855
+ /** Check if an option is currently selected */
856
+ protected isSelected(option: CoarSelectOption): boolean;
857
+ protected shouldCloseOnOutsideClick(): boolean;
858
+ protected openDropdown(): void;
859
+ protected closeDropdown(): void;
860
+ private estimatePanelHeight;
861
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSingleSelectComponent<any>, never>;
862
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarSingleSelectComponent<any>, "coar-single-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; }, never, never, true, never>;
863
+ }
864
+
865
+ /**
866
+ * Multi-select dropdown component.
867
+ *
868
+ * Allows selecting multiple options from a list with checkboxes,
869
+ * keyboard navigation, search/filter support, and full forms integration.
870
+ *
871
+ * @example
872
+ * ```html
873
+ * <coar-multi-select
874
+ * label="Skills"
875
+ * [options]="skills"
876
+ * [(value)]="selectedSkills"
877
+ * placeholder="Select skills..."
878
+ * />
879
+ * ```
880
+ */
881
+ declare class CoarMultiSelectComponent<T = unknown> extends CoarSelectBase<T[]> {
882
+ private readonly overlayBuilder;
883
+ private readonly triggerRef;
884
+ private readonly dropdownTemplateRef;
885
+ private overlayRef;
886
+ /** Current selected values (two-way bindable with [(value)]) */
887
+ value: _angular_core.ModelSignal<T[]>;
888
+ /** Whether to show a clear button when values are selected */
889
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
890
+ /** Maximum number of selected items to display before showing count */
891
+ maxDisplayItems: _angular_core.InputSignal<number>;
892
+ /** Whether to show "Select All" option */
893
+ showSelectAll: _angular_core.InputSignalWithTransform<boolean, unknown>;
894
+ /** Emits when the selected values change */
895
+ valueChange: _angular_core.OutputEmitterRef<T[]>;
896
+ /** CSS selector for highlighted option (used by base class scrollToHighlighted) */
897
+ protected get highlightedOptionSelector(): string;
898
+ /** The currently selected option objects */
899
+ protected selectedOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
900
+ /** Whether to show the clear button */
901
+ protected showClearButton: _angular_core.Signal<boolean>;
902
+ /** Whether all options are selected */
903
+ protected allSelected: _angular_core.Signal<boolean>;
904
+ /** Whether some but not all options are selected */
905
+ protected someSelected: _angular_core.Signal<boolean>;
906
+ /** Display text for the current selection */
907
+ getDisplayText(): string;
908
+ /** Write value from forms API */
909
+ writeValue(value: T[] | null): void;
910
+ /** Toggle selection of an option */
911
+ toggleOption(option: CoarSelectOption<T>, event?: Event): void;
912
+ /** Select the currently highlighted option */
913
+ protected selectHighlightedOption(): void;
914
+ /** Toggle all options */
915
+ protected toggleAll(event?: Event): void;
916
+ /** Clear all selections */
917
+ protected clearSelection(event: Event): void;
918
+ /** Check if an option is currently selected */
919
+ protected isSelected(option: CoarSelectOption): boolean;
920
+ /** Handle keyboard for multi-select (space toggles instead of closing) */
921
+ protected onKeyDown(event: KeyboardEvent): void;
922
+ protected shouldCloseOnOutsideClick(): boolean;
923
+ protected openDropdown(): void;
924
+ protected closeDropdown(): void;
925
+ private estimatePanelHeight;
926
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMultiSelectComponent<any>, never>;
927
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarMultiSelectComponent<any>, "coar-multi-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxDisplayItems": { "alias": "maxDisplayItems"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; }, never, never, true, never>;
928
+ }
929
+
930
+ /**
931
+ * Tag-based multi-select component.
932
+ *
933
+ * Displays selected items as removable tag chips with support for
934
+ * creating new tags on-the-fly (optional), keyboard navigation,
935
+ * and full forms integration.
936
+ *
937
+ * @example
938
+ * ```html
939
+ * <coar-tag-select
940
+ * label="Tags"
941
+ * [options]="availableTags"
942
+ * [(value)]="selectedTags"
943
+ * [allowCreate]="true"
944
+ * placeholder="Add tags..."
945
+ * />
946
+ * ```
947
+ */
948
+ declare class CoarTagSelectComponent<T = string> extends CoarSelectBase<T[]> {
949
+ private readonly overlayBuilder;
950
+ private readonly triggerRef;
951
+ private readonly dropdownTemplateRef;
952
+ private overlayRef;
953
+ /** Current selected values (two-way bindable with [(value)]) */
954
+ value: _angular_core.ModelSignal<T[]>;
955
+ /** Allow creating new tags that don't exist in options */
956
+ allowCreate: _angular_core.InputSignalWithTransform<boolean, unknown>;
957
+ /** Maximum number of tags that can be selected (0 = unlimited) */
958
+ maxTags: _angular_core.InputSignal<number>;
959
+ /** Text shown when creating a new tag */
960
+ createPrefix: _angular_core.InputSignal<string>;
961
+ /** Emits when the selected values change */
962
+ valueChange: _angular_core.OutputEmitterRef<T[]>;
963
+ /** Emits when a new tag is created */
964
+ tagCreated: _angular_core.OutputEmitterRef<T>;
965
+ /**
966
+ * Reference to the inline search input (tag-select uses inline input, not dropdown search).
967
+ * This is separate from the base class searchInputRef.
968
+ */
969
+ protected inlineInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
970
+ /** CSS selector for highlighted option (used by base class scrollToHighlighted) */
971
+ protected get highlightedOptionSelector(): string;
972
+ /**
973
+ * Override: tag-select uses availableOptions (excluding already-selected),
974
+ * and may have a "Create" option at the end.
975
+ */
976
+ protected activeDescendantId: _angular_core.Signal<string | null>;
977
+ /** The currently selected option objects */
978
+ protected selectedOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
979
+ /** Available options that aren't already selected */
980
+ protected availableOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
981
+ /**
982
+ * Available options for display, reversed when dropdown opens to top.
983
+ * This ensures the first option is always nearest to the trigger.
984
+ */
985
+ protected displayAvailableOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
986
+ /**
987
+ * Check if a display index is highlighted (for availableOptions).
988
+ * When reversed, converts display index to data index.
989
+ */
990
+ protected isAvailableHighlighted(displayIndex: number): boolean;
991
+ /**
992
+ * Set highlight from display index (for availableOptions).
993
+ * When reversed, converts display index to data index.
994
+ */
995
+ protected setAvailableHighlightFromDisplay(displayIndex: number): void;
996
+ /** Whether the max tags limit has been reached */
997
+ protected maxReached: _angular_core.Signal<boolean>;
998
+ /** Whether to show the "Create" option */
999
+ protected showCreateOption: _angular_core.Signal<boolean>;
1000
+ /** Display text for the current selection */
1001
+ getDisplayText(): string;
1002
+ /** Write value from forms API */
1003
+ writeValue(value: T[] | null): void;
1004
+ /** Add a tag from an option */
1005
+ addTag(option: CoarSelectOption<T>): void;
1006
+ /** Remove a tag by value */
1007
+ removeTag(tagValue: T, event?: Event): void;
1008
+ /** Create a new tag from the search query */
1009
+ protected createTag(): void;
1010
+ /** Select the currently highlighted option */
1011
+ protected selectHighlightedOption(): void;
1012
+ /** Handle keyboard for tag-select */
1013
+ protected onKeyDown(event: KeyboardEvent): void;
1014
+ /** Handle input changes */
1015
+ protected onInputChange(event: Event): void;
1016
+ /** Focus the inline input */
1017
+ protected focusInput(): void;
1018
+ /** Handle input focus */
1019
+ protected onInputFocus(): void;
1020
+ /** Handle input blur */
1021
+ protected onInputBlur(): void;
1022
+ /** Override to calculate highlighted index including create option */
1023
+ protected highlightNextOption(): void;
1024
+ /** Scroll highlighted option into view */
1025
+ protected scrollToHighlighted(): void;
1026
+ protected shouldCloseOnOutsideClick(): boolean;
1027
+ protected openDropdown(): void;
1028
+ protected closeDropdown(): void;
1029
+ private estimatePanelHeight;
1030
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTagSelectComponent<any>, never>;
1031
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTagSelectComponent<any>, "coar-tag-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; "createPrefix": { "alias": "createPrefix"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; "tagCreated": "tagCreated"; }, never, never, true, never>;
1032
+ }
1033
+
1034
+ type CoarSwitchSize = 's' | 'm' | 'l';
1035
+ declare class CoarSwitchComponent extends CoarControlValueAccessor<boolean> {
1036
+ /** Label text displayed next to the switch */
1037
+ label: _angular_core.InputSignal<string>;
1038
+ /** Switch checked state */
1039
+ checked: _angular_core.ModelSignal<boolean>;
1040
+ /** Disables the switch */
1041
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1042
+ /** Prevents changes but keeps normal appearance */
1043
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1044
+ /** Switch size */
1045
+ size: _angular_core.InputSignal<CoarSwitchSize>;
1046
+ /** HTML id attribute */
1047
+ id: _angular_core.InputSignal<string>;
1048
+ /** HTML name attribute */
1049
+ name: _angular_core.InputSignal<string>;
1050
+ /** Label position relative to the switch */
1051
+ labelPosition: _angular_core.InputSignal<"before" | "after">;
1052
+ protected isFocused: _angular_core.WritableSignal<boolean>;
1053
+ protected isDisabled: _angular_core.Signal<boolean>;
1054
+ private readonly autoId;
1055
+ protected inputId: _angular_core.Signal<string>;
1056
+ writeValue(value: boolean | null): void;
1057
+ protected onToggle(event: Event): void;
1058
+ protected onFocus(): void;
1059
+ protected onBlur(): void;
1060
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSwitchComponent, never>;
1061
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarSwitchComponent, "coar-switch", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
1062
+ }
1063
+
1064
+ /**
1065
+ * Shared date formatting configuration.
1066
+ *
1067
+ * Note: This config is intentionally small so it can be used by multiple UI components
1068
+ * (date picker, future calendar, etc.) without pulling in Angular-only code.
1069
+ */
1070
+ interface DateFormatConfig {
1071
+ /** Date format pattern: 'dd.mm.yyyy', 'dd/mm/yyyy', 'mm/dd/yyyy', 'yyyy-mm-dd' */
1072
+ readonly pattern: 'dd.mm.yyyy' | 'dd/mm/yyyy' | 'mm/dd/yyyy' | 'yyyy-mm-dd';
1073
+ /** First day of week: 1 = Monday, 7 = Sunday */
1074
+ readonly firstDayOfWeek: 1 | 7;
1075
+ }
1076
+ /**
1077
+ * Maps date format patterns to Maskito date modes.
1078
+ * Used by all picker components that initialize Maskito input masks.
1079
+ */
1080
+ declare const COAR_DATE_FORMAT_TO_MASKITO_MODE: Record<DateFormatConfig['pattern'], 'dd/mm/yyyy' | 'mm/dd/yyyy' | 'yyyy/mm/dd'>;
1081
+
1082
+ /**
1083
+ * Represents a date marker for highlighting special dates (holidays, events, etc.).
1084
+ * Supports single dates or date ranges.
1085
+ */
1086
+ interface CoarDateMarker {
1087
+ /** Start date of the marker (or single date if no endDate) */
1088
+ startDate: Temporal.PlainDate;
1089
+ /** Optional end date for date ranges (inclusive) */
1090
+ endDate?: Temporal.PlainDate;
1091
+ /** Description shown as tooltip on hover */
1092
+ description: string;
1093
+ /** Optional custom CSS class for styling different marker types */
1094
+ cssClass?: string;
1095
+ }
1096
+
1097
+ /**
1098
+ * Shared size type for date/datetime pickers.
1099
+ */
1100
+ type CoarDatePickerSize = 'xs' | 's' | 'm' | 'l';
1101
+ /**
1102
+ * Month item structure for the month list.
1103
+ */
1104
+ interface CoarMonthItem {
1105
+ readonly month: number;
1106
+ readonly name: string;
1107
+ readonly isActive: boolean;
1108
+ readonly yearMonth: Temporal.PlainYearMonth;
1109
+ }
1110
+ /**
1111
+ * Base class for date and datetime picker components.
1112
+ *
1113
+ * Provides shared functionality:
1114
+ * - Localization service integration
1115
+ * - Date format configuration resolution
1116
+ * - Month list navigation
1117
+ * - Overlay management
1118
+ * - Common state computations
1119
+ *
1120
+ * @template T - The value type (PlainDate or PlainDateTime)
1121
+ */
1122
+ declare abstract class CoarDatePickerBase<T> extends CoarControlValueAccessor<T | null> {
1123
+ protected readonly destroyRef: DestroyRef;
1124
+ protected readonly overlayBuilder: _cocoar_ui_overlay.CoarOverlayOpenBuilder;
1125
+ protected readonly localizationService: CoarLocalizationService | null;
1126
+ protected readonly localizationDataStore: CoarLocalizationDataStore | null;
1127
+ protected readonly timeZoneService: CoarTimeZoneService | null;
1128
+ protected overlayRef: OverlayRef | null;
1129
+ /** Current language from localization service (reactive) */
1130
+ protected readonly currentLanguage: _angular_core.Signal<string>;
1131
+ /**
1132
+ * Current timezone from timezone service (reactive).
1133
+ * Used for calculating "today" correctly across timezone boundaries and DST.
1134
+ */
1135
+ protected readonly currentTimeZone: _angular_core.Signal<string> | undefined;
1136
+ /**
1137
+ * Today's date based on the configured timezone.
1138
+ *
1139
+ * This is a computed signal that reacts to timezone changes.
1140
+ * Uses the timezone service if available, otherwise falls back to system timezone.
1141
+ *
1142
+ * Important for DST: At 11 PM in Vienna on March 30th, it might already be
1143
+ * March 31st in New York. This computed ensures "today" is always correct
1144
+ * for the configured timezone.
1145
+ */
1146
+ protected readonly today: _angular_core.Signal<Temporal.PlainDate>;
1147
+ /** Label text displayed above the input */
1148
+ label: _angular_core.InputSignal<string>;
1149
+ /** Placeholder text when no value is selected */
1150
+ placeholder: _angular_core.InputSignal<string>;
1151
+ /** Size variant */
1152
+ size: _angular_core.InputSignal<CoarDatePickerSize>;
1153
+ /** Whether the picker is readonly */
1154
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1155
+ /** Whether the picker is disabled */
1156
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1157
+ /** Whether the field is required */
1158
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1159
+ /** Error message (empty string = no error) */
1160
+ error: _angular_core.InputSignal<string>;
1161
+ /** Hint text displayed below the input */
1162
+ hint: _angular_core.InputSignal<string>;
1163
+ /**
1164
+ * Locale identifier for date formatting (e.g., 'de-AT', 'en-US').
1165
+ * Uses global locale service default if not specified.
1166
+ */
1167
+ locale: _angular_core.InputSignal<string | undefined>;
1168
+ /**
1169
+ * Date format configuration (pattern and first day of week).
1170
+ * If not provided, uses locale service default or falls back to European format.
1171
+ */
1172
+ dateFormatConfig: _angular_core.InputSignal<DateFormatConfig | undefined>;
1173
+ /**
1174
+ * Whether to show the current month button (floating action button that scrolls to current month).
1175
+ */
1176
+ showTodayMonthButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
1177
+ /** Whether to show week numbers */
1178
+ showWeekNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
1179
+ /** Whether to highlight weekend days */
1180
+ highlightWeekends: _angular_core.InputSignalWithTransform<boolean, unknown>;
1181
+ /** Date markers for highlighting special dates */
1182
+ markers: _angular_core.InputSignal<CoarDateMarker[]>;
1183
+ /** Whether to show a clear button when a value is selected */
1184
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1185
+ /**
1186
+ * Minimum year in the year stepper.
1187
+ * Default: current year - 100
1188
+ */
1189
+ minYear: _angular_core.InputSignal<number>;
1190
+ /**
1191
+ * Maximum year in the year stepper.
1192
+ * Default: current year + 50
1193
+ */
1194
+ maxYear: _angular_core.InputSignal<number>;
1195
+ /** Emitted when the picker opens */
1196
+ opened: _angular_core.OutputEmitterRef<void>;
1197
+ /** Emitted when the picker closes */
1198
+ closed: _angular_core.OutputEmitterRef<void>;
1199
+ /** Reference to the trigger element */
1200
+ protected triggerRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
1201
+ /** Reference to the panel template */
1202
+ protected panelTemplateRef: _angular_core.Signal<TemplateRef<unknown> | undefined>;
1203
+ /** Unique ID for this component instance. Subclasses must set this with their selector prefix. */
1204
+ protected abstract readonly uid: string;
1205
+ /** ID for the label element */
1206
+ protected labelId: _angular_core.Signal<string>;
1207
+ /** ID for the input element */
1208
+ protected inputId: _angular_core.Signal<string>;
1209
+ /** ID for the panel */
1210
+ protected panelId: _angular_core.Signal<string>;
1211
+ /** ID for the message element */
1212
+ protected messageId: _angular_core.Signal<string>;
1213
+ /** Whether the panel is open */
1214
+ protected isOpen: _angular_core.WritableSignal<boolean>;
1215
+ /** Panel position (determined before opening) */
1216
+ protected panelPosition: _angular_core.WritableSignal<"top" | "bottom">;
1217
+ /** Display value for the input field */
1218
+ protected displayValue: _angular_core.WritableSignal<string>;
1219
+ /** Currently visible month in the calendar (synced with month list) */
1220
+ protected activeMonth: _angular_core.WritableSignal<Temporal.PlainYearMonth | null>;
1221
+ /**
1222
+ * Effective date format configuration.
1223
+ * Resolution order:
1224
+ * 1. Explicit dateFormatConfig input
1225
+ * 2. Localization data store (based on current language)
1226
+ * 3. Intl.DateTimeFormat detection from locale
1227
+ * 4. Default: European format (dd.mm.yyyy)
1228
+ */
1229
+ protected effectiveDateFormat: _angular_core.Signal<DateFormatConfig>;
1230
+ /** Get the date format pattern */
1231
+ protected dateFormat: _angular_core.Signal<"dd.mm.yyyy" | "dd/mm/yyyy" | "mm/dd/yyyy" | "yyyy-mm-dd">;
1232
+ /** Get the separator character */
1233
+ protected separator: _angular_core.Signal<"." | "/" | "-">;
1234
+ /**
1235
+ * Effective locale.
1236
+ * Resolution order:
1237
+ * 1. Explicit locale input
1238
+ * 2. Current language from localization service
1239
+ * 3. Browser's navigator.language
1240
+ */
1241
+ protected effectiveLocale: _angular_core.Signal<string>;
1242
+ /** Whether the picker has an error state */
1243
+ protected hasError: _angular_core.Signal<boolean>;
1244
+ /** The message to display (error takes priority over hint) */
1245
+ protected displayMessage: _angular_core.Signal<string>;
1246
+ /** Whether the picker is disabled (including CVA disabled state) */
1247
+ protected isDisabled: _angular_core.Signal<boolean>;
1248
+ /** Whether to show the clear button */
1249
+ protected showClearButton: _angular_core.Signal<boolean>;
1250
+ /**
1251
+ * Get the current value. Subclasses implement this to access their typed model.
1252
+ */
1253
+ protected abstract getValue(): T | null;
1254
+ /**
1255
+ * Get the resolved active month based on the current value.
1256
+ * For date picker: value?.toPlainYearMonth()
1257
+ * For datetime picker: value?.toPlainDate().toPlainYearMonth()
1258
+ */
1259
+ protected abstract resolvedActiveMonth(): Temporal.PlainYearMonth;
1260
+ /**
1261
+ * Get the selected date as a PlainDate for marker filtering.
1262
+ * For date picker: value()
1263
+ * For datetime/zoned pickers: selectedDate() (extracted from value)
1264
+ */
1265
+ protected abstract getSelectedPlainDate(): Temporal.PlainDate | null;
1266
+ /**
1267
+ * Reset the value to null. Called by clearValue().
1268
+ * Subclasses set their model to null, emit valueChange, and handle extra state (e.g. pendingTime).
1269
+ */
1270
+ protected abstract resetValue(): void;
1271
+ /**
1272
+ * Estimated panel height for overlay placement calculation.
1273
+ */
1274
+ protected abstract estimatePanelHeight(): number;
1275
+ /**
1276
+ * Markers for the currently selected date.
1277
+ */
1278
+ protected selectedDateMarkers: _angular_core.Signal<CoarDateMarker[]>;
1279
+ /** Current year from activeMonth */
1280
+ protected currentYear: _angular_core.Signal<number>;
1281
+ /** Current month number from activeMonth (1-12) */
1282
+ protected currentMonthNumber: _angular_core.Signal<number>;
1283
+ /** Whether previous year button is disabled */
1284
+ protected isPrevYearDisabled: _angular_core.Signal<boolean>;
1285
+ /** Whether next year button is disabled */
1286
+ protected isNextYearDisabled: _angular_core.Signal<boolean>;
1287
+ /**
1288
+ * Month list items for the current year.
1289
+ */
1290
+ protected monthItems: _angular_core.Signal<CoarMonthItem[]>;
1291
+ /** Direction for the "jump to today" FAB */
1292
+ protected todayMonthScrollDirection: _angular_core.Signal<"down" | "up" | "hidden">;
1293
+ /** Whether to show the today month FAB */
1294
+ protected showTodayMonthFab: _angular_core.Signal<boolean>;
1295
+ /** Navigate to previous year */
1296
+ protected previousYear(): void;
1297
+ /** Navigate to next year */
1298
+ protected nextYear(): void;
1299
+ /** Select a month from the list */
1300
+ protected selectMonth(yearMonth: Temporal.PlainYearMonth): void;
1301
+ /** Scroll to today's month */
1302
+ protected scrollToTodayMonth(): void;
1303
+ /** Handle active month change from calendar scroll */
1304
+ protected onActiveMonthChanged(yearMonth: Temporal.PlainYearMonth): void;
1305
+ /**
1306
+ * Resolve overlay placement based on available viewport space.
1307
+ */
1308
+ protected resolvePlacement(trigger: HTMLElement, estimatedPanelHeight: number): Placement;
1309
+ /**
1310
+ * Close the picker panel.
1311
+ */
1312
+ closePanel(): void;
1313
+ /**
1314
+ * Toggle the picker panel.
1315
+ */
1316
+ togglePanel(): void;
1317
+ /**
1318
+ * Open the picker panel.
1319
+ */
1320
+ openPanel(): void;
1321
+ /**
1322
+ * Hook called when the panel closes. Override in subclasses for cleanup.
1323
+ */
1324
+ protected onPanelClosed(): void;
1325
+ /**
1326
+ * Clear the selected value.
1327
+ */
1328
+ clearValue(event: Event): void;
1329
+ protected onTriggerClick(): void;
1330
+ protected onTriggerKeydown(event: KeyboardEvent): void;
1331
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarDatePickerBase<any>, never>;
1332
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarDatePickerBase<any>, never, never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "dateFormatConfig": { "alias": "dateFormatConfig"; "required": false; "isSignal": true; }; "showTodayMonthButton": { "alias": "showTodayMonthButton"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "highlightWeekends": { "alias": "highlightWeekends"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "minYear": { "alias": "minYear"; "required": false; "isSignal": true; }; "maxYear": { "alias": "maxYear"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1333
+ }
1334
+
1335
+ type CoarPlainDatePickerSize = CoarDatePickerSize;
1336
+ /**
1337
+ * Date picker component with scrollable calendar.
1338
+ *
1339
+ * Returns strongly-typed `Temporal.PlainDate` values (timezone-independent, date only).
1340
+ *
1341
+ * Features:
1342
+ * - Two-column layout: scrollable calendar on left, month list on right
1343
+ * - No time selection (use `coar-plain-date-time-picker` if time is needed)
1344
+ * - CSS-based virtualization for smooth scrolling through months
1345
+ *
1346
+ * @example
1347
+ * ```html
1348
+ * <coar-plain-date-picker
1349
+ * [(value)]="birthDate"
1350
+ * label="Date of Birth"
1351
+ * />
1352
+ * ```
1353
+ */
1354
+ declare class CoarPlainDatePickerComponent extends CoarDatePickerBase<Temporal.PlainDate> {
1355
+ /** Maskito instance for input masking */
1356
+ private maskitoInstance?;
1357
+ /** Minimum selectable date */
1358
+ min: _angular_core.InputSignal<Temporal.PlainDate | null>;
1359
+ /** Maximum selectable date */
1360
+ max: _angular_core.InputSignal<Temporal.PlainDate | null>;
1361
+ /** Whether to close the panel after selecting a date (default: false to allow viewing events) */
1362
+ closeOnSelect: _angular_core.InputSignalWithTransform<boolean, unknown>;
1363
+ /** Current selected value (two-way bindable with [(value)]) */
1364
+ value: _angular_core.ModelSignal<Temporal.PlainDate | null>;
1365
+ /** Emitted when the selected value changes */
1366
+ valueChange: _angular_core.OutputEmitterRef<Temporal.PlainDate | null>;
1367
+ /** Unique ID counter for component instances */
1368
+ private static nextId;
1369
+ /** Unique ID for this component instance */
1370
+ protected readonly uid: string;
1371
+ /** Reference to the input element */
1372
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
1373
+ /** Get placeholder text based on date format */
1374
+ protected inputPlaceholder: _angular_core.Signal<string>;
1375
+ /** Resolved active month (uses value's month or today) */
1376
+ protected resolvedActiveMonth: _angular_core.Signal<Temporal.PlainYearMonth>;
1377
+ protected getValue(): Temporal.PlainDate | null;
1378
+ protected getSelectedPlainDate(): Temporal.PlainDate | null;
1379
+ protected estimatePanelHeight(): number;
1380
+ protected resetValue(): void;
1381
+ constructor();
1382
+ /** Handle date selection from calendar */
1383
+ protected onDateSelected(date: Temporal.PlainDate): void;
1384
+ writeValue(value: Temporal.PlainDate | string | null): void;
1385
+ protected onInputChange(event: Event): void;
1386
+ protected onInputBlur(): void;
1387
+ private initializeMaskito;
1388
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPlainDatePickerComponent, never>;
1389
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarPlainDatePickerComponent, "coar-plain-date-picker", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; }, never, never, true, never>;
1390
+ }
1391
+
1392
+ /**
1393
+ * Time formatting and parsing utilities.
1394
+ *
1395
+ * Provides locale-aware time formatting with 12h/24h detection,
1396
+ * time parsing, and hour/minute manipulation with wrap-around support.
1397
+ */
1398
+ /**
1399
+ * AM/PM period indicator.
1400
+ */
1401
+ type CoarTimePeriod = 'AM' | 'PM';
1402
+ /**
1403
+ * Parsed time value with hours (0-23) and minutes (0-59).
1404
+ */
1405
+ interface CoarTimeValue {
1406
+ readonly hours: number;
1407
+ readonly minutes: number;
1408
+ }
1409
+ /**
1410
+ * Detects whether the given locale uses 12-hour time format.
1411
+ *
1412
+ * Uses Intl.DateTimeFormat to check if the locale's default time format
1413
+ * includes a dayPeriod (AM/PM indicator).
1414
+ *
1415
+ * @param locale - BCP 47 locale identifier (e.g., 'en-US', 'de-AT')
1416
+ * @returns true if locale uses 12-hour format, false for 24-hour format
1417
+ *
1418
+ * @example
1419
+ * ```ts
1420
+ * coarDetect12HourFormat('en-US'); // true (US uses 12h)
1421
+ * coarDetect12HourFormat('de-DE'); // false (Germany uses 24h)
1422
+ * coarDetect12HourFormat('en-GB'); // false (UK uses 24h)
1423
+ * ```
1424
+ */
1425
+ declare function coarDetect12HourFormat(locale: string): boolean;
1426
+ /**
1427
+ * Formats a time value as a string.
1428
+ *
1429
+ * @param hours - Hours (0-23)
1430
+ * @param minutes - Minutes (0-59)
1431
+ * @param use24Hour - true for 24h format ("14:30"), false for 12h format ("2:30 PM")
1432
+ * @returns Formatted time string
1433
+ *
1434
+ * @example
1435
+ * ```ts
1436
+ * coarFormatTime(14, 30, true); // "14:30"
1437
+ * coarFormatTime(14, 30, false); // "2:30 PM"
1438
+ * coarFormatTime(0, 5, true); // "00:05"
1439
+ * coarFormatTime(0, 5, false); // "12:05 AM"
1440
+ * ```
1441
+ */
1442
+ declare function coarFormatTime(hours: number, minutes: number, use24Hour: boolean): string;
1443
+ /**
1444
+ * Parses a time string into hours and minutes.
1445
+ *
1446
+ * Supports both 24-hour and 12-hour formats:
1447
+ * - 24h: "14:30", "08:00", "23:59"
1448
+ * - 12h: "2:30 PM", "12:00 AM", "11:59 pm"
1449
+ *
1450
+ * @param text - Time string to parse
1451
+ * @returns Parsed time value or null if invalid
1452
+ *
1453
+ * @example
1454
+ * ```ts
1455
+ * coarParseTimeInput("14:30"); // { hours: 14, minutes: 30 }
1456
+ * coarParseTimeInput("2:30 PM"); // { hours: 14, minutes: 30 }
1457
+ * coarParseTimeInput("12:00 AM"); // { hours: 0, minutes: 0 }
1458
+ * coarParseTimeInput("invalid"); // null
1459
+ * ```
1460
+ */
1461
+ declare function coarParseTimeInput(text: string): CoarTimeValue | null;
1462
+ /**
1463
+ * Converts 24-hour format hours to 12-hour format.
1464
+ *
1465
+ * @param hours24 - Hours in 24-hour format (0-23)
1466
+ * @returns Object with 12-hour hours (1-12) and period (AM/PM)
1467
+ *
1468
+ * @example
1469
+ * ```ts
1470
+ * coarConvertTo12Hour(0); // { hours: 12, period: 'AM' }
1471
+ * coarConvertTo12Hour(12); // { hours: 12, period: 'PM' }
1472
+ * coarConvertTo12Hour(14); // { hours: 2, period: 'PM' }
1473
+ * coarConvertTo12Hour(23); // { hours: 11, period: 'PM' }
1474
+ * ```
1475
+ */
1476
+ declare function coarConvertTo12Hour(hours24: number): {
1477
+ hours: number;
1478
+ period: CoarTimePeriod;
1479
+ };
1480
+ /**
1481
+ * Converts 12-hour format to 24-hour format.
1482
+ *
1483
+ * @param hours12 - Hours in 12-hour format (1-12)
1484
+ * @param period - AM or PM
1485
+ * @returns Hours in 24-hour format (0-23)
1486
+ *
1487
+ * @example
1488
+ * ```ts
1489
+ * coarConvertTo24Hour(12, 'AM'); // 0
1490
+ * coarConvertTo24Hour(12, 'PM'); // 12
1491
+ * coarConvertTo24Hour(2, 'PM'); // 14
1492
+ * coarConvertTo24Hour(11, 'PM'); // 23
1493
+ * ```
1494
+ */
1495
+ declare function coarConvertTo24Hour(hours12: number, period: CoarTimePeriod): number;
1496
+ /**
1497
+ * Increments hours with wrap-around.
1498
+ *
1499
+ * @param hours - Current hours (0-23)
1500
+ * @param delta - Amount to change (positive or negative)
1501
+ * @returns New hours value (0-23), wrapped around
1502
+ *
1503
+ * @example
1504
+ * ```ts
1505
+ * coarIncrementHours(23, 1); // 0 (wraps from 23 to 0)
1506
+ * coarIncrementHours(0, -1); // 23 (wraps from 0 to 23)
1507
+ * coarIncrementHours(14, 2); // 16
1508
+ * ```
1509
+ */
1510
+ declare function coarIncrementHours(hours: number, delta: number): number;
1511
+ /**
1512
+ * Increments minutes with wrap-around and optional hour carry.
1513
+ *
1514
+ * @param minutes - Current minutes (0-59)
1515
+ * @param delta - Amount to change (positive or negative)
1516
+ * @param step - Minute step interval (default: 1)
1517
+ * @returns Object with new minutes and hour delta (for carry-over)
1518
+ *
1519
+ * @example
1520
+ * ```ts
1521
+ * coarIncrementMinutes(55, 5); // { minutes: 0, hourDelta: 1 }
1522
+ * coarIncrementMinutes(0, -5); // { minutes: 55, hourDelta: -1 }
1523
+ * coarIncrementMinutes(30, 15, 15); // { minutes: 45, hourDelta: 0 }
1524
+ * ```
1525
+ */
1526
+ declare function coarIncrementMinutes(minutes: number, delta: number, step?: number): {
1527
+ minutes: number;
1528
+ hourDelta: number;
1529
+ };
1530
+ /**
1531
+ * Rounds minutes to the nearest step.
1532
+ *
1533
+ * @param minutes - Current minutes (0-59)
1534
+ * @param step - Minute step interval
1535
+ * @returns Rounded minutes value
1536
+ *
1537
+ * @example
1538
+ * ```ts
1539
+ * coarRoundMinutesToStep(7, 5); // 5
1540
+ * coarRoundMinutesToStep(8, 5); // 10
1541
+ * coarRoundMinutesToStep(22, 15); // 15
1542
+ * coarRoundMinutesToStep(23, 15); // 30
1543
+ * ```
1544
+ */
1545
+ declare function coarRoundMinutesToStep(minutes: number, step: number): number;
1546
+ /**
1547
+ * Gets valid minute values for a given step.
1548
+ *
1549
+ * @param step - Minute step interval (1, 5, 10, or 15)
1550
+ * @returns Array of valid minute values
1551
+ *
1552
+ * @example
1553
+ * ```ts
1554
+ * coarGetValidMinutes(15); // [0, 15, 30, 45]
1555
+ * coarGetValidMinutes(5); // [0, 5, 10, 15, ..., 55]
1556
+ * coarGetValidMinutes(1); // [0, 1, 2, ..., 59]
1557
+ * ```
1558
+ */
1559
+ declare function coarGetValidMinutes(step: 1 | 5 | 10 | 15): number[];
1560
+
1561
+ type CoarPlainDateTimePickerSize = CoarDatePickerSize;
1562
+ /**
1563
+ * Date-time picker component with scrollable calendar and time selection.
1564
+ *
1565
+ * Returns strongly-typed `Temporal.PlainDateTime` values (timezone-independent).
1566
+ *
1567
+ * Features:
1568
+ * - Two-column layout: scrollable calendar on left, month list + time picker on right
1569
+ * - Locale-aware time format (12h/24h auto-detection)
1570
+ * - CSS-based virtualization for smooth scrolling through months
1571
+ * - Min/max datetime constraints with time clamping
1572
+ *
1573
+ * @example
1574
+ * ```html
1575
+ * <coar-plain-date-time-picker
1576
+ * [(value)]="appointmentDateTime"
1577
+ * label="Appointment"
1578
+ * [minuteStep]="15"
1579
+ * />
1580
+ * ```
1581
+ */
1582
+ declare class CoarPlainDateTimePickerComponent extends CoarDatePickerBase<Temporal.PlainDateTime> {
1583
+ /** Maskito instance for input masking */
1584
+ private maskitoInstance?;
1585
+ /** Minimum selectable datetime */
1586
+ min: _angular_core.InputSignal<Temporal.PlainDateTime | null>;
1587
+ /** Maximum selectable datetime */
1588
+ max: _angular_core.InputSignal<Temporal.PlainDateTime | null>;
1589
+ /**
1590
+ * Whether to use 24-hour time format.
1591
+ * - true: Always use 24h format
1592
+ * - false: Always use 12h format with AM/PM
1593
+ * - 'auto': Detect from locale (default)
1594
+ */
1595
+ use24Hour: _angular_core.InputSignal<boolean | "auto">;
1596
+ /** Step interval for minute selection (1, 5, 10, or 15) */
1597
+ minuteStep: _angular_core.InputSignal<1 | 10 | 15 | 5>;
1598
+ /**
1599
+ * Default time to use when selecting a date without existing time.
1600
+ */
1601
+ defaultTime: _angular_core.InputSignal<CoarTimeValue>;
1602
+ /** Current selected value (two-way bindable with [(value)]) */
1603
+ value: _angular_core.ModelSignal<Temporal.PlainDateTime | null>;
1604
+ /** Emitted when the selected value changes */
1605
+ valueChange: _angular_core.OutputEmitterRef<Temporal.PlainDateTime | null>;
1606
+ /** Unique ID counter for component instances */
1607
+ private static nextId;
1608
+ /** Unique ID for this component instance */
1609
+ protected readonly uid: string;
1610
+ /** Reference to the input element */
1611
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
1612
+ /** Pending time value (stored until a date is selected) */
1613
+ protected pendingTime: _angular_core.WritableSignal<CoarTimeValue | null>;
1614
+ /** Get placeholder text based on date and time format */
1615
+ protected inputPlaceholder: _angular_core.Signal<string>;
1616
+ /** Whether to use 24-hour time format */
1617
+ protected effectiveUse24Hour: _angular_core.Signal<boolean>;
1618
+ /** Extract date portion from value */
1619
+ protected selectedDate: _angular_core.Signal<Temporal.PlainDate | null>;
1620
+ /** Extract time portion from value */
1621
+ protected selectedTime: _angular_core.Signal<CoarTimeValue | null>;
1622
+ /** Min date for calendar constraints */
1623
+ protected minDate: _angular_core.Signal<Temporal.PlainDate | null>;
1624
+ /** Max date for calendar constraints */
1625
+ protected maxDate: _angular_core.Signal<Temporal.PlainDate | null>;
1626
+ /**
1627
+ * Effective minimum time constraint for the time picker.
1628
+ * Only applies when the selected date equals the minimum date boundary.
1629
+ */
1630
+ protected effectiveMinTime: _angular_core.Signal<CoarTimeValue | null>;
1631
+ /**
1632
+ * Effective maximum time constraint for the time picker.
1633
+ * Only applies when the selected date equals the maximum date boundary.
1634
+ */
1635
+ protected effectiveMaxTime: _angular_core.Signal<CoarTimeValue | null>;
1636
+ /** Resolved active month (uses value's month or today) */
1637
+ protected resolvedActiveMonth: _angular_core.Signal<Temporal.PlainYearMonth>;
1638
+ protected getValue(): Temporal.PlainDateTime | null;
1639
+ protected getSelectedPlainDate(): Temporal.PlainDate | null;
1640
+ protected estimatePanelHeight(): number;
1641
+ protected resetValue(): void;
1642
+ constructor();
1643
+ /** Handle date selection from calendar */
1644
+ protected onDateSelected(date: Temporal.PlainDate): void;
1645
+ /** Handle time changes from time picker */
1646
+ protected onTimeChanged(time: CoarTimeValue | null): void;
1647
+ /**
1648
+ * Clamps a PlainDateTime to be within the min/max range.
1649
+ * Returns the original value if it's within range, otherwise returns the nearest boundary.
1650
+ */
1651
+ private clampDateTimeToRange;
1652
+ writeValue(value: Temporal.PlainDateTime | string | null): void;
1653
+ protected onInputChange(event: Event): void;
1654
+ protected onInputBlur(): void;
1655
+ private formatValue;
1656
+ private parseValueFromInput;
1657
+ private initializeMaskito;
1658
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPlainDateTimePickerComponent, never>;
1659
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarPlainDateTimePickerComponent, "coar-plain-date-time-picker", never, { "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "use24Hour": { "alias": "use24Hour"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "defaultTime": { "alias": "defaultTime"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; }, never, never, true, never>;
1660
+ }
1661
+
1662
+ type CoarZonedDateTimePickerSize = CoarDatePickerSize;
1663
+ /**
1664
+ * A timezone item for display in the picker list.
1665
+ */
1666
+ interface TimezoneItem {
1667
+ /** Full IANA ID (e.g., 'Europe/Vienna') */
1668
+ id: string;
1669
+ /** City name for display (e.g., 'Vienna') */
1670
+ city: string;
1671
+ /** UTC offset for display (e.g., 'UTC+1') */
1672
+ offset: string;
1673
+ }
1674
+ /**
1675
+ * A group of timezones by continent/region.
1676
+ */
1677
+ interface TimezoneGroup {
1678
+ /** Group name (e.g., 'Europe', 'America') */
1679
+ name: string;
1680
+ /** Timezones in this group */
1681
+ items: TimezoneItem[];
1682
+ }
1683
+ /**
1684
+ * Zoned date-time picker component with full timezone support.
1685
+ *
1686
+ * Returns strongly-typed `Temporal.ZonedDateTime` values that include:
1687
+ * - The local date and time (user's intent)
1688
+ * - The IANA timezone (context)
1689
+ * - The instant (derived UTC moment)
1690
+ *
1691
+ * Key concepts:
1692
+ * - **Value timezone**: Where the event "lives" - persisted with the value
1693
+ * - **Display timezone**: User's viewing lens (from CoarTimeZoneService)
1694
+ *
1695
+ * This picker captures complete user intent, allowing you to:
1696
+ * - Store the local time + timezone as source of truth
1697
+ * - Derive the UTC instant for queries and ordering
1698
+ * - Recalculate instants if DST rules change
1699
+ *
1700
+ * @example
1701
+ * ```html
1702
+ * <!-- Basic usage -->
1703
+ * <coar-zoned-date-time-picker
1704
+ * [(value)]="meetingDateTime"
1705
+ * label="Meeting Time"
1706
+ * />
1707
+ *
1708
+ * <!-- With explicit timezone -->
1709
+ * <coar-zoned-date-time-picker
1710
+ * [(value)]="meetingDateTime"
1711
+ * [timeZone]="'Europe/Vienna'"
1712
+ * label="Meeting Time"
1713
+ * />
1714
+ * ```
1715
+ */
1716
+ declare class CoarZonedDateTimePickerComponent extends CoarDatePickerBase<Temporal.ZonedDateTime> {
1717
+ /** Maskito instance for input masking */
1718
+ private maskitoInstance?;
1719
+ /**
1720
+ * The timezone for the value.
1721
+ *
1722
+ * This represents where the event "lives" - it's persisted with the value.
1723
+ * If not provided, uses the timezone from CoarTimeZoneService.
1724
+ *
1725
+ * Examples: 'Europe/Vienna', 'America/New_York', 'UTC'
1726
+ */
1727
+ timeZone: _angular_core.InputSignal<string | null>;
1728
+ /** Minimum selectable datetime (in the value's timezone) */
1729
+ min: _angular_core.InputSignal<Temporal.ZonedDateTime | null>;
1730
+ /** Maximum selectable datetime (in the value's timezone) */
1731
+ max: _angular_core.InputSignal<Temporal.ZonedDateTime | null>;
1732
+ /**
1733
+ * Whether to use 24-hour time format.
1734
+ * - true: Always use 24h format
1735
+ * - false: Always use 12h format with AM/PM
1736
+ * - 'auto': Detect from locale (default)
1737
+ */
1738
+ use24Hour: _angular_core.InputSignal<boolean | "auto">;
1739
+ /** Step interval for minute selection (1, 5, 10, or 15) */
1740
+ minuteStep: _angular_core.InputSignal<1 | 10 | 15 | 5>;
1741
+ /**
1742
+ * Default time to use when selecting a date without existing time.
1743
+ */
1744
+ defaultTime: _angular_core.InputSignal<CoarTimeValue>;
1745
+ /**
1746
+ * Filter patterns for available timezone options.
1747
+ *
1748
+ * Supports wildcards:
1749
+ * - `*` matches any characters
1750
+ * - Patterns are case-insensitive
1751
+ *
1752
+ * If not provided or empty, all IANA timezones are available.
1753
+ *
1754
+ * @example
1755
+ * // Only European timezones
1756
+ * [timezoneFilter]="['Europe/*']"
1757
+ *
1758
+ * // European + specific US cities
1759
+ * [timezoneFilter]="['Europe/*', 'America/New_York', 'America/Los_Angeles']"
1760
+ *
1761
+ * // Anything containing 'New'
1762
+ * [timezoneFilter]="['*New*']"
1763
+ */
1764
+ timezoneFilter: _angular_core.InputSignal<string[]>;
1765
+ /** Current selected value (two-way bindable with [(value)]) */
1766
+ value: _angular_core.ModelSignal<Temporal.ZonedDateTime | null>;
1767
+ /** Emitted when the selected value changes */
1768
+ valueChange: _angular_core.OutputEmitterRef<Temporal.ZonedDateTime | null>;
1769
+ /** Unique ID counter for component instances */
1770
+ private static nextId;
1771
+ /** Unique ID for this component instance */
1772
+ protected readonly uid: string;
1773
+ /** Reference to the input element */
1774
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
1775
+ /** Reference to the timezone search input */
1776
+ protected tzSearchInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
1777
+ /** Reference to the timezone list container */
1778
+ protected tzListRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
1779
+ /** Pending time value (stored until a date is selected) */
1780
+ protected pendingTime: _angular_core.WritableSignal<CoarTimeValue | null>;
1781
+ /**
1782
+ * Display timezone - the user's viewing lens.
1783
+ * This can be freely changed without affecting the stored value.
1784
+ * Defaults to the user's timezone from CoarTimeZoneService.
1785
+ */
1786
+ protected displayTimeZone: _angular_core.WritableSignal<string | null>;
1787
+ /**
1788
+ * Whether the value timezone is being edited (unlocked inline select mode).
1789
+ */
1790
+ protected isEditingValueTimeZone: _angular_core.WritableSignal<boolean>;
1791
+ /**
1792
+ * Whether the side column is showing the timezone picker instead of normal content.
1793
+ */
1794
+ protected isSelectingDisplayTimezone: _angular_core.WritableSignal<boolean>;
1795
+ /**
1796
+ * Search query for timezone filtering in the inline timezone picker.
1797
+ */
1798
+ protected timezoneSearchQuery: _angular_core.WritableSignal<string>;
1799
+ /**
1800
+ * The value's timezone (where the event "lives").
1801
+ * This is the intent timezone - stored with the value.
1802
+ */
1803
+ protected valueTimeZone: _angular_core.Signal<string | null>;
1804
+ /**
1805
+ * Effective display timezone for viewing.
1806
+ * Priority: explicit display selection > service timezone > UTC fallback
1807
+ */
1808
+ protected effectiveDisplayTimeZone: _angular_core.Signal<string>;
1809
+ /**
1810
+ * The current working timezone for the picker UI.
1811
+ * When creating new values, this determines the timezone used.
1812
+ * When editing, this is the display timezone (value TZ is preserved).
1813
+ */
1814
+ protected currentWorkingTimeZone: _angular_core.Signal<string>;
1815
+ /**
1816
+ * The user's timezone from the service (or UTC fallback).
1817
+ * This is the user's "home" timezone.
1818
+ */
1819
+ protected userTimeZone: _angular_core.Signal<string>;
1820
+ /**
1821
+ * Whether the location timezone differs from the user's timezone.
1822
+ * Used to determine if toggle functionality should be available.
1823
+ */
1824
+ protected locationDiffersFromUser: _angular_core.Signal<boolean>;
1825
+ /**
1826
+ * Timezone indicator state for the icon.
1827
+ * - 'home': Showing value in user's timezone
1828
+ * - 'location': Showing value in event's location timezone
1829
+ * - 'world': Showing value in a third timezone (neither user nor location)
1830
+ */
1831
+ protected timezoneIndicatorState: _angular_core.Signal<"home" | "location" | "world">;
1832
+ /**
1833
+ * Whether the display timezone differs from the value timezone.
1834
+ * Used to show/hide the timezone indicator.
1835
+ * @deprecated Use timezoneIndicatorState instead for icon logic
1836
+ */
1837
+ protected timeZonesDiffer: _angular_core.Signal<boolean>;
1838
+ /**
1839
+ * Short display name for the value timezone.
1840
+ * Format: "Vienna (UTC+1)"
1841
+ */
1842
+ protected valueTimeZoneDisplayName: _angular_core.Signal<string>;
1843
+ /**
1844
+ * Short display name for the display timezone (user's home TZ).
1845
+ * Format: "Vienna (UTC+1)"
1846
+ */
1847
+ protected displayTimeZoneDisplayName: _angular_core.Signal<string>;
1848
+ /**
1849
+ * Short display name for the currently shown timezone (based on toggle state).
1850
+ * This reflects what the user is actually seeing in the input.
1851
+ * Format: "Vienna (UTC+1)" or "New York (UTC-5)"
1852
+ */
1853
+ protected currentTimeZoneDisplayName: _angular_core.Signal<string>;
1854
+ /**
1855
+ * Short abbreviation for the display timezone badge.
1856
+ * Shows just the city name or a short form (max ~6 chars).
1857
+ * E.g., 'Europe/Vienna' → 'VIE', 'America/New_York' → 'NYC'
1858
+ */
1859
+ protected displayTimeZoneAbbreviation: _angular_core.Signal<string>;
1860
+ /**
1861
+ * UTC offset string for the value timezone.
1862
+ */
1863
+ protected valueTimeZoneOffset: _angular_core.Signal<string>;
1864
+ /**
1865
+ * UTC offset string for the display timezone.
1866
+ */
1867
+ protected displayTimeZoneOffset: _angular_core.Signal<string>;
1868
+ /**
1869
+ * The value formatted in the VALUE timezone (intent).
1870
+ * Always shows what the time means in the original context.
1871
+ */
1872
+ protected valueInValueTimeZone: _angular_core.Signal<string>;
1873
+ /**
1874
+ * The value formatted in the DISPLAY timezone (user's view).
1875
+ */
1876
+ protected valueInDisplayTimeZone: _angular_core.Signal<string>;
1877
+ /**
1878
+ * The currently displayed value based on which timezone view is active.
1879
+ */
1880
+ protected currentDisplayedValue: _angular_core.Signal<string>;
1881
+ /**
1882
+ * Computed info for timezone display in trigger tooltip and panel.
1883
+ * Returns both display and value timezone info.
1884
+ */
1885
+ protected popoverTimeZoneInfo: _angular_core.Signal<{
1886
+ displayTzName: string;
1887
+ displayTzOffset: string;
1888
+ valueTzName: string;
1889
+ valueTzOffset: string;
1890
+ }>;
1891
+ /** All IANA timezones from the browser */
1892
+ private readonly allTimezones;
1893
+ /**
1894
+ * Filtered timezone options for the select dropdowns.
1895
+ * If timezoneFilter is empty, all timezones are available.
1896
+ * Supports wildcards: 'Europe/*', '*New*', etc.
1897
+ */
1898
+ protected readonly timezoneOptions: _angular_core.Signal<CoarSelectOption<string>[]>;
1899
+ /**
1900
+ * Grouped timezone list for the inline timezone picker.
1901
+ * Groups by continent with sticky headers.
1902
+ */
1903
+ protected readonly groupedTimezoneList: _angular_core.Signal<TimezoneGroup[]>;
1904
+ /**
1905
+ * Extract the city name from a timezone ID.
1906
+ * E.g., 'Europe/Vienna' → 'Vienna', 'America/Argentina/Buenos_Aires' → 'Buenos Aires'
1907
+ */
1908
+ private extractCityName;
1909
+ /**
1910
+ * Get a short abbreviation for a timezone (for the badge).
1911
+ * Uses common abbreviations for well-known cities, otherwise extracts from city name.
1912
+ */
1913
+ private getTimezoneAbbreviation;
1914
+ /**
1915
+ * Format a timezone ID to a short display format.
1916
+ * E.g., 'Europe/Vienna' → 'Vienna (UTC+1)'
1917
+ */
1918
+ protected formatTimezoneShort(tz: string): string;
1919
+ /**
1920
+ * Get a compact UTC offset string for a timezone.
1921
+ * E.g., '+1', '-5', '+5:30'
1922
+ */
1923
+ private getOffsetForTimeZoneCompact;
1924
+ /** Get placeholder text based on date and time format */
1925
+ protected inputPlaceholder: _angular_core.Signal<string>;
1926
+ /** Whether to use 24-hour time format */
1927
+ protected effectiveUse24Hour: _angular_core.Signal<boolean>;
1928
+ /** Extract date portion from value */
1929
+ /**
1930
+ * The value converted to the current working (display) timezone.
1931
+ * Used to extract date/time for the calendar and time picker.
1932
+ */
1933
+ protected valueInWorkingTimeZone: _angular_core.Signal<Temporal.ZonedDateTime | null>;
1934
+ /** Extract date portion from value in working timezone */
1935
+ protected selectedDate: _angular_core.Signal<Temporal.PlainDate | null>;
1936
+ /** Extract time portion from value in working timezone */
1937
+ protected selectedTime: _angular_core.Signal<CoarTimeValue | null>;
1938
+ /** Min date for calendar constraints */
1939
+ protected minDate: _angular_core.Signal<Temporal.PlainDate | null>;
1940
+ /** Max date for calendar constraints */
1941
+ protected maxDate: _angular_core.Signal<Temporal.PlainDate | null>;
1942
+ /**
1943
+ * Effective minimum time constraint for the time picker.
1944
+ * Only applies when the selected date equals the minimum date boundary.
1945
+ */
1946
+ protected effectiveMinTime: _angular_core.Signal<CoarTimeValue | null>;
1947
+ /**
1948
+ * Effective maximum time constraint for the time picker.
1949
+ * Only applies when the selected date equals the maximum date boundary.
1950
+ */
1951
+ protected effectiveMaxTime: _angular_core.Signal<CoarTimeValue | null>;
1952
+ /** Resolved active month (uses value's month or today) */
1953
+ protected resolvedActiveMonth: _angular_core.Signal<Temporal.PlainYearMonth>;
1954
+ /**
1955
+ * The derived instant (UTC) from the current value.
1956
+ * Null if no value is selected.
1957
+ */
1958
+ protected derivedInstant: _angular_core.Signal<Temporal.Instant | null>;
1959
+ protected getValue(): Temporal.ZonedDateTime | null;
1960
+ protected getSelectedPlainDate(): Temporal.PlainDate | null;
1961
+ protected estimatePanelHeight(): number;
1962
+ protected resetValue(): void;
1963
+ protected onPanelClosed(): void;
1964
+ constructor();
1965
+ /**
1966
+ * Handle date selection from calendar.
1967
+ * The date/time is edited in the current working timezone,
1968
+ * but the value timezone is preserved (unless explicitly changed).
1969
+ */
1970
+ protected onDateSelected(date: Temporal.PlainDate): void;
1971
+ /**
1972
+ * Handle time changes from time picker.
1973
+ * Preserves the value timezone (intent).
1974
+ */
1975
+ protected onTimeChanged(time: CoarTimeValue | null): void;
1976
+ /**
1977
+ * Handle display timezone change (viewing lens).
1978
+ * This does NOT change the value - only how it's displayed.
1979
+ */
1980
+ protected onDisplayTimeZoneChanged(newTimeZone: string | null): void;
1981
+ /**
1982
+ * Start the inline timezone picker (replaces side column content).
1983
+ */
1984
+ protected startSelectingDisplayTimezone(): void;
1985
+ /**
1986
+ * Scroll the timezone list to show the currently active timezone.
1987
+ */
1988
+ private scrollToActiveTimezone;
1989
+ /**
1990
+ * Cancel the inline timezone picker.
1991
+ */
1992
+ protected cancelSelectingDisplayTimezone(): void;
1993
+ /**
1994
+ * Close the timezone picker when clicking outside of it (e.g., on the calendar).
1995
+ */
1996
+ protected closeTimezonePickerOnOutsideClick(): void;
1997
+ /**
1998
+ * Select a timezone from the inline timezone picker.
1999
+ */
2000
+ protected selectDisplayTimezone(tz: string): void;
2001
+ /**
2002
+ * Handle search input change in the inline timezone picker.
2003
+ */
2004
+ protected onTimezoneSearchChange(event: Event): void;
2005
+ /**
2006
+ * Toggle between showing value in user timezone vs location timezone.
2007
+ * Used by the indicator icon in the trigger.
2008
+ *
2009
+ * Behavior:
2010
+ * - home (user TZ) → switch to location TZ
2011
+ * - location (event TZ) → switch to user TZ
2012
+ * - world (other TZ) → switch to user TZ
2013
+ */
2014
+ protected toggleTimeZoneView(): void;
2015
+ /**
2016
+ * Start editing the value timezone.
2017
+ */
2018
+ protected startEditingValueTimeZone(): void;
2019
+ /**
2020
+ * Cancel editing the value timezone.
2021
+ */
2022
+ protected cancelEditingValueTimeZone(): void;
2023
+ /**
2024
+ * Change the value timezone (intent).
2025
+ * This is an EXPLICIT action - the value's local time stays the same,
2026
+ * but it's now interpreted in a different timezone.
2027
+ */
2028
+ protected onValueTimeZoneChanged(newTimeZone: string | null): void;
2029
+ /**
2030
+ * Clamps a ZonedDateTime to be within the min/max range.
2031
+ */
2032
+ private clampZonedDateTimeToRange;
2033
+ writeValue(value: Temporal.ZonedDateTime | string | null): void;
2034
+ protected onInputChange(event: Event): void;
2035
+ protected onInputBlur(): void;
2036
+ private formatValue;
2037
+ private parseValueFromInput;
2038
+ private initializeMaskito;
2039
+ /**
2040
+ * Get UTC offset string for a given timezone.
2041
+ */
2042
+ private getOffsetForTimeZone;
2043
+ /**
2044
+ * Format a ZonedDateTime for display.
2045
+ */
2046
+ private formatZonedDateTime;
2047
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarZonedDateTimePickerComponent, never>;
2048
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarZonedDateTimePickerComponent, "coar-zoned-date-time-picker", never, { "timeZone": { "alias": "timeZone"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "use24Hour": { "alias": "use24Hour"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "defaultTime": { "alias": "defaultTime"; "required": false; "isSignal": true; }; "timezoneFilter": { "alias": "timezoneFilter"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; }, never, never, true, never>;
2049
+ }
2050
+
2051
+ type CoarTimePickerSize = 'xs' | 's' | 'm' | 'l';
2052
+ /**
2053
+ * Time picker component with hours, minutes, and optional AM/PM selection.
2054
+ *
2055
+ * Supports both 12-hour and 24-hour formats, with locale-aware auto-detection.
2056
+ * Values wrap around at boundaries (23→00, 59→00 with hour increment).
2057
+ *
2058
+ * @example
2059
+ * ```html
2060
+ * <!-- Basic usage with auto 12h/24h detection -->
2061
+ * <coar-time-picker [(value)]="selectedTime" />
2062
+ *
2063
+ * <!-- Force 24-hour format with 15-minute steps -->
2064
+ * <coar-time-picker
2065
+ * [(value)]="selectedTime"
2066
+ * [use24Hour]="true"
2067
+ * [minuteStep]="15"
2068
+ * />
2069
+ * ```
2070
+ */
2071
+ declare class CoarTimePickerComponent extends CoarControlValueAccessor<CoarTimeValue | null> {
2072
+ private readonly localizationService;
2073
+ /** Current language from localization service (reactive) */
2074
+ private readonly currentLanguage;
2075
+ /** Size variant */
2076
+ size: _angular_core.InputSignal<CoarTimePickerSize>;
2077
+ /** Whether the picker is readonly */
2078
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
2079
+ /** Whether the picker is disabled */
2080
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2081
+ /**
2082
+ * Whether to use 24-hour format.
2083
+ * - true: Always use 24h format (00-23)
2084
+ * - false: Always use 12h format with AM/PM
2085
+ * - 'auto': Detect from locale (default)
2086
+ */
2087
+ use24Hour: _angular_core.InputSignal<boolean | "auto">;
2088
+ /**
2089
+ * Step interval for minute selection.
2090
+ * Minutes will snap to multiples of this value.
2091
+ */
2092
+ minuteStep: _angular_core.InputSignal<1 | 10 | 15 | 5>;
2093
+ /**
2094
+ * Locale identifier for 12h/24h format detection.
2095
+ * Uses global locale service default if not specified.
2096
+ */
2097
+ locale: _angular_core.InputSignal<string | undefined>;
2098
+ /**
2099
+ * Label for screen readers (visually hidden).
2100
+ */
2101
+ ariaLabel: _angular_core.InputSignal<string>;
2102
+ /**
2103
+ * Minimum allowed time (hours and minutes in 24h format).
2104
+ * Used to constrain time selection when on a min date boundary.
2105
+ */
2106
+ minTime: _angular_core.InputSignal<CoarTimeValue | null>;
2107
+ /**
2108
+ * Maximum allowed time (hours and minutes in 24h format).
2109
+ * Used to constrain time selection when on a max date boundary.
2110
+ */
2111
+ maxTime: _angular_core.InputSignal<CoarTimeValue | null>;
2112
+ /** Current time value (two-way bindable with [(value)]) */
2113
+ value: _angular_core.ModelSignal<CoarTimeValue | null>;
2114
+ /** Internal hours value (0-23) */
2115
+ protected hours: _angular_core.WritableSignal<number>;
2116
+ /** Internal minutes value (0-59) */
2117
+ protected minutes: _angular_core.WritableSignal<number>;
2118
+ /** AM/PM period for 12-hour mode */
2119
+ protected period: _angular_core.WritableSignal<CoarTimePeriod>;
2120
+ /** Effective locale for 12h/24h detection */
2121
+ protected effectiveLocale: _angular_core.Signal<string>;
2122
+ /** Whether to display in 12-hour format */
2123
+ protected is12HourFormat: _angular_core.Signal<boolean>;
2124
+ /** Display hours value (1-12 for 12h mode, 0-23 for 24h mode) */
2125
+ protected displayHours: _angular_core.Signal<number>;
2126
+ /** Display minutes (always 0-59, padded) */
2127
+ protected displayMinutes: _angular_core.Signal<number>;
2128
+ /** Minimum hours value for display */
2129
+ protected minHours: _angular_core.Signal<1 | 0>;
2130
+ /** Maximum hours value for display */
2131
+ protected maxHours: _angular_core.Signal<12 | 23>;
2132
+ /** Whether the picker is disabled (input or CVA) */
2133
+ protected isDisabled: _angular_core.Signal<boolean>;
2134
+ /** Convert time to total minutes for comparison */
2135
+ private timeToMinutes;
2136
+ /** Whether increment hours button is disabled (would exceed max) */
2137
+ protected isIncrementHoursDisabled: _angular_core.Signal<boolean>;
2138
+ /** Whether decrement hours button is disabled (would go below min) */
2139
+ protected isDecrementHoursDisabled: _angular_core.Signal<boolean>;
2140
+ /** Whether increment minutes button is disabled */
2141
+ protected isIncrementMinutesDisabled: _angular_core.Signal<boolean>;
2142
+ /** Whether decrement minutes button is disabled */
2143
+ protected isDecrementMinutesDisabled: _angular_core.Signal<boolean>;
2144
+ /** Whether AM period is disabled (min time is in PM) */
2145
+ protected isAmDisabled: _angular_core.Signal<boolean>;
2146
+ /** Whether PM period is disabled (max time is before noon) */
2147
+ protected isPmDisabled: _angular_core.Signal<boolean>;
2148
+ constructor();
2149
+ /** Increment hours by 1 */
2150
+ incrementHours(): void;
2151
+ /** Decrement hours by 1 */
2152
+ decrementHours(): void;
2153
+ /** Increment minutes by step */
2154
+ incrementMinutes(): void;
2155
+ /** Decrement minutes by step */
2156
+ decrementMinutes(): void;
2157
+ /** Toggle between AM and PM */
2158
+ togglePeriod(): void;
2159
+ /** Set specific period (AM or PM) */
2160
+ setPeriod(period: CoarTimePeriod): void;
2161
+ /** Handle keyboard events on hours spinner */
2162
+ onHoursKeydown(event: KeyboardEvent): void;
2163
+ /** Handle keyboard events on minutes spinner */
2164
+ onMinutesKeydown(event: KeyboardEvent): void;
2165
+ /** Handle keyboard events on period selector */
2166
+ onPeriodKeydown(event: KeyboardEvent): void;
2167
+ writeValue(value: CoarTimeValue | null): void;
2168
+ /** Emit the current value */
2169
+ private emitValue;
2170
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTimePickerComponent, never>;
2171
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTimePickerComponent, "coar-time-picker", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "use24Hour": { "alias": "use24Hour"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
2172
+ }
2173
+
2174
+ /**
2175
+ * Represents a single month view in the scrollable calendar.
2176
+ */
2177
+ interface CoarCalendarMonth {
2178
+ readonly yearMonth: Temporal.PlainYearMonth;
2179
+ readonly monthName: string;
2180
+ readonly year: number;
2181
+ readonly days: CoarCalendarDay[];
2182
+ readonly weekNumbers: number[];
2183
+ }
2184
+ /**
2185
+ * Represents a single day cell in the calendar.
2186
+ */
2187
+ interface CoarCalendarDay {
2188
+ readonly date: Temporal.PlainDate;
2189
+ readonly day: number;
2190
+ readonly isOutsideMonth: boolean;
2191
+ readonly isToday: boolean;
2192
+ readonly isSelected: boolean;
2193
+ readonly isFocused: boolean;
2194
+ readonly isDisabled: boolean;
2195
+ readonly isWeekend: boolean;
2196
+ readonly markers: CoarDateMarker[];
2197
+ readonly markerCssClass: string;
2198
+ readonly markerTooltip: string | null;
2199
+ }
2200
+ /**
2201
+ * Scrollable calendar component displaying multiple months vertically.
2202
+ *
2203
+ * Uses CSS `content-visibility: auto` for virtualization to optimize performance
2204
+ * when displaying many months. The calendar scrolls vertically and syncs with
2205
+ * an external month list for navigation.
2206
+ *
2207
+ * @example
2208
+ * ```html
2209
+ * <coar-scrollable-calendar
2210
+ * [(value)]="selectedDate"
2211
+ * [(activeMonth)]="visibleMonth"
2212
+ * [min]="minDate"
2213
+ * [max]="maxDate"
2214
+ * />
2215
+ * ```
2216
+ */
2217
+ declare class CoarScrollableCalendarComponent {
2218
+ private readonly localizationService;
2219
+ private readonly localizationDataStore;
2220
+ private readonly timeZoneService;
2221
+ private readonly ngZone;
2222
+ private readonly destroyRef;
2223
+ /** Current language from localization service (reactive) */
2224
+ private readonly currentLanguage;
2225
+ /** Reference to the scroll container */
2226
+ protected scrollContainerRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
2227
+ /** Reference to the scrollbar directive */
2228
+ protected scrollbarDirective: _angular_core.Signal<CoarScrollbarDirective | undefined>;
2229
+ /** Current selected date (two-way bindable with [(value)]) */
2230
+ value: _angular_core.ModelSignal<Temporal.PlainDate | null>;
2231
+ /** Currently visible/active month (two-way bindable, syncs with scroll position) */
2232
+ activeMonth: _angular_core.ModelSignal<Temporal.PlainYearMonth>;
2233
+ /** Minimum selectable date */
2234
+ min: _angular_core.InputSignal<Temporal.PlainDate | null>;
2235
+ /** Maximum selectable date */
2236
+ max: _angular_core.InputSignal<Temporal.PlainDate | null>;
2237
+ /**
2238
+ * Locale identifier for date formatting (e.g., 'de-AT', 'en-US').
2239
+ * Uses global locale service default if not specified.
2240
+ */
2241
+ locale: _angular_core.InputSignal<string | undefined>;
2242
+ /** Date format configuration (pattern and first day of week) */
2243
+ dateFormatConfig: _angular_core.InputSignal<DateFormatConfig | undefined>;
2244
+ /** Whether to show week numbers */
2245
+ showWeekNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
2246
+ /** Whether to highlight weekend days (Saturday/Sunday) with a subtle background */
2247
+ highlightWeekends: _angular_core.InputSignalWithTransform<boolean, unknown>;
2248
+ /** Date markers for highlighting special dates (holidays, events, etc.) */
2249
+ markers: _angular_core.InputSignal<CoarDateMarker[]>;
2250
+ /**
2251
+ * Number of months to display before and after the current year.
2252
+ * Default: 12 months before, 12 months after (2 years total + current year).
2253
+ * @deprecated Use infinite scroll instead - this input is kept for backwards compatibility
2254
+ */
2255
+ monthRange: _angular_core.InputSignal<{
2256
+ before: number;
2257
+ after: number;
2258
+ }>;
2259
+ /**
2260
+ * Maximum number of months to keep in the DOM at once.
2261
+ * Default: 25 (roughly 2 years). Lower values improve performance but may cause
2262
+ * more frequent loading when scrolling quickly.
2263
+ */
2264
+ maxMonthsInDom: _angular_core.InputSignal<number>;
2265
+ /**
2266
+ * Number of months to load when reaching the edge of the current range.
2267
+ * Default: 6 (half a year at a time).
2268
+ */
2269
+ monthsToLoad: _angular_core.InputSignal<number>;
2270
+ /** Emitted when a date is clicked */
2271
+ dateSelected: _angular_core.OutputEmitterRef<Temporal.PlainDate>;
2272
+ /** Focused date for keyboard navigation */
2273
+ protected readonly focusedDate: _angular_core.WritableSignal<Temporal.PlainDate | null>;
2274
+ /**
2275
+ * Today's date based on the configured timezone.
2276
+ * Reactive: updates when timezone changes.
2277
+ */
2278
+ protected readonly today: _angular_core.Signal<Temporal.PlainDate>;
2279
+ /** Flag to prevent scroll events while programmatically scrolling */
2280
+ private isScrollingProgrammatically;
2281
+ /** Flag to track when activeMonth is updated from scroll handler (prevents effect feedback loop) */
2282
+ private isUpdatingFromScroll;
2283
+ /** Flag to prevent multiple concurrent infinite scroll loads */
2284
+ private isLoadingMonths;
2285
+ /** Becomes true once the actual scroll viewport element is available (OverlayScrollbars initialized). */
2286
+ private readonly scrollViewportReady;
2287
+ /** Becomes true once the calendar is properly scrolled to the active month. Prevents visible flickering. */
2288
+ protected readonly isScrollPositioned: _angular_core.WritableSignal<boolean>;
2289
+ /** The earliest month currently in the DOM */
2290
+ private earliestMonth;
2291
+ /** The latest month currently in the DOM */
2292
+ private latestMonth;
2293
+ /** Signal-based months array for infinite scroll */
2294
+ protected months: _angular_core.WritableSignal<CoarCalendarMonth[]>;
2295
+ /**
2296
+ * Minimum month boundary derived from min date input.
2297
+ * Infinite scroll will not load months before this.
2298
+ */
2299
+ private minMonth;
2300
+ /**
2301
+ * Maximum month boundary derived from max date input.
2302
+ * Infinite scroll will not load months after this.
2303
+ */
2304
+ private maxMonth;
2305
+ /**
2306
+ * Effective locale for calendar display.
2307
+ * Priority: input locale > locale service language > browser locale
2308
+ */
2309
+ protected effectiveLocale: _angular_core.Signal<string>;
2310
+ protected effectiveDateFormat: _angular_core.Signal<DateFormatConfig>;
2311
+ protected firstDayOfWeek: _angular_core.Signal<1 | 7>;
2312
+ protected daysOfWeek: _angular_core.Signal<string[]>;
2313
+ /**
2314
+ * Weekday headers with weekend flag for styling.
2315
+ * Returns array of { name, isWeekend } for each day.
2316
+ */
2317
+ protected weekdayHeaders: _angular_core.Signal<{
2318
+ name: string;
2319
+ isWeekend: boolean;
2320
+ }[]>;
2321
+ /** Flag to track pending scroll after month loading */
2322
+ private pendingScrollTarget;
2323
+ /** Track previous marker/value/min/max/focusedDate/locale state to avoid unnecessary rebuilds */
2324
+ private lastMarkersLength;
2325
+ private lastValueString;
2326
+ private lastHighlightWeekends;
2327
+ private lastMinString;
2328
+ private lastMaxString;
2329
+ private lastFocusedDateString;
2330
+ private lastLocale;
2331
+ private readonly monthScrollTopInsetPx;
2332
+ constructor();
2333
+ /**
2334
+ * Constrains the months array to respect min/max boundaries.
2335
+ * Removes months outside the allowed range and updates boundary signals.
2336
+ */
2337
+ private constrainMonthsToRange;
2338
+ /**
2339
+ * Rebuilds all months to update day states (selected, markers, etc.)
2340
+ */
2341
+ private rebuildMonths;
2342
+ /**
2343
+ * Scrolls to a month, loading it first if necessary.
2344
+ */
2345
+ private scrollToMonthWithLoad;
2346
+ /**
2347
+ * Loads months to reach a target month that's outside the current range.
2348
+ */
2349
+ private loadMonthsToReach;
2350
+ /**
2351
+ * Sets up scroll listener on the OverlayScrollbars viewport element.
2352
+ * Native scroll events don't fire on the original element when using OverlayScrollbars.
2353
+ */
2354
+ private setupScrollListener;
2355
+ private getScrollViewportElement;
2356
+ private ensureMonthAlignedInViewport;
2357
+ private scrollMonthElementToTop;
2358
+ /**
2359
+ * Initializes the months array with an initial range around today.
2360
+ * Respects min/max date constraints when setting boundaries.
2361
+ */
2362
+ private initializeMonths;
2363
+ /**
2364
+ * Checks if we need to load more months based on scroll position.
2365
+ * Respects min/max constraints - won't load beyond boundaries.
2366
+ */
2367
+ private checkInfiniteScroll;
2368
+ /**
2369
+ * Loads earlier months and maintains scroll position.
2370
+ * Respects min date constraint - won't load beyond minMonth.
2371
+ */
2372
+ private loadEarlierMonths;
2373
+ /**
2374
+ * Loads later months.
2375
+ * Respects max date constraint - won't load beyond maxMonth.
2376
+ */
2377
+ private loadLaterMonths;
2378
+ /**
2379
+ * Loads earlier months synchronously (for targeted navigation).
2380
+ * Does not maintain scroll position - caller handles scrolling.
2381
+ * Respects min date constraint.
2382
+ */
2383
+ private loadEarlierMonthsSync;
2384
+ /**
2385
+ * Loads later months synchronously (for targeted navigation).
2386
+ * Respects max date constraint.
2387
+ */
2388
+ private loadLaterMonthsSync;
2389
+ /**
2390
+ * Checks if there's a pending scroll target and scrolls to it if available.
2391
+ */
2392
+ private checkPendingScroll;
2393
+ /**
2394
+ * Trims months from the end of the array to stay within maxMonthsInDom.
2395
+ */
2396
+ private trimMonthsFromEnd;
2397
+ /**
2398
+ * Trims months from the beginning of the array to stay within maxMonthsInDom.
2399
+ */
2400
+ private trimMonthsFromBeginning;
2401
+ /**
2402
+ * Scrolls to a specific month in the calendar.
2403
+ *
2404
+ * @param yearMonth - The month to scroll to
2405
+ * @param smooth - Whether to use smooth scrolling animation
2406
+ */
2407
+ scrollToMonth(yearMonth: Temporal.PlainYearMonth, smooth?: boolean): void;
2408
+ /** Handle scroll events to update active month */
2409
+ protected onScroll(): void;
2410
+ /** Handle keyboard navigation */
2411
+ protected onKeydown(event: KeyboardEvent): void;
2412
+ /** Handle date selection */
2413
+ protected selectDate(date: Temporal.PlainDate): void;
2414
+ /**
2415
+ * Moves keyboard focus by the given amount and unit.
2416
+ * Clamps to min/max, auto-scrolls to keep the focused date visible.
2417
+ */
2418
+ private moveFocus;
2419
+ /**
2420
+ * Scrolls to ensure the focused date's month is visible, then focuses the button element.
2421
+ */
2422
+ private scrollToFocusedDate;
2423
+ private focusDateButton;
2424
+ private focusDateButtonAfterDelay;
2425
+ /** Generate a unique element ID for a month */
2426
+ protected getMonthElementId(yearMonth: Temporal.PlainYearMonth): string;
2427
+ /** Check if a date is disabled (outside min/max range) */
2428
+ protected isDateDisabled(date: Temporal.PlainDate): boolean;
2429
+ /** Create a calendar month object */
2430
+ private createCalendarMonth;
2431
+ /** Create a calendar day object */
2432
+ private createCalendarDay;
2433
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarScrollableCalendarComponent, never>;
2434
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarScrollableCalendarComponent, "coar-scrollable-calendar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "activeMonth": { "alias": "activeMonth"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "dateFormatConfig": { "alias": "dateFormatConfig"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "highlightWeekends": { "alias": "highlightWeekends"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; "monthRange": { "alias": "monthRange"; "required": false; "isSignal": true; }; "maxMonthsInDom": { "alias": "maxMonthsInDom"; "required": false; "isSignal": true; }; "monthsToLoad": { "alias": "monthsToLoad"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "activeMonth": "activeMonthChange"; "dateSelected": "dateSelected"; }, never, never, true, never>;
2435
+ }
2436
+
2437
+ declare class CoarMiniCalendarComponent {
2438
+ private readonly localizationService;
2439
+ private readonly localizationDataStore;
2440
+ private readonly timeZoneService;
2441
+ /** Current language from localization service (reactive) */
2442
+ private readonly currentLanguage;
2443
+ /** Current selected date (two-way bindable with [(value)]) */
2444
+ value: _angular_core.ModelSignal<Temporal.PlainDate | null>;
2445
+ /** Minimum selectable date */
2446
+ min: _angular_core.InputSignal<Temporal.PlainDate | null>;
2447
+ /** Maximum selectable date */
2448
+ max: _angular_core.InputSignal<Temporal.PlainDate | null>;
2449
+ /**
2450
+ * Locale identifier for date formatting (e.g., 'de-AT', 'en-US').
2451
+ * Uses global locale service default if not specified.
2452
+ */
2453
+ locale: _angular_core.InputSignal<string | undefined>;
2454
+ /** Date format configuration (pattern and first day of week) */
2455
+ dateFormatConfig: _angular_core.InputSignal<DateFormatConfig | undefined>;
2456
+ /** Whether to show a "Today" button */
2457
+ showTodayButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
2458
+ /** Whether to show week numbers */
2459
+ showWeekNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
2460
+ /** Whether to highlight weekend days (Saturday/Sunday) with a subtle background */
2461
+ highlightWeekends: _angular_core.InputSignalWithTransform<boolean, unknown>;
2462
+ /** Date markers for highlighting special dates (holidays, events, etc.) */
2463
+ markers: _angular_core.InputSignal<CoarDateMarker[]>;
2464
+ /** Maximum number of lines shown in the marker popover (including "+N" line). */
2465
+ protected readonly markerPopoverMaxLines = 5;
2466
+ /** Visible markers before switching to "+N other events". */
2467
+ protected readonly markerPopoverVisibleMarkers = 4;
2468
+ /**
2469
+ * Today's date based on the configured timezone.
2470
+ * Reactive: updates when timezone changes.
2471
+ */
2472
+ protected readonly today: _angular_core.Signal<Temporal.PlainDate>;
2473
+ /** Currently viewed month/year in the calendar */
2474
+ protected viewDate: _angular_core.WritableSignal<Temporal.PlainYearMonth>;
2475
+ /** Focused date in the calendar (for keyboard navigation) */
2476
+ protected focusedDate: _angular_core.WritableSignal<Temporal.PlainDate | null>;
2477
+ /**
2478
+ * Effective locale for calendar month/year display.
2479
+ * Priority: input locale > locale service language > browser locale
2480
+ */
2481
+ protected effectiveLocale: _angular_core.Signal<string>;
2482
+ protected effectiveDateFormat: _angular_core.Signal<DateFormatConfig>;
2483
+ protected firstDayOfWeek: _angular_core.Signal<1 | 7>;
2484
+ protected daysOfWeek: _angular_core.Signal<string[]>;
2485
+ protected calendarDays: _angular_core.Signal<CalendarDay[]>;
2486
+ protected viewMonth: _angular_core.Signal<string>;
2487
+ protected viewYear: _angular_core.Signal<number>;
2488
+ protected weekNumbers: _angular_core.Signal<number[]>;
2489
+ constructor();
2490
+ previousMonth(): void;
2491
+ nextMonth(): void;
2492
+ previousYear(): void;
2493
+ nextYear(): void;
2494
+ goToToday(): void;
2495
+ selectDate(date: Temporal.PlainDate): void;
2496
+ protected onKeydown(event: KeyboardEvent): void;
2497
+ protected getVisibleMarkers(markers: CoarDateMarker[]): CoarDateMarker[];
2498
+ protected getHiddenMarkerCount(markers: CoarDateMarker[]): number;
2499
+ private getMarkersForDate;
2500
+ private isDateDisabled;
2501
+ private moveFocus;
2502
+ private createCalendarDay;
2503
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMiniCalendarComponent, never>;
2504
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarMiniCalendarComponent, "coar-mini-calendar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "dateFormatConfig": { "alias": "dateFormatConfig"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showWeekNumbers": { "alias": "showWeekNumbers"; "required": false; "isSignal": true; }; "highlightWeekends": { "alias": "highlightWeekends"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
2505
+ }
2506
+ interface CalendarDay {
2507
+ date: Temporal.PlainDate;
2508
+ day: number;
2509
+ isOutsideMonth: boolean;
2510
+ isToday: boolean;
2511
+ isSelected: boolean;
2512
+ isFocused: boolean;
2513
+ isDisabled: boolean;
2514
+ isWeekend: boolean;
2515
+ markers: CoarDateMarker[];
2516
+ markerCssClass: string | null;
2517
+ }
2518
+
2519
+ /**
2520
+ * Month list component for date/time picker navigation.
2521
+ *
2522
+ * Displays a vertical list of month names with a year stepper at the top.
2523
+ * The list height adapts to its container and becomes scrollable if all
2524
+ * 12 months don't fit.
2525
+ *
2526
+ * @example
2527
+ * ```html
2528
+ * <coar-month-list
2529
+ * [(activeMonth)]="visibleMonth"
2530
+ * [minYear]="1920"
2531
+ * [maxYear]="2100"
2532
+ * (monthSelected)="onMonthSelected($event)"
2533
+ * />
2534
+ * ```
2535
+ */
2536
+ declare class CoarMonthListComponent {
2537
+ private readonly localizationService;
2538
+ private readonly localizationDataStore;
2539
+ /** Current language from localization service (reactive) */
2540
+ private readonly currentLanguage;
2541
+ /** Reference to the months container */
2542
+ private monthsContainerRef;
2543
+ /** Reference to the scrollbar directive for programmatic scrolling */
2544
+ private scrollbarDirective;
2545
+ /** Currently active/visible month (two-way bindable) */
2546
+ activeMonth: _angular_core.ModelSignal<Temporal.PlainYearMonth>;
2547
+ /**
2548
+ * Locale identifier for month name formatting.
2549
+ * Uses global locale service default if not specified.
2550
+ */
2551
+ locale: _angular_core.InputSignal<string | undefined>;
2552
+ /**
2553
+ * Minimum year that can be selected.
2554
+ * Default: current year - 100
2555
+ */
2556
+ minYear: _angular_core.InputSignal<number>;
2557
+ /**
2558
+ * Maximum year that can be selected.
2559
+ * Default: current year + 50
2560
+ */
2561
+ maxYear: _angular_core.InputSignal<number>;
2562
+ /** Emitted when a month is selected from the list */
2563
+ monthSelected: _angular_core.OutputEmitterRef<Temporal.PlainYearMonth>;
2564
+ /** Emitted when the year changes via stepper */
2565
+ yearChanged: _angular_core.OutputEmitterRef<number>;
2566
+ constructor();
2567
+ /** Effective locale for month name formatting */
2568
+ protected effectiveLocale: _angular_core.Signal<string>;
2569
+ /** Current year from activeMonth */
2570
+ protected currentYear: _angular_core.Signal<number>;
2571
+ /** Current month number from activeMonth (1-12) */
2572
+ protected currentMonthNumber: _angular_core.Signal<number>;
2573
+ /** Whether previous year button is disabled */
2574
+ protected isPrevYearDisabled: _angular_core.Signal<boolean>;
2575
+ /** Whether next year button is disabled */
2576
+ protected isNextYearDisabled: _angular_core.Signal<boolean>;
2577
+ /** List of month items for display */
2578
+ protected monthItems: _angular_core.Signal<{
2579
+ month: number;
2580
+ name: string;
2581
+ isActive: boolean;
2582
+ yearMonth: Temporal.PlainYearMonth;
2583
+ }[]>;
2584
+ /** Navigate to previous year */
2585
+ previousYear(): void;
2586
+ /** Navigate to next year */
2587
+ nextYear(): void;
2588
+ /** Select a specific month */
2589
+ selectMonth(yearMonth: Temporal.PlainYearMonth): void;
2590
+ /**
2591
+ * Scrolls the month list to make the active month visible.
2592
+ * Works with OverlayScrollbars by scrolling its viewport element directly.
2593
+ */
2594
+ private scrollToActiveMonth;
2595
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMonthListComponent, never>;
2596
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarMonthListComponent, "coar-month-list", never, { "activeMonth": { "alias": "activeMonth"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "minYear": { "alias": "minYear"; "required": false; "isSignal": true; }; "maxYear": { "alias": "maxYear"; "required": false; "isSignal": true; }; }, { "activeMonth": "activeMonthChange"; "monthSelected": "monthSelected"; "yearChanged": "yearChanged"; }, never, never, true, never>;
2597
+ }
2598
+
2599
+ declare function coarDetectDateFormatPatternFromIntl(locale: string): DateFormatConfig['pattern'] | null;
2600
+ declare function coarGetDateSeparatorForPattern(pattern: DateFormatConfig['pattern']): '.' | '/' | '-';
2601
+ declare function coarGetLocalizedWeekdays(locale: string, firstDayOfWeek: 1 | 7): string[];
2602
+ declare function coarFormatPlainDate(date: Temporal.PlainDate, pattern: DateFormatConfig['pattern']): string;
2603
+ declare function coarParsePlainDateFromInput(text: string, pattern: DateFormatConfig['pattern'], constraints?: {
2604
+ min?: Temporal.PlainDate | null;
2605
+ max?: Temporal.PlainDate | null;
2606
+ }): Temporal.PlainDate | null;
2607
+ declare function coarTemporalPlainDateToDate(date: Temporal.PlainDate): Date;
2608
+ declare function coarCalculateIsoWeekNumber(date: Temporal.PlainDate): number;
2609
+ declare function coarClampPlainDate(date: Temporal.PlainDate, constraints?: {
2610
+ min?: Temporal.PlainDate | null;
2611
+ max?: Temporal.PlainDate | null;
2612
+ }): Temporal.PlainDate;
2613
+ interface CoarCalendarGridCell {
2614
+ readonly date: Temporal.PlainDate;
2615
+ readonly isOutsideMonth: boolean;
2616
+ }
2617
+ /**
2618
+ * Returns a fixed 6x7 calendar grid (42 cells) for the given month.
2619
+ * Includes leading/trailing days from adjacent months to fill the grid.
2620
+ */
2621
+ declare function coarGetCalendarGridDates(viewMonth: Temporal.PlainYearMonth, firstDayOfWeek: 1 | 7): CoarCalendarGridCell[];
2622
+
2623
+ /**
2624
+ * Shared time formatting configuration.
2625
+ *
2626
+ * Note: This config is intentionally small so it can be used by multiple UI components
2627
+ * (time picker, date-time picker, etc.) without pulling in Angular-only code.
2628
+ */
2629
+ interface TimeFormatConfig {
2630
+ /**
2631
+ * Whether to use 24-hour format (true) or 12-hour format with AM/PM (false).
2632
+ * When set to 'auto', the format is detected from the user's locale.
2633
+ */
2634
+ readonly use24Hour: boolean | 'auto';
2635
+ /**
2636
+ * Step interval for minute selection.
2637
+ * For example, 5 means minutes can only be 0, 5, 10, 15, etc.
2638
+ */
2639
+ readonly minuteStep: 1 | 5 | 10 | 15;
2640
+ }
2641
+ /**
2642
+ * Default time format configuration.
2643
+ */
2644
+ declare const COAR_DEFAULT_TIME_FORMAT: TimeFormatConfig;
2645
+
2646
+ type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'danger' | 'ghost';
2647
+ type ButtonSize = 'xs' | 's' | 'm' | 'l';
2648
+ declare class CoarButtonComponent {
2649
+ /** Button visual variant */
2650
+ variant: _angular_core.InputSignal<ButtonVariant>;
2651
+ /** Button size */
2652
+ size: _angular_core.InputSignal<ButtonSize>;
2653
+ /** Whether the button is disabled */
2654
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2655
+ /** Whether the button is in loading state */
2656
+ loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
2657
+ /** Button type attribute */
2658
+ type: _angular_core.InputSignal<"button" | "reset" | "submit">;
2659
+ /** Icon to display before the label */
2660
+ iconStart: _angular_core.InputSignal<string | undefined>;
2661
+ /** Icon to display after the label */
2662
+ iconEnd: _angular_core.InputSignal<string | undefined>;
2663
+ /** Whether the button should take full width */
2664
+ fullWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
2665
+ /** Optional aria-label applied to the underlying <button> element */
2666
+ ariaLabel: _angular_core.InputSignal<string>;
2667
+ /** Emitted when the button is clicked (not emitted when disabled or loading) */
2668
+ clicked: _angular_core.OutputEmitterRef<MouseEvent>;
2669
+ /** Maps button size to appropriate icon size */
2670
+ protected readonly iconSize: _angular_core.Signal<CoarIconSize>;
2671
+ protected onClick(event: MouseEvent): void;
2672
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarButtonComponent, never>;
2673
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarButtonComponent, "coar-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "iconStart": { "alias": "iconStart"; "required": false; "isSignal": true; }; "iconEnd": { "alias": "iconEnd"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
2674
+ }
2675
+
2676
+ type BadgeVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';
2677
+ type BadgeSize = 'xs' | 's' | 'm' | 'l' | 'xl' | 'auto';
2678
+ declare class CoarBadgeComponent {
2679
+ /** Content to display in the badge (number, text, or icon) */
2680
+ content: _angular_core.InputSignal<string | number>;
2681
+ /** Badge visual variant */
2682
+ variant: _angular_core.InputSignal<BadgeVariant>;
2683
+ /** Badge size */
2684
+ size: _angular_core.InputSignal<BadgeSize>;
2685
+ /** Whether the badge should pulse/animate (for notifications) */
2686
+ pulse: _angular_core.InputSignalWithTransform<boolean, unknown>;
2687
+ /** Whether to show as a dot without content */
2688
+ dot: _angular_core.InputSignalWithTransform<boolean, unknown>;
2689
+ /** Maximum number to display (shows "99+" if exceeded) */
2690
+ max: _angular_core.InputSignal<number | null>;
2691
+ /** Whether to show a border around the badge */
2692
+ bordered: _angular_core.InputSignalWithTransform<boolean, unknown>;
2693
+ /** Computed display value */
2694
+ protected displayValue: _angular_core.Signal<string>;
2695
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarBadgeComponent, never>;
2696
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarBadgeComponent, "coar-badge", never, { "content": { "alias": "content"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "pulse": { "alias": "pulse"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2697
+ }
2698
+
2699
+ /**
2700
+ * Tag semantic variants - mirrors CardVariant for visual consistency.
2701
+ * Tags are the "little brother" of Cards with the same variant system.
2702
+ */
2703
+ type TagVariant = 'neutral' | 'success' | 'warning' | 'error' | 'info' | 'accent';
2704
+ /**
2705
+ * Tag size variants.
2706
+ * - s: Compact tags for dense UIs (10px font)
2707
+ * - m: Default size (12px font)
2708
+ * - l: Larger tags for emphasis (14px font)
2709
+ */
2710
+ type TagSize = 's' | 'm' | 'l';
2711
+ /**
2712
+ * CoarTagComponent
2713
+ *
2714
+ * A compact label component for categorizing, labeling, or marking content.
2715
+ * Shares the same variant system as CoarCard for visual consistency.
2716
+ *
2717
+ * Unlike badges (pill-shaped, for counts/notifications), tags use
2718
+ * slight rounding and support interactive features like closing.
2719
+ *
2720
+ * @example
2721
+ * ```html
2722
+ * <coar-tag>Default</coar-tag>
2723
+ * <coar-tag variant="success">Published</coar-tag>
2724
+ * <coar-tag variant="warning" closable (closed)="onRemove()">Draft</coar-tag>
2725
+ * ```
2726
+ */
2727
+ declare class CoarTagComponent {
2728
+ /**
2729
+ * Adds a box-shadow for elevation/depth.
2730
+ * Use as boolean attribute: `<coar-tag elevated>` or `[elevated]="true"`
2731
+ */
2732
+ elevated: _angular_core.InputSignalWithTransform<boolean, unknown>;
2733
+ /**
2734
+ * Removes the border from the tag, leaving only background color.
2735
+ * By default (false), tags have a visible border matching their variant.
2736
+ * Use as boolean attribute: `<coar-tag borderless>` or `[borderless]="true"`
2737
+ */
2738
+ borderless: _angular_core.InputSignalWithTransform<boolean, unknown>;
2739
+ /** Tag semantic variant - matches Card variants */
2740
+ variant: _angular_core.InputSignal<TagVariant>;
2741
+ /** Tag size */
2742
+ size: _angular_core.InputSignal<TagSize>;
2743
+ /** Whether the tag can be closed/removed */
2744
+ closable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2745
+ /** Emitted when the close button is clicked */
2746
+ closed: _angular_core.OutputEmitterRef<void>;
2747
+ /** Handle close button click */
2748
+ protected onClose(event: MouseEvent): void;
2749
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTagComponent, never>;
2750
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTagComponent, "coar-tag", never, { "elevated": { "alias": "elevated"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
2751
+ }
2752
+
2753
+ type CardVariant = 'neutral' | 'outlined' | 'success' | 'warning' | 'error' | 'info' | 'accent';
2754
+ type CardPadding = 'none' | 's' | 'm' | 'l';
2755
+ declare class CoarCardComponent {
2756
+ /**
2757
+ * Adds a box-shadow for elevation/depth.
2758
+ * Use as boolean attribute: `<coar-card elevated>` or `[elevated]="true"`
2759
+ */
2760
+ elevated: _angular_core.InputSignalWithTransform<boolean, unknown>;
2761
+ /**
2762
+ * Removes the border from the card, leaving only background color.
2763
+ * By default (false), cards have a visible border matching their variant.
2764
+ * Use as boolean attribute: `<coar-card borderless>` or `[borderless]="true"`
2765
+ */
2766
+ borderless: _angular_core.InputSignalWithTransform<boolean, unknown>;
2767
+ /** Card semantic variant */
2768
+ variant: _angular_core.InputSignal<CardVariant>;
2769
+ /** Card padding size */
2770
+ padding: _angular_core.InputSignal<CardPadding>;
2771
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarCardComponent, never>;
2772
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarCardComponent, "coar-card", never, { "elevated": { "alias": "elevated"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["[coar-card-header]", "*", "[coar-card-footer]", "[coar-card-inset]"], true, never>;
2773
+ }
2774
+
2775
+ type NoteVariant = 'neutral' | 'success' | 'warning' | 'error' | 'info' | 'accent';
2776
+ type NotePadding = 's' | 'm' | 'l';
2777
+ /**
2778
+ * A callout/note component for highlighting information.
2779
+ *
2780
+ * Features a colored left border and subtle background.
2781
+ * Use for tips, warnings, important information, or behavioral notes.
2782
+ *
2783
+ * @example
2784
+ * ```html
2785
+ * <coar-note variant="info">
2786
+ * <strong>Note:</strong> This is important information.
2787
+ * </coar-note>
2788
+ *
2789
+ * <coar-note variant="warning" padding="l">
2790
+ * <h4>Warning</h4>
2791
+ * <p>Be careful with this action.</p>
2792
+ * </coar-note>
2793
+ * ```
2794
+ */
2795
+ declare class CoarNoteComponent {
2796
+ /**
2797
+ * Note semantic variant.
2798
+ * Determines the left border color and background tint.
2799
+ * @default 'neutral'
2800
+ */
2801
+ variant: _angular_core.InputSignal<NoteVariant>;
2802
+ /**
2803
+ * Note padding size.
2804
+ * @default 'm'
2805
+ */
2806
+ padding: _angular_core.InputSignal<NotePadding>;
2807
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarNoteComponent, never>;
2808
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarNoteComponent, "coar-note", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2809
+ }
2810
+
2811
+ /**
2812
+ * Content alignment options for the divider.
2813
+ * - 'center': Content is centered with lines on both sides (default)
2814
+ * - 'left': Content is aligned left with line on the right
2815
+ * - 'right': Content is aligned right with line on the left
2816
+ */
2817
+ type DividerAlign = 'left' | 'center' | 'right';
2818
+ /**
2819
+ * Visual style variants for the divider line.
2820
+ * - 'subtle': Light, unobtrusive divider (default)
2821
+ * - 'strong': More prominent divider
2822
+ */
2823
+ type DividerVariant = 'subtle' | 'strong';
2824
+ /**
2825
+ * A flexible divider component for visually separating content sections.
2826
+ *
2827
+ * Supports optional content (text, icons, etc.) via ng-content that can be
2828
+ * aligned left, center, or right. When content is present, the divider line
2829
+ * splits around it.
2830
+ *
2831
+ * @example
2832
+ * <!-- Simple divider -->
2833
+ * <coar-divider />
2834
+ *
2835
+ * @example
2836
+ * <!-- Divider with centered text -->
2837
+ * <coar-divider>OR</coar-divider>
2838
+ *
2839
+ * @example
2840
+ * <!-- Divider with left-aligned content -->
2841
+ * <coar-divider align="left">Section Title</coar-divider>
2842
+ */
2843
+ declare class CoarDividerComponent {
2844
+ /** Content alignment when ng-content is provided */
2845
+ align: _angular_core.InputSignal<DividerAlign>;
2846
+ /** Visual style variant */
2847
+ variant: _angular_core.InputSignal<DividerVariant>;
2848
+ /** Width of the divider as a percentage (0-100) */
2849
+ width: _angular_core.InputSignal<number>;
2850
+ /** Spacing above the divider in pixels */
2851
+ spacingTop: _angular_core.InputSignal<number>;
2852
+ /** Spacing below the divider in pixels */
2853
+ spacingBottom: _angular_core.InputSignal<number>;
2854
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarDividerComponent, never>;
2855
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarDividerComponent, "coar-divider", never, { "align": { "alias": "align"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "spacingTop": { "alias": "spacingTop"; "required": false; "isSignal": true; }; "spacingBottom": { "alias": "spacingBottom"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2856
+ }
2857
+
2858
+ type CoarTableVariant = 'default' | 'plain' | 'bordered';
2859
+ /**
2860
+ * A simple table component that provides consistent styling.
2861
+ *
2862
+ * Default styling uses alternating row colors (zebra stripes) for readability.
2863
+ * Use 'plain' variant for no stripes, or 'bordered' for full cell borders.
2864
+ *
2865
+ * Usage:
2866
+ * ```html
2867
+ * <coar-table>
2868
+ * <thead>
2869
+ * <tr>
2870
+ * <th>Property</th>
2871
+ * <th>Type</th>
2872
+ * </tr>
2873
+ * </thead>
2874
+ * <tbody>
2875
+ * <tr>
2876
+ * <td><code>name</code></td>
2877
+ * <td><code>string</code></td>
2878
+ * </tr>
2879
+ * </tbody>
2880
+ * </coar-table>
2881
+ * ```
2882
+ */
2883
+ declare class CoarTableComponent {
2884
+ /** Visual variant of the table: default (zebra stripes), plain (no stripes), bordered (cell borders) */
2885
+ variant: _angular_core.InputSignal<CoarTableVariant>;
2886
+ /** Whether to use compact padding */
2887
+ compact: _angular_core.InputSignalWithTransform<boolean, unknown>;
2888
+ /** Whether rows should highlight on hover */
2889
+ hover: _angular_core.InputSignalWithTransform<boolean, unknown>;
2890
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTableComponent, never>;
2891
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTableComponent, "coar-table", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2892
+ }
2893
+
2894
+ /**
2895
+ * Available sizes for the label component.
2896
+ * Matches the component size system used by buttons and inputs.
2897
+ */
2898
+ type CoarLabelSize = 'xs' | 's' | 'm' | 'l';
2899
+ /**
2900
+ * Standalone label component for consistent form labeling across the design system.
2901
+ *
2902
+ * @example
2903
+ * ```html
2904
+ * <coar-label size="s" [required]="true">Email Address</coar-label>
2905
+ * <coar-text-input size="s" placeholder="your@email.com" />
2906
+ * ```
2907
+ */
2908
+ declare class CoarLabelComponent {
2909
+ /**
2910
+ * Size of the label. Should match the size of the associated input/form element.
2911
+ * @default 'm'
2912
+ */
2913
+ readonly size: _angular_core.InputSignal<CoarLabelSize>;
2914
+ /**
2915
+ * Whether to show a required indicator (*) after the label text.
2916
+ * @default false
2917
+ */
2918
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
2919
+ /**
2920
+ * The ID of the form element this label is associated with.
2921
+ * Sets the 'for' attribute for accessibility.
2922
+ */
2923
+ readonly for: _angular_core.InputSignal<string | undefined>;
2924
+ readonly text: _angular_core.InputSignal<string>;
2925
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarLabelComponent, never>;
2926
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarLabelComponent, "coar-label", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "for": { "alias": "for"; "required": false; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2927
+ }
2928
+
2929
+ type CoarIconRegisteredSource = Readonly<{
2930
+ key: string;
2931
+ isDefault: boolean;
2932
+ canProvideIconKeys: boolean;
2933
+ }>;
2934
+ declare class CoarIconService {
2935
+ private readonly builtInSource;
2936
+ private readonly sourceEntries;
2937
+ private readonly defaultSourceOverrides;
2938
+ private readonly sourceByKey;
2939
+ /**
2940
+ * Get an icon by name from a specific icon source.
2941
+ *
2942
+ * - If `sourceKey` is omitted, the default source is used.
2943
+ * - If no source is configured, this throws to make misconfiguration obvious.
2944
+ */
2945
+ getIcon(name: string, sourceKey?: string): Observable<string | null>;
2946
+ /**
2947
+ * List all registered icon sources.
2948
+ *
2949
+ * This is useful for UIs that allow users to browse icons grouped by source.
2950
+ */
2951
+ getRegisteredSources(): ReadonlyArray<CoarIconRegisteredSource>;
2952
+ /**
2953
+ * Get the available icon keys from a specific source.
2954
+ *
2955
+ * Throws if the source does not support listing keys.
2956
+ */
2957
+ getAvailableIconKeys(sourceKey?: string): Observable<readonly string[]>;
2958
+ clearCache(): void;
2959
+ clearIconCache(name: string): void;
2960
+ private getSourceOrThrow;
2961
+ private getSourceEntryOrThrow;
2962
+ private getDefaultSourceKeyOrThrow;
2963
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarIconService, never>;
2964
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CoarIconService>;
2965
+ }
2966
+
2967
+ interface CoarIconSource {
2968
+ getIcon(name: string): Observable<string | null>;
2969
+ getAvailableIconKeys?(): Observable<readonly string[]>;
2970
+ clearCache?(): void;
2971
+ clearIconCache?(name: string): void;
2972
+ }
2973
+ type CoarIconSourceEntry = Readonly<{
2974
+ key: string;
2975
+ source: CoarIconSource;
2976
+ }>;
2977
+ declare const COAR_ICON_SOURCE_ENTRY: InjectionToken<Readonly<{
2978
+ key: string;
2979
+ source: CoarIconSource;
2980
+ }>>;
2981
+ declare const COAR_DEFAULT_ICON_SOURCE_KEY: InjectionToken<string>;
2982
+ type ProvideCoarIconSourceOptions = Readonly<{
2983
+ key: string;
2984
+ source: CoarIconSource;
2985
+ }>;
2986
+ declare function provideCoarIconSource(options: ProvideCoarIconSourceOptions): Provider;
2987
+ type ProvideCoarIconMapSourceOptions = Readonly<{
2988
+ key: string;
2989
+ icons: Readonly<Record<string, string>>;
2990
+ }>;
2991
+ declare function provideCoarIconMapSource(options: ProvideCoarIconMapSourceOptions): Provider;
2992
+ declare function provideCoarDefaultIconSource(key: string): Provider;
2993
+ type ProvideCoarHttpIconSourceOptions = Readonly<{
2994
+ key: string;
2995
+ getUrl: (iconName: string) => string;
2996
+ getAvailableIconKeys?: (http: HttpClient) => Observable<readonly string[]>;
2997
+ }>;
2998
+ declare function provideCoarHttpIconSource(options: ProvideCoarHttpIconSourceOptions): Provider;
2999
+
3000
+ declare const COAR_BUILTIN_ICON_SOURCE_KEY: "coar-builtin";
3001
+ /**
3002
+ * Overrides (and/or adds) built-in icons while keeping the built-in set as a base.
3003
+ *
3004
+ * This registers a map source under the fixed key `coar-builtin`, so it replaces the
3005
+ * built-in fallback source inside `CoarIconService`.
3006
+ */
3007
+ declare function provideCoarIconBuiltInOverrides(overrides: Readonly<Record<string, string>>): Provider;
3008
+
3009
+ type AvatarSize = 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl';
3010
+ type AvatarShape = 'circle' | 'square';
3011
+ /**
3012
+ * Avatar component for displaying user profile images with fallback to initials.
3013
+ *
3014
+ * @example
3015
+ * ```html
3016
+ * <!-- With image -->
3017
+ * <coar-avatar [src]="user.avatarUrl" [name]="user.fullName" />
3018
+ *
3019
+ * <!-- Initials fallback (no image) -->
3020
+ * <coar-avatar [name]="user.fullName" />
3021
+ *
3022
+ * <!-- With status indicator -->
3023
+ * <coar-avatar [name]="user.fullName">
3024
+ * <coar-badge dot variant="success" />
3025
+ * </coar-avatar>
3026
+ * ```
3027
+ */
3028
+ declare class CoarAvatarComponent {
3029
+ /** Image URL for the avatar */
3030
+ src: _angular_core.InputSignal<string>;
3031
+ /** User's full name (used for initials fallback and alt text) */
3032
+ name: _angular_core.InputSignal<string>;
3033
+ /** Avatar size */
3034
+ size: _angular_core.InputSignal<AvatarSize>;
3035
+ /** Avatar shape */
3036
+ shape: _angular_core.InputSignal<AvatarShape>;
3037
+ /** Whether the avatar is interactive (clickable) */
3038
+ clickable: _angular_core.InputSignalWithTransform<boolean, unknown>;
3039
+ /** Custom initials override (otherwise computed from name) */
3040
+ initials: _angular_core.InputSignal<string>;
3041
+ /** Background color for initials (auto-generated from name if not set) */
3042
+ bgColor: _angular_core.InputSignal<string>;
3043
+ /** Whether the image failed to load */
3044
+ protected imageError: _angular_core.WritableSignal<boolean>;
3045
+ /** Show initials when no image or image failed */
3046
+ protected showInitials: _angular_core.Signal<boolean>;
3047
+ /** Computed initials from name (max 3 characters) */
3048
+ protected displayInitials: _angular_core.Signal<string>;
3049
+ /** Generate consistent background color from name */
3050
+ protected computedBgColor: _angular_core.Signal<string>;
3051
+ /** Handle image load error */
3052
+ protected onImageError(): void;
3053
+ /** Handle image load success */
3054
+ protected onImageLoad(): void;
3055
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarAvatarComponent, never>;
3056
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarAvatarComponent, "coar-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "initials": { "alias": "initials"; "required": false; "isSignal": true; }; "bgColor": { "alias": "bgColor"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3057
+ }
3058
+
3059
+ /**
3060
+ * Pipe that extracts initials from a name string.
3061
+ *
3062
+ * Takes the first character of each word and concatenates them.
3063
+ * Useful with CoarAvatarComponent to display initials instead of raw text.
3064
+ *
3065
+ * @example
3066
+ * ```html
3067
+ * <!-- Single name: "A" -->
3068
+ * {{ 'Alice' | coarInitials }}
3069
+ *
3070
+ * <!-- Two names: "AJ" -->
3071
+ * {{ 'Alice Johnson' | coarInitials }}
3072
+ *
3073
+ * <!-- Three names: "AJD" -->
3074
+ * {{ 'Alice Jane Doe' | coarInitials }}
3075
+ *
3076
+ * <!-- With avatar -->
3077
+ * <coar-avatar [name]="'Alice Johnson' | coarInitials" />
3078
+ * ```
3079
+ */
3080
+ declare class CoarInitialsPipe implements PipeTransform {
3081
+ /**
3082
+ * Extract initials from a name.
3083
+ * @param value - The name string to extract initials from
3084
+ * @param maxLength - Maximum number of initials to return (default: 3)
3085
+ * @returns Uppercase initials string
3086
+ */
3087
+ transform(value: string | null | undefined, maxLength?: number): string;
3088
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarInitialsPipe, never>;
3089
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<CoarInitialsPipe, "coarInitials", true>;
3090
+ }
3091
+
3092
+ type CodeBlockVariant = 'neutral' | 'success' | 'warning' | 'error' | 'info' | 'accent';
3093
+ declare class CoarCodeBlockComponent {
3094
+ private readonly injector;
3095
+ /** The code to display */
3096
+ code: _angular_core.InputSignal<string>;
3097
+ /** Language for syntax highlighting */
3098
+ language: _angular_core.InputSignal<string>;
3099
+ /** Title/label for the code block */
3100
+ title: _angular_core.InputSignal<string>;
3101
+ /** Whether the code block can be collapsed */
3102
+ collapsible: _angular_core.InputSignalWithTransform<boolean, unknown>;
3103
+ /** Whether the code block starts collapsed */
3104
+ collapsed: _angular_core.InputSignalWithTransform<boolean, unknown>;
3105
+ /** Whether to show the copy button */
3106
+ showCopy: _angular_core.InputSignalWithTransform<boolean, unknown>;
3107
+ /** Whether to hide the border and border-radius */
3108
+ borderless: _angular_core.InputSignalWithTransform<boolean, unknown>;
3109
+ /** Adds a box-shadow for elevation/depth */
3110
+ elevated: _angular_core.InputSignalWithTransform<boolean, unknown>;
3111
+ /** Whether to show line numbers */
3112
+ showLineNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
3113
+ /** Semantic variant for the header area */
3114
+ variant: _angular_core.InputSignal<CodeBlockVariant>;
3115
+ /** Maximum height before scrolling (0 = no limit) */
3116
+ maxHeight: _angular_core.InputSignal<number>;
3117
+ /** Internal collapsed state */
3118
+ protected isCollapsed: _angular_core.WritableSignal<boolean>;
3119
+ /** Copy feedback state */
3120
+ protected copyFeedback: _angular_core.WritableSignal<"error" | "idle" | "copied">;
3121
+ /** Highlighted code HTML */
3122
+ protected highlightedCode: _angular_core.Signal<string>;
3123
+ /** Highlighted code split by line for optional line-number rendering */
3124
+ protected highlightedLines: _angular_core.Signal<string[]>;
3125
+ constructor();
3126
+ /** Map common language aliases to Prism language names */
3127
+ private mapLanguage;
3128
+ /** Escape HTML for plain text fallback */
3129
+ private escapeHtml;
3130
+ /** Toggle collapsed state */
3131
+ toggleCollapsed(): void;
3132
+ /** Copy code to clipboard */
3133
+ copyCode(): Promise<void>;
3134
+ /** Get lines for line numbers */
3135
+ get lines(): number[];
3136
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarCodeBlockComponent, never>;
3137
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarCodeBlockComponent, "coar-code-block", never, { "code": { "alias": "code"; "required": true; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "showCopy": { "alias": "showCopy"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "elevated": { "alias": "elevated"; "required": false; "isSignal": true; }; "showLineNumbers": { "alias": "showLineNumbers"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3138
+ }
3139
+
3140
+ type CoarProgressBarVariant = 'accent' | 'success' | 'warning' | 'error';
3141
+ type CoarProgressBarSize = 's' | 'm' | 'l';
3142
+ declare class CoarProgressBarComponent {
3143
+ /** Current progress value (0 to max) */
3144
+ value: _angular_core.InputSignal<number>;
3145
+ /** Maximum progress value */
3146
+ max: _angular_core.InputSignal<number>;
3147
+ /** Visual variant */
3148
+ variant: _angular_core.InputSignal<CoarProgressBarVariant>;
3149
+ /** Bar height size */
3150
+ size: _angular_core.InputSignal<CoarProgressBarSize>;
3151
+ /** Whether to show an indeterminate animation */
3152
+ indeterminate: _angular_core.InputSignalWithTransform<boolean, unknown>;
3153
+ /** Accessible label for the progress bar */
3154
+ label: _angular_core.InputSignal<string>;
3155
+ /** Whether to display the percentage text */
3156
+ showValue: _angular_core.InputSignalWithTransform<boolean, unknown>;
3157
+ /** Computed percentage clamped to 0-100 */
3158
+ protected percentage: _angular_core.Signal<number>;
3159
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarProgressBarComponent, never>;
3160
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarProgressBarComponent, "coar-progress-bar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3161
+ }
3162
+
3163
+ type CoarSpinnerSize = 'xs' | 's' | 'm' | 'l';
3164
+ declare class CoarSpinnerComponent {
3165
+ /** Spinner size */
3166
+ size: _angular_core.InputSignal<CoarSpinnerSize>;
3167
+ /** Accessible label */
3168
+ label: _angular_core.InputSignal<string>;
3169
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSpinnerComponent, never>;
3170
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarSpinnerComponent, "coar-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3171
+ }
3172
+
3173
+ /**
3174
+ * Loading strategy for tab content:
3175
+ * - 'lazy': Content is only rendered when tab is active (default)
3176
+ * - 'eager': Content is always rendered, hidden when inactive
3177
+ */
3178
+ type TabLoadingStrategy = 'eager' | 'lazy';
3179
+ /**
3180
+ * Content type that can be passed to a tab.
3181
+ * Either a TemplateRef (from ng-template) or a Component class.
3182
+ */
3183
+ type TabContent = TemplateRef<unknown> | Type<unknown>;
3184
+ /**
3185
+ * Individual tab definition for use within CoarTabGroup.
3186
+ *
3187
+ * The tab label is provided as content projected into the component.
3188
+ * This allows simple text, icons, badges, or any custom HTML.
3189
+ *
3190
+ * @example Simple text label
3191
+ * ```html
3192
+ * <coar-tab id="home" [content]="homeTemplate">Home</coar-tab>
3193
+ * ```
3194
+ *
3195
+ * @example With icon
3196
+ * ```html
3197
+ * <coar-tab id="settings" [content]="SettingsComponent">⚙️ Settings</coar-tab>
3198
+ * ```
3199
+ *
3200
+ * @example Rich label with badge
3201
+ * ```html
3202
+ * <coar-tab id="messages" [content]="messagesTemplate">
3203
+ * Messages <span class="badge">5</span>
3204
+ * </coar-tab>
3205
+ * ```
3206
+ */
3207
+ declare class CoarTabComponent {
3208
+ /** Unique identifier for the tab */
3209
+ id: _angular_core.InputSignal<string>;
3210
+ /** Whether the tab is disabled */
3211
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3212
+ /**
3213
+ * The content to display in the tab panel.
3214
+ * Can be either a TemplateRef (from ng-template) or a Component class.
3215
+ */
3216
+ content: _angular_core.InputSignal<TabContent>;
3217
+ /**
3218
+ * Inputs to pass when content is a Component.
3219
+ * Ignored when content is a TemplateRef.
3220
+ */
3221
+ contentInputs: _angular_core.InputSignal<Record<string, unknown>>;
3222
+ /**
3223
+ * Loading strategy for the tab content.
3224
+ * - 'lazy' (default): Content is only rendered when tab becomes active
3225
+ * - 'eager': Content is always rendered, just hidden when inactive
3226
+ */
3227
+ loadingStrategy: _angular_core.InputSignal<TabLoadingStrategy>;
3228
+ /** Template reference for the projected label content */
3229
+ labelTemplate: _angular_core.Signal<TemplateRef<unknown>>;
3230
+ /**
3231
+ * Whether the content is a Component (vs a TemplateRef)
3232
+ */
3233
+ get isComponent(): boolean;
3234
+ /**
3235
+ * Get content as TemplateRef (returns null if it's a component)
3236
+ */
3237
+ get templateContent(): TemplateRef<unknown> | null;
3238
+ /**
3239
+ * Get content as Component type (returns null if it's a template)
3240
+ */
3241
+ get componentContent(): Type<unknown> | null;
3242
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTabComponent, never>;
3243
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTabComponent, "coar-tab", never, { "id": { "alias": "id"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "content": { "alias": "content"; "required": true; "isSignal": true; }; "contentInputs": { "alias": "contentInputs"; "required": false; "isSignal": true; }; "loadingStrategy": { "alias": "loadingStrategy"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3244
+ }
3245
+
3246
+ declare class CoarTabGroupComponent implements AfterContentInit {
3247
+ /** The currently active tab id */
3248
+ activeTab: _angular_core.InputSignal<string>;
3249
+ /** Emits when the active tab changes */
3250
+ activeTabChange: _angular_core.OutputEmitterRef<string>;
3251
+ /** All tab components projected into this group */
3252
+ tabs: _angular_core.Signal<readonly CoarTabComponent[]>;
3253
+ /** Internal active tab state */
3254
+ protected internalActiveTab: _angular_core.WritableSignal<string>;
3255
+ constructor();
3256
+ ngAfterContentInit(): void;
3257
+ /** Check if a tab is currently active */
3258
+ isActive(tabId: string): boolean;
3259
+ /**
3260
+ * Determines whether the content of a tab should be rendered.
3261
+ * - For 'eager' strategy: always render (content stays in DOM)
3262
+ * - For 'lazy' strategy: only render when active
3263
+ */
3264
+ shouldRenderContent(tab: CoarTabComponent): boolean;
3265
+ /** Select a tab by its id */
3266
+ selectTab(tabId: string): void;
3267
+ /** Handle keyboard navigation */
3268
+ onKeydown(event: KeyboardEvent, currentTabId: string): void;
3269
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTabGroupComponent, never>;
3270
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTabGroupComponent, "coar-tab-group", never, { "activeTab": { "alias": "activeTab"; "required": false; "isSignal": true; }; }, { "activeTabChange": "activeTabChange"; }, ["tabs"], never, true, never>;
3271
+ }
3272
+
3273
+ /**
3274
+ * CoarSidebar: A three-part layout component for navigation sidebars.
3275
+ *
3276
+ * Provides three distinct slots via content projection:
3277
+ * - **Header** (`[coar-sidebar-header]`): Fixed at top, for logo/title/branding
3278
+ * - **Content** (default slot): Scrollable area for navigation menu or other content
3279
+ * - **Footer** (`[coar-sidebar-footer]`): Fixed at bottom, for actions/settings/user info
3280
+ *
3281
+ * Responsibilities:
3282
+ * - Provide consistent sidebar layout structure
3283
+ * - Apply design tokens for width, spacing, colors
3284
+ * - Handle scrolling behavior (only content area scrolls)
3285
+ * - Support left/right positioning
3286
+ *
3287
+ * @example
3288
+ * ```html
3289
+ * <coar-sidebar>
3290
+ * <div coar-sidebar-header>
3291
+ * <h2>Navigation</h2>
3292
+ * </div>
3293
+ *
3294
+ * <coar-menu borderless>
3295
+ * <coar-menu-item routerLink="/home" routerLinkActive="active">Home</coar-menu-item>
3296
+ * <coar-menu-item routerLink="/about" routerLinkActive="active">About</coar-menu-item>
3297
+ * </coar-menu>
3298
+ *
3299
+ * <div coar-sidebar-footer>
3300
+ * <button>Settings</button>
3301
+ * </div>
3302
+ * </coar-sidebar>
3303
+ * ```
3304
+ */
3305
+ declare class CoarSidebarComponent {
3306
+ /**
3307
+ * Sidebar position: left or right side of screen.
3308
+ * Default is 'left'.
3309
+ */
3310
+ readonly position: _angular_core.InputSignal<"left" | "right">;
3311
+ /**
3312
+ * Collapsed state for narrow/icon-only sidebar.
3313
+ * Use as boolean attribute: `<coar-sidebar collapsed>` or `[collapsed]="true"`
3314
+ */
3315
+ readonly collapsed: _angular_core.InputSignalWithTransform<boolean, unknown>;
3316
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSidebarComponent, never>;
3317
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarSidebarComponent, "coar-sidebar", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; }, {}, never, ["[coar-sidebar-header]", "*", "[coar-sidebar-footer]"], true, never>;
3318
+ }
3319
+
3320
+ declare class CoarBreadcrumbComponent {
3321
+ readonly separator: _angular_core.InputSignal<string>;
3322
+ readonly items: _angular_core.Signal<readonly ElementRef<any>[]>;
3323
+ constructor();
3324
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarBreadcrumbComponent, never>;
3325
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarBreadcrumbComponent, "coar-breadcrumb", never, { "separator": { "alias": "separator"; "required": false; "isSignal": true; }; }, {}, ["items"], ["*"], true, never>;
3326
+ }
3327
+
3328
+ declare class CoarBreadcrumbItemComponent {
3329
+ readonly active: _angular_core.InputSignalWithTransform<boolean, unknown>;
3330
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarBreadcrumbItemComponent, never>;
3331
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarBreadcrumbItemComponent, "coar-breadcrumb-item", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
3332
+ }
3333
+
3334
+ type PaginationPageItem = {
3335
+ type: 'page';
3336
+ page: number;
3337
+ } | {
3338
+ type: 'ellipsis';
3339
+ };
3340
+ declare class CoarPaginationComponent {
3341
+ readonly totalItems: _angular_core.InputSignal<number>;
3342
+ readonly pageSize: _angular_core.InputSignal<number>;
3343
+ readonly currentPage: _angular_core.ModelSignal<number>;
3344
+ readonly maxVisiblePages: _angular_core.InputSignal<number>;
3345
+ readonly showFirstLast: _angular_core.InputSignalWithTransform<boolean, unknown>;
3346
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3347
+ readonly pageChanged: _angular_core.OutputEmitterRef<number>;
3348
+ readonly totalPages: _angular_core.Signal<number>;
3349
+ readonly canGoPrev: _angular_core.Signal<boolean>;
3350
+ readonly canGoNext: _angular_core.Signal<boolean>;
3351
+ readonly visiblePages: _angular_core.Signal<PaginationPageItem[]>;
3352
+ goToPage(page: number): void;
3353
+ trackByItem(_index: number, item: PaginationPageItem): string;
3354
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPaginationComponent, never>;
3355
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarPaginationComponent, "coar-pagination", never, { "totalItems": { "alias": "totalItems"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "currentPage": { "alias": "currentPage"; "required": false; "isSignal": true; }; "maxVisiblePages": { "alias": "maxVisiblePages"; "required": false; "isSignal": true; }; "showFirstLast": { "alias": "showFirstLast"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "currentPage": "currentPageChange"; "pageChanged": "pageChanged"; }, never, never, true, never>;
3356
+ }
3357
+
3358
+ declare class CoarNavbarComponent {
3359
+ readonly elevated: _angular_core.InputSignalWithTransform<boolean, unknown>;
3360
+ readonly bordered: _angular_core.InputSignalWithTransform<boolean, unknown>;
3361
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarNavbarComponent, never>;
3362
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarNavbarComponent, "coar-navbar", never, { "elevated": { "alias": "elevated"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, {}, never, ["[coar-navbar-start]", "[coar-navbar-center]", "[coar-navbar-end]"], true, never>;
3363
+ }
3364
+
3365
+ /**
3366
+ * A lightweight, hover/focus popover for rich tooltip-like content.
3367
+ *
3368
+ * Uses the overlay system for positioning with automatic placement and viewport clamping.
3369
+ */
3370
+ declare class CoarPopoverComponent {
3371
+ private readonly elementRef;
3372
+ private readonly destroyRef;
3373
+ private readonly popoverGroup;
3374
+ private readonly overlayBuilder;
3375
+ private static nextId;
3376
+ private readonly popoverId;
3377
+ protected readonly panelId: string;
3378
+ private overlayRef;
3379
+ protected readonly isOpen: _angular_core.WritableSignal<boolean>;
3380
+ constructor();
3381
+ /** Disable popover behavior (still renders trigger content). */
3382
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3383
+ /** Enable hover/focus behavior (desktop-friendly). Default: false */
3384
+ openOnHover: _angular_core.InputSignalWithTransform<boolean, unknown>;
3385
+ /** Enable click/tap behavior (touch-friendly). Default: false */
3386
+ openOnClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
3387
+ /** Whether the panel should receive pointer events. Default: true */
3388
+ interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
3389
+ /** When a concrete placement is set, fall back to best-fit when it doesn't fit. Default: false */
3390
+ fallbackToBestFit: _angular_core.InputSignalWithTransform<boolean, unknown>;
3391
+ /** Whether the panel should be clamped into the viewport. Default: true */
3392
+ clampToViewport: _angular_core.InputSignalWithTransform<boolean, unknown>;
3393
+ /** When true, the popover is "pinned" open via click and won't close on hover out. */
3394
+ protected readonly pinnedByClick: _angular_core.WritableSignal<boolean>;
3395
+ private closeTimer;
3396
+ private readonly hoveringTrigger;
3397
+ private readonly hoveringPanel;
3398
+ private readonly closeOnDisable;
3399
+ private readonly syncClampToViewport;
3400
+ private readonly syncFallbackToBestFit;
3401
+ private readonly triggerRef;
3402
+ private readonly panelTemplateRef;
3403
+ private getAnchorElement;
3404
+ private readonly closeOnDocumentClick;
3405
+ private openInternal;
3406
+ onMouseEnter(): void;
3407
+ onMouseLeave(): void;
3408
+ onPanelMouseEnter(): void;
3409
+ onPanelMouseLeave(): void;
3410
+ onFocusIn(): void;
3411
+ onPanelFocusIn(): void;
3412
+ onTriggerClick(event: MouseEvent): void;
3413
+ onHostClick(event: MouseEvent): void;
3414
+ close(): void;
3415
+ onFocusOut(event: FocusEvent): void;
3416
+ onPanelFocusOut(event: FocusEvent): void;
3417
+ private scheduleHoverClose;
3418
+ private clearCloseTimer;
3419
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPopoverComponent, never>;
3420
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarPopoverComponent, "coar-popover", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "openOnHover": { "alias": "openOnHover"; "required": false; "isSignal": true; }; "openOnClick": { "alias": "openOnClick"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "fallbackToBestFit": { "alias": "fallbackToBestFit"; "required": false; "isSignal": true; }; "clampToViewport": { "alias": "clampToViewport"; "required": false; "isSignal": true; }; }, {}, never, ["[coarPopoverTrigger]", "[coarPopoverContent]"], true, never>;
3421
+ }
3422
+
3423
+ /**
3424
+ * Local coordination for popovers inside the same container (e.g. a date picker panel).
3425
+ *
3426
+ * Provided by a parent component to ensure only one popover in that scope is open at a time.
3427
+ */
3428
+ declare class CoarPopoverGroupService {
3429
+ private activeId;
3430
+ private activeClose;
3431
+ requestOpen(id: string, close: () => void): void;
3432
+ notifyClosed(id: string): void;
3433
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPopoverGroupService, never>;
3434
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CoarPopoverGroupService>;
3435
+ }
3436
+
3437
+ type CoarTooltipOverlayContent = string | TemplateRef<unknown> | Type<unknown>;
3438
+
3439
+ /** Tooltip placement preference - all 12 standard placements plus 'auto' for best-fit */
3440
+ type TooltipPlacement = 'auto' | 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
3441
+ declare class CoarTooltipDirective {
3442
+ private readonly elementRef;
3443
+ private readonly destroyRef;
3444
+ private readonly injector;
3445
+ private readonly tooltipService;
3446
+ /** Tooltip content (string, TemplateRef, or Component type). */
3447
+ readonly coarTooltip: _angular_core.InputSignal<CoarTooltipOverlayContent | null>;
3448
+ /** Optional context for TemplateRef tooltips. */
3449
+ readonly coarTooltipContext: _angular_core.InputSignal<object | null>;
3450
+ /** Disable tooltip behavior. */
3451
+ readonly coarTooltipDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
3452
+ /** Placement preference. Default: 'top'. Use 'auto' for best-fit. */
3453
+ readonly coarTooltipPlacement: _angular_core.InputSignal<TooltipPlacement>;
3454
+ /** Delay (ms) before opening on hover/focus. Default: 0 */
3455
+ readonly coarTooltipOpenDelay: _angular_core.InputSignalWithTransform<number, unknown>;
3456
+ /** Delay (ms) before closing on leave/blur. Default: 0 */
3457
+ readonly coarTooltipCloseDelay: _angular_core.InputSignalWithTransform<number, unknown>;
3458
+ /** Whether the tooltip should be clamped into the viewport. Default: true */
3459
+ readonly coarTooltipClampToViewport: _angular_core.InputSignalWithTransform<boolean, unknown>;
3460
+ /** When placement is explicit (not auto), fall back to best-fit when it doesn't fit. Default: false */
3461
+ readonly coarTooltipFallbackToBestFit: _angular_core.InputSignalWithTransform<boolean, unknown>;
3462
+ private readonly tooltipId;
3463
+ private overlayRef;
3464
+ private readonly overlayBuilder;
3465
+ private openTimerId;
3466
+ private closeTimerId;
3467
+ private openReason;
3468
+ private readonly hasContent;
3469
+ constructor();
3470
+ private clearTimers;
3471
+ private openInternal;
3472
+ private resolveOverlayPosition;
3473
+ private scheduleOpen;
3474
+ private scheduleClose;
3475
+ onMouseEnter(): void;
3476
+ onMouseLeave(): void;
3477
+ onFocusIn(): void;
3478
+ onFocusOut(event: FocusEvent): void;
3479
+ close(immediate?: boolean): void;
3480
+ open(): void;
3481
+ toggle(): void;
3482
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTooltipDirective, never>;
3483
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarTooltipDirective, "[coarTooltip]", ["coarTooltip"], { "coarTooltip": { "alias": "coarTooltip"; "required": false; "isSignal": true; }; "coarTooltipContext": { "alias": "coarTooltipContext"; "required": false; "isSignal": true; }; "coarTooltipDisabled": { "alias": "coarTooltipDisabled"; "required": false; "isSignal": true; }; "coarTooltipPlacement": { "alias": "coarTooltipPlacement"; "required": false; "isSignal": true; }; "coarTooltipOpenDelay": { "alias": "coarTooltipOpenDelay"; "required": false; "isSignal": true; }; "coarTooltipCloseDelay": { "alias": "coarTooltipCloseDelay"; "required": false; "isSignal": true; }; "coarTooltipClampToViewport": { "alias": "coarTooltipClampToViewport"; "required": false; "isSignal": true; }; "coarTooltipFallbackToBestFit": { "alias": "coarTooltipFallbackToBestFit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3484
+ }
3485
+
3486
+ type PopconfirmPlacement = 'top' | 'bottom' | 'left' | 'right';
3487
+ /**
3488
+ * Popconfirm directive for confirming actions with a small anchored popover.
3489
+ *
3490
+ * Intercepts clicks on the host element, shows a confirmation popover,
3491
+ * and either proceeds with the action (confirm) or cancels.
3492
+ *
3493
+ * @example
3494
+ * ```html
3495
+ * <button coarPopconfirm="Delete this user?" (onConfirm)="deleteUser()">
3496
+ * Delete
3497
+ * </button>
3498
+ *
3499
+ * <button
3500
+ * [coarPopconfirm]="'Revoke all sessions?'"
3501
+ * popconfirmTitle="Warning"
3502
+ * confirmText="Revoke"
3503
+ * confirmVariant="danger"
3504
+ * (onConfirm)="revokeSessions()"
3505
+ * >
3506
+ * Revoke
3507
+ * </button>
3508
+ * ```
3509
+ */
3510
+ declare class CoarPopconfirmDirective {
3511
+ private readonly elementRef;
3512
+ private readonly destroyRef;
3513
+ private readonly overlayBuilder;
3514
+ private overlayRef;
3515
+ /** Confirmation message to display */
3516
+ coarPopconfirm: _angular_core.InputSignal<string>;
3517
+ /** Optional title above the message */
3518
+ popconfirmTitle: _angular_core.InputSignal<string>;
3519
+ /** Text for the confirm button */
3520
+ confirmText: _angular_core.InputSignal<string>;
3521
+ /** Text for the cancel button */
3522
+ cancelText: _angular_core.InputSignal<string>;
3523
+ /** Variant for confirm button */
3524
+ confirmVariant: _angular_core.InputSignal<"primary" | "danger">;
3525
+ /** Placement relative to trigger element */
3526
+ placement: _angular_core.InputSignal<PopconfirmPlacement>;
3527
+ /** Whether popconfirm is disabled */
3528
+ popconfirmDisabled: _angular_core.InputSignal<boolean>;
3529
+ /** Emitted when user confirms */
3530
+ confirmed: _angular_core.OutputEmitterRef<void>;
3531
+ /** Emitted when user cancels */
3532
+ cancelled: _angular_core.OutputEmitterRef<void>;
3533
+ /** Whether the popconfirm is currently open */
3534
+ protected readonly isOpen: _angular_core.WritableSignal<boolean>;
3535
+ constructor();
3536
+ onClick(event: Event): void;
3537
+ private open;
3538
+ private close;
3539
+ private confirm;
3540
+ private cancel;
3541
+ private getPlacementConfig;
3542
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPopconfirmDirective, never>;
3543
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarPopconfirmDirective, "[coarPopconfirm]", never, { "coarPopconfirm": { "alias": "coarPopconfirm"; "required": true; "isSignal": true; }; "popconfirmTitle": { "alias": "popconfirmTitle"; "required": false; "isSignal": true; }; "confirmText": { "alias": "confirmText"; "required": false; "isSignal": true; }; "cancelText": { "alias": "cancelText"; "required": false; "isSignal": true; }; "confirmVariant": { "alias": "confirmVariant"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "popconfirmDisabled": { "alias": "popconfirmDisabled"; "required": false; "isSignal": true; }; }, { "confirmed": "confirmed"; "cancelled": "cancelled"; }, never, never, true, never>;
3544
+ }
3545
+ /**
3546
+ * Internal panel component for popconfirm content.
3547
+ */
3548
+ declare class CoarPopconfirmPanelComponent {
3549
+ /** Confirmation message to display */
3550
+ message: _angular_core.InputSignal<string>;
3551
+ /** Optional title above the message */
3552
+ title: _angular_core.InputSignal<string>;
3553
+ /** Text for the confirm button */
3554
+ confirmText: _angular_core.InputSignal<string>;
3555
+ /** Text for the cancel button */
3556
+ cancelText: _angular_core.InputSignal<string>;
3557
+ /** Variant for confirm button */
3558
+ confirmVariant: _angular_core.InputSignal<"primary" | "danger">;
3559
+ /** Placement for arrow positioning */
3560
+ placement: _angular_core.InputSignal<PopconfirmPlacement>;
3561
+ /** Callback when user confirms */
3562
+ onConfirm: _angular_core.InputSignal<(() => void) | undefined>;
3563
+ /** Callback when user cancels */
3564
+ onCancel: _angular_core.InputSignal<(() => void) | undefined>;
3565
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPopconfirmPanelComponent, never>;
3566
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarPopconfirmPanelComponent, "coar-popconfirm-panel", never, { "message": { "alias": "message"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "confirmText": { "alias": "confirmText"; "required": false; "isSignal": true; }; "cancelText": { "alias": "cancelText"; "required": false; "isSignal": true; }; "confirmVariant": { "alias": "confirmVariant"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "onConfirm": { "alias": "onConfirm"; "required": false; "isSignal": true; }; "onCancel": { "alias": "onCancel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3567
+ }
3568
+
3569
+ type CoarDialogSize = 's' | 'm' | 'l';
3570
+ interface CoarDialogConfig<_TResult = unknown> {
3571
+ title?: string;
3572
+ size?: CoarDialogSize;
3573
+ closeOnBackdropClick?: boolean;
3574
+ closeOnEscape?: boolean;
3575
+ showCloseButton?: boolean;
3576
+ panelClass?: string | string[];
3577
+ ariaLabel?: string;
3578
+ ariaDescribedBy?: string;
3579
+ }
3580
+ interface CoarDialogRef<TResult = unknown> {
3581
+ close(result?: TResult): void;
3582
+ readonly afterClosed$: Observable<TResult | undefined>;
3583
+ }
3584
+ interface CoarConfirmOptions {
3585
+ title: string;
3586
+ message: string;
3587
+ confirmText?: string;
3588
+ cancelText?: string;
3589
+ confirmVariant?: 'primary' | 'danger';
3590
+ }
3591
+
3592
+ declare class CoarDialogService {
3593
+ private readonly overlayBuilder;
3594
+ constructor();
3595
+ openComponent<C, TResult = unknown>(component: Type<C>, config?: CoarDialogConfig<TResult>, inputs?: Record<string, unknown>): CoarDialogRef<TResult>;
3596
+ openTemplate<TCtx, TResult = unknown>(template: TemplateRef<TCtx>, config?: CoarDialogConfig<TResult>, context?: TCtx): CoarDialogRef<TResult>;
3597
+ confirm(options: CoarConfirmOptions): CoarDialogRef<boolean>;
3598
+ private buildDialogOverlay;
3599
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarDialogService, never>;
3600
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CoarDialogService>;
3601
+ }
3602
+
3603
+ declare class CoarDialogShellComponent {
3604
+ private readonly overlayRef;
3605
+ readonly dialogTitle: _angular_core.InputSignal<string>;
3606
+ readonly dialogSize: _angular_core.InputSignal<CoarDialogSize>;
3607
+ readonly showCloseButton: _angular_core.InputSignal<boolean>;
3608
+ readonly contentComponent: _angular_core.InputSignal<Type<unknown> | null>;
3609
+ readonly contentTemplate: _angular_core.InputSignal<TemplateRef<unknown> | null>;
3610
+ readonly contentContext: _angular_core.InputSignal<unknown>;
3611
+ readonly componentInputs: _angular_core.InputSignal<Record<string, unknown>>;
3612
+ readonly confirmMode: _angular_core.InputSignal<boolean>;
3613
+ readonly confirmMessage: _angular_core.InputSignal<string>;
3614
+ readonly confirmText: _angular_core.InputSignal<string>;
3615
+ readonly cancelText: _angular_core.InputSignal<string>;
3616
+ readonly confirmVariant: _angular_core.InputSignal<string>;
3617
+ protected onClose(): void;
3618
+ protected onConfirm(): void;
3619
+ protected onCancel(): void;
3620
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarDialogShellComponent, never>;
3621
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarDialogShellComponent, "coar-dialog-shell", never, { "dialogTitle": { "alias": "dialogTitle"; "required": false; "isSignal": true; }; "dialogSize": { "alias": "dialogSize"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "contentComponent": { "alias": "contentComponent"; "required": false; "isSignal": true; }; "contentTemplate": { "alias": "contentTemplate"; "required": false; "isSignal": true; }; "contentContext": { "alias": "contentContext"; "required": false; "isSignal": true; }; "componentInputs": { "alias": "componentInputs"; "required": false; "isSignal": true; }; "confirmMode": { "alias": "confirmMode"; "required": false; "isSignal": true; }; "confirmMessage": { "alias": "confirmMessage"; "required": false; "isSignal": true; }; "confirmText": { "alias": "confirmText"; "required": false; "isSignal": true; }; "cancelText": { "alias": "cancelText"; "required": false; "isSignal": true; }; "confirmVariant": { "alias": "confirmVariant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3622
+ }
3623
+
3624
+ type CoarToastVariant = 'success' | 'error' | 'warning' | 'info';
3625
+ type CoarToastPosition = 'top-right' | 'top-left' | 'top-center' | 'bottom-right' | 'bottom-left' | 'bottom-center';
3626
+ interface CoarToastConfig {
3627
+ variant?: CoarToastVariant;
3628
+ title?: string;
3629
+ message: string;
3630
+ duration?: number;
3631
+ dismissible?: boolean;
3632
+ position?: CoarToastPosition;
3633
+ showProgress?: boolean;
3634
+ action?: {
3635
+ label: string;
3636
+ callback: () => void;
3637
+ };
3638
+ }
3639
+ interface CoarToastRef {
3640
+ dismiss(): void;
3641
+ readonly afterDismissed$: Observable<void>;
3642
+ }
3643
+
3644
+ declare class CoarToastService {
3645
+ private readonly appRef;
3646
+ private readonly injector;
3647
+ private containerRef;
3648
+ private nextId;
3649
+ success(message: string, config?: Partial<CoarToastConfig>): CoarToastRef;
3650
+ error(message: string, config?: Partial<CoarToastConfig>): CoarToastRef;
3651
+ warning(message: string, config?: Partial<CoarToastConfig>): CoarToastRef;
3652
+ info(message: string, config?: Partial<CoarToastConfig>): CoarToastRef;
3653
+ show(config: CoarToastConfig): CoarToastRef;
3654
+ dismissAll(): void;
3655
+ private getOrCreateContainer;
3656
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarToastService, never>;
3657
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CoarToastService>;
3658
+ }
3659
+
3660
+ declare class CoarToastComponent {
3661
+ private readonly destroyRef;
3662
+ private timer;
3663
+ private startTime;
3664
+ private remaining;
3665
+ readonly variant: _angular_core.InputSignal<CoarToastVariant>;
3666
+ readonly title: _angular_core.InputSignal<string>;
3667
+ readonly message: _angular_core.InputSignal<string>;
3668
+ readonly duration: _angular_core.InputSignal<number>;
3669
+ readonly dismissible: _angular_core.InputSignal<boolean>;
3670
+ readonly showProgress: _angular_core.InputSignal<boolean>;
3671
+ readonly action: _angular_core.InputSignal<{
3672
+ label: string;
3673
+ callback: () => void;
3674
+ } | null>;
3675
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
3676
+ readonly actionClicked: _angular_core.OutputEmitterRef<void>;
3677
+ readonly isPaused: _angular_core.WritableSignal<boolean>;
3678
+ readonly iconName: _angular_core.Signal<string>;
3679
+ constructor();
3680
+ startAutoClose(): void;
3681
+ onMouseEnter(): void;
3682
+ onMouseLeave(): void;
3683
+ onDismiss(): void;
3684
+ onAction(): void;
3685
+ private clearTimer;
3686
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarToastComponent, never>;
3687
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarToastComponent, "coar-toast", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "showProgress": { "alias": "showProgress"; "required": false; "isSignal": true; }; "action": { "alias": "action"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "actionClicked": "actionClicked"; }, never, never, true, never>;
3688
+ }
3689
+
3690
+ interface InternalToast {
3691
+ id: number;
3692
+ variant: CoarToastVariant;
3693
+ title: string;
3694
+ message: string;
3695
+ duration: number;
3696
+ dismissible: boolean;
3697
+ showProgress: boolean;
3698
+ action: {
3699
+ label: string;
3700
+ callback: () => void;
3701
+ } | null;
3702
+ onDismiss: () => void;
3703
+ }
3704
+ declare class CoarToastContainerComponent {
3705
+ toastComponents: QueryList<CoarToastComponent>;
3706
+ readonly toasts: _angular_core.WritableSignal<InternalToast[]>;
3707
+ readonly position: _angular_core.WritableSignal<string>;
3708
+ private pendingAutoClose;
3709
+ addToast(toast: InternalToast): void;
3710
+ removeToast(id: number): void;
3711
+ removeAll(): void;
3712
+ onDismissed(id: number): void;
3713
+ startAutoCloseForLatest(): void;
3714
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarToastContainerComponent, never>;
3715
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarToastContainerComponent, "coar-toast-container", never, {}, {}, never, never, true, never>;
3716
+ }
3717
+
3718
+ export { COAR_BUILTIN_ICON_SOURCE_KEY, COAR_DATE_FORMAT_TO_MASKITO_MODE, COAR_DEFAULT_ICON_SOURCE_KEY, COAR_DEFAULT_TIME_FORMAT, COAR_ICON_SOURCE_ENTRY, CoarAvatarComponent, CoarBadgeComponent, CoarBreadcrumbComponent, CoarBreadcrumbItemComponent, CoarButtonComponent, CoarCardComponent, CoarCheckboxComponent, CoarCodeBlockComponent, CoarControlValueAccessor, CoarDialogService, CoarDialogShellComponent, CoarDividerComponent, CoarIconComponent, CoarIconService, CoarInitialsPipe, CoarLabelComponent, CoarMiniCalendarComponent, CoarMonthListComponent, CoarMultiSelectComponent, CoarNavbarComponent, CoarNoteComponent, CoarNumberInputComponent, CoarPaginationComponent, CoarPasswordInputComponent, CoarPlainDatePickerComponent, CoarPlainDateTimePickerComponent, CoarPopconfirmDirective, CoarPopconfirmPanelComponent, CoarPopoverComponent, CoarPopoverGroupService, CoarProgressBarComponent, CoarRadioComponent, CoarRadioGroupComponent, CoarScrollableCalendarComponent, CoarScrollbarDirective, CoarSidebarComponent, CoarSingleSelectComponent, CoarSpinnerComponent, CoarSwitchComponent, CoarTabComponent, CoarTabGroupComponent, CoarTableComponent, CoarTagComponent, CoarTagSelectComponent, CoarTextInputComponent, CoarTimePickerComponent, CoarToastComponent, CoarToastContainerComponent, CoarToastService, CoarTooltipDirective, CoarZonedDateTimePickerComponent, coarCalculateIsoWeekNumber, coarClampPlainDate, coarConvertTo12Hour, coarConvertTo24Hour, coarDetect12HourFormat, coarDetectDateFormatPatternFromIntl, coarFormatPlainDate, coarFormatTime, coarGetCalendarGridDates, coarGetDateSeparatorForPattern, coarGetLocalizedWeekdays, coarGetValidMinutes, coarIncrementHours, coarIncrementMinutes, coarParsePlainDateFromInput, coarParseTimeInput, coarProvideValueAccessor, coarRoundMinutesToStep, coarTemporalPlainDateToDate, provideCoarDefaultIconSource, provideCoarHttpIconSource, provideCoarIconBuiltInOverrides, provideCoarIconMapSource, provideCoarIconSource };
3719
+ export type { AvatarShape, AvatarSize, BadgeSize, BadgeVariant, ButtonSize, ButtonVariant, CardPadding, CardVariant, CoarCalendarDay, CoarCalendarGridCell, CoarCalendarMonth, CoarCheckboxSize, CoarConfirmOptions, CoarDateMarker, CoarDialogConfig, CoarDialogRef, CoarDialogSize, CoarIconRegisteredSource, CoarIconSize, CoarIconSource, CoarIconSourceEntry, CoarLabelSize, CoarNumberInputSize, CoarNumberInputStepperButtons, CoarPasswordInputSize, CoarPlainDatePickerSize, CoarPlainDateTimePickerSize, CoarProgressBarSize, CoarProgressBarVariant, CoarScrollbarAutoHide, CoarScrollbarOverflow, CoarScrollbarTheme, CoarSelectAppearance, CoarSelectOption, CoarSelectSize, CoarSpinnerSize, CoarSwitchSize, CoarTableVariant, CoarTextInputSize, CoarTimePeriod, CoarTimePickerSize, CoarTimeValue, CoarToastConfig, CoarToastPosition, CoarToastRef, CoarToastVariant, CoarZonedDateTimePickerSize, CodeBlockVariant, DateFormatConfig, DividerAlign, DividerVariant, NotePadding, NoteVariant, NumberFormatConfig, PaginationPageItem, PopconfirmPlacement, ProvideCoarHttpIconSourceOptions, ProvideCoarIconMapSourceOptions, ProvideCoarIconSourceOptions, RadioGroupOrientation, RadioGroupSize, TabContent, TabLoadingStrategy, TagSize, TagVariant, TimeFormatConfig };