@raintonic/formaui 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs +8 -1
- package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-date-picker.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-menu.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-select.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-time-picker.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui.mjs +1 -1
- package/fesm2022/raintonic-formaui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
- package/types/raintonic-formaui.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-popover.mjs","sources":["../../../lib/components/popover/popover.component.ts","../../../lib/components/popover/popover.component.html","../../../lib/components/popover/popover.types.ts","../../../lib/components/popover/popover-trigger.directive.ts","../../../lib/components/popover/raintonic-formaui-components-popover.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, ViewEncapsulation, input, computed, Signal } from '@angular/core';\r\nimport { PopoverPosition } from './popover.types';\r\n\r\n/**\r\n * # FuiPopoverComponent\r\n *\r\n * Internal popover container component rendered inside the overlay.\r\n * Provides a styled panel with optional arrow indicator.\r\n *\r\n * ## Usage\r\n * This component is not used directly. Use the `[fuiPopoverTrigger]` directive instead.\r\n */\r\n@Component({\r\n selector: 'fui-popover',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './popover.component.html',\r\n styleUrl: './popover.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-popover',\r\n '[class]': 'computedClasses()',\r\n },\r\n})\r\nexport class FuiPopoverComponent {\r\n /** Whether to show the arrow indicator */\r\n readonly hasArrow = input(true);\r\n\r\n /** Position of the popover relative to the trigger element, used for arrow calculation */\r\n readonly position = input<PopoverPosition>('bottom');\r\n\r\n /** Computed CSS classes for the popover */\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const classes: string[] = ['fui-popover', `fui-popover--${this.position()}`];\r\n\r\n if (this.hasArrow()) {\r\n classes.push('fui-popover--with-arrow');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n /** Computed arrow classes based on position */\r\n readonly arrowClasses: Signal<string> = computed(() => {\r\n const position = this.position();\r\n const baseClass = 'fui-popover__arrow';\r\n\r\n if (position.startsWith('top')) {\r\n return `${baseClass} ${baseClass}--bottom`;\r\n } else if (position.startsWith('bottom')) {\r\n return `${baseClass} ${baseClass}--top`;\r\n } else if (position.startsWith('left')) {\r\n return `${baseClass} ${baseClass}--right`;\r\n } else if (position.startsWith('right')) {\r\n return `${baseClass} ${baseClass}--left`;\r\n }\r\n\r\n return baseClass;\r\n });\r\n}\r\n","<div class=\"fui-popover__panel\" role=\"dialog\">\r\n @if (hasArrow()) {\r\n <div class=\"fui-popover__arrow\" [class]=\"arrowClasses()\"></div>\r\n }\r\n <div class=\"fui-popover__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n","export type PopoverTriggerMode = 'click' | 'hover' | 'focus' | 'manual';\r\nexport type PopoverPosition =\r\n | 'top'\r\n | 'bottom'\r\n | 'left'\r\n | 'right'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right-start'\r\n | 'right-end';\r\n\r\nexport const POPOVER_POSITIONS = [\r\n 'top',\r\n 'bottom',\r\n 'left',\r\n 'right',\r\n 'top-start',\r\n 'top-end',\r\n 'bottom-start',\r\n 'bottom-end',\r\n 'left-start',\r\n 'left-end',\r\n 'right-start',\r\n 'right-end',\r\n] as const;\r\n\r\nexport const POPOVER_TRIGGER_MODES = ['click', 'hover', 'focus', 'manual'] as const;\r\n","import {\r\n Directive,\r\n ElementRef,\r\n input,\r\n output,\r\n effect,\r\n HostListener,\r\n inject,\r\n OnDestroy,\r\n booleanAttribute,\r\n numberAttribute,\r\n TemplateRef,\r\n EmbeddedViewRef,\r\n signal,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { PopoverPosition, PopoverTriggerMode, POPOVER_POSITIONS, POPOVER_TRIGGER_MODES } from './popover.types';\r\nimport { FuiOverlayService, FuiOverlayRef, FuiConnectedPosition } from '@raintonic/formaui/cdk/overlay';\r\nimport { Subscription } from 'rxjs';\r\n\r\n/**\r\n * # PopoverTrigger Directive\r\n *\r\n * A directive that triggers a popover overlay anchored to the host element.\r\n * Supports click, hover, focus, and manual trigger modes with configurable\r\n * positioning, delays, and arrow indicators.\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Click Popover\r\n * ```html\r\n * <ng-template #popoverContent>\r\n * <p>Popover content here</p>\r\n * </ng-template>\r\n *\r\n * <button [fuiPopoverTrigger]=\"popoverContent\">Open Popover</button>\r\n * ```\r\n *\r\n * ### Hover with Position\r\n * ```html\r\n * <button [fuiPopoverTrigger]=\"popoverContent\"\r\n * fuiPopoverTriggerOn=\"hover\"\r\n * fuiPopoverPosition=\"top\">\r\n * Hover Me\r\n * </button>\r\n * ```\r\n *\r\n * ### Manual Control\r\n * ```html\r\n * <button [fuiPopoverTrigger]=\"popoverContent\"\r\n * fuiPopoverTriggerOn=\"manual\"\r\n * [fuiPopoverOpen]=\"isOpen\">\r\n * Manual Popover\r\n * </button>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiPopoverTrigger]',\r\n standalone: true,\r\n host: {\r\n '[attr.aria-haspopup]': '\"dialog\"',\r\n '[attr.aria-expanded]': '_isOpen() ? \"true\" : \"false\"',\r\n },\r\n})\r\nexport class FuiPopoverTriggerDirective implements OnDestroy {\r\n /** Template ref for the popover content */\r\n readonly fuiPopoverTrigger = input.required<TemplateRef<unknown>>();\r\n\r\n /** Position of the popover relative to the trigger element */\r\n readonly fuiPopoverPosition = input<PopoverPosition, PopoverPosition | string>('bottom', {\r\n transform: (v) => ((POPOVER_POSITIONS as readonly string[]).includes(v) ? (v as PopoverPosition) : 'bottom'),\r\n });\r\n\r\n /** Trigger mode for showing/hiding the popover */\r\n readonly fuiPopoverTriggerOn = input<PopoverTriggerMode, PopoverTriggerMode | string>('click', {\r\n transform: (v) => ((POPOVER_TRIGGER_MODES as readonly string[]).includes(v) ? (v as PopoverTriggerMode) : 'click'),\r\n });\r\n\r\n /** Delay before showing the popover (in milliseconds) */\r\n readonly fuiPopoverShowDelay = input<number, unknown>(0, { transform: numberAttribute });\r\n\r\n /** Delay before hiding the popover (in milliseconds) */\r\n readonly fuiPopoverHideDelay = input<number, unknown>(0, { transform: numberAttribute });\r\n\r\n /** Whether to show the arrow indicator */\r\n readonly fuiPopoverHasArrow = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /** Whether to close on outside click */\r\n readonly fuiPopoverCloseOnOutsideClick = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /** Whether the popover trigger is disabled */\r\n readonly fuiPopoverDisabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /** Manual control for showing/hiding the popover (only works with trigger=\"manual\") */\r\n readonly fuiPopoverOpen = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /** Emits when the popover is opened */\r\n readonly fuiPopoverOpened = output();\r\n\r\n /** Emits when the popover is closed */\r\n readonly fuiPopoverClosed = output();\r\n\r\n // Internal state\r\n readonly _isOpen: WritableSignal<boolean> = signal(false);\r\n private _overlayRef: FuiOverlayRef | null = null;\r\n private _embeddedViewRef: EmbeddedViewRef<unknown> | null = null;\r\n private _showTimeout: number | null = null;\r\n private _hideTimeout: number | null = null;\r\n private _subscriptions: Subscription[] = [];\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\r\n constructor() {\r\n // Handle manual control\r\n effect(() => {\r\n if (this.fuiPopoverTriggerOn() === 'manual') {\r\n if (this.fuiPopoverOpen()) {\r\n this._showPopover();\r\n } else {\r\n this._hidePopover();\r\n }\r\n }\r\n });\r\n\r\n // Handle disabled state\r\n effect(() => {\r\n if (this.fuiPopoverDisabled() && this._isOpen()) {\r\n this._hidePopover();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._clearTimeouts();\r\n this._destroyPopover();\r\n }\r\n\r\n @HostListener('click')\r\n onHostClick(): void {\r\n if (this.fuiPopoverTriggerOn() === 'click' && !this.fuiPopoverDisabled()) {\r\n if (this._isOpen()) {\r\n this._hidePopover();\r\n } else {\r\n this._showPopover();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter(): void {\r\n if (this.fuiPopoverTriggerOn() === 'hover' && !this.fuiPopoverDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave(): void {\r\n if (this.fuiPopoverTriggerOn() === 'hover' && !this.fuiPopoverDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n if (this.fuiPopoverTriggerOn() === 'focus' && !this.fuiPopoverDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n if (this.fuiPopoverTriggerOn() === 'focus' && !this.fuiPopoverDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this._isOpen()) {\r\n this._hidePopover();\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /** Programmatically show the popover */\r\n show(): void {\r\n if (!this.fuiPopoverDisabled()) {\r\n this._showPopover();\r\n }\r\n }\r\n\r\n /** Programmatically hide the popover */\r\n hide(): void {\r\n this._hidePopover();\r\n }\r\n\r\n /** Toggle popover visibility */\r\n toggle(): void {\r\n if (this._isOpen()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n private _scheduleShow(): void {\r\n this._clearTimeouts();\r\n\r\n if (this.fuiPopoverShowDelay() > 0) {\r\n this._showTimeout = window.setTimeout(() => {\r\n this._showPopover();\r\n }, this.fuiPopoverShowDelay());\r\n } else {\r\n this._showPopover();\r\n }\r\n }\r\n\r\n private _scheduleHide(): void {\r\n this._clearTimeouts();\r\n\r\n if (this.fuiPopoverHideDelay() > 0) {\r\n this._hideTimeout = window.setTimeout(() => {\r\n this._hidePopover();\r\n }, this.fuiPopoverHideDelay());\r\n } else {\r\n this._hidePopover();\r\n }\r\n }\r\n\r\n private _previouslyFocusedElement: HTMLElement | null = null;\r\n\r\n private _showPopover(): void {\r\n if (this._isOpen() || this.fuiPopoverDisabled()) {\r\n return;\r\n }\r\n\r\n // Save the currently focused element for focus restoration\r\n this._previouslyFocusedElement = document.activeElement as HTMLElement;\r\n\r\n this._createPopover();\r\n this._isOpen.set(true);\r\n this.fuiPopoverOpened.emit();\r\n\r\n // Add click outside listener for click trigger\r\n if (this.fuiPopoverCloseOnOutsideClick()) {\r\n setTimeout(() => {\r\n document.addEventListener('click', this._onDocumentClick, true);\r\n });\r\n }\r\n\r\n // Focus the first focusable element within the popover\r\n setTimeout(() => {\r\n this._focusFirstInOverlay();\r\n });\r\n }\r\n\r\n private _hidePopover(): void {\r\n if (!this._isOpen()) {\r\n return;\r\n }\r\n\r\n this._isOpen.set(false);\r\n this._destroyPopover();\r\n this.fuiPopoverClosed.emit();\r\n document.removeEventListener('click', this._onDocumentClick, true);\r\n\r\n // Restore focus to the trigger element\r\n if (this._previouslyFocusedElement) {\r\n this._previouslyFocusedElement.focus();\r\n this._previouslyFocusedElement = null;\r\n }\r\n }\r\n\r\n private _focusFirstInOverlay(): void {\r\n const overlay = this._overlayRef?.overlayElement;\r\n if (!overlay) return;\r\n\r\n const focusable = overlay.querySelector<HTMLElement>(\r\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n\r\n if (focusable) {\r\n focusable.focus();\r\n }\r\n }\r\n\r\n private _createPopover(): void {\r\n if (this._overlayRef) {\r\n return;\r\n }\r\n\r\n const positions = this._getPositions(this.fuiPopoverPosition());\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(this._elementRef, positions)\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n this._overlayRef = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: this._overlayService.scrollStrategies.reposition(20),\r\n panelClass: 'fui-popover-panel',\r\n });\r\n\r\n // Attach the template to the overlay\r\n this._overlayRef.attach(this.fuiPopoverTrigger());\r\n\r\n // Subscribe to keydown events for ESC\r\n const keydownSub = this._overlayRef.keydownEvents.subscribe((event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n this._hidePopover();\r\n event.preventDefault();\r\n }\r\n });\r\n this._subscriptions.push(keydownSub);\r\n\r\n // Set up hover events on the overlay for hover trigger persistence\r\n if (this.fuiPopoverTriggerOn() === 'hover') {\r\n const overlayElement = this._overlayRef.overlayElement;\r\n overlayElement.addEventListener('mouseenter', this._onOverlayMouseEnter);\r\n overlayElement.addEventListener('mouseleave', this._onOverlayMouseLeave);\r\n }\r\n }\r\n\r\n private _getPositions(pos: PopoverPosition): FuiConnectedPosition[] {\r\n const offset = 8;\r\n const positionMap: Record<PopoverPosition, FuiConnectedPosition[]> = {\r\n top: [\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 'top-start': [\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 'top-end': [\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 bottom: [\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 'bottom-start': [\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 'bottom-end': [\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 left: [\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 'left-start': [\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 'left-end': [\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 right: [\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 'right-start': [\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 'right-end': [\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 };\r\n\r\n return positionMap[pos] || positionMap.bottom;\r\n }\r\n\r\n private _destroyPopover(): void {\r\n // Clean up subscriptions\r\n this._subscriptions.forEach((sub) => {\r\n sub.unsubscribe();\r\n });\r\n this._subscriptions = [];\r\n\r\n // Remove hover listeners from overlay\r\n if (this._overlayRef) {\r\n const overlayElement = this._overlayRef.overlayElement;\r\n overlayElement.removeEventListener('mouseenter', this._onOverlayMouseEnter);\r\n overlayElement.removeEventListener('mouseleave', this._onOverlayMouseLeave);\r\n\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n this._embeddedViewRef = null;\r\n }\r\n\r\n private _clearTimeouts(): void {\r\n if (this._showTimeout) {\r\n clearTimeout(this._showTimeout);\r\n this._showTimeout = null;\r\n }\r\n if (this._hideTimeout) {\r\n clearTimeout(this._hideTimeout);\r\n this._hideTimeout = null;\r\n }\r\n }\r\n\r\n private readonly _onDocumentClick = (event: Event): void => {\r\n const target = event.target as HTMLElement;\r\n const triggerElement = this._elementRef.nativeElement;\r\n const overlayElement = this._overlayRef?.overlayElement;\r\n\r\n if (target && !triggerElement.contains(target) && !overlayElement?.contains(target)) {\r\n this._hidePopover();\r\n }\r\n };\r\n\r\n private readonly _onOverlayMouseEnter = (): void => {\r\n this._clearTimeouts();\r\n };\r\n\r\n private readonly _onOverlayMouseLeave = (): void => {\r\n if (this.fuiPopoverTriggerOn() === 'hover') {\r\n this._scheduleHide();\r\n }\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-popover.mjs","sources":["../../../lib/components/popover/popover.component.ts","../../../lib/components/popover/popover.component.html","../../../lib/components/popover/popover.types.ts","../../../lib/components/popover/popover-trigger.directive.ts","../../../lib/components/popover/raintonic-formaui-components-popover.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, ViewEncapsulation, input, computed, Signal } from '@angular/core';\r\nimport { PopoverPosition } from './popover.types';\r\n\r\n/**\r\n * # FuiPopoverComponent\r\n *\r\n * Internal popover container component rendered inside the overlay.\r\n * Provides a styled panel with optional arrow indicator.\r\n *\r\n * ## Usage\r\n * This component is not used directly. Use the `[fuiPopoverTrigger]` directive instead.\r\n */\r\n@Component({\r\n selector: 'fui-popover',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './popover.component.html',\r\n styleUrl: './popover.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-popover',\r\n '[class]': 'computedClasses()',\r\n },\r\n})\r\nexport class FuiPopoverComponent {\r\n /** Whether to show the arrow indicator */\r\n readonly hasArrow = input(true);\r\n\r\n /** Position of the popover relative to the trigger element, used for arrow calculation */\r\n readonly position = input<PopoverPosition>('bottom');\r\n\r\n /** Computed CSS classes for the popover */\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const classes: string[] = ['fui-popover', `fui-popover--${this.position()}`];\r\n\r\n if (this.hasArrow()) {\r\n classes.push('fui-popover--with-arrow');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n /** Computed arrow classes based on position */\r\n readonly arrowClasses: Signal<string> = computed(() => {\r\n const position = this.position();\r\n const baseClass = 'fui-popover__arrow';\r\n\r\n if (position.startsWith('top')) {\r\n return `${baseClass} ${baseClass}--bottom`;\r\n } else if (position.startsWith('bottom')) {\r\n return `${baseClass} ${baseClass}--top`;\r\n } else if (position.startsWith('left')) {\r\n return `${baseClass} ${baseClass}--right`;\r\n } else if (position.startsWith('right')) {\r\n return `${baseClass} ${baseClass}--left`;\r\n }\r\n\r\n return baseClass;\r\n });\r\n}\r\n","<div class=\"fui-popover__panel\" role=\"dialog\">\r\n @if (hasArrow()) {\r\n <div class=\"fui-popover__arrow\" [class]=\"arrowClasses()\"></div>\r\n }\r\n <div class=\"fui-popover__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n","export type PopoverTriggerMode = 'click' | 'hover' | 'focus' | 'manual';\r\nexport type PopoverPosition =\r\n | 'top'\r\n | 'bottom'\r\n | 'left'\r\n | 'right'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right-start'\r\n | 'right-end';\r\n\r\nexport const POPOVER_POSITIONS = [\r\n 'top',\r\n 'bottom',\r\n 'left',\r\n 'right',\r\n 'top-start',\r\n 'top-end',\r\n 'bottom-start',\r\n 'bottom-end',\r\n 'left-start',\r\n 'left-end',\r\n 'right-start',\r\n 'right-end',\r\n] as const;\r\n\r\nexport const POPOVER_TRIGGER_MODES = ['click', 'hover', 'focus', 'manual'] as const;\r\n","import {\r\n Directive,\r\n ElementRef,\r\n input,\r\n output,\r\n effect,\r\n HostListener,\r\n inject,\r\n OnDestroy,\r\n booleanAttribute,\r\n numberAttribute,\r\n TemplateRef,\r\n EmbeddedViewRef,\r\n signal,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { PopoverPosition, PopoverTriggerMode, POPOVER_POSITIONS, POPOVER_TRIGGER_MODES } from './popover.types';\r\nimport { FuiOverlayService, FuiOverlayRef, FuiConnectedPosition } from '@raintonic/formaui/cdk/overlay';\r\nimport { Subscription } from 'rxjs';\r\n\r\n/**\r\n * # PopoverTrigger Directive\r\n *\r\n * A directive that triggers a popover overlay anchored to the host element.\r\n * Supports click, hover, focus, and manual trigger modes with configurable\r\n * positioning, delays, and arrow indicators.\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Click Popover\r\n * ```html\r\n * <ng-template #popoverContent>\r\n * <p>Popover content here</p>\r\n * </ng-template>\r\n *\r\n * <button [fuiPopoverTrigger]=\"popoverContent\">Open Popover</button>\r\n * ```\r\n *\r\n * ### Hover with Position\r\n * ```html\r\n * <button [fuiPopoverTrigger]=\"popoverContent\"\r\n * fuiPopoverTriggerOn=\"hover\"\r\n * fuiPopoverPosition=\"top\">\r\n * Hover Me\r\n * </button>\r\n * ```\r\n *\r\n * ### Manual Control\r\n * ```html\r\n * <button [fuiPopoverTrigger]=\"popoverContent\"\r\n * fuiPopoverTriggerOn=\"manual\"\r\n * [fuiPopoverOpen]=\"isOpen\">\r\n * Manual Popover\r\n * </button>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[fuiPopoverTrigger]',\r\n standalone: true,\r\n host: {\r\n '[attr.aria-haspopup]': '\"dialog\"',\r\n '[attr.aria-expanded]': '_isOpen() ? \"true\" : \"false\"',\r\n },\r\n})\r\nexport class FuiPopoverTriggerDirective implements OnDestroy {\r\n /** Template ref for the popover content */\r\n readonly fuiPopoverTrigger = input.required<TemplateRef<unknown>>();\r\n\r\n /** Position of the popover relative to the trigger element */\r\n readonly fuiPopoverPosition = input<PopoverPosition, PopoverPosition | string>('bottom', {\r\n transform: (v) => ((POPOVER_POSITIONS as readonly string[]).includes(v) ? (v as PopoverPosition) : 'bottom'),\r\n });\r\n\r\n /** Trigger mode for showing/hiding the popover */\r\n readonly fuiPopoverTriggerOn = input<PopoverTriggerMode, PopoverTriggerMode | string>('click', {\r\n transform: (v) => ((POPOVER_TRIGGER_MODES as readonly string[]).includes(v) ? (v as PopoverTriggerMode) : 'click'),\r\n });\r\n\r\n /** Delay before showing the popover (in milliseconds) */\r\n readonly fuiPopoverShowDelay = input<number, unknown>(0, { transform: numberAttribute });\r\n\r\n /** Delay before hiding the popover (in milliseconds) */\r\n readonly fuiPopoverHideDelay = input<number, unknown>(0, { transform: numberAttribute });\r\n\r\n /** Whether to show the arrow indicator */\r\n readonly fuiPopoverHasArrow = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /** Whether to close on outside click */\r\n readonly fuiPopoverCloseOnOutsideClick = input<boolean, unknown>(true, { transform: booleanAttribute });\r\n\r\n /** Whether the popover trigger is disabled */\r\n readonly fuiPopoverDisabled = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /** Manual control for showing/hiding the popover (only works with trigger=\"manual\") */\r\n readonly fuiPopoverOpen = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n\r\n /** Emits when the popover is opened */\r\n readonly fuiPopoverOpened = output();\r\n\r\n /** Emits when the popover is closed */\r\n readonly fuiPopoverClosed = output();\r\n\r\n // Internal state\r\n readonly _isOpen: WritableSignal<boolean> = signal(false);\r\n private _overlayRef: FuiOverlayRef | null = null;\r\n private _embeddedViewRef: EmbeddedViewRef<unknown> | null = null;\r\n private _showTimeout: number | null = null;\r\n private _hideTimeout: number | null = null;\r\n private _subscriptions: Subscription[] = [];\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\r\n constructor() {\r\n // Handle manual control\r\n effect(() => {\r\n if (this.fuiPopoverTriggerOn() === 'manual') {\r\n if (this.fuiPopoverOpen()) {\r\n this._showPopover();\r\n } else {\r\n this._hidePopover();\r\n }\r\n }\r\n });\r\n\r\n // Handle disabled state\r\n effect(() => {\r\n if (this.fuiPopoverDisabled() && this._isOpen()) {\r\n this._hidePopover();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._clearTimeouts();\r\n this._destroyPopover();\r\n }\r\n\r\n @HostListener('click')\r\n onHostClick(): void {\r\n if (this.fuiPopoverTriggerOn() === 'click' && !this.fuiPopoverDisabled()) {\r\n if (this._isOpen()) {\r\n this._hidePopover();\r\n } else {\r\n this._showPopover();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter(): void {\r\n if (this.fuiPopoverTriggerOn() === 'hover' && !this.fuiPopoverDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave(): void {\r\n if (this.fuiPopoverTriggerOn() === 'hover' && !this.fuiPopoverDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n if (this.fuiPopoverTriggerOn() === 'focus' && !this.fuiPopoverDisabled()) {\r\n this._scheduleShow();\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n if (this.fuiPopoverTriggerOn() === 'focus' && !this.fuiPopoverDisabled()) {\r\n this._scheduleHide();\r\n }\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this._isOpen()) {\r\n this._hidePopover();\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /** Programmatically show the popover */\r\n show(): void {\r\n if (!this.fuiPopoverDisabled()) {\r\n this._showPopover();\r\n }\r\n }\r\n\r\n /** Programmatically hide the popover */\r\n hide(): void {\r\n this._hidePopover();\r\n }\r\n\r\n /** Toggle popover visibility */\r\n toggle(): void {\r\n if (this._isOpen()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n private _scheduleShow(): void {\r\n this._clearTimeouts();\r\n\r\n if (this.fuiPopoverShowDelay() > 0) {\r\n this._showTimeout = window.setTimeout(() => {\r\n this._showPopover();\r\n }, this.fuiPopoverShowDelay());\r\n } else {\r\n this._showPopover();\r\n }\r\n }\r\n\r\n private _scheduleHide(): void {\r\n this._clearTimeouts();\r\n\r\n if (this.fuiPopoverHideDelay() > 0) {\r\n this._hideTimeout = window.setTimeout(() => {\r\n this._hidePopover();\r\n }, this.fuiPopoverHideDelay());\r\n } else {\r\n this._hidePopover();\r\n }\r\n }\r\n\r\n private _previouslyFocusedElement: HTMLElement | null = null;\r\n\r\n private _showPopover(): void {\r\n if (this._isOpen() || this.fuiPopoverDisabled()) {\r\n return;\r\n }\r\n\r\n // Save the currently focused element for focus restoration\r\n this._previouslyFocusedElement = document.activeElement as HTMLElement;\r\n\r\n this._createPopover();\r\n this._isOpen.set(true);\r\n this.fuiPopoverOpened.emit();\r\n\r\n // Add click outside listener for click trigger\r\n if (this.fuiPopoverCloseOnOutsideClick()) {\r\n setTimeout(() => {\r\n document.addEventListener('click', this._onDocumentClick, true);\r\n });\r\n }\r\n\r\n // Focus the first focusable element within the popover\r\n setTimeout(() => {\r\n this._focusFirstInOverlay();\r\n });\r\n }\r\n\r\n private _hidePopover(): void {\r\n if (!this._isOpen()) {\r\n return;\r\n }\r\n\r\n this._isOpen.set(false);\r\n this._destroyPopover();\r\n this.fuiPopoverClosed.emit();\r\n document.removeEventListener('click', this._onDocumentClick, true);\r\n\r\n // Restore focus to the trigger element\r\n if (this._previouslyFocusedElement) {\r\n this._previouslyFocusedElement.focus();\r\n this._previouslyFocusedElement = null;\r\n }\r\n }\r\n\r\n private _focusFirstInOverlay(): void {\r\n const overlay = this._overlayRef?.overlayElement;\r\n if (!overlay) return;\r\n\r\n const focusable = overlay.querySelector<HTMLElement>(\r\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n\r\n if (focusable) {\r\n focusable.focus();\r\n }\r\n }\r\n\r\n private _createPopover(): void {\r\n if (this._overlayRef) {\r\n return;\r\n }\r\n\r\n const positions = this._getPositions(this.fuiPopoverPosition());\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(this._elementRef, positions)\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n this._overlayRef = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: this._overlayService.scrollStrategies.reposition(20),\r\n panelClass: 'fui-popover-panel',\r\n });\r\n\r\n // Attach the template to the overlay\r\n this._overlayRef.attach(this.fuiPopoverTrigger());\r\n\r\n // Subscribe to keydown events for ESC\r\n const keydownSub = this._overlayRef.keydownEvents.subscribe((event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n this._hidePopover();\r\n event.preventDefault();\r\n }\r\n });\r\n this._subscriptions.push(keydownSub);\r\n\r\n // Set up hover events on the overlay for hover trigger persistence\r\n if (this.fuiPopoverTriggerOn() === 'hover') {\r\n const overlayElement = this._overlayRef.overlayElement;\r\n overlayElement.addEventListener('mouseenter', this._onOverlayMouseEnter);\r\n overlayElement.addEventListener('mouseleave', this._onOverlayMouseLeave);\r\n }\r\n }\r\n\r\n private _getPositions(pos: PopoverPosition): FuiConnectedPosition[] {\r\n const offset = 8;\r\n const positionMap: Record<PopoverPosition, FuiConnectedPosition[]> = {\r\n top: [\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 'top-start': [\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 'top-end': [\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 bottom: [\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 'bottom-start': [\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 'bottom-end': [\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 left: [\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 'left-start': [\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 'left-end': [\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 right: [\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 'right-start': [\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 'right-end': [\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 };\r\n\r\n return positionMap[pos] || positionMap.bottom;\r\n }\r\n\r\n private _destroyPopover(): void {\r\n // Clean up subscriptions\r\n this._subscriptions.forEach((sub) => {\r\n sub.unsubscribe();\r\n });\r\n this._subscriptions = [];\r\n\r\n // Remove hover listeners from overlay\r\n if (this._overlayRef) {\r\n const overlayElement = this._overlayRef.overlayElement;\r\n overlayElement.removeEventListener('mouseenter', this._onOverlayMouseEnter);\r\n overlayElement.removeEventListener('mouseleave', this._onOverlayMouseLeave);\r\n\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n this._embeddedViewRef = null;\r\n }\r\n\r\n private _clearTimeouts(): void {\r\n if (this._showTimeout) {\r\n clearTimeout(this._showTimeout);\r\n this._showTimeout = null;\r\n }\r\n if (this._hideTimeout) {\r\n clearTimeout(this._hideTimeout);\r\n this._hideTimeout = null;\r\n }\r\n }\r\n\r\n private readonly _onDocumentClick = (event: Event): void => {\r\n const target = event.target as HTMLElement;\r\n const triggerElement = this._elementRef.nativeElement;\r\n const overlayElement = this._overlayRef?.overlayElement;\r\n\r\n if (target && !triggerElement.contains(target) && !overlayElement?.contains(target)) {\r\n this._hidePopover();\r\n }\r\n };\r\n\r\n private readonly _onOverlayMouseEnter = (): void => {\r\n this._clearTimeouts();\r\n };\r\n\r\n private readonly _onOverlayMouseLeave = (): void => {\r\n if (this.fuiPopoverTriggerOn() === 'hover') {\r\n this._scheduleHide();\r\n }\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -984,7 +984,7 @@ class FuiSelectComponent {
|
|
|
984
984
|
provide: FUI_SELECT,
|
|
985
985
|
useExisting: FuiSelectComponent,
|
|
986
986
|
},
|
|
987
|
-
], queries: [{ propertyName: "options", predicate: FuiOptionComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: "<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ _getDisplayValue() }}</span>\r\n }\r\n </span>\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel -->\r\n@if (panelOpen()) {\r\n <div\r\n #panel\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition: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)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-select{display:inline-block;width:100%;position:relative}.fui-select__trigger{width:100%;min-height:100%;display:flex;align-items:center;cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;background:transparent;border:none;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)}.fui-select__trigger:focus{outline:none}.fui-select__trigger:focus-visible{outline:none}.fui-select__trigger[aria-disabled=true]{cursor:not-allowed;opacity:.5}.fui-select__value{flex:1;display:flex;align-items:center;overflow:hidden;min-width:0}.fui-select__arrow{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-left:var(--fui-spacing-02);color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-select__arrow svg{width:1rem;height:1rem}.fui-select--open .fui-select__arrow{transform:rotate(180deg)}.fui-select--disabled{pointer-events:none}.fui-select--disabled .fui-select__trigger{cursor:not-allowed;opacity:.5}.fui-select--disabled .fui-select__arrow{color:var(--fui-text-disabled)}.fui-select--readonly{pointer-events:none}.fui-select--readonly .fui-select__trigger{opacity:1;cursor:default;color:var(--fui-text-primary)}.fui-select--readonly .fui-select__trigger[aria-disabled=true]{opacity:1;cursor:default}.fui-select--readonly .fui-select__value-text{color:var(--fui-text-primary)}.fui-select__value-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select__placeholder{color:var(--fui-text-disabled);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select .fui-select__panel{position:fixed;opacity:0;pointer-events:none}.fui-select__panel{--fui-select-panel-max-height: 16rem;--fui-select-panel-border-radius: var(--fui-border-radius-md);--fui-select-panel-shadow: var(--fui-shadow-04);--fui-select-panel-bg: var(--fui-surface-00);width:100%;max-height:var(--fui-select-panel-max-height);overflow-y:auto;overflow-x:hidden;background:var(--fui-select-panel-bg);border:1px solid var(--fui-border-color);border-radius:var(--fui-select-panel-border-radius);box-shadow:var(--fui-select-panel-shadow);padding:var(--fui-spacing-02) 0;transform-origin:top center;animation:fui-popover-enter var(--fui-duration-moderate-01) var(--fui-ease-entrance) both;will-change:transform,opacity}.fui-select__panel::-webkit-scrollbar{width:8px}.fui-select__panel::-webkit-scrollbar-track{background:var(--fui-surface-01);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb{background:var(--fui-border-color);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb:hover{background:var(--fui-text-secondary)}.fui-select-backdrop{background:transparent}.fui-select-overlay-panel{max-width:32rem
|
|
987
|
+
], queries: [{ propertyName: "options", predicate: FuiOptionComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: "<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ _getDisplayValue() }}</span>\r\n }\r\n </span>\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel -->\r\n@if (panelOpen()) {\r\n <div\r\n #panel\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition: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)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-select{display:inline-block;width:100%;position:relative}.fui-select__trigger{width:100%;min-height:100%;display:flex;align-items:center;cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;background:transparent;border:none;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)}.fui-select__trigger:focus{outline:none}.fui-select__trigger:focus-visible{outline:none}.fui-select__trigger[aria-disabled=true]{cursor:not-allowed;opacity:.5}.fui-select__value{flex:1;display:flex;align-items:center;overflow:hidden;min-width:0}.fui-select__arrow{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-left:var(--fui-spacing-02);color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-select__arrow svg{width:1rem;height:1rem}.fui-select--open .fui-select__arrow{transform:rotate(180deg)}.fui-select--disabled{pointer-events:none}.fui-select--disabled .fui-select__trigger{cursor:not-allowed;opacity:.5}.fui-select--disabled .fui-select__arrow{color:var(--fui-text-disabled)}.fui-select--readonly{pointer-events:none}.fui-select--readonly .fui-select__trigger{opacity:1;cursor:default;color:var(--fui-text-primary)}.fui-select--readonly .fui-select__trigger[aria-disabled=true]{opacity:1;cursor:default}.fui-select--readonly .fui-select__value-text{color:var(--fui-text-primary)}.fui-select__value-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select__placeholder{color:var(--fui-text-disabled);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select .fui-select__panel{position:fixed;opacity:0;pointer-events:none}.fui-select__panel{--fui-select-panel-max-height: 16rem;--fui-select-panel-border-radius: var(--fui-border-radius-md);--fui-select-panel-shadow: var(--fui-shadow-04);--fui-select-panel-bg: var(--fui-surface-00);width:100%;max-height:var(--fui-select-panel-max-height);overflow-y:auto;overflow-x:hidden;background:var(--fui-select-panel-bg);border:1px solid var(--fui-border-color);border-radius:var(--fui-select-panel-border-radius);box-shadow:var(--fui-select-panel-shadow);padding:var(--fui-spacing-02) 0;transform-origin:top center;animation:fui-popover-enter var(--fui-duration-moderate-01) var(--fui-ease-entrance) both;will-change:transform,opacity}.fui-select__panel::-webkit-scrollbar{width:8px}.fui-select__panel::-webkit-scrollbar-track{background:var(--fui-surface-01);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb{background:var(--fui-border-color);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb:hover{background:var(--fui-text-secondary)}.fui-select-backdrop{background:transparent}.fui-select-overlay-panel{max-width:32rem}@media(prefers-contrast:high){.fui-select__panel{border-width:2px}}@media(prefers-reduced-motion:reduce){.fui-select__panel{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
988
988
|
}
|
|
989
989
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSelectComponent, decorators: [{
|
|
990
990
|
type: Component,
|
|
@@ -1009,7 +1009,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
1009
1009
|
provide: FUI_SELECT,
|
|
1010
1010
|
useExisting: FuiSelectComponent,
|
|
1011
1011
|
},
|
|
1012
|
-
], template: "<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ _getDisplayValue() }}</span>\r\n }\r\n </span>\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel -->\r\n@if (panelOpen()) {\r\n <div\r\n #panel\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition: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)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-select{display:inline-block;width:100%;position:relative}.fui-select__trigger{width:100%;min-height:100%;display:flex;align-items:center;cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;background:transparent;border:none;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)}.fui-select__trigger:focus{outline:none}.fui-select__trigger:focus-visible{outline:none}.fui-select__trigger[aria-disabled=true]{cursor:not-allowed;opacity:.5}.fui-select__value{flex:1;display:flex;align-items:center;overflow:hidden;min-width:0}.fui-select__arrow{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-left:var(--fui-spacing-02);color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-select__arrow svg{width:1rem;height:1rem}.fui-select--open .fui-select__arrow{transform:rotate(180deg)}.fui-select--disabled{pointer-events:none}.fui-select--disabled .fui-select__trigger{cursor:not-allowed;opacity:.5}.fui-select--disabled .fui-select__arrow{color:var(--fui-text-disabled)}.fui-select--readonly{pointer-events:none}.fui-select--readonly .fui-select__trigger{opacity:1;cursor:default;color:var(--fui-text-primary)}.fui-select--readonly .fui-select__trigger[aria-disabled=true]{opacity:1;cursor:default}.fui-select--readonly .fui-select__value-text{color:var(--fui-text-primary)}.fui-select__value-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select__placeholder{color:var(--fui-text-disabled);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select .fui-select__panel{position:fixed;opacity:0;pointer-events:none}.fui-select__panel{--fui-select-panel-max-height: 16rem;--fui-select-panel-border-radius: var(--fui-border-radius-md);--fui-select-panel-shadow: var(--fui-shadow-04);--fui-select-panel-bg: var(--fui-surface-00);width:100%;max-height:var(--fui-select-panel-max-height);overflow-y:auto;overflow-x:hidden;background:var(--fui-select-panel-bg);border:1px solid var(--fui-border-color);border-radius:var(--fui-select-panel-border-radius);box-shadow:var(--fui-select-panel-shadow);padding:var(--fui-spacing-02) 0;transform-origin:top center;animation:fui-popover-enter var(--fui-duration-moderate-01) var(--fui-ease-entrance) both;will-change:transform,opacity}.fui-select__panel::-webkit-scrollbar{width:8px}.fui-select__panel::-webkit-scrollbar-track{background:var(--fui-surface-01);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb{background:var(--fui-border-color);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb:hover{background:var(--fui-text-secondary)}.fui-select-backdrop{background:transparent}.fui-select-overlay-panel{max-width:32rem
|
|
1012
|
+
], template: "<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ _getDisplayValue() }}</span>\r\n }\r\n </span>\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel -->\r\n@if (panelOpen()) {\r\n <div\r\n #panel\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition: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)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-select{display:inline-block;width:100%;position:relative}.fui-select__trigger{width:100%;min-height:100%;display:flex;align-items:center;cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;background:transparent;border:none;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)}.fui-select__trigger:focus{outline:none}.fui-select__trigger:focus-visible{outline:none}.fui-select__trigger[aria-disabled=true]{cursor:not-allowed;opacity:.5}.fui-select__value{flex:1;display:flex;align-items:center;overflow:hidden;min-width:0}.fui-select__arrow{display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-left:var(--fui-spacing-02);color:var(--fui-text-secondary);transition:transform var(--fui-duration-fast-02) var(--fui-ease-standard) 0ms}.fui-select__arrow svg{width:1rem;height:1rem}.fui-select--open .fui-select__arrow{transform:rotate(180deg)}.fui-select--disabled{pointer-events:none}.fui-select--disabled .fui-select__trigger{cursor:not-allowed;opacity:.5}.fui-select--disabled .fui-select__arrow{color:var(--fui-text-disabled)}.fui-select--readonly{pointer-events:none}.fui-select--readonly .fui-select__trigger{opacity:1;cursor:default;color:var(--fui-text-primary)}.fui-select--readonly .fui-select__trigger[aria-disabled=true]{opacity:1;cursor:default}.fui-select--readonly .fui-select__value-text{color:var(--fui-text-primary)}.fui-select__value-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select__placeholder{color:var(--fui-text-disabled);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fui-select .fui-select__panel{position:fixed;opacity:0;pointer-events:none}.fui-select__panel{--fui-select-panel-max-height: 16rem;--fui-select-panel-border-radius: var(--fui-border-radius-md);--fui-select-panel-shadow: var(--fui-shadow-04);--fui-select-panel-bg: var(--fui-surface-00);width:100%;max-height:var(--fui-select-panel-max-height);overflow-y:auto;overflow-x:hidden;background:var(--fui-select-panel-bg);border:1px solid var(--fui-border-color);border-radius:var(--fui-select-panel-border-radius);box-shadow:var(--fui-select-panel-shadow);padding:var(--fui-spacing-02) 0;transform-origin:top center;animation:fui-popover-enter var(--fui-duration-moderate-01) var(--fui-ease-entrance) both;will-change:transform,opacity}.fui-select__panel::-webkit-scrollbar{width:8px}.fui-select__panel::-webkit-scrollbar-track{background:var(--fui-surface-01);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb{background:var(--fui-border-color);border-radius:var(--fui-border-radius-sm)}.fui-select__panel::-webkit-scrollbar-thumb:hover{background:var(--fui-text-secondary)}.fui-select-backdrop{background:transparent}.fui-select-overlay-panel{max-width:32rem}@media(prefers-contrast:high){.fui-select__panel{border-width:2px}}@media(prefers-reduced-motion:reduce){.fui-select__panel{animation:none}}\n"] }]
|
|
1013
1013
|
}], ctorParameters: () => [], propDecorators: { placeholderInput: [{ 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 }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], openedChange: [{ type: i0.Output, args: ["openedChange"] }], trigger: [{
|
|
1014
1014
|
type: ViewChild,
|
|
1015
1015
|
args: ['trigger', { static: false }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-select.mjs","sources":["../../../lib/components/select/select-tokens.ts","../../../lib/components/select/option.component.ts","../../../lib/components/select/select.component.ts","../../../lib/components/select/select.component.html","../../../lib/components/select/raintonic-formaui-components-select.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Interface representing the parent select contract that options need.\r\n * Used to break the circular dependency between select and option components.\r\n */\r\nexport interface FuiSelectParent {\r\n multiple(): boolean;\r\n _onOptionSelected(option: any): void;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the parent select to options.\r\n */\r\nexport const FUI_SELECT = new InjectionToken<FuiSelectParent>('FUI_SELECT');\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n InputSignal,\r\n OutputEmitterRef,\r\n ElementRef,\r\n inject,\r\n signal,\r\n WritableSignal,\r\n HostListener,\r\n OnDestroy,\r\n AfterViewInit,\r\n} from '@angular/core';\r\n\r\nimport { Subject } from 'rxjs';\r\nimport { FUI_SELECT } from './select-tokens';\r\n\r\n/**\r\n * # FuiOption Component\r\n *\r\n * Individual option component for use within fui-select.\r\n * Works like Angular Material's mat-option with full accessibility support.\r\n *\r\n * ## Features\r\n * - Disabled state support\r\n * - Selection state management\r\n * - Full accessibility support (ARIA attributes)\r\n * - Keyboard navigation support\r\n * - Custom content projection\r\n * - Smooth hover animations\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Option\r\n * ```html\r\n * <fui-select placeholder=\"Select a status\">\r\n * <fui-option value=\"active\">Active</fui-option>\r\n * <fui-option value=\"inactive\">Inactive</fui-option>\r\n * <fui-option value=\"pending\" [disabled]=\"true\">Pending (Disabled)</fui-option>\r\n * </fui-select>\r\n * ```\r\n *\r\n * ### Option with Custom Content\r\n * ```html\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">\r\n * <fui-icon name=\"flag-us\"></fui-icon>\r\n * United States\r\n * </fui-option>\r\n * <fui-option value=\"ca\">\r\n * <fui-icon name=\"flag-ca\"></fui-icon>\r\n * Canada\r\n * </fui-option>\r\n * </fui-select>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-option',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n @if (_showCheckmark()) {\r\n <span class=\"fui-option__checkmark\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\r\n <path d=\"M6.5 11.5L3 8l1-1 2.5 2.5L12 4l1 1z\" />\r\n </svg>\r\n </span>\r\n }\r\n <span class=\"fui-option__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n `,\r\n styleUrls: ['./option.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-option',\r\n '[class.fui-option--selected]': '_selected()',\r\n '[class.fui-option--disabled]': 'disabled()',\r\n '[class.fui-option--active]': '_active()',\r\n role: 'option',\r\n '[attr.id]': 'id',\r\n '[attr.aria-selected]': '_selected()',\r\n '[attr.aria-disabled]': 'disabled()',\r\n '[attr.tabindex]': '-1',\r\n },\r\n})\r\nexport class FuiOptionComponent implements OnDestroy, AfterViewInit {\r\n static nextId = 0;\r\n\r\n /**\r\n * The value of the option\r\n */\r\n readonly value: InputSignal<unknown> = input<unknown>(undefined);\r\n\r\n /**\r\n * Whether the option is disabled\r\n * @default false\r\n */\r\n readonly disabled: InputSignal<boolean> = input(false);\r\n\r\n /**\r\n * Event emitted when the option is selected\r\n */\r\n readonly selectionChange: OutputEmitterRef<{ source: FuiOptionComponent; value: unknown }> = output();\r\n\r\n // Internal state\r\n readonly _selected: WritableSignal<boolean> = signal(false);\r\n readonly _active: WritableSignal<boolean> = signal(false);\r\n readonly stateChanges = new Subject<void>();\r\n\r\n // Element reference\r\n private readonly _element: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n // Parent select (optional - may not exist if used standalone)\r\n private readonly _parentSelect = inject(FUI_SELECT, { optional: true });\r\n\r\n // Unique ID\r\n readonly id = `fui-option-${FuiOptionComponent.nextId++}`;\r\n\r\n // Show checkmark only in multiple mode when selected\r\n readonly _showCheckmark = signal(false);\r\n\r\n ngAfterViewInit(): void {\r\n // Update checkmark visibility based on parent select's multiple mode\r\n this._updateCheckmarkVisibility();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // View value (text content)\r\n get viewValue(): string {\r\n return (this._element.nativeElement.textContent || '').trim();\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n _handleClick(event: Event): void {\r\n if (!this.disabled()) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Notify parent select\r\n if (this._parentSelect) {\r\n this._parentSelect._onOptionSelected(this);\r\n } else {\r\n // Standalone usage - emit event\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n _handleMouseEnter(): void {\r\n if (!this.disabled()) {\r\n this._active.set(true);\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n _handleMouseLeave(): void {\r\n this._active.set(false);\r\n }\r\n\r\n /**\r\n * Selects the option\r\n */\r\n select(): void {\r\n if (!this._selected()) {\r\n this._selected.set(true);\r\n this._updateCheckmarkVisibility();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the option\r\n */\r\n deselect(): void {\r\n if (this._selected()) {\r\n this._selected.set(false);\r\n this._updateCheckmarkVisibility();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as active (keyboard navigation)\r\n */\r\n setActive(): void {\r\n if (!this._active()) {\r\n this._active.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as inactive\r\n */\r\n setInactive(): void {\r\n if (this._active()) {\r\n this._active.set(false);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets focus onto this option\r\n */\r\n focus(): void {\r\n const element = this._element.nativeElement;\r\n if (typeof element.focus === 'function') {\r\n element.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the label to be used when displaying the option\r\n */\r\n getLabel(): string {\r\n return this.viewValue;\r\n }\r\n\r\n /**\r\n * Gets the host element\r\n */\r\n _getHostElement(): HTMLElement {\r\n return this._element.nativeElement;\r\n }\r\n\r\n /** Update checkmark visibility based on selection and multiple mode */\r\n private _updateCheckmarkVisibility(): void {\r\n const isMultiple = this._parentSelect?.multiple() ?? false;\r\n this._showCheckmark.set(isMultiple && this._selected());\r\n }\r\n\r\n /** Emits the selection change event */\r\n private _emitSelectionChangeEvent(): void {\r\n this.selectionChange.emit({ source: this, value: this.value() });\r\n }\r\n}\r\n","import {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DoCheck,\r\n effect,\r\n ElementRef,\r\n inject,\r\n NgZone,\r\n input,\r\n InputSignal,\r\n OnDestroy,\r\n output,\r\n OutputEmitterRef,\r\n signal,\r\n Signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NG_VALUE_ACCESSOR,\r\n NgControl,\r\n NgForm,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\r\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl } from '@raintonic/formaui/core';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport { FuiOptionComponent } from './option.component';\r\nimport { FuiConnectedPosition, FuiOverlayRef, FuiOverlayService } from '@raintonic/formaui/cdk/overlay';\r\nimport { FUI_SELECT } from './select-tokens';\r\n\r\n/**\r\n * Available select sizes\r\n */\r\nexport type FuiSelectSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Available select variants following Carbon Design System patterns\r\n */\r\nexport type FuiSelectVariant = 'outlined' | 'filled';\r\n\r\n/**\r\n * Selection change event object emitted when the select's selection changes\r\n */\r\nexport interface FuiSelectChange {\r\n source: FuiSelectComponent;\r\n value: unknown;\r\n}\r\n\r\n/**\r\n * # fui-select Component\r\n *\r\n * A select component designed to work seamlessly with fui-form-field.\r\n * Similar to Angular Material's mat-select integration with mat-form-field.\r\n * Provides full Reactive Forms support with validation and error handling.\r\n *\r\n * ## Features\r\n * - Works inside fui-form-field like mat-select\r\n * - Full Reactive Forms integration (ControlValueAccessor)\r\n * - Multiple selection support\r\n * - Options via projected content (fui-option)\r\n * - Disabled and readonly states\r\n * - Full accessibility support\r\n * - Full keyboard navigation (Arrow keys, Enter, Space, Escape, Home, End)\r\n * - Type-ahead search functionality\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Select with Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * <fui-option value=\"mx\">Mexico</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Reactive Forms and Validation\r\n * ```html\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select formControlName=\"country\" placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * </fui-select>\r\n * <fui-error *ngIf=\"form.get('country')?.hasError('required')\">\r\n * Country is required\r\n * </fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * ```\r\n *\r\n * ### Multiple Selection\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Skills</label>\r\n * <fui-select formControlName=\"skills\" [multiple]=\"true\">\r\n * <fui-option value=\"js\">JavaScript</fui-option>\r\n * <fui-option value=\"ts\">TypeScript</fui-option>\r\n * <fui-option value=\"py\">Python</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-select',\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n templateUrl: './select.component.html',\r\n styleUrls: ['./select.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-select',\r\n '[attr.id]': 'id',\r\n '[class.fui-select--open]': 'panelOpen()',\r\n '[class.fui-select--disabled]': 'disabled()',\r\n '[class.fui-select--multiple]': 'multiple()',\r\n '[class.fui-select--readonly]': '_readOnly()',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiSelectComponent,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiSelectComponent,\r\n },\r\n {\r\n provide: FUI_SELECT,\r\n useExisting: FuiSelectComponent,\r\n },\r\n ],\r\n})\r\nexport class FuiSelectComponent\r\n implements ControlValueAccessor, FuiFormFieldControl, DoCheck, OnDestroy, AfterContentInit\r\n{\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-select';\r\n\r\n // Inputs using new signal-based API\r\n readonly placeholderInput: InputSignal<string> = input('', { alias: 'placeholder' });\r\n readonly disabledInput: InputSignal<boolean> = input(false, { alias: 'disabled' });\r\n readonly readonly: InputSignal<boolean> = input(false);\r\n readonly multiple: InputSignal<boolean> = input(false);\r\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | null> = input<ErrorStateMatcher | null>(null);\r\n\r\n /**\r\n * Whether to compare option values using object identity or deep equality\r\n */\r\n readonly compareWith: InputSignal<(o1: unknown, o2: unknown) => boolean> = input<\r\n (o1: unknown, o2: unknown) => boolean\r\n >((o1, o2) => o1 === o2);\r\n\r\n // Outputs\r\n readonly valueChange: OutputEmitterRef<unknown> = output<unknown>();\r\n readonly selectionChange: OutputEmitterRef<FuiSelectChange> = output<FuiSelectChange>();\r\n readonly openedChange: OutputEmitterRef<boolean> = output<boolean>();\r\n\r\n // Internal state signals\r\n private readonly _value: WritableSignal<unknown> = signal(null);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n readonly _readOnly: WritableSignal<boolean> = signal(false);\r\n\r\n // FuiFormFieldControl implementation\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-select-${FuiSelectComponent.nextId++}`;\r\n _ariaDescribedby: string | null = null;\r\n\r\n // Error state\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n readonly errorState = this._errorState;\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 // Interface implementation\r\n readonly placeholder = computed(() => this.placeholderInput());\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n readonly required = this._required;\r\n\r\n readonly value = this._value;\r\n\r\n readonly focused = this._focused;\r\n\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n readonly disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled());\r\n\r\n readonly empty = computed(() => {\r\n const val = this._value();\r\n return val === null || val === undefined || (this.isArray(val) && val.length === 0);\r\n });\r\n\r\n readonly id = this._uid;\r\n\r\n // ViewChild for trigger and panel\r\n @ViewChild('trigger', { static: false }) trigger?: ElementRef<HTMLDivElement>;\r\n @ViewChild('panel', { static: false }) panel?: ElementRef<HTMLDivElement>;\r\n\r\n // ContentChildren for options\r\n readonly options = contentChildren(FuiOptionComponent, { descendants: true });\r\n\r\n // Panel open/close state\r\n readonly panelOpen = signal(false);\r\n\r\n // Active option index for keyboard navigation\r\n private readonly _activeOptionIndex: WritableSignal<number> = signal(-1);\r\n readonly activeOptionIndex = this._activeOptionIndex.asReadonly();\r\n\r\n // Live announcement for screen readers\r\n readonly _liveAnnouncement: WritableSignal<string> = signal('');\r\n\r\n // Overlay reference\r\n private _overlayRef: FuiOverlayRef | null = null;\r\n private _overlaySubscriptions = new Subscription();\r\n\r\n // Services\r\n private readonly _overlayService = inject(FuiOverlayService);\r\n private readonly _elementRef = inject(ElementRef);\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _ngZone = inject(NgZone);\r\n private _outsideClickSub?: Subscription;\r\n\r\n // Type-ahead search\r\n private _typeaheadBuffer = '';\r\n private _typeaheadTimeout: ReturnType<typeof setTimeout> | null = null;\r\n private readonly TYPE_AHEAD_DEBOUNCE = 200;\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: unknown) => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n private _onTouched: () => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n\r\n // Computed properties\r\n readonly displayValue: Signal<string> = computed(() => {\r\n const currentValue = this.value();\r\n const opts = this.options();\r\n\r\n if (currentValue === null || currentValue === undefined) {\r\n return '';\r\n }\r\n\r\n // Filter out options that don't have a value set yet\r\n const validOpts = opts.filter((opt) => opt.value() !== undefined);\r\n\r\n if (this.multiple()) {\r\n if (this.isArray(currentValue)) {\r\n const selectedOptions = validOpts.filter((opt) =>\r\n currentValue.some((v: unknown) => this.compareWith()(v, opt.value())),\r\n );\r\n return selectedOptions.map((opt) => opt.getLabel()).join(', ');\r\n }\r\n return '';\r\n } else {\r\n const selectedOption = validOpts.find((opt) => this.compareWith()(opt.value(), currentValue));\r\n return selectedOption ? selectedOption.getLabel() : String(currentValue);\r\n }\r\n });\r\n\r\n constructor() {\r\n // Set valueAccessor after NgControl is resolved\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 // Track all reactive inputs and internal signals\r\n this.placeholderInput();\r\n this.readonly();\r\n this.disabledInput();\r\n this.multiple();\r\n this.errorStateMatcher();\r\n this._focused();\r\n this._disabled();\r\n this._value();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n\r\n // Emit state change\r\n this.stateChanges.next();\r\n });\r\n\r\n // Effect to update options selected state when value or options change\r\n effect(() => {\r\n const currentValue = this._value();\r\n const opts = this.options();\r\n const isMultiple = this.multiple();\r\n const compareFn = this.compareWith();\r\n\r\n opts.forEach((option) => {\r\n const optValue = option.value();\r\n // Skip options that don't have a value set yet\r\n if (optValue === undefined) {\r\n return;\r\n }\r\n let isSelected = false;\r\n\r\n if (isMultiple && this.isArray(currentValue)) {\r\n isSelected = currentValue.some((v: unknown) => compareFn(v, optValue));\r\n } else {\r\n isSelected = compareFn(currentValue, optValue);\r\n }\r\n\r\n if (isSelected) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n });\r\n\r\n // Notify form-field that state may have changed (for display value updates)\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 this._outsideClickSub?.unsubscribe();\r\n this._disposeOverlay();\r\n if (this._typeaheadTimeout) {\r\n clearTimeout(this._typeaheadTimeout);\r\n }\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n // Set up initial selection based on value\r\n this._syncOptionsSelection();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: unknown): void {\r\n this._value.set(value ?? null);\r\n //this._syncOptionsSelection();\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // FuiFormFieldControl implementation\r\n onContainerClick(_event: MouseEvent): void {\r\n if (!this.disabled() && !this.readonly()) {\r\n this.toggle();\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 this._readOnly.set(readOnly);\r\n }\r\n\r\n // Sync options selection state with current value\r\n private _syncOptionsSelection(): void {\r\n const currentValue = this._value();\r\n const opts = this.options();\r\n const isMultiple = this.multiple();\r\n const compareFn = this.compareWith();\r\n\r\n opts.forEach((option) => {\r\n const optValue = option.value();\r\n // Skip options that don't have a value set yet\r\n if (optValue === undefined) {\r\n return;\r\n }\r\n let isSelected = false;\r\n\r\n if (isMultiple && this.isArray(currentValue)) {\r\n isSelected = currentValue.some((v: unknown) => compareFn(v, optValue));\r\n } else if (currentValue !== null && currentValue !== undefined) {\r\n isSelected = compareFn(currentValue, optValue);\r\n }\r\n\r\n if (isSelected) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n });\r\n }\r\n\r\n // Focus/blur event handlers from template\r\n _onFocus(): void {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n\r\n _onBlur(event?: FocusEvent): void {\r\n if (this.panelOpen()) {\r\n // Check if focus moved to the overlay panel (e.g. clicking an option).\r\n // In that case, don't close — the user is interacting with the dropdown.\r\n const relatedTarget = event?.relatedTarget as HTMLElement | null;\r\n const overlayElement = this._overlayRef?.overlayElement;\r\n if (relatedTarget && overlayElement?.contains(relatedTarget)) {\r\n return;\r\n }\r\n // Focus left the select entirely (e.g. Tab) — close without restoring focus\r\n this.close(false);\r\n }\r\n this._focused.set(false);\r\n this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n // Public methods\r\n focus(): void {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n\r\n blur(): void {\r\n this.trigger?.nativeElement.blur();\r\n }\r\n\r\n // Toggle panel open/close\r\n toggle(): void {\r\n if (this.disabled()) return;\r\n if (this.panelOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n // Open the dropdown panel\r\n open(): void {\r\n if (this.disabled() || this.readonly() || this.panelOpen()) return;\r\n // Ensure DOM focus is on the trigger so blur/Tab work correctly\r\n this.trigger?.nativeElement.focus();\r\n requestAnimationFrame(() => {\r\n this.panelOpen.set(true);\r\n this._focused.set(true);\r\n this.openedChange.emit(true);\r\n\r\n // Set active option to currently selected or first option\r\n this._setInitialActiveOption();\r\n\r\n // Create overlay after the view updates\r\n setTimeout(() => {\r\n this._createOverlay();\r\n this._scrollToActiveOption();\r\n this._listenForOutsideClicks();\r\n });\r\n });\r\n }\r\n\r\n // Close the dropdown panel\r\n close(restoreFocus = true): void {\r\n if (!this.panelOpen()) return;\r\n this._outsideClickSub?.unsubscribe();\r\n\r\n this.panelOpen.set(false);\r\n this._focused.set(false);\r\n this._activeOptionIndex.set(-1);\r\n this._disposeOverlay();\r\n this.openedChange.emit(false);\r\n this._onTouched();\r\n\r\n // Return focus to trigger only when explicitly requested (e.g. Escape, backdrop click).\r\n // When closing via Tab, let the browser move focus naturally.\r\n // Focus synchronously to avoid race conditions with Tab key presses.\r\n if (restoreFocus) {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n }\r\n\r\n // Handle option selection (called by FuiOptionComponent)\r\n _onOptionSelected(option: FuiOptionComponent): void {\r\n const newValue = option.value();\r\n\r\n if (this.multiple()) {\r\n const raw = this._value();\r\n const currentValue = this.isArray(raw) ? [...raw] : [];\r\n const compareFn = this.compareWith();\r\n const index = currentValue.findIndex((v: unknown) => compareFn(v, newValue));\r\n\r\n if (index > -1) {\r\n currentValue.splice(index, 1);\r\n option.deselect();\r\n } else {\r\n currentValue.push(newValue);\r\n option.select();\r\n }\r\n\r\n this._value.set(currentValue);\r\n this._onChange(currentValue);\r\n this.valueChange.emit(currentValue);\r\n this.selectionChange.emit({ source: this, value: currentValue });\r\n\r\n // Announce for screen readers\r\n const label = option.getLabel();\r\n const action = index > -1 ? 'deselected' : 'selected';\r\n this._announce(`${label} ${action}`);\r\n } else {\r\n // Deselect previous option\r\n const opts = this.options();\r\n opts.forEach((opt) => {\r\n if (opt !== option) {\r\n opt.deselect();\r\n }\r\n });\r\n\r\n option.select();\r\n this._value.set(newValue);\r\n this._onChange(newValue);\r\n this.valueChange.emit(newValue);\r\n this.selectionChange.emit({ source: this, value: newValue });\r\n\r\n // Announce for screen readers\r\n this._announce(`${option.getLabel()} selected`);\r\n this.close();\r\n }\r\n\r\n this.stateChanges.next();\r\n }\r\n\r\n // Get display value for trigger\r\n _getDisplayValue(): string {\r\n return this.displayValue();\r\n }\r\n\r\n // Handle keyboard navigation\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n const isOpen = this.panelOpen();\r\n\r\n if (!isOpen) {\r\n this._handleClosedKeydown(event);\r\n } else {\r\n this._handleOpenKeydown(event);\r\n }\r\n }\r\n\r\n // Handle keydown when panel is closed\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const key = event.key;\r\n\r\n switch (key) {\r\n case 'Enter':\r\n case ' ':\r\n case 'ArrowDown':\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.open();\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._selectFirstOption();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._selectLastOption();\r\n break;\r\n default:\r\n // Type-ahead when closed\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Handle keydown when panel is open\r\n private _handleOpenKeydown(event: KeyboardEvent): void {\r\n const PAGE_SIZE = 5;\r\n const key = event.key;\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n\r\n switch (key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._setNextActiveOption(1);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._setNextActiveOption(-1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(0);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(opts.length - 1);\r\n break;\r\n case 'PageDown':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n const newIndex = Math.min(activeIndex + PAGE_SIZE, opts.length - 1);\r\n this._setActiveOptionIndex(newIndex);\r\n }\r\n break;\r\n case 'PageUp':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n const newIndex = Math.max(activeIndex - PAGE_SIZE, 0);\r\n this._setActiveOptionIndex(newIndex);\r\n }\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n if (activeIndex >= 0 && activeIndex < opts.length) {\r\n this._onOptionSelected(opts[activeIndex]);\r\n }\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n this.close();\r\n break;\r\n case 'Tab':\r\n // Don't preventDefault — let browser handle Tab naturally.\r\n // _onBlur will close the panel when focus leaves the trigger.\r\n break;\r\n default:\r\n // Type-ahead when open\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n event.preventDefault();\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Set the next active option based on delta\r\n private _setNextActiveOption(delta: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) return;\r\n\r\n const currentIndex = this._activeOptionIndex();\r\n let newIndex = currentIndex + delta;\r\n\r\n // Wrap around\r\n if (newIndex < 0) {\r\n newIndex = opts.length - 1;\r\n } else if (newIndex >= opts.length) {\r\n newIndex = 0;\r\n }\r\n\r\n this._setActiveOptionIndex(newIndex);\r\n }\r\n\r\n // Set the active option index\r\n private _setActiveOptionIndex(index: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (index < 0 || index >= opts.length) return;\r\n\r\n // Update active state on options\r\n const allOpts = this.options();\r\n allOpts.forEach((opt) => {\r\n opt.setInactive();\r\n });\r\n\r\n const activeOption = opts[index];\r\n activeOption.setActive();\r\n this._activeOptionIndex.set(index);\r\n this._scrollToActiveOption();\r\n\r\n // Announce active option for screen readers (when panel is open and using keyboard)\r\n if (this.panelOpen()) {\r\n const label = activeOption.getLabel();\r\n const selectedState = activeOption._selected() ? ', selected' : '';\r\n this._announce(`${label}${selectedState}, ${index + 1} of ${opts.length}`);\r\n }\r\n }\r\n\r\n // Set initial active option when opening\r\n private _setInitialActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) {\r\n this._activeOptionIndex.set(-1);\r\n return;\r\n }\r\n\r\n const currentValue = this._value();\r\n const compareFn = this.compareWith();\r\n\r\n // Find the first selected option\r\n let selectedIndex = -1;\r\n if (!this.multiple() && currentValue !== null && currentValue !== undefined) {\r\n selectedIndex = opts.findIndex((opt) => compareFn(opt.value(), currentValue));\r\n } else if (this.multiple() && this.isArray(currentValue) && currentValue.length > 0) {\r\n selectedIndex = opts.findIndex((opt) => currentValue.some((v: unknown) => compareFn(v, opt.value())));\r\n }\r\n\r\n const initialIndex = selectedIndex >= 0 ? selectedIndex : 0;\r\n this._setActiveOptionIndex(initialIndex);\r\n }\r\n\r\n // Scroll to active option\r\n private _scrollToActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n\r\n if (activeIndex < 0 || activeIndex >= opts.length) return;\r\n\r\n const activeOption = opts[activeIndex];\r\n const element = activeOption._getHostElement();\r\n const panel = this.panel?.nativeElement;\r\n\r\n if (element && panel) {\r\n const optionTop = element.offsetTop;\r\n const optionBottom = optionTop + element.offsetHeight;\r\n const panelTop = panel.scrollTop;\r\n const panelBottom = panelTop + panel.clientHeight;\r\n\r\n if (optionTop < panelTop) {\r\n panel.scrollTop = optionTop;\r\n } else if (optionBottom > panelBottom) {\r\n panel.scrollTop = optionBottom - panel.clientHeight;\r\n }\r\n }\r\n }\r\n\r\n // Handle type-ahead search\r\n private _handleTypeahead(char: string): void {\r\n // Clear timeout and add to buffer\r\n if (this._typeaheadTimeout) {\r\n clearTimeout(this._typeaheadTimeout);\r\n }\r\n this._typeaheadBuffer += char.toLowerCase();\r\n\r\n // Find matching option\r\n const opts = this._getEnabledOptions();\r\n const matchIndex = opts.findIndex((opt) => opt.getLabel().toLowerCase().startsWith(this._typeaheadBuffer));\r\n\r\n if (matchIndex >= 0) {\r\n if (this.panelOpen()) {\r\n this._setActiveOptionIndex(matchIndex);\r\n } else {\r\n // Select the option when closed\r\n this._onOptionSelected(opts[matchIndex]);\r\n }\r\n }\r\n\r\n // Clear buffer after debounce\r\n this._typeaheadTimeout = setTimeout(() => {\r\n this._typeaheadBuffer = '';\r\n }, this.TYPE_AHEAD_DEBOUNCE);\r\n }\r\n\r\n // Select first non-disabled option\r\n private _selectFirstOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[0]);\r\n }\r\n }\r\n\r\n // Select last non-disabled option\r\n private _selectLastOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[opts.length - 1]);\r\n }\r\n }\r\n\r\n // Get all non-disabled options\r\n private _getEnabledOptions(): FuiOptionComponent[] {\r\n return this.options().filter((opt) => !opt.disabled());\r\n }\r\n\r\n // Start listening for outside clicks when panel opens\r\n private _listenForOutsideClicks(): void {\r\n this._outsideClickSub?.unsubscribe();\r\n\r\n // Run outside Angular zone to avoid triggering change detection on every document click\r\n this._ngZone.runOutsideAngular(() => {\r\n // Use setTimeout to skip the current click event that opened the panel\r\n setTimeout(() => {\r\n this._outsideClickSub = fromEvent<MouseEvent>(this._document, 'click')\r\n .pipe(\r\n filter(() => this.panelOpen()),\r\n filter((event) => {\r\n const target = event.target as HTMLElement;\r\n const triggerElement = this.trigger?.nativeElement;\r\n const panelElement = this.panel?.nativeElement;\r\n const overlayElement = this._overlayRef?.overlayElement;\r\n return (\r\n !triggerElement?.contains(target) &&\r\n !panelElement?.contains(target) &&\r\n !overlayElement?.contains(target)\r\n );\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 // Create overlay for panel\r\n private _createOverlay(): void {\r\n if (this._overlayRef || !this.panel || !this.trigger) return;\r\n\r\n const triggerElement = this.trigger.nativeElement;\r\n const triggerWidth = triggerElement.getBoundingClientRect().width;\r\n\r\n const positions: FuiConnectedPosition[] = [\r\n // Primary: open below\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n // Fallback: open above if no space below\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(triggerElement, positions)\r\n .withPush(false)\r\n .withFlexibleDimensions(true)\r\n .withViewportMargin(8);\r\n\r\n this._overlayRef = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: this._overlayService.scrollStrategies.reposition(),\r\n hasBackdrop: true,\r\n backdropClass: 'fui-select-backdrop',\r\n backdropClickBehavior: 'close',\r\n panelClass: ['fui-select-overlay-panel'],\r\n width: triggerWidth,\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 this._overlaySubscriptions.add(\r\n this._overlayRef.backdropClick.subscribe(() => {\r\n this.close();\r\n }),\r\n );\r\n\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 // Attach panel to overlay\r\n const panelElement = this.panel.nativeElement;\r\n this._overlayRef.attach(panelElement);\r\n }\r\n\r\n // Dispose overlay\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 // Get the active option's id for aria-activedescendant\r\n _getActiveDescendant(): string | null {\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n if (activeIndex >= 0 && activeIndex < opts.length) {\r\n return opts[activeIndex].id;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Announces a message to screen readers via the aria-live region.\r\n * Clears the message after a brief delay to allow repeated announcements.\r\n */\r\n private _announce(message: string): void {\r\n // Clear first to ensure repeated identical messages are announced\r\n this._liveAnnouncement.set('');\r\n setTimeout(() => {\r\n this._liveAnnouncement.set(message);\r\n }, 50);\r\n }\r\n\r\n // Mat-select compatibility methods\r\n get selected(): Signal<unknown> {\r\n return this.value;\r\n }\r\n\r\n // Helper method to check if value is array\r\n isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n }\r\n}\r\n","<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ _getDisplayValue() }}</span>\r\n }\r\n </span>\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel -->\r\n@if (panelOpen()) {\r\n <div\r\n #panel\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-select.mjs","sources":["../../../lib/components/select/select-tokens.ts","../../../lib/components/select/option.component.ts","../../../lib/components/select/select.component.ts","../../../lib/components/select/select.component.html","../../../lib/components/select/raintonic-formaui-components-select.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Interface representing the parent select contract that options need.\r\n * Used to break the circular dependency between select and option components.\r\n */\r\nexport interface FuiSelectParent {\r\n multiple(): boolean;\r\n _onOptionSelected(option: any): void;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the parent select to options.\r\n */\r\nexport const FUI_SELECT = new InjectionToken<FuiSelectParent>('FUI_SELECT');\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n InputSignal,\r\n OutputEmitterRef,\r\n ElementRef,\r\n inject,\r\n signal,\r\n WritableSignal,\r\n HostListener,\r\n OnDestroy,\r\n AfterViewInit,\r\n} from '@angular/core';\r\n\r\nimport { Subject } from 'rxjs';\r\nimport { FUI_SELECT } from './select-tokens';\r\n\r\n/**\r\n * # FuiOption Component\r\n *\r\n * Individual option component for use within fui-select.\r\n * Works like Angular Material's mat-option with full accessibility support.\r\n *\r\n * ## Features\r\n * - Disabled state support\r\n * - Selection state management\r\n * - Full accessibility support (ARIA attributes)\r\n * - Keyboard navigation support\r\n * - Custom content projection\r\n * - Smooth hover animations\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Option\r\n * ```html\r\n * <fui-select placeholder=\"Select a status\">\r\n * <fui-option value=\"active\">Active</fui-option>\r\n * <fui-option value=\"inactive\">Inactive</fui-option>\r\n * <fui-option value=\"pending\" [disabled]=\"true\">Pending (Disabled)</fui-option>\r\n * </fui-select>\r\n * ```\r\n *\r\n * ### Option with Custom Content\r\n * ```html\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">\r\n * <fui-icon name=\"flag-us\"></fui-icon>\r\n * United States\r\n * </fui-option>\r\n * <fui-option value=\"ca\">\r\n * <fui-icon name=\"flag-ca\"></fui-icon>\r\n * Canada\r\n * </fui-option>\r\n * </fui-select>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-option',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n @if (_showCheckmark()) {\r\n <span class=\"fui-option__checkmark\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\r\n <path d=\"M6.5 11.5L3 8l1-1 2.5 2.5L12 4l1 1z\" />\r\n </svg>\r\n </span>\r\n }\r\n <span class=\"fui-option__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n `,\r\n styleUrls: ['./option.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-option',\r\n '[class.fui-option--selected]': '_selected()',\r\n '[class.fui-option--disabled]': 'disabled()',\r\n '[class.fui-option--active]': '_active()',\r\n role: 'option',\r\n '[attr.id]': 'id',\r\n '[attr.aria-selected]': '_selected()',\r\n '[attr.aria-disabled]': 'disabled()',\r\n '[attr.tabindex]': '-1',\r\n },\r\n})\r\nexport class FuiOptionComponent implements OnDestroy, AfterViewInit {\r\n static nextId = 0;\r\n\r\n /**\r\n * The value of the option\r\n */\r\n readonly value: InputSignal<unknown> = input<unknown>(undefined);\r\n\r\n /**\r\n * Whether the option is disabled\r\n * @default false\r\n */\r\n readonly disabled: InputSignal<boolean> = input(false);\r\n\r\n /**\r\n * Event emitted when the option is selected\r\n */\r\n readonly selectionChange: OutputEmitterRef<{ source: FuiOptionComponent; value: unknown }> = output();\r\n\r\n // Internal state\r\n readonly _selected: WritableSignal<boolean> = signal(false);\r\n readonly _active: WritableSignal<boolean> = signal(false);\r\n readonly stateChanges = new Subject<void>();\r\n\r\n // Element reference\r\n private readonly _element: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n // Parent select (optional - may not exist if used standalone)\r\n private readonly _parentSelect = inject(FUI_SELECT, { optional: true });\r\n\r\n // Unique ID\r\n readonly id = `fui-option-${FuiOptionComponent.nextId++}`;\r\n\r\n // Show checkmark only in multiple mode when selected\r\n readonly _showCheckmark = signal(false);\r\n\r\n ngAfterViewInit(): void {\r\n // Update checkmark visibility based on parent select's multiple mode\r\n this._updateCheckmarkVisibility();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // View value (text content)\r\n get viewValue(): string {\r\n return (this._element.nativeElement.textContent || '').trim();\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n _handleClick(event: Event): void {\r\n if (!this.disabled()) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Notify parent select\r\n if (this._parentSelect) {\r\n this._parentSelect._onOptionSelected(this);\r\n } else {\r\n // Standalone usage - emit event\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n _handleMouseEnter(): void {\r\n if (!this.disabled()) {\r\n this._active.set(true);\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n _handleMouseLeave(): void {\r\n this._active.set(false);\r\n }\r\n\r\n /**\r\n * Selects the option\r\n */\r\n select(): void {\r\n if (!this._selected()) {\r\n this._selected.set(true);\r\n this._updateCheckmarkVisibility();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the option\r\n */\r\n deselect(): void {\r\n if (this._selected()) {\r\n this._selected.set(false);\r\n this._updateCheckmarkVisibility();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as active (keyboard navigation)\r\n */\r\n setActive(): void {\r\n if (!this._active()) {\r\n this._active.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as inactive\r\n */\r\n setInactive(): void {\r\n if (this._active()) {\r\n this._active.set(false);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets focus onto this option\r\n */\r\n focus(): void {\r\n const element = this._element.nativeElement;\r\n if (typeof element.focus === 'function') {\r\n element.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the label to be used when displaying the option\r\n */\r\n getLabel(): string {\r\n return this.viewValue;\r\n }\r\n\r\n /**\r\n * Gets the host element\r\n */\r\n _getHostElement(): HTMLElement {\r\n return this._element.nativeElement;\r\n }\r\n\r\n /** Update checkmark visibility based on selection and multiple mode */\r\n private _updateCheckmarkVisibility(): void {\r\n const isMultiple = this._parentSelect?.multiple() ?? false;\r\n this._showCheckmark.set(isMultiple && this._selected());\r\n }\r\n\r\n /** Emits the selection change event */\r\n private _emitSelectionChangeEvent(): void {\r\n this.selectionChange.emit({ source: this, value: this.value() });\r\n }\r\n}\r\n","import {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DoCheck,\r\n effect,\r\n ElementRef,\r\n inject,\r\n NgZone,\r\n input,\r\n InputSignal,\r\n OnDestroy,\r\n output,\r\n OutputEmitterRef,\r\n signal,\r\n Signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NG_VALUE_ACCESSOR,\r\n NgControl,\r\n NgForm,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { fromEvent, Subject, Subscription } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\r\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl } from '@raintonic/formaui/core';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport { FuiOptionComponent } from './option.component';\r\nimport { FuiConnectedPosition, FuiOverlayRef, FuiOverlayService } from '@raintonic/formaui/cdk/overlay';\r\nimport { FUI_SELECT } from './select-tokens';\r\n\r\n/**\r\n * Available select sizes\r\n */\r\nexport type FuiSelectSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Available select variants following Carbon Design System patterns\r\n */\r\nexport type FuiSelectVariant = 'outlined' | 'filled';\r\n\r\n/**\r\n * Selection change event object emitted when the select's selection changes\r\n */\r\nexport interface FuiSelectChange {\r\n source: FuiSelectComponent;\r\n value: unknown;\r\n}\r\n\r\n/**\r\n * # fui-select Component\r\n *\r\n * A select component designed to work seamlessly with fui-form-field.\r\n * Similar to Angular Material's mat-select integration with mat-form-field.\r\n * Provides full Reactive Forms support with validation and error handling.\r\n *\r\n * ## Features\r\n * - Works inside fui-form-field like mat-select\r\n * - Full Reactive Forms integration (ControlValueAccessor)\r\n * - Multiple selection support\r\n * - Options via projected content (fui-option)\r\n * - Disabled and readonly states\r\n * - Full accessibility support\r\n * - Full keyboard navigation (Arrow keys, Enter, Space, Escape, Home, End)\r\n * - Type-ahead search functionality\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Select with Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * <fui-option value=\"mx\">Mexico</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Reactive Forms and Validation\r\n * ```html\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select formControlName=\"country\" placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * </fui-select>\r\n * <fui-error *ngIf=\"form.get('country')?.hasError('required')\">\r\n * Country is required\r\n * </fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * ```\r\n *\r\n * ### Multiple Selection\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Skills</label>\r\n * <fui-select formControlName=\"skills\" [multiple]=\"true\">\r\n * <fui-option value=\"js\">JavaScript</fui-option>\r\n * <fui-option value=\"ts\">TypeScript</fui-option>\r\n * <fui-option value=\"py\">Python</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-select',\r\n standalone: true,\r\n imports: [ReactiveFormsModule],\r\n templateUrl: './select.component.html',\r\n styleUrls: ['./select.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-select',\r\n '[attr.id]': 'id',\r\n '[class.fui-select--open]': 'panelOpen()',\r\n '[class.fui-select--disabled]': 'disabled()',\r\n '[class.fui-select--multiple]': 'multiple()',\r\n '[class.fui-select--readonly]': '_readOnly()',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiSelectComponent,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiSelectComponent,\r\n },\r\n {\r\n provide: FUI_SELECT,\r\n useExisting: FuiSelectComponent,\r\n },\r\n ],\r\n})\r\nexport class FuiSelectComponent\r\n implements ControlValueAccessor, FuiFormFieldControl, DoCheck, OnDestroy, AfterContentInit\r\n{\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-select';\r\n\r\n // Inputs using new signal-based API\r\n readonly placeholderInput: InputSignal<string> = input('', { alias: 'placeholder' });\r\n readonly disabledInput: InputSignal<boolean> = input(false, { alias: 'disabled' });\r\n readonly readonly: InputSignal<boolean> = input(false);\r\n readonly multiple: InputSignal<boolean> = input(false);\r\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | null> = input<ErrorStateMatcher | null>(null);\r\n\r\n /**\r\n * Whether to compare option values using object identity or deep equality\r\n */\r\n readonly compareWith: InputSignal<(o1: unknown, o2: unknown) => boolean> = input<\r\n (o1: unknown, o2: unknown) => boolean\r\n >((o1, o2) => o1 === o2);\r\n\r\n // Outputs\r\n readonly valueChange: OutputEmitterRef<unknown> = output<unknown>();\r\n readonly selectionChange: OutputEmitterRef<FuiSelectChange> = output<FuiSelectChange>();\r\n readonly openedChange: OutputEmitterRef<boolean> = output<boolean>();\r\n\r\n // Internal state signals\r\n private readonly _value: WritableSignal<unknown> = signal(null);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n readonly _readOnly: WritableSignal<boolean> = signal(false);\r\n\r\n // FuiFormFieldControl implementation\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-select-${FuiSelectComponent.nextId++}`;\r\n _ariaDescribedby: string | null = null;\r\n\r\n // Error state\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n readonly errorState = this._errorState;\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 // Interface implementation\r\n readonly placeholder = computed(() => this.placeholderInput());\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n readonly required = this._required;\r\n\r\n readonly value = this._value;\r\n\r\n readonly focused = this._focused;\r\n\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n readonly disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled());\r\n\r\n readonly empty = computed(() => {\r\n const val = this._value();\r\n return val === null || val === undefined || (this.isArray(val) && val.length === 0);\r\n });\r\n\r\n readonly id = this._uid;\r\n\r\n // ViewChild for trigger and panel\r\n @ViewChild('trigger', { static: false }) trigger?: ElementRef<HTMLDivElement>;\r\n @ViewChild('panel', { static: false }) panel?: ElementRef<HTMLDivElement>;\r\n\r\n // ContentChildren for options\r\n readonly options = contentChildren(FuiOptionComponent, { descendants: true });\r\n\r\n // Panel open/close state\r\n readonly panelOpen = signal(false);\r\n\r\n // Active option index for keyboard navigation\r\n private readonly _activeOptionIndex: WritableSignal<number> = signal(-1);\r\n readonly activeOptionIndex = this._activeOptionIndex.asReadonly();\r\n\r\n // Live announcement for screen readers\r\n readonly _liveAnnouncement: WritableSignal<string> = signal('');\r\n\r\n // Overlay reference\r\n private _overlayRef: FuiOverlayRef | null = null;\r\n private _overlaySubscriptions = new Subscription();\r\n\r\n // Services\r\n private readonly _overlayService = inject(FuiOverlayService);\r\n private readonly _elementRef = inject(ElementRef);\r\n private readonly _document = inject(DOCUMENT);\r\n private readonly _ngZone = inject(NgZone);\r\n private _outsideClickSub?: Subscription;\r\n\r\n // Type-ahead search\r\n private _typeaheadBuffer = '';\r\n private _typeaheadTimeout: ReturnType<typeof setTimeout> | null = null;\r\n private readonly TYPE_AHEAD_DEBOUNCE = 200;\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: unknown) => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n private _onTouched: () => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n\r\n // Computed properties\r\n readonly displayValue: Signal<string> = computed(() => {\r\n const currentValue = this.value();\r\n const opts = this.options();\r\n\r\n if (currentValue === null || currentValue === undefined) {\r\n return '';\r\n }\r\n\r\n // Filter out options that don't have a value set yet\r\n const validOpts = opts.filter((opt) => opt.value() !== undefined);\r\n\r\n if (this.multiple()) {\r\n if (this.isArray(currentValue)) {\r\n const selectedOptions = validOpts.filter((opt) =>\r\n currentValue.some((v: unknown) => this.compareWith()(v, opt.value())),\r\n );\r\n return selectedOptions.map((opt) => opt.getLabel()).join(', ');\r\n }\r\n return '';\r\n } else {\r\n const selectedOption = validOpts.find((opt) => this.compareWith()(opt.value(), currentValue));\r\n return selectedOption ? selectedOption.getLabel() : String(currentValue);\r\n }\r\n });\r\n\r\n constructor() {\r\n // Set valueAccessor after NgControl is resolved\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 // Track all reactive inputs and internal signals\r\n this.placeholderInput();\r\n this.readonly();\r\n this.disabledInput();\r\n this.multiple();\r\n this.errorStateMatcher();\r\n this._focused();\r\n this._disabled();\r\n this._value();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n\r\n // Emit state change\r\n this.stateChanges.next();\r\n });\r\n\r\n // Effect to update options selected state when value or options change\r\n effect(() => {\r\n const currentValue = this._value();\r\n const opts = this.options();\r\n const isMultiple = this.multiple();\r\n const compareFn = this.compareWith();\r\n\r\n opts.forEach((option) => {\r\n const optValue = option.value();\r\n // Skip options that don't have a value set yet\r\n if (optValue === undefined) {\r\n return;\r\n }\r\n let isSelected = false;\r\n\r\n if (isMultiple && this.isArray(currentValue)) {\r\n isSelected = currentValue.some((v: unknown) => compareFn(v, optValue));\r\n } else {\r\n isSelected = compareFn(currentValue, optValue);\r\n }\r\n\r\n if (isSelected) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n });\r\n\r\n // Notify form-field that state may have changed (for display value updates)\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 this._outsideClickSub?.unsubscribe();\r\n this._disposeOverlay();\r\n if (this._typeaheadTimeout) {\r\n clearTimeout(this._typeaheadTimeout);\r\n }\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n // Set up initial selection based on value\r\n this._syncOptionsSelection();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: unknown): void {\r\n this._value.set(value ?? null);\r\n //this._syncOptionsSelection();\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // FuiFormFieldControl implementation\r\n onContainerClick(_event: MouseEvent): void {\r\n if (!this.disabled() && !this.readonly()) {\r\n this.toggle();\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 this._readOnly.set(readOnly);\r\n }\r\n\r\n // Sync options selection state with current value\r\n private _syncOptionsSelection(): void {\r\n const currentValue = this._value();\r\n const opts = this.options();\r\n const isMultiple = this.multiple();\r\n const compareFn = this.compareWith();\r\n\r\n opts.forEach((option) => {\r\n const optValue = option.value();\r\n // Skip options that don't have a value set yet\r\n if (optValue === undefined) {\r\n return;\r\n }\r\n let isSelected = false;\r\n\r\n if (isMultiple && this.isArray(currentValue)) {\r\n isSelected = currentValue.some((v: unknown) => compareFn(v, optValue));\r\n } else if (currentValue !== null && currentValue !== undefined) {\r\n isSelected = compareFn(currentValue, optValue);\r\n }\r\n\r\n if (isSelected) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n });\r\n }\r\n\r\n // Focus/blur event handlers from template\r\n _onFocus(): void {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n\r\n _onBlur(event?: FocusEvent): void {\r\n if (this.panelOpen()) {\r\n // Check if focus moved to the overlay panel (e.g. clicking an option).\r\n // In that case, don't close — the user is interacting with the dropdown.\r\n const relatedTarget = event?.relatedTarget as HTMLElement | null;\r\n const overlayElement = this._overlayRef?.overlayElement;\r\n if (relatedTarget && overlayElement?.contains(relatedTarget)) {\r\n return;\r\n }\r\n // Focus left the select entirely (e.g. Tab) — close without restoring focus\r\n this.close(false);\r\n }\r\n this._focused.set(false);\r\n this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n // Public methods\r\n focus(): void {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n\r\n blur(): void {\r\n this.trigger?.nativeElement.blur();\r\n }\r\n\r\n // Toggle panel open/close\r\n toggle(): void {\r\n if (this.disabled()) return;\r\n if (this.panelOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n // Open the dropdown panel\r\n open(): void {\r\n if (this.disabled() || this.readonly() || this.panelOpen()) return;\r\n // Ensure DOM focus is on the trigger so blur/Tab work correctly\r\n this.trigger?.nativeElement.focus();\r\n requestAnimationFrame(() => {\r\n this.panelOpen.set(true);\r\n this._focused.set(true);\r\n this.openedChange.emit(true);\r\n\r\n // Set active option to currently selected or first option\r\n this._setInitialActiveOption();\r\n\r\n // Create overlay after the view updates\r\n setTimeout(() => {\r\n this._createOverlay();\r\n this._scrollToActiveOption();\r\n this._listenForOutsideClicks();\r\n });\r\n });\r\n }\r\n\r\n // Close the dropdown panel\r\n close(restoreFocus = true): void {\r\n if (!this.panelOpen()) return;\r\n this._outsideClickSub?.unsubscribe();\r\n\r\n this.panelOpen.set(false);\r\n this._focused.set(false);\r\n this._activeOptionIndex.set(-1);\r\n this._disposeOverlay();\r\n this.openedChange.emit(false);\r\n this._onTouched();\r\n\r\n // Return focus to trigger only when explicitly requested (e.g. Escape, backdrop click).\r\n // When closing via Tab, let the browser move focus naturally.\r\n // Focus synchronously to avoid race conditions with Tab key presses.\r\n if (restoreFocus) {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n }\r\n\r\n // Handle option selection (called by FuiOptionComponent)\r\n _onOptionSelected(option: FuiOptionComponent): void {\r\n const newValue = option.value();\r\n\r\n if (this.multiple()) {\r\n const raw = this._value();\r\n const currentValue = this.isArray(raw) ? [...raw] : [];\r\n const compareFn = this.compareWith();\r\n const index = currentValue.findIndex((v: unknown) => compareFn(v, newValue));\r\n\r\n if (index > -1) {\r\n currentValue.splice(index, 1);\r\n option.deselect();\r\n } else {\r\n currentValue.push(newValue);\r\n option.select();\r\n }\r\n\r\n this._value.set(currentValue);\r\n this._onChange(currentValue);\r\n this.valueChange.emit(currentValue);\r\n this.selectionChange.emit({ source: this, value: currentValue });\r\n\r\n // Announce for screen readers\r\n const label = option.getLabel();\r\n const action = index > -1 ? 'deselected' : 'selected';\r\n this._announce(`${label} ${action}`);\r\n } else {\r\n // Deselect previous option\r\n const opts = this.options();\r\n opts.forEach((opt) => {\r\n if (opt !== option) {\r\n opt.deselect();\r\n }\r\n });\r\n\r\n option.select();\r\n this._value.set(newValue);\r\n this._onChange(newValue);\r\n this.valueChange.emit(newValue);\r\n this.selectionChange.emit({ source: this, value: newValue });\r\n\r\n // Announce for screen readers\r\n this._announce(`${option.getLabel()} selected`);\r\n this.close();\r\n }\r\n\r\n this.stateChanges.next();\r\n }\r\n\r\n // Get display value for trigger\r\n _getDisplayValue(): string {\r\n return this.displayValue();\r\n }\r\n\r\n // Handle keyboard navigation\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n const isOpen = this.panelOpen();\r\n\r\n if (!isOpen) {\r\n this._handleClosedKeydown(event);\r\n } else {\r\n this._handleOpenKeydown(event);\r\n }\r\n }\r\n\r\n // Handle keydown when panel is closed\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const key = event.key;\r\n\r\n switch (key) {\r\n case 'Enter':\r\n case ' ':\r\n case 'ArrowDown':\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.open();\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._selectFirstOption();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._selectLastOption();\r\n break;\r\n default:\r\n // Type-ahead when closed\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Handle keydown when panel is open\r\n private _handleOpenKeydown(event: KeyboardEvent): void {\r\n const PAGE_SIZE = 5;\r\n const key = event.key;\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n\r\n switch (key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._setNextActiveOption(1);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._setNextActiveOption(-1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(0);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(opts.length - 1);\r\n break;\r\n case 'PageDown':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n const newIndex = Math.min(activeIndex + PAGE_SIZE, opts.length - 1);\r\n this._setActiveOptionIndex(newIndex);\r\n }\r\n break;\r\n case 'PageUp':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n const newIndex = Math.max(activeIndex - PAGE_SIZE, 0);\r\n this._setActiveOptionIndex(newIndex);\r\n }\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n if (activeIndex >= 0 && activeIndex < opts.length) {\r\n this._onOptionSelected(opts[activeIndex]);\r\n }\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n this.close();\r\n break;\r\n case 'Tab':\r\n // Don't preventDefault — let browser handle Tab naturally.\r\n // _onBlur will close the panel when focus leaves the trigger.\r\n break;\r\n default:\r\n // Type-ahead when open\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n event.preventDefault();\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Set the next active option based on delta\r\n private _setNextActiveOption(delta: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) return;\r\n\r\n const currentIndex = this._activeOptionIndex();\r\n let newIndex = currentIndex + delta;\r\n\r\n // Wrap around\r\n if (newIndex < 0) {\r\n newIndex = opts.length - 1;\r\n } else if (newIndex >= opts.length) {\r\n newIndex = 0;\r\n }\r\n\r\n this._setActiveOptionIndex(newIndex);\r\n }\r\n\r\n // Set the active option index\r\n private _setActiveOptionIndex(index: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (index < 0 || index >= opts.length) return;\r\n\r\n // Update active state on options\r\n const allOpts = this.options();\r\n allOpts.forEach((opt) => {\r\n opt.setInactive();\r\n });\r\n\r\n const activeOption = opts[index];\r\n activeOption.setActive();\r\n this._activeOptionIndex.set(index);\r\n this._scrollToActiveOption();\r\n\r\n // Announce active option for screen readers (when panel is open and using keyboard)\r\n if (this.panelOpen()) {\r\n const label = activeOption.getLabel();\r\n const selectedState = activeOption._selected() ? ', selected' : '';\r\n this._announce(`${label}${selectedState}, ${index + 1} of ${opts.length}`);\r\n }\r\n }\r\n\r\n // Set initial active option when opening\r\n private _setInitialActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) {\r\n this._activeOptionIndex.set(-1);\r\n return;\r\n }\r\n\r\n const currentValue = this._value();\r\n const compareFn = this.compareWith();\r\n\r\n // Find the first selected option\r\n let selectedIndex = -1;\r\n if (!this.multiple() && currentValue !== null && currentValue !== undefined) {\r\n selectedIndex = opts.findIndex((opt) => compareFn(opt.value(), currentValue));\r\n } else if (this.multiple() && this.isArray(currentValue) && currentValue.length > 0) {\r\n selectedIndex = opts.findIndex((opt) => currentValue.some((v: unknown) => compareFn(v, opt.value())));\r\n }\r\n\r\n const initialIndex = selectedIndex >= 0 ? selectedIndex : 0;\r\n this._setActiveOptionIndex(initialIndex);\r\n }\r\n\r\n // Scroll to active option\r\n private _scrollToActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n\r\n if (activeIndex < 0 || activeIndex >= opts.length) return;\r\n\r\n const activeOption = opts[activeIndex];\r\n const element = activeOption._getHostElement();\r\n const panel = this.panel?.nativeElement;\r\n\r\n if (element && panel) {\r\n const optionTop = element.offsetTop;\r\n const optionBottom = optionTop + element.offsetHeight;\r\n const panelTop = panel.scrollTop;\r\n const panelBottom = panelTop + panel.clientHeight;\r\n\r\n if (optionTop < panelTop) {\r\n panel.scrollTop = optionTop;\r\n } else if (optionBottom > panelBottom) {\r\n panel.scrollTop = optionBottom - panel.clientHeight;\r\n }\r\n }\r\n }\r\n\r\n // Handle type-ahead search\r\n private _handleTypeahead(char: string): void {\r\n // Clear timeout and add to buffer\r\n if (this._typeaheadTimeout) {\r\n clearTimeout(this._typeaheadTimeout);\r\n }\r\n this._typeaheadBuffer += char.toLowerCase();\r\n\r\n // Find matching option\r\n const opts = this._getEnabledOptions();\r\n const matchIndex = opts.findIndex((opt) => opt.getLabel().toLowerCase().startsWith(this._typeaheadBuffer));\r\n\r\n if (matchIndex >= 0) {\r\n if (this.panelOpen()) {\r\n this._setActiveOptionIndex(matchIndex);\r\n } else {\r\n // Select the option when closed\r\n this._onOptionSelected(opts[matchIndex]);\r\n }\r\n }\r\n\r\n // Clear buffer after debounce\r\n this._typeaheadTimeout = setTimeout(() => {\r\n this._typeaheadBuffer = '';\r\n }, this.TYPE_AHEAD_DEBOUNCE);\r\n }\r\n\r\n // Select first non-disabled option\r\n private _selectFirstOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[0]);\r\n }\r\n }\r\n\r\n // Select last non-disabled option\r\n private _selectLastOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[opts.length - 1]);\r\n }\r\n }\r\n\r\n // Get all non-disabled options\r\n private _getEnabledOptions(): FuiOptionComponent[] {\r\n return this.options().filter((opt) => !opt.disabled());\r\n }\r\n\r\n // Start listening for outside clicks when panel opens\r\n private _listenForOutsideClicks(): void {\r\n this._outsideClickSub?.unsubscribe();\r\n\r\n // Run outside Angular zone to avoid triggering change detection on every document click\r\n this._ngZone.runOutsideAngular(() => {\r\n // Use setTimeout to skip the current click event that opened the panel\r\n setTimeout(() => {\r\n this._outsideClickSub = fromEvent<MouseEvent>(this._document, 'click')\r\n .pipe(\r\n filter(() => this.panelOpen()),\r\n filter((event) => {\r\n const target = event.target as HTMLElement;\r\n const triggerElement = this.trigger?.nativeElement;\r\n const panelElement = this.panel?.nativeElement;\r\n const overlayElement = this._overlayRef?.overlayElement;\r\n return (\r\n !triggerElement?.contains(target) &&\r\n !panelElement?.contains(target) &&\r\n !overlayElement?.contains(target)\r\n );\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 // Create overlay for panel\r\n private _createOverlay(): void {\r\n if (this._overlayRef || !this.panel || !this.trigger) return;\r\n\r\n const triggerElement = this.trigger.nativeElement;\r\n const triggerWidth = triggerElement.getBoundingClientRect().width;\r\n\r\n const positions: FuiConnectedPosition[] = [\r\n // Primary: open below\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n // Fallback: open above if no space below\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n ];\r\n\r\n const positionStrategy = this._overlayService\r\n .position()\r\n .connectedTo(triggerElement, positions)\r\n .withPush(false)\r\n .withFlexibleDimensions(true)\r\n .withViewportMargin(8);\r\n\r\n this._overlayRef = this._overlayService.create({\r\n positionStrategy,\r\n scrollStrategy: this._overlayService.scrollStrategies.reposition(),\r\n hasBackdrop: true,\r\n backdropClass: 'fui-select-backdrop',\r\n backdropClickBehavior: 'close',\r\n panelClass: ['fui-select-overlay-panel'],\r\n width: triggerWidth,\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 this._overlaySubscriptions.add(\r\n this._overlayRef.backdropClick.subscribe(() => {\r\n this.close();\r\n }),\r\n );\r\n\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 // Attach panel to overlay\r\n const panelElement = this.panel.nativeElement;\r\n this._overlayRef.attach(panelElement);\r\n }\r\n\r\n // Dispose overlay\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 // Get the active option's id for aria-activedescendant\r\n _getActiveDescendant(): string | null {\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n if (activeIndex >= 0 && activeIndex < opts.length) {\r\n return opts[activeIndex].id;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Announces a message to screen readers via the aria-live region.\r\n * Clears the message after a brief delay to allow repeated announcements.\r\n */\r\n private _announce(message: string): void {\r\n // Clear first to ensure repeated identical messages are announced\r\n this._liveAnnouncement.set('');\r\n setTimeout(() => {\r\n this._liveAnnouncement.set(message);\r\n }, 50);\r\n }\r\n\r\n // Mat-select compatibility methods\r\n get selected(): Signal<unknown> {\r\n return this.value;\r\n }\r\n\r\n // Helper method to check if value is array\r\n isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n }\r\n}\r\n","<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ _getDisplayValue() }}</span>\r\n }\r\n </span>\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel -->\r\n@if (panelOpen()) {\r\n <div\r\n #panel\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n >\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|