@raintonic/formaui 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/CHANGELOG.md +7 -7
  2. package/README.md +145 -145
  3. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
  4. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +0 -26
  6. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
  7. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +2 -2
  8. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
  9. package/fesm2022/raintonic-formaui-components-accordion.mjs +2 -2
  10. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  11. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  12. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  13. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  14. package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
  15. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  16. package/fesm2022/raintonic-formaui-components-big-menu.mjs +2 -2
  17. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -1
  18. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +4 -4
  19. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
  20. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
  22. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  24. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  26. package/fesm2022/raintonic-formaui-components-date-picker.mjs +4 -4
  27. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  28. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  29. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  30. package/fesm2022/raintonic-formaui-components-drawer.mjs +2 -2
  31. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  32. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +1 -1
  33. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  34. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
  36. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  38. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  40. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  41. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  42. package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -1
  43. package/fesm2022/raintonic-formaui-components-number-input.mjs +2 -2
  44. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  45. package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-password-input.mjs +2 -2
  48. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
  50. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  52. package/fesm2022/raintonic-formaui-components-radio.mjs +4 -4
  53. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  54. package/fesm2022/raintonic-formaui-components-select.mjs +24 -24
  55. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  56. package/fesm2022/raintonic-formaui-components-side-panel.mjs +2 -2
  57. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  58. package/fesm2022/raintonic-formaui-components-sidebar.mjs +2 -2
  59. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -1
  60. package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
  61. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
  62. package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
  63. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  64. package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
  65. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  66. package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
  67. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  68. package/fesm2022/raintonic-formaui-components-tab.mjs +10 -10
  69. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  70. package/fesm2022/raintonic-formaui-components-tag.mjs +2 -2
  71. package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -1
  72. package/fesm2022/raintonic-formaui-components-time-picker.mjs +4 -4
  73. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  74. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
  75. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  76. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  77. package/fesm2022/raintonic-formaui-components-tree-select.mjs +2 -2
  78. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
  79. package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
  80. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
  81. package/fesm2022/raintonic-formaui-components-tree.mjs +4 -4
  82. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
  83. package/fesm2022/raintonic-formaui-core.mjs.map +1 -1
  84. package/fesm2022/raintonic-formaui-services-dialog.mjs +36 -36
  85. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  86. package/fesm2022/raintonic-formaui-services-notification.mjs +2 -2
  87. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
  88. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
  89. package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -1
  90. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  91. package/llms-full.txt +3 -97
  92. package/llms.txt +3 -3
  93. package/package.json +1 -1
  94. package/styles/index.scss +3 -3
  95. package/styles/partials/components/_button.scss +367 -0
  96. package/styles/partials/components/_dialog.scss +180 -0
  97. package/styles/partials/components/_overlay.scss +87 -0
  98. package/types/raintonic-formaui-cdk-overlay.d.ts +0 -1
  99. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-menu.mjs","sources":["../../../lib/components/menu/menu-item.component.ts","../../../lib/components/menu/menu-item.component.html","../../../lib/components/menu/menu.component.ts","../../../lib/components/menu/menu.component.html","../../../lib/components/menu/menu-trigger.directive.ts","../../../lib/components/menu/index.ts","../../../lib/components/menu/raintonic-formaui-components-menu.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n HostListener,\n Renderer2,\n computed,\n inject,\n input,\n output,\n signal,\n booleanAttribute,\n} from '@angular/core';\n\n/**\n * Available menu item variants\n */\nexport type MenuItemVariant = 'default' | 'danger';\n\nexport const MENU_ITEM_VARIANTS = ['default', 'danger'] as const;\n\n/**\n * # FuiMenuItem Component\n *\n * A menu item component designed to be used within fui-menu.\n * Provides consistent styling and behavior for menu options.\n *\n * ## Features\n * - Default and danger variants\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Icon support with proper spacing\n * - Disabled state support\n * - Hover and focus states\n * - Keyboard activation (Enter and Space)\n *\n * ## Usage\n *\n * ### Basic Menu Item\n * ```html\n * <fui-menu-item>Profile</fui-menu-item>\n * ```\n *\n * ### Menu Item with Icon\n * ```html\n * <fui-menu-item>\n * <fui-icon name=\"user\" fuiPrefix></fui-icon>\n * Profile\n * </fui-menu-item>\n * ```\n *\n * ### Danger Menu Item\n * ```html\n * <fui-menu-item variant=\"danger\">\n * <fui-icon name=\"trash\" fuiPrefix></fui-icon>\n * Delete Account\n * </fui-menu-item>\n * ```\n *\n * ### Disabled Menu Item\n * ```html\n * <fui-menu-item [disabled]=\"true\">\n * Unavailable Option\n * </fui-menu-item>\n * ```\n *\n * @example\n * ```typescript\n * import { FuiMenuItemComponent } from '@raintonic/formaui/components/menu';\n *\n * @Component({\n * standalone: true,\n * imports: [FuiMenuItemComponent],\n * templateUrl: './my-component.component.html',\n * styleUrl: './my-component.component.scss'\n * })\n * export class MyComponent {\n * onItemClick(event: Event) {\n * console.log('Menu item clicked:', event);\n * }\n * }\n * ```\n */\n@Component({\n selector: 'fui-menu-item',\n standalone: true,\n imports: [],\n templateUrl: './menu-item.component.html',\n styleUrl: './menu-item.component.scss',\n host: {\n '[class]': 'computedClasses()',\n '[attr.role]': '\"menuitem\"',\n '[attr.tabindex]': 'disabled() ? \"-1\" : tabIndex()',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n },\n})\nexport class FuiMenuItemComponent {\n /**\n * Menu item variant that determines the visual style\n * @default 'default'\n */\n readonly variant = input<MenuItemVariant, MenuItemVariant | string>('default', {\n transform: (v) => ((MENU_ITEM_VARIANTS as readonly string[]).includes(v) ? (v as MenuItemVariant) : 'default'),\n });\n\n /**\n * Whether the menu item is disabled\n * @default false\n */\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Emitted when the menu item is clicked or activated\n */\n readonly selected = output<Event>();\n\n /**\n * Internal tabindex for roving tabindex pattern.\n * Managed by the parent FuiMenuComponent.\n * @internal\n */\n readonly tabIndex = signal('-1');\n\n // Computed properties\n readonly computedClasses = computed(() => {\n const classes: string[] = ['fui-menu-item', `fui-menu-item--${this.variant()}`];\n\n if (this.disabled()) {\n classes.push('fui-menu-item--disabled');\n }\n\n return classes.join(' ');\n });\n\n /** @internal */ readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _renderer: Renderer2 = inject(Renderer2);\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n this.selected.emit(event);\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) {\n return;\n }\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n // Dispatch a synthetic click so the parent menu's click handler\n // can detect the activation and close the menu.\n this._elementRef.nativeElement.click();\n break;\n }\n }\n\n /**\n * Focuses the menu item\n */\n focus(): void {\n this._elementRef.nativeElement.focus();\n }\n}\n","<ng-content></ng-content>\r\n","import {\n booleanAttribute,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n HostListener,\n inject,\n NgZone,\n input,\n OnDestroy,\n output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { FuiMenuItemComponent } from './menu-item.component';\n\nimport { DOCUMENT } from '@angular/common';\nimport { fromEvent, Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { FuiConnectedPosition, FuiOverlayRef, FuiOverlayService } from '@raintonic/formaui/cdk/overlay';\n\n/**\n * Available menu positions relative to the trigger element\n */\nexport type FuiMenuPosition =\n | 'top-start'\n | 'top'\n | 'top-end'\n | 'bottom-start'\n | 'bottom'\n | 'bottom-end'\n | 'left-start'\n | 'left'\n | 'left-end'\n | 'right-start'\n | 'right'\n | 'right-end';\n\nexport const RT_MENU_POSITIONS = [\n 'top-start',\n 'top',\n 'top-end',\n 'bottom-start',\n 'bottom',\n 'bottom-end',\n 'left-start',\n 'left',\n 'left-end',\n 'right-start',\n 'right',\n 'right-end',\n] as const;\n\n/**\n * Available menu sizes\n */\nexport type FuiMenuSize = 'sm' | 'md' | 'lg';\n\nexport const RT_MENU_SIZES = ['sm', 'md', 'lg'] as const;\n\n/**\n * # FuiMenu Component\n *\n * A dropdown menu component that provides a list of options or actions.\n * Designed to work with external triggers using the fuiMenuTrigger directive.\n *\n * ## Features\n * - Multiple positioning options relative to trigger\n * - Keyboard navigation (Arrow keys, Enter, Escape)\n * - Click outside to close\n * - Full accessibility support (ARIA attributes, focus management)\n * - Customizable size variants\n * - Auto-positioning with collision detection\n * - Portal attachment to document body to avoid clipping issues\n *\n * ## Usage\n *\n * ### Basic Menu with External Trigger\n * ```html\n * <button fuiButton fuiMenuTrigger [fuiMenuTriggerFor]=\"menu\">\n * Open Menu\n * </button>\n * <fui-menu #menu>\n * <fui-menu-item>Option 1</fui-menu-item>\n * <fui-menu-item>Option 2</fui-menu-item>\n * </fui-menu>\n * ```\n *\n * ### Menu with Custom Position\n * ```html\n * <button fuiButton fuiMenuTrigger [fuiMenuTriggerFor]=\"menu\">\n * Open Menu\n * </button>\n * <fui-menu #menu position=\"top-start\" size=\"lg\">\n * <fui-menu-item>Profile</fui-menu-item>\n * <fui-menu-item variant=\"danger\">Logout</fui-menu-item>\n * </fui-menu>\n * ```\n *\n * ### Menu without Portal (for special cases)\n * ```html\n * <button fuiButton fuiMenuTrigger [fuiMenuTriggerFor]=\"menu\">\n * Open Menu\n * </button>\n * <fui-menu #menu [attachToBody]=\"false\">\n * <fui-menu-item>Option 1</fui-menu-item>\n * <fui-menu-item>Option 2</fui-menu-item>\n * </fui-menu>\n * ```\n *\n * ### Menu with Data Passed from Trigger\n * ```html\n * <button fuiButton fuiMenuTrigger\n * [fuiMenuTriggerFor]=\"dynamicMenu\"\n * [menuTriggerData]=\"{ user: currentUser, items: menuItems }\">\n * Open Menu\n * </button>\n * <fui-menu #dynamicMenu>\n * <!-- Access data in component using menu.menuData() -->\n * </fui-menu>\n * ```\n *\n * ```typescript\n * @Component({\n * template: `\n * <fui-menu #menu>\n * <fui-menu-item *ngFor=\"let item of menu.menuData()?.items\">\n * {{ item.label }}\n * </fui-menu-item>\n * </fui-menu>\n * `\n * })\n * export class MyComponent { }\n * ```\n */\n@Component({\n selector: 'fui-menu',\n standalone: true,\n imports: [],\n templateUrl: './menu.component.html',\n styleUrl: './menu.component.scss',\n host: {\n '[class]': 'computedClasses()',\n '[attr.data-open]': 'isOpen() ? \"true\" : null',\n },\n})\nexport class FuiMenuComponent implements OnDestroy {\n /**\n * Menu position relative to the trigger element\n * @default 'bottom-start'\n */\n readonly position = input<FuiMenuPosition>('bottom-start');\n\n /**\n * Menu size variant\n * @default 'md'\n */\n readonly size = input<FuiMenuSize>('md');\n\n /**\n * Whether the menu should close when clicking outside\n * @default true\n */\n readonly closeOnClickOutside = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /**\n * Whether the menu should close when pressing Escape\n * @default true\n */\n readonly closeOnEscape = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /**\n * Whether the menu is disabled\n * @default false\n */\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /**\n * Whether to attach the menu panel to the document body to avoid clipping issues\n * @default true\n */\n readonly attachToBody = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /**\n * Emitted when the menu open state changes\n */\n readonly openChange = output<boolean>();\n\n /**\n * Emitted when a menu item is selected\n */\n readonly itemSelected = output<Event>();\n\n // Internal state\n protected readonly _isOpen = signal(false);\n protected readonly _animationState = signal<'void' | 'enter' | 'leave'>('void');\n private readonly _triggerElement = signal<HTMLElement | null>(null);\n private readonly _menuData = signal<unknown>(null);\n private _previousFocusedElement: HTMLElement | null = null;\n private _overlayRef: FuiOverlayRef | null = null;\n private _overlaySubscriptions = new Subscription();\n private _closeAnimationTimeout: number | null = null;\n\n // Computed properties\n readonly computedClasses = computed(() => {\n const classes: string[] = ['fui-menu', `fui-menu--${this.position()}`, `fui-menu--${this.size()}`];\n\n if (this.disabled()) {\n classes.push('fui-menu--disabled');\n }\n\n return classes.join(' ');\n });\n\n // Injected dependencies\n private readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _overlayService: FuiOverlayService = inject(FuiOverlayService);\n private readonly _document = inject(DOCUMENT);\n private readonly _ngZone = inject(NgZone);\n private _outsideClickSub?: Subscription;\n\n // View references\n @ViewChild('menuPanel', { static: false }) menuPanel?: ElementRef<HTMLElement>;\n\n // Content children for roving tabindex management\n private readonly _menuItems = contentChildren(FuiMenuItemComponent, { descendants: true });\n\n constructor() {\n // Handle open state changes with animation\n effect(() => {\n if (this._isOpen()) {\n requestAnimationFrame(() => {\n this._animationState.set('enter');\n this._openMenu();\n });\n } else {\n this._startCloseAnimation();\n }\n });\n\n // Emit open change events\n effect(() => {\n this.openChange.emit(this._isOpen());\n });\n }\n\n /**\n * Whether the menu is currently open\n */\n isOpen(): boolean {\n return this._isOpen();\n }\n\n /**\n * Opens the menu\n */\n open(): void {\n if (this.disabled()) return;\n this._isOpen.set(true);\n }\n\n /**\n * Closes the menu\n */\n close(): void {\n this._isOpen.set(false);\n }\n\n /**\n * Toggles the menu open/closed state\n */\n toggle(): void {\n if (this._isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Sets the trigger element for positioning (called by trigger directive)\n */\n setTriggerElement(element: HTMLElement): void {\n this._triggerElement.set(element);\n }\n\n /**\n * Gets the menu data passed from the trigger\n * Returns a signal containing the data\n */\n menuData(): unknown {\n return this._menuData();\n }\n\n /**\n * Sets the menu data (called by trigger directive)\n * @param data The data to pass to the menu\n */\n setMenuData(data: unknown): void {\n this._menuData.set(data);\n }\n\n // Start listening for outside clicks when menu opens\n private _listenForOutsideClicks(): void {\n this._outsideClickSub?.unsubscribe();\n\n if (!this.closeOnClickOutside()) return;\n\n this._ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n this._outsideClickSub = fromEvent<MouseEvent>(this._document, 'click')\n .pipe(\n filter(() => this._isOpen()),\n filter((event) => {\n const target = event.target as HTMLElement;\n const menuElement = this._elementRef.nativeElement;\n const triggerElement = this._triggerElement();\n return !menuElement.contains(target) && !triggerElement?.contains(target);\n }),\n )\n .subscribe(() => {\n this._ngZone.run(() => {\n this.close();\n });\n });\n });\n });\n }\n\n @HostListener('document:keydown', ['$event'])\n onDocumentKeydown(event: KeyboardEvent): void {\n if (!this._isOpen() || !this._isTopmostOverlay()) {\n return;\n }\n\n switch (event.key) {\n case 'Escape':\n if (this.closeOnEscape()) {\n event.preventDefault();\n this.close();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n this._focusNextItem();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this._focusPreviousItem();\n break;\n case 'Home':\n event.preventDefault();\n this._focusFirstItem();\n break;\n case 'End':\n event.preventDefault();\n this._focusLastItem();\n break;\n }\n }\n\n @HostListener('click', ['$event'])\n onMenuClick(event: Event): void {\n // Check if the click was on a menu item\n const target = event.target as HTMLElement;\n const menuItem = target.closest('fui-menu-item');\n\n if (menuItem && this._isOpen()) {\n // Emit the itemSelected event and close the menu\n this.itemSelected.emit(event);\n this.close();\n }\n }\n\n ngOnDestroy(): void {\n this._clearCloseTimeout();\n this._outsideClickSub?.unsubscribe();\n this._restoreFocus();\n this._disposeOverlay();\n }\n\n private _openMenu(): void {\n // Create overlay after the view updates\n requestAnimationFrame(() => {\n this._createOverlay();\n this._listenForOutsideClicks();\n\n const triggerElement = this._triggerElement();\n if (triggerElement) {\n triggerElement.setAttribute('aria-expanded', 'true');\n this._previousFocusedElement = document.activeElement as HTMLElement;\n }\n });\n }\n\n private _closeMenu(): void {\n this._outsideClickSub?.unsubscribe();\n const triggerElement = this._triggerElement();\n if (triggerElement) {\n triggerElement.setAttribute('aria-expanded', 'false');\n }\n\n // Reset roving tabindex on all items\n this._resetRovingTabindex();\n\n this._disposeOverlay();\n this._restoreFocus();\n }\n\n private _createOverlay(): void {\n if (this._overlayRef || !this.menuPanel) {\n return;\n }\n\n const triggerElement = this._triggerElement();\n if (!triggerElement) {\n return;\n }\n\n // Create overlay with positioning strategy\n const positions = this._getPositionsForMenuPosition(this.position());\n const positionStrategy = this._overlayService\n .position()\n .connectedTo(triggerElement, positions)\n .withPush(true)\n .withViewportMargin(8);\n\n // Create overlay\n this._overlayRef = this._overlayService.create({\n positionStrategy,\n scrollStrategy: this.closeOnClickOutside()\n ? this._overlayService.scrollStrategies.close()\n : this._overlayService.scrollStrategies.reposition(),\n hasBackdrop: this.closeOnClickOutside(),\n backdropClass: 'fui-menu-backdrop',\n backdropClickBehavior: 'close',\n panelClass: ['fui-menu-panel', `fui-menu-panel--${this.size()}`],\n });\n\n // Track overlay subscriptions for proper cleanup\n this._overlaySubscriptions.unsubscribe();\n this._overlaySubscriptions = new Subscription();\n\n if (this.closeOnClickOutside()) {\n this._overlaySubscriptions.add(\n this._overlayRef.backdropClick.subscribe(() => {\n this.close();\n }),\n );\n }\n\n if (this.closeOnEscape()) {\n this._overlaySubscriptions.add(\n this._overlayRef.keydownEvents.subscribe((event) => {\n if (event.key === 'Escape') {\n this.close();\n }\n }),\n );\n }\n\n // Attach menu panel to overlay\n const menuElement = this.menuPanel.nativeElement;\n this._overlayRef.attach(menuElement);\n\n // Focus first item after attachment\n setTimeout(() => {\n this._focusFirstItem();\n }, 0);\n }\n\n private _getPositionsForMenuPosition(position: FuiMenuPosition): FuiConnectedPosition[] {\n const offset = 4;\n\n switch (position) {\n case 'bottom-start':\n return [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\n ];\n case 'bottom':\n return [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\n ];\n case 'bottom-end':\n return [\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\n ];\n case 'top-start':\n return [\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\n ];\n case 'top':\n return [\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\n ];\n case 'top-end':\n return [\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\n ];\n case 'right-start':\n return [\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\n ];\n case 'right':\n return [\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\n ];\n case 'right-end':\n return [\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\n ];\n case 'left-start':\n return [\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\n ];\n case 'left':\n return [\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\n ];\n case 'left-end':\n return [\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\n ];\n default:\n return [{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset }];\n }\n }\n\n private _restoreFocus(): void {\n // Prefer the trigger element for focus restoration\n const triggerElement = this._triggerElement();\n if (triggerElement) {\n triggerElement.focus();\n } else if (this._previousFocusedElement) {\n this._previousFocusedElement.focus();\n }\n this._previousFocusedElement = null;\n }\n\n private _getMenuItems(): HTMLElement[] {\n const menuElement = this.menuPanel?.nativeElement;\n if (!menuElement) return [];\n\n return Array.from(menuElement.querySelectorAll('fui-menu-item:not([aria-disabled=\"true\"])'));\n }\n\n /** @internal Called by FuiMenuTriggerDirective */\n _focusFirstItem(): void {\n const items = this._getMenuItems();\n if (items.length > 0) {\n this._focusItem(items[0]);\n }\n }\n\n /** @internal Called by FuiMenuTriggerDirective */\n _focusLastItem(): void {\n const items = this._getMenuItems();\n if (items.length > 0) {\n this._focusItem(items[items.length - 1]);\n }\n }\n\n private _focusNextItem(): void {\n const items = this._getMenuItems();\n if (items.length === 0) {\n return;\n }\n\n const currentIndex = items.findIndex((item) => item === document.activeElement);\n const nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n this._focusItem(items[nextIndex]);\n }\n\n private _focusPreviousItem(): void {\n const items = this._getMenuItems();\n if (items.length === 0) {\n return;\n }\n\n const currentIndex = items.findIndex((item) => item === document.activeElement);\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n this._focusItem(items[prevIndex]);\n }\n\n /**\n * Focuses a menu item and updates roving tabindex across all items.\n */\n private _focusItem(element: HTMLElement): void {\n this._updateRovingTabindex(element);\n element.focus();\n }\n\n /**\n * Resets all items to tabindex=\"-1\" when the menu closes.\n */\n private _resetRovingTabindex(): void {\n const items = this._menuItems();\n for (const item of items) {\n item.tabIndex.set('-1');\n }\n }\n\n /**\n * Updates roving tabindex: sets tabindex=\"0\" on the target item\n * and tabindex=\"-1\" on all other items.\n */\n private _updateRovingTabindex(targetElement: HTMLElement): void {\n const items = this._menuItems();\n for (const item of items) {\n if (item._elementRef.nativeElement === targetElement) {\n item.tabIndex.set('0');\n } else {\n item.tabIndex.set('-1');\n }\n }\n }\n\n private _disposeOverlay(): void {\n this._overlaySubscriptions.unsubscribe();\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n }\n\n private _startCloseAnimation(): void {\n // Clear any existing timeout\n this._clearCloseTimeout();\n\n // Trigger leave animation\n this._animationState.set('leave');\n\n // Wait for animation to complete before closing (matches CSS transition duration)\n this._closeAnimationTimeout = window.setTimeout(() => {\n this._closeMenu();\n this._animationState.set('void');\n }, 150); // Match the CSS transition duration\n }\n\n private _clearCloseTimeout(): void {\n if (this._closeAnimationTimeout !== null) {\n clearTimeout(this._closeAnimationTimeout);\n this._closeAnimationTimeout = null;\n }\n }\n\n /**\n * Checks if this menu's overlay is the topmost (most recently opened) overlay.\n * This ensures that only the topmost menu responds to keyboard events when\n * multiple menus are open (e.g., nested menus).\n */\n private _isTopmostOverlay(): boolean {\n if (!this._overlayRef) {\n return false;\n }\n\n const activeOverlays = this._overlayService.getActiveOverlays();\n\n // The last overlay in the array is the most recently created (topmost)\n const topmostOverlay = activeOverlays[activeOverlays.length - 1];\n\n return topmostOverlay === this._overlayRef;\n }\n}\n","@if (_isOpen() || _animationState() === 'leave') {\r\n <div class=\"fui-menu__panel\" #menuPanel role=\"menu\" [attr.data-animation-state]=\"_animationState()\">\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n","import { Directive, ElementRef, inject, HostListener, input, effect, AfterViewInit } from '@angular/core';\nimport { FuiMenuComponent } from './menu.component';\n\n/**\n * # fuiMenuTrigger Directive\n *\n * A directive that marks an element as a menu trigger, similar to Angular Material's matMenuTriggerFor.\n * This directive should be used in conjunction with FuiMenuComponent.\n *\n * ## Usage\n *\n * ### Basic Usage\n * ```html\n * <button fuiMenuTrigger [menuTriggerFor]=\"menu\">Open Menu</button>\n * <fui-menu #menu>\n * <fui-menu-item>Option 1</fui-menu-item>\n * <fui-menu-item>Option 2</fui-menu-item>\n * </fui-menu>\n * ```\n *\n * ### With Menu Reference\n * ```html\n * <button fuiMenuTrigger [menuTriggerFor]=\"userMenu\">\n * <fui-icon name=\"user\"></fui-icon>\n * User Menu\n * </button>\n *\n * <fui-menu #userMenu position=\"bottom-end\">\n * <fui-menu-item>Profile</fui-menu-item>\n * <fui-menu-item>Settings</fui-menu-item>\n * <fui-menu-item variant=\"danger\">Logout</fui-menu-item>\n * </fui-menu>\n * ```\n *\n * ### Passing Data to Menu\n * ```html\n * <button fuiMenuTrigger\n * [menuTriggerFor]=\"dynamicMenu\"\n * [menuTriggerData]=\"{ user: currentUser, role: 'admin' }\">\n * Open Menu\n * </button>\n *\n * <fui-menu #dynamicMenu>\n * <!-- Access menu data in your component via menu.menuData() -->\n * </fui-menu>\n * ```\n *\n * @example\n * ```typescript\n * import { FuiMenuTriggerDirective, FuiMenuComponent, FuiMenuItemComponent } from '@raintonic/formaui/components/menu';\n *\n * @Component({\n * standalone: true,\n * imports: [FuiMenuTriggerDirective, FuiMenuComponent, FuiMenuItemComponent],\n * template: `\n * <button fuiMenuTrigger [menuTriggerFor]=\"menu\">Open Menu</button>\n * <fui-menu #menu>\n * <fui-menu-item>Option 1</fui-menu-item>\n * <fui-menu-item>Option 2</fui-menu-item>\n * </fui-menu>\n * `\n * })\n * export class MyComponent { }\n * ```\n */\n@Directive({\n selector: '[fuiMenuTrigger]',\n standalone: true,\n host: {\n '[attr.aria-haspopup]': '\"true\"',\n '[attr.aria-expanded]': 'menu?.isOpen() ? \"true\" : \"false\"',\n },\n})\nexport class FuiMenuTriggerDirective implements AfterViewInit {\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\n\n /** The menu instance that this trigger should open */\n readonly menuTriggerFor = input<FuiMenuComponent | null>();\n\n /**\n * Data to be passed to the menu.\n * Can be accessed in the menu component or menu items.\n * Similar to Angular Material's matMenuTriggerData.\n */\n readonly menuTriggerData = input<unknown>();\n\n /** The menu instance that this trigger is associated with */\n menu: FuiMenuComponent | null = null;\n\n constructor() {\n // Set up the menu reference when fuiMenuTriggerFor changes\n effect(() => {\n const menuRef = this.menuTriggerFor();\n if (menuRef) {\n this.menu = menuRef;\n // Set the trigger element on the menu for positioning\n menuRef.setTriggerElement(this._elementRef.nativeElement);\n }\n });\n }\n\n ngAfterViewInit(): void {\n // Ensure the menu reference is set after view initialization\n const menuRef = this.menuTriggerFor();\n\n if (menuRef) {\n this.menu = menuRef;\n menuRef.setTriggerElement(this._elementRef.nativeElement);\n }\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n if (this.menu) {\n event.preventDefault();\n\n // Update trigger element to ensure correct positioning when multiple triggers exist\n this.menu.setTriggerElement(this._elementRef.nativeElement);\n\n // Pass data to menu before opening/toggling\n const data = this.menuTriggerData();\n if (data !== undefined && this.menu.setMenuData) {\n this.menu.setMenuData(data);\n }\n\n this.menu.toggle();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n const menu = this.menu;\n if (!menu) return;\n\n // Update trigger element and pass data to menu before opening\n const prepareMenu = (): void => {\n // Update trigger element to ensure correct positioning when multiple triggers exist\n menu.setTriggerElement(this._elementRef.nativeElement);\n\n // Pass data to menu\n const data = this.menuTriggerData();\n if (data !== undefined) {\n menu.setMenuData(data);\n }\n };\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n prepareMenu();\n menu.toggle();\n break;\n case 'ArrowDown':\n event.preventDefault();\n prepareMenu();\n menu.open();\n // Focus first item after menu opens\n setTimeout(() => {\n menu._focusFirstItem();\n }, 0);\n break;\n case 'ArrowUp':\n event.preventDefault();\n prepareMenu();\n menu.open();\n // Focus last item after menu opens\n setTimeout(() => {\n menu._focusLastItem();\n }, 0);\n break;\n }\n }\n\n /** Gets the trigger element */\n getElement(): HTMLElement {\n return this._elementRef.nativeElement;\n }\n}\n","// Public API for menu components\nexport * from './menu.component';\nexport * from './menu-item.component';\nexport * from './menu-trigger.directive';\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-menu.mjs","sources":["../../../lib/components/menu/menu-item.component.ts","../../../lib/components/menu/menu-item.component.html","../../../lib/components/menu/menu.component.ts","../../../lib/components/menu/menu.component.html","../../../lib/components/menu/menu-trigger.directive.ts","../../../lib/components/menu/index.ts","../../../lib/components/menu/raintonic-formaui-components-menu.ts"],"sourcesContent":["import {\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Renderer2,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Available menu item variants\r\n */\r\nexport type MenuItemVariant = 'default' | 'danger';\r\n\r\nexport const MENU_ITEM_VARIANTS = ['default', 'danger'] as const;\r\n\r\n/**\r\n * # FuiMenuItem Component\r\n *\r\n * A menu item component designed to be used within fui-menu.\r\n * Provides consistent styling and behavior for menu options.\r\n *\r\n * ## Features\r\n * - Default and danger variants\r\n * - Full accessibility support (ARIA attributes, keyboard navigation)\r\n * - Icon support with proper spacing\r\n * - Disabled state support\r\n * - Hover and focus states\r\n * - Keyboard activation (Enter and Space)\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Menu Item\r\n * ```html\r\n * <fui-menu-item>Profile</fui-menu-item>\r\n * ```\r\n *\r\n * ### Menu Item with Icon\r\n * ```html\r\n * <fui-menu-item>\r\n * <fui-icon name=\"user\" fuiPrefix></fui-icon>\r\n * Profile\r\n * </fui-menu-item>\r\n * ```\r\n *\r\n * ### Danger Menu Item\r\n * ```html\r\n * <fui-menu-item variant=\"danger\">\r\n * <fui-icon name=\"trash\" fuiPrefix></fui-icon>\r\n * Delete Account\r\n * </fui-menu-item>\r\n * ```\r\n *\r\n * ### Disabled Menu Item\r\n * ```html\r\n * <fui-menu-item [disabled]=\"true\">\r\n * Unavailable Option\r\n * </fui-menu-item>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiMenuItemComponent } from '@raintonic/formaui/components/menu';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiMenuItemComponent],\r\n * templateUrl: './my-component.component.html',\r\n * styleUrl: './my-component.component.scss'\r\n * })\r\n * export class MyComponent {\r\n * onItemClick(event: Event) {\r\n * console.log('Menu item clicked:', event);\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-menu-item',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './menu-item.component.html',\r\n styleUrl: './menu-item.component.scss',\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[attr.role]': '\"menuitem\"',\r\n '[attr.tabindex]': 'disabled() ? \"-1\" : tabIndex()',\r\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\r\n },\r\n})\r\nexport class FuiMenuItemComponent {\r\n /**\r\n * Menu item variant that determines the visual style\r\n * @default 'default'\r\n */\r\n readonly variant = input<MenuItemVariant, MenuItemVariant | string>('default', {\r\n transform: (v) => ((MENU_ITEM_VARIANTS as readonly string[]).includes(v) ? (v as MenuItemVariant) : 'default'),\r\n });\r\n\r\n /**\r\n * Whether the menu item is disabled\r\n * @default false\r\n */\r\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Emitted when the menu item is clicked or activated\r\n */\r\n readonly selected = output<Event>();\r\n\r\n /**\r\n * Internal tabindex for roving tabindex pattern.\r\n * Managed by the parent FuiMenuComponent.\r\n * @internal\r\n */\r\n readonly tabIndex = signal('-1');\r\n\r\n // Computed properties\r\n readonly computedClasses = computed(() => {\r\n const classes: string[] = ['fui-menu-item', `fui-menu-item--${this.variant()}`];\r\n\r\n if (this.disabled()) {\r\n classes.push('fui-menu-item--disabled');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n /** @internal */ readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly _renderer: Renderer2 = inject(Renderer2);\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: Event): void {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n this.selected.emit(event);\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n // Dispatch a synthetic click so the parent menu's click handler\r\n // can detect the activation and close the menu.\r\n this._elementRef.nativeElement.click();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Focuses the menu item\r\n */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n}\r\n","<ng-content></ng-content>\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChildren,\r\n effect,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n NgZone,\r\n input,\r\n OnDestroy,\r\n output,\r\n signal,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { FuiMenuItemComponent } from './menu-item.component';\r\n\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { fromEvent, Subscription } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { FuiConnectedPosition, FuiOverlayRef, FuiOverlayService } from '@raintonic/formaui/cdk/overlay';\r\n\r\n/**\r\n * Available menu positions relative to the trigger element\r\n */\r\nexport type FuiMenuPosition =\r\n | 'top-start'\r\n | 'top'\r\n | 'top-end'\r\n | 'bottom-start'\r\n | 'bottom'\r\n | 'bottom-end'\r\n | 'left-start'\r\n | 'left'\r\n | 'left-end'\r\n | 'right-start'\r\n | 'right'\r\n | 'right-end';\r\n\r\nexport const RT_MENU_POSITIONS = [\r\n 'top-start',\r\n 'top',\r\n 'top-end',\r\n 'bottom-start',\r\n 'bottom',\r\n 'bottom-end',\r\n 'left-start',\r\n 'left',\r\n 'left-end',\r\n 'right-start',\r\n 'right',\r\n 'right-end',\r\n] as const;\r\n\r\n/**\r\n * Available menu sizes\r\n */\r\nexport type FuiMenuSize = 'sm' | 'md' | 'lg';\r\n\r\nexport const RT_MENU_SIZES = ['sm', 'md', 'lg'] as const;\r\n\r\n/**\r\n * # FuiMenu Component\r\n *\r\n * A dropdown menu component that provides a list of options or actions.\r\n * Designed to work with external triggers using the fuiMenuTrigger directive.\r\n *\r\n * ## Features\r\n * - Multiple positioning options relative to trigger\r\n * - Keyboard navigation (Arrow keys, Enter, Escape)\r\n * - Click outside to close\r\n * - Full accessibility support (ARIA attributes, focus management)\r\n * - Customizable size variants\r\n * - Auto-positioning with collision detection\r\n * - Portal attachment to document body to avoid clipping issues\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Menu with External Trigger\r\n * ```html\r\n * <button fuiButton fuiMenuTrigger [fuiMenuTriggerFor]=\"menu\">\r\n * Open Menu\r\n * </button>\r\n * <fui-menu #menu>\r\n * <fui-menu-item>Option 1</fui-menu-item>\r\n * <fui-menu-item>Option 2</fui-menu-item>\r\n * </fui-menu>\r\n * ```\r\n *\r\n * ### Menu with Custom Position\r\n * ```html\r\n * <button fuiButton fuiMenuTrigger [fuiMenuTriggerFor]=\"menu\">\r\n * Open Menu\r\n * </button>\r\n * <fui-menu #menu position=\"top-start\" size=\"lg\">\r\n * <fui-menu-item>Profile</fui-menu-item>\r\n * <fui-menu-item variant=\"danger\">Logout</fui-menu-item>\r\n * </fui-menu>\r\n * ```\r\n *\r\n * ### Menu without Portal (for special cases)\r\n * ```html\r\n * <button fuiButton fuiMenuTrigger [fuiMenuTriggerFor]=\"menu\">\r\n * Open Menu\r\n * </button>\r\n * <fui-menu #menu [attachToBody]=\"false\">\r\n * <fui-menu-item>Option 1</fui-menu-item>\r\n * <fui-menu-item>Option 2</fui-menu-item>\r\n * </fui-menu>\r\n * ```\r\n *\r\n * ### Menu with Data Passed from Trigger\r\n * ```html\r\n * <button fuiButton fuiMenuTrigger\r\n * [fuiMenuTriggerFor]=\"dynamicMenu\"\r\n * [menuTriggerData]=\"{ user: currentUser, items: menuItems }\">\r\n * Open Menu\r\n * </button>\r\n * <fui-menu #dynamicMenu>\r\n * <!-- Access data in component using menu.menuData() -->\r\n * </fui-menu>\r\n * ```\r\n *\r\n * ```typescript\r\n * @Component({\r\n * template: `\r\n * <fui-menu #menu>\r\n * <fui-menu-item *ngFor=\"let item of menu.menuData()?.items\">\r\n * {{ item.label }}\r\n * </fui-menu-item>\r\n * </fui-menu>\r\n * `\r\n * })\r\n * export class MyComponent { }\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-menu',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './menu.component.html',\r\n styleUrl: './menu.component.scss',\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[attr.data-open]': 'isOpen() ? \"true\" : null',\r\n },\r\n})\r\nexport class FuiMenuComponent implements OnDestroy {\r\n /**\r\n * Menu position relative to the trigger element\r\n * @default 'bottom-start'\r\n */\r\n readonly position = input<FuiMenuPosition>('bottom-start');\r\n\r\n /**\r\n * Menu size variant\r\n * @default 'md'\r\n */\r\n readonly size = input<FuiMenuSize>('md');\r\n\r\n /**\r\n * Whether the menu should close when clicking outside\r\n * @default true\r\n */\r\n readonly closeOnClickOutside = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Whether the menu should close when pressing Escape\r\n * @default true\r\n */\r\n readonly closeOnEscape = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Whether the menu is disabled\r\n * @default false\r\n */\r\n readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Whether to attach the menu panel to the document body to avoid clipping issues\r\n * @default true\r\n */\r\n readonly attachToBody = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Emitted when the menu open state changes\r\n */\r\n readonly openChange = output<boolean>();\r\n\r\n /**\r\n * Emitted when a menu item is selected\r\n */\r\n readonly itemSelected = output<Event>();\r\n\r\n // Internal state\r\n protected readonly _isOpen = signal(false);\r\n protected readonly _animationState = signal<'void' | 'enter' | 'leave'>('void');\r\n private readonly _triggerElement = signal<HTMLElement | null>(null);\r\n private readonly _menuData = signal<unknown>(null);\r\n private _previousFocusedElement: HTMLElement | null = null;\r\n private _overlayRef: FuiOverlayRef | null = null;\r\n private _overlaySubscriptions = new Subscription();\r\n private _closeAnimationTimeout: number | null = null;\r\n\r\n // Computed properties\r\n readonly computedClasses = computed(() => {\r\n const classes: string[] = ['fui-menu', `fui-menu--${this.position()}`, `fui-menu--${this.size()}`];\r\n\r\n if (this.disabled()) {\r\n classes.push('fui-menu--disabled');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n // Injected dependencies\r\n private readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly _overlayService: FuiOverlayService = inject(FuiOverlayService);\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _ngZone = inject(NgZone);\r\n private _outsideClickSub?: Subscription;\r\n\r\n // View references\r\n @ViewChild('menuPanel', { static: false }) menuPanel?: ElementRef<HTMLElement>;\r\n\r\n // Content children for roving tabindex management\r\n private readonly _menuItems = contentChildren(FuiMenuItemComponent, { descendants: true });\r\n\r\n constructor() {\r\n // Handle open state changes with animation\r\n effect(() => {\r\n if (this._isOpen()) {\r\n requestAnimationFrame(() => {\r\n this._animationState.set('enter');\r\n this._openMenu();\r\n });\r\n } else {\r\n this._startCloseAnimation();\r\n }\r\n });\r\n\r\n // Emit open change events\r\n effect(() => {\r\n this.openChange.emit(this._isOpen());\r\n });\r\n }\r\n\r\n /**\r\n * Whether the menu is currently open\r\n */\r\n isOpen(): boolean {\r\n return this._isOpen();\r\n }\r\n\r\n /**\r\n * Opens the menu\r\n */\r\n open(): void {\r\n if (this.disabled()) return;\r\n this._isOpen.set(true);\r\n }\r\n\r\n /**\r\n * Closes the menu\r\n */\r\n close(): void {\r\n this._isOpen.set(false);\r\n }\r\n\r\n /**\r\n * Toggles the menu open/closed state\r\n */\r\n toggle(): void {\r\n if (this._isOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the trigger element for positioning (called by trigger directive)\r\n */\r\n setTriggerElement(element: HTMLElement): void {\r\n this._triggerElement.set(element);\r\n }\r\n\r\n /**\r\n * Gets the menu data passed from the trigger\r\n * Returns a signal containing the data\r\n */\r\n menuData(): unknown {\r\n return this._menuData();\r\n }\r\n\r\n /**\r\n * Sets the menu data (called by trigger directive)\r\n * @param data The data to pass to the menu\r\n */\r\n setMenuData(data: unknown): void {\r\n this._menuData.set(data);\r\n }\r\n\r\n // Start listening for outside clicks when menu opens\r\n private _listenForOutsideClicks(): void {\r\n this._outsideClickSub?.unsubscribe();\r\n\r\n if (!this.closeOnClickOutside()) return;\r\n\r\n this._ngZone.runOutsideAngular(() => {\r\n setTimeout(() => {\r\n this._outsideClickSub = fromEvent<MouseEvent>(this._document, 'click')\r\n .pipe(\r\n filter(() => this._isOpen()),\r\n filter((event) => {\r\n const target = event.target as HTMLElement;\r\n const menuElement = this._elementRef.nativeElement;\r\n const triggerElement = this._triggerElement();\r\n return !menuElement.contains(target) && !triggerElement?.contains(target);\r\n }),\r\n )\r\n .subscribe(() => {\r\n this._ngZone.run(() => {\r\n this.close();\r\n });\r\n });\r\n });\r\n });\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onDocumentKeydown(event: KeyboardEvent): void {\r\n if (!this._isOpen() || !this._isTopmostOverlay()) {\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case 'Escape':\r\n if (this.closeOnEscape()) {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n break;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._focusNextItem();\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._focusPreviousItem();\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._focusFirstItem();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._focusLastItem();\r\n break;\r\n }\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onMenuClick(event: Event): void {\r\n // Check if the click was on a menu item\r\n const target = event.target as HTMLElement;\r\n const menuItem = target.closest('fui-menu-item');\r\n\r\n if (menuItem && this._isOpen()) {\r\n // Emit the itemSelected event and close the menu\r\n this.itemSelected.emit(event);\r\n this.close();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._clearCloseTimeout();\r\n this._outsideClickSub?.unsubscribe();\r\n this._restoreFocus();\r\n this._disposeOverlay();\r\n }\r\n\r\n private _openMenu(): void {\r\n // Create overlay after the view updates\r\n requestAnimationFrame(() => {\r\n this._createOverlay();\r\n this._listenForOutsideClicks();\r\n\r\n const triggerElement = this._triggerElement();\r\n if (triggerElement) {\r\n triggerElement.setAttribute('aria-expanded', 'true');\r\n this._previousFocusedElement = document.activeElement as HTMLElement;\r\n }\r\n });\r\n }\r\n\r\n private _closeMenu(): void {\r\n this._outsideClickSub?.unsubscribe();\r\n const triggerElement = this._triggerElement();\r\n if (triggerElement) {\r\n triggerElement.setAttribute('aria-expanded', 'false');\r\n }\r\n\r\n // Reset roving tabindex on all items\r\n this._resetRovingTabindex();\r\n\r\n this._disposeOverlay();\r\n this._restoreFocus();\r\n }\r\n\r\n private _createOverlay(): void {\r\n if (this._overlayRef || !this.menuPanel) {\r\n return;\r\n }\r\n\r\n const triggerElement = this._triggerElement();\r\n if (!triggerElement) {\r\n return;\r\n }\r\n\r\n // Create overlay with positioning strategy\r\n const positions = this._getPositionsForMenuPosition(this.position());\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(triggerElement, positions)\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n // Create overlay\r\n this._overlayRef = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: this.closeOnClickOutside()\r\n ? this._overlayService.scrollStrategies.close()\r\n : this._overlayService.scrollStrategies.reposition(),\r\n hasBackdrop: this.closeOnClickOutside(),\r\n backdropClass: 'fui-menu-backdrop',\r\n backdropClickBehavior: 'close',\r\n panelClass: ['fui-menu-panel', `fui-menu-panel--${this.size()}`],\r\n });\r\n\r\n // Track overlay subscriptions for proper cleanup\r\n this._overlaySubscriptions.unsubscribe();\r\n this._overlaySubscriptions = new Subscription();\r\n\r\n if (this.closeOnClickOutside()) {\r\n this._overlaySubscriptions.add(\r\n this._overlayRef.backdropClick.subscribe(() => {\r\n this.close();\r\n }),\r\n );\r\n }\r\n\r\n if (this.closeOnEscape()) {\r\n this._overlaySubscriptions.add(\r\n this._overlayRef.keydownEvents.subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n this.close();\r\n }\r\n }),\r\n );\r\n }\r\n\r\n // Attach menu panel to overlay\r\n const menuElement = this.menuPanel.nativeElement;\r\n this._overlayRef.attach(menuElement);\r\n\r\n // Focus first item after attachment\r\n setTimeout(() => {\r\n this._focusFirstItem();\r\n }, 0);\r\n }\r\n\r\n private _getPositionsForMenuPosition(position: FuiMenuPosition): FuiConnectedPosition[] {\r\n const offset = 4;\r\n\r\n switch (position) {\r\n case 'bottom-start':\r\n return [\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\r\n ];\r\n case 'bottom':\r\n return [\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\r\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\r\n ];\r\n case 'bottom-end':\r\n return [\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\r\n ];\r\n case 'top-start':\r\n return [\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset },\r\n ];\r\n case 'top':\r\n return [\r\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset },\r\n ];\r\n case 'top-end':\r\n return [\r\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -offset },\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: offset },\r\n ];\r\n case 'right-start':\r\n return [\r\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\r\n ];\r\n case 'right':\r\n return [\r\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\r\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\r\n ];\r\n case 'right-end':\r\n return [\r\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\r\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\r\n ];\r\n case 'left-start':\r\n return [\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\r\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\r\n ];\r\n case 'left':\r\n return [\r\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset },\r\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset },\r\n ];\r\n case 'left-end':\r\n return [\r\n { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom', offsetX: -offset },\r\n { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom', offsetX: offset },\r\n ];\r\n default:\r\n return [{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: offset }];\r\n }\r\n }\r\n\r\n private _restoreFocus(): void {\r\n // Prefer the trigger element for focus restoration\r\n const triggerElement = this._triggerElement();\r\n if (triggerElement) {\r\n triggerElement.focus();\r\n } else if (this._previousFocusedElement) {\r\n this._previousFocusedElement.focus();\r\n }\r\n this._previousFocusedElement = null;\r\n }\r\n\r\n private _getMenuItems(): HTMLElement[] {\r\n const menuElement = this.menuPanel?.nativeElement;\r\n if (!menuElement) return [];\r\n\r\n return Array.from(menuElement.querySelectorAll('fui-menu-item:not([aria-disabled=\"true\"])'));\r\n }\r\n\r\n /** @internal Called by FuiMenuTriggerDirective */\r\n _focusFirstItem(): void {\r\n const items = this._getMenuItems();\r\n if (items.length > 0) {\r\n this._focusItem(items[0]);\r\n }\r\n }\r\n\r\n /** @internal Called by FuiMenuTriggerDirective */\r\n _focusLastItem(): void {\r\n const items = this._getMenuItems();\r\n if (items.length > 0) {\r\n this._focusItem(items[items.length - 1]);\r\n }\r\n }\r\n\r\n private _focusNextItem(): void {\r\n const items = this._getMenuItems();\r\n if (items.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = items.findIndex((item) => item === document.activeElement);\r\n const nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\r\n this._focusItem(items[nextIndex]);\r\n }\r\n\r\n private _focusPreviousItem(): void {\r\n const items = this._getMenuItems();\r\n if (items.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = items.findIndex((item) => item === document.activeElement);\r\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\r\n this._focusItem(items[prevIndex]);\r\n }\r\n\r\n /**\r\n * Focuses a menu item and updates roving tabindex across all items.\r\n */\r\n private _focusItem(element: HTMLElement): void {\r\n this._updateRovingTabindex(element);\r\n element.focus();\r\n }\r\n\r\n /**\r\n * Resets all items to tabindex=\"-1\" when the menu closes.\r\n */\r\n private _resetRovingTabindex(): void {\r\n const items = this._menuItems();\r\n for (const item of items) {\r\n item.tabIndex.set('-1');\r\n }\r\n }\r\n\r\n /**\r\n * Updates roving tabindex: sets tabindex=\"0\" on the target item\r\n * and tabindex=\"-1\" on all other items.\r\n */\r\n private _updateRovingTabindex(targetElement: HTMLElement): void {\r\n const items = this._menuItems();\r\n for (const item of items) {\r\n if (item._elementRef.nativeElement === targetElement) {\r\n item.tabIndex.set('0');\r\n } else {\r\n item.tabIndex.set('-1');\r\n }\r\n }\r\n }\r\n\r\n private _disposeOverlay(): void {\r\n this._overlaySubscriptions.unsubscribe();\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n }\r\n\r\n private _startCloseAnimation(): void {\r\n // Clear any existing timeout\r\n this._clearCloseTimeout();\r\n\r\n // Trigger leave animation\r\n this._animationState.set('leave');\r\n\r\n // Wait for animation to complete before closing (matches CSS transition duration)\r\n this._closeAnimationTimeout = window.setTimeout(() => {\r\n this._closeMenu();\r\n this._animationState.set('void');\r\n }, 150); // Match the CSS transition duration\r\n }\r\n\r\n private _clearCloseTimeout(): void {\r\n if (this._closeAnimationTimeout !== null) {\r\n clearTimeout(this._closeAnimationTimeout);\r\n this._closeAnimationTimeout = null;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if this menu's overlay is the topmost (most recently opened) overlay.\r\n * This ensures that only the topmost menu responds to keyboard events when\r\n * multiple menus are open (e.g., nested menus).\r\n */\r\n private _isTopmostOverlay(): boolean {\r\n if (!this._overlayRef) {\r\n return false;\r\n }\r\n\r\n const activeOverlays = this._overlayService.getActiveOverlays();\r\n\r\n // The last overlay in the array is the most recently created (topmost)\r\n const topmostOverlay = activeOverlays[activeOverlays.length - 1];\r\n\r\n return topmostOverlay === this._overlayRef;\r\n }\r\n}\r\n","@if (_isOpen() || _animationState() === 'leave') {\r\n <div class=\"fui-menu__panel\" #menuPanel role=\"menu\" [attr.data-animation-state]=\"_animationState()\">\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n","import { Directive, ElementRef, inject, HostListener, input, effect, AfterViewInit } from '@angular/core';\r\nimport { FuiMenuComponent } from './menu.component';\r\n\r\n/**\r\n * # fuiMenuTrigger Directive\r\n *\r\n * A directive that marks an element as a menu trigger, similar to Angular Material's matMenuTriggerFor.\r\n * This directive should be used in conjunction with FuiMenuComponent.\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Usage\r\n * ```html\r\n * <button fuiMenuTrigger [menuTriggerFor]=\"menu\">Open Menu</button>\r\n * <fui-menu #menu>\r\n * <fui-menu-item>Option 1</fui-menu-item>\r\n * <fui-menu-item>Option 2</fui-menu-item>\r\n * </fui-menu>\r\n * ```\r\n *\r\n * ### With Menu Reference\r\n * ```html\r\n * <button fuiMenuTrigger [menuTriggerFor]=\"userMenu\">\r\n * <fui-icon name=\"user\"></fui-icon>\r\n * User Menu\r\n * </button>\r\n *\r\n * <fui-menu #userMenu position=\"bottom-end\">\r\n * <fui-menu-item>Profile</fui-menu-item>\r\n * <fui-menu-item>Settings</fui-menu-item>\r\n * <fui-menu-item variant=\"danger\">Logout</fui-menu-item>\r\n * </fui-menu>\r\n * ```\r\n *\r\n * ### Passing Data to Menu\r\n * ```html\r\n * <button fuiMenuTrigger\r\n * [menuTriggerFor]=\"dynamicMenu\"\r\n * [menuTriggerData]=\"{ user: currentUser, role: 'admin' }\">\r\n * Open Menu\r\n * </button>\r\n *\r\n * <fui-menu #dynamicMenu>\r\n * <!-- Access menu data in your component via menu.menuData() -->\r\n * </fui-menu>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiMenuTriggerDirective, FuiMenuComponent, FuiMenuItemComponent } from '@raintonic/formaui/components/menu';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiMenuTriggerDirective, FuiMenuComponent, FuiMenuItemComponent],\r\n * template: `\r\n * <button fuiMenuTrigger [menuTriggerFor]=\"menu\">Open Menu</button>\r\n * <fui-menu #menu>\r\n * <fui-menu-item>Option 1</fui-menu-item>\r\n * <fui-menu-item>Option 2</fui-menu-item>\r\n * </fui-menu>\r\n * `\r\n * })\r\n * export class MyComponent { }\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiMenuTrigger]',\r\n standalone: true,\r\n host: {\r\n '[attr.aria-haspopup]': '\"true\"',\r\n '[attr.aria-expanded]': 'menu?.isOpen() ? \"true\" : \"false\"',\r\n },\r\n})\r\nexport class FuiMenuTriggerDirective implements AfterViewInit {\r\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n /** The menu instance that this trigger should open */\r\n readonly menuTriggerFor = input<FuiMenuComponent | null>();\r\n\r\n /**\r\n * Data to be passed to the menu.\r\n * Can be accessed in the menu component or menu items.\r\n * Similar to Angular Material's matMenuTriggerData.\r\n */\r\n readonly menuTriggerData = input<unknown>();\r\n\r\n /** The menu instance that this trigger is associated with */\r\n menu: FuiMenuComponent | null = null;\r\n\r\n constructor() {\r\n // Set up the menu reference when fuiMenuTriggerFor changes\r\n effect(() => {\r\n const menuRef = this.menuTriggerFor();\r\n if (menuRef) {\r\n this.menu = menuRef;\r\n // Set the trigger element on the menu for positioning\r\n menuRef.setTriggerElement(this._elementRef.nativeElement);\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Ensure the menu reference is set after view initialization\r\n const menuRef = this.menuTriggerFor();\r\n\r\n if (menuRef) {\r\n this.menu = menuRef;\r\n menuRef.setTriggerElement(this._elementRef.nativeElement);\r\n }\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: Event): void {\r\n if (this.menu) {\r\n event.preventDefault();\r\n\r\n // Update trigger element to ensure correct positioning when multiple triggers exist\r\n this.menu.setTriggerElement(this._elementRef.nativeElement);\r\n\r\n // Pass data to menu before opening/toggling\r\n const data = this.menuTriggerData();\r\n if (data !== undefined && this.menu.setMenuData) {\r\n this.menu.setMenuData(data);\r\n }\r\n\r\n this.menu.toggle();\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n const menu = this.menu;\r\n if (!menu) return;\r\n\r\n // Update trigger element and pass data to menu before opening\r\n const prepareMenu = (): void => {\r\n // Update trigger element to ensure correct positioning when multiple triggers exist\r\n menu.setTriggerElement(this._elementRef.nativeElement);\r\n\r\n // Pass data to menu\r\n const data = this.menuTriggerData();\r\n if (data !== undefined) {\r\n menu.setMenuData(data);\r\n }\r\n };\r\n\r\n switch (event.key) {\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n prepareMenu();\r\n menu.toggle();\r\n break;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n prepareMenu();\r\n menu.open();\r\n // Focus first item after menu opens\r\n setTimeout(() => {\r\n menu._focusFirstItem();\r\n }, 0);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n prepareMenu();\r\n menu.open();\r\n // Focus last item after menu opens\r\n setTimeout(() => {\r\n menu._focusLastItem();\r\n }, 0);\r\n break;\r\n }\r\n }\r\n\r\n /** Gets the trigger element */\r\n getElement(): HTMLElement {\r\n return this._elementRef.nativeElement;\r\n }\r\n}\r\n","// Public API for menu components\r\nexport * from './menu.component';\r\nexport * from './menu-item.component';\r\nexport * from './menu-trigger.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -310,7 +310,7 @@ class FuiNumberInputComponent {
310
310
  provide: FUI_FORM_FIELD_CONTROL,
311
311
  useExisting: FuiNumberInputComponent,
312
312
  },
