@lumaui/angular 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,7 @@
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 } from '@lumaui/core';
4
+ import * as _lumaui_angular from '@lumaui/angular';
3
5
 
4
6
  declare class ButtonDirective {
5
7
  lmVariant: _angular_core.InputSignal<ButtonVariant>;
@@ -12,6 +14,13 @@ declare class ButtonDirective {
12
14
  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>;
13
15
  }
14
16
 
17
+ declare class BadgeDirective {
18
+ classes: _angular_core.Signal<string>;
19
+ get hostClasses(): string;
20
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeDirective, never>;
21
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BadgeDirective, "[lumaBadge]", never, {}, {}, never, never, true, never>;
22
+ }
23
+
15
24
  declare class CardComponent {
16
25
  /**
17
26
  * Card visual style variant
@@ -51,4 +60,902 @@ declare class CardContentDirective {
51
60
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CardContentDirective, "[lumaCardContent]", never, {}, {}, never, never, true, never>;
52
61
  }
53
62
 
54
- export { ButtonDirective, CardComponent, CardContentDirective, CardDescriptionDirective, CardHeaderDirective, CardTitleDirective };
63
+ /**
64
+ * AccordionGroupComponent
65
+ *
66
+ * Optional wrapper component that coordinates multiple accordion items.
67
+ * Supports controlled pattern for implementing business logic like:
68
+ * - Single item open at a time
69
+ * - Multiple items open
70
+ * - Always keep first/last item open
71
+ * - Maximum number of open items
72
+ *
73
+ * @example Controlled single mode
74
+ * ```html
75
+ * <luma-accordion-group [lmValue]="activeItem()" (lmValueChange)="activeItem.set($event)">
76
+ * <luma-accordion-item lmId="item-1">...</luma-accordion-item>
77
+ * <luma-accordion-item lmId="item-2">...</luma-accordion-item>
78
+ * </luma-accordion-group>
79
+ * ```
80
+ *
81
+ * @example Controlled multiple mode
82
+ * ```html
83
+ * <luma-accordion-group [lmValue]="activeItems()" (lmValueChange)="activeItems.set($event)">
84
+ * <luma-accordion-item lmId="item-1">...</luma-accordion-item>
85
+ * <luma-accordion-item lmId="item-2">...</luma-accordion-item>
86
+ * </luma-accordion-group>
87
+ * ```
88
+ */
89
+ declare class AccordionGroupComponent {
90
+ /**
91
+ * Controlled value for which items are open
92
+ * - null: uncontrolled mode (each item manages its own state)
93
+ * - string: single item mode (ID of open item)
94
+ * - string[]: multiple items mode (IDs of open items)
95
+ */
96
+ lmValue: _angular_core.InputSignal<string | string[] | null>;
97
+ /**
98
+ * Emitted when an item is toggled
99
+ * Returns the new value (string for single mode, string[] for multiple)
100
+ */
101
+ lmValueChange: _angular_core.OutputEmitterRef<string | string[]>;
102
+ /**
103
+ * Force single mode even when lmValue is an array
104
+ * When true, only one item can be open at a time
105
+ */
106
+ lmSingle: _angular_core.InputSignal<boolean>;
107
+ /**
108
+ * Toggle an item by its ID
109
+ * Called by child AccordionItemComponent when toggled
110
+ */
111
+ toggleItem(itemId: string): void;
112
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionGroupComponent, never>;
113
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionGroupComponent, "luma-accordion-group", never, { "lmValue": { "alias": "lmValue"; "required": false; "isSignal": true; }; "lmSingle": { "alias": "lmSingle"; "required": false; "isSignal": true; }; }, { "lmValueChange": "lmValueChange"; }, never, ["*"], true, never>;
114
+ }
115
+
116
+ /**
117
+ * Interface for accordion item state that child directives can access
118
+ */
119
+ interface AccordionItemBase {
120
+ /** Whether the accordion item is currently open */
121
+ isOpen: Signal<boolean>;
122
+ /** Whether the accordion item is disabled */
123
+ lmDisabled: Signal<boolean>;
124
+ /** Toggle the accordion open/closed state */
125
+ toggle(): void;
126
+ }
127
+ /**
128
+ * Injection token for accordion item
129
+ * Allows child directives to access parent accordion item state
130
+ */
131
+ declare const ACCORDION_ITEM: InjectionToken<AccordionItemBase>;
132
+
133
+ /**
134
+ * AccordionItemComponent
135
+ *
136
+ * Wrapper component that contains the trigger and content.
137
+ * Can be used standalone or within an AccordionGroupComponent.
138
+ *
139
+ * @example Standalone usage
140
+ * ```html
141
+ * <luma-accordion-item>
142
+ * <button lumaAccordionTrigger>
143
+ * <span lumaAccordionTitle>Title</span>
144
+ * <svg lumaAccordionIcon>...</svg>
145
+ * </button>
146
+ * <div lumaAccordionContent>Content here...</div>
147
+ * </luma-accordion-item>
148
+ * ```
149
+ *
150
+ * @example With variants
151
+ * ```html
152
+ * <luma-accordion-item lmVariant="filled">
153
+ * ...
154
+ * </luma-accordion-item>
155
+ * ```
156
+ */
157
+ declare class AccordionItemComponent implements AccordionItemBase {
158
+ private group;
159
+ private el;
160
+ private renderer;
161
+ private previousClasses;
162
+ constructor();
163
+ /**
164
+ * Unique identifier for this item (required when using AccordionGroup)
165
+ */
166
+ lmId: _angular_core.InputSignal<string>;
167
+ /**
168
+ * Visual style variant
169
+ * - default: Standard with border
170
+ * - bordered: FAQ-style stacked items
171
+ * - filled: Solid background (unified trigger/content)
172
+ */
173
+ lmVariant: _angular_core.InputSignal<AccordionItemVariant>;
174
+ /**
175
+ * Initial/controlled open state (for standalone usage)
176
+ */
177
+ lmOpen: _angular_core.InputSignal<boolean>;
178
+ /**
179
+ * Whether the accordion item is disabled
180
+ */
181
+ lmDisabled: _angular_core.InputSignal<boolean>;
182
+ /**
183
+ * Emitted when the open state changes
184
+ * Useful for tracking/analytics
185
+ */
186
+ lmOpenChange: _angular_core.OutputEmitterRef<boolean>;
187
+ private _isOpen;
188
+ /**
189
+ * Computed open state
190
+ * Priority: group controlled > lmOpen input > internal state
191
+ */
192
+ isOpen: _angular_core.Signal<boolean>;
193
+ wrapperClasses: _angular_core.Signal<string>;
194
+ contentWrapperClasses: _angular_core.Signal<string>;
195
+ /**
196
+ * Toggle the accordion open/closed state
197
+ */
198
+ toggle(): void;
199
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionItemComponent, never>;
200
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionItemComponent, "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>;
201
+ }
202
+
203
+ /**
204
+ * AccordionTriggerDirective
205
+ *
206
+ * Applied to a div element to make it the clickable trigger for the accordion.
207
+ * Uses div instead of button for maximum layout flexibility.
208
+ * Handles ARIA attributes and keyboard navigation automatically.
209
+ *
210
+ * @example Basic usage
211
+ * ```html
212
+ * <div lumaAccordionTrigger>
213
+ * <span lumaAccordionTitle>Title</span>
214
+ * <span lumaAccordionIcon>
215
+ * <svg>...</svg>
216
+ * </span>
217
+ * </div>
218
+ * ```
219
+ *
220
+ * @example Custom layout
221
+ * ```html
222
+ * <div lumaAccordionTrigger class="grid grid-cols-[auto_1fr_auto] gap-4">
223
+ * <svg class="w-6 h-6">...</svg>
224
+ * <div>
225
+ * <span lumaAccordionTitle>Title</span>
226
+ * <p class="text-sm">Description</p>
227
+ * </div>
228
+ * <span lumaAccordionIcon>
229
+ * <svg>...</svg>
230
+ * </span>
231
+ * </div>
232
+ * ```
233
+ */
234
+ declare class AccordionTriggerDirective {
235
+ protected item: _lumaui_angular.AccordionItemBase;
236
+ private id;
237
+ triggerId: string;
238
+ contentId: string;
239
+ classes: _angular_core.Signal<string>;
240
+ onClick(event: Event): void;
241
+ onKeydown(event: KeyboardEvent): void;
242
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionTriggerDirective, never>;
243
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AccordionTriggerDirective, "div[lumaAccordionTrigger]", never, {}, {}, never, never, true, never>;
244
+ }
245
+
246
+ /**
247
+ * AccordionTitleDirective
248
+ *
249
+ * Applies typography styles to the accordion title.
250
+ * Supports size variants for different visual hierarchies.
251
+ *
252
+ * @example Basic usage
253
+ * ```html
254
+ * <span lumaAccordionTitle>What is Luma UI?</span>
255
+ * ```
256
+ *
257
+ * @example With size variant
258
+ * ```html
259
+ * <span lumaAccordionTitle lmSize="lg">Large Title</span>
260
+ * ```
261
+ */
262
+ declare class AccordionTitleDirective {
263
+ /**
264
+ * Size variant for the title
265
+ * - sm: Small text for compact UIs
266
+ * - md: Default size (base text)
267
+ * - lg: Large text for emphasis
268
+ */
269
+ lmSize: _angular_core.InputSignal<AccordionTitleSize>;
270
+ classes: _angular_core.Signal<string>;
271
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionTitleDirective, never>;
272
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AccordionTitleDirective, "[lumaAccordionTitle]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
273
+ }
274
+
275
+ /**
276
+ * AccordionIconDirective
277
+ *
278
+ * Applies rotation animation to the accordion icon (typically a chevron).
279
+ * Must be placed on a wrapper element (span or div), not directly on the SVG.
280
+ * Automatically rotates based on the open state of the parent accordion item.
281
+ *
282
+ * @example With span wrapper (recommended)
283
+ * ```html
284
+ * <span lumaAccordionIcon>
285
+ * <svg viewBox="0 0 24 24" class="w-4 h-4">
286
+ * <path stroke="currentColor" stroke-width="2" d="M19 9l-7 7-7-7" />
287
+ * </svg>
288
+ * </span>
289
+ * ```
290
+ *
291
+ * @example With div wrapper
292
+ * ```html
293
+ * <div lumaAccordionIcon>
294
+ * <my-chevron-icon></my-chevron-icon>
295
+ * </div>
296
+ * ```
297
+ *
298
+ * @example Customize rotation via CSS variable
299
+ * ```html
300
+ * <span lumaAccordionIcon style="--luma-accordion-icon-rotation: 90deg">
301
+ * <svg>...</svg>
302
+ * </span>
303
+ * ```
304
+ */
305
+ declare class AccordionIconDirective {
306
+ protected item: _lumaui_angular.AccordionItemBase;
307
+ classes: _angular_core.Signal<string>;
308
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionIconDirective, never>;
309
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AccordionIconDirective, "span[lumaAccordionIcon], div[lumaAccordionIcon]", never, {}, {}, never, never, true, never>;
310
+ }
311
+
312
+ /**
313
+ * AccordionContentDirective
314
+ *
315
+ * Applied to the content area of the accordion.
316
+ * Handles visibility, ARIA attributes, and fade animation.
317
+ *
318
+ * @example Basic usage
319
+ * ```html
320
+ * <div lumaAccordionContent>
321
+ * <p>Your content here...</p>
322
+ * </div>
323
+ * ```
324
+ */
325
+ declare class AccordionContentDirective {
326
+ protected item: _lumaui_angular.AccordionItemBase;
327
+ protected trigger: AccordionTriggerDirective | null;
328
+ private id;
329
+ contentId: string;
330
+ triggerId: _angular_core.Signal<string | null>;
331
+ classes: _angular_core.Signal<string>;
332
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionContentDirective, never>;
333
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AccordionContentDirective, "[lumaAccordionContent]", never, {}, {}, never, never, true, never>;
334
+ }
335
+
336
+ declare class TooltipDirective implements OnDestroy {
337
+ private el;
338
+ private renderer;
339
+ private platformId;
340
+ lumaTooltip: _angular_core.InputSignal<string>;
341
+ lmPosition: _angular_core.InputSignal<TooltipPosition>;
342
+ lmHtml: _angular_core.InputSignal<boolean>;
343
+ lmTrigger: _angular_core.InputSignal<"click" | "hover" | "focus">;
344
+ lmDelay: _angular_core.InputSignal<number>;
345
+ isVisible: _angular_core.WritableSignal<boolean>;
346
+ actualPosition: _angular_core.WritableSignal<TooltipPosition>;
347
+ tooltipId: string;
348
+ private tooltipElement;
349
+ private showTimeout;
350
+ classes: _angular_core.Signal<string>;
351
+ constructor();
352
+ private ensureTooltipElement;
353
+ private updateContent;
354
+ private updateClasses;
355
+ private isTouchDevice;
356
+ private getFlippedPosition;
357
+ onMouseEnter(): void;
358
+ onMouseLeave(): void;
359
+ onClick(): void;
360
+ onFocus(): void;
361
+ onBlur(): void;
362
+ onEscape(): void;
363
+ onDocumentClick(event: Event): void;
364
+ onDocumentTouch(event: TouchEvent): void;
365
+ show(): void;
366
+ hide(): void;
367
+ toggle(): void;
368
+ ngOnDestroy(): void;
369
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipDirective, never>;
370
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TooltipDirective, "[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>;
371
+ }
372
+
373
+ interface TabsGroupBase {
374
+ /** Currently selected tab value */
375
+ value: WritableSignal<string | null>;
376
+ /** Visual style of the tabs (underline, background, pill) */
377
+ lmStyle: Signal<TabsStyle>;
378
+ /** Whether to lazy load panel content */
379
+ lmLazy: Signal<boolean>;
380
+ /** Select a tab by value */
381
+ select(value: string): void;
382
+ /** Register a trigger element */
383
+ registerTrigger(value: string, element: HTMLElement): void;
384
+ /** Unregister a trigger element */
385
+ unregisterTrigger(value: string): void;
386
+ /** Get all registered triggers */
387
+ getTriggers(): Map<string, HTMLElement>;
388
+ /** Focus next trigger (for keyboard navigation) */
389
+ focusNextTrigger(): void;
390
+ /** Focus previous trigger (for keyboard navigation) */
391
+ focusPreviousTrigger(): void;
392
+ /** Focus first trigger */
393
+ focusFirstTrigger(): void;
394
+ /** Focus last trigger */
395
+ focusLastTrigger(): void;
396
+ }
397
+ interface TabsListBase {
398
+ /** Reference to the native element */
399
+ elementRef: {
400
+ nativeElement: HTMLElement;
401
+ };
402
+ /** Get the currently active trigger element */
403
+ getActiveTrigger(): HTMLElement | null;
404
+ }
405
+ /**
406
+ * Injection token for tabs group
407
+ * Allows child components to access parent tabs state
408
+ */
409
+ declare const TABS_GROUP: InjectionToken<TabsGroupBase>;
410
+ /**
411
+ * Injection token for tabs list
412
+ * Allows indicator to access trigger positions
413
+ */
414
+ declare const TABS_LIST: InjectionToken<TabsListBase>;
415
+
416
+ /**
417
+ * Tabs container component
418
+ *
419
+ * Manages tab selection state, keyboard navigation, and provides context
420
+ * to child components (TabsList, TabsTrigger, TabsPanel).
421
+ *
422
+ * @example
423
+ * ```html
424
+ * <luma-tabs [lmValue]="selectedTab()" (lmValueChange)="onSelect($event)">
425
+ * <div lumaTabsList>
426
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
427
+ * <button lumaTabsTrigger="tab-2">Tab 2</button>
428
+ * </div>
429
+ * <div lumaTabsPanel="tab-1">Content 1</div>
430
+ * <div lumaTabsPanel="tab-2">Content 2</div>
431
+ * </luma-tabs>
432
+ * ```
433
+ */
434
+ declare class TabsComponent implements TabsGroupBase {
435
+ /** Controlled value - currently selected tab */
436
+ lmValue: _angular_core.InputSignal<string | null>;
437
+ /** Default value for uncontrolled mode */
438
+ lmDefaultValue: _angular_core.InputSignal<string>;
439
+ /** Visual style: underline, background, or pill */
440
+ lmStyle: _angular_core.InputSignal<TabsStyle>;
441
+ /** Whether to lazy load panel content */
442
+ lmLazy: _angular_core.InputSignal<boolean>;
443
+ /** Emits when selected tab changes */
444
+ lmValueChange: _angular_core.OutputEmitterRef<string>;
445
+ /** Internal state for the selected value */
446
+ value: _angular_core.WritableSignal<string | null>;
447
+ /** Map of registered triggers for keyboard navigation */
448
+ private triggers;
449
+ /** Ordered list of trigger values for navigation */
450
+ private triggerOrder;
451
+ constructor();
452
+ /**
453
+ * Select a tab by value
454
+ */
455
+ select(tabValue: string): void;
456
+ /**
457
+ * Register a trigger element for keyboard navigation
458
+ */
459
+ registerTrigger(tabValue: string, element: HTMLElement): void;
460
+ /**
461
+ * Unregister a trigger element
462
+ */
463
+ unregisterTrigger(tabValue: string): void;
464
+ /**
465
+ * Get all registered triggers
466
+ */
467
+ getTriggers(): Map<string, HTMLElement>;
468
+ /**
469
+ * Focus next trigger in the list
470
+ */
471
+ focusNextTrigger(): void;
472
+ /**
473
+ * Focus previous trigger in the list
474
+ */
475
+ focusPreviousTrigger(): void;
476
+ /**
477
+ * Focus first trigger
478
+ */
479
+ focusFirstTrigger(): void;
480
+ /**
481
+ * Focus last trigger
482
+ */
483
+ focusLastTrigger(): void;
484
+ private getCurrentTriggerIndex;
485
+ private focusTriggerAtIndex;
486
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsComponent, never>;
487
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabsComponent, "luma-tabs", never, { "lmValue": { "alias": "lmValue"; "required": false; "isSignal": true; }; "lmDefaultValue": { "alias": "lmDefaultValue"; "required": false; "isSignal": true; }; "lmStyle": { "alias": "lmStyle"; "required": false; "isSignal": true; }; "lmLazy": { "alias": "lmLazy"; "required": false; "isSignal": true; }; }, { "lmValueChange": "lmValueChange"; }, never, ["*"], true, never>;
488
+ }
489
+
490
+ /**
491
+ * Tabs list directive
492
+ *
493
+ * Container for tab triggers with role="tablist".
494
+ * Provides context for the indicator component.
495
+ *
496
+ * @example
497
+ * ```html
498
+ * <div lumaTabsList>
499
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
500
+ * <button lumaTabsTrigger="tab-2">Tab 2</button>
501
+ * </div>
502
+ * ```
503
+ */
504
+ declare class TabsListDirective implements TabsListBase {
505
+ readonly elementRef: ElementRef<any>;
506
+ protected readonly tabsGroup: _lumaui_angular.TabsGroupBase;
507
+ /** Whether horizontal scrolling is enabled */
508
+ lmScrollable: boolean;
509
+ classes: _angular_core.Signal<string>;
510
+ /**
511
+ * Get the currently active trigger element
512
+ */
513
+ getActiveTrigger(): HTMLElement | null;
514
+ /**
515
+ * Handle mouse wheel for horizontal scroll
516
+ */
517
+ onWheel(event: WheelEvent): void;
518
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsListDirective, never>;
519
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TabsListDirective, "[lumaTabsList]", never, {}, {}, never, never, true, never>;
520
+ }
521
+
522
+ /**
523
+ * Tabs trigger directive
524
+ *
525
+ * Individual tab button with role="tab" and keyboard navigation support.
526
+ * Follows WAI-ARIA tabs pattern with roving tabindex.
527
+ *
528
+ * @example
529
+ * ```html
530
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
531
+ * ```
532
+ */
533
+ declare class TabsTriggerDirective implements OnInit, OnDestroy {
534
+ private readonly el;
535
+ private readonly tabsGroup;
536
+ /** Tab value identifier */
537
+ lumaTabsTrigger: _angular_core.InputSignal<string>;
538
+ /** Whether this trigger is disabled */
539
+ lmDisabled: _angular_core.InputSignal<boolean>;
540
+ /** Computed: whether this tab is selected */
541
+ isSelected: _angular_core.Signal<boolean>;
542
+ /** Computed: ID for the trigger element */
543
+ triggerId: _angular_core.Signal<string>;
544
+ /** Computed: ID for the corresponding panel */
545
+ panelId: _angular_core.Signal<string>;
546
+ /** Computed: CSS classes from CVA */
547
+ classes: _angular_core.Signal<string>;
548
+ ngOnInit(): void;
549
+ ngOnDestroy(): void;
550
+ onClick(): void;
551
+ onKeydown(event: KeyboardEvent): void;
552
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsTriggerDirective, never>;
553
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TabsTriggerDirective, "[lumaTabsTrigger]", never, { "lumaTabsTrigger": { "alias": "lumaTabsTrigger"; "required": true; "isSignal": true; }; "lmDisabled": { "alias": "lmDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
554
+ }
555
+
556
+ /**
557
+ * Tabs panel directive
558
+ *
559
+ * Content panel with role="tabpanel" and lazy loading support.
560
+ * When lazy loading is enabled, content is only rendered after
561
+ * the tab has been selected at least once, then cached.
562
+ *
563
+ * @example
564
+ * ```html
565
+ * <div lumaTabsPanel="tab-1">Content 1</div>
566
+ *
567
+ * <!-- With lazy loading (default when lmLazy=true on parent) -->
568
+ * <ng-template lumaTabsPanel="tab-1">
569
+ * <expensive-component />
570
+ * </ng-template>
571
+ * ```
572
+ */
573
+ declare class TabsPanelDirective {
574
+ private readonly tabsGroup;
575
+ private readonly templateRef;
576
+ private readonly viewContainer;
577
+ /** Panel value identifier */
578
+ lumaTabsPanel: _angular_core.InputSignal<string>;
579
+ /** Track if panel has ever been selected (for lazy loading cache) */
580
+ private hasBeenSelected;
581
+ /** Computed: whether this panel is currently selected */
582
+ isSelected: _angular_core.Signal<boolean>;
583
+ /** Computed: whether this panel should be visible/rendered */
584
+ isVisible: _angular_core.Signal<boolean>;
585
+ /** Computed: whether content should be rendered (for lazy loading) */
586
+ shouldRender: _angular_core.Signal<boolean>;
587
+ /** Computed: ID for the panel element */
588
+ panelId: _angular_core.Signal<string>;
589
+ /** Computed: ID for the corresponding trigger */
590
+ triggerId: _angular_core.Signal<string>;
591
+ /** Computed: CSS classes from CVA */
592
+ classes: _angular_core.Signal<string>;
593
+ constructor();
594
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsPanelDirective, never>;
595
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TabsPanelDirective, "[lumaTabsPanel]", never, { "lumaTabsPanel": { "alias": "lumaTabsPanel"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
596
+ }
597
+
598
+ /**
599
+ * Tabs indicator component
600
+ *
601
+ * Animated indicator that slides between tabs for the underline style.
602
+ * Uses CSS transform for smooth, GPU-accelerated animation.
603
+ *
604
+ * @example
605
+ * ```html
606
+ * <div lumaTabsList>
607
+ * <button lumaTabsTrigger="tab-1">Tab 1</button>
608
+ * <button lumaTabsTrigger="tab-2">Tab 2</button>
609
+ * <luma-tabs-indicator />
610
+ * </div>
611
+ * ```
612
+ */
613
+ declare class TabsIndicatorComponent implements AfterViewInit, OnDestroy {
614
+ private readonly platformId;
615
+ private readonly tabsGroup;
616
+ private readonly tabsList;
617
+ /** Indicator width in pixels */
618
+ indicatorWidth: _angular_core.WritableSignal<number>;
619
+ /** Indicator X or Y position */
620
+ private indicatorPosition;
621
+ /** Resize observer for recalculating position */
622
+ private resizeObserver;
623
+ /** Computed: CSS classes from CVA */
624
+ classes: _angular_core.Signal<string>;
625
+ /** Computed: CSS transform for positioning */
626
+ indicatorTransform: _angular_core.Signal<string>;
627
+ constructor();
628
+ ngAfterViewInit(): void;
629
+ ngOnDestroy(): void;
630
+ private updateIndicatorPosition;
631
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabsIndicatorComponent, never>;
632
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TabsIndicatorComponent, "luma-tabs-indicator", never, {}, {}, never, never, true, never>;
633
+ }
634
+
635
+ /**
636
+ * Modal size variants
637
+ */
638
+ type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
639
+ /**
640
+ * Interface for modal context that child components/directives can access
641
+ */
642
+ interface ModalContext {
643
+ /** Whether the modal is currently open */
644
+ isOpen: Signal<boolean>;
645
+ /** Open the modal */
646
+ open: () => void;
647
+ /** Close the modal */
648
+ close: () => void;
649
+ /** Modal size variant */
650
+ size: Signal<ModalSize>;
651
+ /** Whether to close on overlay click */
652
+ closeOnOverlay: Signal<boolean>;
653
+ /** Whether to close on Escape key */
654
+ closeOnEscape: Signal<boolean>;
655
+ /** Unique ID for accessibility */
656
+ modalId: string;
657
+ }
658
+ /**
659
+ * Injection token for modal context
660
+ * Allows child components to access parent modal state
661
+ */
662
+ declare const MODAL_CONTEXT: InjectionToken<ModalContext>;
663
+
664
+ /**
665
+ * Modal container component
666
+ *
667
+ * Manages modal open/close state, escape key handling, and provides context
668
+ * to child components (ModalOverlay, ModalContainer, etc.).
669
+ *
670
+ * Supports both controlled and uncontrolled modes:
671
+ * - Controlled: Use [lmOpen] and (lmOpenChange)
672
+ * - Uncontrolled: Use [lmDefaultOpen] and access via template reference
673
+ *
674
+ * @example
675
+ * ```html
676
+ * <!-- Controlled mode -->
677
+ * <luma-modal [lmOpen]="isOpen()" (lmOpenChange)="isOpen.set($event)">
678
+ * <luma-modal-overlay>
679
+ * <luma-modal-container>
680
+ * <div lumaModalHeader>
681
+ * <h2 lumaModalTitle>Title</h2>
682
+ * <luma-modal-close />
683
+ * </div>
684
+ * <div lumaModalContent>Content</div>
685
+ * <div lumaModalFooter>
686
+ * <button lumaButton (click)="isOpen.set(false)">Close</button>
687
+ * </div>
688
+ * </luma-modal-container>
689
+ * </luma-modal-overlay>
690
+ * </luma-modal>
691
+ *
692
+ * <!-- Uncontrolled mode -->
693
+ * <luma-modal #modal [lmDefaultOpen]="false">
694
+ * ...
695
+ * </luma-modal>
696
+ * <button (click)="modal.open()">Open</button>
697
+ * ```
698
+ */
699
+ declare class ModalComponent implements ModalContext, OnDestroy {
700
+ private readonly platformId;
701
+ private readonly document;
702
+ /** Controlled open state (null = uncontrolled mode) */
703
+ lmOpen: _angular_core.InputSignal<boolean | null>;
704
+ /** Default open state for uncontrolled mode */
705
+ lmDefaultOpen: _angular_core.InputSignal<boolean>;
706
+ /** Size variant */
707
+ lmSize: _angular_core.InputSignal<ModalSize>;
708
+ /** Close when clicking the overlay */
709
+ lmCloseOnOverlay: _angular_core.InputSignal<boolean>;
710
+ /** Close when pressing Escape key */
711
+ lmCloseOnEscape: _angular_core.InputSignal<boolean>;
712
+ /** Emits when open state changes */
713
+ lmOpenChange: _angular_core.OutputEmitterRef<boolean>;
714
+ /** Internal open state for uncontrolled mode */
715
+ private internalOpen;
716
+ /** Unique modal ID for accessibility */
717
+ readonly modalId: string;
718
+ /** Previously focused element for focus restoration */
719
+ private previouslyFocused;
720
+ /** Escape key handler */
721
+ private escapeHandler;
722
+ /** Computed: current open state (controlled or uncontrolled) */
723
+ isOpen: _angular_core.Signal<boolean>;
724
+ /** Computed: size signal for context */
725
+ size: _angular_core.Signal<ModalSize>;
726
+ /** Computed: closeOnOverlay signal for context */
727
+ closeOnOverlay: _angular_core.Signal<boolean>;
728
+ /** Computed: closeOnEscape signal for context */
729
+ closeOnEscape: _angular_core.Signal<boolean>;
730
+ constructor();
731
+ ngOnDestroy(): void;
732
+ /**
733
+ * Open the modal
734
+ */
735
+ open(): void;
736
+ /**
737
+ * Close the modal
738
+ */
739
+ close(): void;
740
+ private storeFocus;
741
+ private restoreFocus;
742
+ private lockBodyScroll;
743
+ private unlockBodyScroll;
744
+ private registerEscapeHandler;
745
+ private unregisterEscapeHandler;
746
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalComponent, never>;
747
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalComponent, "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>;
748
+ }
749
+
750
+ /**
751
+ * Modal overlay component (backdrop)
752
+ *
753
+ * Provides a semi-transparent backdrop behind the modal.
754
+ * Handles click-to-close when enabled on the parent modal.
755
+ *
756
+ * @example
757
+ * ```html
758
+ * <luma-modal [lmOpen]="isOpen()">
759
+ * <luma-modal-overlay>
760
+ * <luma-modal-container>...</luma-modal-container>
761
+ * </luma-modal-overlay>
762
+ * </luma-modal>
763
+ * ```
764
+ */
765
+ declare class ModalOverlayComponent {
766
+ private readonly modal;
767
+ /** Computed classes from CVA */
768
+ classes: _angular_core.Signal<string>;
769
+ /**
770
+ * Handle click on overlay (not on children)
771
+ */
772
+ onOverlayClick(event: MouseEvent): void;
773
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalOverlayComponent, never>;
774
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalOverlayComponent, "luma-modal-overlay", never, {}, {}, never, ["*"], true, never>;
775
+ }
776
+
777
+ /**
778
+ * Modal container component (dialog box)
779
+ *
780
+ * Contains the modal content and handles:
781
+ * - ARIA attributes for accessibility
782
+ * - Focus trap when modal is open
783
+ * - Size variants
784
+ *
785
+ * @example
786
+ * ```html
787
+ * <luma-modal-overlay>
788
+ * <luma-modal-container>
789
+ * <div lumaModalHeader>...</div>
790
+ * <div lumaModalContent>...</div>
791
+ * <div lumaModalFooter>...</div>
792
+ * </luma-modal-container>
793
+ * </luma-modal-overlay>
794
+ * ```
795
+ */
796
+ declare class ModalContainerComponent implements AfterViewInit, OnDestroy {
797
+ readonly modal: _lumaui_angular.ModalContext;
798
+ private readonly elementRef;
799
+ private readonly platformId;
800
+ /** Focus trap keydown handler */
801
+ private focusTrapHandler;
802
+ /** ID for aria-labelledby */
803
+ titleId: _angular_core.Signal<string>;
804
+ /** Computed classes from CVA */
805
+ classes: _angular_core.Signal<string>;
806
+ constructor();
807
+ ngAfterViewInit(): void;
808
+ ngOnDestroy(): void;
809
+ /**
810
+ * Get all focusable elements within the modal
811
+ */
812
+ private getFocusableElements;
813
+ /**
814
+ * Focus the first focusable element
815
+ */
816
+ private focusFirstElement;
817
+ /**
818
+ * Setup focus trap to keep focus within modal
819
+ */
820
+ private setupFocusTrap;
821
+ /**
822
+ * Remove focus trap handler
823
+ */
824
+ private removeFocusTrap;
825
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalContainerComponent, never>;
826
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalContainerComponent, "luma-modal-container", never, {}, {}, never, ["*"], true, never>;
827
+ }
828
+
829
+ /**
830
+ * Modal header directive
831
+ *
832
+ * Container for modal title and close button.
833
+ * Provides consistent padding and border styling.
834
+ *
835
+ * @example
836
+ * ```html
837
+ * <div lumaModalHeader>
838
+ * <h2 lumaModalTitle>Modal Title</h2>
839
+ * <luma-modal-close />
840
+ * </div>
841
+ * ```
842
+ */
843
+ declare class ModalHeaderDirective {
844
+ /** Computed classes from CVA */
845
+ classes: _angular_core.Signal<string>;
846
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalHeaderDirective, never>;
847
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ModalHeaderDirective, "[lumaModalHeader]", never, {}, {}, never, never, true, never>;
848
+ }
849
+
850
+ /**
851
+ * Modal title directive
852
+ *
853
+ * Provides consistent typography for modal titles.
854
+ * Automatically links to aria-labelledby on the modal container.
855
+ *
856
+ * @example
857
+ * ```html
858
+ * <h2 lumaModalTitle>Modal Title</h2>
859
+ * <h2 lumaModalTitle lmSize="lg">Large Title</h2>
860
+ * ```
861
+ */
862
+ declare class ModalTitleDirective {
863
+ private readonly modal;
864
+ /** Title size variant */
865
+ lmSize: _angular_core.InputSignal<"sm" | "md" | "lg">;
866
+ /** ID for aria-labelledby connection */
867
+ titleId: _angular_core.Signal<string>;
868
+ /** Computed classes from CVA */
869
+ classes: _angular_core.Signal<string>;
870
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalTitleDirective, never>;
871
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ModalTitleDirective, "[lumaModalTitle]", never, { "lmSize": { "alias": "lmSize"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
872
+ }
873
+
874
+ /**
875
+ * Modal content directive
876
+ *
877
+ * Container for the main modal content.
878
+ * Supports scrolling when content exceeds available space.
879
+ *
880
+ * @example
881
+ * ```html
882
+ * <div lumaModalContent>
883
+ * Content that doesn't scroll
884
+ * </div>
885
+ *
886
+ * <div lumaModalContent [lmScrollable]="true">
887
+ * Long content that scrolls...
888
+ * </div>
889
+ * ```
890
+ */
891
+ declare class ModalContentDirective {
892
+ /** Enable scroll when content overflows */
893
+ lmScrollable: _angular_core.InputSignal<boolean>;
894
+ /** Computed classes from CVA */
895
+ classes: _angular_core.Signal<string>;
896
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalContentDirective, never>;
897
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ModalContentDirective, "[lumaModalContent]", never, { "lmScrollable": { "alias": "lmScrollable"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
898
+ }
899
+
900
+ /**
901
+ * Modal footer directive
902
+ *
903
+ * Container for modal actions (buttons, etc.).
904
+ * Provides consistent padding and flexible alignment.
905
+ *
906
+ * @example
907
+ * ```html
908
+ * <div lumaModalFooter>
909
+ * <button lumaButton lmVariant="ghost">Cancel</button>
910
+ * <button lumaButton>Confirm</button>
911
+ * </div>
912
+ *
913
+ * <div lumaModalFooter lmAlign="between">
914
+ * <span>Left content</span>
915
+ * <button lumaButton>Action</button>
916
+ * </div>
917
+ * ```
918
+ */
919
+ declare class ModalFooterDirective {
920
+ /** Alignment of footer content */
921
+ lmAlign: _angular_core.InputSignal<"start" | "center" | "end" | "between">;
922
+ /** Computed classes from CVA */
923
+ classes: _angular_core.Signal<string>;
924
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalFooterDirective, never>;
925
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ModalFooterDirective, "[lumaModalFooter]", never, { "lmAlign": { "alias": "lmAlign"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
926
+ }
927
+
928
+ /**
929
+ * Modal close button component
930
+ *
931
+ * Provides a styled close button with an X icon.
932
+ * Can be customized with different content via ng-content.
933
+ *
934
+ * @example
935
+ * ```html
936
+ * <!-- Default X icon -->
937
+ * <luma-modal-close />
938
+ *
939
+ * <!-- Custom aria label -->
940
+ * <luma-modal-close lmAriaLabel="Fechar modal" />
941
+ *
942
+ * <!-- Custom icon -->
943
+ * <luma-modal-close>
944
+ * <svg>...</svg>
945
+ * </luma-modal-close>
946
+ * ```
947
+ */
948
+ declare class ModalCloseComponent {
949
+ readonly modal: _lumaui_angular.ModalContext;
950
+ /** Accessible label for the close button */
951
+ lmAriaLabel: _angular_core.InputSignal<string>;
952
+ /** Computed aria label */
953
+ ariaLabel: _angular_core.Signal<string>;
954
+ /** Computed classes from CVA */
955
+ classes: _angular_core.Signal<string>;
956
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ModalCloseComponent, never>;
957
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ModalCloseComponent, "luma-modal-close", never, { "lmAriaLabel": { "alias": "lmAriaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
958
+ }
959
+
960
+ export { ACCORDION_ITEM, AccordionContentDirective, AccordionGroupComponent, AccordionIconDirective, AccordionItemComponent, AccordionTitleDirective, AccordionTriggerDirective, BadgeDirective, ButtonDirective, CardComponent, CardContentDirective, CardDescriptionDirective, CardHeaderDirective, CardTitleDirective, MODAL_CONTEXT, ModalCloseComponent, ModalComponent, ModalContainerComponent, ModalContentDirective, ModalFooterDirective, ModalHeaderDirective, ModalOverlayComponent, ModalTitleDirective, TABS_GROUP, TABS_LIST, TabsComponent, TabsIndicatorComponent, TabsListDirective, TabsPanelDirective, TabsTriggerDirective, TooltipDirective };
961
+ export type { AccordionItemBase, ModalContext, ModalSize, TabsGroupBase, TabsListBase };