@raintonic/formaui 0.9.0 → 0.9.3

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/fesm2022/raintonic-formaui-components-accordion.mjs +4 -4
  2. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  3. package/fesm2022/raintonic-formaui-components-alert.mjs +2 -2
  4. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +2 -2
  6. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  7. package/fesm2022/raintonic-formaui-components-avatar.mjs +3 -3
  8. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  9. package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
  10. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  11. package/fesm2022/raintonic-formaui-components-button-group.mjs +2 -2
  12. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  13. package/fesm2022/raintonic-formaui-components-card.mjs +78 -8
  14. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  15. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  16. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  17. package/fesm2022/raintonic-formaui-components-chip.mjs +2 -2
  18. package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -1
  19. package/fesm2022/raintonic-formaui-components-data-table.mjs +80 -11
  20. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-date-picker.mjs +4 -4
  22. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  24. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-drawer.mjs +37 -6
  26. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  27. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs +2 -2
  28. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs.map +1 -1
  29. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +1 -1
  30. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -1
  31. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  32. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  33. package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
  34. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -2
  36. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-input.mjs +14 -0
  38. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  40. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  41. package/fesm2022/raintonic-formaui-components-number-input.mjs +2 -2
  42. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  43. package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
  44. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  45. package/fesm2022/raintonic-formaui-components-password-input.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
  48. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-progressbar.mjs +2 -2
  50. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-radio.mjs +4 -4
  52. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  53. package/fesm2022/raintonic-formaui-components-select.mjs +15 -7
  54. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  55. package/fesm2022/raintonic-formaui-components-side-panel.mjs +40 -6
  56. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  57. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs +4 -4
  58. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs.map +1 -1
  59. package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
  60. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  61. package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
  62. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  63. package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
  64. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  65. package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
  66. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  67. package/fesm2022/raintonic-formaui-components-time-picker.mjs +2 -2
  68. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  69. package/fesm2022/raintonic-formaui-components-toggle-group.mjs +19 -8
  70. package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -1
  71. package/fesm2022/raintonic-formaui-components-toolbar.mjs +10 -4
  72. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  73. package/fesm2022/raintonic-formaui-components-tooltip.mjs +102 -8
  74. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  75. package/fesm2022/raintonic-formaui-components-topbar.mjs +2 -2
  76. package/fesm2022/raintonic-formaui-components-topbar.mjs.map +1 -1
  77. package/fesm2022/raintonic-formaui-components-tree-select.mjs +2 -2
  78. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
  79. package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
  80. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
  81. package/fesm2022/raintonic-formaui-components-tree.mjs +4 -4
  82. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
  83. package/fesm2022/raintonic-formaui-services-dialog.mjs +8 -4
  84. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  85. package/fesm2022/raintonic-formaui.mjs +1 -1
  86. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  87. package/llms-full.txt +72 -27
  88. package/package.json +1 -1
  89. package/styles/generated/_tokens.scss +9 -9
  90. package/styles/partials/components/_dialog.scss +24 -0
  91. package/styles/styles.css +24 -9
  92. package/types/raintonic-formaui-components-card.d.ts +46 -2
  93. package/types/raintonic-formaui-components-card.d.ts.map +1 -1
  94. package/types/raintonic-formaui-components-data-table.d.ts +50 -3
  95. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
  96. package/types/raintonic-formaui-components-drawer.d.ts +20 -2
  97. package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
  98. package/types/raintonic-formaui-components-form-field.d.ts +10 -0
  99. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
  100. package/types/raintonic-formaui-components-input.d.ts +9 -0
  101. package/types/raintonic-formaui-components-input.d.ts.map +1 -1
  102. package/types/raintonic-formaui-components-select.d.ts +8 -1
  103. package/types/raintonic-formaui-components-select.d.ts.map +1 -1
  104. package/types/raintonic-formaui-components-side-panel.d.ts +24 -2
  105. package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
  106. package/types/raintonic-formaui-components-toggle-group.d.ts +1 -1
  107. package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -1
  108. package/types/raintonic-formaui-components-toolbar.d.ts +5 -1
  109. package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
  110. package/types/raintonic-formaui-components-tooltip.d.ts +55 -4
  111. package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
  112. package/types/raintonic-formaui-services-dialog.d.ts +12 -1
  113. package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
  114. package/types/raintonic-formaui.d.ts +1 -1
@@ -9,7 +9,12 @@ const FUI_TOGGLE_GROUP = new InjectionToken('FUI_TOGGLE_GROUP');
9
9
 
10
10
  class FuiToggleItemComponent {
11
11
  static nextId = 0;
12
- value = input.required(...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
12
+ // Not `input.required`: when items are generated via `@for`, Angular applies the
13
+ // [value] binding in the update block (after creation), but the parent group's
14
+ // contentChildren effect reads item.value() on creation — a required input read
15
+ // before binding throws NG0950. Optional input yields `undefined` until bound, and
16
+ // the effect re-runs once the value arrives.
17
+ value = input(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
13
18
  /** @docs-private — size is controlled by the parent fui-toggle-group. Only effective when used standalone outside a group. */
14
19
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
15
20
  disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled',
@@ -87,15 +92,15 @@ class FuiToggleItemComponent {
87
92
  this.buttonElement()?.nativeElement.focus();
88
93
  }
89
94
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiToggleItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
90
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.6", type: FuiToggleItemComponent, isStandalone: true, selector: "fui-toggle-item", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "computedClasses()", "attr.id": "id" } }, viewQueries: [{ propertyName: "buttonElement", first: true, predicate: ["buttonElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<button\r\n #buttonElement\r\n type=\"button\"\r\n class=\"fui-toggle-item__native\"\r\n role=\"radio\"\r\n [attr.name]=\"_name()\"\r\n [attr.value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-checked]=\"_checked()\"\r\n [attr.aria-disabled]=\"isDisabled() || null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-labelledby]=\"ariaLabelledby()\"\r\n [attr.tabindex]=\"_tabIndex()\"\r\n (click)=\"onClick()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <span class=\"fui-toggle-item__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n</button>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-toggle-item{--fui-toggle-font-size: var(--fui-text-base, .875rem);--fui-toggle-padding-x: var(--fui-spacing-7, 1rem);--fui-toggle-padding-y: var(--fui-spacing-4, .25rem);--fui-toggle-bg: transparent;--fui-toggle-text-color: var(--fui-text-secondary, #161616)}.fui-toggle-item-size--sm{--fui-toggle-padding-y: var(--fui-spacing-2, .25rem)}.fui-toggle-item-size--md{--fui-toggle-padding-y: var(--fui-spacing-4, .5rem)}.fui-toggle-item-size--lg{--fui-toggle-padding-y: var(--fui-spacing-6, .75rem)}.fui-toggle-item--checked{--fui-toggle-text-color: var(--fui-text-primary);--fui-toggle-bg: var(--fui-primary-muted, #0f62fe)}.fui-toggle-item__native:hover:not(:disabled):not([aria-checked=true]){--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:focus-visible{outline:1px solid var(--fui-primary-10);--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:disabled{cursor:not-allowed;pointer-events:none;background-color:transparent;color:var(--fui-text-disabled)}.fui-toggle-item__native{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-toggle-item__native:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-toggle-item__native{display:inline-flex;align-items:center;justify-content:center;padding:var(--fui-toggle-padding-y) var(--fui-toggle-padding-x);font-family:var(--fui-font-family-sans);font-size:var(--fui-toggle-font-size);font-weight:var(--fui-font-weight-regular);line-height:1.25;color:var(--fui-toggle-text-color);cursor:pointer;box-sizing:border-box;border-radius:var(--fui-radius-xs);transition:var(--fui-transition-bg);background-color:var(--fui-toggle-bg)}.fui-toggle-item__content{display:inline-flex;align-items:center;gap:var(--fui-spacing-03, .5rem);white-space:nowrap}.fui-toggle-item--focused .fui-toggle-item__native{z-index:1}@media(prefers-contrast:high){.fui-toggle-item__native{border-width:2px}.fui-toggle-item__native[aria-checked=true]{background-color:Highlight;color:HighlightText;border-color:Highlight}}@media(prefers-reduced-motion:reduce){.fui-toggle-item__native{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
95
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.6", type: FuiToggleItemComponent, isStandalone: true, selector: "fui-toggle-item", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "computedClasses()", "attr.id": "id" } }, viewQueries: [{ propertyName: "buttonElement", first: true, predicate: ["buttonElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<button\r\n #buttonElement\r\n type=\"button\"\r\n class=\"fui-toggle-item__native\"\r\n role=\"radio\"\r\n [attr.name]=\"_name()\"\r\n [attr.value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-checked]=\"_checked()\"\r\n [attr.aria-disabled]=\"isDisabled() || null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-labelledby]=\"ariaLabelledby()\"\r\n [attr.tabindex]=\"_tabIndex()\"\r\n (click)=\"onClick()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <span class=\"fui-toggle-item__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n</button>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-toggle-item{--fui-toggle-font-size: var(--fui-text-base, .875rem);--fui-toggle-padding-x: var(--fui-spacing-7, 1rem);--fui-toggle-padding-y: var(--fui-spacing-4, .25rem);--fui-toggle-bg: transparent;--fui-toggle-text-color: var(--fui-text-secondary, #161616)}.fui-toggle-item-size--sm{--fui-toggle-padding-y: var(--fui-spacing-2, .25rem)}.fui-toggle-item-size--md{--fui-toggle-padding-y: var(--fui-spacing-4, .5rem)}.fui-toggle-item-size--lg{--fui-toggle-padding-y: var(--fui-spacing-6, .75rem)}.fui-toggle-item--checked{--fui-toggle-text-color: var(--fui-text-primary);--fui-toggle-bg: var(--fui-primary-muted, #0f62fe)}.fui-toggle-item__native:hover:not(:disabled):not([aria-checked=true]){--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:focus-visible{outline:1px solid var(--fui-primary-10);--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:disabled{cursor:not-allowed;pointer-events:none;background-color:transparent;color:var(--fui-text-disabled)}.fui-toggle-item__native{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-toggle-item__native:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-toggle-item__native{display:inline-flex;align-items:center;justify-content:center;padding:var(--fui-toggle-padding-y) var(--fui-toggle-padding-x);font-family:var(--fui-font-sans);font-size:var(--fui-toggle-font-size);font-weight:var(--fui-weight-regular);line-height:1.25;color:var(--fui-toggle-text-color);cursor:pointer;box-sizing:border-box;border-radius:var(--fui-radius-xs);transition:var(--fui-transition-bg);background-color:var(--fui-toggle-bg)}.fui-toggle-item__content{display:inline-flex;align-items:center;gap:var(--fui-spacing-4);white-space:nowrap}.fui-toggle-item--focused .fui-toggle-item__native{z-index:1}@media(prefers-contrast:high){.fui-toggle-item__native{border-width:2px}.fui-toggle-item__native[aria-checked=true]{background-color:Highlight;color:HighlightText;border-color:Highlight}}@media(prefers-reduced-motion:reduce){.fui-toggle-item__native{transition:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
91
96
  }
92
97
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiToggleItemComponent, decorators: [{
93
98
  type: Component,
94
99
  args: [{ selector: 'fui-toggle-item', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
95
100
  '[class]': 'computedClasses()',
96
101
  '[attr.id]': 'id',
97
- }, template: "<button\r\n #buttonElement\r\n type=\"button\"\r\n class=\"fui-toggle-item__native\"\r\n role=\"radio\"\r\n [attr.name]=\"_name()\"\r\n [attr.value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-checked]=\"_checked()\"\r\n [attr.aria-disabled]=\"isDisabled() || null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-labelledby]=\"ariaLabelledby()\"\r\n [attr.tabindex]=\"_tabIndex()\"\r\n (click)=\"onClick()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <span class=\"fui-toggle-item__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n</button>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-toggle-item{--fui-toggle-font-size: var(--fui-text-base, .875rem);--fui-toggle-padding-x: var(--fui-spacing-7, 1rem);--fui-toggle-padding-y: var(--fui-spacing-4, .25rem);--fui-toggle-bg: transparent;--fui-toggle-text-color: var(--fui-text-secondary, #161616)}.fui-toggle-item-size--sm{--fui-toggle-padding-y: var(--fui-spacing-2, .25rem)}.fui-toggle-item-size--md{--fui-toggle-padding-y: var(--fui-spacing-4, .5rem)}.fui-toggle-item-size--lg{--fui-toggle-padding-y: var(--fui-spacing-6, .75rem)}.fui-toggle-item--checked{--fui-toggle-text-color: var(--fui-text-primary);--fui-toggle-bg: var(--fui-primary-muted, #0f62fe)}.fui-toggle-item__native:hover:not(:disabled):not([aria-checked=true]){--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:focus-visible{outline:1px solid var(--fui-primary-10);--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:disabled{cursor:not-allowed;pointer-events:none;background-color:transparent;color:var(--fui-text-disabled)}.fui-toggle-item__native{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-toggle-item__native:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-toggle-item__native{display:inline-flex;align-items:center;justify-content:center;padding:var(--fui-toggle-padding-y) var(--fui-toggle-padding-x);font-family:var(--fui-font-family-sans);font-size:var(--fui-toggle-font-size);font-weight:var(--fui-font-weight-regular);line-height:1.25;color:var(--fui-toggle-text-color);cursor:pointer;box-sizing:border-box;border-radius:var(--fui-radius-xs);transition:var(--fui-transition-bg);background-color:var(--fui-toggle-bg)}.fui-toggle-item__content{display:inline-flex;align-items:center;gap:var(--fui-spacing-03, .5rem);white-space:nowrap}.fui-toggle-item--focused .fui-toggle-item__native{z-index:1}@media(prefers-contrast:high){.fui-toggle-item__native{border-width:2px}.fui-toggle-item__native[aria-checked=true]{background-color:Highlight;color:HighlightText;border-color:Highlight}}@media(prefers-reduced-motion:reduce){.fui-toggle-item__native{transition:none}}\n"] }]
98
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], buttonElement: [{ type: i0.ViewChild, args: ['buttonElement', { isSignal: true }] }] } });
102
+ }, template: "<button\r\n #buttonElement\r\n type=\"button\"\r\n class=\"fui-toggle-item__native\"\r\n role=\"radio\"\r\n [attr.name]=\"_name()\"\r\n [attr.value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-checked]=\"_checked()\"\r\n [attr.aria-disabled]=\"isDisabled() || null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-labelledby]=\"ariaLabelledby()\"\r\n [attr.tabindex]=\"_tabIndex()\"\r\n (click)=\"onClick()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <span class=\"fui-toggle-item__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n</button>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-toggle-item{--fui-toggle-font-size: var(--fui-text-base, .875rem);--fui-toggle-padding-x: var(--fui-spacing-7, 1rem);--fui-toggle-padding-y: var(--fui-spacing-4, .25rem);--fui-toggle-bg: transparent;--fui-toggle-text-color: var(--fui-text-secondary, #161616)}.fui-toggle-item-size--sm{--fui-toggle-padding-y: var(--fui-spacing-2, .25rem)}.fui-toggle-item-size--md{--fui-toggle-padding-y: var(--fui-spacing-4, .5rem)}.fui-toggle-item-size--lg{--fui-toggle-padding-y: var(--fui-spacing-6, .75rem)}.fui-toggle-item--checked{--fui-toggle-text-color: var(--fui-text-primary);--fui-toggle-bg: var(--fui-primary-muted, #0f62fe)}.fui-toggle-item__native:hover:not(:disabled):not([aria-checked=true]){--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:focus-visible{outline:1px solid var(--fui-primary-10);--fui-toggle-bg: var(--fui-neutral-10, #f4f4f4);--fui-toggle-text-color: var(--fui-text-primary)}.fui-toggle-item__native:disabled{cursor:not-allowed;pointer-events:none;background-color:transparent;color:var(--fui-text-disabled)}.fui-toggle-item__native{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-toggle-item__native:focus-visible{outline:2px solid var(--fui-primary-10)}.fui-toggle-item__native{display:inline-flex;align-items:center;justify-content:center;padding:var(--fui-toggle-padding-y) var(--fui-toggle-padding-x);font-family:var(--fui-font-sans);font-size:var(--fui-toggle-font-size);font-weight:var(--fui-weight-regular);line-height:1.25;color:var(--fui-toggle-text-color);cursor:pointer;box-sizing:border-box;border-radius:var(--fui-radius-xs);transition:var(--fui-transition-bg);background-color:var(--fui-toggle-bg)}.fui-toggle-item__content{display:inline-flex;align-items:center;gap:var(--fui-spacing-4);white-space:nowrap}.fui-toggle-item--focused .fui-toggle-item__native{z-index:1}@media(prefers-contrast:high){.fui-toggle-item__native{border-width:2px}.fui-toggle-item__native[aria-checked=true]{background-color:Highlight;color:HighlightText;border-color:Highlight}}@media(prefers-reduced-motion:reduce){.fui-toggle-item__native{transition:none}}\n"] }]
103
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], buttonElement: [{ type: i0.ViewChild, args: ['buttonElement', { isSignal: true }] }] } });
99
104
 