313
- ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"fui-number-input__wrapper\">\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\n (click)=\"decrement()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Decrease value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"minus\" size=\"sm\"></fui-icon>\n </button>\n }\n\n <input\n #inputElement\n class=\"fui-number-input__input\"\n type=\"text\"\n inputmode=\"decimal\"\n [attr.placeholder]=\"placeholder()\"\n [attr.disabled]=\"disabled() ? '' : null\"\n [attr.readonly]=\"readonly() ? '' : null\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-invalid]=\"errorState()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-describedby]=\"_ariaDescribedby\"\n role=\"spinbutton\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\n (click)=\"increment()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Increase value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"plus\" size=\"sm\"></fui-icon>\n </button>\n }\n @if (showButtons() && buttonLayout() === 'vertical') {\n <div class=\"fui-number-input__btn-stack\">\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\n (click)=\"increment()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Increase value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"caret-up\" size=\"sm\"></fui-icon>\n </button>\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\n (click)=\"decrement()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Decrease value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\n </button>\n </div>\n }\n</div>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-number-input{display:block;margin:0 -.6rem}.fui-number-input__wrapper{display:flex;flex-direction:row;align-items:stretch}.fui-number-input__input{flex:1 1 auto;min-width:0;border:none;outline:none;background:transparent;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-normal);color:var(--fui-text-primary);width:100%;box-sizing:border-box;padding:0 .5rem;text-align:left;transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__input::-webkit-outer-spin-button,.fui-number-input__input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.fui-number-input__input{-moz-appearance:textfield}.fui-number-input__input::placeholder{color:var(--fui-text-disabled);opacity:1}.fui-number-input__input:focus{outline:none}.fui-number-input__input:focus-visible{outline:none}.fui-number-input__input:disabled{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary);cursor:not-allowed}.fui-number-input__input[readonly]{cursor:default}.fui-number-input__btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-number-input__btn:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-number-input__btn{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:2rem;height:auto;border:none;margin:-.6rem 0;padding:0 .5rem;background:transparent;color:var(--fui-text-secondary);transition:color,background-color,opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__btn:hover:not(:disabled){color:var(--fui-primary);background-color:var(--fui-primary-10)}.fui-number-input__btn:active:not(:disabled){color:var(--fui-primary-80);background-color:var(--fui-primary-20)}.fui-number-input__btn:disabled{opacity:.4;cursor:not-allowed}.fui-number-input__btn--decrement{border-right:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn--increment{border-left:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn-stack{display:flex;flex-direction:column;border-left:var(--fui-border-width-sm) solid var(--fui-border-color);margin:-.5rem 0}.fui-number-input__btn-stack .fui-number-input__btn{flex:1 1 50%;width:1.75rem;border-left:none;border-right:none;margin:0}.fui-number-input__btn-stack .fui-number-input__btn--increment{border-bottom:var(--fui-border-width-sm) solid var(--fui-border-color);border-left:none}.fui-number-input__btn-stack .fui-number-input__btn--decrement{border-right:none}.fui-number-input--disabled .fui-number-input__input{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
313
+ ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"fui-number-input__wrapper\">\r\n @if (showButtons() && buttonLayout() === 'horizontal') {\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\r\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\r\n (click)=\"decrement()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Decrease value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"minus\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n\r\n <input\r\n #inputElement\r\n class=\"fui-number-input__input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n [attr.placeholder]=\"placeholder()\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [attr.readonly]=\"readonly() ? '' : null\"\r\n [attr.aria-valuenow]=\"value()\"\r\n [attr.aria-valuemin]=\"min()\"\r\n [attr.aria-valuemax]=\"max()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-required]=\"required() ? 'true' : null\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n role=\"spinbutton\"\r\n (input)=\"onInput($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n @if (showButtons() && buttonLayout() === 'horizontal') {\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\r\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\r\n (click)=\"increment()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Increase value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"plus\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n @if (showButtons() && buttonLayout() === 'vertical') {\r\n <div class=\"fui-number-input__btn-stack\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\r\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\r\n (click)=\"increment()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Increase value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"caret-up\" size=\"sm\"></fui-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\r\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\r\n (click)=\"decrement()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Decrease value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n }\r\n</div>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-number-input{display:block;margin:0 -.6rem}.fui-number-input__wrapper{display:flex;flex-direction:row;align-items:stretch}.fui-number-input__input{flex:1 1 auto;min-width:0;border:none;outline:none;background:transparent;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-normal);color:var(--fui-text-primary);width:100%;box-sizing:border-box;padding:0 .5rem;text-align:left;transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__input::-webkit-outer-spin-button,.fui-number-input__input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.fui-number-input__input{-moz-appearance:textfield}.fui-number-input__input::placeholder{color:var(--fui-text-disabled);opacity:1}.fui-number-input__input:focus{outline:none}.fui-number-input__input:focus-visible{outline:none}.fui-number-input__input:disabled{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary);cursor:not-allowed}.fui-number-input__input[readonly]{cursor:default}.fui-number-input__btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-number-input__btn:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-number-input__btn{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:2rem;height:auto;border:none;margin:-.6rem 0;padding:0 .5rem;background:transparent;color:var(--fui-text-secondary);transition:color,background-color,opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__btn:hover:not(:disabled){color:var(--fui-primary);background-color:var(--fui-primary-10)}.fui-number-input__btn:active:not(:disabled){color:var(--fui-primary-80);background-color:var(--fui-primary-20)}.fui-number-input__btn:disabled{opacity:.4;cursor:not-allowed}.fui-number-input__btn--decrement{border-right:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn--increment{border-left:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn-stack{display:flex;flex-direction:column;border-left:var(--fui-border-width-sm) solid var(--fui-border-color);margin:-.5rem 0}.fui-number-input__btn-stack .fui-number-input__btn{flex:1 1 50%;width:1.75rem;border-left:none;border-right:none;margin:0}.fui-number-input__btn-stack .fui-number-input__btn--increment{border-bottom:var(--fui-border-width-sm) solid var(--fui-border-color);border-left:none}.fui-number-input__btn-stack .fui-number-input__btn--decrement{border-right:none}.fui-number-input--disabled .fui-number-input__input{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary)}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
314
314
  }
