@raintonic/formaui 0.9.2 → 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 (59) hide show
  1. package/fesm2022/raintonic-formaui-components-alert.mjs +2 -2
  2. package/fesm2022/raintonic-formaui-components-avatar.mjs +2 -2
  3. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  4. package/fesm2022/raintonic-formaui-components-card.mjs +78 -8
  5. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  6. package/fesm2022/raintonic-formaui-components-chip.mjs +2 -2
  7. package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -1
  8. package/fesm2022/raintonic-formaui-components-data-table.mjs +80 -11
  9. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  10. package/fesm2022/raintonic-formaui-components-drawer.mjs +37 -6
  11. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  12. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +1 -1
  13. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -1
  14. package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -2
  15. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  16. package/fesm2022/raintonic-formaui-components-input.mjs +14 -0
  17. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  18. package/fesm2022/raintonic-formaui-components-select.mjs +13 -5
  19. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  20. package/fesm2022/raintonic-formaui-components-side-panel.mjs +40 -6
  21. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  22. package/fesm2022/raintonic-formaui-components-toggle-group.mjs +16 -5
  23. package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -1
  24. package/fesm2022/raintonic-formaui-components-toolbar.mjs +10 -4
  25. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  26. package/fesm2022/raintonic-formaui-components-tooltip.mjs +102 -8
  27. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  28. package/fesm2022/raintonic-formaui-services-dialog.mjs +8 -4
  29. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  30. package/fesm2022/raintonic-formaui.mjs +1 -1
  31. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  32. package/llms-full.txt +64 -19
  33. package/package.json +1 -1
  34. package/styles/generated/_tokens.scss +1 -1
  35. package/styles/partials/components/_dialog.scss +24 -0
  36. package/styles/styles.css +16 -1
  37. package/types/raintonic-formaui-components-card.d.ts +46 -2
  38. package/types/raintonic-formaui-components-card.d.ts.map +1 -1
  39. package/types/raintonic-formaui-components-data-table.d.ts +50 -3
  40. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
  41. package/types/raintonic-formaui-components-drawer.d.ts +20 -2
  42. package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
  43. package/types/raintonic-formaui-components-form-field.d.ts +10 -0
  44. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
  45. package/types/raintonic-formaui-components-input.d.ts +9 -0
  46. package/types/raintonic-formaui-components-input.d.ts.map +1 -1
  47. package/types/raintonic-formaui-components-select.d.ts +8 -1
  48. package/types/raintonic-formaui-components-select.d.ts.map +1 -1
  49. package/types/raintonic-formaui-components-side-panel.d.ts +24 -2
  50. package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
  51. package/types/raintonic-formaui-components-toggle-group.d.ts +1 -1
  52. package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -1
  53. package/types/raintonic-formaui-components-toolbar.d.ts +5 -1
  54. package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
  55. package/types/raintonic-formaui-components-tooltip.d.ts +55 -4
  56. package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
  57. package/types/raintonic-formaui-services-dialog.d.ts +12 -1
  58. package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
  59. package/types/raintonic-formaui.d.ts +1 -1
@@ -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-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:var(--fui-toolbar-height);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: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__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)}}@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-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:var(--fui-toolbar-height);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: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__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)}}@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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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, numberAttribute, booleanAttribute, signal, inject, ElementRef, EnvironmentInjector, effect, createComponent, HostListener, Directive } from '@angular/core';
2
+ import { input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, numberAttribute, booleanAttribute, signal, inject, ElementRef, EnvironmentInjector, Renderer2, effect, createComponent, HostListener, Directive } from '@angular/core';
3
3
  import { FuiOverlayService } from '@raintonic/formaui/cdk/overlay';
4
4
 
5
5
  /**
@@ -21,6 +21,7 @@ const TOOLTIP_POSITIONS = [
21
21
  ];
22
22
  const TOOLTIP_SIZES = ['sm', 'md', 'lg'];
23
23
  const TOOLTIP_TRIGGERS = ['hover', 'focus', 'click', 'manual'];
24
+ const TOOLTIP_TEXT_ALIGNS = ['left', 'center', 'right'];
24
25
 
25
26
  /**
26
27
  * @component FuiTooltipComponent
@@ -54,6 +55,10 @@ class FuiTooltipComponent {
54
55
  * Tooltip size
55
56
  */