100
105
  class FuiToggleGroupComponent {
101
106
  static _counter = 0;
@@ -154,12 +159,18 @@ class FuiToggleGroupComponent {
154
159
  const groupDisabled = this.disabled();
155
160
  const groupSize = this.size();
156
161
  items.forEach((btn, idx) => {
162
+ const btnValue = btn.value();
163
+ // An item whose `[value]` binding has not applied yet reports
164
+ // `undefined`; guard so it does not spuriously match a null/undefined
165
+ // group value (which would check every unbound item and hand each a
166
+ // roving tabindex of 0 on first paint).
167
+ const isSelected = btnValue !== undefined && btnValue === currentValue;
157
168
  btn._name.set(groupName);
158
- btn._checked.set(btn.value() === currentValue);
169
+ btn._checked.set(isSelected);
159
170
  btn._disabled.set(groupDisabled);
160
171
  btn._groupSize.set(groupSize);
161
172
  // Roving tabindex: only selected (or first if none selected) gets 0
162
- if (btn.value() === currentValue) {
173
+ if (isSelected) {
163
174
  btn._tabIndex.set(0);
164
175
  }
165
176
  else if (currentValue == null && idx === 0) {
@@ -273,7 +284,7 @@ class FuiToggleGroupComponent {
273
284
  multi: true,
274
285
  },
275
286
  { provide: FUI_TOGGLE_GROUP, useExisting: FuiToggleGroupComponent },
276
- ], queries: [{ propertyName: "toggleItems", predicate: FuiToggleItemComponent, isSignal: true }], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [".fui-toggle-group{display:inline-flex;align-items:center;gap:var(--fui-spacing-2);padding:var(--fui-spacing-2);box-sizing:border-box;background-color:var(--fui-bg-subtle);border-radius:var(--fui-radius-sm)}.fui-toggle-group--disabled{opacity:var(--fui-opacity-disabled, .38);cursor:not-allowed}.fui-toggle-group--error .fui-toggle-item__native{border-color:var(--fui-state-error)}.fui-toggle-group--error .fui-toggle-item__native[aria-checked=true]{background-color:var(--fui-state-error);color:var(--fui-white)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
287
+ ], queries: [{ propertyName: "toggleItems", predicate: FuiToggleItemComponent, isSignal: true }], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [".fui-toggle-group{display:inline-flex;align-items:center;gap:var(--fui-spacing-2);padding:var(--fui-spacing-2);box-sizing:border-box;background-color:var(--fui-bg-subtle);border-radius:var(--fui-radius-sm)}.fui-toggle-group--disabled{opacity:var(--fui-state-disabled-opacity);cursor:not-allowed}.fui-toggle-group--error .fui-toggle-item__native{border-color:var(--fui-fill-error)}.fui-toggle-group--error .fui-toggle-item__native[aria-checked=true]{background-color:var(--fui-fill-error);color:var(--fui-text-on-fill)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
277
288
  }
278
289
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiToggleGroupComponent, decorators: [{
279
290
  type: Component,
@@ -291,7 +302,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
291
302
  multi: true,
292
303
  },
293
304
  { provide: FUI_TOGGLE_GROUP, useExisting: FuiToggleGroupComponent },
294
- ], styles: [".fui-toggle-group{display:inline-flex;align-items:center;gap:var(--fui-spacing-2);padding:var(--fui-spacing-2);box-sizing:border-box;background-color:var(--fui-bg-subtle);border-radius:var(--fui-radius-sm)}.fui-toggle-group--disabled{opacity:var(--fui-opacity-disabled, .38);cursor:not-allowed}.fui-toggle-group--error .fui-toggle-item__native{border-color:var(--fui-state-error)}.fui-toggle-group--error .fui-toggle-item__native[aria-checked=true]{background-color:var(--fui-state-error);color:var(--fui-white)}\n"] }]
305
+ ], styles: [".fui-toggle-group{display:inline-flex;align-items:center;gap:var(--fui-spacing-2);padding:var(--fui-spacing-2);box-sizing:border-box;background-color:var(--fui-bg-subtle);border-radius:var(--fui-radius-sm)}.fui-toggle-group--disabled{opacity:var(--fui-state-disabled-opacity);cursor:not-allowed}.fui-toggle-group--error .fui-toggle-item__native{border-color:var(--fui-fill-error)}.fui-toggle-group--error .fui-toggle-item__native[aria-checked=true]{background-color:var(--fui-fill-error);color:var(--fui-text-on-fill)}\n"] }]
295
306
  }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], change: [{ type: i0.Output, args: ["change"] }], toggleItems: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FuiToggleItemComponent), { isSignal: true }] }] } });
296
307
 
