ngx-com 0.0.21 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +137 -33
  2. package/fesm2022/ngx-com-components-alert.mjs +21 -11
  3. package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
  4. package/fesm2022/ngx-com-components-avatar.mjs +9 -7
  5. package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
  6. package/fesm2022/ngx-com-components-button.mjs +1 -1
  7. package/fesm2022/ngx-com-components-button.mjs.map +1 -1
  8. package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
  9. package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
  10. package/fesm2022/ngx-com-components-card.mjs +8 -8
  11. package/fesm2022/ngx-com-components-card.mjs.map +1 -1
  12. package/fesm2022/ngx-com-components-carousel.mjs +16 -4
  13. package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
  14. package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
  15. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  16. package/fesm2022/ngx-com-components-code-block.mjs +9 -9
  17. package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
  18. package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
  19. package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
  20. package/fesm2022/ngx-com-components-confirm.mjs +4 -4
  21. package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
  22. package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
  23. package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
  24. package/fesm2022/ngx-com-components-dialog.mjs +47 -45
  25. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
  26. package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
  27. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  28. package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
  29. package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
  30. package/fesm2022/ngx-com-components-form-field.mjs +11 -6
  31. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  32. package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
  33. package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
  34. package/fesm2022/ngx-com-components-icon.mjs +89 -61
  35. package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
  36. package/fesm2022/ngx-com-components-item.mjs +14 -4
  37. package/fesm2022/ngx-com-components-item.mjs.map +1 -1
  38. package/fesm2022/ngx-com-components-menu.mjs +61 -69
  39. package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-com-components-native-control.mjs +170 -0
  41. package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
  42. package/fesm2022/ngx-com-components-paginator.mjs +11 -3
  43. package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
  44. package/fesm2022/ngx-com-components-popover.mjs +58 -33
  45. package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
  46. package/fesm2022/ngx-com-components-radio.mjs +4 -4
  47. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  48. package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
  49. package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
  50. package/fesm2022/ngx-com-components-sort.mjs +63 -57
  51. package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
  52. package/fesm2022/ngx-com-components-spinner.mjs +6 -6
  53. package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
  54. package/fesm2022/ngx-com-components-switch.mjs +18 -9
  55. package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
  56. package/fesm2022/ngx-com-components-table.mjs +23 -9
  57. package/fesm2022/ngx-com-components-table.mjs.map +1 -1
  58. package/fesm2022/ngx-com-components-tabs.mjs +81 -58
  59. package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
  60. package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
  61. package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
  62. package/fesm2022/ngx-com-components-toast.mjs +18 -14
  63. package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
  64. package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
  65. package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
  66. package/fesm2022/ngx-com-components.mjs +0 -13
  67. package/fesm2022/ngx-com-components.mjs.map +1 -1
  68. package/fesm2022/ngx-com-tokens.mjs +0 -8
  69. package/fesm2022/ngx-com-tokens.mjs.map +1 -1
  70. package/fesm2022/ngx-com-utils.mjs +13 -1
  71. package/fesm2022/ngx-com-utils.mjs.map +1 -1
  72. package/fesm2022/ngx-com.mjs +1 -1
  73. package/fesm2022/ngx-com.mjs.map +1 -1
  74. package/package.json +51 -8
  75. package/styles/animations.css +38 -0
  76. package/styles/candy.css +121 -0
  77. package/styles/dark.css +159 -0
  78. package/styles/forest.css +117 -0
  79. package/styles/ocean.css +117 -0
  80. package/styles/themes.css +7 -0
  81. package/styles/tokens.css +277 -0
  82. package/styles/utilities.css +16 -0
  83. package/types/ngx-com-components-alert.d.ts +14 -4
  84. package/types/ngx-com-components-avatar.d.ts +2 -0
  85. package/types/ngx-com-components-calendar.d.ts +3 -747
  86. package/types/ngx-com-components-card.d.ts +2 -2
  87. package/types/ngx-com-components-carousel.d.ts +11 -1
  88. package/types/ngx-com-components-code-block.d.ts +4 -4
  89. package/types/ngx-com-components-collapsible.d.ts +10 -2
  90. package/types/ngx-com-components-confirm.d.ts +2 -2
  91. package/types/ngx-com-components-datepicker.d.ts +623 -0
  92. package/types/ngx-com-components-dialog.d.ts +5 -2
  93. package/types/ngx-com-components-dropdown.d.ts +22 -4
  94. package/types/ngx-com-components-empty-state.d.ts +2 -0
  95. package/types/ngx-com-components-form-field.d.ts +4 -1
  96. package/types/ngx-com-components-icon-lucide.d.ts +32 -0
  97. package/types/ngx-com-components-icon.d.ts +49 -35
  98. package/types/ngx-com-components-item.d.ts +12 -2
  99. package/types/ngx-com-components-menu.d.ts +38 -38
  100. package/types/ngx-com-components-native-control.d.ts +99 -0
  101. package/types/ngx-com-components-paginator.d.ts +2 -0
  102. package/types/ngx-com-components-popover.d.ts +19 -12
  103. package/types/ngx-com-components-segmented-control.d.ts +3 -1
  104. package/types/ngx-com-components-sort.d.ts +13 -10
  105. package/types/ngx-com-components-switch.d.ts +7 -2
  106. package/types/ngx-com-components-table.d.ts +16 -2
  107. package/types/ngx-com-components-tabs.d.ts +46 -34
  108. package/types/ngx-com-components-timepicker.d.ts +273 -0
  109. package/types/ngx-com-components-toast.d.ts +4 -2
  110. package/types/ngx-com-components-tooltip.d.ts +1 -1
  111. package/types/ngx-com-components.d.ts +6 -7
  112. package/types/ngx-com-tokens.d.ts +5 -3
  113. package/types/ngx-com-utils.d.ts +11 -1
  114. package/types/ngx-com.d.ts +1 -1
