@lumaui/angular 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,29 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { ButtonVariant, ButtonSize, CardVariant, CardTitleSize, CardDescriptionSize } from '@lumaui/core';
2
+ import { InjectionToken, Signal, OnDestroy, WritableSignal, ElementRef, OnInit, AfterViewInit } from '@angular/core';
3
+ import { ButtonVariant, ButtonSize, CardVariant, CardTitleSize, CardDescriptionSize, AccordionItemVariant, AccordionTitleSize, TooltipPosition, TabsStyle, ToastPosition as ToastPosition$1, ToastVariant as ToastVariant$1 } from '@lumaui/core';
4
+ export { ToastCloseVariants, ToastContainerVariants, ToastIconVariants, ToastItemVariants, ToastState } from '@lumaui/core';
5
+ import * as _lumaui_angular from '@lumaui/angular';
6
+ import { Observable } from 'rxjs';
3
7
 
4
- declare class ButtonDirective {
8
+ declare class LmButtonDirective {
5
9
  lmVariant: _angular_core.InputSignal<ButtonVariant>;
6
10
  lmSize: _angular_core.InputSignal<ButtonSize>;
7
11
  lmDisabled: _angular_core.InputSignal<boolean>;
8
12
  lmType: _angular_core.InputSignal<"button" | "submit" | "reset">;
9
13
  classes: _angular_core.Signal<string>;
10
14
  get hostClasses(): string;
11
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonDirective, never>;
12
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ButtonDirective, "button[lumaButton], a[lumaButton]", never, { "lmVariant": { "alias": "lmVariant"; "required": false; "isSignal": true; }; "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; "lmDisabled": { "alias": "lmDisabled"; "required": false; "isSignal": true; }; "lmType": { "alias": "lmType"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
15
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmButtonDirective, never>;
16
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmButtonDirective, "button[lumaButton], a[lumaButton]", never, { "lmVariant": { "alias": "lmVariant"; "required": false; "isSignal": true; }; "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; "lmDisabled": { "alias": "lmDisabled"; "required": false; "isSignal": true; }; "lmType": { "alias": "lmType"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
13
17
  }
14
18
 
15
- declare class CardComponent {
19
+ declare class LmBadgeDirective {
20
+ classes: _angular_core.Signal<string>;
21
+ get hostClasses(): string;
22
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmBadgeDirective, never>;
23
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmBadgeDirective, "[lumaBadge]", never, {}, {}, never, never, true, never>;
24
+ }
25
+
26
+ declare class LmCardComponent {
16
27
  /**
17
28
  * Card visual style variant
18
29
  * - default: Gradient border wrapper style (default)
@@ -23,32 +34,1211 @@ declare class CardComponent {
23
34
  lmVariant: _angular_core.InputSignal<CardVariant>;
24
35
  wrapperClasses: _angular_core.Signal<string>;
25
36
  contentClasses: _angular_core.Signal<string>;
26
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardComponent, never>;
27
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardComponent, "luma-card", never, { "lmVariant": { "alias": "lmVariant"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
37
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmCardComponent, never>;
38
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmCardComponent, "luma-card", never, { "lmVariant": { "alias": "lmVariant"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
28
39
  }
29
40
 
30
- declare class CardTitleDirective {
41
+ declare class LmCardTitleDirective {
31
42
  lmSize: _angular_core.InputSignal<CardTitleSize>;
32
43
  classes: _angular_core.Signal<string>;
33
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardTitleDirective, never>;
34
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardTitleDirective, "[lumaCardTitle]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmCardTitleDirective, never>;
45
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmCardTitleDirective, "[lumaCardTitle]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
35
46
  }
36
47
 
37
- declare class CardDescriptionDirective {
48
+ declare class LmCardDescriptionDirective {
38
49
  lmSize: _angular_core.InputSignal<CardDescriptionSize>;
39
50
  classes: _angular_core.Signal<string>;
40
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardDescriptionDirective, never>;
41
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardDescriptionDirective, "[lumaCardDescription]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
51
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmCardDescriptionDirective, never>;
52
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmCardDescriptionDirective, "[lumaCardDescription]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
53
+ }
54
+
55
+ declare class LmCardHeaderDirective {
56
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmCardHeaderDirective, never>;
57
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmCardHeaderDirective, "[lumaCardHeader]", never, {}, {}, never, never, true, never>;
58
+ }
59
+
60
+ declare class LmCardContentDirective {
61
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmCardContentDirective, never>;
62
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmCardContentDirective, "[lumaCardContent]", never, {}, {}, never, never, true, never>;
63
+ }
64
+
65
+ /**
66
+ * AccordionGroupComponent
67
+ *
68
+ * Optional wrapper component that coordinates multiple accordion items.
69
+ * Supports controlled pattern for implementing business logic like:
70
+ * - Single item open at a time
71
+ * - Multiple items open
72
+ * - Always keep first/last item open
73
+ * - Maximum number of open items
74
+ *
75
+ * @example Controlled single mode
76
+ * ```html
77
+ * <luma-accordion-group [lmValue]="activeItem()" (lmValueChange)="activeItem.set($event)">
78
+ * <luma-accordion-item lmId="item-1">...</luma-accordion-item>
79
+ * <luma-accordion-item lmId="item-2">...</luma-accordion-item>
80
+ * </luma-accordion-group>
81
+ * ```
82
+ *
83
+ * @example Controlled multiple mode
84
+ * ```html
85
+ * <luma-accordion-group [lmValue]="activeItems()" (lmValueChange)="activeItems.set($event)">
86
+ * <luma-accordion-item lmId="item-1">...</luma-accordion-item>
87
+ * <luma-accordion-item lmId="item-2">...</luma-accordion-item>
88
+ * </luma-accordion-group>
89
+ * ```
90
+ */
91
+ declare class LmAccordionGroupComponent {
92
+ /**
93
+ * Controlled value for which items are open
94
+ * - null: uncontrolled mode (each item manages its own state)
95
+ * - string: single item mode (ID of open item)
96
+ * - string[]: multiple items mode (IDs of open items)
97
+ */
98
+ lmValue: _angular_core.InputSignal<string | string[] | null>;
99
+ /**
100
+ * Emitted when an item is toggled
101
+ * Returns the new value (string for single mode, string[] for multiple)
102
+ */
103
+ lmValueChange: _angular_core.OutputEmitterRef<string | string[]>;
104
+ /**
105
+ * Force single mode even when lmValue is an array
106
+ * When true, only one item can be open at a time
107
+ */
108
+ lmSingle: _angular_core.InputSignal<boolean>;
109
+ /**
110
+ * Toggle an item by its ID
111
+ * Called by child AccordionItemComponent when toggled
112
+ */
113
+ toggleItem(itemId: string): void;
114
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmAccordionGroupComponent, never>;
115
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmAccordionGroupComponent, "luma-accordion-group", never, { "lmValue": { "alias": "lmValue"; "required": false; "isSignal": true; }; "lmSingle": { "alias": "lmSingle"; "required": false; "isSignal": true; }; }, { "lmValueChange": "lmValueChange"; }, never, ["*"], true, never>;
116
+ }
117
+
118
+ /**
119
+ * Interface for accordion item state that child directives can access
120
+ */
121
+ interface AccordionItemBase {
122
+ /** Whether the accordion item is currently open */
123
+ isOpen: Signal<boolean>;
124
+ /** Whether the accordion item is disabled */
125
+ lmDisabled: Signal<boolean>;
126
+ /** Toggle the accordion open/closed state */
127
+ toggle(): void;
128
+ }
129
+ /**
130
+ * Injection token for accordion item
131
+ * Allows child directives to access parent accordion item state
132
+ */
133
+ declare const ACCORDION_ITEM: InjectionToken<AccordionItemBase>;
134
+
135
+ /**
136
+ * AccordionItemComponent
137
+ *
138
+ * Wrapper component that contains the trigger and content.
139
+ * Can be used standalone or within an AccordionGroupComponent.
140
+ *
141
+ * @example Standalone usage
142
+ * ```html
143
+ * <luma-accordion-item>
144
+ * <button lumaAccordionTrigger>
145
+ * <span lumaAccordionTitle>Title</span>
146
+ * <svg lumaAccordionIcon>...</svg>
147
+ * </button>
148
+ * <div lumaAccordionContent>Content here...</div>
149
+ * </luma-accordion-item>
150
+ * ```
151
+ *
152
+ * @example With variants
153
+ * ```html
154
+ * <luma-accordion-item lmVariant="filled">
155
+ * ...
156
+ * </luma-accordion-item>
157
+ * ```
158
+ */
159
+ declare class LmAccordionItemComponent implements AccordionItemBase {
160
+ private group;
161
+ private el;
162
+ private renderer;
163
+ private previousClasses;
164
+ constructor();
165
+ /**
166
+ * Unique identifier for this item (required when using AccordionGroup)
167
+ */
168
+ lmId: _angular_core.InputSignal<string>;
169
+ /**
170
+ * Visual style variant
171
+ * - default: Standard with border
172
+ * - bordered: FAQ-style stacked items
173
+ * - filled: Solid background (unified trigger/content)
174
+ */
175
+ lmVariant: _angular_core.InputSignal<AccordionItemVariant>;
176
+ /**
177
+ * Initial/controlled open state (for standalone usage)
178
+ */
179
+ lmOpen: _angular_core.InputSignal<boolean>;
180
+ /**
181
+ * Whether the accordion item is disabled
182
+ */
183
+ lmDisabled: _angular_core.InputSignal<boolean>;
184
+ /**
185
+ * Emitted when the open state changes
186
+ * Useful for tracking/analytics
187
+ */
188
+ lmOpenChange: _angular_core.OutputEmitterRef<boolean>;
189
+ private _isOpen;
190
+ /**
191
+ * Computed open state
192
+ * Priority: group controlled > lmOpen input > internal state
193
+ */
194
+ isOpen: _angular_core.Signal<boolean>;
195
+ wrapperClasses: _angular_core.Signal<string>;
196
+ contentWrapperClasses: _angular_core.Signal<string>;
197
+ /**
198
+ * Toggle the accordion open/closed state
199
+ */
200
+ toggle(): void;
201
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmAccordionItemComponent, never>;
202
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmAccordionItemComponent, "luma-accordion-item", never, { "lmId": { "alias": "lmId"; "required": false; "isSignal": true; }; "lmVariant": { "alias": "lmVariant"; "required": false; "isSignal": true; }; "lmOpen": { "alias": "lmOpen"; "required": false; "isSignal": true; }; "lmDisabled": { "alias": "lmDisabled"; "required": false; "isSignal": true; }; }, { "lmOpenChange": "lmOpenChange"; }, never, ["[lumaAccordionTrigger]", "[lumaAccordionContent]"], true, never>;
203
+ }
204
+
205
+ /**
206
+ * AccordionTriggerDirective
207
+ *
208
+ * Applied to a div element to make it the clickable trigger for the accordion.
209
+ * Uses div instead of button for maximum layout flexibility.
210
+ * Handles ARIA attributes and keyboard navigation automatically.
211
+ *
212
+ * @example Basic usage
213
+ * ```html
214
+ * <div lumaAccordionTrigger>
215
+ * <span lumaAccordionTitle>Title</span>
216
+ * <span lumaAccordionIcon>
217
+ * <svg>...</svg>
218
+ * </span>
219
+ * </div>
220
+ * ```
221
+ *
222
+ * @example Custom layout
223
+ * ```html
224
+ * <div lumaAccordionTrigger class="grid grid-cols-[auto_1fr_auto] gap-4">
225
+ * <svg class="w-6 h-6">...</svg>
226
+ * <div>
227
+ * <span lumaAccordionTitle>Title</span>
228
+ * <p class="text-sm">Description</p>
229
+ * </div>
230
+ * <span lumaAccordionIcon>
231
+ * <svg>...</svg>
232
+ * </span>
233
+ * </div>
234
+ * ```
235
+ */
236
+ declare class LmAccordionTriggerDirective {
237
+ protected item: _lumaui_angular.AccordionItemBase;
238
+ private id;
239
+ triggerId: string;
240
+ contentId: string;
241
+ classes: _angular_core.Signal<string>;
242
+ onClick(event: Event): void;
243
+ onKeydown(event: KeyboardEvent): void;
244
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmAccordionTriggerDirective, never>;
245
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmAccordionTriggerDirective, "div[lumaAccordionTrigger]", never, {}, {}, never, never, true, never>;
246
+ }
247
+
248
+ /**
249
+ * AccordionTitleDirective
250
+ *
251
+ * Applies typography styles to the accordion title.
252
+ * Supports size variants for different visual hierarchies.
253
+ *
254
+ * @example Basic usage
255
+ * ```html
256
+ * <span lumaAccordionTitle>What is Luma UI?</span>
257
+ * ```
258
+ *
259
+ * @example With size variant
260
+ * ```html
261
+ * <span lumaAccordionTitle lmSize="lg">Large Title</span>
262
+ * ```
263
+ */
264
+ declare class LmAccordionTitleDirective {
265
+ /**
266
+ * Size variant for the title
267
+ * - sm: Small text for compact UIs
268
+ * - md: Default size (base text)
269
+ * - lg: Large text for emphasis
270
+ */
271
+ lmSize: _angular_core.InputSignal<AccordionTitleSize>;
272
+ classes: _angular_core.Signal<string>;
273
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmAccordionTitleDirective, never>;
274
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmAccordionTitleDirective, "[lumaAccordionTitle]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
275
+ }
276
+
277
+ /**
278
+ * AccordionIconDirective
279
+ *
280
+ * Applies rotation animation to the accordion icon (typically a chevron).
281
+ * Must be placed on a wrapper element (span or div), not directly on the SVG.
282
+ * Automatically rotates based on the open state of the parent accordion item.
283
+ *
284
+ * @example With span wrapper (recommended)
285
+ * ```html
286
+ * <span lumaAccordionIcon>
287
+ * <svg viewBox="0 0 24 24" class="w-4 h-4">
288
+ * <path stroke="currentColor" stroke-width="2" d="M19 9l-7 7-7-7" />
289
+ * </svg>
290
+ * </span>
291
+ * ```
292
+ *
293
+ * @example With div wrapper
294
+ * ```html
295
+ * <div lumaAccordionIcon>
296
+ * <my-chevron-icon></my-chevron-icon>
297
+ * </div>
298
+ * ```
299
+ *
300
+ * @example Customize rotation via CSS variable
301
+ * ```html
302
+ * <span lumaAccordionIcon style="--luma-accordion-icon-rotation: 90deg">
303
+ * <svg>...</svg>
304
+ * </span>
305
+ * ```
306
+ */
307
+ declare class LmAccordionIconDirective {
308
+ protected item: _lumaui_angular.AccordionItemBase;
309
+ classes: _angular_core.Signal<string>;
310
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmAccordionIconDirective, never>;
311
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmAccordionIconDirective, "span[lumaAccordionIcon], div[lumaAccordionIcon]", never, {}, {}, never, never, true, never>;
312
+ }
313
+
314
+ /**
315
+ * AccordionContentDirective
316
+ *
317
+ * Applied to the content area of the accordion.
318
+ * Handles visibility, ARIA attributes, and fade animation.
319
+ *
320
+ * @example Basic usage
321
+ * ```html
322
+ * <div lumaAccordionContent>
323
+ * <p>Your content here...</p>
324
+ * </div>
325
+ * ```
326
+ */
327
+ declare class LmAccordionContentDirective {
328
+ protected item: _lumaui_angular.AccordionItemBase;
329
+ protected trigger: LmAccordionTriggerDirective | null;
330
+ private id;
331
+ contentId: string;
332
+ triggerId: _angular_core.Signal<string | null>;
333
+ classes: _angular_core.Signal<string>;
334
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmAccordionContentDirective, never>;
335
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmAccordionContentDirective, "[lumaAccordionContent]", never, {}, {}, never, never, true, never>;
336
+ }
337
+
338
+ declare class LmTooltipDirective implements OnDestroy {
339
+ private el;
340
+ private renderer;
341
+ private platformId;
342
+ lumaTooltip: _angular_core.InputSignal<string>;
343
+ lmPosition: _angular_core.InputSignal<TooltipPosition>;
344
+ lmHtml: _angular_core.InputSignal<boolean>;
345
+ lmTrigger: _angular_core.InputSignal<"click" | "hover" | "focus">;
346
+ lmDelay: _angular_core.InputSignal<number>;
347
+ isVisible: _angular_core.WritableSignal<boolean>;
348
+ actualPosition: _angular_core.WritableSignal<TooltipPosition>;
349
+ tooltipId: string;
350
+ private tooltipElement;
351
+ private showTimeout;
352
+ classes: _angular_core.Signal<string>;
353
+ constructor();
354
+ private ensureTooltipElement;
355
+ private updateContent;
356
+ private updateClasses;
357
+ private isTouchDevice;
358
+ private getFlippedPosition;
359
+ onMouseEnter(): void;
360
+ onMouseLeave(): void;
361
+ onClick(): void;
362
+ onFocus(): void;
363
+ onBlur(): void;
364
+ onEscape(): void;
365
+ onDocumentClick(event: Event): void;
366
+ onDocumentTouch(event: TouchEvent): void;
367
+ show(): void;
368
+ hide(): void;
369
+ toggle(): void;
370
+ ngOnDestroy(): void;
371
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmTooltipDirective, never>;
372
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmTooltipDirective, "[lumaTooltip]", never, { "lumaTooltip": { "alias": "lumaTooltip"; "required": true; "isSignal": true; }; "lmPosition": { "alias": "lmPosition"; "required": false; "isSignal": true; }; "lmHtml": { "alias": "lmHtml"; "required": false; "isSignal": true; }; "lmTrigger": { "alias": "lmTrigger"; "required": false; "isSignal": true; }; "lmDelay": { "alias": "lmDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
373
+ }
374
+
375
+ interface TabsGroupBase {
376
+ /** Currently selected tab value */
377
+ value: WritableSignal<string | null>;
378
+ /** Visual style of the tabs (underline, background, pill) */
379
+ lmVariant: Signal<TabsStyle>;
380
+ /** Whether to lazy load panel content */
381
+ lmLazy: Signal<boolean>;
382
+ /** Select a tab by value */
383
+ select(value: string): void;
384
+ /** Register a trigger element */
385
+ registerTrigger(value: string, element: HTMLElement): void;
386
+ /** Unregister a trigger element */
387
+ unregisterTrigger(value: string): void;
388
+ /** Get all registered triggers */
389
+ getTriggers(): Map<string, HTMLElement>;
390
+ /** Focus next trigger (for keyboard navigation) */
391
+ focusNextTrigger(): void;
392
+ /** Focus previous trigger (for keyboard navigation) */
393
+ focusPreviousTrigger(): void;
394
+ /** Focus first trigger */
395
+ focusFirstTrigger(): void;
396
+ /** Focus last trigger */
397
+ focusLastTrigger(): void;
398
+ }
399
+ interface TabsListBase {
400
+ /** Reference to the native element */
401
+ elementRef: {
402
+ nativeElement: HTMLElement;
403
+ };
404
+ /** Get the currently active trigger element */
405
+ getActiveTrigger(): HTMLElement | null;
406
+ }
407
+ /**
408
+ * Injection token for tabs group
409
+ * Allows child components to access parent tabs state
410
+ */
411
+ declare const TABS_GROUP: InjectionToken<TabsGroupBase>;
412
+ /**
413
+ * Injection token for tabs list
414
+ * Allows indicator to access trigger positions
415
+ */
416
+ declare const TABS_LIST: InjectionToken<TabsListBase>;
417
+
418
+ /**
419
+ * Tabs container component
420
+ *
421
+ * Manages tab selection state, keyboard navigation, and provides context
422
+ * to child components (TabsList, TabsTrigger, TabsPanel).
423
+ *
424
+ * @example
425
+ * ```html
426
+ * <luma-tabs [lmValue]="selectedTab()" (lmValueChange)="onSelect($event)">
427
+ * <div lumaTabsList>
428
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
429
+ * <button lumaTabsTrigger="tab-2">Tab 2</button>
430
+ * </div>
431
+ * <div lumaTabsPanel="tab-1">Content 1</div>
432
+ * <div lumaTabsPanel="tab-2">Content 2</div>
433
+ * </luma-tabs>
434
+ * ```
435
+ */
436
+ declare class LmTabsComponent implements TabsGroupBase {
437
+ /** Controlled value - currently selected tab */
438
+ lmValue: _angular_core.InputSignal<string | null>;
439
+ /** Default value for uncontrolled mode */
440
+ lmDefaultValue: _angular_core.InputSignal<string>;
441
+ /** Visual style: underline, background, or pill */
442
+ lmVariant: _angular_core.InputSignal<TabsStyle>;
443
+ /** Whether to lazy load panel content */
444
+ lmLazy: _angular_core.InputSignal<boolean>;
445
+ /** Emits when selected tab changes */
446
+ lmValueChange: _angular_core.OutputEmitterRef<string>;
447
+ /** Internal state for the selected value */
448
+ value: _angular_core.WritableSignal<string | null>;
449
+ /** Map of registered triggers for keyboard navigation */
450
+ private triggers;
451
+ /** Ordered list of trigger values for navigation */
452
+ private triggerOrder;
453
+ constructor();
454
+ /**
455
+ * Select a tab by value
456
+ */
457
+ select(tabValue: string): void;
458
+ /**
459
+ * Register a trigger element for keyboard navigation
460
+ */
461
+ registerTrigger(tabValue: string, element: HTMLElement): void;
462
+ /**
463
+ * Unregister a trigger element
464
+ */
465
+ unregisterTrigger(tabValue: string): void;
466
+ /**
467
+ * Get all registered triggers
468
+ */
469
+ getTriggers(): Map<string, HTMLElement>;
470
+ /**
471
+ * Focus next trigger in the list
472
+ */
473
+ focusNextTrigger(): void;
474
+ /**
475
+ * Focus previous trigger in the list
476
+ */
477
+ focusPreviousTrigger(): void;
478
+ /**
479
+ * Focus first trigger
480
+ */
481
+ focusFirstTrigger(): void;
482
+ /**
483
+ * Focus last trigger
484
+ */
485
+ focusLastTrigger(): void;
486
+ private getCurrentTriggerIndex;
487
+ private focusTriggerAtIndex;
488
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmTabsComponent, never>;
489
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmTabsComponent, "luma-tabs", never, { "lmValue": { "alias": "lmValue"; "required": false; "isSignal": true; }; "lmDefaultValue": { "alias": "lmDefaultValue"; "required": false; "isSignal": true; }; "lmVariant": { "alias": "lmVariant"; "required": false; "isSignal": true; }; "lmLazy": { "alias": "lmLazy"; "required": false; "isSignal": true; }; }, { "lmValueChange": "lmValueChange"; }, never, ["*"], true, never>;
490
+ }
491
+
492
+ /**
493
+ * Tabs list directive
494
+ *
495
+ * Container for tab triggers with role="tablist".
496
+ * Provides context for the indicator component.
497
+ *
498
+ * @example
499
+ * ```html
500
+ * <div lumaTabsList>
501
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
502
+ * <button lumaTabsTrigger="tab-2">Tab 2</button>
503
+ * </div>
504
+ * ```
505
+ */
506
+ declare class LmTabsListDirective implements TabsListBase {
507
+ readonly elementRef: ElementRef<any>;
508
+ protected readonly tabsGroup: _lumaui_angular.TabsGroupBase;
509
+ /** Whether horizontal scrolling is enabled */
510
+ lmScrollable: boolean;
511
+ classes: _angular_core.Signal<string>;
512
+ /**
513
+ * Get the currently active trigger element
514
+ */
515
+ getActiveTrigger(): HTMLElement | null;
516
+ /**
517
+ * Handle mouse wheel for horizontal scroll
518
+ */
519
+ onWheel(event: WheelEvent): void;
520
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmTabsListDirective, never>;
521
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmTabsListDirective, "[lumaTabsList]", never, {}, {}, never, never, true, never>;
522
+ }
523
+
524
+ /**
525
+ * Tabs trigger directive
526
+ *
527
+ * Individual tab button with role="tab" and keyboard navigation support.
528
+ * Follows WAI-ARIA tabs pattern with roving tabindex.
529
+ *
530
+ * @example
531
+ * ```html
532
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
533
+ * ```
534
+ */
535
+ declare class LmTabsTriggerDirective implements OnInit, OnDestroy {
536
+ private readonly el;
537
+ private readonly tabsGroup;
538
+ /** Tab value identifier */
539
+ lumaTabsTrigger: _angular_core.InputSignal<string>;
540
+ /** Whether this trigger is disabled */
541
+ lmDisabled: _angular_core.InputSignal<boolean>;
542
+ /** Computed: whether this tab is selected */
543
+ isSelected: _angular_core.Signal<boolean>;
544
+ /** Computed: ID for the trigger element */
545
+ triggerId: _angular_core.Signal<string>;
546
+ /** Computed: ID for the corresponding panel */
547
+ panelId: _angular_core.Signal<string>;
548
+ /** Computed: CSS classes from CVA */
549
+ classes: _angular_core.Signal<string>;
550
+ ngOnInit(): void;
551
+ ngOnDestroy(): void;
552
+ onClick(): void;
553
+ onKeydown(event: KeyboardEvent): void;
554
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmTabsTriggerDirective, never>;
555
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmTabsTriggerDirective, "[lumaTabsTrigger]", never, { "lumaTabsTrigger": { "alias": "lumaTabsTrigger"; "required": true; "isSignal": true; }; "lmDisabled": { "alias": "lmDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
556
+ }
557
+
558
+ /**
559
+ * Tabs panel directive
560
+ *
561
+ * Content panel with role="tabpanel" and lazy loading support.
562
+ * When lazy loading is enabled, content is only rendered after
563
+ * the tab has been selected at least once, then cached.
564
+ *
565
+ * @example
566
+ * ```html
567
+ * <div lumaTabsPanel="tab-1">Content 1</div>
568
+ *
569
+ * <!-- With lazy loading (default when lmLazy=true on parent) -->
570
+ * <ng-template lumaTabsPanel="tab-1">
571
+ * <expensive-component />
572
+ * </ng-template>
573
+ * ```
574
+ */
575
+ declare class LmTabsPanelDirective {
576
+ private readonly tabsGroup;
577
+ private readonly templateRef;
578
+ private readonly viewContainer;
579
+ /** Panel value identifier */
580
+ lumaTabsPanel: _angular_core.InputSignal<string>;
581
+ /** Track if panel has ever been selected (for lazy loading cache) */
582
+ private hasBeenSelected;
583
+ /** Computed: whether this panel is currently selected */
584
+ isSelected: _angular_core.Signal<boolean>;
585
+ /** Computed: whether this panel should be visible/rendered */
586
+ isVisible: _angular_core.Signal<boolean>;
587
+ /** Computed: whether content should be rendered (for lazy loading) */
588
+ shouldRender: _angular_core.Signal<boolean>;
589
+ /** Computed: ID for the panel element */
590
+ panelId: _angular_core.Signal<string>;
591
+ /** Computed: ID for the corresponding trigger */
592
+ triggerId: _angular_core.Signal<string>;
593
+ /** Computed: CSS classes from CVA */
594
+ classes: _angular_core.Signal<string>;
595
+ constructor();
596
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmTabsPanelDirective, never>;
597
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmTabsPanelDirective, "[lumaTabsPanel]", never, { "lumaTabsPanel": { "alias": "lumaTabsPanel"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
598
+ }
599
+
600
+ /**
601
+ * Tabs indicator component
602
+ *
603
+ * Animated indicator that slides between tabs for the underline style.
604
+ * Uses CSS transform for smooth, GPU-accelerated animation.
605
+ *
606
+ * @example
607
+ * ```html
608
+ * <div lumaTabsList>
609
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
610
+ * <button lumaTabsTrigger="tab-2">Tab 2</button>
611
+ * <luma-tabs-indicator />
612
+ * </div>
613
+ * ```
614
+ */
615
+ declare class LmTabsIndicatorComponent implements AfterViewInit, OnDestroy {
616
+ private readonly platformId;
617
+ private readonly tabsGroup;
618
+ private readonly tabsList;
619
+ /** Indicator width in pixels */
620
+ indicatorWidth: _angular_core.WritableSignal<number>;
621
+ /** Indicator X or Y position */
622
+ private indicatorPosition;
623
+ /** Resize observer for recalculating position */
624
+ private resizeObserver;
625
+ /** Computed: CSS classes from CVA */
626
+ classes: _angular_core.Signal<string>;
627
+ /** Computed: CSS transform for positioning */
628
+ indicatorTransform: _angular_core.Signal<string>;
629
+ constructor();
630
+ ngAfterViewInit(): void;
631
+ ngOnDestroy(): void;
632
+ private updateIndicatorPosition;
633
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmTabsIndicatorComponent, never>;
634
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmTabsIndicatorComponent, "luma-tabs-indicator", never, {}, {}, never, never, true, never>;
635
+ }
636
+
637
+ /**
638
+ * Modal size variants
639
+ */
640
+ type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
641
+ /**
642
+ * Interface for modal context that child components/directives can access
643
+ */
644
+ interface ModalContext {
645
+ /** Whether the modal is currently open */
646
+ isOpen: Signal<boolean>;
647
+ /** Open the modal */
648
+ open: () => void;
649
+ /** Close the modal */
650
+ close: () => void;
651
+ /** Modal size variant */
652
+ size: Signal<ModalSize>;
653
+ /** Whether to close on overlay click */
654
+ closeOnOverlay: Signal<boolean>;
655
+ /** Whether to close on Escape key */
656
+ closeOnEscape: Signal<boolean>;
657
+ /** Unique ID for accessibility */
658
+ modalId: string;
659
+ }
660
+ /**
661
+ * Injection token for modal context
662
+ * Allows child components to access parent modal state
663
+ */
664
+ declare const MODAL_CONTEXT: InjectionToken<ModalContext>;
665
+
666
+ /**
667
+ * Modal container component
668
+ *
669
+ * Manages modal open/close state, escape key handling, and provides context
670
+ * to child components (ModalOverlay, ModalContainer, etc.).
671
+ *
672
+ * Supports both controlled and uncontrolled modes:
673
+ * - Controlled: Use [lmOpen] and (lmOpenChange)
674
+ * - Uncontrolled: Use [lmDefaultOpen] and access via template reference
675
+ *
676
+ * @example
677
+ * ```html
678
+ * <!-- Controlled mode -->
679
+ * <luma-modal [lmOpen]="isOpen()" (lmOpenChange)="isOpen.set($event)">
680
+ * <luma-modal-overlay>
681
+ * <luma-modal-container>
682
+ * <div lumaModalHeader>
683
+ * <h2 lumaModalTitle>Title</h2>
684
+ * <luma-modal-close />
685
+ * </div>
686
+ * <div lumaModalContent>Content</div>
687
+ * <div lumaModalFooter>
688
+ * <button lumaButton (click)="isOpen.set(false)">Close</button>
689
+ * </div>
690
+ * </luma-modal-container>
691
+ * </luma-modal-overlay>
692
+ * </luma-modal>
693
+ *
694
+ * <!-- Uncontrolled mode -->
695
+ * <luma-modal #modal [lmDefaultOpen]="false">
696
+ * ...
697
+ * </luma-modal>
698
+ * <button (click)="modal.open()">Open</button>
699
+ * ```
700
+ */
701
+ declare class LmModalComponent implements ModalContext, OnDestroy {
702
+ private readonly platformId;
703
+ private readonly document;
704
+ /** Controlled open state (null = uncontrolled mode) */
705
+ lmOpen: _angular_core.InputSignal<boolean | null>;
706
+ /** Default open state for uncontrolled mode */
707
+ lmDefaultOpen: _angular_core.InputSignal<boolean>;
708
+ /** Size variant */
709
+ lmSize: _angular_core.InputSignal<ModalSize>;
710
+ /** Close when clicking the overlay */
711
+ lmCloseOnOverlay: _angular_core.InputSignal<boolean>;
712
+ /** Close when pressing Escape key */
713
+ lmCloseOnEscape: _angular_core.InputSignal<boolean>;
714
+ /** Emits when open state changes */
715
+ lmOpenChange: _angular_core.OutputEmitterRef<boolean>;
716
+ /** Internal open state for uncontrolled mode */
717
+ private internalOpen;
718
+ /** Unique modal ID for accessibility */
719
+ readonly modalId: string;
720
+ /** Previously focused element for focus restoration */
721
+ private previouslyFocused;
722
+ /** Escape key handler */
723
+ private escapeHandler;
724
+ /** Computed: current open state (controlled or uncontrolled) */
725
+ isOpen: _angular_core.Signal<boolean>;
726
+ /** Computed: size signal for context */
727
+ size: _angular_core.Signal<ModalSize>;
728
+ /** Computed: closeOnOverlay signal for context */
729
+ closeOnOverlay: _angular_core.Signal<boolean>;
730
+ /** Computed: closeOnEscape signal for context */
731
+ closeOnEscape: _angular_core.Signal<boolean>;
732
+ constructor();
733
+ ngOnDestroy(): void;
734
+ /**
735
+ * Open the modal
736
+ */
737
+ open(): void;
738
+ /**
739
+ * Close the modal
740
+ */
741
+ close(): void;
742
+ private storeFocus;
743
+ private restoreFocus;
744
+ private lockBodyScroll;
745
+ private unlockBodyScroll;
746
+ private registerEscapeHandler;
747
+ private unregisterEscapeHandler;
748
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalComponent, never>;
749
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmModalComponent, "luma-modal", never, { "lmOpen": { "alias": "lmOpen"; "required": false; "isSignal": true; }; "lmDefaultOpen": { "alias": "lmDefaultOpen"; "required": false; "isSignal": true; }; "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; "lmCloseOnOverlay": { "alias": "lmCloseOnOverlay"; "required": false; "isSignal": true; }; "lmCloseOnEscape": { "alias": "lmCloseOnEscape"; "required": false; "isSignal": true; }; }, { "lmOpenChange": "lmOpenChange"; }, never, ["*"], true, never>;
750
+ }
751
+
752
+ /**
753
+ * Modal overlay component (backdrop)
754
+ *
755
+ * Provides a semi-transparent backdrop behind the modal.
756
+ * Handles click-to-close when enabled on the parent modal.
757
+ *
758
+ * @example
759
+ * ```html
760
+ * <luma-modal [lmOpen]="isOpen()">
761
+ * <luma-modal-overlay>
762
+ * <luma-modal-container>...</luma-modal-container>
763
+ * </luma-modal-overlay>
764
+ * </luma-modal>
765
+ * ```
766
+ */
767
+ declare class LmModalOverlayComponent {
768
+ private readonly modal;
769
+ /** Computed classes from CVA */
770
+ classes: _angular_core.Signal<string>;
771
+ /**
772
+ * Handle click on overlay (not on children)
773
+ */
774
+ onOverlayClick(event: MouseEvent): void;
775
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalOverlayComponent, never>;
776
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmModalOverlayComponent, "luma-modal-overlay", never, {}, {}, never, ["*"], true, never>;
777
+ }
778
+
779
+ /**
780
+ * Modal container component (dialog box)
781
+ *
782
+ * Contains the modal content and handles:
783
+ * - ARIA attributes for accessibility
784
+ * - Focus trap when modal is open
785
+ * - Size variants
786
+ *
787
+ * @example
788
+ * ```html
789
+ * <luma-modal-overlay>
790
+ * <luma-modal-container>
791
+ * <div lumaModalHeader>...</div>
792
+ * <div lumaModalContent>...</div>
793
+ * <div lumaModalFooter>...</div>
794
+ * </luma-modal-container>
795
+ * </luma-modal-overlay>
796
+ * ```
797
+ */
798
+ declare class LmModalContainerComponent implements AfterViewInit, OnDestroy {
799
+ readonly modal: _lumaui_angular.ModalContext;
800
+ private readonly elementRef;
801
+ private readonly platformId;
802
+ /** Focus trap keydown handler */
803
+ private focusTrapHandler;
804
+ /** ID for aria-labelledby */
805
+ titleId: _angular_core.Signal<string>;
806
+ /** Computed classes from CVA */
807
+ classes: _angular_core.Signal<string>;
808
+ constructor();
809
+ ngAfterViewInit(): void;
810
+ ngOnDestroy(): void;
811
+ /**
812
+ * Get all focusable elements within the modal
813
+ */
814
+ private getFocusableElements;
815
+ /**
816
+ * Focus the first focusable element
817
+ */
818
+ private focusFirstElement;
819
+ /**
820
+ * Setup focus trap to keep focus within modal
821
+ */
822
+ private setupFocusTrap;
823
+ /**
824
+ * Remove focus trap handler
825
+ */
826
+ private removeFocusTrap;
827
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalContainerComponent, never>;
828
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmModalContainerComponent, "luma-modal-container", never, {}, {}, never, ["*"], true, never>;
829
+ }
830
+
831
+ /**
832
+ * Modal header directive
833
+ *
834
+ * Container for modal title and close button.
835
+ * Provides consistent padding and border styling.
836
+ *
837
+ * @example
838
+ * ```html
839
+ * <div lumaModalHeader>
840
+ * <h2 lumaModalTitle>Modal Title</h2>
841
+ * <luma-modal-close />
842
+ * </div>
843
+ * ```
844
+ */
845
+ declare class LmModalHeaderDirective {
846
+ /** Computed classes from CVA */
847
+ classes: _angular_core.Signal<string>;
848
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalHeaderDirective, never>;
849
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmModalHeaderDirective, "[lumaModalHeader]", never, {}, {}, never, never, true, never>;
850
+ }
851
+
852
+ /**
853
+ * Modal title directive
854
+ *
855
+ * Provides consistent typography for modal titles.
856
+ * Automatically links to aria-labelledby on the modal container.
857
+ *
858
+ * @example
859
+ * ```html
860
+ * <h2 lumaModalTitle>Modal Title</h2>
861
+ * <h2 lumaModalTitle lmSize="lg">Large Title</h2>
862
+ * ```
863
+ */
864
+ declare class LmModalTitleDirective {
865
+ private readonly modal;
866
+ /** Title size variant */
867
+ lmSize: _angular_core.InputSignal<"sm" | "md" | "lg">;
868
+ /** ID for aria-labelledby connection */
869
+ titleId: _angular_core.Signal<string>;
870
+ /** Computed classes from CVA */
871
+ classes: _angular_core.Signal<string>;
872
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalTitleDirective, never>;
873
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmModalTitleDirective, "[lumaModalTitle]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
874
+ }
875
+
876
+ /**
877
+ * Modal content directive
878
+ *
879
+ * Container for the main modal content.
880
+ * Supports scrolling when content exceeds available space.
881
+ *
882
+ * @example
883
+ * ```html
884
+ * <div lumaModalContent>
885
+ * Content that doesn't scroll
886
+ * </div>
887
+ *
888
+ * <div lumaModalContent [lmScrollable]="true">
889
+ * Long content that scrolls...
890
+ * </div>
891
+ * ```
892
+ */
893
+ declare class LmModalContentDirective {
894
+ /** Enable scroll when content overflows */
895
+ lmScrollable: _angular_core.InputSignal<boolean>;
896
+ /** Computed classes from CVA */
897
+ classes: _angular_core.Signal<string>;
898
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalContentDirective, never>;
899
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmModalContentDirective, "[lumaModalContent]", never, { "lmScrollable": { "alias": "lmScrollable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
900
+ }
901
+
902
+ /**
903
+ * Modal footer directive
904
+ *
905
+ * Container for modal actions (buttons, etc.).
906
+ * Provides consistent padding and flexible alignment.
907
+ *
908
+ * @example
909
+ * ```html
910
+ * <div lumaModalFooter>
911
+ * <button lumaButton lmVariant="ghost">Cancel</button>
912
+ * <button lumaButton>Confirm</button>
913
+ * </div>
914
+ *
915
+ * <div lumaModalFooter lmAlign="between">
916
+ * <span>Left content</span>
917
+ * <button lumaButton>Action</button>
918
+ * </div>
919
+ * ```
920
+ */
921
+ declare class LmModalFooterDirective {
922
+ /** Alignment of footer content */
923
+ lmAlign: _angular_core.InputSignal<"start" | "center" | "end" | "between">;
924
+ /** Computed classes from CVA */
925
+ classes: _angular_core.Signal<string>;
926
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalFooterDirective, never>;
927
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LmModalFooterDirective, "[lumaModalFooter]", never, { "lmAlign": { "alias": "lmAlign"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
928
+ }
929
+
930
+ /**
931
+ * Modal close button component
932
+ *
933
+ * Provides a styled close button with an X icon.
934
+ * Can be customized with different content via ng-content.
935
+ *
936
+ * @example
937
+ * ```html
938
+ * <!-- Default X icon -->
939
+ * <luma-modal-close />
940
+ *
941
+ * <!-- Custom aria label -->
942
+ * <luma-modal-close lmAriaLabel="Fechar modal" />
943
+ *
944
+ * <!-- Custom icon -->
945
+ * <luma-modal-close>
946
+ * <svg>...</svg>
947
+ * </luma-modal-close>
948
+ * ```
949
+ */
950
+ declare class LmModalCloseComponent {
951
+ readonly modal: _lumaui_angular.ModalContext;
952
+ /** Accessible label for the close button */
953
+ lmAriaLabel: _angular_core.InputSignal<string>;
954
+ /** Computed aria label */
955
+ ariaLabel: _angular_core.Signal<string>;
956
+ /** Computed classes from CVA */
957
+ classes: _angular_core.Signal<string>;
958
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmModalCloseComponent, never>;
959
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmModalCloseComponent, "luma-modal-close", never, { "lmAriaLabel": { "alias": "lmAriaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
960
+ }
961
+
962
+ /**
963
+ * Toast variant types
964
+ */
965
+ type ToastVariant = 'info' | 'success' | 'warning' | 'error';
966
+ /**
967
+ * Toast position options
968
+ */
969
+ type ToastPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
970
+ /**
971
+ * Toast configuration options passed to ToastService.show()
972
+ */
973
+ interface ToastOptions {
974
+ /** Toast message (required) */
975
+ message: string;
976
+ /** Optional title */
977
+ title?: string;
978
+ /** Visual variant */
979
+ variant?: ToastVariant;
980
+ /** Screen position */
981
+ position?: ToastPosition;
982
+ /** Auto-close duration in milliseconds (0 = no auto-close) */
983
+ duration?: number;
984
+ /** Show close button */
985
+ dismissible?: boolean;
986
+ /** Pause timer on hover */
987
+ pauseOnHover?: boolean;
988
+ /** ARIA role override */
989
+ role?: 'alert' | 'status';
990
+ }
991
+ /**
992
+ * Internal toast representation with all required fields
993
+ */
994
+ interface Toast extends Required<Omit<ToastOptions, 'role'>> {
995
+ /** Unique identifier */
996
+ id: string;
997
+ /** Creation timestamp */
998
+ createdAt: number;
999
+ /** Whether toast is currently animating out */
1000
+ isExiting: boolean;
1001
+ /** ARIA role */
1002
+ role: 'alert' | 'status';
1003
+ }
1004
+ /**
1005
+ * Toast reference for programmatic control
1006
+ */
1007
+ interface ToastRef {
1008
+ /** Unique toast ID */
1009
+ readonly id: string;
1010
+ /** Dismiss this toast */
1011
+ dismiss(): void;
1012
+ /** Observable that emits when dismissed */
1013
+ readonly afterDismissed: Observable<void>;
1014
+ }
1015
+ /**
1016
+ * Global toast configuration
1017
+ */
1018
+ interface ToastConfig {
1019
+ /** Default position */
1020
+ position: ToastPosition;
1021
+ /** Default duration in milliseconds */
1022
+ duration: number;
1023
+ /** Default dismissible state */
1024
+ dismissible: boolean;
1025
+ /** Maximum visible toasts */
1026
+ maxVisible: number;
1027
+ /** Pause on hover by default */
1028
+ pauseOnHover: boolean;
1029
+ }
1030
+ /**
1031
+ * Default toast configuration
1032
+ */
1033
+ declare const DEFAULT_TOAST_CONFIG: ToastConfig;
1034
+ /**
1035
+ * Injection token for global toast configuration
1036
+ */
1037
+ declare const TOAST_CONFIG: InjectionToken<ToastConfig>;
1038
+ /**
1039
+ * Provider function for custom toast configuration
1040
+ */
1041
+ declare function provideToastConfig(config: Partial<ToastConfig>): {
1042
+ provide: InjectionToken<ToastConfig>;
1043
+ useValue: {
1044
+ position: ToastPosition;
1045
+ duration: number;
1046
+ dismissible: boolean;
1047
+ maxVisible: number;
1048
+ pauseOnHover: boolean;
1049
+ };
1050
+ };
1051
+
1052
+ /**
1053
+ * ToastService
1054
+ *
1055
+ * Injectable service for showing toast notifications programmatically.
1056
+ * Provides convenience methods for info, success, warning, and error toasts.
1057
+ *
1058
+ * @example
1059
+ * ```typescript
1060
+ * private toast = inject(ToastService);
1061
+ *
1062
+ * showSuccess() {
1063
+ * this.toast.success('Changes saved successfully!');
1064
+ * }
1065
+ *
1066
+ * showError() {
1067
+ * this.toast.error('Failed to save', {
1068
+ * title: 'Error',
1069
+ * duration: 0
1070
+ * });
1071
+ * }
1072
+ * ```
1073
+ */
1074
+ declare class LmToastService implements OnDestroy {
1075
+ private readonly config;
1076
+ private readonly appRef;
1077
+ private readonly injector;
1078
+ private readonly document;
1079
+ private readonly platformId;
1080
+ private readonly liveAnnouncer;
1081
+ private readonly _toasts;
1082
+ private containerRef;
1083
+ private nextId;
1084
+ private readonly toastRefs;
1085
+ /** Observable list of current toasts */
1086
+ readonly toasts: _angular_core.Signal<Toast[]>;
1087
+ ngOnDestroy(): void;
1088
+ /**
1089
+ * Show a toast notification
1090
+ * @param options - Toast configuration options
1091
+ * @returns ToastRef for programmatic control
1092
+ */
1093
+ show(options: ToastOptions): ToastRef;
1094
+ /**
1095
+ * Show info toast
1096
+ * @param message - Toast message
1097
+ * @param options - Additional options
1098
+ */
1099
+ info(message: string, options?: Partial<ToastOptions>): ToastRef;
1100
+ /**
1101
+ * Show success toast
1102
+ * @param message - Toast message
1103
+ * @param options - Additional options
1104
+ */
1105
+ success(message: string, options?: Partial<ToastOptions>): ToastRef;
1106
+ /**
1107
+ * Show warning toast
1108
+ * @param message - Toast message
1109
+ * @param options - Additional options
1110
+ */
1111
+ warning(message: string, options?: Partial<ToastOptions>): ToastRef;
1112
+ /**
1113
+ * Show error toast
1114
+ * @param message - Toast message
1115
+ * @param options - Additional options
1116
+ */
1117
+ error(message: string, options?: Partial<ToastOptions>): ToastRef;
1118
+ /**
1119
+ * Dismiss a specific toast
1120
+ * @param id - Toast ID to dismiss
1121
+ */
1122
+ dismiss(id: string): void;
1123
+ /**
1124
+ * Dismiss all toasts
1125
+ */
1126
+ dismissAll(): void;
1127
+ /**
1128
+ * Ensure toast container exists in DOM
1129
+ */
1130
+ private ensureContainer;
1131
+ /**
1132
+ * Remove container from DOM
1133
+ */
1134
+ private destroyContainer;
1135
+ /**
1136
+ * Announce toast to screen readers
1137
+ */
1138
+ private announceToast;
1139
+ /**
1140
+ * Get announcement prefix for variant
1141
+ */
1142
+ private getVariantPrefix;
1143
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmToastService, never>;
1144
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<LmToastService>;
1145
+ }
1146
+
1147
+ /**
1148
+ * ToastContainerComponent
1149
+ *
1150
+ * Fixed-position container that renders all active toasts.
1151
+ * Supports all 6 positions simultaneously by grouping toasts by their position.
1152
+ *
1153
+ * @internal This component is created programmatically by ToastService
1154
+ */
1155
+ declare class LmToastContainerComponent {
1156
+ /** Toasts signal passed from ToastService */
1157
+ _toasts: Signal<Toast[]>;
1158
+ /** Dismiss callback passed from ToastService */
1159
+ _onDismiss: (id: string) => void;
1160
+ /** Group toasts by their position */
1161
+ protected readonly toastsByPosition: Signal<Record<ToastPosition$1, Toast[]>>;
1162
+ /** Get CSS classes for a specific position */
1163
+ protected getPositionClasses(position: ToastPosition$1): string;
1164
+ /** Handle dismiss event from toast item */
1165
+ protected onDismiss(id: string): void;
1166
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmToastContainerComponent, never>;
1167
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmToastContainerComponent, "luma-toast-container", never, {}, {}, never, never, true, never>;
42
1168
  }
43
1169
 
44
- declare class CardHeaderDirective {
45
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardHeaderDirective, never>;
46
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardHeaderDirective, "[lumaCardHeader]", never, {}, {}, never, never, true, never>;
1170
+ /**
1171
+ * ToastItemComponent
1172
+ *
1173
+ * Individual toast notification with timer and icon.
1174
+ *
1175
+ * @internal Created by ToastContainerComponent
1176
+ */
1177
+ declare class LmToastItemComponent implements OnInit, OnDestroy {
1178
+ /** Toast data */
1179
+ toast: _angular_core.InputSignal<Toast>;
1180
+ /** Emits when toast should be dismissed */
1181
+ dismiss: _angular_core.OutputEmitterRef<string>;
1182
+ /** Timer subscription */
1183
+ private timerSubscription;
1184
+ /** Remaining time in ms */
1185
+ private remainingTime;
1186
+ /** Whether timer is paused */
1187
+ private isPaused;
1188
+ /** Animation state */
1189
+ private animationState;
1190
+ /** Item CSS classes */
1191
+ protected readonly itemClasses: _angular_core.Signal<string>;
1192
+ /** Icon CSS classes */
1193
+ protected readonly iconClasses: _angular_core.Signal<string>;
1194
+ /** Content CSS classes */
1195
+ protected readonly contentClasses: _angular_core.Signal<string>;
1196
+ /** Title CSS classes */
1197
+ protected readonly titleClasses: _angular_core.Signal<string>;
1198
+ /** Message CSS classes */
1199
+ protected readonly messageClasses: _angular_core.Signal<string>;
1200
+ /** Whether toast has interactive elements */
1201
+ protected readonly hasInteractiveElements: _angular_core.Signal<boolean>;
1202
+ ngOnInit(): void;
1203
+ ngOnDestroy(): void;
1204
+ /** Start auto-close timer */
1205
+ private startTimer;
1206
+ /** Stop timer */
1207
+ private stopTimer;
1208
+ /** Dismiss this toast */
1209
+ private dismissToast;
1210
+ /** Handle close button click */
1211
+ protected onClose(): void;
1212
+ /** Pause timer on mouse enter */
1213
+ protected onMouseEnter(): void;
1214
+ /** Resume timer on mouse leave */
1215
+ protected onMouseLeave(): void;
1216
+ /** Pause timer on focus */
1217
+ protected onFocus(): void;
1218
+ /** Resume timer on blur */
1219
+ protected onBlur(): void;
1220
+ /** Dismiss on Escape key */
1221
+ protected onEscapeKey(): void;
1222
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmToastItemComponent, never>;
1223
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmToastItemComponent, "luma-toast-item", never, { "toast": { "alias": "toast"; "required": true; "isSignal": true; }; }, { "dismiss": "dismiss"; }, never, never, true, never>;
47
1224
  }
48
1225
 
49
- declare class CardContentDirective {
50
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardContentDirective, never>;
51
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardContentDirective, "[lumaCardContent]", never, {}, {}, never, never, true, never>;
1226
+ /**
1227
+ * ToastCloseComponent
1228
+ *
1229
+ * Close button for toast notifications.
1230
+ * Styled according to the toast variant.
1231
+ *
1232
+ * @internal Used by ToastItemComponent
1233
+ */
1234
+ declare class LmToastCloseComponent {
1235
+ /** Toast variant for styling */
1236
+ lmVariant: _angular_core.InputSignal<ToastVariant$1>;
1237
+ /** CSS classes */
1238
+ protected readonly classes: _angular_core.Signal<string>;
1239
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LmToastCloseComponent, never>;
1240
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LmToastCloseComponent, "luma-toast-close", never, { "lmVariant": { "alias": "lmVariant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
52
1241
  }
53
1242
 
54
- export { ButtonDirective, CardComponent, CardContentDirective, CardDescriptionDirective, CardHeaderDirective, CardTitleDirective };
1243
+ export { ACCORDION_ITEM, DEFAULT_TOAST_CONFIG, LmAccordionContentDirective, LmAccordionGroupComponent, LmAccordionIconDirective, LmAccordionItemComponent, LmAccordionTitleDirective, LmAccordionTriggerDirective, LmBadgeDirective, LmButtonDirective, LmCardComponent, LmCardContentDirective, LmCardDescriptionDirective, LmCardHeaderDirective, LmCardTitleDirective, LmModalCloseComponent, LmModalComponent, LmModalContainerComponent, LmModalContentDirective, LmModalFooterDirective, LmModalHeaderDirective, LmModalOverlayComponent, LmModalTitleDirective, LmTabsComponent, LmTabsIndicatorComponent, LmTabsListDirective, LmTabsPanelDirective, LmTabsTriggerDirective, LmToastCloseComponent, LmToastContainerComponent, LmToastItemComponent, LmToastService, LmTooltipDirective, MODAL_CONTEXT, TABS_GROUP, TABS_LIST, TOAST_CONFIG, provideToastConfig };
1244
+ export type { AccordionItemBase, ModalContext, ModalSize, TabsGroupBase, TabsListBase, Toast, ToastConfig, ToastOptions, ToastPosition, ToastRef, ToastVariant };