315
315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiNumberInputComponent, decorators: [{
316
316
  type: Component,
@@ -334,7 +334,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
334
334
  provide: FUI_FORM_FIELD_CONTROL,
335
335
  useExisting: FuiNumberInputComponent,
336
336
  },
337
- ], template: "<div class=\"fui-number-input__wrapper\">\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\n (click)=\"decrement()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Decrease value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"minus\" size=\"sm\"></fui-icon>\n </button>\n }\n\n <input\n #inputElement\n class=\"fui-number-input__input\"\n type=\"text\"\n inputmode=\"decimal\"\n [attr.placeholder]=\"placeholder()\"\n [attr.disabled]=\"disabled() ? '' : null\"\n [attr.readonly]=\"readonly() ? '' : null\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-invalid]=\"errorState()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-describedby]=\"_ariaDescribedby\"\n role=\"spinbutton\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\n (click)=\"increment()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Increase value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"plus\" size=\"sm\"></fui-icon>\n </button>\n }\n @if (showButtons() && buttonLayout() === 'vertical') {\n <div class=\"fui-number-input__btn-stack\">\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\n (click)=\"increment()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Increase value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"caret-up\" size=\"sm\"></fui-icon>\n </button>\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\n (click)=\"decrement()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Decrease value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\n </button>\n </div>\n }\n</div>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-number-input{display:block;margin:0 -.6rem}.fui-number-input__wrapper{display:flex;flex-direction:row;align-items:stretch}.fui-number-input__input{flex:1 1 auto;min-width:0;border:none;outline:none;background:transparent;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-normal);color:var(--fui-text-primary);width:100%;box-sizing:border-box;padding:0 .5rem;text-align:left;transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__input::-webkit-outer-spin-button,.fui-number-input__input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.fui-number-input__input{-moz-appearance:textfield}.fui-number-input__input::placeholder{color:var(--fui-text-disabled);opacity:1}.fui-number-input__input:focus{outline:none}.fui-number-input__input:focus-visible{outline:none}.fui-number-input__input:disabled{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary);cursor:not-allowed}.fui-number-input__input[readonly]{cursor:default}.fui-number-input__btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-number-input__btn:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-number-input__btn{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:2rem;height:auto;border:none;margin:-.6rem 0;padding:0 .5rem;background:transparent;color:var(--fui-text-secondary);transition:color,background-color,opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__btn:hover:not(:disabled){color:var(--fui-primary);background-color:var(--fui-primary-10)}.fui-number-input__btn:active:not(:disabled){color:var(--fui-primary-80);background-color:var(--fui-primary-20)}.fui-number-input__btn:disabled{opacity:.4;cursor:not-allowed}.fui-number-input__btn--decrement{border-right:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn--increment{border-left:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn-stack{display:flex;flex-direction:column;border-left:var(--fui-border-width-sm) solid var(--fui-border-color);margin:-.5rem 0}.fui-number-input__btn-stack .fui-number-input__btn{flex:1 1 50%;width:1.75rem;border-left:none;border-right:none;margin:0}.fui-number-input__btn-stack .fui-number-input__btn--increment{border-bottom:var(--fui-border-width-sm) solid var(--fui-border-color);border-left:none}.fui-number-input__btn-stack .fui-number-input__btn--decrement{border-right:none}.fui-number-input--disabled .fui-number-input__input{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary)}\n"] }]
337
+ ], template: "<div class=\"fui-number-input__wrapper\">\r\n @if (showButtons() && buttonLayout() === 'horizontal') {\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\r\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\r\n (click)=\"decrement()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Decrease value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"minus\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n\r\n <input\r\n #inputElement\r\n class=\"fui-number-input__input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n [attr.placeholder]=\"placeholder()\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [attr.readonly]=\"readonly() ? '' : null\"\r\n [attr.aria-valuenow]=\"value()\"\r\n [attr.aria-valuemin]=\"min()\"\r\n [attr.aria-valuemax]=\"max()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-required]=\"required() ? 'true' : null\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n role=\"spinbutton\"\r\n (input)=\"onInput($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n @if (showButtons() && buttonLayout() === 'horizontal') {\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\r\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\r\n (click)=\"increment()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Increase value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"plus\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n @if (showButtons() && buttonLayout() === 'vertical') {\r\n <div class=\"fui-number-input__btn-stack\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\r\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\r\n (click)=\"increment()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Increase value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"caret-up\" size=\"sm\"></fui-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\r\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\r\n (click)=\"decrement()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Decrease value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n }\r\n</div>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-number-input{display:block;margin:0 -.6rem}.fui-number-input__wrapper{display:flex;flex-direction:row;align-items:stretch}.fui-number-input__input{flex:1 1 auto;min-width:0;border:none;outline:none;background:transparent;font-family:var(--fui-font-family-sans);font-size:var(--fui-font-size-02);font-weight:var(--fui-font-weight-regular);line-height:var(--fui-line-height-02);letter-spacing:var(--fui-letter-spacing-normal);color:var(--fui-text-primary);width:100%;box-sizing:border-box;padding:0 .5rem;text-align:left;transition:color var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__input::-webkit-outer-spin-button,.fui-number-input__input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.fui-number-input__input{-moz-appearance:textfield}.fui-number-input__input::placeholder{color:var(--fui-text-disabled);opacity:1}.fui-number-input__input:focus{outline:none}.fui-number-input__input:focus-visible{outline:none}.fui-number-input__input:disabled{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary);cursor:not-allowed}.fui-number-input__input[readonly]{cursor:default}.fui-number-input__btn{background:none;border:none;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;outline:none}.fui-number-input__btn:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-number-input__btn{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:2rem;height:auto;border:none;margin:-.6rem 0;padding:0 .5rem;background:transparent;color:var(--fui-text-secondary);transition:color,background-color,opacity var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-number-input__btn:hover:not(:disabled){color:var(--fui-primary);background-color:var(--fui-primary-10)}.fui-number-input__btn:active:not(:disabled){color:var(--fui-primary-80);background-color:var(--fui-primary-20)}.fui-number-input__btn:disabled{opacity:.4;cursor:not-allowed}.fui-number-input__btn--decrement{border-right:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn--increment{border-left:var(--fui-border-width-sm) solid var(--fui-border-color)}.fui-number-input__btn-stack{display:flex;flex-direction:column;border-left:var(--fui-border-width-sm) solid var(--fui-border-color);margin:-.5rem 0}.fui-number-input__btn-stack .fui-number-input__btn{flex:1 1 50%;width:1.75rem;border-left:none;border-right:none;margin:0}.fui-number-input__btn-stack .fui-number-input__btn--increment{border-bottom:var(--fui-border-width-sm) solid var(--fui-border-color);border-left:none}.fui-number-input__btn-stack .fui-number-input__btn--decrement{border-right:none}.fui-number-input--disabled .fui-number-input__input{color:var(--fui-text-secondary);-webkit-text-fill-color:var(--fui-text-secondary)}\n"] }]
338
338
  }], ctorParameters: () => [], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], precision: [{ type: i0.Input, args: [{ isSignal: true, alias: "precision", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], showButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showButtons", required: false }] }], buttonLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "buttonLayout", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], inputElement: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }] } });
339
339
 
340
340
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-number-input.mjs","sources":["../../../lib/components/number-input/number-input.component.ts","../../../lib/components/number-input/number-input.component.html","../../../lib/components/number-input/raintonic-formaui-components-number-input.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n output,\n computed,\n signal,\n viewChild,\n ElementRef,\n WritableSignal,\n Signal,\n OnDestroy,\n DoCheck,\n inject,\n effect,\n booleanAttribute,\n} from '@angular/core';\n\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, FormGroupDirective, NgForm } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl } from '@raintonic/formaui/core';\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\nimport { NumberInputButtonLayout } from './number-input.types';\n\n/**\n * # NumberInput Component\n *\n * A numeric input component with increment/decrement buttons,\n * full Angular Reactive Forms support, and FormField integration.\n *\n * ## Features\n * - Full Reactive Forms integration (ControlValueAccessor)\n * - FuiFormFieldControl integration for fui-form-field\n * - Increment/decrement buttons (horizontal or vertical layout)\n * - Min/max clamping and step support\n * - Configurable decimal precision\n * - Keyboard support (ArrowUp/ArrowDown)\n * - Error state handling\n * - Accessibility (ARIA spinbutton role)\n *\n * ## Usage\n *\n * ### Basic\n * ```html\n * <fui-form-field>\n * <fui-label>Quantity</fui-label>\n * <fui-number-input formControlName=\"quantity\" [min]=\"0\" [max]=\"100\" [step]=\"1\"></fui-number-input>\n * </fui-form-field>\n * ```\n *\n * ### With vertical buttons\n * ```html\n * <fui-form-field>\n * <fui-label>Price</fui-label>\n * <fui-number-input formControlName=\"price\" [step]=\"0.01\" [precision]=\"2\" buttonLayout=\"vertical\"></fui-number-input>\n * </fui-form-field>\n * ```\n */\n@Component({\n selector: 'fui-number-input',\n standalone: true,\n imports: [FuiIconComponent],\n templateUrl: './number-input.component.html',\n styleUrls: ['./number-input.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-number-input',\n '[class.fui-number-input--disabled]': 'disabled()',\n '[class.fui-number-input--readonly]': 'readonly()',\n '[class.fui-number-input--focused]': 'focused()',\n '[class.fui-number-input--error]': 'errorState()',\n '[class.fui-number-input--has-buttons]': 'showButtons()',\n '[class.fui-number-input--horizontal]': 'buttonLayout() === \"horizontal\"',\n '[class.fui-number-input--vertical]': 'buttonLayout() === \"vertical\"',\n '[attr.id]': 'id',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: FuiNumberInputComponent,\n multi: true,\n },\n {\n provide: FUI_FORM_FIELD_CONTROL,\n useExisting: FuiNumberInputComponent,\n },\n ],\n})\nexport class FuiNumberInputComponent implements ControlValueAccessor, FuiFormFieldControl<number>, DoCheck, OnDestroy {\n // Static properties\n static nextId = 0;\n readonly controlType = 'fui-number-input';\n\n // Inputs\n readonly min = input<number | null>(null);\n readonly max = input<number | null>(null);\n readonly step = input(1);\n readonly precision = input<number | null>(null);\n readonly placeholder = input('');\n readonly disabledInput = input<boolean, unknown>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n readonly readonly = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n readonly showButtons = input<boolean, unknown>(true, {\n transform: booleanAttribute,\n });\n readonly buttonLayout = input<NumberInputButtonLayout>('horizontal');\n readonly errorStateMatcher = input<ErrorStateMatcher | null>(null);\n\n // Outputs\n readonly valueChange = output<number | null>();\n\n // Internal state\n private readonly _value: WritableSignal<number | null> = signal(null);\n private readonly _focused: WritableSignal<boolean> = signal(false);\n private readonly _disabled: WritableSignal<boolean> = signal(false);\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\n private readonly _errorState: WritableSignal<boolean> = signal(false);\n private readonly _required: WritableSignal<boolean> = signal(false);\n\n // Public signals\n readonly value: Signal<number | null> = this._value.asReadonly();\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n readonly errorState: Signal<boolean> = this._errorState.asReadonly();\n readonly required: Signal<boolean> = this._required.asReadonly();\n readonly disabled: Signal<boolean> = computed(\n () => this._disabled() || this.disabledInput() || this._ngControlDisabled(),\n );\n\n // Computed\n readonly empty = computed(() => this._value() === null);\n\n readonly _isAtMin = computed(() => {\n const val = this._value();\n const minVal = this.min();\n if (val === null || minVal === null) return false;\n return val <= minVal;\n });\n\n readonly _isAtMax = computed(() => {\n const val = this._value();\n const maxVal = this.max();\n if (val === null || maxVal === null) return false;\n return val >= maxVal;\n });\n\n // State changes subject for form field compatibility\n readonly stateChanges = new Subject<void>();\n private _uid = `fui-number-input-${FuiNumberInputComponent.nextId++}`;\n readonly id = this._uid;\n _ariaDescribedby: string | null = null;\n\n // Form control references\n private _parentForm = inject(NgForm, { optional: true });\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\n private readonly _ngControlRef = injectNgControl();\n get ngControl(): NgControl | null {\n return this._ngControlRef.ngControl;\n }\n\n // ViewChild for input element\n readonly inputElement = viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n // ControlValueAccessor callbacks\n private _onChange: (value: number | null) => void = () => {\n /* noop */\n };\n private _onTouched: () => void = () => {\n /* noop */\n };\n\n constructor() {\n void Promise.resolve().then(() => {\n if (this._ngControlRef.ngControl) {\n this._ngControlRef.ngControl.valueAccessor = this;\n }\n });\n\n // Effect to emit state changes\n effect(() => {\n this.min();\n this.max();\n this.step();\n this.precision();\n this.placeholder();\n this.disabledInput();\n this.readonly();\n this.showButtons();\n this.buttonLayout();\n this.errorStateMatcher();\n this._value();\n this._focused();\n this._disabled();\n this._ngControlDisabled();\n this._required();\n this._errorState();\n\n this.stateChanges.next();\n });\n }\n\n ngDoCheck(): void {\n if (this.ngControl) {\n updateErrorState(\n this.ngControl,\n this._errorState,\n this.errorStateMatcher(),\n this._defaultErrorStateMatcher,\n this._parentForm,\n this._parentFormGroup,\n this.stateChanges,\n );\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\n }\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: number | null): void {\n const v = value ?? null;\n this._value.set(v);\n this._syncInputElement();\n this.stateChanges.next();\n }\n\n registerOnChange(fn: (value: number | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled);\n this.stateChanges.next();\n }\n\n // FuiFormFieldControl implementation\n onContainerClick(_event: MouseEvent): void {\n if (!this._focused()) {\n this.focus();\n }\n }\n\n setDescribedByIds(ids: string[]): void {\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\n }\n\n setReadOnly?(_readOnly: boolean): void {\n // Handled via input signal, but required by interface\n }\n\n // Public API\n focus(): void {\n this.inputElement()?.nativeElement.focus();\n }\n\n increment(): void {\n if (this.disabled() || this.readonly()) return;\n const current = this._value() ?? 0;\n const newVal = this._clamp(this._roundToPrecision(current + this.step()));\n this._setValue(newVal);\n }\n\n decrement(): void {\n if (this.disabled() || this.readonly()) return;\n const current = this._value() ?? 0;\n const newVal = this._clamp(this._roundToPrecision(current - this.step()));\n this._setValue(newVal);\n }\n\n // Event handlers\n onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n const raw = target.value;\n const parsed = this._parseInputValue(raw);\n this._value.set(parsed);\n this._onChange(parsed);\n this.valueChange.emit(parsed);\n this.stateChanges.next();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.increment();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.decrement();\n }\n }\n\n onFocus(): void {\n if (!this._focused()) {\n this._focused.set(true);\n this.stateChanges.next();\n }\n }\n\n onBlur(): void {\n if (this._focused()) {\n this._focused.set(false);\n this._onTouched();\n\n // On blur, clamp and format the value\n const current = this._value();\n if (current !== null) {\n const clamped = this._clamp(this._roundToPrecision(current));\n if (clamped !== current) {\n this._setValue(clamped);\n } else {\n // Re-sync the display to ensure formatting\n this._syncInputElement();\n }\n }\n\n this.stateChanges.next();\n }\n }\n\n // Internal methods\n private _setValue(val: number | null): void {\n this._value.set(val);\n this._syncInputElement();\n this._onChange(val);\n this.valueChange.emit(val);\n this.stateChanges.next();\n }\n\n private _syncInputElement(): void {\n const el = this.inputElement()?.nativeElement;\n if (!el) return;\n const v = this._value();\n el.value = v !== null ? this._formatValue(v) : '';\n }\n\n private _formatValue(val: number): string {\n const p = this._getEffectivePrecision();\n if (p !== null) {\n return val.toFixed(p);\n }\n return String(val);\n }\n\n private _getEffectivePrecision(): number | null {\n const p = this.precision();\n if (p !== null) return p;\n // Auto-detect from step\n const s = this.step();\n const str = String(s);\n const dotIndex = str.indexOf('.');\n if (dotIndex === -1) return null;\n return str.length - dotIndex - 1;\n }\n\n _clamp(val: number): number {\n const minVal = this.min();\n const maxVal = this.max();\n let result = val;\n if (minVal !== null && result < minVal) result = minVal;\n if (maxVal !== null && result > maxVal) result = maxVal;\n return result;\n }\n\n _roundToPrecision(val: number): number {\n const p = this._getEffectivePrecision();\n if (p === null) return val;\n // Use Number.toFixed to avoid floating point precision issues (e.g. 1.005 * 100 = 100.49999...)\n return parseFloat(val.toFixed(p));\n }\n\n _parseInputValue(raw: string): number | null {\n if (!raw || raw.trim() === '') return null;\n // Allow minus sign, digits, and decimal point\n const cleaned = raw.replace(/[^0-9.-]/g, '');\n const parsed = parseFloat(cleaned);\n if (isNaN(parsed)) return null;\n return parsed;\n }\n}\n","<div class=\"fui-number-input__wrapper\">\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\n (click)=\"decrement()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Decrease value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"minus\" size=\"sm\"></fui-icon>\n </button>\n }\n\n <input\n #inputElement\n class=\"fui-number-input__input\"\n type=\"text\"\n inputmode=\"decimal\"\n [attr.placeholder]=\"placeholder()\"\n [attr.disabled]=\"disabled() ? '' : null\"\n [attr.readonly]=\"readonly() ? '' : null\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-invalid]=\"errorState()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-describedby]=\"_ariaDescribedby\"\n role=\"spinbutton\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n @if (showButtons() && buttonLayout() === 'horizontal') {\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\n (click)=\"increment()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Increase value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"plus\" size=\"sm\"></fui-icon>\n </button>\n }\n @if (showButtons() && buttonLayout() === 'vertical') {\n <div class=\"fui-number-input__btn-stack\">\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\n (click)=\"increment()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Increase value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"caret-up\" size=\"sm\"></fui-icon>\n </button>\n <button\n type=\"button\"\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\n (click)=\"decrement()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Decrease value\"\n tabindex=\"-1\"\n >\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\n </button>\n </div>\n }\n</div>\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-number-input.mjs","sources":["../../../lib/components/number-input/number-input.component.ts","../../../lib/components/number-input/number-input.component.html","../../../lib/components/number-input/raintonic-formaui-components-number-input.ts"],"sourcesContent":["import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n computed,\r\n signal,\r\n viewChild,\r\n ElementRef,\r\n WritableSignal,\r\n Signal,\r\n OnDestroy,\r\n DoCheck,\r\n inject,\r\n effect,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl } from '@raintonic/formaui/core';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { NumberInputButtonLayout } from './number-input.types';\r\n\r\n/**\r\n * # NumberInput Component\r\n *\r\n * A numeric input component with increment/decrement buttons,\r\n * full Angular Reactive Forms support, and FormField integration.\r\n *\r\n * ## Features\r\n * - Full Reactive Forms integration (ControlValueAccessor)\r\n * - FuiFormFieldControl integration for fui-form-field\r\n * - Increment/decrement buttons (horizontal or vertical layout)\r\n * - Min/max clamping and step support\r\n * - Configurable decimal precision\r\n * - Keyboard support (ArrowUp/ArrowDown)\r\n * - Error state handling\r\n * - Accessibility (ARIA spinbutton role)\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Quantity</fui-label>\r\n * <fui-number-input formControlName=\"quantity\" [min]=\"0\" [max]=\"100\" [step]=\"1\"></fui-number-input>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With vertical buttons\r\n * ```html\r\n * <fui-form-field>\r\n * <fui-label>Price</fui-label>\r\n * <fui-number-input formControlName=\"price\" [step]=\"0.01\" [precision]=\"2\" buttonLayout=\"vertical\"></fui-number-input>\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-number-input',\r\n standalone: true,\r\n imports: [FuiIconComponent],\r\n templateUrl: './number-input.component.html',\r\n styleUrls: ['./number-input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-number-input',\r\n '[class.fui-number-input--disabled]': 'disabled()',\r\n '[class.fui-number-input--readonly]': 'readonly()',\r\n '[class.fui-number-input--focused]': 'focused()',\r\n '[class.fui-number-input--error]': 'errorState()',\r\n '[class.fui-number-input--has-buttons]': 'showButtons()',\r\n '[class.fui-number-input--horizontal]': 'buttonLayout() === \"horizontal\"',\r\n '[class.fui-number-input--vertical]': 'buttonLayout() === \"vertical\"',\r\n '[attr.id]': 'id',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiNumberInputComponent,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiNumberInputComponent,\r\n },\r\n ],\r\n})\r\nexport class FuiNumberInputComponent implements ControlValueAccessor, FuiFormFieldControl<number>, DoCheck, OnDestroy {\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-number-input';\r\n\r\n // Inputs\r\n readonly min = input<number | null>(null);\r\n readonly max = input<number | null>(null);\r\n readonly step = input(1);\r\n readonly precision = input<number | null>(null);\r\n readonly placeholder = input('');\r\n readonly disabledInput = input<boolean, unknown>(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly readonly = input<boolean, unknown>(false, {\r\n transform: booleanAttribute,\r\n });\r\n readonly showButtons = input<boolean, unknown>(true, {\r\n transform: booleanAttribute,\r\n });\r\n readonly buttonLayout = input<NumberInputButtonLayout>('horizontal');\r\n readonly errorStateMatcher = input<ErrorStateMatcher | null>(null);\r\n\r\n // Outputs\r\n readonly valueChange = output<number | null>();\r\n\r\n // Internal state\r\n private readonly _value: WritableSignal<number | null> = signal(null);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n\r\n // Public signals\r\n readonly value: Signal<number | null> = this._value.asReadonly();\r\n readonly focused: Signal<boolean> = this._focused.asReadonly();\r\n readonly errorState: Signal<boolean> = this._errorState.asReadonly();\r\n readonly required: Signal<boolean> = this._required.asReadonly();\r\n readonly disabled: Signal<boolean> = computed(\r\n () => this._disabled() || this.disabledInput() || this._ngControlDisabled(),\r\n );\r\n\r\n // Computed\r\n readonly empty = computed(() => this._value() === null);\r\n\r\n readonly _isAtMin = computed(() => {\r\n const val = this._value();\r\n const minVal = this.min();\r\n if (val === null || minVal === null) return false;\r\n return val <= minVal;\r\n });\r\n\r\n readonly _isAtMax = computed(() => {\r\n const val = this._value();\r\n const maxVal = this.max();\r\n if (val === null || maxVal === null) return false;\r\n return val >= maxVal;\r\n });\r\n\r\n // State changes subject for form field compatibility\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-number-input-${FuiNumberInputComponent.nextId++}`;\r\n readonly id = this._uid;\r\n _ariaDescribedby: string | null = null;\r\n\r\n // Form control references\r\n private _parentForm = inject(NgForm, { optional: true });\r\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\r\n private readonly _ngControlRef = injectNgControl();\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n // ViewChild for input element\r\n readonly inputElement = viewChild<ElementRef<HTMLInputElement>>('inputElement');\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: number | null) => void = () => {\r\n /* noop */\r\n };\r\n private _onTouched: () => void = () => {\r\n /* noop */\r\n };\r\n\r\n constructor() {\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Effect to emit state changes\r\n effect(() => {\r\n this.min();\r\n this.max();\r\n this.step();\r\n this.precision();\r\n this.placeholder();\r\n this.disabledInput();\r\n this.readonly();\r\n this.showButtons();\r\n this.buttonLayout();\r\n this.errorStateMatcher();\r\n this._value();\r\n this._focused();\r\n this._disabled();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n updateErrorState(\r\n this.ngControl,\r\n this._errorState,\r\n this.errorStateMatcher(),\r\n this._defaultErrorStateMatcher,\r\n this._parentForm,\r\n this._parentFormGroup,\r\n this.stateChanges,\r\n );\r\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\r\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: number | null): void {\r\n const v = value ?? null;\r\n this._value.set(v);\r\n this._syncInputElement();\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: number | null) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // FuiFormFieldControl implementation\r\n onContainerClick(_event: MouseEvent): void {\r\n if (!this._focused()) {\r\n this.focus();\r\n }\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\r\n }\r\n\r\n setReadOnly?(_readOnly: boolean): void {\r\n // Handled via input signal, but required by interface\r\n }\r\n\r\n // Public API\r\n focus(): void {\r\n this.inputElement()?.nativeElement.focus();\r\n }\r\n\r\n increment(): void {\r\n if (this.disabled() || this.readonly()) return;\r\n const current = this._value() ?? 0;\r\n const newVal = this._clamp(this._roundToPrecision(current + this.step()));\r\n this._setValue(newVal);\r\n }\r\n\r\n decrement(): void {\r\n if (this.disabled() || this.readonly()) return;\r\n const current = this._value() ?? 0;\r\n const newVal = this._clamp(this._roundToPrecision(current - this.step()));\r\n this._setValue(newVal);\r\n }\r\n\r\n // Event handlers\r\n onInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n const raw = target.value;\r\n const parsed = this._parseInputValue(raw);\r\n this._value.set(parsed);\r\n this._onChange(parsed);\r\n this.valueChange.emit(parsed);\r\n this.stateChanges.next();\r\n }\r\n\r\n onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.increment();\r\n } else if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.decrement();\r\n }\r\n }\r\n\r\n onFocus(): void {\r\n if (!this._focused()) {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n if (this._focused()) {\r\n this._focused.set(false);\r\n this._onTouched();\r\n\r\n // On blur, clamp and format the value\r\n const current = this._value();\r\n if (current !== null) {\r\n const clamped = this._clamp(this._roundToPrecision(current));\r\n if (clamped !== current) {\r\n this._setValue(clamped);\r\n } else {\r\n // Re-sync the display to ensure formatting\r\n this._syncInputElement();\r\n }\r\n }\r\n\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n // Internal methods\r\n private _setValue(val: number | null): void {\r\n this._value.set(val);\r\n this._syncInputElement();\r\n this._onChange(val);\r\n this.valueChange.emit(val);\r\n this.stateChanges.next();\r\n }\r\n\r\n private _syncInputElement(): void {\r\n const el = this.inputElement()?.nativeElement;\r\n if (!el) return;\r\n const v = this._value();\r\n el.value = v !== null ? this._formatValue(v) : '';\r\n }\r\n\r\n private _formatValue(val: number): string {\r\n const p = this._getEffectivePrecision();\r\n if (p !== null) {\r\n return val.toFixed(p);\r\n }\r\n return String(val);\r\n }\r\n\r\n private _getEffectivePrecision(): number | null {\r\n const p = this.precision();\r\n if (p !== null) return p;\r\n // Auto-detect from step\r\n const s = this.step();\r\n const str = String(s);\r\n const dotIndex = str.indexOf('.');\r\n if (dotIndex === -1) return null;\r\n return str.length - dotIndex - 1;\r\n }\r\n\r\n _clamp(val: number): number {\r\n const minVal = this.min();\r\n const maxVal = this.max();\r\n let result = val;\r\n if (minVal !== null && result < minVal) result = minVal;\r\n if (maxVal !== null && result > maxVal) result = maxVal;\r\n return result;\r\n }\r\n\r\n _roundToPrecision(val: number): number {\r\n const p = this._getEffectivePrecision();\r\n if (p === null) return val;\r\n // Use Number.toFixed to avoid floating point precision issues (e.g. 1.005 * 100 = 100.49999...)\r\n return parseFloat(val.toFixed(p));\r\n }\r\n\r\n _parseInputValue(raw: string): number | null {\r\n if (!raw || raw.trim() === '') return null;\r\n // Allow minus sign, digits, and decimal point\r\n const cleaned = raw.replace(/[^0-9.-]/g, '');\r\n const parsed = parseFloat(cleaned);\r\n if (isNaN(parsed)) return null;\r\n return parsed;\r\n }\r\n}\r\n","<div class=\"fui-number-input__wrapper\">\r\n @if (showButtons() && buttonLayout() === 'horizontal') {\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\r\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\r\n (click)=\"decrement()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Decrease value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"minus\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n\r\n <input\r\n #inputElement\r\n class=\"fui-number-input__input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n [attr.placeholder]=\"placeholder()\"\r\n [attr.disabled]=\"disabled() ? '' : null\"\r\n [attr.readonly]=\"readonly() ? '' : null\"\r\n [attr.aria-valuenow]=\"value()\"\r\n [attr.aria-valuemin]=\"min()\"\r\n [attr.aria-valuemax]=\"max()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-required]=\"required() ? 'true' : null\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n role=\"spinbutton\"\r\n (input)=\"onInput($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n @if (showButtons() && buttonLayout() === 'horizontal') {\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\r\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\r\n (click)=\"increment()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Increase value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"plus\" size=\"sm\"></fui-icon>\r\n </button>\r\n }\r\n @if (showButtons() && buttonLayout() === 'vertical') {\r\n <div class=\"fui-number-input__btn-stack\">\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--increment\"\r\n [disabled]=\"disabled() || readonly() || _isAtMax()\"\r\n (click)=\"increment()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Increase value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"caret-up\" size=\"sm\"></fui-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fui-number-input__btn fui-number-input__btn--decrement\"\r\n [disabled]=\"disabled() || readonly() || _isAtMin()\"\r\n (click)=\"decrement()\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n aria-label=\"Decrease value\"\r\n tabindex=\"-1\"\r\n >\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -119,13 +119,13 @@ class FuiPaginatorComponent {
119
119
  return typeof page === 'number';
120
120
  }