56
57
  size = input.required(...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
58
+ /**
59
+ * Tooltip text alignment
60
+ */
61
+ textAlign = input.required(...(ngDevMode ? [{ debugName: "textAlign" }] : /* istanbul ignore next */ []));
57
62
  /**
58
63
  * Maximum width of the tooltip
59
64
  */
@@ -70,7 +75,12 @@ class FuiTooltipComponent {
70
75
  * Computed CSS classes for the tooltip
71
76
  */
72
77
  computedClasses = computed(() => {
73
- const classes = ['fui-tooltip', `fui-tooltip--${this.size()}`, `fui-tooltip--${this.position()}`];
78
+ const classes = [
79
+ 'fui-tooltip',
80
+ `fui-tooltip--${this.size()}`,
81
+ `fui-tooltip--${this.position()}`,
82
+ `fui-tooltip--align-${this.textAlign()}`,
83
+ ];
74
84
  if (this.arrow()) {
75
85
  classes.push('fui-tooltip--with-arrow');
76
86
  }
@@ -97,7 +107,7 @@ class FuiTooltipComponent {
97
107
  return baseClass;
98
108
  }, ...(ngDevMode ? [{ debugName: "arrowClasses" }] : /* istanbul ignore next */ []));
99
109
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
100
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiTooltipComponent, isStandalone: true, selector: "fui-tooltip", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: true, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: true, transformFunction: null }, arrow: { classPropertyName: "arrow", publicName: "arrow", isSignal: true, isRequired: true, transformFunction: null }, tooltipId: { classPropertyName: "tooltipId", publicName: "tooltipId", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class": "computedClasses()", "id": "tooltipId()", "attr.role": "\"tooltip\"", "style.max-width": "maxWidth()" }, classAttribute: "fui-tooltip" }, ngImport: i0, template: "<div class=\"fui-tooltip__content\">\r\n {{ content() }}\r\n</div>\r\n@if (arrow()) {\r\n <div [class]=\"arrowClasses()\"></div>\r\n}\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-tooltip{--fui-tooltip-border-radius: var(--fui-radius-sm);--fui-tooltip-shadow: var(--fui-shadow-md);--fui-tooltip-font-size: var(--fui-text-base);--fui-tooltip-padding-x: var(--fui-spacing-6);--fui-tooltip-padding-y: var(--fui-spacing-4);z-index:var(--fui-z-tooltip, 1000);display:block;font-family:var(--fui-font-sans);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);border-radius:var(--fui-tooltip-border-radius);background-color:var(--fui-tooltip-background);color:var(--fui-tooltip-text);box-shadow:var(--fui-tooltip-shadow);transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;opacity:0;animation:fui-tooltip-fade-in var(--fui-duration-fast) ease-out forwards}.fui-tooltip__content{padding:var(--fui-tooltip-padding-y) var(--fui-tooltip-padding-x);word-wrap:break-word;hyphens:auto;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal)}.fui-tooltip__arrow{position:absolute;width:0;height:0;border-style:solid;border-color:transparent;--arrow-size: 6px}.fui-tooltip__arrow--top{bottom:100%;left:50%;transform:translate(-50%);border-width:0 var(--arrow-size) var(--arrow-size) var(--arrow-size);border-bottom-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--bottom{top:100%;left:50%;transform:translate(-50%);border-width:var(--arrow-size) var(--arrow-size) 0 var(--arrow-size);border-top-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--left{right:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) var(--arrow-size) var(--arrow-size) 0;border-right-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--right{left:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) 0 var(--arrow-size) var(--arrow-size);border-left-color:var(--fui-tooltip-background)}.fui-tooltip--right{transform:translate(-50%)}.fui-tooltip--top-start .fui-tooltip__arrow,.fui-tooltip--bottom-start .fui-tooltip__arrow{left:var(--fui-spacing-6);transform:none}.fui-tooltip--top-end .fui-tooltip__arrow,.fui-tooltip--bottom-end .fui-tooltip__arrow{right:var(--fui-spacing-6);left:auto;transform:none}.fui-tooltip--left-start .fui-tooltip__arrow,.fui-tooltip--right-start .fui-tooltip__arrow{top:var(--fui-spacing-6);transform:none}.fui-tooltip--left-end .fui-tooltip__arrow,.fui-tooltip--right-end .fui-tooltip__arrow{bottom:var(--fui-spacing-6);top:auto;transform:none}.fui-tooltip--sm{font-size:var(--fui-text-sm)}.fui-tooltip--sm .fui-tooltip__content{padding:var(--fui-spacing-2) var(--fui-spacing-4)}.fui-tooltip--sm .fui-tooltip__arrow{--arrow-size: 4px}.fui-tooltip--md{font-size:var(--fui-text-base)}.fui-tooltip--md .fui-tooltip__content{padding:var(--fui-spacing-4) var(--fui-spacing-6)}.fui-tooltip--md .fui-tooltip__arrow{--arrow-size: 6px}.fui-tooltip--lg{font-size:var(--fui-text-md)}.fui-tooltip--lg .fui-tooltip__content{padding:var(--fui-spacing-6) var(--fui-spacing-7)}.fui-tooltip--lg .fui-tooltip__arrow{--arrow-size: 8px}@media(prefers-contrast:more){.fui-tooltip{border:2px solid var(--fui-text-primary);box-shadow:var(--fui-shadow-lg)}}@media(prefers-reduced-motion:reduce){.fui-tooltip{animation:none;opacity:1}}@media print{.fui-tooltip{display:none!important}}@keyframes fui-tooltip-fade-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
110
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiTooltipComponent, isStandalone: true, selector: "fui-tooltip", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: true, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: true, transformFunction: null }, textAlign: { classPropertyName: "textAlign", publicName: "textAlign", isSignal: true, isRequired: true, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: true, transformFunction: null }, arrow: { classPropertyName: "arrow", publicName: "arrow", isSignal: true, isRequired: true, transformFunction: null }, tooltipId: { classPropertyName: "tooltipId", publicName: "tooltipId", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class": "computedClasses()", "id": "tooltipId()", "attr.role": "\"tooltip\"", "style.max-width": "maxWidth()" }, classAttribute: "fui-tooltip" }, ngImport: i0, template: "<div class=\"fui-tooltip__content\">\r\n {{ content() }}\r\n</div>\r\n@if (arrow()) {\r\n <div [class]=\"arrowClasses()\"></div>\r\n}\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-tooltip{--fui-tooltip-border-radius: var(--fui-radius-sm);--fui-tooltip-shadow: var(--fui-shadow-md);--fui-tooltip-font-size: var(--fui-text-base);--fui-tooltip-padding-x: var(--fui-spacing-6);--fui-tooltip-padding-y: var(--fui-spacing-4);z-index:var(--fui-z-tooltip, 1000);display:block;font-family:var(--fui-font-sans);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);border-radius:var(--fui-tooltip-border-radius);background-color:var(--fui-tooltip-background);color:var(--fui-tooltip-text);box-shadow:var(--fui-tooltip-shadow);transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;opacity:0;animation:fui-tooltip-fade-in var(--fui-duration-fast) ease-out forwards}.fui-tooltip__content{padding:var(--fui-tooltip-padding-y) var(--fui-tooltip-padding-x);word-wrap:break-word;hyphens:auto;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal)}.fui-tooltip--align-left .fui-tooltip__content{text-align:left}.fui-tooltip--align-center .fui-tooltip__content{text-align:center}.fui-tooltip--align-right .fui-tooltip__content{text-align:right}.fui-tooltip__arrow{position:absolute;width:0;height:0;border-style:solid;border-color:transparent;--arrow-size: 6px}.fui-tooltip__arrow--top{bottom:100%;left:50%;transform:translate(-50%);border-width:0 var(--arrow-size) var(--arrow-size) var(--arrow-size);border-bottom-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--bottom{top:100%;left:50%;transform:translate(-50%);border-width:var(--arrow-size) var(--arrow-size) 0 var(--arrow-size);border-top-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--left{right:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) var(--arrow-size) var(--arrow-size) 0;border-right-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--right{left:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) 0 var(--arrow-size) var(--arrow-size);border-left-color:var(--fui-tooltip-background)}.fui-tooltip--right{transform:translate(-50%)}.fui-tooltip--top-start .fui-tooltip__arrow,.fui-tooltip--bottom-start .fui-tooltip__arrow{left:var(--fui-spacing-6);transform:none}.fui-tooltip--top-end .fui-tooltip__arrow,.fui-tooltip--bottom-end .fui-tooltip__arrow{right:var(--fui-spacing-6);left:auto;transform:none}.fui-tooltip--left-start .fui-tooltip__arrow,.fui-tooltip--right-start .fui-tooltip__arrow{top:var(--fui-spacing-6);transform:none}.fui-tooltip--left-end .fui-tooltip__arrow,.fui-tooltip--right-end .fui-tooltip__arrow{bottom:var(--fui-spacing-6);top:auto;transform:none}.fui-tooltip--sm{font-size:var(--fui-text-sm)}.fui-tooltip--sm .fui-tooltip__content{padding:var(--fui-spacing-2) var(--fui-spacing-4)}.fui-tooltip--sm .fui-tooltip__arrow{--arrow-size: 4px}.fui-tooltip--md{font-size:var(--fui-text-base)}.fui-tooltip--md .fui-tooltip__content{padding:var(--fui-spacing-4) var(--fui-spacing-6)}.fui-tooltip--md .fui-tooltip__arrow{--arrow-size: 6px}.fui-tooltip--lg{font-size:var(--fui-text-md)}.fui-tooltip--lg .fui-tooltip__content{padding:var(--fui-spacing-6) var(--fui-spacing-7)}.fui-tooltip--lg .fui-tooltip__arrow{--arrow-size: 8px}@media(prefers-contrast:more){.fui-tooltip{border:2px solid var(--fui-text-primary);box-shadow:var(--fui-shadow-lg)}}@media(prefers-reduced-motion:reduce){.fui-tooltip{animation:none;opacity:1}}@media print{.fui-tooltip{display:none!important}}@keyframes fui-tooltip-fade-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
101
111
  }