@@ -12,7 +12,7 @@ import { startWith } from 'rxjs';
12
12
  const tabItemVariants = cva([
13
13
  'relative inline-flex items-center justify-center gap-2',
14
14
  'whitespace-nowrap font-medium select-none',
15
- 'transition-colors duration-150',
15
+ 'transition-colors duration-normal',
16
16
  'disabled:bg-disabled disabled:text-disabled-foreground disabled:cursor-not-allowed disabled:pointer-events-none',
17
17
  'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
18
18
  ], {
@@ -171,7 +171,7 @@ const tabScrollButtonVariants = cva([
171
171
  'absolute top-0 z-10 flex items-center justify-center',
172
172
  'h-full w-8',
173
173
  'text-muted-foreground hover:text-foreground',
174
- 'transition-opacity duration-150',
174
+ 'transition-opacity duration-normal',
175
175
  'focus-visible:outline-none',
176
176
  ], {
177
177
  variants: {
@@ -198,7 +198,7 @@ const tabScrollButtonVariants = cva([
198
198
  const tabCloseButtonVariants = cva([
199
199
  'inline-flex items-center justify-center rounded-interactive-sm',
200
200
  'text-muted-foreground hover:text-foreground',
201
- 'transition-colors duration-100',
201
+ 'transition-colors duration-fast',
202
202
  'focus-visible:outline-[1px] focus-visible:outline-offset-1 focus-visible:outline-ring',
203
203
  ], {
204
204
  variants: {
@@ -214,7 +214,7 @@ const tabCloseButtonVariants = cva([
214
214
  const tabPanelVariants = cva('focus-visible:outline-none', {
215
215
  variants: {
216
216
  animated: {
217
- true: 'animate-fade-in',
217
+ true: 'animate-fade-in motion-reduce:animate-none',
218
218
  false: '',
219
219
  },
220
220
  },
@@ -227,7 +227,9 @@ const tabPanelVariants = cva('focus-visible:outline-none', {
227
227
  * Marker directive for custom tab label templates.
228
228
  *
229
229
  * Provides a custom label template for rich tab headers (icons, badges, counters).
230
- * Applied to an `<ng-template>` inside `<ui-tab>`.
230
+ * Applied to an `<ng-template>` inside `<com-tab>`.
231
+ *
232
+ * @tokens none
231
233
  *
232
234
  * @example
233
235
  * ```html
@@ -241,15 +243,15 @@ const tabPanelVariants = cva('focus-visible:outline-none', {
241
243
  * </com-tab>
242
244
  * ```
243
245
  */
244
- class TabLabelDirective {
246
+ class ComTabLabel {
245
247
  templateRef = inject(TemplateRef);
246
248
  static ngTemplateContextGuard(_dir, ctx) {
247
249
  return true;
248
250
  }
249
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabLabelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
250
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: TabLabelDirective, isStandalone: true, selector: "ng-template[comTabLabel]", ngImport: i0 });
251
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
252
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: ComTabLabel, isStandalone: true, selector: "ng-template[comTabLabel]", ngImport: i0 });
251
253
  }
252
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabLabelDirective, decorators: [{
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabLabel, decorators: [{
253
255
  type: Directive,
254
256
  args: [{
255
257
  selector: 'ng-template[comTabLabel]',
@@ -262,6 +264,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
262
264
  * Content wrapped in `<ng-template comTabContent>` is only instantiated
263
265
  * when the tab becomes active for the first time.
264
266
  *
267
+ * @tokens none
268
+ *
265
269
  * @example Lazy loaded content
266
270
  * ```html
267
271
  * <com-tab label="Analytics">
@@ -284,15 +288,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
284
288
  * </com-tab>
285
289
  * ```
286
290
  */
287
- class TabContentDirective {
291
+ class ComTabContent {
288
292
  templateRef = inject(TemplateRef);
289
293
  static ngTemplateContextGuard(_dir, ctx) {
290
294
  return true;
291
295
  }
292
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
293
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: TabContentDirective, isStandalone: true, selector: "ng-template[comTabContent]", ngImport: i0 });
296
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
297
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: ComTabContent, isStandalone: true, selector: "ng-template[comTabContent]", ngImport: i0 });
294
298
  }
295
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabContentDirective, decorators: [{
299
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabContent, decorators: [{
296
300
  type: Directive,
297
301
  args: [{
298
302
  selector: 'ng-template[comTabContent]',
@@ -303,7 +307,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
303
307
  * Individual tab definition component.
304
308
  *
305
309
  * This is a **definition component** — it doesn't render anything itself.
306
- * It provides a label and content template to the parent `TabGroupComponent`.
310
+ * It provides a label and content template to the parent `ComTabGroup`.
311
+ *
312
+ * @tokens none
307
313
  *
308
314
  * @example Basic usage
309
315
  * ```html
@@ -339,7 +345,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
339
345
  * </com-tab>
340
346
  * ```
341
347
  */
342
- class TabComponent {
348
+ class ComTab {
343
349
  // ─── Inputs ───
344
350
  /** Plain text label; ignored if `[comTabLabel]` template is provided. */
345
351
  label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
@@ -352,13 +358,13 @@ class TabComponent {
352
358
  closed = output();
353
359
  // ─── Template References ───
354
360
  /** Custom label template (queried from content). */
355
- customLabel = contentChild(TabLabelDirective, ...(ngDevMode ? [{ debugName: "customLabel" }] : []));
361
+ customLabel = contentChild(ComTabLabel, ...(ngDevMode ? [{ debugName: "customLabel" }] : []));
356
362
  /** Lazy content template (queried from content). */
357
- lazyContent = contentChild(TabContentDirective, ...(ngDevMode ? [{ debugName: "lazyContent" }] : []));
363
+ lazyContent = contentChild(ComTabContent, ...(ngDevMode ? [{ debugName: "lazyContent" }] : []));
358
364
  /** Implicit content template from ng-content. */
359
365
  implicitContent = viewChild('implicitContent', ...(ngDevMode ? [{ debugName: "implicitContent" }] : []));
360
- // ─── State (set by parent TabGroupComponent) ───
361
- /** Whether this tab is currently active. Set by TabGroupComponent. */
366
+ // ─── State (set by parent ComTabGroup) ───
367
+ /** Whether this tab is currently active. Set by ComTabGroup. */
362
368
  isActive = signal(false, ...(ngDevMode ? [{ debugName: "isActive" }] : []));
363
369
  /** Whether this tab content has been rendered at least once. */
364
370
  hasBeenActivated = signal(false, ...(ngDevMode ? [{ debugName: "hasBeenActivated" }] : []));
@@ -376,14 +382,14 @@ class TabComponent {
376
382
  * Whether this tab uses lazy loading.
377
383
  */
378
384
  isLazy = computed(() => !!this.lazyContent(), ...(ngDevMode ? [{ debugName: "isLazy" }] : []));
379
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
380
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: TabComponent, isStandalone: true, selector: "com-tab", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, queries: [{ propertyName: "customLabel", first: true, predicate: TabLabelDirective, descendants: true, isSignal: true }, { propertyName: "lazyContent", first: true, predicate: TabContentDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "implicitContent", first: true, predicate: ["implicitContent"], descendants: true, isSignal: true }], ngImport: i0, template: `
385
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTab, deps: [], target: i0.ɵɵFactoryTarget.Component });
386
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", type: ComTab, isStandalone: true, selector: "com-tab", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, queries: [{ propertyName: "customLabel", first: true, predicate: ComTabLabel, descendants: true, isSignal: true }, { propertyName: "lazyContent", first: true, predicate: ComTabContent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "implicitContent", first: true, predicate: ["implicitContent"], descendants: true, isSignal: true }], ngImport: i0, template: `
381
387
  <ng-template #implicitContent>
382
388
  <ng-content />
383
389
  </ng-template>
384
390
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
385
391
  }
386
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabComponent, decorators: [{
392
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTab, decorators: [{
387
393
  type: Component,
388
394
  args: [{
389
395
  selector: 'com-tab',
@@ -394,7 +400,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
394
400
  `,
395
401
  changeDetection: ChangeDetectionStrategy.OnPush,
396
402
  }]
397
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], closable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closable", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], customLabel: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TabLabelDirective), { isSignal: true }] }], lazyContent: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TabContentDirective), { isSignal: true }] }], implicitContent: [{ type: i0.ViewChild, args: ['implicitContent', { isSignal: true }] }] } });
403
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], closable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closable", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], customLabel: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ComTabLabel), { isSignal: true }] }], lazyContent: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ComTabContent), { isSignal: true }] }], implicitContent: [{ type: i0.ViewChild, args: ['implicitContent', { isSignal: true }] }] } });
398
404
 
399
405
  let tabIdCounter = 0;
400
406
  /**
@@ -410,9 +416,13 @@ function generateTabId() {
410
416
  * Handles overflow detection, scroll buttons, keyboard navigation,
411
417
  * and the active indicator (for underline variant).
412
418
  *
419
+ * @tokens `--color-primary`, `--color-accent`, `--color-foreground`, `--color-muted-foreground`,
420
+ * `--color-muted`, `--color-border`, `--color-background`, `--color-ring`,
421
+ * `--color-disabled`, `--color-disabled-foreground`
422
+ *
413
423
  * @internal Not exported in public API.
414
424
  */
415
- class TabHeaderComponent {
425
+ class ComTabHeader {
416
426
  destroyRef = inject(DestroyRef);
417
427
  // ─── Inputs ───
418
428
  tabs = input.required(...(ngDevMode ? [{ debugName: "tabs" }] : []));
@@ -559,13 +569,14 @@ class TabHeaderComponent {
559
569
  event.preventDefault();
560
570
  break;
561
571
  case 'Enter':
562
- case ' ':
572
+ case ' ': {
563
573
  const activeIndex = this.keyManager.activeItemIndex;
564
574
  if (activeIndex !== null && activeIndex >= 0) {
565
575
  this.selectTab(activeIndex);
566
576
  }
567
577
  event.preventDefault();
568
578
  break;
579
+ }
569
580
  }
570
581
  }
571
582
  // ─── Private Methods ───
@@ -609,6 +620,8 @@ class TabHeaderComponent {
609
620
  const button = buttons[index]?.nativeElement;
610
621
  if (!button)
611
622
  return;
623
+ if (!container.getBoundingClientRect || !button.getBoundingClientRect)
624
+ return;
612
625
  const containerRect = container.getBoundingClientRect();
613
626
  const buttonRect = button.getBoundingClientRect();
614
627
  if (buttonRect.left < containerRect.left) {
@@ -640,8 +653,8 @@ class TabHeaderComponent {
640
653
  disabled: tabs[index]?.disabled() ?? false,
641
654
  }));
642
655
  }
643
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
644
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: TabHeaderComponent, isStandalone: true, selector: "com-tab-header", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null }, baseId: { classPropertyName: "baseId", publicName: "baseId", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tabSelected: "tabSelected", tabFocused: "tabFocused", tabClosed: "tabClosed" }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }, { propertyName: "tabButtons", predicate: ["tabButton"], descendants: true, isSignal: true }], ngImport: i0, template: `
656
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
657
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComTabHeader, isStandalone: true, selector: "com-tab-header", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null }, baseId: { classPropertyName: "baseId", publicName: "baseId", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tabSelected: "tabSelected", tabFocused: "tabFocused", tabClosed: "tabClosed" }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }, { propertyName: "tabButtons", predicate: ["tabButton"], descendants: true, isSignal: true }], ngImport: i0, template: `
645
658
  <!-- Scroll button left -->
646
659
  @if (showScrollLeft()) {
647
660
  <button
@@ -671,6 +684,7 @@ class TabHeaderComponent {
671
684
  class="flex overflow-x-auto scrollbar-none"
672
685
  [class]="headerClasses()"
673
686
  role="tablist"
687
+ tabindex="-1"
674
688
  [attr.aria-orientation]="'horizontal'"
675
689
  (scroll)="onScroll()"
676
690
  (keydown)="onKeydown($event)"
@@ -690,6 +704,7 @@ class TabHeaderComponent {
690
704
  [tabindex]="selectedIndex() === i ? 0 : -1"
691
705
  (click)="selectTab(i)"
692
706
  (focus)="onTabFocus(i)"
707
+ (keydown.delete)="tab.closable() && closeTab($event, i)"
693
708
  >
694
709
  @if (tab.labelTemplate()) {
695
710
  <ng-container [ngTemplateOutlet]="tab.labelTemplate()!" />
@@ -699,10 +714,9 @@ class TabHeaderComponent {
699
714
 
700
715
  @if (tab.closable()) {
701
716
  <span
702
- role="button"
717
+ aria-hidden="true"
703
718
  [class]="closeButtonClasses()"
704
719
  (click)="closeTab($event, i)"
705
- [attr.aria-label]="'Close ' + tab.label()"
706
720
  >
707
721
  <svg
708
722
  viewBox="0 0 24 24"
@@ -724,7 +738,7 @@ class TabHeaderComponent {
724
738
  <!-- Active indicator (underline variant only) -->
725
739
  @if (variant() === 'underline') {
726
740
  <div
727
- class="absolute bottom-0 h-0.5 bg-current transition-all duration-200 ease-out"
741
+ class="absolute bottom-0 h-0.5 bg-current transition-all duration-slow ease-out"
728
742
  [class]="indicatorColorClass()"
729
743
  [style.left.px]="indicatorLeft()"
730
744
  [style.width.px]="indicatorWidth()"
@@ -756,7 +770,7 @@ class TabHeaderComponent {
756
770
  }
757
771
  `, isInline: true, styles: [":host{display:block;position:relative}.scrollbar-none{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-none::-webkit-scrollbar{display:none}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
758
772
  }
759
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabHeaderComponent, decorators: [{
773
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabHeader, decorators: [{
760
774
  type: Component,
761
775
  args: [{ selector: 'com-tab-header', template: `
762
776
  <!-- Scroll button left -->
@@ -788,6 +802,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
788
802
  class="flex overflow-x-auto scrollbar-none"
789
803
  [class]="headerClasses()"
790
804
  role="tablist"
805
+ tabindex="-1"
791
806
  [attr.aria-orientation]="'horizontal'"
792
807
  (scroll)="onScroll()"
793
808
  (keydown)="onKeydown($event)"
@@ -807,6 +822,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
807
822
  [tabindex]="selectedIndex() === i ? 0 : -1"
808
823
  (click)="selectTab(i)"
809
824
  (focus)="onTabFocus(i)"
825
+ (keydown.delete)="tab.closable() && closeTab($event, i)"
810
826
  >
811
827
  @if (tab.labelTemplate()) {
812
828
  <ng-container [ngTemplateOutlet]="tab.labelTemplate()!" />
@@ -816,10 +832,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
816
832
 
817
833
  @if (tab.closable()) {
818
834
  <span
819
- role="button"
835
+ aria-hidden="true"
820
836
  [class]="closeButtonClasses()"
821
837
  (click)="closeTab($event, i)"
822
- [attr.aria-label]="'Close ' + tab.label()"
823
838
  >
824
839
  <svg
825
840
  viewBox="0 0 24 24"
@@ -841,7 +856,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
841
856
  <!-- Active indicator (underline variant only) -->
842
857
  @if (variant() === 'underline') {
843
858
  <div
844
- class="absolute bottom-0 h-0.5 bg-current transition-all duration-200 ease-out"
859
+ class="absolute bottom-0 h-0.5 bg-current transition-all duration-slow ease-out"
845
860
  [class]="indicatorColorClass()"
846
861
  [style.left.px]="indicatorLeft()"
847
862
  [style.width.px]="indicatorWidth()"
@@ -921,7 +936,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
921
936
  * </com-tab-group>
922
937
  * ```
923
938
  */
924
- class TabGroupComponent {
939
+ class ComTabGroup {
925
940
  /** Unique ID for this tab group instance. */
926
941
  baseId = generateTabId();
927
942
  // ─── Inputs ───
@@ -945,8 +960,8 @@ class TabGroupComponent {
945
960
  /** Emits the index of the focused (not yet selected) tab for keyboard navigation feedback. */
946
961
  focusChange = output();
947
962
  // ─── Content Children ───
948
- /** All TabComponent children. */
949
- tabs = contentChildren(TabComponent, ...(ngDevMode ? [{ debugName: "tabs" }] : []));
963
+ /** All ComTab children. */
964
+ tabs = contentChildren(ComTab, ...(ngDevMode ? [{ debugName: "tabs" }] : []));
950
965
  // ─── Computed ───
951
966
  /** The currently active tab. */
952
967
  activeTab = computed(() => this.tabs()[this.selectedIndex()], ...(ngDevMode ? [{ debugName: "activeTab" }] : []));
@@ -982,7 +997,7 @@ class TabGroupComponent {
982
997
  * Determines whether a tab's content should be rendered.
983
998
  * For lazy tabs, content is only rendered after first activation.
984
999
  */
985
- shouldRenderTab(tab, index) {
1000
+ shouldRenderTab(tab, _index) {
986
1001
  // Non-lazy tabs always render their content
987
1002
  if (!tab.isLazy()) {
988
1003
  return true;
@@ -1007,8 +1022,8 @@ class TabGroupComponent {
1007
1022
  tab.closed.emit();
1008
1023
  }
1009
1024
  }
1010
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1011
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: TabGroupComponent, isStandalone: true, selector: "com-tab-group", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null }, selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: false, transformFunction: null }, animationEnabled: { classPropertyName: "animationEnabled", publicName: "animationEnabled", isSignal: true, isRequired: false, transformFunction: null }, preserveContent: { classPropertyName: "preserveContent", publicName: "preserveContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedIndex: "selectedIndexChange", selectedTabChange: "selectedTabChange", focusChange: "focusChange" }, host: { classAttribute: "com-tab-group" }, queries: [{ propertyName: "tabs", predicate: TabComponent, isSignal: true }], ngImport: i0, template: `
1025
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
1026
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComTabGroup, isStandalone: true, selector: "com-tab-group", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null }, selectedIndex: { classPropertyName: "selectedIndex", publicName: "selectedIndex", isSignal: true, isRequired: false, transformFunction: null }, animationEnabled: { classPropertyName: "animationEnabled", publicName: "animationEnabled", isSignal: true, isRequired: false, transformFunction: null }, preserveContent: { classPropertyName: "preserveContent", publicName: "preserveContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedIndex: "selectedIndexChange", selectedTabChange: "selectedTabChange", focusChange: "focusChange" }, host: { classAttribute: "com-tab-group" }, queries: [{ propertyName: "tabs", predicate: ComTab, isSignal: true }], ngImport: i0, template: `
1012
1027
  <com-tab-header
1013
1028
  [tabs]="tabs()"
1014
1029
  [selectedIndex]="selectedIndex()"
@@ -1053,9 +1068,9 @@ class TabGroupComponent {
1053
1068
  }
1054
1069
  }
1055
1070
  </div>
1056
- `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: TabHeaderComponent, selector: "com-tab-header", inputs: ["tabs", "selectedIndex", "variant", "size", "color", "alignment", "baseId"], outputs: ["tabSelected", "tabFocused", "tabClosed"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1071
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: ComTabHeader, selector: "com-tab-header", inputs: ["tabs", "selectedIndex", "variant", "size", "color", "alignment", "baseId"], outputs: ["tabSelected", "tabFocused", "tabClosed"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1057
1072
  }
1058
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabGroupComponent, decorators: [{
1073
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabGroup, decorators: [{
1059
1074
  type: Component,
1060
1075
  args: [{ selector: 'com-tab-group', template: `
1061
1076
  <com-tab-header
@@ -1102,10 +1117,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1102
1117
  }
1103
1118
  }
1104
1119
  </div>
1105
- `, imports: [TabHeaderComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, host: {
1120
+ `, imports: [ComTabHeader, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, host: {
1106
1121
  class: 'com-tab-group',
1107
1122
  }, styles: [":host{display:block}\n"] }]
1108
- }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], alignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignment", required: false }] }], selectedIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIndex", required: false }] }, { type: i0.Output, args: ["selectedIndexChange"] }], animationEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "animationEnabled", required: false }] }], preserveContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "preserveContent", required: false }] }], selectedTabChange: [{ type: i0.Output, args: ["selectedTabChange"] }], focusChange: [{ type: i0.Output, args: ["focusChange"] }], tabs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TabComponent), { isSignal: true }] }] } });
1123
+ }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], alignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignment", required: false }] }], selectedIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIndex", required: false }] }, { type: i0.Output, args: ["selectedIndexChange"] }], animationEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "animationEnabled", required: false }] }], preserveContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "preserveContent", required: false }] }], selectedTabChange: [{ type: i0.Output, args: ["selectedTabChange"] }], focusChange: [{ type: i0.Output, args: ["focusChange"] }], tabs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ComTab), { isSignal: true }] }] } });
1109
1124
 
