@cocoar/ui-components 0.1.0-beta.70

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.
@@ -0,0 +1,1902 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { Type, Provider, ElementRef, InjectionToken, AfterViewInit, OnDestroy, DestroyRef, TemplateRef, AfterContentInit } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
4
+ import { SafeHtml } from '@angular/platform-browser';
5
+ import { OverlayScrollbars } from 'overlayscrollbars';
6
+ import { Observable } from 'rxjs';
7
+ import { Temporal } from '@js-temporal/polyfill';
8
+
9
+ declare function coarProvideValueAccessor(type: () => Type<ControlValueAccessor>): Provider;
10
+ declare abstract class CoarControlValueAccessor<T> implements ControlValueAccessor {
11
+ protected readonly cvaDisabled: _angular_core.WritableSignal<boolean>;
12
+ protected cvaOnChange: (value: T) => void;
13
+ protected cvaOnTouched: () => void;
14
+ registerOnChange(fn: (value: T) => void): void;
15
+ registerOnTouched(fn: () => void): void;
16
+ setDisabledState(isDisabled: boolean): void;
17
+ abstract writeValue(value: T | null): void;
18
+ }
19
+
20
+ type CoarTextInputSize = 'xs' | 'sm' | 'md' | 'lg';
21
+ declare class CoarTextInputComponent extends CoarControlValueAccessor<string> {
22
+ /** Label text displayed above the input */
23
+ label: _angular_core.InputSignal<string>;
24
+ /** Placeholder text shown when input is empty */
25
+ placeholder: _angular_core.InputSignal<string>;
26
+ /** Current input value (two-way bindable with [(value)]) */
27
+ value: _angular_core.ModelSignal<string>;
28
+ /** Input size - matches button/checkbox sizes for consistent layouts */
29
+ size: _angular_core.InputSignal<CoarTextInputSize>;
30
+ /** Number of visible text rows (1 = single-line input, 2+ = textarea) */
31
+ rows: _angular_core.InputSignal<number>;
32
+ /** Disables the input (greyed out, not focusable) */
33
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
34
+ /** Makes the input read-only (focusable but not editable) */
35
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
36
+ /** Marks the input as required, shows asterisk on label */
37
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
38
+ /** Error message to display below the input */
39
+ error: _angular_core.InputSignal<string>;
40
+ /** Hint text displayed below the input */
41
+ hint: _angular_core.InputSignal<string>;
42
+ /** Show clear button when input has value and is focused/hovered */
43
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
44
+ /** Text or symbol displayed before the input value */
45
+ prefix: _angular_core.InputSignal<string>;
46
+ /** Text or symbol displayed after the input value */
47
+ suffix: _angular_core.InputSignal<string>;
48
+ /** HTML id attribute for the input element */
49
+ id: _angular_core.InputSignal<string>;
50
+ /** HTML name attribute for form submission */
51
+ name: _angular_core.InputSignal<string>;
52
+ /** HTML autocomplete attribute */
53
+ autocomplete: _angular_core.InputSignal<string>;
54
+ /** Maximum character length */
55
+ maxlength: _angular_core.InputSignal<number | undefined>;
56
+ /** Emits when input value changes */
57
+ valueChange: _angular_core.OutputEmitterRef<string>;
58
+ /** Emits when input loses focus */
59
+ blurred: _angular_core.OutputEmitterRef<FocusEvent>;
60
+ /** Emits when input gains focus */
61
+ focused: _angular_core.OutputEmitterRef<FocusEvent>;
62
+ /** Emits when clear button is clicked */
63
+ clear: _angular_core.OutputEmitterRef<void>;
64
+ protected isFocused: _angular_core.WritableSignal<boolean>;
65
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement | HTMLTextAreaElement> | undefined>;
66
+ protected isMultiline: _angular_core.Signal<boolean>;
67
+ protected isDisabled: _angular_core.Signal<boolean>;
68
+ protected showClearButton: _angular_core.Signal<boolean>;
69
+ protected hasError: _angular_core.Signal<boolean>;
70
+ protected displayMessage: _angular_core.Signal<string>;
71
+ protected inputId: _angular_core.Signal<string>;
72
+ protected messageId: _angular_core.Signal<string>;
73
+ writeValue(value: string | null): void;
74
+ protected onInput(event: Event): void;
75
+ protected onFocus(event: FocusEvent): void;
76
+ protected onBlur(event: FocusEvent): void;
77
+ protected onClear(): void;
78
+ protected onLabelClick(): void;
79
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTextInputComponent, never>;
80
+ 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>;
81
+ }
82
+
83
+ /**
84
+ * Built-in icon registry.
85
+ *
86
+ * ⚠️ DO NOT EDIT THIS FILE MANUALLY
87
+ *
88
+ * This file is auto-generated from /assets/icons/*.svg files.
89
+ * To add new icons:
90
+ * 1. Add SVG files to /assets/icons/
91
+ * 2. Run: npm run build:icons
92
+ * 3. Commit the generated file
93
+ *
94
+ * Icons are inlined as strings for maximum portability.
95
+ *
96
+ * Generated: 2026-01-03T10:25:22.816Z
97
+ * Source: C:\git\cocoar\cocoar-ui\assets\icons
98
+ */
99
+ declare const CORE_ICONS: {
100
+ 'add-list': string;
101
+ 'add-user': string;
102
+ add: string;
103
+ 'arrow-right': string;
104
+ back: string;
105
+ bin: string;
106
+ calendar: string;
107
+ 'caret-right': string;
108
+ chat: string;
109
+ check: string;
110
+ 'chevron-down': string;
111
+ 'chevron-left': string;
112
+ 'chevron-right': string;
113
+ 'chevrons-left': string;
114
+ 'chevrons-right': string;
115
+ clipboard: string;
116
+ close: string;
117
+ comments: string;
118
+ copy: string;
119
+ customers: string;
120
+ employee: string;
121
+ 'eye-closed': string;
122
+ 'eye-off': string;
123
+ 'eye-open': string;
124
+ eye: string;
125
+ 'important-1': string;
126
+ important: string;
127
+ key: string;
128
+ list: string;
129
+ load: string;
130
+ lock: string;
131
+ minus: string;
132
+ padlock: string;
133
+ plus: string;
134
+ question: string;
135
+ settings: string;
136
+ 'square-rounded-dashed': string;
137
+ trash: string;
138
+ user: string;
139
+ users: string;
140
+ x: string;
141
+ };
142
+ type CoreIconName = keyof typeof CORE_ICONS | (string & {});
143
+
144
+ type CoarIconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'auto';
145
+ /**
146
+ * COAR Icon Component
147
+ *
148
+ * Hybrid icon system supporting built-in icons and customer-uploaded SVGs.
149
+ *
150
+ * Usage:
151
+ * ```html
152
+ * <coar-icon name="settings" size="md"></coar-icon>
153
+ * <coar-icon name="customer:invoicePaid" size="lg"></coar-icon>
154
+ * ```
155
+ *
156
+ * Size tokens:
157
+ * - xs = 12px
158
+ * - sm = 16px
159
+ * - md = 20px (default)
160
+ * - lg = 24px
161
+ * - xl = 32px
162
+ * - auto = fills parent container (use padding on parent to control)
163
+ */
164
+ declare class CoarIconComponent {
165
+ private readonly iconService;
166
+ private readonly sanitizer;
167
+ /**
168
+ * Icon identifier.
169
+ * Examples: "settings", "user", "customer:invoicePaid"
170
+ */
171
+ name: _angular_core.InputSignal<CoreIconName | undefined>;
172
+ /**
173
+ * Icon size. Defaults to 'md' (20px).
174
+ * Can be a preset token (xs, sm, md, lg, xl, auto) or a custom CSS value (e.g., '42px', '3rem').
175
+ */
176
+ size: _angular_core.InputSignal<string>;
177
+ /**
178
+ * Rotation angle in degrees (0, 90, 180, 270, or any number).
179
+ */
180
+ rotate: _angular_core.InputSignal<number>;
181
+ /**
182
+ * Rotation transition animation.
183
+ * - Empty/undefined: No animation
184
+ * - Number: Duration in milliseconds (e.g., 300)
185
+ * - String: Full CSS transition value (e.g., '0.3s ease-in-out', '500ms cubic-bezier(0.4, 0, 0.2, 1)')
186
+ */
187
+ rotateTransition: _angular_core.InputSignal<string | number | undefined>;
188
+ /**
189
+ * Enable continuous spinning animation.
190
+ */
191
+ spin: _angular_core.InputSignalWithTransform<boolean, unknown>;
192
+ /**
193
+ * Icon color. Can be any valid CSS color value.
194
+ * Examples: 'red', '#ff0000', 'rgb(255, 0, 0)', 'var(--coar-text-semantic-error-bold)'
195
+ * Use 'inherit' to inherit the parent element's color.
196
+ */
197
+ color: _angular_core.InputSignal<string>;
198
+ /**
199
+ * Optional text label to display next to the icon.
200
+ */
201
+ label: _angular_core.InputSignal<string | number | undefined>;
202
+ /**
203
+ * Optional fallback icon to show if the requested icon fails to load.
204
+ * If not specified and the icon fails, nothing will be rendered.
205
+ */
206
+ fallback?: string;
207
+ /**
208
+ * Signal holding the sanitized SVG HTML ready for rendering.
209
+ */
210
+ protected sanitizedSvg: _angular_core.WritableSignal<SafeHtml | null>;
211
+ /**
212
+ * Signal indicating whether an icon is currently being loaded.
213
+ */
214
+ protected isLoading: _angular_core.WritableSignal<boolean>;
215
+ /**
216
+ * Check if the size is a preset token (xs, sm, md, lg, xl, auto).
217
+ */
218
+ protected isPresetSize(size: string): boolean;
219
+ /**
220
+ * Compute the CSS transition value for rotation.
221
+ */
222
+ protected getRotateTransitionValue(): string | null;
223
+ constructor();
224
+ /**
225
+ * Load an icon from the service and sanitize it.
226
+ */
227
+ private loadIcon;
228
+ /**
229
+ * Load fallback icon if available.
230
+ */
231
+ private loadFallback;
232
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarIconComponent, never>;
233
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarIconComponent, "coar-icon", never, { "name": { "alias": "name"; "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; }; "fallback": { "alias": "fallback"; "required": false; }; }, {}, never, ["*"], true, never>;
234
+ }
235
+
236
+ /** Configuration for number formatting */
237
+ interface NumberFormatConfig {
238
+ readonly decimal: string;
239
+ readonly thousand: string;
240
+ }
241
+ /** Configuration for date formatting */
242
+ interface DateFormatConfig {
243
+ /** Date format pattern: 'dd.mm.yyyy', 'dd/mm/yyyy', 'mm/dd/yyyy', 'yyyy-mm-dd' */
244
+ readonly pattern: 'dd.mm.yyyy' | 'dd/mm/yyyy' | 'mm/dd/yyyy' | 'yyyy-mm-dd';
245
+ /** First day of week: 1 = Monday, 7 = Sunday */
246
+ readonly firstDayOfWeek: 1 | 7;
247
+ }
248
+ /** Complete locale configuration */
249
+ interface LocaleConfig {
250
+ readonly number: NumberFormatConfig;
251
+ readonly date: DateFormatConfig;
252
+ }
253
+ /**
254
+ * Service contract for locale-aware formatting.
255
+ * Provides formatting rules (not translations) for numbers, dates, etc.
256
+ *
257
+ * This handles "how to display" (1.000,50 vs 1,000.50),
258
+ * not "what text to show" (that's translation/i18n).
259
+ */
260
+ interface ICoarLocaleService {
261
+ /**
262
+ * Get number format configuration for a specific locale.
263
+ * @param locale - Optional locale identifier (e.g., 'de-AT', 'en-US'). If not provided, uses default locale.
264
+ * @returns Number format configuration with decimal and thousand separators
265
+ */
266
+ getNumberFormat(locale?: string): NumberFormatConfig;
267
+ /**
268
+ * Get date format configuration for a specific locale.
269
+ * @param locale - Optional locale identifier (e.g., 'de-AT', 'en-US'). If not provided, uses default locale.
270
+ * @returns Date format configuration with pattern and first day of week
271
+ */
272
+ getDateFormat(locale?: string): DateFormatConfig;
273
+ /**
274
+ * Get the current default locale identifier.
275
+ * @returns Current default locale (e.g., 'de-AT', 'en-US')
276
+ */
277
+ getDefaultLocale(): string;
278
+ /**
279
+ * Set the default locale used when no locale is explicitly specified.
280
+ * @param locale - Locale identifier (e.g., 'de-AT', 'en-US')
281
+ */
282
+ setDefaultLocale(locale: string): void;
283
+ /**
284
+ * Register a custom locale configuration.
285
+ * Useful for specialized formats (e.g., financial reports with space as thousand separator).
286
+ * @param id - Custom locale identifier (e.g., 'custom-finance')
287
+ * @param config - Partial locale configuration (only specify what you want to override)
288
+ */
289
+ registerLocale(id: string, config: Partial<LocaleConfig>): void;
290
+ }
291
+ /**
292
+ * Injection token for the locale service.
293
+ * Use this to inject the locale service in components.
294
+ *
295
+ * @example
296
+ * ```typescript
297
+ * private localeService = inject(COAR_LOCALE_SERVICE, { optional: true });
298
+ * ```
299
+ */
300
+ declare const COAR_LOCALE_SERVICE: InjectionToken<ICoarLocaleService>;
301
+ /**
302
+ * Default implementation of locale service.
303
+ * Uses browser's Intl.NumberFormat API for standard locales,
304
+ * with support for custom locale registration.
305
+ */
306
+ declare class CoarLocaleService implements ICoarLocaleService {
307
+ private defaultLocale;
308
+ private customLocales;
309
+ getDefaultLocale(): string;
310
+ setDefaultLocale(locale: string): void;
311
+ registerLocale(id: string, config: Partial<LocaleConfig>): void;
312
+ getNumberFormat(locale?: string): NumberFormatConfig;
313
+ getDateFormat(locale?: string): DateFormatConfig;
314
+ /**
315
+ * Extract default formatting rules from browser's Intl API
316
+ */
317
+ private getDefaults;
318
+ /**
319
+ * Detect date format based on locale.
320
+ *
321
+ * Uses Intl.DateTimeFormat to determine the date order for the locale,
322
+ * then maps to one of our supported patterns.
323
+ */
324
+ private detectDateFormat;
325
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarLocaleService, never>;
326
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CoarLocaleService>;
327
+ }
328
+
329
+ type CoarNumberInputSize = 'xs' | 'sm' | 'md' | 'lg';
330
+ type CoarNumberInputStepperButtons = 'none' | 'increment' | 'decrement' | 'both';
331
+ declare class CoarNumberInputComponent extends CoarControlValueAccessor<number | null> {
332
+ private readonly destroyRef;
333
+ private readonly localeService;
334
+ private maskitoInstance?;
335
+ /** Label text displayed above the input */
336
+ label: _angular_core.InputSignal<string>;
337
+ /** Placeholder text shown when input is empty */
338
+ placeholder: _angular_core.InputSignal<string>;
339
+ /**
340
+ * Current numeric value.
341
+ * Using model() for two-way binding support.
342
+ */
343
+ value: _angular_core.ModelSignal<number | null>;
344
+ /** Input size - matches button/checkbox sizes for consistent layouts */
345
+ size: _angular_core.InputSignal<CoarNumberInputSize>;
346
+ /** Minimum allowed value */
347
+ min: _angular_core.InputSignal<number | undefined>;
348
+ /** Maximum allowed value */
349
+ max: _angular_core.InputSignal<number | undefined>;
350
+ /** Step increment for arrows and keyboard */
351
+ step: _angular_core.InputSignal<number>;
352
+ /** Number of decimal places to display */
353
+ decimals: _angular_core.InputSignal<number>;
354
+ /** Disables the input (greyed out, not focusable) */
355
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
356
+ /** Makes the input read-only (focusable but not editable) */
357
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
358
+ /** Marks the input as required, shows asterisk on label */
359
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
360
+ /** Error message to display below the input */
361
+ error: _angular_core.InputSignal<string>;
362
+ /** Hint text displayed below the input */
363
+ hint: _angular_core.InputSignal<string>;
364
+ /** Show clear button when input has value and is focused/hovered */
365
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
366
+ /**
367
+ * Controls visibility of increment/decrement stepper buttons.
368
+ * Supports both boolean attribute pattern and granular string control:
369
+ * - No attribute → no buttons
370
+ * - `stepperButtons` (attribute) → both buttons
371
+ * - `stepperButtons="increment"` → only increment
372
+ * - `stepperButtons="decrement"` → only decrement
373
+ * - `stepperButtons="both"` → both buttons (explicit)
374
+ * - `stepperButtons="none"` → no buttons (explicit)
375
+ */
376
+ stepperButtons: _angular_core.InputSignalWithTransform<CoarNumberInputStepperButtons, string | boolean>;
377
+ /** Text or symbol displayed before the input value */
378
+ prefix: _angular_core.InputSignal<string>;
379
+ /** Text or symbol displayed after the input value */
380
+ suffix: _angular_core.InputSignal<string>;
381
+ /**
382
+ * Locale identifier for number formatting (e.g., 'de-AT', 'en-US').
383
+ * Uses global locale service default if not specified.
384
+ */
385
+ locale: _angular_core.InputSignal<string | undefined>;
386
+ /**
387
+ * Number format configuration (decimal and thousand separators).
388
+ * If not provided, uses locale service default or falls back to { decimal: '.', thousand: '' }.
389
+ */
390
+ numberFormat: _angular_core.InputSignal<NumberFormatConfig | undefined>;
391
+ /** HTML id attribute for the input element */
392
+ id: _angular_core.InputSignal<string>;
393
+ /** HTML name attribute for form submission */
394
+ name: _angular_core.InputSignal<string>;
395
+ /** Emits when input value changes */
396
+ valueChange: _angular_core.OutputEmitterRef<number | null>;
397
+ /** Emits when input loses focus */
398
+ blurred: _angular_core.OutputEmitterRef<FocusEvent>;
399
+ /** Emits when input gains focus */
400
+ focused: _angular_core.OutputEmitterRef<FocusEvent>;
401
+ /** Emits when clear button is clicked */
402
+ clear: _angular_core.OutputEmitterRef<void>;
403
+ protected displayValue: _angular_core.WritableSignal<string>;
404
+ protected isFocused: _angular_core.WritableSignal<boolean>;
405
+ protected isDragging: _angular_core.WritableSignal<boolean>;
406
+ protected dragStartX: _angular_core.WritableSignal<number>;
407
+ protected dragStartValue: _angular_core.WritableSignal<number>;
408
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
409
+ protected isDisabled: _angular_core.Signal<boolean>;
410
+ protected showClearButton: _angular_core.Signal<boolean>;
411
+ protected hasError: _angular_core.Signal<boolean>;
412
+ protected displayMessage: _angular_core.Signal<string>;
413
+ protected inputId: _angular_core.Signal<string>;
414
+ protected messageId: _angular_core.Signal<string>;
415
+ protected iconSize: _angular_core.Signal<CoarIconSize>;
416
+ protected showIncrementButton: _angular_core.Signal<boolean>;
417
+ protected showDecrementButton: _angular_core.Signal<boolean>;
418
+ protected canDecrement: _angular_core.Signal<boolean>;
419
+ protected canIncrement: _angular_core.Signal<boolean>;
420
+ constructor();
421
+ /**
422
+ * Resolve number format configuration with priority chain:
423
+ * 1. numberFormat input (explicit config object)
424
+ * 2. localeService.getNumberFormat(locale) (service with locale override)
425
+ * 3. localeService.getNumberFormat() (service with default locale)
426
+ * 4. Hardcoded fallback { decimal: '.', thousand: '' }
427
+ */
428
+ private resolveNumberFormat;
429
+ private initializeMaskito;
430
+ protected formatValue(value: number | null): string;
431
+ /**
432
+ * Parse locale-formatted string (respects component's decimal/thousand separators).
433
+ * Used when user types or pastes into the input field.
434
+ */
435
+ protected parseValue(str: string): number | null;
436
+ protected clampValue(value: number): number;
437
+ protected onInput(event: Event): void;
438
+ protected onFocus(event: FocusEvent): void;
439
+ protected onBlur(event: FocusEvent): void;
440
+ protected commitValue(): void;
441
+ writeValue(value: number | null): void;
442
+ protected onClear(): void;
443
+ protected onLabelClick(): void;
444
+ protected increment(): void;
445
+ protected decrement(): void;
446
+ protected onKeyDown(event: KeyboardEvent): void;
447
+ protected onDragStart(event: MouseEvent): void;
448
+ protected onDragMove(event: MouseEvent): void;
449
+ protected onDragEnd(): void;
450
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarNumberInputComponent, never>;
451
+ 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>;
452
+ }
453
+
454
+ type CoarPasswordInputSize = 'xs' | 'sm' | 'md' | 'lg';
455
+ declare class CoarPasswordInputComponent extends CoarControlValueAccessor<string> {
456
+ /** Label text displayed above the input */
457
+ label: _angular_core.InputSignal<string>;
458
+ /** Placeholder text shown when input is empty */
459
+ placeholder: _angular_core.InputSignal<string>;
460
+ /**
461
+ * Current password value.
462
+ * Using model() for two-way binding support.
463
+ */
464
+ value: _angular_core.ModelSignal<string>;
465
+ /** Input size - matches other form elements for consistent layouts */
466
+ size: _angular_core.InputSignal<CoarPasswordInputSize>;
467
+ /** Disables the input (greyed out, not focusable) */
468
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
469
+ /** Makes the input read-only (focusable but not editable) */
470
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
471
+ /** Marks the input as required, shows asterisk on label */
472
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
473
+ /** Error message to display below the input */
474
+ error: _angular_core.InputSignal<string>;
475
+ /** Hint text displayed below the input */
476
+ hint: _angular_core.InputSignal<string>;
477
+ /** Show clear button when input has value and is focused/hovered */
478
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
479
+ /** HTML id attribute for the input element */
480
+ id: _angular_core.InputSignal<string>;
481
+ /** HTML name attribute for form submission */
482
+ name: _angular_core.InputSignal<string>;
483
+ /** HTML autocomplete attribute for browser autofill */
484
+ autocomplete: _angular_core.InputSignal<string>;
485
+ /** Maximum character length */
486
+ maxlength: _angular_core.InputSignal<number | undefined>;
487
+ /** Emits when password value changes */
488
+ valueChange: _angular_core.OutputEmitterRef<string>;
489
+ /** Emits when input loses focus */
490
+ blurred: _angular_core.OutputEmitterRef<FocusEvent>;
491
+ /** Emits when input gains focus */
492
+ focused: _angular_core.OutputEmitterRef<FocusEvent>;
493
+ /** Emits when clear button is clicked */
494
+ clear: _angular_core.OutputEmitterRef<void>;
495
+ protected isFocused: _angular_core.WritableSignal<boolean>;
496
+ protected showPassword: _angular_core.WritableSignal<boolean>;
497
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
498
+ protected inputType: _angular_core.Signal<"text" | "password">;
499
+ protected toggleIcon: _angular_core.Signal<"eye-open" | "eye-closed">;
500
+ protected toggleAriaLabel: _angular_core.Signal<"Hide password" | "Show password">;
501
+ protected isDisabled: _angular_core.Signal<boolean>;
502
+ protected showClearButton: _angular_core.Signal<boolean>;
503
+ protected hasError: _angular_core.Signal<boolean>;
504
+ protected displayMessage: _angular_core.Signal<string>;
505
+ protected inputId: _angular_core.Signal<string>;
506
+ protected messageId: _angular_core.Signal<string>;
507
+ writeValue(value: string | null): void;
508
+ protected onInput(event: Event): void;
509
+ protected onFocus(event: FocusEvent): void;
510
+ protected onBlur(event: FocusEvent): void;
511
+ protected onClear(): void;
512
+ protected onLabelClick(): void;
513
+ protected togglePasswordVisibility(): void;
514
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPasswordInputComponent, never>;
515
+ 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>;
516
+ }
517
+
518
+ type CoarCheckboxSize = 'xs' | 'sm' | 'md' | 'lg';
519
+ type CoarCheckboxState = 'checked' | 'unchecked' | 'indeterminate';
520
+ declare class CoarCheckboxComponent extends CoarControlValueAccessor<CoarCheckboxState | undefined> {
521
+ /** Label text displayed next to the checkbox */
522
+ label: _angular_core.InputSignal<string>;
523
+ /**
524
+ * Checkbox state: 'checked', 'unchecked', 'indeterminate', or undefined (pristine).
525
+ * Using model() for two-way binding support.
526
+ */
527
+ checked: _angular_core.ModelSignal<CoarCheckboxState | undefined>;
528
+ /** Disables the checkbox (greyed out, not focusable) */
529
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
530
+ /** Prevents changes but keeps normal appearance and focus */
531
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
532
+ /** Marks as required, shows asterisk on label */
533
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
534
+ /** Error message to display below the checkbox */
535
+ error: _angular_core.InputSignal<string>;
536
+ /** Hint text displayed below the checkbox */
537
+ hint: _angular_core.InputSignal<string>;
538
+ /** Checkbox size - matches input/button heights for consistent layouts */
539
+ size: _angular_core.InputSignal<CoarCheckboxSize>;
540
+ /** HTML id attribute for the checkbox element */
541
+ id: _angular_core.InputSignal<string>;
542
+ /** HTML name attribute for form submission */
543
+ name: _angular_core.InputSignal<string>;
544
+ /** Value submitted with form when checked */
545
+ value: _angular_core.InputSignal<string>;
546
+ /** Emits when state changes: 'checked' or 'unchecked' */
547
+ checkedChange: _angular_core.OutputEmitterRef<CoarCheckboxState>;
548
+ protected isFocused: _angular_core.WritableSignal<boolean>;
549
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
550
+ protected isDisabled: _angular_core.Signal<boolean>;
551
+ protected isChecked: _angular_core.Signal<boolean>;
552
+ protected isIndeterminate: _angular_core.Signal<boolean>;
553
+ protected hasError: _angular_core.Signal<boolean>;
554
+ protected displayMessage: _angular_core.Signal<string>;
555
+ protected inputId: _angular_core.Signal<string>;
556
+ protected messageId: _angular_core.Signal<string>;
557
+ constructor();
558
+ writeValue(value: CoarCheckboxState | undefined | null): void;
559
+ protected onChange(event: Event): void;
560
+ protected onFocus(): void;
561
+ protected onBlur(): void;
562
+ protected onLabelClick(): void;
563
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarCheckboxComponent, never>;
564
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarCheckboxComponent, "coar-checkbox", 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; }; "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"; "checkedChange": "checkedChange"; }, never, never, true, never>;
565
+ }
566
+
567
+ /**
568
+ * Theme options for the scrollbar appearance.
569
+ * - 'dark': Dark scrollbar theme (default)
570
+ * - 'light': Light scrollbar theme
571
+ */
572
+ type CoarScrollbarTheme = 'dark' | 'light';
573
+ /**
574
+ * Auto-hide behavior for the scrollbar.
575
+ * - 'never': Scrollbars are always visible
576
+ * - 'scroll': Scrollbars hide when not scrolling
577
+ * - 'leave': Scrollbars hide when pointer leaves the element
578
+ * - 'move': Scrollbars hide when pointer stops moving
579
+ */
580
+ type CoarScrollbarAutoHide = 'never' | 'scroll' | 'leave' | 'move';
581
+ /**
582
+ * Overflow behavior for each axis.
583
+ * - 'hidden': Content is clipped, no scrollbar
584
+ * - 'scroll': Always show scrollbar
585
+ * - 'visible-hidden': Content visible but no scrollbar
586
+ * - 'visible-scroll': Content visible with scrollbar
587
+ */
588
+ type CoarScrollbarOverflow = 'hidden' | 'scroll' | 'visible-hidden' | 'visible-scroll';
589
+ /**
590
+ * Directive that applies custom overlay scrollbars to an element.
591
+ *
592
+ * Uses OverlayScrollbars library to replace native scrollbars with
593
+ * styleable overlay scrollbars while preserving native scroll behavior.
594
+ *
595
+ * @example
596
+ * ```html
597
+ * <!-- Basic usage -->
598
+ * <div coarScrollbar>Scrollable content</div>
599
+ *
600
+ * <!-- With options -->
601
+ * <div coarScrollbar [theme]="'light'" [autoHide]="'scroll'">
602
+ * Scrollable content
603
+ * </div>
604
+ *
605
+ * <!-- Horizontal only -->
606
+ * <div coarScrollbar [overflowX]="'scroll'" [overflowY]="'hidden'">
607
+ * Horizontal scrollable content
608
+ * </div>
609
+ * ```
610
+ */
611
+ declare class CoarScrollbarDirective implements AfterViewInit, OnDestroy {
612
+ private readonly elementRef;
613
+ private readonly ngZone;
614
+ /** Theme for scrollbar appearance */
615
+ readonly theme: _angular_core.InputSignal<CoarScrollbarTheme>;
616
+ /** Auto-hide behavior for scrollbars */
617
+ readonly autoHide: _angular_core.InputSignal<CoarScrollbarAutoHide>;
618
+ /** Delay in ms before auto-hide triggers */
619
+ readonly autoHideDelay: _angular_core.InputSignal<number>;
620
+ /** Whether clicking the track scrolls to that position */
621
+ readonly clickScroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
622
+ /** Overflow behavior for x-axis */
623
+ readonly overflowX: _angular_core.InputSignal<CoarScrollbarOverflow>;
624
+ /** Overflow behavior for y-axis */
625
+ readonly overflowY: _angular_core.InputSignal<CoarScrollbarOverflow>;
626
+ /** Whether to defer initialization until browser is idle */
627
+ readonly defer: _angular_core.InputSignalWithTransform<boolean, unknown>;
628
+ /**
629
+ * Overscroll behavior to prevent scroll chaining to parent elements.
630
+ * - 'auto': Default browser behavior (scroll chains to parent)
631
+ * - 'contain': Prevents scroll chaining when reaching scroll boundaries
632
+ * - 'none': Prevents scroll chaining and disables bounce effects
633
+ */
634
+ readonly overscrollBehavior: _angular_core.InputSignal<"auto" | "none" | "contain">;
635
+ private osInstance;
636
+ private initialized;
637
+ constructor();
638
+ ngAfterViewInit(): void;
639
+ ngOnDestroy(): void;
640
+ /**
641
+ * Returns the OverlayScrollbars instance or null if not initialized.
642
+ */
643
+ getInstance(): OverlayScrollbars | null;
644
+ /**
645
+ * Scrolls to the specified position.
646
+ */
647
+ scrollTo(options: {
648
+ x?: number;
649
+ y?: number;
650
+ }): void;
651
+ /**
652
+ * Scrolls to the bottom of the scrollable content.
653
+ */
654
+ scrollToBottom(): void;
655
+ /**
656
+ * Scrolls to the top of the scrollable content.
657
+ */
658
+ scrollToTop(): void;
659
+ /**
660
+ * Updates the scrollbar (useful after dynamic content changes).
661
+ */
662
+ update(): void;
663
+ private deferInitialization;
664
+ private initialize;
665
+ private buildOptions;
666
+ private destroy;
667
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarScrollbarDirective, never>;
668
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarScrollbarDirective, "[coarScrollbar]", never, { "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>;
669
+ }
670
+
671
+ /**
672
+ * Represents a selectable option in select components.
673
+ *
674
+ * @template T - The type of the option value
675
+ */
676
+ interface CoarSelectOption<T = unknown> {
677
+ /** The value stored when this option is selected */
678
+ value: T;
679
+ /** The display label shown in the dropdown and selected state */
680
+ label: string;
681
+ /** Whether this option is disabled and cannot be selected */
682
+ disabled?: boolean;
683
+ /** Optional group this option belongs to (for grouped options) */
684
+ group?: string;
685
+ /** Optional icon to display next to the label */
686
+ icon?: string;
687
+ }
688
+
689
+ type CoarSelectSize = 'xs' | 'sm' | 'md' | 'lg';
690
+ /** Dropdown position relative to the trigger */
691
+ type CoarDropdownPosition = 'top' | 'bottom';
692
+ /**
693
+ * Base class providing shared functionality for all select components.
694
+ * Handles dropdown state, keyboard navigation, and common styling.
695
+ * Subclasses override openDropdown() to use the overlay system.
696
+ */
697
+ declare abstract class CoarSelectBase<T> extends CoarControlValueAccessor<T> {
698
+ protected readonly elementRef: ElementRef<any>;
699
+ protected readonly destroyRef: DestroyRef;
700
+ /** Label text displayed above the select */
701
+ label: _angular_core.InputSignal<string>;
702
+ /** Placeholder text shown when no option is selected */
703
+ placeholder: _angular_core.InputSignal<string>;
704
+ /** Available options to choose from */
705
+ options: _angular_core.InputSignal<CoarSelectOption<unknown>[]>;
706
+ /** Select size - matches button/input heights for consistent layouts */
707
+ size: _angular_core.InputSignal<CoarSelectSize>;
708
+ /** Disables the select (greyed out, not focusable) */
709
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
710
+ /** Makes the select read-only (focusable but not editable) */
711
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
712
+ /** Marks the select as required, shows asterisk on label */
713
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
714
+ /** Error message to display below the select */
715
+ error: _angular_core.InputSignal<string>;
716
+ /** Hint text displayed below the select */
717
+ hint: _angular_core.InputSignal<string>;
718
+ /** HTML id attribute for the select element */
719
+ id: _angular_core.InputSignal<string>;
720
+ /** HTML name attribute for form submission */
721
+ name: _angular_core.InputSignal<string>;
722
+ /** Enable search/filter functionality within the dropdown */
723
+ searchable: _angular_core.InputSignalWithTransform<boolean, unknown>;
724
+ /** Search input placeholder when searchable is enabled */
725
+ searchPlaceholder: _angular_core.InputSignal<string>;
726
+ /**
727
+ * Comparison function to match values with options.
728
+ * Use this when value objects come from different sources (e.g., API vs form).
729
+ *
730
+ * @example
731
+ * ```typescript
732
+ * // Compare Country objects by their ID
733
+ * compareById = (a: Country | null, b: Country | null) => a?.id === b?.id;
734
+ * ```
735
+ */
736
+ compareWith: _angular_core.InputSignal<((o1: unknown, o2: unknown) => boolean) | undefined>;
737
+ /** Force dropdown position ('auto' calculates based on available space) */
738
+ dropdownPositionPreference: _angular_core.InputSignal<"auto" | "top" | "bottom">;
739
+ /** Reference to the scrollbar directive for scroll control */
740
+ protected scrollbarRef: _angular_core.Signal<CoarScrollbarDirective | undefined>;
741
+ /** Reference to the options list container for scroll-into-view */
742
+ protected optionsListRef: _angular_core.Signal<ElementRef<HTMLDivElement> | undefined>;
743
+ /** Reference to the search input for focusing (when searchable) */
744
+ protected searchInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
745
+ /** DOM id for the dropdown search input (when searchable). */
746
+ protected searchInputId: _angular_core.Signal<string>;
747
+ /** Whether the dropdown is currently open */
748
+ protected isOpen: _angular_core.WritableSignal<boolean>;
749
+ /** Whether the select is focused */
750
+ protected isFocused: _angular_core.WritableSignal<boolean>;
751
+ /** Current search/filter query */
752
+ protected searchQuery: _angular_core.WritableSignal<string>;
753
+ /** Currently highlighted option index for keyboard navigation */
754
+ protected highlightedIndex: _angular_core.WritableSignal<number>;
755
+ /** Current dropdown position */
756
+ protected dropdownPosition: _angular_core.WritableSignal<CoarDropdownPosition>;
757
+ /** Combined disabled state from input and CVA */
758
+ protected isDisabled: _angular_core.Signal<boolean>;
759
+ /** Whether there's an error to display */
760
+ protected hasError: _angular_core.Signal<boolean>;
761
+ /** Message to display (error takes priority over hint) */
762
+ protected displayMessage: _angular_core.Signal<string>;
763
+ /** Generated unique ID for the select element */
764
+ protected inputId: _angular_core.Signal<string>;
765
+ /** ID for the message element (for aria-describedby) */
766
+ protected messageId: _angular_core.Signal<string>;
767
+ /** ID for the listbox element */
768
+ protected listboxId: _angular_core.Signal<string>;
769
+ /** Filtered options based on search query */
770
+ protected filteredOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
771
+ /**
772
+ * Options for display, reversed when dropdown opens to top.
773
+ * This ensures the first option is always nearest to the trigger.
774
+ */
775
+ protected displayOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
776
+ /**
777
+ * Check if a display index is highlighted.
778
+ * When reversed, converts display index to data index.
779
+ */
780
+ protected isHighlighted(displayIndex: number): boolean;
781
+ /**
782
+ * Set highlight from display index.
783
+ * When reversed, converts display index to data index.
784
+ */
785
+ protected setHighlightFromDisplay(displayIndex: number): void;
786
+ constructor();
787
+ /** Toggle dropdown open/closed state */
788
+ protected toggleDropdown(): void;
789
+ /**
790
+ * Open the dropdown.
791
+ * Subclasses MUST override this method to implement overlay-based dropdown.
792
+ */
793
+ protected openDropdown(): void;
794
+ /**
795
+ * Close the dropdown.
796
+ * Subclasses MUST override this method to implement overlay-based dropdown.
797
+ */
798
+ protected closeDropdown(): void;
799
+ /** Handle keyboard navigation */
800
+ protected onKeyDown(event: KeyboardEvent): void;
801
+ /** Move highlight to the next available option */
802
+ protected highlightNextOption(): void;
803
+ /** Move highlight to the previous available option */
804
+ protected highlightPreviousOption(): void;
805
+ /** Move highlight to the first available option */
806
+ protected highlightFirstOption(): void;
807
+ /** Move highlight to the last available option */
808
+ protected highlightLastOption(): void;
809
+ /** Scroll the highlighted option into view */
810
+ protected scrollToHighlighted(): void;
811
+ protected focusSearchInput(): void;
812
+ protected scrollOptionsToBottom(): void;
813
+ protected getOptionsListElement(): HTMLDivElement | null;
814
+ /**
815
+ * CSS selector for the highlighted option element.
816
+ * Each component defines its own selector based on its CSS class naming.
817
+ */
818
+ protected abstract get highlightedOptionSelector(): string;
819
+ /** Handle focus event */
820
+ protected onFocus(): void;
821
+ /** Handle blur event */
822
+ protected onBlur(): void;
823
+ /** Handle search input changes */
824
+ protected onSearchInput(event: Event): void;
825
+ /** Whether this select should close on document clicks outside its host element. */
826
+ protected shouldCloseOnOutsideClick(): boolean;
827
+ /** Setup click outside handler to close dropdown. */
828
+ protected installOutsideClickHandler(): void;
829
+ /** Abstract method to select the currently highlighted option */
830
+ protected abstract selectHighlightedOption(): void;
831
+ /** Abstract method to get the display text for the current selection */
832
+ abstract getDisplayText(): string;
833
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSelectBase<any>, never>;
834
+ 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; }; "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>;
835
+ }
836
+
837
+ /**
838
+ * Single-select dropdown component.
839
+ *
840
+ * Allows selecting one option from a list with keyboard navigation,
841
+ * search/filter support, and full forms integration.
842
+ *
843
+ * @example
844
+ * ```html
845
+ * <coar-single-select
846
+ * label="Country"
847
+ * [options]="countries"
848
+ * [(value)]="selectedCountry"
849
+ * placeholder="Select a country"
850
+ * />
851
+ * ```
852
+ */
853
+ declare class CoarSingleSelectComponent<T = unknown> extends CoarSelectBase<T | null> {
854
+ private readonly overlayService;
855
+ private readonly destroyRefLocal;
856
+ private readonly triggerRef;
857
+ private readonly dropdownTemplateRef;
858
+ private overlayRef;
859
+ /** Current selected value (two-way bindable with [(value)]) */
860
+ value: _angular_core.ModelSignal<T | null>;
861
+ /** Whether to show a clear button when a value is selected */
862
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
863
+ /** Emits when the selected value changes */
864
+ valueChange: _angular_core.OutputEmitterRef<T | null>;
865
+ /** CSS selector for highlighted option (used by base class scrollToHighlighted) */
866
+ protected get highlightedOptionSelector(): string;
867
+ /** The currently selected option object */
868
+ protected selectedOption: _angular_core.Signal<CoarSelectOption<unknown> | null>;
869
+ /** Whether to show the clear button */
870
+ protected showClearButton: _angular_core.Signal<boolean>;
871
+ /** Display text for the current selection */
872
+ getDisplayText(): string;
873
+ /** Write value from forms API */
874
+ writeValue(value: T | null): void;
875
+ /** Select an option by its value */
876
+ selectOption(option: CoarSelectOption<T>): void;
877
+ /** Select the currently highlighted option */
878
+ protected selectHighlightedOption(): void;
879
+ /** Clear the current selection */
880
+ protected clearSelection(event: Event): void;
881
+ /** Check if an option is currently selected */
882
+ protected isSelected(option: CoarSelectOption): boolean;
883
+ protected shouldCloseOnOutsideClick(): boolean;
884
+ protected openDropdown(): void;
885
+ protected closeDropdown(): void;
886
+ private resolvePlacement;
887
+ private estimatePanelHeight;
888
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSingleSelectComponent<any>, never>;
889
+ 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>;
890
+ }
891
+
892
+ /**
893
+ * Multi-select dropdown component.
894
+ *
895
+ * Allows selecting multiple options from a list with checkboxes,
896
+ * keyboard navigation, search/filter support, and full forms integration.
897
+ *
898
+ * @example
899
+ * ```html
900
+ * <coar-multi-select
901
+ * label="Skills"
902
+ * [options]="skills"
903
+ * [(value)]="selectedSkills"
904
+ * placeholder="Select skills..."
905
+ * />
906
+ * ```
907
+ */
908
+ declare class CoarMultiSelectComponent<T = unknown> extends CoarSelectBase<T[]> {
909
+ private readonly overlayService;
910
+ private readonly triggerRef;
911
+ private readonly dropdownTemplateRef;
912
+ private overlayRef;
913
+ /** Current selected values (two-way bindable with [(value)]) */
914
+ value: _angular_core.ModelSignal<T[]>;
915
+ /** Whether to show a clear button when values are selected */
916
+ clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
917
+ /** Maximum number of selected items to display before showing count */
918
+ maxDisplayItems: _angular_core.InputSignal<number>;
919
+ /** Whether to show "Select All" option */
920
+ showSelectAll: _angular_core.InputSignalWithTransform<boolean, unknown>;
921
+ /** Emits when the selected values change */
922
+ valueChange: _angular_core.OutputEmitterRef<T[]>;
923
+ /** CSS selector for highlighted option (used by base class scrollToHighlighted) */
924
+ protected get highlightedOptionSelector(): string;
925
+ /** The currently selected option objects */
926
+ protected selectedOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
927
+ /** Whether to show the clear button */
928
+ protected showClearButton: _angular_core.Signal<boolean>;
929
+ /** Whether all options are selected */
930
+ protected allSelected: _angular_core.Signal<boolean>;
931
+ /** Whether some but not all options are selected */
932
+ protected someSelected: _angular_core.Signal<boolean>;
933
+ /** Display text for the current selection */
934
+ getDisplayText(): string;
935
+ /** Write value from forms API */
936
+ writeValue(value: T[] | null): void;
937
+ /** Toggle selection of an option */
938
+ toggleOption(option: CoarSelectOption<T>, event?: Event): void;
939
+ /** Select the currently highlighted option */
940
+ protected selectHighlightedOption(): void;
941
+ /** Toggle all options */
942
+ protected toggleAll(event?: Event): void;
943
+ /** Clear all selections */
944
+ protected clearSelection(event: Event): void;
945
+ /** Check if an option is currently selected */
946
+ protected isSelected(option: CoarSelectOption): boolean;
947
+ /** Handle keyboard for multi-select (space toggles instead of closing) */
948
+ protected onKeyDown(event: KeyboardEvent): void;
949
+ protected shouldCloseOnOutsideClick(): boolean;
950
+ protected openDropdown(): void;
951
+ protected closeDropdown(): void;
952
+ private resolvePlacement;
953
+ private estimatePanelHeight;
954
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMultiSelectComponent<any>, never>;
955
+ 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>;
956
+ }
957
+
958
+ /**
959
+ * Tag-based multi-select component.
960
+ *
961
+ * Displays selected items as removable tag chips with support for
962
+ * creating new tags on-the-fly (optional), keyboard navigation,
963
+ * and full forms integration.
964
+ *
965
+ * @example
966
+ * ```html
967
+ * <coar-tag-select
968
+ * label="Tags"
969
+ * [options]="availableTags"
970
+ * [(value)]="selectedTags"
971
+ * [allowCreate]="true"
972
+ * placeholder="Add tags..."
973
+ * />
974
+ * ```
975
+ */
976
+ declare class CoarTagSelectComponent<T = string> extends CoarSelectBase<T[]> {
977
+ private readonly overlayService;
978
+ private readonly triggerRef;
979
+ private readonly dropdownTemplateRef;
980
+ private overlayRef;
981
+ /** Current selected values (two-way bindable with [(value)]) */
982
+ value: _angular_core.ModelSignal<T[]>;
983
+ /** Allow creating new tags that don't exist in options */
984
+ allowCreate: _angular_core.InputSignalWithTransform<boolean, unknown>;
985
+ /** Maximum number of tags that can be selected (0 = unlimited) */
986
+ maxTags: _angular_core.InputSignal<number>;
987
+ /** Text shown when creating a new tag */
988
+ createPrefix: _angular_core.InputSignal<string>;
989
+ /** Emits when the selected values change */
990
+ valueChange: _angular_core.OutputEmitterRef<T[]>;
991
+ /** Emits when a new tag is created */
992
+ tagCreated: _angular_core.OutputEmitterRef<T>;
993
+ /**
994
+ * Reference to the inline search input (tag-select uses inline input, not dropdown search).
995
+ * This is separate from the base class searchInputRef.
996
+ */
997
+ protected inlineInputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
998
+ /** CSS selector for highlighted option (used by base class scrollToHighlighted) */
999
+ protected get highlightedOptionSelector(): string;
1000
+ /** The currently selected option objects */
1001
+ protected selectedOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
1002
+ /** Available options that aren't already selected */
1003
+ protected availableOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
1004
+ /**
1005
+ * Available options for display, reversed when dropdown opens to top.
1006
+ * This ensures the first option is always nearest to the trigger.
1007
+ */
1008
+ protected displayAvailableOptions: _angular_core.Signal<CoarSelectOption<unknown>[]>;
1009
+ /**
1010
+ * Check if a display index is highlighted (for availableOptions).
1011
+ * When reversed, converts display index to data index.
1012
+ */
1013
+ protected isAvailableHighlighted(displayIndex: number): boolean;
1014
+ /**
1015
+ * Set highlight from display index (for availableOptions).
1016
+ * When reversed, converts display index to data index.
1017
+ */
1018
+ protected setAvailableHighlightFromDisplay(displayIndex: number): void;
1019
+ /** Whether the max tags limit has been reached */
1020
+ protected maxReached: _angular_core.Signal<boolean>;
1021
+ /** Whether to show the "Create" option */
1022
+ protected showCreateOption: _angular_core.Signal<boolean>;
1023
+ /** Display text for the current selection */
1024
+ getDisplayText(): string;
1025
+ /** Write value from forms API */
1026
+ writeValue(value: T[] | null): void;
1027
+ /** Add a tag from an option */
1028
+ addTag(option: CoarSelectOption<T>): void;
1029
+ /** Remove a tag by value */
1030
+ removeTag(tagValue: T, event?: Event): void;
1031
+ /** Create a new tag from the search query */
1032
+ protected createTag(): void;
1033
+ /** Select the currently highlighted option */
1034
+ protected selectHighlightedOption(): void;
1035
+ /** Handle keyboard for tag-select */
1036
+ protected onKeyDown(event: KeyboardEvent): void;
1037
+ /** Handle input changes */
1038
+ protected onInputChange(event: Event): void;
1039
+ /** Focus the inline input */
1040
+ protected focusInput(): void;
1041
+ /** Handle input focus */
1042
+ protected onInputFocus(): void;
1043
+ /** Handle input blur */
1044
+ protected onInputBlur(): void;
1045
+ /** Override to calculate highlighted index including create option */
1046
+ protected highlightNextOption(): void;
1047
+ /** Scroll highlighted option into view */
1048
+ protected scrollToHighlighted(): void;
1049
+ protected shouldCloseOnOutsideClick(): boolean;
1050
+ protected openDropdown(): void;
1051
+ protected closeDropdown(): void;
1052
+ private resolvePlacement;
1053
+ private estimatePanelHeight;
1054
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTagSelectComponent<any>, never>;
1055
+ 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>;
1056
+ }
1057
+
1058
+ /**
1059
+ * Service for loading and caching icons from both built-in registry and customer uploads.
1060
+ *
1061
+ * Built-in icons are stored in memory and returned immediately.
1062
+ * Customer icons are fetched from the API and cached after first request.
1063
+ */
1064
+ declare class CoarIconService {
1065
+ private readonly http;
1066
+ private customerIconCache;
1067
+ /**
1068
+ * Get an icon by name. Handles both built-in and customer icons.
1069
+ *
1070
+ * @param name - Icon identifier (e.g., "settings" or "customer:invoicePaid")
1071
+ * @returns Observable of SVG string, or null if not found
1072
+ */
1073
+ getIcon(name: string): Observable<string | null>;
1074
+ /**
1075
+ * Parse icon name into source type and key.
1076
+ *
1077
+ * Examples:
1078
+ * - "settings" -> { source: "builtin", key: "settings" }
1079
+ * - "customer:invoicePaid" -> { source: "customer", key: "invoicePaid" }
1080
+ */
1081
+ private parseIconName;
1082
+ /**
1083
+ * Get a built-in icon from the in-memory registry.
1084
+ */
1085
+ private getBuiltInIcon;
1086
+ /**
1087
+ * Get a customer icon from the API, with caching.
1088
+ * Uses shareReplay(1) to ensure only one network request per icon.
1089
+ */
1090
+ private getCustomerIcon;
1091
+ /**
1092
+ * Clear the customer icon cache.
1093
+ * Useful when icons are updated on the server.
1094
+ */
1095
+ clearCache(): void;
1096
+ /**
1097
+ * Clear a specific icon from the cache.
1098
+ */
1099
+ clearIconCache(name: string): void;
1100
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarIconService, never>;
1101
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CoarIconService>;
1102
+ }
1103
+
1104
+ /**
1105
+ * Loading strategy for tab content:
1106
+ * - 'lazy': Content is only rendered when tab is active (default)
1107
+ * - 'eager': Content is always rendered, hidden when inactive
1108
+ */
1109
+ type TabLoadingStrategy = 'eager' | 'lazy';
1110
+ /**
1111
+ * Content type that can be passed to a tab.
1112
+ * Either a TemplateRef (from ng-template) or a Component class.
1113
+ */
1114
+ type TabContent = TemplateRef<unknown> | Type<unknown>;
1115
+ /**
1116
+ * Individual tab definition for use within CoarTabGroup.
1117
+ *
1118
+ * The tab label is provided as content projected into the component.
1119
+ * This allows simple text, icons, badges, or any custom HTML.
1120
+ *
1121
+ * @example Simple text label
1122
+ * ```html
1123
+ * <coar-tab id="home" [content]="homeTemplate">Home</coar-tab>
1124
+ * ```
1125
+ *
1126
+ * @example With icon
1127
+ * ```html
1128
+ * <coar-tab id="settings" [content]="SettingsComponent">⚙️ Settings</coar-tab>
1129
+ * ```
1130
+ *
1131
+ * @example Rich label with badge
1132
+ * ```html
1133
+ * <coar-tab id="messages" [content]="messagesTemplate">
1134
+ * Messages <span class="badge">5</span>
1135
+ * </coar-tab>
1136
+ * ```
1137
+ */
1138
+ declare class CoarTabComponent {
1139
+ /** Unique identifier for the tab */
1140
+ id: _angular_core.InputSignal<string>;
1141
+ /** Whether the tab is disabled */
1142
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1143
+ /**
1144
+ * The content to display in the tab panel.
1145
+ * Can be either a TemplateRef (from ng-template) or a Component class.
1146
+ */
1147
+ content: _angular_core.InputSignal<TabContent>;
1148
+ /**
1149
+ * Inputs to pass when content is a Component.
1150
+ * Ignored when content is a TemplateRef.
1151
+ */
1152
+ contentInputs: _angular_core.InputSignal<Record<string, unknown>>;
1153
+ /**
1154
+ * Loading strategy for the tab content.
1155
+ * - 'lazy' (default): Content is only rendered when tab becomes active
1156
+ * - 'eager': Content is always rendered, just hidden when inactive
1157
+ */
1158
+ loadingStrategy: _angular_core.InputSignal<TabLoadingStrategy>;
1159
+ /** Template reference for the projected label content */
1160
+ labelTemplate: _angular_core.Signal<TemplateRef<unknown>>;
1161
+ /**
1162
+ * Whether the content is a Component (vs a TemplateRef)
1163
+ */
1164
+ get isComponent(): boolean;
1165
+ /**
1166
+ * Get content as TemplateRef (returns null if it's a component)
1167
+ */
1168
+ get templateContent(): TemplateRef<unknown> | null;
1169
+ /**
1170
+ * Get content as Component type (returns null if it's a template)
1171
+ */
1172
+ get componentContent(): Type<unknown> | null;
1173
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTabComponent, never>;
1174
+ 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>;
1175
+ }
1176
+
1177
+ declare class CoarTabGroupComponent implements AfterContentInit {
1178
+ /** The currently active tab id */
1179
+ activeTab: _angular_core.InputSignal<string>;
1180
+ /** Emits when the active tab changes */
1181
+ activeTabChange: _angular_core.OutputEmitterRef<string>;
1182
+ /** All tab components projected into this group */
1183
+ tabs: _angular_core.Signal<readonly CoarTabComponent[]>;
1184
+ /** Internal active tab state */
1185
+ protected internalActiveTab: _angular_core.WritableSignal<string>;
1186
+ constructor();
1187
+ ngAfterContentInit(): void;
1188
+ /** Check if a tab is currently active */
1189
+ isActive(tabId: string): boolean;
1190
+ /**
1191
+ * Determines whether the content of a tab should be rendered.
1192
+ * - For 'eager' strategy: always render (content stays in DOM)
1193
+ * - For 'lazy' strategy: only render when active
1194
+ */
1195
+ shouldRenderContent(tab: CoarTabComponent): boolean;
1196
+ /** Select a tab by its id */
1197
+ selectTab(tabId: string): void;
1198
+ /** Handle keyboard navigation */
1199
+ onKeydown(event: KeyboardEvent, currentTabId: string): void;
1200
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTabGroupComponent, never>;
1201
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTabGroupComponent, "coar-tab-group", never, { "activeTab": { "alias": "activeTab"; "required": false; "isSignal": true; }; }, { "activeTabChange": "activeTabChange"; }, ["tabs"], never, true, never>;
1202
+ }
1203
+
1204
+ declare class CoarCodeBlockComponent {
1205
+ private readonly injector;
1206
+ /** The code to display */
1207
+ code: _angular_core.InputSignal<string>;
1208
+ /** Language for syntax highlighting */
1209
+ language: _angular_core.InputSignal<string>;
1210
+ /** Title/label for the code block */
1211
+ title: _angular_core.InputSignal<string>;
1212
+ /** Whether the code block can be collapsed */
1213
+ collapsible: _angular_core.InputSignalWithTransform<boolean, unknown>;
1214
+ /** Whether the code block starts collapsed */
1215
+ collapsed: _angular_core.InputSignalWithTransform<boolean, unknown>;
1216
+ /** Whether to show the copy button */
1217
+ showCopy: _angular_core.InputSignalWithTransform<boolean, unknown>;
1218
+ /** Whether to show line numbers */
1219
+ showLineNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
1220
+ /** Maximum height before scrolling (0 = no limit) */
1221
+ maxHeight: _angular_core.InputSignal<number>;
1222
+ /** Internal collapsed state */
1223
+ protected isCollapsed: _angular_core.WritableSignal<boolean>;
1224
+ /** Copy feedback state */
1225
+ protected copyFeedback: _angular_core.WritableSignal<"error" | "idle" | "copied">;
1226
+ /** Highlighted code HTML */
1227
+ protected highlightedCode: _angular_core.Signal<string>;
1228
+ /** Highlighted code split by line for optional line-number rendering */
1229
+ protected highlightedLines: _angular_core.Signal<string[]>;
1230
+ constructor();
1231
+ /** Map common language aliases to Prism language names */
1232
+ private mapLanguage;
1233
+ /** Escape HTML for plain text fallback */
1234
+ private escapeHtml;
1235
+ /** Toggle collapsed state */
1236
+ toggleCollapsed(): void;
1237
+ /** Copy code to clipboard */
1238
+ copyCode(): Promise<void>;
1239
+ /** Get lines for line numbers */
1240
+ get lines(): number[];
1241
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarCodeBlockComponent, never>;
1242
+ 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; }; "showLineNumbers": { "alias": "showLineNumbers"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1243
+ }
1244
+
1245
+ type CardColor = 'neutral' | 'success' | 'warning' | 'error' | 'info' | 'accent';
1246
+ type CardPadding = 'none' | 'sm' | 'md' | 'lg';
1247
+ declare class CoarCardComponent {
1248
+ /**
1249
+ * Adds a box-shadow for elevation/depth.
1250
+ * Use as boolean attribute: `<coar-card elevated>` or `[elevated]="true"`
1251
+ */
1252
+ elevated: _angular_core.InputSignalWithTransform<boolean, unknown>;
1253
+ /**
1254
+ * Removes the border from the card, leaving only background color.
1255
+ * By default (false), cards have a visible border matching their color.
1256
+ * Use as boolean attribute: `<coar-card borderless>` or `[borderless]="true"`
1257
+ */
1258
+ borderless: _angular_core.InputSignalWithTransform<boolean, unknown>;
1259
+ /** Card color scheme */
1260
+ color: _angular_core.InputSignal<CardColor>;
1261
+ /** Card padding size */
1262
+ padding: _angular_core.InputSignal<CardPadding>;
1263
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarCardComponent, never>;
1264
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarCardComponent, "coar-card", never, { "elevated": { "alias": "elevated"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["[coar-card-header]", "*", "[coar-card-footer]"], true, never>;
1265
+ }
1266
+
1267
+ type NoteColor = 'neutral' | 'success' | 'warning' | 'error' | 'info' | 'accent';
1268
+ type NotePadding = 'sm' | 'md' | 'lg';
1269
+ /**
1270
+ * A callout/note component for highlighting information.
1271
+ *
1272
+ * Features a colored left border and subtle background.
1273
+ * Use for tips, warnings, important information, or behavioral notes.
1274
+ *
1275
+ * @example
1276
+ * ```html
1277
+ * <coar-note color="info">
1278
+ * <strong>Note:</strong> This is important information.
1279
+ * </coar-note>
1280
+ *
1281
+ * <coar-note color="warning" padding="lg">
1282
+ * <h4>Warning</h4>
1283
+ * <p>Be careful with this action.</p>
1284
+ * </coar-note>
1285
+ * ```
1286
+ */
1287
+ declare class CoarNoteComponent {
1288
+ /**
1289
+ * Note color scheme.
1290
+ * Determines the left border color and background tint.
1291
+ * @default 'info'
1292
+ */
1293
+ color: _angular_core.InputSignal<NoteColor>;
1294
+ /**
1295
+ * Note padding size.
1296
+ * @default 'md'
1297
+ */
1298
+ padding: _angular_core.InputSignal<NotePadding>;
1299
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarNoteComponent, never>;
1300
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarNoteComponent, "coar-note", never, { "color": { "alias": "color"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1301
+ }
1302
+
1303
+ type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'danger' | 'ghost';
1304
+ type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
1305
+ declare class CoarButtonComponent {
1306
+ /** Button visual variant */
1307
+ variant: _angular_core.InputSignal<ButtonVariant>;
1308
+ /** Button size */
1309
+ size: _angular_core.InputSignal<ButtonSize>;
1310
+ /** Whether the button is disabled */
1311
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1312
+ /** Whether the button is in loading state */
1313
+ loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
1314
+ /** Button type attribute */
1315
+ type: _angular_core.InputSignal<"button" | "reset" | "submit">;
1316
+ /** Icon to display before the label */
1317
+ iconStart: _angular_core.InputSignal<CoreIconName | undefined>;
1318
+ /** Icon to display after the label */
1319
+ iconEnd: _angular_core.InputSignal<CoreIconName | undefined>;
1320
+ /** Whether the button should take full width */
1321
+ fullWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
1322
+ /** Optional aria-label applied to the underlying <button> element */
1323
+ ariaLabel: _angular_core.InputSignal<string>;
1324
+ /** Emitted when the button is clicked (not emitted when disabled or loading) */
1325
+ clicked: _angular_core.OutputEmitterRef<MouseEvent>;
1326
+ /** Maps button size to appropriate icon size */
1327
+ protected readonly iconSize: _angular_core.Signal<CoarIconSize>;
1328
+ protected onClick(event: MouseEvent): void;
1329
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarButtonComponent, never>;
1330
+ 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>;
1331
+ }
1332
+
1333
+ type BadgeVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info';
1334
+ type BadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'auto';
1335
+ declare class CoarBadgeComponent {
1336
+ /** Content to display in the badge (number, text, or icon) */
1337
+ content: _angular_core.InputSignal<string | number>;
1338
+ /** Badge visual variant */
1339
+ variant: _angular_core.InputSignal<BadgeVariant>;
1340
+ /** Badge size */
1341
+ size: _angular_core.InputSignal<BadgeSize>;
1342
+ /** Whether the badge should pulse/animate (for notifications) */
1343
+ pulse: _angular_core.InputSignalWithTransform<boolean, unknown>;
1344
+ /** Whether to show as a dot without content */
1345
+ dot: _angular_core.InputSignalWithTransform<boolean, unknown>;
1346
+ /** Maximum number to display (shows "99+" if exceeded) */
1347
+ max: _angular_core.InputSignal<number | null>;
1348
+ /** Whether to show a border around the badge */
1349
+ bordered: _angular_core.InputSignalWithTransform<boolean, unknown>;
1350
+ /** Computed display value */
1351
+ protected displayValue: _angular_core.Signal<string>;
1352
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarBadgeComponent, never>;
1353
+ 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>;
1354
+ }
1355
+
1356
+ /**
1357
+ * Tag color variants - mirrors CardColor for visual consistency.
1358
+ * Tags are the "little brother" of Cards with the same color system.
1359
+ */
1360
+ type TagColor = 'neutral' | 'success' | 'warning' | 'error' | 'info' | 'accent';
1361
+ /**
1362
+ * Tag size variants.
1363
+ * - sm: Compact tags for dense UIs (10px font)
1364
+ * - md: Default size (12px font)
1365
+ * - lg: Larger tags for emphasis (14px font)
1366
+ */
1367
+ type TagSize = 'sm' | 'md' | 'lg';
1368
+ /**
1369
+ * CoarTagComponent
1370
+ *
1371
+ * A compact label component for categorizing, labeling, or marking content.
1372
+ * Shares the same color system as CoarCard for visual consistency.
1373
+ *
1374
+ * Unlike badges (pill-shaped, for counts/notifications), tags use
1375
+ * slight rounding and support interactive features like closing.
1376
+ *
1377
+ * @example
1378
+ * ```html
1379
+ * <coar-tag>Default</coar-tag>
1380
+ * <coar-tag color="success">Published</coar-tag>
1381
+ * <coar-tag color="warning" closable (closed)="onRemove()">Draft</coar-tag>
1382
+ * ```
1383
+ */
1384
+ declare class CoarTagComponent {
1385
+ /**
1386
+ * Adds a box-shadow for elevation/depth.
1387
+ * Use as boolean attribute: `<coar-tag elevated>` or `[elevated]="true"`
1388
+ */
1389
+ elevated: _angular_core.InputSignalWithTransform<boolean, unknown>;
1390
+ /**
1391
+ * Removes the border from the tag, leaving only background color.
1392
+ * By default (false), tags have a visible border matching their color.
1393
+ * Use as boolean attribute: `<coar-tag borderless>` or `[borderless]="true"`
1394
+ */
1395
+ borderless: _angular_core.InputSignalWithTransform<boolean, unknown>;
1396
+ /** Tag color scheme - matches Card colors */
1397
+ color: _angular_core.InputSignal<TagColor>;
1398
+ /** Tag size */
1399
+ size: _angular_core.InputSignal<TagSize>;
1400
+ /** Whether the tag can be closed/removed */
1401
+ closable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1402
+ /** Emitted when the close button is clicked */
1403
+ closed: _angular_core.OutputEmitterRef<void>;
1404
+ /** Handle close button click */
1405
+ protected onClose(event: MouseEvent): void;
1406
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTagComponent, never>;
1407
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarTagComponent, "coar-tag", never, { "elevated": { "alias": "elevated"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*"], true, never>;
1408
+ }
1409
+
1410
+ /**
1411
+ * Content alignment options for the divider.
1412
+ * - 'center': Content is centered with lines on both sides (default)
1413
+ * - 'left': Content is aligned left with line on the right
1414
+ * - 'right': Content is aligned right with line on the left
1415
+ */
1416
+ type DividerAlign = 'left' | 'center' | 'right';
1417
+ /**
1418
+ * Visual style variants for the divider line.
1419
+ * - 'subtle': Light, unobtrusive divider (default)
1420
+ * - 'strong': More prominent divider
1421
+ */
1422
+ type DividerVariant = 'subtle' | 'strong';
1423
+ /**
1424
+ * A flexible divider component for visually separating content sections.
1425
+ *
1426
+ * Supports optional content (text, icons, etc.) via ng-content that can be
1427
+ * aligned left, center, or right. When content is present, the divider line
1428
+ * splits around it.
1429
+ *
1430
+ * @example
1431
+ * <!-- Simple divider -->
1432
+ * <coar-divider />
1433
+ *
1434
+ * @example
1435
+ * <!-- Divider with centered text -->
1436
+ * <coar-divider>OR</coar-divider>
1437
+ *
1438
+ * @example
1439
+ * <!-- Divider with left-aligned content -->
1440
+ * <coar-divider align="left">Section Title</coar-divider>
1441
+ */
1442
+ declare class CoarDividerComponent {
1443
+ /** Content alignment when ng-content is provided */
1444
+ align: _angular_core.InputSignal<DividerAlign>;
1445
+ /** Visual style variant */
1446
+ variant: _angular_core.InputSignal<DividerVariant>;
1447
+ /** Width of the divider as a percentage (0-100) */
1448
+ width: _angular_core.InputSignal<number>;
1449
+ /** Spacing above the divider in pixels */
1450
+ spacingTop: _angular_core.InputSignal<number>;
1451
+ /** Spacing below the divider in pixels */
1452
+ spacingBottom: _angular_core.InputSignal<number>;
1453
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarDividerComponent, never>;
1454
+ 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>;
1455
+ }
1456
+
1457
+ /**
1458
+ * A lightweight, hover/focus popover for rich tooltip-like content.
1459
+ *
1460
+ * Uses the overlay system for positioning with automatic placement and viewport clamping.
1461
+ */
1462
+ declare class CoarPopoverComponent {
1463
+ private readonly elementRef;
1464
+ private readonly destroyRef;
1465
+ private readonly popoverGroup;
1466
+ private readonly overlayService;
1467
+ private static nextId;
1468
+ private readonly popoverId;
1469
+ protected readonly panelId: string;
1470
+ private overlayRef;
1471
+ protected readonly isOpen: _angular_core.WritableSignal<boolean>;
1472
+ constructor();
1473
+ /** Disable popover behavior (still renders trigger content). */
1474
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1475
+ /** Enable hover/focus behavior (desktop-friendly). Default: false */
1476
+ openOnHover: _angular_core.InputSignalWithTransform<boolean, unknown>;
1477
+ /** Enable click/tap behavior (touch-friendly). Default: false */
1478
+ openOnClick: _angular_core.InputSignalWithTransform<boolean, unknown>;
1479
+ /** Whether the panel should receive pointer events. Default: true */
1480
+ interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
1481
+ /** When a concrete placement is set, fall back to best-fit when it doesn't fit. Default: false */
1482
+ fallbackToBestFit: _angular_core.InputSignalWithTransform<boolean, unknown>;
1483
+ /** Whether the panel should be clamped into the viewport. Default: true */
1484
+ clampToViewport: _angular_core.InputSignalWithTransform<boolean, unknown>;
1485
+ /** When true, the popover is "pinned" open via click and won't close on hover out. */
1486
+ protected readonly pinnedByClick: _angular_core.WritableSignal<boolean>;
1487
+ private closeTimer;
1488
+ private readonly hoveringTrigger;
1489
+ private readonly hoveringPanel;
1490
+ private readonly closeOnDisable;
1491
+ private readonly syncClampToViewport;
1492
+ private readonly syncFallbackToBestFit;
1493
+ private readonly triggerRef;
1494
+ private readonly panelTemplateRef;
1495
+ private getAnchorElement;
1496
+ private readonly closeOnDocumentClick;
1497
+ private openInternal;
1498
+ onMouseEnter(): void;
1499
+ onMouseLeave(): void;
1500
+ onPanelMouseEnter(): void;
1501
+ onPanelMouseLeave(): void;
1502
+ onFocusIn(): void;
1503
+ onPanelFocusIn(): void;
1504
+ onTriggerClick(event: MouseEvent): void;
1505
+ onHostClick(event: MouseEvent): void;
1506
+ close(): void;
1507
+ onFocusOut(event: FocusEvent): void;
1508
+ onPanelFocusOut(event: FocusEvent): void;
1509
+ private scheduleHoverClose;
1510
+ private clearCloseTimer;
1511
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPopoverComponent, never>;
1512
+ 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>;
1513
+ }
1514
+
1515
+ /**
1516
+ * Local coordination for popovers inside the same container (e.g. a date picker panel).
1517
+ *
1518
+ * Provided by a parent component to ensure only one popover in that scope is open at a time.
1519
+ */
1520
+ declare class CoarPopoverGroupService {
1521
+ private activeId;
1522
+ private activeClose;
1523
+ requestOpen(id: string, close: () => void): void;
1524
+ notifyClosed(id: string): void;
1525
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarPopoverGroupService, never>;
1526
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CoarPopoverGroupService>;
1527
+ }
1528
+
1529
+ type CoarTooltipOverlayContent = string | TemplateRef<unknown> | Type<unknown>;
1530
+
1531
+ /** Tooltip placement preference - all 12 standard placements plus 'auto' for best-fit */
1532
+ type TooltipPlacement = 'auto' | 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
1533
+ declare class CoarTooltipDirective {
1534
+ private readonly elementRef;
1535
+ private readonly destroyRef;
1536
+ private readonly injector;
1537
+ private readonly overlayService;
1538
+ private readonly tooltipService;
1539
+ /** Tooltip content (string, TemplateRef, or Component type). */
1540
+ readonly coarTooltip: _angular_core.InputSignal<CoarTooltipOverlayContent | null>;
1541
+ /** Optional context for TemplateRef tooltips. */
1542
+ readonly coarTooltipContext: _angular_core.InputSignal<object | null>;
1543
+ /** Disable tooltip behavior. */
1544
+ readonly coarTooltipDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1545
+ /** Placement preference. Default: 'top'. Use 'auto' for best-fit. */
1546
+ readonly coarTooltipPlacement: _angular_core.InputSignal<TooltipPlacement>;
1547
+ /** Delay (ms) before opening on hover/focus. Default: 0 */
1548
+ readonly coarTooltipOpenDelay: _angular_core.InputSignalWithTransform<number, unknown>;
1549
+ /** Delay (ms) before closing on leave/blur. Default: 0 */
1550
+ readonly coarTooltipCloseDelay: _angular_core.InputSignalWithTransform<number, unknown>;
1551
+ /** Whether the tooltip should be clamped into the viewport. Default: true */
1552
+ readonly coarTooltipClampToViewport: _angular_core.InputSignalWithTransform<boolean, unknown>;
1553
+ /** When placement is explicit (not auto), fall back to best-fit when it doesn't fit. Default: false */
1554
+ readonly coarTooltipFallbackToBestFit: _angular_core.InputSignalWithTransform<boolean, unknown>;
1555
+ private readonly tooltipId;
1556
+ private overlayRef;
1557
+ private openTimerId;
1558
+ private closeTimerId;
1559
+ private openReason;
1560
+ private readonly hasContent;
1561
+ constructor();
1562
+ private clearTimers;
1563
+ private openInternal;
1564
+ private resolveOverlayPosition;
1565
+ private scheduleOpen;
1566
+ private scheduleClose;
1567
+ onMouseEnter(): void;
1568
+ onMouseLeave(): void;
1569
+ onFocusIn(): void;
1570
+ onFocusOut(event: FocusEvent): void;
1571
+ close(immediate?: boolean): void;
1572
+ open(): void;
1573
+ toggle(): void;
1574
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTooltipDirective, never>;
1575
+ 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>;
1576
+ }
1577
+
1578
+ /**
1579
+ * Available sizes for the label component.
1580
+ * Matches the component size system used by buttons and inputs.
1581
+ */
1582
+ type CoarLabelSize = 'xs' | 'sm' | 'md' | 'lg';
1583
+ /**
1584
+ * Standalone label component for consistent form labeling across the design system.
1585
+ *
1586
+ * @example
1587
+ * ```html
1588
+ * <coar-label size="sm" [required]="true">Email Address</coar-label>
1589
+ * <coar-text-input size="sm" placeholder="your@email.com" />
1590
+ * ```
1591
+ */
1592
+ declare class CoarLabelComponent {
1593
+ /**
1594
+ * Size of the label. Should match the size of the associated input/form element.
1595
+ * @default 'md'
1596
+ */
1597
+ readonly size: _angular_core.InputSignal<CoarLabelSize>;
1598
+ /**
1599
+ * Whether to show a required indicator (*) after the label text.
1600
+ * @default false
1601
+ */
1602
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1603
+ /**
1604
+ * The ID of the form element this label is associated with.
1605
+ * Sets the 'for' attribute for accessibility.
1606
+ */
1607
+ readonly for: _angular_core.InputSignal<string | undefined>;
1608
+ readonly text: _angular_core.InputSignal<string>;
1609
+ get isXs(): boolean;
1610
+ get isSm(): boolean;
1611
+ get isMd(): boolean;
1612
+ get isLg(): boolean;
1613
+ get forAttr(): string | null;
1614
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarLabelComponent, never>;
1615
+ 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>;
1616
+ }
1617
+
1618
+ type CoarTableVariant = 'default' | 'plain' | 'bordered';
1619
+ /**
1620
+ * A simple table component that provides consistent styling.
1621
+ *
1622
+ * Default styling uses alternating row colors (zebra stripes) for readability.
1623
+ * Use 'plain' variant for no stripes, or 'bordered' for full cell borders.
1624
+ *
1625
+ * Usage:
1626
+ * ```html
1627
+ * <coar-table>
1628
+ * <thead>
1629
+ * <tr>
1630
+ * <th>Property</th>
1631
+ * <th>Type</th>
1632
+ * </tr>
1633
+ * </thead>
1634
+ * <tbody>
1635
+ * <tr>
1636
+ * <td><code>name</code></td>
1637
+ * <td><code>string</code></td>
1638
+ * </tr>
1639
+ * </tbody>
1640
+ * </coar-table>
1641
+ * ```
1642
+ */
1643
+ declare class CoarTableComponent {
1644
+ /** Visual variant of the table: default (zebra stripes), plain (no stripes), bordered (cell borders) */
1645
+ variant: _angular_core.InputSignal<CoarTableVariant>;
1646
+ /** Whether to use compact padding */
1647
+ compact: _angular_core.InputSignalWithTransform<boolean, unknown>;
1648
+ /** Whether rows should highlight on hover */
1649
+ hover: _angular_core.InputSignalWithTransform<boolean, unknown>;
1650
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarTableComponent, never>;
1651
+ 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>;
1652
+ }
1653
+
1654
+ type CoarDatePickerSize = 'xs' | 'sm' | 'md' | 'lg';
1655
+ /**
1656
+ * Represents a date marker for highlighting special dates (holidays, events, etc.)
1657
+ * Supports single dates or date ranges.
1658
+ */
1659
+ interface CoarDateMarker {
1660
+ /** Start date of the marker (or single date if no endDate) */
1661
+ startDate: Temporal.PlainDate;
1662
+ /** Optional end date for date ranges (inclusive) */
1663
+ endDate?: Temporal.PlainDate;
1664
+ /** Description shown as tooltip on hover */
1665
+ description: string;
1666
+ /** Optional custom CSS class for styling different marker types */
1667
+ cssClass?: string;
1668
+ }
1669
+ /**
1670
+ * Date picker component using Temporal API.
1671
+ *
1672
+ * Supports Temporal.PlainDate values for timezone-independent date selection.
1673
+ * Uses ISO string format internally for forms compatibility.
1674
+ *
1675
+ * @example
1676
+ * ```html
1677
+ * <coar-date-picker
1678
+ * label="Birth Date"
1679
+ * [(value)]="birthDate"
1680
+ * placeholder="Select date..."
1681
+ * />
1682
+ * ```
1683
+ */
1684
+ declare class CoarDatePickerComponent extends CoarControlValueAccessor<Temporal.PlainDate | null> {
1685
+ private readonly elementRef;
1686
+ private readonly destroyRef;
1687
+ private readonly localeService;
1688
+ private readonly overlayService;
1689
+ private overlayRef;
1690
+ /** Label text displayed above the input */
1691
+ label: _angular_core.InputSignal<string>;
1692
+ /** Placeholder text when no date is selected */
1693
+ placeholder: _angular_core.InputSignal<string>;
1694
+ /** Size variant */
1695
+ size: _angular_core.InputSignal<CoarDatePickerSize>;
1696
+ /** Whether the picker is readonly */
1697
+ readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1698
+ /** Whether the picker is disabled */
1699
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1700
+ /** Whether the field is required */
1701
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1702
+ /** Error state */
1703
+ error: _angular_core.InputSignalWithTransform<boolean, unknown>;
1704
+ /** Helper or error message */
1705
+ message: _angular_core.InputSignal<string>;
1706
+ /** Minimum selectable date */
1707
+ min: _angular_core.InputSignal<Temporal.PlainDate | null>;
1708
+ /** Maximum selectable date */
1709
+ max: _angular_core.InputSignal<Temporal.PlainDate | null>;
1710
+ /**
1711
+ * Locale identifier for date formatting (e.g., 'de-AT', 'en-US').
1712
+ * Uses global locale service default if not specified.
1713
+ */
1714
+ locale: _angular_core.InputSignal<string | undefined>;
1715
+ /**
1716
+ * Date format configuration (pattern and first day of week).
1717
+ * If not provided, uses locale service default or falls back to European format.
1718
+ */
1719
+ dateFormatConfig: _angular_core.InputSignal<DateFormatConfig | undefined>;
1720
+ /** Whether to show a "Today" button */
1721
+ showTodayButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
1722
+ /** Whether to show week numbers */
1723
+ showWeekNumbers: _angular_core.InputSignalWithTransform<boolean, unknown>;
1724
+ /** Whether to highlight weekend days (Saturday/Sunday) with a subtle background */
1725
+ highlightWeekends: _angular_core.InputSignalWithTransform<boolean, unknown>;
1726
+ /** Date markers for highlighting special dates (holidays, events, etc.) */
1727
+ markers: _angular_core.InputSignal<CoarDateMarker[]>;
1728
+ /** Maximum number of lines shown in the marker popover (including "+N" line). */
1729
+ protected readonly markerPopoverMaxLines = 5;
1730
+ /**
1731
+ * Visible markers before switching to "+N other events".
1732
+ * With a max of 5 lines, we show 4 markers + one summary line.
1733
+ */
1734
+ protected readonly markerPopoverVisibleMarkers = 4;
1735
+ protected getVisibleMarkers(markers: CoarDateMarker[]): CoarDateMarker[];
1736
+ protected getHiddenMarkerCount(markers: CoarDateMarker[]): number;
1737
+ /** Current selected date (two-way bindable with [(value)]) */
1738
+ value: _angular_core.ModelSignal<Temporal.PlainDate | null>;
1739
+ /** Emitted when the selected date changes */
1740
+ valueChange: _angular_core.OutputEmitterRef<Temporal.PlainDate | null>;
1741
+ /** Emitted when the picker opens */
1742
+ opened: _angular_core.OutputEmitterRef<void>;
1743
+ /** Emitted when the picker closes */
1744
+ closed: _angular_core.OutputEmitterRef<void>;
1745
+ /** Unique ID counter for component instances */
1746
+ private static nextId;
1747
+ /** Unique ID for this component instance */
1748
+ private readonly uid;
1749
+ /** Maskito instance for input masking */
1750
+ private maskitoInstance?;
1751
+ /** ID for the label element */
1752
+ protected labelId: _angular_core.Signal<string>;
1753
+ /** ID for the input element */
1754
+ protected inputId: _angular_core.Signal<string>;
1755
+ /** ID for the calendar dropdown */
1756
+ protected calendarId: _angular_core.Signal<string>;
1757
+ /** Whether the calendar dropdown is open */
1758
+ protected isOpen: _angular_core.WritableSignal<boolean>;
1759
+ /** Calendar dropdown position (chosen before opening) */
1760
+ protected calendarPosition: _angular_core.WritableSignal<"top" | "bottom">;
1761
+ /** Currently viewed month/year in the calendar */
1762
+ protected viewDate: _angular_core.WritableSignal<Temporal.PlainYearMonth>;
1763
+ /** Focused date in the calendar (for keyboard navigation) */
1764
+ protected focusedDate: _angular_core.WritableSignal<Temporal.PlainDate | null>;
1765
+ /** Display value for the input field */
1766
+ protected displayValue: _angular_core.WritableSignal<string>;
1767
+ /** Days of week header (localized based on locale and firstDayOfWeek) */
1768
+ protected daysOfWeek: _angular_core.Signal<string[]>;
1769
+ /** Reference to the input element */
1770
+ protected inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
1771
+ /** Reference to the trigger element */
1772
+ protected triggerRef: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
1773
+ /** Reference to the calendar template (rendered via @cocoar/ui-overlay) */
1774
+ protected calendarTemplateRef: _angular_core.Signal<TemplateRef<unknown> | undefined>;
1775
+ /**
1776
+ * Effective date format configuration.
1777
+ * Priority: input dateFormatConfig > locale service > fallback
1778
+ */
1779
+ protected effectiveDateFormat: _angular_core.Signal<DateFormatConfig>;
1780
+ /** Get the date format pattern */
1781
+ protected dateFormat: _angular_core.Signal<"dd.mm.yyyy" | "dd/mm/yyyy" | "mm/dd/yyyy" | "yyyy-mm-dd">;
1782
+ /** Get the first day of week */
1783
+ protected firstDayOfWeek: _angular_core.Signal<1 | 7>;
1784
+ /** Get the separator character for the current date format */
1785
+ protected separator: _angular_core.Signal<"." | "/" | "-">;
1786
+ /** Get placeholder text based on date format */
1787
+ protected inputPlaceholder: _angular_core.Signal<string>;
1788
+ /**
1789
+ * Effective locale for calendar month/year display.
1790
+ * Priority: input locale > locale service default > browser locale
1791
+ */
1792
+ protected effectiveLocale: _angular_core.Signal<string>;
1793
+ /** Whether the picker has an error state */
1794
+ protected hasError: _angular_core.Signal<boolean>;
1795
+ /** Whether the picker is disabled */
1796
+ protected isDisabled: _angular_core.Signal<boolean>;
1797
+ /** Calendar grid for current view month */
1798
+ protected calendarDays: _angular_core.Signal<CalendarDay[]>;
1799
+ /** Month name for calendar header */
1800
+ protected viewMonth: _angular_core.Signal<string>;
1801
+ /** Year for calendar header */
1802
+ protected viewYear: _angular_core.Signal<number>;
1803
+ /** Week numbers for each row (6 rows) */
1804
+ protected weekNumbers: _angular_core.Signal<number[]>;
1805
+ /** Today's date */
1806
+ protected today: Temporal.PlainDate;
1807
+ constructor();
1808
+ /** Open the calendar dropdown */
1809
+ openCalendar(): void;
1810
+ /** Close the calendar dropdown */
1811
+ closeCalendar(): void;
1812
+ /** Toggle the calendar dropdown */
1813
+ toggleCalendar(): void;
1814
+ /** Select a date */
1815
+ selectDate(date: Temporal.PlainDate): void;
1816
+ /** Select today's date */
1817
+ selectToday(): void;
1818
+ /** Clear the selected date */
1819
+ clearDate(event: Event): void;
1820
+ /** Navigate to previous month */
1821
+ previousMonth(): void;
1822
+ /** Navigate to next month */
1823
+ nextMonth(): void;
1824
+ /** Navigate to previous year */
1825
+ previousYear(): void;
1826
+ /** Navigate to next year */
1827
+ nextYear(): void;
1828
+ /** Go to today's month */
1829
+ goToToday(): void;
1830
+ writeValue(value: Temporal.PlainDate | string | null): void;
1831
+ protected onTriggerClick(): void;
1832
+ protected onDocumentKeydown(event: KeyboardEvent): void;
1833
+ protected onTriggerKeydown(event: KeyboardEvent): void;
1834
+ private resolvePlacement;
1835
+ private estimatePanelHeight;
1836
+ /**
1837
+ * Handle input changes from typed or pasted date values.
1838
+ *
1839
+ * Parses the masked input and updates the value if valid.
1840
+ * Invalid or incomplete dates do not update the model.
1841
+ */
1842
+ protected onInputChange(event: Event): void;
1843
+ /**
1844
+ * Handle blur on the input field.
1845
+ *
1846
+ * If the input contains an invalid date, reset to the current value.
1847
+ */
1848
+ protected onInputBlur(): void;
1849
+ /**
1850
+ * Initialize Maskito for date input masking.
1851
+ *
1852
+ * Uses maskitoDateOptionsGenerator with the configured date format
1853
+ * to provide automatic formatting and validation while typing.
1854
+ */
1855
+ private initializeMaskito;
1856
+ /**
1857
+ * Convert Temporal.PlainDate to native Date for Maskito compatibility.
1858
+ */
1859
+ private temporalToDate;
1860
+ /**
1861
+ * Calculate ISO week number for a date.
1862
+ * ISO weeks start on Monday and week 1 contains the first Thursday of the year.
1863
+ */
1864
+ private calculateISOWeek;
1865
+ /**
1866
+ * Format a Temporal.PlainDate for display according to the configured format.
1867
+ */
1868
+ private formatDateForDisplay;
1869
+ /**
1870
+ * Parse a date string in the configured format to Temporal.PlainDate.
1871
+ * Returns null if the string is incomplete or invalid.
1872
+ */
1873
+ private parseDateFromInput;
1874
+ private createCalendarDay;
1875
+ /**
1876
+ * Find all markers that apply to the given date.
1877
+ * Checks if date falls within any marker's range.
1878
+ */
1879
+ private getMarkersForDate;
1880
+ private isDateDisabled;
1881
+ private moveFocus;
1882
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarDatePickerComponent, never>;
1883
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarDatePickerComponent, "coar-date-picker", 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; }; "message": { "alias": "message"; "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": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "valueChange": "valueChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1884
+ }
1885
+ /** Internal type for calendar day rendering */
1886
+ interface CalendarDay {
1887
+ date: Temporal.PlainDate;
1888
+ day: number;
1889
+ isOutsideMonth: boolean;
1890
+ isToday: boolean;
1891
+ isSelected: boolean;
1892
+ isFocused: boolean;
1893
+ isDisabled: boolean;
1894
+ isWeekend: boolean;
1895
+ /** Markers applied to this date (if any) */
1896
+ markers: CoarDateMarker[];
1897
+ /** Optional CSS class from the first marker for styling */
1898
+ markerCssClass: string | null;
1899
+ }
1900
+
1901
+ export { COAR_LOCALE_SERVICE, CORE_ICONS, CoarBadgeComponent, CoarButtonComponent, CoarCardComponent, CoarCheckboxComponent, CoarCodeBlockComponent, CoarControlValueAccessor, CoarDatePickerComponent, CoarDividerComponent, CoarIconComponent, CoarIconService, CoarLabelComponent, CoarLocaleService, CoarMultiSelectComponent, CoarNoteComponent, CoarNumberInputComponent, CoarPasswordInputComponent, CoarPopoverComponent, CoarPopoverGroupService, CoarScrollbarDirective, CoarSingleSelectComponent, CoarTabComponent, CoarTabGroupComponent, CoarTableComponent, CoarTagComponent, CoarTagSelectComponent, CoarTextInputComponent, CoarTooltipDirective, coarProvideValueAccessor };
1902
+ export type { BadgeSize, BadgeVariant, ButtonSize, ButtonVariant, CardColor, CardPadding, CoarCheckboxSize, CoarCheckboxState, CoarDateMarker, CoarDatePickerSize, CoarIconSize, CoarLabelSize, CoarNumberInputSize, CoarNumberInputStepperButtons, CoarPasswordInputSize, CoarScrollbarAutoHide, CoarScrollbarOverflow, CoarScrollbarTheme, CoarSelectOption, CoarSelectSize, CoarTableVariant, CoarTextInputSize, CoreIconName, DateFormatConfig, DividerAlign, DividerVariant, ICoarLocaleService, LocaleConfig, NoteColor, NotePadding, NumberFormatConfig, TabContent, TabLoadingStrategy, TagColor, TagSize };