121
121
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiPaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
122
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiPaginatorComponent, isStandalone: true, selector: "fui-paginator", inputs: { numberOfItems: { classPropertyName: "numberOfItems", publicName: "numberOfItems", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: true, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageSelected: "pageSelected" }, host: { classAttribute: "fui-paginator" }, viewQueries: [{ propertyName: "_pageAnnouncer", first: true, predicate: ["pageAnnouncer"], descendants: true }], ngImport: i0, template: "<nav role=\"navigation\" aria-label=\"Pagination\" class=\"fui-paginator__container\">\n <!-- Live region for page change announcements -->\n <div class=\"fui-sr-only\" aria-live=\"polite\" aria-atomic=\"true\" #pageAnnouncer></div>\n\n <!-- Previous Button -->\n <button\n fuiButton\n variant=\"outline\"\n size=\"md\"\n iconOnly\n [disabled]=\"isFirstPage()\"\n [attr.aria-disabled]=\"isFirstPage()\"\n (click)=\"onPreviousClick()\"\n aria-label=\"Go to previous page\"\n class=\"fui-paginator__nav-button\"\n >\n <fui-icon name=\"caret-left\" size=\"md\"></fui-icon>\n </button>\n\n <!-- Page Numbers -->\n <div class=\"fui-paginator__page-buttons\">\n @for (page of pageNumbers(); track page) {\n @if (typeof page === 'string') {\n <!-- Ellipsis -->\n <span class=\"fui-paginator__ellipsis\" aria-hidden=\"true\">\n {{ page }}\n </span>\n } @else {\n <!-- Page Number Button -->\n <button\n fuiButton\n [variant]=\"isPageActive(page) ? 'primary' : 'ghost'\"\n size=\"md\"\n [disabled]=\"false\"\n (click)=\"onPageClick(page)\"\n [attr.aria-current]=\"isPageActive(page) ? 'page' : null\"\n [attr.aria-label]=\"'Page ' + page + ' of ' + totalPages()\"\n class=\"fui-paginator__page-button\"\n >\n {{ page }}\n </button>\n }\n }\n </div>\n\n <!-- Next Button -->\n <button\n fuiButton\n variant=\"outline\"\n size=\"md\"\n iconOnly\n [disabled]=\"isLastPage()\"\n [attr.aria-disabled]=\"isLastPage()\"\n (click)=\"onNextClick()\"\n aria-label=\"Go to next page\"\n class=\"fui-paginator__nav-button\"\n >\n <fui-icon name=\"caret-right\" size=\"md\"></fui-icon>\n </button>\n</nav>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-paginator{--fui-paginator-bg: transparent;--fui-paginator-button-size: 2.5rem;--fui-paginator-font-size: var(--fui-font-size-sm);--fui-paginator-border-radius: var(--fui-border-radius-sm);--fui-paginator-gap: var(--fui-spacing-02);--fui-paginator-active-bg: var(--fui-primary);--fui-paginator-active-color: var(--fui-primary-text);--fui-paginator-active-hover-bg: var(--fui-primary-hover);--fui-paginator-hover-bg: var(--fui-primary-20)}.fui-paginator__container{display:flex;align-items:center;justify-content:center;gap:var(--fui-spacing-02);background-color:var(--fui-paginator-bg);flex-wrap:wrap}.fui-paginator__nav-button{flex-shrink:0;min-width:auto;padding:var(--fui-spacing-02)}.fui-paginator__nav-button:disabled{cursor:not-allowed;opacity:var(--fui-opacity-disabled)}.fui-paginator__page-buttons{display:flex;align-items:center;gap:var(--fui-spacing-01);flex-wrap:wrap;justify-content:center}.fui-paginator__page-button{min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);padding:0;border-radius:var(--fui-paginator-border-radius);font-weight:500;font-size:var(--fui-paginator-font-size)}.fui-paginator__page-button:not(:disabled){cursor:pointer}.fui-paginator__page-button:not(:disabled):hover{background-color:var(--fui-paginator-hover-bg)}.fui-paginator__page-button:disabled{cursor:not-allowed}.fui-paginator__page-button[aria-current=page]{background-color:var(--fui-paginator-active-bg);color:var(--fui-paginator-active-color);font-weight:600}.fui-paginator__page-button[aria-current=page]:hover{background-color:var(--fui-paginator-active-hover-bg)}.fui-paginator__page-button{transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-paginator__page-button:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-paginator__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);color:var(--fui-text-secondary);font-weight:500;font-size:var(--fui-font-size-sm);-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: FuiButtonDirective, selector: "button[fuiButton], a[fuiButton]", inputs: ["variant", "size", "disabled", "fullWidth", "loading", "iconOnly", "aria-label", "type"] }, { kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }] });
122
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiPaginatorComponent, isStandalone: true, selector: "fui-paginator", inputs: { numberOfItems: { classPropertyName: "numberOfItems", publicName: "numberOfItems", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: true, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageSelected: "pageSelected" }, host: { classAttribute: "fui-paginator" }, viewQueries: [{ propertyName: "_pageAnnouncer", first: true, predicate: ["pageAnnouncer"], descendants: true }], ngImport: i0, template: "<nav role=\"navigation\" aria-label=\"Pagination\" class=\"fui-paginator__container\">\r\n <!-- Live region for page change announcements -->\r\n <div class=\"fui-sr-only\" aria-live=\"polite\" aria-atomic=\"true\" #pageAnnouncer></div>\r\n\r\n <!-- Previous Button -->\r\n <button\r\n fuiButton\r\n variant=\"outline\"\r\n size=\"md\"\r\n iconOnly\r\n [disabled]=\"isFirstPage()\"\r\n [attr.aria-disabled]=\"isFirstPage()\"\r\n (click)=\"onPreviousClick()\"\r\n aria-label=\"Go to previous page\"\r\n class=\"fui-paginator__nav-button\"\r\n >\r\n <fui-icon name=\"caret-left\" size=\"md\"></fui-icon>\r\n </button>\r\n\r\n <!-- Page Numbers -->\r\n <div class=\"fui-paginator__page-buttons\">\r\n @for (page of pageNumbers(); track page) {\r\n @if (typeof page === 'string') {\r\n <!-- Ellipsis -->\r\n <span class=\"fui-paginator__ellipsis\" aria-hidden=\"true\">\r\n {{ page }}\r\n </span>\r\n } @else {\r\n <!-- Page Number Button -->\r\n <button\r\n fuiButton\r\n [variant]=\"isPageActive(page) ? 'primary' : 'ghost'\"\r\n size=\"md\"\r\n [disabled]=\"false\"\r\n (click)=\"onPageClick(page)\"\r\n [attr.aria-current]=\"isPageActive(page) ? 'page' : null\"\r\n [attr.aria-label]=\"'Page ' + page + ' of ' + totalPages()\"\r\n class=\"fui-paginator__page-button\"\r\n >\r\n {{ page }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Next Button -->\r\n <button\r\n fuiButton\r\n variant=\"outline\"\r\n size=\"md\"\r\n iconOnly\r\n [disabled]=\"isLastPage()\"\r\n [attr.aria-disabled]=\"isLastPage()\"\r\n (click)=\"onNextClick()\"\r\n aria-label=\"Go to next page\"\r\n class=\"fui-paginator__nav-button\"\r\n >\r\n <fui-icon name=\"caret-right\" size=\"md\"></fui-icon>\r\n </button>\r\n</nav>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-paginator{--fui-paginator-bg: transparent;--fui-paginator-button-size: 2.5rem;--fui-paginator-font-size: var(--fui-font-size-sm);--fui-paginator-border-radius: var(--fui-border-radius-sm);--fui-paginator-gap: var(--fui-spacing-02);--fui-paginator-active-bg: var(--fui-primary);--fui-paginator-active-color: var(--fui-primary-text);--fui-paginator-active-hover-bg: var(--fui-primary-hover);--fui-paginator-hover-bg: var(--fui-primary-20)}.fui-paginator__container{display:flex;align-items:center;justify-content:center;gap:var(--fui-spacing-02);background-color:var(--fui-paginator-bg);flex-wrap:wrap}.fui-paginator__nav-button{flex-shrink:0;min-width:auto;padding:var(--fui-spacing-02)}.fui-paginator__nav-button:disabled{cursor:not-allowed;opacity:var(--fui-opacity-disabled)}.fui-paginator__page-buttons{display:flex;align-items:center;gap:var(--fui-spacing-01);flex-wrap:wrap;justify-content:center}.fui-paginator__page-button{min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);padding:0;border-radius:var(--fui-paginator-border-radius);font-weight:500;font-size:var(--fui-paginator-font-size)}.fui-paginator__page-button:not(:disabled){cursor:pointer}.fui-paginator__page-button:not(:disabled):hover{background-color:var(--fui-paginator-hover-bg)}.fui-paginator__page-button:disabled{cursor:not-allowed}.fui-paginator__page-button[aria-current=page]{background-color:var(--fui-paginator-active-bg);color:var(--fui-paginator-active-color);font-weight:600}.fui-paginator__page-button[aria-current=page]:hover{background-color:var(--fui-paginator-active-hover-bg)}.fui-paginator__page-button{transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-paginator__page-button:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-paginator__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);color:var(--fui-text-secondary);font-weight:500;font-size:var(--fui-font-size-sm);-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: FuiButtonDirective, selector: "button[fuiButton], a[fuiButton]", inputs: ["variant", "size", "disabled", "fullWidth", "loading", "iconOnly", "aria-label", "type"] }, { kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }] });
123
123
  }
124
124
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiPaginatorComponent, decorators: [{
125
125
  type: Component,
126
126
  args: [{ selector: 'fui-paginator', standalone: true, imports: [FuiButtonDirective, FuiIconComponent], host: {
127
127
  class: 'fui-paginator',
128
- }, template: "<nav role=\"navigation\" aria-label=\"Pagination\" class=\"fui-paginator__container\">\n <!-- Live region for page change announcements -->\n <div class=\"fui-sr-only\" aria-live=\"polite\" aria-atomic=\"true\" #pageAnnouncer></div>\n\n <!-- Previous Button -->\n <button\n fuiButton\n variant=\"outline\"\n size=\"md\"\n iconOnly\n [disabled]=\"isFirstPage()\"\n [attr.aria-disabled]=\"isFirstPage()\"\n (click)=\"onPreviousClick()\"\n aria-label=\"Go to previous page\"\n class=\"fui-paginator__nav-button\"\n >\n <fui-icon name=\"caret-left\" size=\"md\"></fui-icon>\n </button>\n\n <!-- Page Numbers -->\n <div class=\"fui-paginator__page-buttons\">\n @for (page of pageNumbers(); track page) {\n @if (typeof page === 'string') {\n <!-- Ellipsis -->\n <span class=\"fui-paginator__ellipsis\" aria-hidden=\"true\">\n {{ page }}\n </span>\n } @else {\n <!-- Page Number Button -->\n <button\n fuiButton\n [variant]=\"isPageActive(page) ? 'primary' : 'ghost'\"\n size=\"md\"\n [disabled]=\"false\"\n (click)=\"onPageClick(page)\"\n [attr.aria-current]=\"isPageActive(page) ? 'page' : null\"\n [attr.aria-label]=\"'Page ' + page + ' of ' + totalPages()\"\n class=\"fui-paginator__page-button\"\n >\n {{ page }}\n </button>\n }\n }\n </div>\n\n <!-- Next Button -->\n <button\n fuiButton\n variant=\"outline\"\n size=\"md\"\n iconOnly\n [disabled]=\"isLastPage()\"\n [attr.aria-disabled]=\"isLastPage()\"\n (click)=\"onNextClick()\"\n aria-label=\"Go to next page\"\n class=\"fui-paginator__nav-button\"\n >\n <fui-icon name=\"caret-right\" size=\"md\"></fui-icon>\n </button>\n</nav>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-paginator{--fui-paginator-bg: transparent;--fui-paginator-button-size: 2.5rem;--fui-paginator-font-size: var(--fui-font-size-sm);--fui-paginator-border-radius: var(--fui-border-radius-sm);--fui-paginator-gap: var(--fui-spacing-02);--fui-paginator-active-bg: var(--fui-primary);--fui-paginator-active-color: var(--fui-primary-text);--fui-paginator-active-hover-bg: var(--fui-primary-hover);--fui-paginator-hover-bg: var(--fui-primary-20)}.fui-paginator__container{display:flex;align-items:center;justify-content:center;gap:var(--fui-spacing-02);background-color:var(--fui-paginator-bg);flex-wrap:wrap}.fui-paginator__nav-button{flex-shrink:0;min-width:auto;padding:var(--fui-spacing-02)}.fui-paginator__nav-button:disabled{cursor:not-allowed;opacity:var(--fui-opacity-disabled)}.fui-paginator__page-buttons{display:flex;align-items:center;gap:var(--fui-spacing-01);flex-wrap:wrap;justify-content:center}.fui-paginator__page-button{min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);padding:0;border-radius:var(--fui-paginator-border-radius);font-weight:500;font-size:var(--fui-paginator-font-size)}.fui-paginator__page-button:not(:disabled){cursor:pointer}.fui-paginator__page-button:not(:disabled):hover{background-color:var(--fui-paginator-hover-bg)}.fui-paginator__page-button:disabled{cursor:not-allowed}.fui-paginator__page-button[aria-current=page]{background-color:var(--fui-paginator-active-bg);color:var(--fui-paginator-active-color);font-weight:600}.fui-paginator__page-button[aria-current=page]:hover{background-color:var(--fui-paginator-active-hover-bg)}.fui-paginator__page-button{transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-paginator__page-button:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-paginator__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);color:var(--fui-text-secondary);font-weight:500;font-size:var(--fui-font-size-sm);-webkit-user-select:none;user-select:none}\n"] }]
128
+ }, template: "<nav role=\"navigation\" aria-label=\"Pagination\" class=\"fui-paginator__container\">\r\n <!-- Live region for page change announcements -->\r\n <div class=\"fui-sr-only\" aria-live=\"polite\" aria-atomic=\"true\" #pageAnnouncer></div>\r\n\r\n <!-- Previous Button -->\r\n <button\r\n fuiButton\r\n variant=\"outline\"\r\n size=\"md\"\r\n iconOnly\r\n [disabled]=\"isFirstPage()\"\r\n [attr.aria-disabled]=\"isFirstPage()\"\r\n (click)=\"onPreviousClick()\"\r\n aria-label=\"Go to previous page\"\r\n class=\"fui-paginator__nav-button\"\r\n >\r\n <fui-icon name=\"caret-left\" size=\"md\"></fui-icon>\r\n </button>\r\n\r\n <!-- Page Numbers -->\r\n <div class=\"fui-paginator__page-buttons\">\r\n @for (page of pageNumbers(); track page) {\r\n @if (typeof page === 'string') {\r\n <!-- Ellipsis -->\r\n <span class=\"fui-paginator__ellipsis\" aria-hidden=\"true\">\r\n {{ page }}\r\n </span>\r\n } @else {\r\n <!-- Page Number Button -->\r\n <button\r\n fuiButton\r\n [variant]=\"isPageActive(page) ? 'primary' : 'ghost'\"\r\n size=\"md\"\r\n [disabled]=\"false\"\r\n (click)=\"onPageClick(page)\"\r\n [attr.aria-current]=\"isPageActive(page) ? 'page' : null\"\r\n [attr.aria-label]=\"'Page ' + page + ' of ' + totalPages()\"\r\n class=\"fui-paginator__page-button\"\r\n >\r\n {{ page }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Next Button -->\r\n <button\r\n fuiButton\r\n variant=\"outline\"\r\n size=\"md\"\r\n iconOnly\r\n [disabled]=\"isLastPage()\"\r\n [attr.aria-disabled]=\"isLastPage()\"\r\n (click)=\"onNextClick()\"\r\n aria-label=\"Go to next page\"\r\n class=\"fui-paginator__nav-button\"\r\n >\r\n <fui-icon name=\"caret-right\" size=\"md\"></fui-icon>\r\n </button>\r\n</nav>\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:opacity var(--fui-duration-fast-02) var(--fui-ease-entrance) 0ms}.fui-motion-fade-out{transition:opacity var(--fui-duration-fast-01) var(--fui-ease-exit) 0ms}.fui-motion-slide-in-bottom{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition:transform var(--fui-duration-moderate-01) var(--fui-ease-entrance) 0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition:transform,opacity var(--fui-duration-moderate-01) var(--fui-ease-entrance) 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-moderate-01) var(--fui-ease-entrance)}.fui-paginator{--fui-paginator-bg: transparent;--fui-paginator-button-size: 2.5rem;--fui-paginator-font-size: var(--fui-font-size-sm);--fui-paginator-border-radius: var(--fui-border-radius-sm);--fui-paginator-gap: var(--fui-spacing-02);--fui-paginator-active-bg: var(--fui-primary);--fui-paginator-active-color: var(--fui-primary-text);--fui-paginator-active-hover-bg: var(--fui-primary-hover);--fui-paginator-hover-bg: var(--fui-primary-20)}.fui-paginator__container{display:flex;align-items:center;justify-content:center;gap:var(--fui-spacing-02);background-color:var(--fui-paginator-bg);flex-wrap:wrap}.fui-paginator__nav-button{flex-shrink:0;min-width:auto;padding:var(--fui-spacing-02)}.fui-paginator__nav-button:disabled{cursor:not-allowed;opacity:var(--fui-opacity-disabled)}.fui-paginator__page-buttons{display:flex;align-items:center;gap:var(--fui-spacing-01);flex-wrap:wrap;justify-content:center}.fui-paginator__page-button{min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);padding:0;border-radius:var(--fui-paginator-border-radius);font-weight:500;font-size:var(--fui-paginator-font-size)}.fui-paginator__page-button:not(:disabled){cursor:pointer}.fui-paginator__page-button:not(:disabled):hover{background-color:var(--fui-paginator-hover-bg)}.fui-paginator__page-button:disabled{cursor:not-allowed}.fui-paginator__page-button[aria-current=page]{background-color:var(--fui-paginator-active-bg);color:var(--fui-paginator-active-color);font-weight:600}.fui-paginator__page-button[aria-current=page]:hover{background-color:var(--fui-paginator-active-hover-bg)}.fui-paginator__page-button{transition:all var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-paginator__page-button:focus-visible{outline:2px solid var(--fui-primary);outline-offset:2px}.fui-paginator__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:var(--fui-paginator-button-size);height:var(--fui-paginator-button-size);color:var(--fui-text-secondary);font-weight:500;font-size:var(--fui-font-size-sm);-webkit-user-select:none;user-select:none}\n"] }]
129
129
  }], ctorParameters: () => [], propDecorators: { numberOfItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberOfItems", required: true }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: true }] }], currentPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentPage", required: false }] }], pageSelected: [{ type: i0.Output, args: ["pageSelected"] }], _pageAnnouncer: [{
130
130
  type: ViewChild,
131
131
  args: ['pageAnnouncer']