102
112
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTooltipComponent, decorators: [{
103
113
  type: Component,
@@ -107,8 +117,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
107
117
  '[id]': 'tooltipId()',
108
118
  '[attr.role]': '"tooltip"',
109
119
  '[style.max-width]': 'maxWidth()',
110
- }, template: "<div class=\"fui-tooltip__content\">\r\n {{ content() }}\r\n</div>\r\n@if (arrow()) {\r\n <div [class]=\"arrowClasses()\"></div>\r\n}\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-tooltip{--fui-tooltip-border-radius: var(--fui-radius-sm);--fui-tooltip-shadow: var(--fui-shadow-md);--fui-tooltip-font-size: var(--fui-text-base);--fui-tooltip-padding-x: var(--fui-spacing-6);--fui-tooltip-padding-y: var(--fui-spacing-4);z-index:var(--fui-z-tooltip, 1000);display:block;font-family:var(--fui-font-sans);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);border-radius:var(--fui-tooltip-border-radius);background-color:var(--fui-tooltip-background);color:var(--fui-tooltip-text);box-shadow:var(--fui-tooltip-shadow);transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;opacity:0;animation:fui-tooltip-fade-in var(--fui-duration-fast) ease-out forwards}.fui-tooltip__content{padding:var(--fui-tooltip-padding-y) var(--fui-tooltip-padding-x);word-wrap:break-word;hyphens:auto;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal)}.fui-tooltip__arrow{position:absolute;width:0;height:0;border-style:solid;border-color:transparent;--arrow-size: 6px}.fui-tooltip__arrow--top{bottom:100%;left:50%;transform:translate(-50%);border-width:0 var(--arrow-size) var(--arrow-size) var(--arrow-size);border-bottom-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--bottom{top:100%;left:50%;transform:translate(-50%);border-width:var(--arrow-size) var(--arrow-size) 0 var(--arrow-size);border-top-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--left{right:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) var(--arrow-size) var(--arrow-size) 0;border-right-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--right{left:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) 0 var(--arrow-size) var(--arrow-size);border-left-color:var(--fui-tooltip-background)}.fui-tooltip--right{transform:translate(-50%)}.fui-tooltip--top-start .fui-tooltip__arrow,.fui-tooltip--bottom-start .fui-tooltip__arrow{left:var(--fui-spacing-6);transform:none}.fui-tooltip--top-end .fui-tooltip__arrow,.fui-tooltip--bottom-end .fui-tooltip__arrow{right:var(--fui-spacing-6);left:auto;transform:none}.fui-tooltip--left-start .fui-tooltip__arrow,.fui-tooltip--right-start .fui-tooltip__arrow{top:var(--fui-spacing-6);transform:none}.fui-tooltip--left-end .fui-tooltip__arrow,.fui-tooltip--right-end .fui-tooltip__arrow{bottom:var(--fui-spacing-6);top:auto;transform:none}.fui-tooltip--sm{font-size:var(--fui-text-sm)}.fui-tooltip--sm .fui-tooltip__content{padding:var(--fui-spacing-2) var(--fui-spacing-4)}.fui-tooltip--sm .fui-tooltip__arrow{--arrow-size: 4px}.fui-tooltip--md{font-size:var(--fui-text-base)}.fui-tooltip--md .fui-tooltip__content{padding:var(--fui-spacing-4) var(--fui-spacing-6)}.fui-tooltip--md .fui-tooltip__arrow{--arrow-size: 6px}.fui-tooltip--lg{font-size:var(--fui-text-md)}.fui-tooltip--lg .fui-tooltip__content{padding:var(--fui-spacing-6) var(--fui-spacing-7)}.fui-tooltip--lg .fui-tooltip__arrow{--arrow-size: 8px}@media(prefers-contrast:more){.fui-tooltip{border:2px solid var(--fui-text-primary);box-shadow:var(--fui-shadow-lg)}}@media(prefers-reduced-motion:reduce){.fui-tooltip{animation:none;opacity:1}}@media print{.fui-tooltip{display:none!important}}@keyframes fui-tooltip-fade-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"] }]
111
- }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: true }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: true }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: true }] }], arrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrow", required: true }] }], tooltipId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipId", required: true }] }] } });
120
+ }, template: "<div class=\"fui-tooltip__content\">\r\n {{ content() }}\r\n</div>\r\n@if (arrow()) {\r\n <div [class]=\"arrowClasses()\"></div>\r\n}\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-tooltip{--fui-tooltip-border-radius: var(--fui-radius-sm);--fui-tooltip-shadow: var(--fui-shadow-md);--fui-tooltip-font-size: var(--fui-text-base);--fui-tooltip-padding-x: var(--fui-spacing-6);--fui-tooltip-padding-y: var(--fui-spacing-4);z-index:var(--fui-z-tooltip, 1000);display:block;font-family:var(--fui-font-sans);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);border-radius:var(--fui-tooltip-border-radius);background-color:var(--fui-tooltip-background);color:var(--fui-tooltip-text);box-shadow:var(--fui-tooltip-shadow);transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms;opacity:0;animation:fui-tooltip-fade-in var(--fui-duration-fast) ease-out forwards}.fui-tooltip__content{padding:var(--fui-tooltip-padding-y) var(--fui-tooltip-padding-x);word-wrap:break-word;hyphens:auto;font-size:var(--fui-text-sm);line-height:var(--fui-leading-normal)}.fui-tooltip--align-left .fui-tooltip__content{text-align:left}.fui-tooltip--align-center .fui-tooltip__content{text-align:center}.fui-tooltip--align-right .fui-tooltip__content{text-align:right}.fui-tooltip__arrow{position:absolute;width:0;height:0;border-style:solid;border-color:transparent;--arrow-size: 6px}.fui-tooltip__arrow--top{bottom:100%;left:50%;transform:translate(-50%);border-width:0 var(--arrow-size) var(--arrow-size) var(--arrow-size);border-bottom-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--bottom{top:100%;left:50%;transform:translate(-50%);border-width:var(--arrow-size) var(--arrow-size) 0 var(--arrow-size);border-top-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--left{right:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) var(--arrow-size) var(--arrow-size) 0;border-right-color:var(--fui-tooltip-background)}.fui-tooltip__arrow--right{left:100%;top:50%;transform:translateY(-50%);border-width:var(--arrow-size) 0 var(--arrow-size) var(--arrow-size);border-left-color:var(--fui-tooltip-background)}.fui-tooltip--right{transform:translate(-50%)}.fui-tooltip--top-start .fui-tooltip__arrow,.fui-tooltip--bottom-start .fui-tooltip__arrow{left:var(--fui-spacing-6);transform:none}.fui-tooltip--top-end .fui-tooltip__arrow,.fui-tooltip--bottom-end .fui-tooltip__arrow{right:var(--fui-spacing-6);left:auto;transform:none}.fui-tooltip--left-start .fui-tooltip__arrow,.fui-tooltip--right-start .fui-tooltip__arrow{top:var(--fui-spacing-6);transform:none}.fui-tooltip--left-end .fui-tooltip__arrow,.fui-tooltip--right-end .fui-tooltip__arrow{bottom:var(--fui-spacing-6);top:auto;transform:none}.fui-tooltip--sm{font-size:var(--fui-text-sm)}.fui-tooltip--sm .fui-tooltip__content{padding:var(--fui-spacing-2) var(--fui-spacing-4)}.fui-tooltip--sm .fui-tooltip__arrow{--arrow-size: 4px}.fui-tooltip--md{font-size:var(--fui-text-base)}.fui-tooltip--md .fui-tooltip__content{padding:var(--fui-spacing-4) var(--fui-spacing-6)}.fui-tooltip--md .fui-tooltip__arrow{--arrow-size: 6px}.fui-tooltip--lg{font-size:var(--fui-text-md)}.fui-tooltip--lg .fui-tooltip__content{padding:var(--fui-spacing-6) var(--fui-spacing-7)}.fui-tooltip--lg .fui-tooltip__arrow{--arrow-size: 8px}@media(prefers-contrast:more){.fui-tooltip{border:2px solid var(--fui-text-primary);box-shadow:var(--fui-shadow-lg)}}@media(prefers-reduced-motion:reduce){.fui-tooltip{animation:none;opacity:1}}@media print{.fui-tooltip{display:none!important}}@keyframes fui-tooltip-fade-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"] }]
121
+ }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: true }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: true }] }], textAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "textAlign", required: true }] }], maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: true }] }], arrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrow", required: true }] }], tooltipId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipId", required: true }] }] } });
112
122
 