297
308
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-toggle-group.mjs","sources":["../../../lib/components/toggle-group/toggle-group.types.ts","../../../lib/components/toggle-group/toggle-item/toggle-item.component.ts","../../../lib/components/toggle-group/toggle-item/toggle-item.component.html","../../../lib/components/toggle-group/toggle-group/toggle-group.component.ts","../../../lib/components/toggle-group/raintonic-formaui-components-toggle-group.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport type { FuiToggleItemComponent } from './toggle-item/toggle-item.component';\r\n\r\nexport interface FuiToggleGroupChange<T = unknown> {\r\n source: FuiToggleItemComponent;\r\n value: T;\r\n}\r\n\r\nexport interface FuiToggleGroupHost {\r\n disabled(): boolean;\r\n selectValue(value: unknown, source: FuiToggleItemComponent): void;\r\n setFocused(focused: boolean): void;\r\n selectAdjacentButton(direction: 1 | -1): void;\r\n selectFirstButton(): void;\r\n selectLastButton(): void;\r\n}\r\n\r\nexport const FUI_TOGGLE_GROUP = new InjectionToken<FuiToggleGroupHost>('FUI_TOGGLE_GROUP');\r\n\r\nexport type FuiToggleGroupSize = 'sm' | 'md' | 'lg';\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n computed,\r\n signal,\r\n ElementRef,\r\n viewChild,\r\n inject,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { FUI_TOGGLE_GROUP } from '../toggle-group.types';\r\n\r\n@Component({\r\n selector: 'fui-toggle-item',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './toggle-item.component.html',\r\n styleUrl: './toggle-item.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[attr.id]': 'id',\r\n },\r\n})\r\nexport class FuiToggleItemComponent {\r\n static nextId = 0;\r\n\r\n readonly value = input.required<unknown>();\r\n /** @docs-private — size is controlled by the parent fui-toggle-group. Only effective when used standalone outside a group. */\r\n readonly size = input('md');\r\n readonly disabledInput = input<boolean, unknown>(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\r\n readonly ariaLabelledby = input<string | null>(null, {\r\n alias: 'aria-labelledby',\r\n });\r\n\r\n // Internal state (set by parent group)\r\n readonly _checked = signal(false);\r\n readonly _disabled = signal(false);\r\n readonly _focused = signal(false);\r\n readonly _name = signal('');\r\n readonly _tabIndex = signal(-1);\r\n readonly _groupSize = signal('');\r\n\r\n readonly computedClasses = computed(() => {\r\n const checkedClass = this._checked() && 'fui-toggle-item--checked';\r\n const disabledClass = this._disabled() && 'fui-toggle-item--disabled';\r\n const focusedClass = this._focused() && 'fui-toggle-item--focused';\r\n const size = this._groupSize() || this.size(); // groupSize takes precedence\r\n return ['fui-toggle-item', `fui-toggle-item-size--${size}`, checkedClass, disabledClass, focusedClass]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n private _uid = `fui-toggle-item-${FuiToggleItemComponent.nextId++}`;\r\n readonly id = this._uid;\r\n\r\n private _toggleGroup = inject(FUI_TOGGLE_GROUP, { optional: true });\r\n\r\n readonly buttonElement = viewChild<ElementRef<HTMLButtonElement>>('buttonElement');\r\n\r\n readonly isDisabled = computed(\r\n () => this._disabled() || this.disabledInput() || (this._toggleGroup?.disabled() ?? false),\r\n );\r\n\r\n onClick(): void {\r\n if (this.isDisabled()) return;\r\n if (this._toggleGroup) {\r\n this._toggleGroup.selectValue(this.value(), this);\r\n }\r\n }\r\n\r\n onFocus(): void {\r\n this._focused.set(true);\r\n if (this._toggleGroup) this._toggleGroup.setFocused(true);\r\n }\r\n\r\n onBlur(): void {\r\n this._focused.set(false);\r\n if (this._toggleGroup) this._toggleGroup.setFocused(false);\r\n }\r\n\r\n onKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled() || !this._toggleGroup) return;\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this._toggleGroup.selectAdjacentButton(1);\r\n break;\r\n case 'ArrowUp':\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this._toggleGroup.selectAdjacentButton(-1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._toggleGroup.selectFirstButton();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._toggleGroup.selectLastButton();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n this._toggleGroup.selectValue(this.value(), this);\r\n break;\r\n }\r\n }\r\n\r\n focus(): void {\r\n this.buttonElement()?.nativeElement.focus();\r\n }\r\n}\r\n","<button\r\n #buttonElement\r\n type=\"button\"\r\n class=\"fui-toggle-item__native\"\r\n role=\"radio\"\r\n [attr.name]=\"_name()\"\r\n [attr.value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-checked]=\"_checked()\"\r\n [attr.aria-disabled]=\"isDisabled() || null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-labelledby]=\"ariaLabelledby()\"\r\n [attr.tabindex]=\"_tabIndex()\"\r\n (click)=\"onClick()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <span class=\"fui-toggle-item__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n</button>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n computed,\r\n signal,\r\n contentChildren,\r\n OutputEmitterRef,\r\n Signal,\r\n WritableSignal,\r\n OnDestroy,\r\n DoCheck,\r\n inject,\r\n effect,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport {\r\n injectNgControl,\r\n updateErrorState,\r\n syncRequiredState,\r\n syncNgControlDisabled,\r\n} from '@raintonic/formaui/cdk/form-field';\r\nimport { FuiToggleGroupChange, FUI_TOGGLE_GROUP } from '../toggle-group.types';\r\nimport { FuiToggleGroupSize } from '../toggle-group.types';\r\nimport { FuiToggleItemComponent } from '../toggle-item/toggle-item.component';\r\n\r\n@Component({\r\n selector: 'fui-toggle-group',\r\n standalone: true,\r\n imports: [],\r\n template: `<ng-content></ng-content>`,\r\n styleUrl: './toggle-group.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-toggle-group',\r\n '[class.fui-toggle-group--disabled]': 'disabled()',\r\n '[class.fui-toggle-group--error]': 'errorState()',\r\n '[attr.role]': '\"radiogroup\"',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n '[attr.aria-labelledby]': 'ariaLabelledby()',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiToggleGroupComponent,\r\n multi: true,\r\n },\r\n { provide: FUI_TOGGLE_GROUP, useExisting: FuiToggleGroupComponent },\r\n ],\r\n})\r\nexport class FuiToggleGroupComponent implements ControlValueAccessor, DoCheck, OnDestroy {\r\n private static _counter = 0;\r\n readonly controlType = 'fui-toggle-group';\r\n\r\n // Inputs\r\n readonly name = input(`fui-toggle-group-${FuiToggleGroupComponent._counter++}`);\r\n readonly disabledInput = input<boolean, unknown>(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\r\n readonly ariaLabelledby = input<string | null>(null, {\r\n alias: 'aria-labelledby',\r\n });\r\n readonly errorStateMatcher = input<ErrorStateMatcher | null>(null);\r\n readonly size = input<FuiToggleGroupSize>('md');\r\n\r\n // Outputs\r\n readonly change: OutputEmitterRef<FuiToggleGroupChange> = output();\r\n\r\n // Content children\r\n readonly toggleItems = contentChildren(FuiToggleItemComponent);\r\n\r\n // Internal state\r\n private readonly _value: WritableSignal<unknown> = signal(null);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n\r\n readonly value: Signal<unknown> = this._value.asReadonly();\r\n readonly focused: Signal<boolean> = this._focused.asReadonly();\r\n readonly errorState = this._errorState.asReadonly();\r\n readonly required: Signal<boolean> = computed(() => this._required());\r\n readonly disabled: Signal<boolean> = computed(\r\n () => this._disabled() || this.disabledInput() || this._ngControlDisabled(),\r\n );\r\n\r\n readonly stateChanges = new Subject<void>();\r\n readonly id = `fui-toggle-group-${FuiToggleGroupComponent._counter++}`;\r\n\r\n // Form control\r\n private _parentForm = inject(NgForm, { optional: true });\r\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\r\n private readonly _ngControlRef = injectNgControl();\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n private _onChange: (value: unknown) => void = () => {\r\n /* noop */\r\n };\r\n private _onTouched: () => void = () => {\r\n /* noop */\r\n };\r\n\r\n constructor() {\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Sync toggle items when they change or value changes\r\n effect(() => {\r\n const items = this.toggleItems();\r\n const currentValue = this._value();\r\n const groupName = this.name();\r\n const groupDisabled = this.disabled();\r\n const groupSize = this.size();\r\n\r\n items.forEach((btn, idx) => {\r\n btn._name.set(groupName);\r\n btn._checked.set(btn.value() === currentValue);\r\n btn._disabled.set(groupDisabled);\r\n btn._groupSize.set(groupSize);\r\n // Roving tabindex: only selected (or first if none selected) gets 0\r\n if (btn.value() === currentValue) {\r\n btn._tabIndex.set(0);\r\n } else if (currentValue == null && idx === 0) {\r\n btn._tabIndex.set(0);\r\n } else {\r\n btn._tabIndex.set(-1);\r\n }\r\n });\r\n });\r\n\r\n effect(() => {\r\n this._value();\r\n this._focused();\r\n this._disabled();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n updateErrorState(\r\n this.ngControl,\r\n this._errorState,\r\n this.errorStateMatcher(),\r\n this._defaultErrorStateMatcher,\r\n this._parentForm,\r\n this._parentFormGroup,\r\n this.stateChanges,\r\n );\r\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\r\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // CVA\r\n writeValue(value: unknown): void {\r\n this._value.set(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // Called by toggle items when selected\r\n selectValue(value: unknown, source: FuiToggleItemComponent): void {\r\n if (this.disabled()) return;\r\n const oldValue = this._value();\r\n if (oldValue === value) return; // no-op selecting same value\r\n this._value.set(value);\r\n this._onChange(value);\r\n this.change.emit({ source, value });\r\n this.stateChanges.next();\r\n }\r\n\r\n setFocused(focused: boolean): void {\r\n this._focused.set(focused);\r\n if (!focused) this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n // Keyboard navigation - select adjacent item\r\n selectAdjacentButton(direction: 1 | -1): void {\r\n const items = this.toggleItems();\r\n if (items.length === 0) return;\r\n\r\n const enabledItems = items.filter((b) => !b.isDisabled());\r\n if (enabledItems.length === 0) return;\r\n\r\n const currentIdx = enabledItems.findIndex((b) => b._checked());\r\n let nextIdx: number;\r\n if (currentIdx === -1) {\r\n nextIdx = direction === 1 ? 0 : enabledItems.length - 1;\r\n } else {\r\n nextIdx = (currentIdx + direction + enabledItems.length) % enabledItems.length;\r\n }\r\n\r\n const nextItem = enabledItems[nextIdx];\r\n this.selectValue(nextItem.value(), nextItem);\r\n nextItem.focus();\r\n }\r\n\r\n selectFirstButton(): void {\r\n const items = this.toggleItems();\r\n if (items.length === 0) return;\r\n\r\n const enabledItems = items.filter((b) => !b.isDisabled());\r\n if (enabledItems.length === 0) return;\r\n\r\n const firstItem = enabledItems[0];\r\n this.selectValue(firstItem.value(), firstItem);\r\n firstItem.focus();\r\n }\r\n\r\n selectLastButton(): void {\r\n const items = this.toggleItems();\r\n if (items.length === 0) return;\r\n\r\n const enabledItems = items.filter((b) => !b.isDisabled());\r\n if (enabledItems.length === 0) return;\r\n\r\n const lastItem = enabledItems[enabledItems.length - 1];\r\n this.selectValue(lastItem.value(), lastItem);\r\n lastItem.focus();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raintonic-formaui-components-toggle-group.mjs","sources":["../../../lib/components/toggle-group/toggle-group.types.ts","../../../lib/components/toggle-group/toggle-item/toggle-item.component.ts","../../../lib/components/toggle-group/toggle-item/toggle-item.component.html","../../../lib/components/toggle-group/toggle-group/toggle-group.component.ts","../../../lib/components/toggle-group/raintonic-formaui-components-toggle-group.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport type { FuiToggleItemComponent } from './toggle-item/toggle-item.component';\r\n\r\nexport interface FuiToggleGroupChange<T = unknown> {\r\n source: FuiToggleItemComponent;\r\n value: T;\r\n}\r\n\r\nexport interface FuiToggleGroupHost {\r\n disabled(): boolean;\r\n selectValue(value: unknown, source: FuiToggleItemComponent): void;\r\n setFocused(focused: boolean): void;\r\n selectAdjacentButton(direction: 1 | -1): void;\r\n selectFirstButton(): void;\r\n selectLastButton(): void;\r\n}\r\n\r\nexport const FUI_TOGGLE_GROUP = new InjectionToken<FuiToggleGroupHost>('FUI_TOGGLE_GROUP');\r\n\r\nexport type FuiToggleGroupSize = 'sm' | 'md' | 'lg';\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n computed,\r\n signal,\r\n ElementRef,\r\n viewChild,\r\n inject,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { FUI_TOGGLE_GROUP } from '../toggle-group.types';\r\n\r\n@Component({\r\n selector: 'fui-toggle-item',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './toggle-item.component.html',\r\n styleUrl: './toggle-item.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[attr.id]': 'id',\r\n },\r\n})\r\nexport class FuiToggleItemComponent {\r\n static nextId = 0;\r\n\r\n // Not `input.required`: when items are generated via `@for`, Angular applies the\r\n // [value] binding in the update block (after creation), but the parent group's\r\n // contentChildren effect reads item.value() on creation — a required input read\r\n // before binding throws NG0950. Optional input yields `undefined` until bound, and\r\n // the effect re-runs once the value arrives.\r\n readonly value = input<unknown>();\r\n /** @docs-private — size is controlled by the parent fui-toggle-group. Only effective when used standalone outside a group. */\r\n readonly size = input('md');\r\n readonly disabledInput = input<boolean, unknown>(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\r\n readonly ariaLabelledby = input<string | null>(null, {\r\n alias: 'aria-labelledby',\r\n });\r\n\r\n // Internal state (set by parent group)\r\n readonly _checked = signal(false);\r\n readonly _disabled = signal(false);\r\n readonly _focused = signal(false);\r\n readonly _name = signal('');\r\n readonly _tabIndex = signal(-1);\r\n readonly _groupSize = signal('');\r\n\r\n readonly computedClasses = computed(() => {\r\n const checkedClass = this._checked() && 'fui-toggle-item--checked';\r\n const disabledClass = this._disabled() && 'fui-toggle-item--disabled';\r\n const focusedClass = this._focused() && 'fui-toggle-item--focused';\r\n const size = this._groupSize() || this.size(); // groupSize takes precedence\r\n return ['fui-toggle-item', `fui-toggle-item-size--${size}`, checkedClass, disabledClass, focusedClass]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n private _uid = `fui-toggle-item-${FuiToggleItemComponent.nextId++}`;\r\n readonly id = this._uid;\r\n\r\n private _toggleGroup = inject(FUI_TOGGLE_GROUP, { optional: true });\r\n\r\n readonly buttonElement = viewChild<ElementRef<HTMLButtonElement>>('buttonElement');\r\n\r\n readonly isDisabled = computed(\r\n () => this._disabled() || this.disabledInput() || (this._toggleGroup?.disabled() ?? false),\r\n );\r\n\r\n onClick(): void {\r\n if (this.isDisabled()) return;\r\n if (this._toggleGroup) {\r\n this._toggleGroup.selectValue(this.value(), this);\r\n }\r\n }\r\n\r\n onFocus(): void {\r\n this._focused.set(true);\r\n if (this._toggleGroup) this._toggleGroup.setFocused(true);\r\n }\r\n\r\n onBlur(): void {\r\n this._focused.set(false);\r\n if (this._toggleGroup) this._toggleGroup.setFocused(false);\r\n }\r\n\r\n onKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled() || !this._toggleGroup) return;\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this._toggleGroup.selectAdjacentButton(1);\r\n break;\r\n case 'ArrowUp':\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this._toggleGroup.selectAdjacentButton(-1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._toggleGroup.selectFirstButton();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._toggleGroup.selectLastButton();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n this._toggleGroup.selectValue(this.value(), this);\r\n break;\r\n }\r\n }\r\n\r\n focus(): void {\r\n this.buttonElement()?.nativeElement.focus();\r\n }\r\n}\r\n","<button\r\n #buttonElement\r\n type=\"button\"\r\n class=\"fui-toggle-item__native\"\r\n role=\"radio\"\r\n [attr.name]=\"_name()\"\r\n [attr.value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-checked]=\"_checked()\"\r\n [attr.aria-disabled]=\"isDisabled() || null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-labelledby]=\"ariaLabelledby()\"\r\n [attr.tabindex]=\"_tabIndex()\"\r\n (click)=\"onClick()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <span class=\"fui-toggle-item__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n</button>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n computed,\r\n signal,\r\n contentChildren,\r\n OutputEmitterRef,\r\n Signal,\r\n WritableSignal,\r\n OnDestroy,\r\n DoCheck,\r\n inject,\r\n effect,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport {\r\n injectNgControl,\r\n updateErrorState,\r\n syncRequiredState,\r\n syncNgControlDisabled,\r\n} from '@raintonic/formaui/cdk/form-field';\r\nimport { FuiToggleGroupChange, FUI_TOGGLE_GROUP } from '../toggle-group.types';\r\nimport { FuiToggleGroupSize } from '../toggle-group.types';\r\nimport { FuiToggleItemComponent } from '../toggle-item/toggle-item.component';\r\n\r\n@Component({\r\n selector: 'fui-toggle-group',\r\n standalone: true,\r\n imports: [],\r\n template: `<ng-content></ng-content>`,\r\n styleUrl: './toggle-group.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-toggle-group',\r\n '[class.fui-toggle-group--disabled]': 'disabled()',\r\n '[class.fui-toggle-group--error]': 'errorState()',\r\n '[attr.role]': '\"radiogroup\"',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n '[attr.aria-labelledby]': 'ariaLabelledby()',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiToggleGroupComponent,\r\n multi: true,\r\n },\r\n { provide: FUI_TOGGLE_GROUP, useExisting: FuiToggleGroupComponent },\r\n ],\r\n})\r\nexport class FuiToggleGroupComponent implements ControlValueAccessor, DoCheck, OnDestroy {\r\n private static _counter = 0;\r\n readonly controlType = 'fui-toggle-group';\r\n\r\n // Inputs\r\n readonly name = input(`fui-toggle-group-${FuiToggleGroupComponent._counter++}`);\r\n readonly disabledInput = input<boolean, unknown>(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\r\n readonly ariaLabelledby = input<string | null>(null, {\r\n alias: 'aria-labelledby',\r\n });\r\n readonly errorStateMatcher = input<ErrorStateMatcher | null>(null);\r\n readonly size = input<FuiToggleGroupSize>('md');\r\n\r\n // Outputs\r\n readonly change: OutputEmitterRef<FuiToggleGroupChange> = output();\r\n\r\n // Content children\r\n readonly toggleItems = contentChildren(FuiToggleItemComponent);\r\n\r\n // Internal state\r\n private readonly _value: WritableSignal<unknown> = signal(null);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n\r\n readonly value: Signal<unknown> = this._value.asReadonly();\r\n readonly focused: Signal<boolean> = this._focused.asReadonly();\r\n readonly errorState = this._errorState.asReadonly();\r\n readonly required: Signal<boolean> = computed(() => this._required());\r\n readonly disabled: Signal<boolean> = computed(\r\n () => this._disabled() || this.disabledInput() || this._ngControlDisabled(),\r\n );\r\n\r\n readonly stateChanges = new Subject<void>();\r\n readonly id = `fui-toggle-group-${FuiToggleGroupComponent._counter++}`;\r\n\r\n // Form control\r\n private _parentForm = inject(NgForm, { optional: true });\r\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\r\n private readonly _ngControlRef = injectNgControl();\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n private _onChange: (value: unknown) => void = () => {\r\n /* noop */\r\n };\r\n private _onTouched: () => void = () => {\r\n /* noop */\r\n };\r\n\r\n constructor() {\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Sync toggle items when they change or value changes\r\n effect(() => {\r\n const items = this.toggleItems();\r\n const currentValue = this._value();\r\n const groupName = this.name();\r\n const groupDisabled = this.disabled();\r\n const groupSize = this.size();\r\n\r\n items.forEach((btn, idx) => {\r\n const btnValue = btn.value();\r\n // An item whose `[value]` binding has not applied yet reports\r\n // `undefined`; guard so it does not spuriously match a null/undefined\r\n // group value (which would check every unbound item and hand each a\r\n // roving tabindex of 0 on first paint).\r\n const isSelected = btnValue !== undefined && btnValue === currentValue;\r\n btn._name.set(groupName);\r\n btn._checked.set(isSelected);\r\n btn._disabled.set(groupDisabled);\r\n btn._groupSize.set(groupSize);\r\n // Roving tabindex: only selected (or first if none selected) gets 0\r\n if (isSelected) {\r\n btn._tabIndex.set(0);\r\n } else if (currentValue == null && idx === 0) {\r\n btn._tabIndex.set(0);\r\n } else {\r\n btn._tabIndex.set(-1);\r\n }\r\n });\r\n });\r\n\r\n effect(() => {\r\n this._value();\r\n this._focused();\r\n this._disabled();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n updateErrorState(\r\n this.ngControl,\r\n this._errorState,\r\n this.errorStateMatcher(),\r\n this._defaultErrorStateMatcher,\r\n this._parentForm,\r\n this._parentFormGroup,\r\n this.stateChanges,\r\n );\r\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\r\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // CVA\r\n writeValue(value: unknown): void {\r\n this._value.set(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // Called by toggle items when selected\r\n selectValue(value: unknown, source: FuiToggleItemComponent): void {\r\n if (this.disabled()) return;\r\n const oldValue = this._value();\r\n if (oldValue === value) return; // no-op selecting same value\r\n this._value.set(value);\r\n this._onChange(value);\r\n this.change.emit({ source, value });\r\n this.stateChanges.next();\r\n }\r\n\r\n setFocused(focused: boolean): void {\r\n this._focused.set(focused);\r\n if (!focused) this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n // Keyboard navigation - select adjacent item\r\n selectAdjacentButton(direction: 1 | -1): void {\r\n const items = this.toggleItems();\r\n if (items.length === 0) return;\r\n\r\n const enabledItems = items.filter((b) => !b.isDisabled());\r\n if (enabledItems.length === 0) return;\r\n\r\n const currentIdx = enabledItems.findIndex((b) => b._checked());\r\n let nextIdx: number;\r\n if (currentIdx === -1) {\r\n nextIdx = direction === 1 ? 0 : enabledItems.length - 1;\r\n } else {\r\n nextIdx = (currentIdx + direction + enabledItems.length) % enabledItems.length;\r\n }\r\n\r\n const nextItem = enabledItems[nextIdx];\r\n this.selectValue(nextItem.value(), nextItem);\r\n nextItem.focus();\r\n }\r\n\r\n selectFirstButton(): void {\r\n const items = this.toggleItems();\r\n if (items.length === 0) return;\r\n\r\n const enabledItems = items.filter((b) => !b.isDisabled());\r\n if (enabledItems.length === 0) return;\r\n\r\n const firstItem = enabledItems[0];\r\n this.selectValue(firstItem.value(), firstItem);\r\n firstItem.focus();\r\n }\r\n\r\n selectLastButton(): void {\r\n const items = this.toggleItems();\r\n if (items.length === 0) return;\r\n\r\n const enabledItems = items.filter((b) => !b.isDisabled());\r\n if (enabledItems.length === 0) return;\r\n\r\n const lastItem = enabledItems[enabledItems.length - 1];\r\n this.selectValue(lastItem.value(), lastItem);\r\n lastItem.focus();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@ import { Injectable, inject, ChangeDetectorRef, signal, input, computed, output,
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import * as i1 from '@angular/router';
5
5
  import { RouterModule } from '@angular/router';
6
- import { FuiIconComponent } from '@raintonic/formaui/components/icon';
7
6
  import { FuiAvatarComponent } from '@raintonic/formaui/components/avatar';
7
+ import { FuiIconComponent } from '@raintonic/formaui/components/icon';
8
8
  import { FuiIntlBase } from '@raintonic/formaui/core';
9
9
 
10
10
  class FuiToolbarIntl extends FuiIntlBase {
@@ -120,6 +120,12 @@ class FuiToolbarComponent {
120
120
  userAriaLabel = input(undefined, ...(ngDevMode ? [{ debugName: "userAriaLabel" }] : /* istanbul ignore next */ []));
121
121
  // New: show a dedicated sidebar toggle button
122
122
  showSidebarToggle = input(false, ...(ngDevMode ? [{ debugName: "showSidebarToggle" }] : /* istanbul ignore next */ []));
123
+ // New: show text labels next to icons for all menu buttons (per-item `showLabel` overrides).
124
+ showMenuLabels = input(false, ...(ngDevMode ? [{ debugName: "showMenuLabels" }] : /* istanbul ignore next */ []));
125
+ /** Resolve whether a menu item shows its label: per-item override → toolbar default. */
126
+ showItemLabel(item) {
127
+ return item.showLabel ?? this.showMenuLabels();
128
+ }
123
129
  /** Resolved navigation aria-label: input override → intl default. */
124
130
  resolvedNavAriaLabel = computed(() => {
125
131
  this._intlTick();
@@ -155,7 +161,7 @@ class FuiToolbarComponent {
155
161
  this.sidebarToggle.emit();
156
162
  }
157
163
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
158
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiToolbarComponent, isStandalone: true, selector: "fui-toolbar", inputs: { menuItems: { classPropertyName: "menuItems", publicName: "menuItems", isSignal: true, isRequired: false, transformFunction: null }, userProfile: { classPropertyName: "userProfile", publicName: "userProfile", isSignal: true, isRequired: false, transformFunction: null }, fixed: { classPropertyName: "fixed", publicName: "fixed", isSignal: true, isRequired: false, transformFunction: null }, activeMenuItemId: { classPropertyName: "activeMenuItemId", publicName: "activeMenuItemId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userAriaLabel: { classPropertyName: "userAriaLabel", publicName: "userAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, showSidebarToggle: { classPropertyName: "showSidebarToggle", publicName: "showSidebarToggle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", userProfileClick: "userProfileClick", sidebarToggle: "sidebarToggle" }, host: { attributes: { "role": "banner" }, properties: { "class.fui-toolbar--fixed": "fixed()" }, classAttribute: "fui-toolbar" }, ngImport: i0, template: "<!-- Sidebar Toggle Button (optional) -->\r\n@if (showSidebarToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button --sidebar-toggle\"\r\n [attr.aria-label]=\"intl.toggleSidebarAriaLabel\"\r\n title=\"Toggle sidebar\"\r\n (click)=\"onSidebarToggleClick()\"\r\n >\r\n <fui-icon name=\"sidebar\" size=\"md\"></fui-icon>\r\n </button>\r\n}\r\n<!-- Logo Section -->\r\n<div class=\"fui-toolbar__logo\">\r\n <ng-content select=\"[logo]\"></ng-content>\r\n</div>\r\n\r\n<!-- Navigation Menu -->\r\n<nav class=\"fui-toolbar__nav\" role=\"navigation\" [attr.aria-label]=\"resolvedNavAriaLabel()\">\r\n <ul class=\"fui-toolbar__menu\">\r\n @for (item of menuItems(); track item.id) {\r\n <li class=\"fui-toolbar__menu-item\">\r\n @if (item.routerLink) {\r\n <a\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [routerLink]=\"item.routerLink\"\r\n [queryParams]=\"item.queryParams\"\r\n [fragment]=\"item.fragment\"\r\n [attr.aria-current]=\"item.id === activeMenuItemId() ? 'page' : null\"\r\n [attr.aria-label]=\"item.label\"\r\n [title]=\"item.label\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-label]=\"item.label\"\r\n [attr.aria-pressed]=\"item.id === activeMenuItemId() ? 'true' : null\"\r\n [title]=\"item.label\"\r\n (click)=\"onMenuItemClick(item)\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</nav>\r\n<div class=\"fui-toolbar__spacer\"></div>\r\n<div class=\"fui-toolbar__more-buttons\">\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n</div>\r\n<!-- User Profile Section -->\r\n@if (userProfile(); as profile) {\r\n <div class=\"fui-toolbar__user\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__user-button\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-label]=\"resolvedUserAriaLabelPrefix() + profile.name\"\r\n [title]=\"profile.name + ' - ' + profile.email\"\r\n (click)=\"onUserProfileClick()\"\r\n >\r\n <fui-avatar [size]=\"32\" fullName=\"None\"> </fui-avatar>\r\n\r\n <div class=\"fui-toolbar__user-info\">\r\n <span class=\"fui-toolbar__user-name\">{{ profile.name }}</span>\r\n <span class=\"fui-toolbar__user-email\">{{ profile.email }}</span>\r\n </div>\r\n\r\n <fui-icon name=\"caret-down\" size=\"sm\" class=\"fui-toolbar__user-caret\"></fui-icon>\r\n </button>\r\n </div>\r\n}\r\n", styles: [".fui-toolbar{--fui-toolbar-height: 3rem;--fui-toolbar-padding-inline: var(--fui-spacing-7);--fui-toolbar-bg: var(--fui-bg-subtle);--fui-toolbar-border-color: var(--fui-border-default);--fui-toolbar-blur: 8px;--fui-toolbar-item-size: 3rem;--fui-toolbar-logo-image-max-height: 2rem;--fui-toolbar-user-text-max-width: 8rem;contain:layout style;display:flex;align-items:center;justify-content:space-between;width:100%;height:var(--fui-toolbar-height);padding-block:0;padding-inline:var(--fui-toolbar-padding-inline);background-color:var(--fui-toolbar-bg) CC;backdrop-filter:blur(var(--fui-toolbar-blur));border-bottom:1px solid var(--fui-toolbar-border-color);z-index:var(--fui-z-sticky, 1000)}.fui-toolbar--fixed{position:fixed;top:0;left:0;right:0}.fui-toolbar__logo{display:flex;align-items:center;flex-shrink:0;height:100%;min-width:0;margin-right:.75rem}.fui-toolbar__logo [logo]{display:flex;align-items:center;height:100%}.fui-toolbar__logo [logo] img{max-height:var(--fui-toolbar-logo-image-max-height, 2rem);width:auto}.fui-toolbar__logo [logo] h1,.fui-toolbar__logo [logo] h2,.fui-toolbar__logo [logo] h3{margin:0;font-size:var(--fui-text-lg);font-weight:600;color:var(--fui-text-primary)}.fui-toolbar__spacer{flex:1;min-width:0}.fui-toolbar__more-buttons{border-left:1px solid var(--fui-border-default);padding:0 .25rem;height:100%;display:flex;align-items:center;gap:.25rem;flex-shrink:0;min-width:0}.fui-toolbar__more-buttons:empty{display:none}.fui-toolbar__nav{flex:1;display:flex;justify-content:flex-start;max-width:100%;overflow:hidden}.fui-toolbar__menu{display:flex;align-items:center;gap:.25rem;list-style:none;margin:0;padding:0}.fui-toolbar__menu-item{display:flex}.fui-toolbar__menu-button{display:flex;align-items:center;justify-content:center;width:var(--fui-toolbar-item-size, 3rem);height:var(--fui-toolbar-item-size, 3rem);padding:0;border:none;border-radius:var(--fui-radius-lg, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}.fui-toolbar__menu-button.--sidebar-toggle{margin-right:.75rem}.fui-toolbar__menu-button:hover:not(:disabled){background-color:var(--fui-bg-subtle);color:var(--fui-brand-fg)}.fui-toolbar__menu-button:active:not(:disabled),.fui-toolbar__menu-button.active:not(:disabled){background-color:var(--fui-bg-muted);color:var(--fui-brand-fg)}.fui-toolbar__menu-button:focus-visible{outline:2px solid var(--fui-border-primary);outline-offset:2px}.fui-toolbar__menu-button--disabled{color:var(--fui-text-disabled);cursor:not-allowed}.fui-toolbar__user{border-left:1px solid var(--fui-border-default);display:flex;align-items:center;flex-shrink:0;margin-right:-1rem}.fui-toolbar__user-button{display:flex;align-items:center;gap:.5rem;padding:.25rem .75rem;border:none;border-radius:var(--fui-radius-md, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease);min-width:0}.fui-toolbar__user-button:hover{background-color:var(--fui-bg-subtle)}.fui-toolbar__user-button:active{background-color:var(--fui-bg-muted)}.fui-toolbar__user-button:focus-visible{outline:2px solid var(--fui-border-primary);outline-offset:2px}.fui-toolbar__user-info{display:flex;flex-direction:column;align-items:flex-start;min-width:0;flex:1}@media(max-width:768px){.fui-toolbar__user-info{display:none}}.fui-toolbar__user-name{font-size:var(--fui-text-base);font-weight:500;color:var(--fui-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:var(--fui-toolbar-user-text-max-width, 8rem)}.fui-toolbar__user-email{font-size:var(--fui-text-sm);color:var(--fui-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:8rem}.fui-toolbar__user-caret{flex-shrink:0;color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}@media(max-width:640px){.fui-toolbar__user-caret{display:none}}@media(max-width:768px){.fui-toolbar{padding:0 .75rem}.fui-toolbar__menu{gap:.125rem}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-md, 2.25rem);height:var(--fui-toolbar-item-size-md, 2.25rem)}}@media(max-width:640px){.fui-toolbar{padding:0 .5rem}.fui-toolbar__nav{flex:0;margin:0 .5rem}.fui-toolbar__menu{gap:0}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-sm, 2rem);height:var(--fui-toolbar-item-size-sm, 2rem)}.fui-toolbar__user-button{padding:.25rem;gap:.25rem}}[data-theme=dark] .fui-toolbar{border-bottom-color:var(--fui-border-default)}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "component", type: FuiAvatarComponent, selector: "fui-avatar", inputs: ["size", "fullName", "initials", "alt"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
164
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiToolbarComponent, isStandalone: true, selector: "fui-toolbar", inputs: { menuItems: { classPropertyName: "menuItems", publicName: "menuItems", isSignal: true, isRequired: false, transformFunction: null }, userProfile: { classPropertyName: "userProfile", publicName: "userProfile", isSignal: true, isRequired: false, transformFunction: null }, fixed: { classPropertyName: "fixed", publicName: "fixed", isSignal: true, isRequired: false, transformFunction: null }, activeMenuItemId: { classPropertyName: "activeMenuItemId", publicName: "activeMenuItemId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userAriaLabel: { classPropertyName: "userAriaLabel", publicName: "userAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, showSidebarToggle: { classPropertyName: "showSidebarToggle", publicName: "showSidebarToggle", isSignal: true, isRequired: false, transformFunction: null }, showMenuLabels: { classPropertyName: "showMenuLabels", publicName: "showMenuLabels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuItemClick: "menuItemClick", userProfileClick: "userProfileClick", sidebarToggle: "sidebarToggle" }, host: { attributes: { "role": "banner" }, properties: { "class.fui-toolbar--fixed": "fixed()" }, classAttribute: "fui-toolbar" }, ngImport: i0, template: "<!-- Sidebar Toggle Button (optional) -->\r\n@if (showSidebarToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button --sidebar-toggle\"\r\n [attr.aria-label]=\"intl.toggleSidebarAriaLabel\"\r\n title=\"Toggle sidebar\"\r\n (click)=\"onSidebarToggleClick()\"\r\n >\r\n <fui-icon name=\"sidebar\" size=\"md\"></fui-icon>\r\n </button>\r\n}\r\n<!-- Logo Section -->\r\n<div class=\"fui-toolbar__logo\">\r\n <ng-content select=\"[logo]\"></ng-content>\r\n</div>\r\n\r\n<!-- Navigation Menu -->\r\n<nav class=\"fui-toolbar__nav\" role=\"navigation\" [attr.aria-label]=\"resolvedNavAriaLabel()\">\r\n <ul class=\"fui-toolbar__menu\">\r\n @for (item of menuItems(); track item.id) {\r\n <li class=\"fui-toolbar__menu-item\">\r\n @if (item.routerLink) {\r\n <a\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--with-label]=\"showItemLabel(item)\"\r\n [routerLink]=\"item.routerLink\"\r\n [queryParams]=\"item.queryParams\"\r\n [fragment]=\"item.fragment\"\r\n [attr.aria-current]=\"item.id === activeMenuItemId() ? 'page' : null\"\r\n [attr.aria-label]=\"item.label\"\r\n [title]=\"item.label\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n @if (showItemLabel(item)) {\r\n <span class=\"fui-toolbar__menu-label\">{{ item.label }}</span>\r\n }\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--with-label]=\"showItemLabel(item)\"\r\n [class.fui-toolbar__menu-button--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-label]=\"item.label\"\r\n [attr.aria-pressed]=\"item.id === activeMenuItemId() ? 'true' : null\"\r\n [title]=\"item.label\"\r\n (click)=\"onMenuItemClick(item)\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n @if (showItemLabel(item)) {\r\n <span class=\"fui-toolbar__menu-label\">{{ item.label }}</span>\r\n }\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</nav>\r\n<div class=\"fui-toolbar__spacer\"></div>\r\n<div class=\"fui-toolbar__more-buttons\">\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n</div>\r\n<!-- User Profile Section -->\r\n@if (userProfile(); as profile) {\r\n <div class=\"fui-toolbar__user\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__user-button\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-label]=\"resolvedUserAriaLabelPrefix() + profile.name\"\r\n [title]=\"profile.name + ' - ' + profile.email\"\r\n (click)=\"onUserProfileClick()\"\r\n >\r\n <fui-avatar size=\"sm\" [fullName]=\"profile.name\" [initials]=\"profile.initials\"></fui-avatar>\r\n\r\n <div class=\"fui-toolbar__user-info\">\r\n <span class=\"fui-toolbar__user-name\">{{ profile.name }}</span>\r\n <span class=\"fui-toolbar__user-email\">{{ profile.email }}</span>\r\n </div>\r\n\r\n <fui-icon name=\"caret-down\" size=\"sm\" class=\"fui-toolbar__user-caret\"></fui-icon>\r\n </button>\r\n </div>\r\n}\r\n", styles: [".fui-toolbar{--fui-toolbar-height: 3rem;--fui-toolbar-padding-inline: var(--fui-spacing-7);--fui-toolbar-bg: var(--fui-bg-subtle);--fui-toolbar-border-color: var(--fui-border-default);--fui-toolbar-blur: 8px;--fui-toolbar-item-size: 3rem;--fui-toolbar-item-size-md: 2.25rem;--fui-toolbar-item-size-sm: 2rem;--fui-toolbar-logo-image-max-height: 2rem;--fui-toolbar-user-text-max-width: 8rem;contain:layout style;display:flex;align-items:center;justify-content:space-between;width:100%;height:calc(var(--fui-toolbar-height) + var(--fui-border-width-sm));padding-block:0;padding-inline:var(--fui-toolbar-padding-inline);background-color:color-mix(in srgb,var(--fui-toolbar-bg) 80%,transparent);backdrop-filter:blur(var(--fui-toolbar-blur));border-bottom:var(--fui-border-width-sm) solid var(--fui-toolbar-border-color);z-index:var(--fui-z-sticky)}.fui-toolbar--fixed{position:fixed;top:0;left:0;right:0}.fui-toolbar__logo{display:flex;align-items:center;flex-shrink:0;height:100%;min-width:0;margin-right:.75rem}.fui-toolbar__logo [logo]{display:flex;align-items:center;height:100%}.fui-toolbar__logo [logo] img{max-height:var(--fui-toolbar-logo-image-max-height, 2rem);width:auto}.fui-toolbar__logo [logo] h1,.fui-toolbar__logo [logo] h2,.fui-toolbar__logo [logo] h3{margin:0;font-size:var(--fui-text-lg);font-weight:var(--fui-weight-semibold);color:var(--fui-text-primary)}.fui-toolbar__spacer{flex:1;min-width:0}.fui-toolbar__more-buttons{border-left:var(--fui-border-width-sm) solid var(--fui-border-default);padding:0 .25rem;height:100%;display:flex;align-items:center;gap:.25rem;flex-shrink:0;min-width:0}.fui-toolbar__more-buttons:empty{display:none}.fui-toolbar__nav{flex:1;display:flex;justify-content:flex-start;max-width:100%;overflow:hidden}.fui-toolbar__menu{display:flex;align-items:center;gap:.25rem;list-style:none;margin:0;padding:0}.fui-toolbar__menu-item{display:flex}.fui-toolbar__menu-button{display:flex;align-items:center;justify-content:center;width:var(--fui-toolbar-item-size, 3rem);height:var(--fui-toolbar-item-size, 3rem);padding:0;border:none;border-radius:var(--fui-radius-lg, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}.fui-toolbar__menu-button.--sidebar-toggle{margin-right:.75rem}.fui-toolbar__menu-button--with-label{width:auto;gap:.25rem;padding-inline:.5rem}.fui-toolbar__menu-button:hover:not(:disabled){background-color:var(--fui-bg-subtle);color:var(--fui-primary-fg)}.fui-toolbar__menu-button:active:not(:disabled),.fui-toolbar__menu-button.active:not(:disabled){background-color:var(--fui-bg-muted);color:var(--fui-primary-fg)}.fui-toolbar__menu-button:focus-visible{outline:var(--fui-state-focus-ring-width) solid var(--fui-border-primary);outline-offset:var(--fui-state-focus-ring-offset)}.fui-toolbar__menu-button--disabled{color:var(--fui-text-disabled);cursor:not-allowed}.fui-toolbar__menu-label{white-space:nowrap;font-size:var(--fui-text-base);font-weight:var(--fui-weight-medium);color:inherit}.fui-toolbar__user{border-left:var(--fui-border-width-sm) solid var(--fui-border-default);display:flex;align-items:center;flex-shrink:0;margin-right:-1rem}.fui-toolbar__user-button{display:flex;align-items:center;gap:.5rem;padding:.25rem .75rem;border:none;border-radius:var(--fui-radius-md, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease);min-width:0}.fui-toolbar__user-button:hover{background-color:var(--fui-bg-subtle)}.fui-toolbar__user-button:active{background-color:var(--fui-bg-muted)}.fui-toolbar__user-button:focus-visible{outline:var(--fui-state-focus-ring-width) solid var(--fui-border-primary);outline-offset:var(--fui-state-focus-ring-offset)}.fui-toolbar__user-info{display:flex;flex-direction:column;align-items:flex-start;min-width:0;flex:1}@media(max-width:768px){.fui-toolbar__user-info{display:none}}.fui-toolbar__user-name{font-size:var(--fui-text-base);font-weight:var(--fui-weight-medium);color:var(--fui-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:var(--fui-toolbar-user-text-max-width, 8rem)}.fui-toolbar__user-email{font-size:var(--fui-text-sm);color:var(--fui-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:8rem}.fui-toolbar__user-caret{flex-shrink:0;color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}@media(max-width:640px){.fui-toolbar__user-caret{display:none}}@media(max-width:768px){.fui-toolbar{padding:0 .75rem}.fui-toolbar__menu{gap:.125rem}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-md, 2.25rem);height:var(--fui-toolbar-item-size-md, 2.25rem)}.fui-toolbar__menu-button--with-label{width:var(--fui-toolbar-item-size-md, 2.25rem);padding-inline:0;gap:0}.fui-toolbar__menu-label{display:none}}@media(max-width:640px){.fui-toolbar{padding:0 .5rem}.fui-toolbar__nav{flex:0;margin:0 .5rem}.fui-toolbar__menu{gap:0}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-sm, 2rem);height:var(--fui-toolbar-item-size-sm, 2rem)}.fui-toolbar__user-button{padding:.25rem;gap:.25rem}}[data-theme=dark] .fui-toolbar{--fui-toolbar-border-color: var(--fui-border-default)}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }, { kind: "component", type: FuiAvatarComponent, selector: "fui-avatar", inputs: ["size", "fullName", "initials", "alt"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
159
165
  }
160
166
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiToolbarComponent, decorators: [{
161
167
  type: Component,
@@ -163,8 +169,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
163
169
  class: 'fui-toolbar',
164
170
  role: 'banner',
165
171
  '[class.fui-toolbar--fixed]': 'fixed()',
166
- }, template: "<!-- Sidebar Toggle Button (optional) -->\r\n@if (showSidebarToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button --sidebar-toggle\"\r\n [attr.aria-label]=\"intl.toggleSidebarAriaLabel\"\r\n title=\"Toggle sidebar\"\r\n (click)=\"onSidebarToggleClick()\"\r\n >\r\n <fui-icon name=\"sidebar\" size=\"md\"></fui-icon>\r\n </button>\r\n}\r\n<!-- Logo Section -->\r\n<div class=\"fui-toolbar__logo\">\r\n <ng-content select=\"[logo]\"></ng-content>\r\n</div>\r\n\r\n<!-- Navigation Menu -->\r\n<nav class=\"fui-toolbar__nav\" role=\"navigation\" [attr.aria-label]=\"resolvedNavAriaLabel()\">\r\n <ul class=\"fui-toolbar__menu\">\r\n @for (item of menuItems(); track item.id) {\r\n <li class=\"fui-toolbar__menu-item\">\r\n @if (item.routerLink) {\r\n <a\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [routerLink]=\"item.routerLink\"\r\n [queryParams]=\"item.queryParams\"\r\n [fragment]=\"item.fragment\"\r\n [attr.aria-current]=\"item.id === activeMenuItemId() ? 'page' : null\"\r\n [attr.aria-label]=\"item.label\"\r\n [title]=\"item.label\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-label]=\"item.label\"\r\n [attr.aria-pressed]=\"item.id === activeMenuItemId() ? 'true' : null\"\r\n [title]=\"item.label\"\r\n (click)=\"onMenuItemClick(item)\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</nav>\r\n<div class=\"fui-toolbar__spacer\"></div>\r\n<div class=\"fui-toolbar__more-buttons\">\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n</div>\r\n<!-- User Profile Section -->\r\n@if (userProfile(); as profile) {\r\n <div class=\"fui-toolbar__user\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__user-button\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-label]=\"resolvedUserAriaLabelPrefix() + profile.name\"\r\n [title]=\"profile.name + ' - ' + profile.email\"\r\n (click)=\"onUserProfileClick()\"\r\n >\r\n <fui-avatar [size]=\"32\" fullName=\"None\"> </fui-avatar>\r\n\r\n <div class=\"fui-toolbar__user-info\">\r\n <span class=\"fui-toolbar__user-name\">{{ profile.name }}</span>\r\n <span class=\"fui-toolbar__user-email\">{{ profile.email }}</span>\r\n </div>\r\n\r\n <fui-icon name=\"caret-down\" size=\"sm\" class=\"fui-toolbar__user-caret\"></fui-icon>\r\n </button>\r\n </div>\r\n}\r\n", styles: [".fui-toolbar{--fui-toolbar-height: 3rem;--fui-toolbar-padding-inline: var(--fui-spacing-7);--fui-toolbar-bg: var(--fui-bg-subtle);--fui-toolbar-border-color: var(--fui-border-default);--fui-toolbar-blur: 8px;--fui-toolbar-item-size: 3rem;--fui-toolbar-logo-image-max-height: 2rem;--fui-toolbar-user-text-max-width: 8rem;contain:layout style;display:flex;align-items:center;justify-content:space-between;width:100%;height:var(--fui-toolbar-height);padding-block:0;padding-inline:var(--fui-toolbar-padding-inline);background-color:var(--fui-toolbar-bg) CC;backdrop-filter:blur(var(--fui-toolbar-blur));border-bottom:1px solid var(--fui-toolbar-border-color);z-index:var(--fui-z-sticky, 1000)}.fui-toolbar--fixed{position:fixed;top:0;left:0;right:0}.fui-toolbar__logo{display:flex;align-items:center;flex-shrink:0;height:100%;min-width:0;margin-right:.75rem}.fui-toolbar__logo [logo]{display:flex;align-items:center;height:100%}.fui-toolbar__logo [logo] img{max-height:var(--fui-toolbar-logo-image-max-height, 2rem);width:auto}.fui-toolbar__logo [logo] h1,.fui-toolbar__logo [logo] h2,.fui-toolbar__logo [logo] h3{margin:0;font-size:var(--fui-text-lg);font-weight:600;color:var(--fui-text-primary)}.fui-toolbar__spacer{flex:1;min-width:0}.fui-toolbar__more-buttons{border-left:1px solid var(--fui-border-default);padding:0 .25rem;height:100%;display:flex;align-items:center;gap:.25rem;flex-shrink:0;min-width:0}.fui-toolbar__more-buttons:empty{display:none}.fui-toolbar__nav{flex:1;display:flex;justify-content:flex-start;max-width:100%;overflow:hidden}.fui-toolbar__menu{display:flex;align-items:center;gap:.25rem;list-style:none;margin:0;padding:0}.fui-toolbar__menu-item{display:flex}.fui-toolbar__menu-button{display:flex;align-items:center;justify-content:center;width:var(--fui-toolbar-item-size, 3rem);height:var(--fui-toolbar-item-size, 3rem);padding:0;border:none;border-radius:var(--fui-radius-lg, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}.fui-toolbar__menu-button.--sidebar-toggle{margin-right:.75rem}.fui-toolbar__menu-button:hover:not(:disabled){background-color:var(--fui-bg-subtle);color:var(--fui-brand-fg)}.fui-toolbar__menu-button:active:not(:disabled),.fui-toolbar__menu-button.active:not(:disabled){background-color:var(--fui-bg-muted);color:var(--fui-brand-fg)}.fui-toolbar__menu-button:focus-visible{outline:2px solid var(--fui-border-primary);outline-offset:2px}.fui-toolbar__menu-button--disabled{color:var(--fui-text-disabled);cursor:not-allowed}.fui-toolbar__user{border-left:1px solid var(--fui-border-default);display:flex;align-items:center;flex-shrink:0;margin-right:-1rem}.fui-toolbar__user-button{display:flex;align-items:center;gap:.5rem;padding:.25rem .75rem;border:none;border-radius:var(--fui-radius-md, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease);min-width:0}.fui-toolbar__user-button:hover{background-color:var(--fui-bg-subtle)}.fui-toolbar__user-button:active{background-color:var(--fui-bg-muted)}.fui-toolbar__user-button:focus-visible{outline:2px solid var(--fui-border-primary);outline-offset:2px}.fui-toolbar__user-info{display:flex;flex-direction:column;align-items:flex-start;min-width:0;flex:1}@media(max-width:768px){.fui-toolbar__user-info{display:none}}.fui-toolbar__user-name{font-size:var(--fui-text-base);font-weight:500;color:var(--fui-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:var(--fui-toolbar-user-text-max-width, 8rem)}.fui-toolbar__user-email{font-size:var(--fui-text-sm);color:var(--fui-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:8rem}.fui-toolbar__user-caret{flex-shrink:0;color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}@media(max-width:640px){.fui-toolbar__user-caret{display:none}}@media(max-width:768px){.fui-toolbar{padding:0 .75rem}.fui-toolbar__menu{gap:.125rem}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-md, 2.25rem);height:var(--fui-toolbar-item-size-md, 2.25rem)}}@media(max-width:640px){.fui-toolbar{padding:0 .5rem}.fui-toolbar__nav{flex:0;margin:0 .5rem}.fui-toolbar__menu{gap:0}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-sm, 2rem);height:var(--fui-toolbar-item-size-sm, 2rem)}.fui-toolbar__user-button{padding:.25rem;gap:.25rem}}[data-theme=dark] .fui-toolbar{border-bottom-color:var(--fui-border-default)}\n"] }]
167
- }], ctorParameters: () => [], propDecorators: { menuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuItems", required: false }] }], userProfile: [{ type: i0.Input, args: [{ isSignal: true, alias: "userProfile", required: false }] }], fixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "fixed", required: false }] }], activeMenuItemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeMenuItemId", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "userAriaLabel", required: false }] }], showSidebarToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSidebarToggle", required: false }] }], menuItemClick: [{ type: i0.Output, args: ["menuItemClick"] }], userProfileClick: [{ type: i0.Output, args: ["userProfileClick"] }], sidebarToggle: [{ type: i0.Output, args: ["sidebarToggle"] }] } });
172
+ }, template: "<!-- Sidebar Toggle Button (optional) -->\r\n@if (showSidebarToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button --sidebar-toggle\"\r\n [attr.aria-label]=\"intl.toggleSidebarAriaLabel\"\r\n title=\"Toggle sidebar\"\r\n (click)=\"onSidebarToggleClick()\"\r\n >\r\n <fui-icon name=\"sidebar\" size=\"md\"></fui-icon>\r\n </button>\r\n}\r\n<!-- Logo Section -->\r\n<div class=\"fui-toolbar__logo\">\r\n <ng-content select=\"[logo]\"></ng-content>\r\n</div>\r\n\r\n<!-- Navigation Menu -->\r\n<nav class=\"fui-toolbar__nav\" role=\"navigation\" [attr.aria-label]=\"resolvedNavAriaLabel()\">\r\n <ul class=\"fui-toolbar__menu\">\r\n @for (item of menuItems(); track item.id) {\r\n <li class=\"fui-toolbar__menu-item\">\r\n @if (item.routerLink) {\r\n <a\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--with-label]=\"showItemLabel(item)\"\r\n [routerLink]=\"item.routerLink\"\r\n [queryParams]=\"item.queryParams\"\r\n [fragment]=\"item.fragment\"\r\n [attr.aria-current]=\"item.id === activeMenuItemId() ? 'page' : null\"\r\n [attr.aria-label]=\"item.label\"\r\n [title]=\"item.label\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n @if (showItemLabel(item)) {\r\n <span class=\"fui-toolbar__menu-label\">{{ item.label }}</span>\r\n }\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--with-label]=\"showItemLabel(item)\"\r\n [class.fui-toolbar__menu-button--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-label]=\"item.label\"\r\n [attr.aria-pressed]=\"item.id === activeMenuItemId() ? 'true' : null\"\r\n [title]=\"item.label\"\r\n (click)=\"onMenuItemClick(item)\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n @if (showItemLabel(item)) {\r\n <span class=\"fui-toolbar__menu-label\">{{ item.label }}</span>\r\n }\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</nav>\r\n<div class=\"fui-toolbar__spacer\"></div>\r\n<div class=\"fui-toolbar__more-buttons\">\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n</div>\r\n<!-- User Profile Section -->\r\n@if (userProfile(); as profile) {\r\n <div class=\"fui-toolbar__user\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__user-button\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-label]=\"resolvedUserAriaLabelPrefix() + profile.name\"\r\n [title]=\"profile.name + ' - ' + profile.email\"\r\n (click)=\"onUserProfileClick()\"\r\n >\r\n <fui-avatar size=\"sm\" [fullName]=\"profile.name\" [initials]=\"profile.initials\"></fui-avatar>\r\n\r\n <div class=\"fui-toolbar__user-info\">\r\n <span class=\"fui-toolbar__user-name\">{{ profile.name }}</span>\r\n <span class=\"fui-toolbar__user-email\">{{ profile.email }}</span>\r\n </div>\r\n\r\n <fui-icon name=\"caret-down\" size=\"sm\" class=\"fui-toolbar__user-caret\"></fui-icon>\r\n </button>\r\n </div>\r\n}\r\n", styles: [".fui-toolbar{--fui-toolbar-height: 3rem;--fui-toolbar-padding-inline: var(--fui-spacing-7);--fui-toolbar-bg: var(--fui-bg-subtle);--fui-toolbar-border-color: var(--fui-border-default);--fui-toolbar-blur: 8px;--fui-toolbar-item-size: 3rem;--fui-toolbar-item-size-md: 2.25rem;--fui-toolbar-item-size-sm: 2rem;--fui-toolbar-logo-image-max-height: 2rem;--fui-toolbar-user-text-max-width: 8rem;contain:layout style;display:flex;align-items:center;justify-content:space-between;width:100%;height:calc(var(--fui-toolbar-height) + var(--fui-border-width-sm));padding-block:0;padding-inline:var(--fui-toolbar-padding-inline);background-color:color-mix(in srgb,var(--fui-toolbar-bg) 80%,transparent);backdrop-filter:blur(var(--fui-toolbar-blur));border-bottom:var(--fui-border-width-sm) solid var(--fui-toolbar-border-color);z-index:var(--fui-z-sticky)}.fui-toolbar--fixed{position:fixed;top:0;left:0;right:0}.fui-toolbar__logo{display:flex;align-items:center;flex-shrink:0;height:100%;min-width:0;margin-right:.75rem}.fui-toolbar__logo [logo]{display:flex;align-items:center;height:100%}.fui-toolbar__logo [logo] img{max-height:var(--fui-toolbar-logo-image-max-height, 2rem);width:auto}.fui-toolbar__logo [logo] h1,.fui-toolbar__logo [logo] h2,.fui-toolbar__logo [logo] h3{margin:0;font-size:var(--fui-text-lg);font-weight:var(--fui-weight-semibold);color:var(--fui-text-primary)}.fui-toolbar__spacer{flex:1;min-width:0}.fui-toolbar__more-buttons{border-left:var(--fui-border-width-sm) solid var(--fui-border-default);padding:0 .25rem;height:100%;display:flex;align-items:center;gap:.25rem;flex-shrink:0;min-width:0}.fui-toolbar__more-buttons:empty{display:none}.fui-toolbar__nav{flex:1;display:flex;justify-content:flex-start;max-width:100%;overflow:hidden}.fui-toolbar__menu{display:flex;align-items:center;gap:.25rem;list-style:none;margin:0;padding:0}.fui-toolbar__menu-item{display:flex}.fui-toolbar__menu-button{display:flex;align-items:center;justify-content:center;width:var(--fui-toolbar-item-size, 3rem);height:var(--fui-toolbar-item-size, 3rem);padding:0;border:none;border-radius:var(--fui-radius-lg, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}.fui-toolbar__menu-button.--sidebar-toggle{margin-right:.75rem}.fui-toolbar__menu-button--with-label{width:auto;gap:.25rem;padding-inline:.5rem}.fui-toolbar__menu-button:hover:not(:disabled){background-color:var(--fui-bg-subtle);color:var(--fui-primary-fg)}.fui-toolbar__menu-button:active:not(:disabled),.fui-toolbar__menu-button.active:not(:disabled){background-color:var(--fui-bg-muted);color:var(--fui-primary-fg)}.fui-toolbar__menu-button:focus-visible{outline:var(--fui-state-focus-ring-width) solid var(--fui-border-primary);outline-offset:var(--fui-state-focus-ring-offset)}.fui-toolbar__menu-button--disabled{color:var(--fui-text-disabled);cursor:not-allowed}.fui-toolbar__menu-label{white-space:nowrap;font-size:var(--fui-text-base);font-weight:var(--fui-weight-medium);color:inherit}.fui-toolbar__user{border-left:var(--fui-border-width-sm) solid var(--fui-border-default);display:flex;align-items:center;flex-shrink:0;margin-right:-1rem}.fui-toolbar__user-button{display:flex;align-items:center;gap:.5rem;padding:.25rem .75rem;border:none;border-radius:var(--fui-radius-md, 6px);background-color:transparent;color:var(--fui-text-primary);cursor:pointer;transition:all var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease);min-width:0}.fui-toolbar__user-button:hover{background-color:var(--fui-bg-subtle)}.fui-toolbar__user-button:active{background-color:var(--fui-bg-muted)}.fui-toolbar__user-button:focus-visible{outline:var(--fui-state-focus-ring-width) solid var(--fui-border-primary);outline-offset:var(--fui-state-focus-ring-offset)}.fui-toolbar__user-info{display:flex;flex-direction:column;align-items:flex-start;min-width:0;flex:1}@media(max-width:768px){.fui-toolbar__user-info{display:none}}.fui-toolbar__user-name{font-size:var(--fui-text-base);font-weight:var(--fui-weight-medium);color:var(--fui-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:var(--fui-toolbar-user-text-max-width, 8rem)}.fui-toolbar__user-email{font-size:var(--fui-text-sm);color:var(--fui-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:8rem}.fui-toolbar__user-caret{flex-shrink:0;color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast, .12s) var(--fui-ease-in-out, ease)}@media(max-width:640px){.fui-toolbar__user-caret{display:none}}@media(max-width:768px){.fui-toolbar{padding:0 .75rem}.fui-toolbar__menu{gap:.125rem}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-md, 2.25rem);height:var(--fui-toolbar-item-size-md, 2.25rem)}.fui-toolbar__menu-button--with-label{width:var(--fui-toolbar-item-size-md, 2.25rem);padding-inline:0;gap:0}.fui-toolbar__menu-label{display:none}}@media(max-width:640px){.fui-toolbar{padding:0 .5rem}.fui-toolbar__nav{flex:0;margin:0 .5rem}.fui-toolbar__menu{gap:0}.fui-toolbar__menu-button{width:var(--fui-toolbar-item-size-sm, 2rem);height:var(--fui-toolbar-item-size-sm, 2rem)}.fui-toolbar__user-button{padding:.25rem;gap:.25rem}}[data-theme=dark] .fui-toolbar{--fui-toolbar-border-color: var(--fui-border-default)}\n"] }]
173
+ }], ctorParameters: () => [], propDecorators: { menuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuItems", required: false }] }], userProfile: [{ type: i0.Input, args: [{ isSignal: true, alias: "userProfile", required: false }] }], fixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "fixed", required: false }] }], activeMenuItemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeMenuItemId", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "userAriaLabel", required: false }] }], showSidebarToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSidebarToggle", required: false }] }], showMenuLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showMenuLabels", required: false }] }], menuItemClick: [{ type: i0.Output, args: ["menuItemClick"] }], userProfileClick: [{ type: i0.Output, args: ["userProfileClick"] }], sidebarToggle: [{ type: i0.Output, args: ["sidebarToggle"] }] } });
168
174
 