1110
1125
  /**
1111
1126
  * Tab link directive for route-driven navigation tabs.
@@ -1113,6 +1128,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1113
1128
  * Applied to anchor or button elements inside `com-tab-nav-bar`.
1114
1129
  * Automatically detects active state from `routerLinkActive` if present.
1115
1130
  *
1131
+ * @tokens `--color-primary`, `--color-primary-foreground`, `--color-primary-subtle`,
1132
+ * `--color-accent`, `--color-accent-foreground`, `--color-accent-subtle`,
1133
+ * `--color-foreground`, `--color-muted-foreground`, `--color-muted`,
1134
+ * `--color-border`, `--color-ring`,
1135
+ * `--color-disabled`, `--color-disabled-foreground`
1136
+ *
1116
1137
  * @example Basic usage with router
1117
1138
  * ```html
1118
1139
  * <nav com-tab-nav-bar>
@@ -1131,7 +1152,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1131
1152
  * <a comTabLink [disabled]="true">Coming Soon</a>
1132
1153
  * ```
1133
1154
  */
1134
- class TabLinkDirective {
1155
+ class ComTabLink {
1135
1156
  routerLinkActive = inject(RouterLinkActive, { optional: true, self: true });
1136
1157
  elementRef = inject(ElementRef);
1137
1158
  // ─── Inputs ───
@@ -1176,10 +1197,10 @@ class TabLinkDirective {
1176
1197
  focus() {
1177
1198
  this.elementRef.nativeElement.focus();
1178
1199
  }
1179
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1180
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: TabLinkDirective, isStandalone: true, selector: "a[comTabLink], button[comTabLink]", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "tab" }, properties: { "class": "computedClass()", "attr.aria-selected": "isActive()", "attr.aria-disabled": "disabled() || null", "attr.data-state": "isActive() ? \"active\" : \"inactive\"", "tabindex": "isActive() ? 0 : -1" } }, ngImport: i0 });
1200
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabLink, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1201
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: ComTabLink, isStandalone: true, selector: "a[comTabLink], button[comTabLink]", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "tab" }, properties: { "class": "computedClass()", "attr.aria-selected": "isActive()", "attr.aria-disabled": "disabled() || null", "attr.data-state": "isActive() ? \"active\" : \"inactive\"", "tabindex": "isActive() ? 0 : -1" } }, ngImport: i0 });
1181
1202
  }