113
123
  /**
114
124
  * # Tooltip Directive
@@ -198,6 +208,11 @@ class FuiTooltipDirective {
198
208
  * @default 'md'
199
209
  */
200
210
  fuiTooltipSize = input('md', { ...(ngDevMode ? { debugName: "fuiTooltipSize" } : /* istanbul ignore next */ {}), transform: (v) => (TOOLTIP_SIZES.includes(v) ? v : 'md') });
211
+ /**
212
+ * Tooltip text alignment
213
+ * @default 'left'
214
+ */
215
+ fuiTooltipTextAlign = input('left', { ...(ngDevMode ? { debugName: "fuiTooltipTextAlign" } : /* istanbul ignore next */ {}), transform: (v) => (TOOLTIP_TEXT_ALIGNS.includes(v) ? v : 'left') });
201
216
  /**
202
217
  * Tooltip trigger event
203
218
  * @default 'hover'
@@ -247,6 +262,7 @@ class FuiTooltipDirective {
247
262
  _hideTimeout = null;
248
263
  _destroyed = false;
249
264
  _isHoveringTooltip = false;
265
+ _positionChangesSub = null;
250
266
  // Computed properties
251
267
  isVisible = computed(() => this._isVisible(), ...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
252
268
  tooltipId = computed(() => this._tooltipId(), ...(ngDevMode ? [{ debugName: "tooltipId" }] : /* istanbul ignore next */ []));