169
175
  /**
170
176
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-toolbar.mjs","sources":["../../../lib/components/toolbar/toolbar.intl.ts","../../../lib/components/toolbar/toolbar.component.ts","../../../lib/components/toolbar/toolbar.component.html","../../../lib/components/toolbar/raintonic-formaui-components-toolbar.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiToolbarIntl extends FuiIntlBase {\r\n navAriaLabel = 'Main navigation';\r\n userAriaLabelPrefix = 'User menu for ';\r\n toggleSidebarAriaLabel = 'Toggle sidebar';\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n ViewEncapsulation,\r\n inject,\r\n input,\r\n output,\r\n computed,\r\n signal,\r\n InputSignal,\r\n OutputEmitterRef,\r\n Signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { RouterModule } from '@angular/router';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiAvatarComponent } from '@raintonic/formaui/components/avatar';\r\nimport { FuiToolbarIntl } from './toolbar.intl';\r\n\r\n/**\r\n * Toolbar menu item interface\r\n */\r\nexport interface FuiToolbarMenuItem {\r\n id: string | number;\r\n icon: string;\r\n label: string;\r\n disabled?: boolean;\r\n routerLink?: string | string[];\r\n queryParams?: Record<string, string>;\r\n fragment?: string;\r\n}\r\n\r\n/**\r\n * User profile data interface\r\n */\r\nexport interface FuiToolbarUserProfile {\r\n name: string;\r\n email: string;\r\n avatar?: string;\r\n initials?: string;\r\n}\r\n\r\n/**\r\n * # FuiToolbar Component\r\n *\r\n * A top navigation toolbar following Carbon Design System principles.\r\n * Provides space for logo, navigation menu items, and user profile area.\r\n *\r\n * ## Features\r\n * - Logo area with customizable content\r\n * - Icon-based navigation menu\r\n * - User profile area with avatar/initials\r\n * - Responsive design\r\n * - Theme integration\r\n * - Accessibility support\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Toolbar\r\n * ```html\r\n * <fui-toolbar\r\n * [menuItems]=\"menuItems\"\r\n * [userProfile]=\"userProfile\"\r\n * (menuItemClick)=\"onMenuItemClick($event)\"\r\n * (userProfileClick)=\"onUserProfileClick()\">\r\n * <div logo>\r\n * <img src=\"logo.svg\" alt=\"Company Logo\">\r\n * </div>\r\n * </fui-toolbar>\r\n * ```\r\n *\r\n * ### With Custom Logo\r\n * ```html\r\n * <fui-toolbar [menuItems]=\"menuItems\" [userProfile]=\"userProfile\">\r\n * <div logo class=\"custom-logo\">\r\n * <h1>Holiday ERP</h1>\r\n * </div>\r\n * </fui-toolbar>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiToolbarComponent, FuiToolbarMenuItem, FuiToolbarUserProfile } from '@raintonic/formaui/components/toolbar';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiToolbarComponent],\r\n * template: `\r\n * <fui-toolbar\r\n * [menuItems]=\"menuItems\"\r\n * [userProfile]=\"userProfile\"\r\n * (menuItemClick)=\"onMenuItemClick($event)\"\r\n * (userProfileClick)=\"onUserProfileClick()\">\r\n * <div logo>\r\n * <img src=\"assets/logo.svg\" alt=\"Holiday ERP\">\r\n * </div>\r\n * </fui-toolbar>\r\n * `\r\n * })\r\n * export class AppLayoutComponent {\r\n * menuItems: FuiToolbarMenuItem[] = [\r\n * { id: 'dashboard', icon: 'house', label: 'Dashboard' },\r\n * { id: 'orders', icon: 'shopping-cart', label: 'Orders' },\r\n * { id: 'products', icon: 'package', label: 'Products' },\r\n * { id: 'customers', icon: 'users', label: 'Customers' },\r\n * ];\r\n *\r\n * userProfile: FuiToolbarUserProfile = {\r\n * name: 'John Doe',\r\n * email: 'john.doe@company.com',\r\n * initials: 'JD'\r\n * };\r\n *\r\n * onMenuItemClick(itemId: string | number): void {\r\n * console.log('Menu item clicked:', itemId);\r\n * }\r\n *\r\n * onUserProfileClick(): void {\r\n * console.log('User profile clicked');\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-toolbar',\r\n standalone: true,\r\n imports: [RouterModule, FuiIconComponent, FuiAvatarComponent],\r\n templateUrl: './toolbar.component.html',\r\n styleUrls: ['./toolbar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-toolbar',\r\n role: 'banner',\r\n '[class.fui-toolbar--fixed]': 'fixed()',\r\n },\r\n})\r\nexport class FuiToolbarComponent {\r\n readonly intl = inject(FuiToolbarIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n /** @internal — bumped when Intl mutates so computeds that read plain intl fields reinvoke. */\r\n private readonly _intlTick = signal(0);\r\n\r\n constructor() {\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this._intlTick.update((v) => v + 1);\r\n this._cdr.markForCheck();\r\n });\r\n }\r\n\r\n // Inputs using signal-based API\r\n readonly menuItems: InputSignal<FuiToolbarMenuItem[]> = input<FuiToolbarMenuItem[]>([]);\r\n readonly userProfile: InputSignal<FuiToolbarUserProfile | null> = input<FuiToolbarUserProfile | null>(null);\r\n readonly fixed: InputSignal<boolean> = input(true);\r\n readonly activeMenuItemId: InputSignal<string | number> = input<string | number>('');\r\n readonly ariaLabel = input<string | undefined>(undefined);\r\n readonly userAriaLabel = input<string | undefined>(undefined);\r\n // New: show a dedicated sidebar toggle button\r\n readonly showSidebarToggle: InputSignal<boolean> = input(false);\r\n\r\n /** Resolved navigation aria-label: input override → intl default. */\r\n readonly resolvedNavAriaLabel = computed(() => {\r\n this._intlTick();\r\n return this.ariaLabel() ?? this.intl.navAriaLabel;\r\n });\r\n\r\n /** Resolved user-menu aria-label prefix: input override → intl default. */\r\n readonly resolvedUserAriaLabelPrefix = computed(() => {\r\n this._intlTick();\r\n return this.userAriaLabel() ?? this.intl.userAriaLabelPrefix;\r\n });\r\n\r\n // Outputs using signal-based API\r\n readonly menuItemClick: OutputEmitterRef<string | number> = output<string | number>();\r\n readonly userProfileClick: OutputEmitterRef<void> = output();\r\n // New: emits when sidebar toggle button is clicked\r\n readonly sidebarToggle: OutputEmitterRef<void> = output();\r\n\r\n // Derived user name parts for avatar\r\n readonly firstName: Signal<string> = computed(() => this.userProfile()?.name?.trim().split(/\\s+/)[0] ?? '');\r\n readonly lastName: Signal<string> = computed(() => {\r\n const parts = this.userProfile()?.name?.trim().split(/\\s+/) ?? [];\r\n return parts.length > 1 ? parts[parts.length - 1] : '';\r\n });\r\n\r\n onMenuItemClick(item: FuiToolbarMenuItem): void {\r\n if (!item.disabled) {\r\n this.menuItemClick.emit(item.id);\r\n }\r\n }\r\n\r\n onUserProfileClick(): void {\r\n if (this.userProfile()) {\r\n this.userProfileClick.emit();\r\n }\r\n }\r\n\r\n onSidebarToggleClick(): void {\r\n this.sidebarToggle.emit();\r\n }\r\n}\r\n","<!-- Sidebar Toggle Button (optional) -->\r\n@if (showSidebarToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button --sidebar-toggle\"\r\n [attr.aria-label]=\"intl.toggleSidebarAriaLabel\"\r\n title=\"Toggle sidebar\"\r\n (click)=\"onSidebarToggleClick()\"\r\n >\r\n <fui-icon name=\"sidebar\" size=\"md\"></fui-icon>\r\n </button>\r\n}\r\n<!-- Logo Section -->\r\n<div class=\"fui-toolbar__logo\">\r\n <ng-content select=\"[logo]\"></ng-content>\r\n</div>\r\n\r\n<!-- Navigation Menu -->\r\n<nav class=\"fui-toolbar__nav\" role=\"navigation\" [attr.aria-label]=\"resolvedNavAriaLabel()\">\r\n <ul class=\"fui-toolbar__menu\">\r\n @for (item of menuItems(); track item.id) {\r\n <li class=\"fui-toolbar__menu-item\">\r\n @if (item.routerLink) {\r\n <a\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [routerLink]=\"item.routerLink\"\r\n [queryParams]=\"item.queryParams\"\r\n [fragment]=\"item.fragment\"\r\n [attr.aria-current]=\"item.id === activeMenuItemId() ? 'page' : null\"\r\n [attr.aria-label]=\"item.label\"\r\n [title]=\"item.label\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-label]=\"item.label\"\r\n [attr.aria-pressed]=\"item.id === activeMenuItemId() ? 'true' : null\"\r\n [title]=\"item.label\"\r\n (click)=\"onMenuItemClick(item)\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</nav>\r\n<div class=\"fui-toolbar__spacer\"></div>\r\n<div class=\"fui-toolbar__more-buttons\">\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n</div>\r\n<!-- User Profile Section -->\r\n@if (userProfile(); as profile) {\r\n <div class=\"fui-toolbar__user\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__user-button\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-label]=\"resolvedUserAriaLabelPrefix() + profile.name\"\r\n [title]=\"profile.name + ' - ' + profile.email\"\r\n (click)=\"onUserProfileClick()\"\r\n >\r\n <fui-avatar [size]=\"32\" fullName=\"None\"> </fui-avatar>\r\n\r\n <div class=\"fui-toolbar__user-info\">\r\n <span class=\"fui-toolbar__user-name\">{{ profile.name }}</span>\r\n <span class=\"fui-toolbar__user-email\">{{ profile.email }}</span>\r\n </div>\r\n\r\n <fui-icon name=\"caret-down\" size=\"sm\" class=\"fui-toolbar__user-caret\"></fui-icon>\r\n </button>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raintonic-formaui-components-toolbar.mjs","sources":["../../../lib/components/toolbar/toolbar.intl.ts","../../../lib/components/toolbar/toolbar.component.ts","../../../lib/components/toolbar/toolbar.component.html","../../../lib/components/toolbar/raintonic-formaui-components-toolbar.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiToolbarIntl extends FuiIntlBase {\r\n navAriaLabel = 'Main navigation';\r\n userAriaLabelPrefix = 'User menu for ';\r\n toggleSidebarAriaLabel = 'Toggle sidebar';\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n InputSignal,\r\n OutputEmitterRef,\r\n Signal,\r\n ViewEncapsulation,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { RouterModule } from '@angular/router';\r\nimport { FuiAvatarComponent } from '@raintonic/formaui/components/avatar';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiToolbarIntl } from './toolbar.intl';\r\n\r\n/**\r\n * Toolbar menu item interface\r\n */\r\nexport interface FuiToolbarMenuItem {\r\n id: string | number;\r\n icon: string;\r\n label: string;\r\n showLabel?: boolean;\r\n disabled?: boolean;\r\n routerLink?: string | string[];\r\n queryParams?: Record<string, string>;\r\n fragment?: string;\r\n}\r\n\r\n/**\r\n * User profile data interface\r\n */\r\nexport interface FuiToolbarUserProfile {\r\n name: string;\r\n email: string;\r\n avatar?: string;\r\n initials?: string;\r\n}\r\n\r\n/**\r\n * # FuiToolbar Component\r\n *\r\n * A top navigation toolbar following Carbon Design System principles.\r\n * Provides space for logo, navigation menu items, and user profile area.\r\n *\r\n * ## Features\r\n * - Logo area with customizable content\r\n * - Icon-based navigation menu\r\n * - User profile area with avatar/initials\r\n * - Responsive design\r\n * - Theme integration\r\n * - Accessibility support\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Toolbar\r\n * ```html\r\n * <fui-toolbar\r\n * [menuItems]=\"menuItems\"\r\n * [userProfile]=\"userProfile\"\r\n * (menuItemClick)=\"onMenuItemClick($event)\"\r\n * (userProfileClick)=\"onUserProfileClick()\">\r\n * <div logo>\r\n * <img src=\"logo.svg\" alt=\"Company Logo\">\r\n * </div>\r\n * </fui-toolbar>\r\n * ```\r\n *\r\n * ### With Custom Logo\r\n * ```html\r\n * <fui-toolbar [menuItems]=\"menuItems\" [userProfile]=\"userProfile\">\r\n * <div logo class=\"custom-logo\">\r\n * <h1>Holiday ERP</h1>\r\n * </div>\r\n * </fui-toolbar>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiToolbarComponent, FuiToolbarMenuItem, FuiToolbarUserProfile } from '@raintonic/formaui/components/toolbar';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiToolbarComponent],\r\n * template: `\r\n * <fui-toolbar\r\n * [menuItems]=\"menuItems\"\r\n * [userProfile]=\"userProfile\"\r\n * (menuItemClick)=\"onMenuItemClick($event)\"\r\n * (userProfileClick)=\"onUserProfileClick()\">\r\n * <div logo>\r\n * <img src=\"assets/logo.svg\" alt=\"Holiday ERP\">\r\n * </div>\r\n * </fui-toolbar>\r\n * `\r\n * })\r\n * export class AppLayoutComponent {\r\n * menuItems: FuiToolbarMenuItem[] = [\r\n * { id: 'dashboard', icon: 'house', label: 'Dashboard' },\r\n * { id: 'orders', icon: 'shopping-cart', label: 'Orders' },\r\n * { id: 'products', icon: 'package', label: 'Products' },\r\n * { id: 'customers', icon: 'users', label: 'Customers' },\r\n * ];\r\n *\r\n * userProfile: FuiToolbarUserProfile = {\r\n * name: 'John Doe',\r\n * email: 'john.doe@company.com',\r\n * initials: 'JD'\r\n * };\r\n *\r\n * onMenuItemClick(itemId: string | number): void {\r\n * console.log('Menu item clicked:', itemId);\r\n * }\r\n *\r\n * onUserProfileClick(): void {\r\n * console.log('User profile clicked');\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-toolbar',\r\n standalone: true,\r\n imports: [RouterModule, FuiIconComponent, FuiAvatarComponent],\r\n templateUrl: './toolbar.component.html',\r\n styleUrls: ['./toolbar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-toolbar',\r\n role: 'banner',\r\n '[class.fui-toolbar--fixed]': 'fixed()',\r\n },\r\n})\r\nexport class FuiToolbarComponent {\r\n readonly intl = inject(FuiToolbarIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n /** @internal — bumped when Intl mutates so computeds that read plain intl fields reinvoke. */\r\n private readonly _intlTick = signal(0);\r\n\r\n constructor() {\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this._intlTick.update((v) => v + 1);\r\n this._cdr.markForCheck();\r\n });\r\n }\r\n\r\n // Inputs using signal-based API\r\n readonly menuItems: InputSignal<FuiToolbarMenuItem[]> = input<FuiToolbarMenuItem[]>([]);\r\n readonly userProfile: InputSignal<FuiToolbarUserProfile | null> = input<FuiToolbarUserProfile | null>(null);\r\n readonly fixed: InputSignal<boolean> = input(true);\r\n readonly activeMenuItemId: InputSignal<string | number> = input<string | number>('');\r\n readonly ariaLabel = input<string | undefined>(undefined);\r\n readonly userAriaLabel = input<string | undefined>(undefined);\r\n // New: show a dedicated sidebar toggle button\r\n readonly showSidebarToggle: InputSignal<boolean> = input(false);\r\n // New: show text labels next to icons for all menu buttons (per-item `showLabel` overrides).\r\n readonly showMenuLabels: InputSignal<boolean> = input(false);\r\n\r\n /** Resolve whether a menu item shows its label: per-item override → toolbar default. */\r\n showItemLabel(item: FuiToolbarMenuItem): boolean {\r\n return item.showLabel ?? this.showMenuLabels();\r\n }\r\n\r\n /** Resolved navigation aria-label: input override → intl default. */\r\n readonly resolvedNavAriaLabel = computed(() => {\r\n this._intlTick();\r\n return this.ariaLabel() ?? this.intl.navAriaLabel;\r\n });\r\n\r\n /** Resolved user-menu aria-label prefix: input override → intl default. */\r\n readonly resolvedUserAriaLabelPrefix = computed(() => {\r\n this._intlTick();\r\n return this.userAriaLabel() ?? this.intl.userAriaLabelPrefix;\r\n });\r\n\r\n // Outputs using signal-based API\r\n readonly menuItemClick: OutputEmitterRef<string | number> = output<string | number>();\r\n readonly userProfileClick: OutputEmitterRef<void> = output();\r\n // New: emits when sidebar toggle button is clicked\r\n readonly sidebarToggle: OutputEmitterRef<void> = output();\r\n\r\n // Derived user name parts for avatar\r\n readonly firstName: Signal<string> = computed(() => this.userProfile()?.name?.trim().split(/\\s+/)[0] ?? '');\r\n readonly lastName: Signal<string> = computed(() => {\r\n const parts = this.userProfile()?.name?.trim().split(/\\s+/) ?? [];\r\n return parts.length > 1 ? parts[parts.length - 1] : '';\r\n });\r\n\r\n onMenuItemClick(item: FuiToolbarMenuItem): void {\r\n if (!item.disabled) {\r\n this.menuItemClick.emit(item.id);\r\n }\r\n }\r\n\r\n onUserProfileClick(): void {\r\n if (this.userProfile()) {\r\n this.userProfileClick.emit();\r\n }\r\n }\r\n\r\n onSidebarToggleClick(): void {\r\n this.sidebarToggle.emit();\r\n }\r\n}\r\n","<!-- Sidebar Toggle Button (optional) -->\r\n@if (showSidebarToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button --sidebar-toggle\"\r\n [attr.aria-label]=\"intl.toggleSidebarAriaLabel\"\r\n title=\"Toggle sidebar\"\r\n (click)=\"onSidebarToggleClick()\"\r\n >\r\n <fui-icon name=\"sidebar\" size=\"md\"></fui-icon>\r\n </button>\r\n}\r\n<!-- Logo Section -->\r\n<div class=\"fui-toolbar__logo\">\r\n <ng-content select=\"[logo]\"></ng-content>\r\n</div>\r\n\r\n<!-- Navigation Menu -->\r\n<nav class=\"fui-toolbar__nav\" role=\"navigation\" [attr.aria-label]=\"resolvedNavAriaLabel()\">\r\n <ul class=\"fui-toolbar__menu\">\r\n @for (item of menuItems(); track item.id) {\r\n <li class=\"fui-toolbar__menu-item\">\r\n @if (item.routerLink) {\r\n <a\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--with-label]=\"showItemLabel(item)\"\r\n [routerLink]=\"item.routerLink\"\r\n [queryParams]=\"item.queryParams\"\r\n [fragment]=\"item.fragment\"\r\n [attr.aria-current]=\"item.id === activeMenuItemId() ? 'page' : null\"\r\n [attr.aria-label]=\"item.label\"\r\n [title]=\"item.label\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n @if (showItemLabel(item)) {\r\n <span class=\"fui-toolbar__menu-label\">{{ item.label }}</span>\r\n }\r\n </a>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__menu-button\"\r\n [class.active]=\"item.id === activeMenuItemId()\"\r\n [class.fui-toolbar__menu-button--with-label]=\"showItemLabel(item)\"\r\n [class.fui-toolbar__menu-button--disabled]=\"item.disabled\"\r\n [disabled]=\"item.disabled\"\r\n [attr.aria-label]=\"item.label\"\r\n [attr.aria-pressed]=\"item.id === activeMenuItemId() ? 'true' : null\"\r\n [title]=\"item.label\"\r\n (click)=\"onMenuItemClick(item)\"\r\n >\r\n <fui-icon [name]=\"item.icon\" size=\"md\"></fui-icon>\r\n @if (showItemLabel(item)) {\r\n <span class=\"fui-toolbar__menu-label\">{{ item.label }}</span>\r\n }\r\n </button>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</nav>\r\n<div class=\"fui-toolbar__spacer\"></div>\r\n<div class=\"fui-toolbar__more-buttons\">\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n</div>\r\n<!-- User Profile Section -->\r\n@if (userProfile(); as profile) {\r\n <div class=\"fui-toolbar__user\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-toolbar__user-button\"\r\n aria-haspopup=\"menu\"\r\n [attr.aria-label]=\"resolvedUserAriaLabelPrefix() + profile.name\"\r\n [title]=\"profile.name + ' - ' + profile.email\"\r\n (click)=\"onUserProfileClick()\"\r\n >\r\n <fui-avatar size=\"sm\" [fullName]=\"profile.name\" [initials]=\"profile.initials\"></fui-avatar>\r\n\r\n <div class=\"fui-toolbar__user-info\">\r\n <span class=\"fui-toolbar__user-name\">{{ profile.name }}</span>\r\n <span class=\"fui-toolbar__user-email\">{{ profile.email }}</span>\r\n </div>\r\n\r\n <fui-icon name=\"caret-down\" size=\"sm\" class=\"fui-toolbar__user-caret\"></fui-icon>\r\n </button>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}