1182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabLinkDirective, decorators: [{
1203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabLink, decorators: [{
1183
1204
  type: Directive,
1184
1205
  args: [{
1185
1206
  selector: 'a[comTabLink], button[comTabLink]',
@@ -1220,7 +1241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1220
1241
  * </nav>
1221
1242
  * ```
1222
1243
  */
1223
- class TabNavBarComponent {
1244
+ class ComTabNavBar {
1224
1245
  destroyRef = inject(DestroyRef);
1225
1246
  /** Unique ID for this nav bar instance. */
1226
1247
  baseId = generateTabId();
@@ -1234,8 +1255,8 @@ class TabNavBarComponent {
1234
1255
  /** Tab alignment within the bar. */
1235
1256
  alignment = input('start', ...(ngDevMode ? [{ debugName: "alignment" }] : []));
1236
1257
  // ─── Content Children ───
1237
- /** All TabLinkDirective children. */
1238
- tabLinks = contentChildren(TabLinkDirective, ...(ngDevMode ? [{ debugName: "tabLinks" }] : []));
1258
+ /** All ComTabLink children. */
1259
+ tabLinks = contentChildren(ComTabLink, ...(ngDevMode ? [{ debugName: "tabLinks" }] : []));
1239
1260
  // ─── View Children ───
1240
1261
  scrollContainer = viewChild('scrollContainer', ...(ngDevMode ? [{ debugName: "scrollContainer" }] : []));
1241
1262
  // ─── State ───
@@ -1366,8 +1387,8 @@ class TabNavBarComponent {
1366
1387
  disabled: link.disabled(),
1367
1388
  }));
1368
1389
  }
1369
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabNavBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1370
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: TabNavBarComponent, isStandalone: true, selector: "com-tab-nav-bar, nav[com-tab-nav-bar]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "com-tab-nav-bar" }, queries: [{ propertyName: "tabLinks", predicate: TabLinkDirective, isSignal: true }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
1390
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabNavBar, deps: [], target: i0.ɵɵFactoryTarget.Component });
1391
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComTabNavBar, isStandalone: true, selector: "com-tab-nav-bar, nav[com-tab-nav-bar]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "com-tab-nav-bar" }, queries: [{ propertyName: "tabLinks", predicate: ComTabLink, isSignal: true }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
1371
1392
  <!-- Scroll button left -->
1372
1393
  @if (showScrollLeft()) {
1373
1394
  <button
@@ -1397,6 +1418,7 @@ class TabNavBarComponent {
1397
1418
  class="flex overflow-x-auto scrollbar-none"
1398
1419
  [class]="headerClasses()"
1399
1420
  role="tablist"
1421
+ tabindex="-1"
1400
1422
  [attr.aria-orientation]="'horizontal'"
1401
1423
  (scroll)="onScroll()"
1402
1424
  (keydown)="onKeydown($event)"
@@ -1406,7 +1428,7 @@ class TabNavBarComponent {
1406
1428
  <!-- Active indicator (underline variant only) -->
1407
1429
  @if (variant() === 'underline' && activeLink()) {
1408
1430
  <div
1409
- class="absolute bottom-0 h-0.5 bg-current transition-all duration-200 ease-out"
1431
+ class="absolute bottom-0 h-0.5 bg-current transition-all duration-slow ease-out"
1410
1432
  [class]="indicatorColorClass()"
1411
1433
  [style.left.px]="indicatorLeft()"
1412
1434
  [style.width.px]="indicatorWidth()"
@@ -1438,7 +1460,7 @@ class TabNavBarComponent {
1438
1460
  }
1439
1461
  `, isInline: true, styles: [":host{display:block;position:relative}.scrollbar-none{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-none::-webkit-scrollbar{display:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1440
1462
  }
1441
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TabNavBarComponent, decorators: [{
1463
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTabNavBar, decorators: [{
1442
1464
  type: Component,
1443
1465
  args: [{ selector: 'com-tab-nav-bar, nav[com-tab-nav-bar]', template: `
1444
1466
  <!-- Scroll button left -->
@@ -1470,6 +1492,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1470
1492
  class="flex overflow-x-auto scrollbar-none"
1471
1493
  [class]="headerClasses()"
1472
1494
  role="tablist"
1495
+ tabindex="-1"
1473
1496
  [attr.aria-orientation]="'horizontal'"
1474
1497
  (scroll)="onScroll()"
1475
1498
  (keydown)="onKeydown($event)"
@@ -1479,7 +1502,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1479
1502
  <!-- Active indicator (underline variant only) -->
1480
1503
  @if (variant() === 'underline' && activeLink()) {
1481
1504
  <div
1482
- class="absolute bottom-0 h-0.5 bg-current transition-all duration-200 ease-out"
1505
+ class="absolute bottom-0 h-0.5 bg-current transition-all duration-slow ease-out"
1483
1506
  [class]="indicatorColorClass()"
1484
1507
  [style.left.px]="indicatorLeft()"
1485
1508
  [style.width.px]="indicatorWidth()"
@@ -1512,7 +1535,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1512
1535
  `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
1513
1536
  class: 'com-tab-nav-bar',
1514
1537
  }, styles: [":host{display:block;position:relative}.scrollbar-none{scrollbar-width:none;-ms-overflow-style:none}.scrollbar-none::-webkit-scrollbar{display:none}\n"] }]
1515
- }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], alignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignment", required: false }] }], tabLinks: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => TabLinkDirective), { isSignal: true }] }], scrollContainer: [{ type: i0.ViewChild, args: ['scrollContainer', { isSignal: true }] }] } });
1538
+ }], ctorParameters: () => [], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], alignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignment", required: false }] }], tabLinks: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ComTabLink), { isSignal: true }] }], scrollContainer: [{ type: i0.ViewChild, args: ['scrollContainer', { isSignal: true }] }] } });
1516
1539
 
1517
1540
  // Public API for the tabs component
1518
1541
  // Variants (for advanced customization)
@@ -1521,5 +1544,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
1521
1544
  * Generated bundle index. Do not edit.
1522
1545
  */
1523
1546
 
1524
- export { TabComponent, TabContentDirective, TabGroupComponent, TabLabelDirective, TabLinkDirective, TabNavBarComponent, tabCloseButtonVariants, tabHeaderVariants, tabItemVariants, tabPanelVariants, tabScrollButtonVariants };
1547
+ export { ComTab, ComTabContent, ComTabGroup, ComTabLabel, ComTabLink, ComTabNavBar, tabCloseButtonVariants, tabHeaderVariants, tabItemVariants, tabPanelVariants, tabScrollButtonVariants };
1525
1548
  //# sourceMappingURL=ngx-com-components-tabs.mjs.map