@@ -254,6 +270,7 @@ class FuiTooltipDirective {
254
270
  _elementRef = inject(ElementRef);
255
271
  _overlayService = inject(FuiOverlayService);
256
272
  _environmentInjector = inject(EnvironmentInjector);
273
+ _renderer = inject(Renderer2);
257
274
  constructor() {
258
275
  // Generate unique tooltip ID
259
276
  this._tooltipId.set(`fui-tooltip-${FuiTooltipDirective._nextId++}`);
@@ -403,6 +420,7 @@ class FuiTooltipDirective {
403
420
  this._tooltipComponent.setInput('content', this.fuiTooltip());
404
421
  this._tooltipComponent.setInput('position', this.fuiTooltipPosition());
405
422
  this._tooltipComponent.setInput('size', this.fuiTooltipSize());
423
+ this._tooltipComponent.setInput('textAlign', this.fuiTooltipTextAlign());
406
424
  this._tooltipComponent.setInput('maxWidth', this.fuiTooltipMaxWidth());
407
425
  this._tooltipComponent.setInput('arrow', this.fuiTooltipArrow());
408
426
  this._tooltipComponent.setInput('tooltipId', this.tooltipId());
@@ -415,6 +433,12 @@ class FuiTooltipDirective {
415
433
  .connectedTo(this._elementRef, positions)
416
434
  .withPush(true)
417
435
  .withViewportMargin(8);
436
+ // Keep the arrow pointing at the trigger center whenever the overlay is
437
+ // (re)positioned — e.g. when `withPush` shifts the tooltip to stay within
438
+ // the viewport, the CSS-centered arrow would otherwise miss the trigger.
439
+ this._positionChangesSub = positionStrategy.positionChanges.subscribe(() => {
440
+ this._updateArrowPosition();
441
+ });
418
442
  // Create overlay
419
443
  this._overlayRef = this._overlayService.create({
420
444
  positionStrategy,
@@ -490,7 +514,47 @@ class FuiTooltipDirective {
490
514
  };
491
515
  return positionMap[position] || positionMap.top;
492
516
  }
517
+ /**
518
+ * Repositions the tooltip arrow so its tip stays aligned with the center of
519
+ * the trigger element. The overlay's `withPush` behavior can slide the tooltip
520
+ * sideways to keep it on-screen; without this correction the CSS-centered
521
+ * arrow would drift away from the trigger.
522
+ */
523
+ _updateArrowPosition() {
524
+ if (!this._tooltipComponent || !this.fuiTooltipArrow()) {
525
+ return;
526
+ }
527
+ const tooltipEl = this._tooltipComponent.location.nativeElement;
528
+ const arrowEl = tooltipEl.querySelector('.fui-tooltip__arrow');
529
+ if (!arrowEl) {
530
+ return;
531
+ }
532
+ // Measure against the overlay pane: it is the arrow's positioned ancestor
533
+ // (position: fixed), so the computed offset maps directly to the arrow's
534
+ // `left`/`top` without assuming the tooltip host fills the pane.
535
+ const paneEl = this._overlayRef?.overlayElement ?? tooltipEl;
536
+ const triggerRect = this._elementRef.nativeElement.getBoundingClientRect();
537
+ const paneRect = paneEl.getBoundingClientRect();
538
+ const position = this.fuiTooltipPosition();
539
+ const isVertical = position.startsWith('left') || position.startsWith('right');
540
+ const arrowEdge = (isVertical ? arrowEl.offsetHeight : arrowEl.offsetWidth) || 8;
541
+ const { axis, offset } = computeTooltipArrowOffset(triggerRect, paneRect, position, arrowEdge);
542
+ if (axis === 'y') {
543
+ this._renderer.setStyle(arrowEl, 'top', `${offset}px`);
544
+ this._renderer.setStyle(arrowEl, 'bottom', 'auto');
545
+ this._renderer.setStyle(arrowEl, 'transform', 'translateY(-50%)');
546
+ }
547
+ else {
548
+ this._renderer.setStyle(arrowEl, 'left', `${offset}px`);
549
+ this._renderer.setStyle(arrowEl, 'right', 'auto');
550
+ this._renderer.setStyle(arrowEl, 'transform', 'translateX(-50%)');
551
+ }
552
+ }
493
553
  _destroyTooltip() {
554
+ if (this._positionChangesSub) {
555
+ this._positionChangesSub.unsubscribe();
556
+ this._positionChangesSub = null;
557
+ }
494
558
  if (this._overlayRef) {
495
559
  this._overlayRef.dispose();
496
560
  this._overlayRef = null;
@@ -519,7 +583,7 @@ class FuiTooltipDirective {
519
583
  }
520
584
  };
521
585
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
522
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.6", type: FuiTooltipDirective, isStandalone: true, selector: "[fuiTooltip]", inputs: { fuiTooltip: { classPropertyName: "fuiTooltip", publicName: "fuiTooltip", isSignal: true, isRequired: true, transformFunction: null }, fuiTooltipPosition: { classPropertyName: "fuiTooltipPosition", publicName: "fuiTooltipPosition", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipSize: { classPropertyName: "fuiTooltipSize", publicName: "fuiTooltipSize", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipTrigger: { classPropertyName: "fuiTooltipTrigger", publicName: "fuiTooltipTrigger", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipShowDelay: { classPropertyName: "fuiTooltipShowDelay", publicName: "fuiTooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipHideDelay: { classPropertyName: "fuiTooltipHideDelay", publicName: "fuiTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipDisabled: { classPropertyName: "fuiTooltipDisabled", publicName: "fuiTooltipDisabled", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipMaxWidth: { classPropertyName: "fuiTooltipMaxWidth", publicName: "fuiTooltipMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipOffset: { classPropertyName: "fuiTooltipOffset", publicName: "fuiTooltipOffset", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipArrow: { classPropertyName: "fuiTooltipArrow", publicName: "fuiTooltipArrow", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipShow: { classPropertyName: "fuiTooltipShow", publicName: "fuiTooltipShow", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()", "click": "onClick()", "keydown": "onKeydown($event)" }, properties: { "attr.aria-describedby": "isVisible() ? tooltipId() : null" } }, exportAs: ["fuiTooltip"], ngImport: i0 });
586
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.6", type: FuiTooltipDirective, isStandalone: true, selector: "[fuiTooltip]", inputs: { fuiTooltip: { classPropertyName: "fuiTooltip", publicName: "fuiTooltip", isSignal: true, isRequired: true, transformFunction: null }, fuiTooltipPosition: { classPropertyName: "fuiTooltipPosition", publicName: "fuiTooltipPosition", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipSize: { classPropertyName: "fuiTooltipSize", publicName: "fuiTooltipSize", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipTextAlign: { classPropertyName: "fuiTooltipTextAlign", publicName: "fuiTooltipTextAlign", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipTrigger: { classPropertyName: "fuiTooltipTrigger", publicName: "fuiTooltipTrigger", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipShowDelay: { classPropertyName: "fuiTooltipShowDelay", publicName: "fuiTooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipHideDelay: { classPropertyName: "fuiTooltipHideDelay", publicName: "fuiTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipDisabled: { classPropertyName: "fuiTooltipDisabled", publicName: "fuiTooltipDisabled", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipMaxWidth: { classPropertyName: "fuiTooltipMaxWidth", publicName: "fuiTooltipMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipOffset: { classPropertyName: "fuiTooltipOffset", publicName: "fuiTooltipOffset", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipArrow: { classPropertyName: "fuiTooltipArrow", publicName: "fuiTooltipArrow", isSignal: true, isRequired: false, transformFunction: null }, fuiTooltipShow: { classPropertyName: "fuiTooltipShow", publicName: "fuiTooltipShow", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()", "click": "onClick()", "keydown": "onKeydown($event)" }, properties: { "attr.aria-describedby": "isVisible() ? tooltipId() : null" } }, exportAs: ["fuiTooltip"], ngImport: i0 });
523
587
  }
524
588
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiTooltipDirective, decorators: [{
525
589
  type: Directive,
@@ -531,7 +595,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
531
595
  '[attr.aria-describedby]': 'isVisible() ? tooltipId() : null',
532
596
  },
533
597
  }]
534
- }], ctorParameters: () => [], propDecorators: { fuiTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltip", required: true }] }], fuiTooltipPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipPosition", required: false }] }], fuiTooltipSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipSize", required: false }] }], fuiTooltipTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipTrigger", required: false }] }], fuiTooltipShowDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipShowDelay", required: false }] }], fuiTooltipHideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipHideDelay", required: false }] }], fuiTooltipDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipDisabled", required: false }] }], fuiTooltipMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipMaxWidth", required: false }] }], fuiTooltipOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipOffset", required: false }] }], fuiTooltipArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipArrow", required: false }] }], fuiTooltipShow: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipShow", required: false }] }], onMouseEnter: [{
598
+ }], ctorParameters: () => [], propDecorators: { fuiTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltip", required: true }] }], fuiTooltipPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipPosition", required: false }] }], fuiTooltipSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipSize", required: false }] }], fuiTooltipTextAlign: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipTextAlign", required: false }] }], fuiTooltipTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipTrigger", required: false }] }], fuiTooltipShowDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipShowDelay", required: false }] }], fuiTooltipHideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipHideDelay", required: false }] }], fuiTooltipDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipDisabled", required: false }] }], fuiTooltipMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipMaxWidth", required: false }] }], fuiTooltipOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipOffset", required: false }] }], fuiTooltipArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipArrow", required: false }] }], fuiTooltipShow: [{ type: i0.Input, args: [{ isSignal: true, alias: "fuiTooltipShow", required: false }] }], onMouseEnter: [{
535
599
  type: HostListener,
536
600
  args: ['mouseenter']
537
601
  }], onMouseLeave: [{
@@ -550,6 +614,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
550
614
  type: HostListener,
551
615
  args: ['keydown', ['$event']]
552
616
  }] } });
617
+ /**
618
+ * Computes where the tooltip arrow must sit so that it points at the center of
619
+ * the trigger, regardless of how far the overlay was pushed to stay on-screen.
620
+ *
621
+ * The offset is measured from the tooltip's own top/left edge and is clamped so
622
+ * the arrow never overlaps the tooltip's rounded corners.
623
+ *
624
+ * @param triggerRect Bounding rect of the trigger element.
625
+ * @param tooltipRect Bounding rect of the (already positioned) tooltip.
626
+ * @param position Resolved tooltip position.
627
+ * @param arrowEdge Size in px kept clear at each edge (typically the arrow's own extent).
628
+ */
629
+ function computeTooltipArrowOffset(triggerRect, tooltipRect, position, arrowEdge) {
630
+ const isVertical = position.startsWith('left') || position.startsWith('right');
631
+ if (isVertical) {
632
+ const triggerCenterY = triggerRect.top + triggerRect.height / 2;
633
+ return { axis: 'y', offset: clampArrowOffset(triggerCenterY - tooltipRect.top, tooltipRect.height, arrowEdge) };
634
+ }
635
+ const triggerCenterX = triggerRect.left + triggerRect.width / 2;
636
+ return { axis: 'x', offset: clampArrowOffset(triggerCenterX - tooltipRect.left, tooltipRect.width, arrowEdge) };
637
+ }
638
+ /** Clamps an arrow offset into `[edge, size - edge]`, falling back to center when the tooltip is too small. */
639
+ function clampArrowOffset(offset, size, edge) {
640
+ const min = edge;
641
+ const max = size - edge;
642
+ if (min >= max) {
643
+ return size / 2;
644
+ }
645
+ return Math.min(Math.max(offset, min), max);
646
+ }
553
647
 
554
648
  // Public API for tooltip component
555
649
 
@@ -557,5 +651,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
557
651
  * Generated bundle index. Do not edit.
558
652
  */
559
653
 
560
- export { FuiTooltipComponent, FuiTooltipDirective, TOOLTIP_POSITIONS, TOOLTIP_SIZES, TOOLTIP_TRIGGERS };
654
+ export { FuiTooltipComponent, FuiTooltipDirective, TOOLTIP_POSITIONS, TOOLTIP_SIZES, TOOLTIP_TEXT_ALIGNS, TOOLTIP_TRIGGERS, computeTooltipArrowOffset };
561
655
  //# sourceMappingURL=raintonic-formaui-components-tooltip.mjs.map