@sixbell-telco/sdk
Version:
A collection of reusable components designed for use in Sixbell Telco Angular projects
1 lines • 52.3 kB
Source Map (JSON)
{"version":3,"file":"sixbell-telco-sdk-components-forms-select.mjs","sources":["../../../projects/sdk/components/forms/select/src/select.component.ts","../../../projects/sdk/components/forms/select/src/select.component.html","../../../projects/sdk/components/forms/select/sixbell-telco-sdk-components-forms-select.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n\tAfterViewInit,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tElementRef,\n\tinject,\n\tinput,\n\tmodel,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { ControlValueAccessor, FormControl, FormGroup, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cn } from '@sixbell-telco/sdk/utils/cn';\nimport { cva } from 'class-variance-authority';\nimport { startWith, switchMap } from 'rxjs';\n\n// Angular CDK\nimport { CdkListbox, CdkOption } from '@angular/cdk/listbox';\nimport { ConnectedOverlayPositionChange, OverlayModule } from '@angular/cdk/overlay';\nimport { PortalModule } from '@angular/cdk/portal';\n\n// Internal components\nimport { IconComponent } from '@sixbell-telco/sdk/components/icon';\n\n// Icons\nimport { matCheckOutline, matCloseOutline, matKeyboardArrowDownOutline } from '@sixbell-telco/sdk/components/icon/material/outline';\n\n// ==============================================================================\n// TYPES AND INTERFACES\n// ==============================================================================\n\n/** Possible select dropdown style variants */\nexport type SelectVariantProps = 'primary' | 'secondary' | 'tertiary' | 'accent' | 'info' | 'success' | 'error' | 'warning' | null | undefined;\n\n/** Possible select dropdown size variants */\nexport type SelectSizeProps = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | null | undefined;\n\n/** Configuration object for select styling */\nexport type SelectProps = {\n\tvariant?: SelectVariantProps;\n\tsize?: SelectSizeProps;\n};\n\n/** Animation states for the select overlay */\ntype AnimationState = 'closed' | 'opening' | 'open' | 'closing';\n\n// ==============================================================================\n// COMPONENT STYLES\n// ==============================================================================\n\n/**\n * @internal\n * Generates base select classes with style variants\n */\nconst selectComponent = cva(['w-full', 'min-w-fit', 'text-pretty', 'font-body', 'font-normal', 'select', 'leading-normal', 'bg-none'], {\n\tvariants: {\n\t\tvariant: {\n\t\t\tprimary: ['select-primary'],\n\t\t\tsecondary: ['select-secondary'],\n\t\t\ttertiary: ['select-tertiary'],\n\t\t\taccent: ['select-accent'],\n\t\t\tinfo: ['select-info'],\n\t\t\tsuccess: ['select-success'],\n\t\t\terror: ['select-error'],\n\t\t\twarning: ['select-warning'],\n\t\t},\n\t\tsize: {\n\t\t\txs: ['select-xs'],\n\t\t\tsm: ['select-sm'],\n\t\t\tmd: ['select-md'],\n\t\t\tlg: ['select-lg'],\n\t\t\txl: ['select-xl'],\n\t\t},\n\t},\n\tcompoundVariants: [],\n\tdefaultVariants: {\n\t\tvariant: 'secondary',\n\t\tsize: 'md',\n\t},\n});\n\n// ==============================================================================\n// COMPONENT\n// ==============================================================================\n\n/**\n * A customizable select dropdown component with CDK overlay integration\n *\n * @remarks\n * Uses the same visual design as the combobox but simplified for single selection only.\n * No search functionality or multi-select support. Implements ControlValueAccessor\n * for Angular form compatibility.\n *\n * @example\n * ```html\n * <!-- Basic usage with primitive values -->\n * <st-select\n * [options]=\"['Option 1', 'Option 2']\"\n * [(value)]=\"selectedValue\"\n * ></st-select>\n * ```\n *\n * @example\n * ```html\n * <!-- Object options with custom keys -->\n * <st-select\n * [options]=\"users\"\n * valueKey=\"id\"\n * displayKey=\"name\"\n * label=\"Select user\"\n * [parentForm]=\"userForm\"\n * formControlName=\"selectedUser\"\n * ></st-select>\n * ```\n */\n@Component({\n\tselector: 'st-select',\n\timports: [FormsModule, OverlayModule, PortalModule, CdkListbox, CdkOption, IconComponent],\n\tproviders: [\n\t\t{\n\t\t\tprovide: NG_VALUE_ACCESSOR,\n\t\t\tuseExisting: SelectComponent,\n\t\t\tmulti: true,\n\t\t},\n\t],\n\ttemplateUrl: './select.component.html',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectComponent implements AfterViewInit, ControlValueAccessor {\n\t// ==============================================================================\n\t// SERVICES\n\t// ==============================================================================\n\n\t/** @internal Translation service instance */\n\ttranslateService = inject(TranslateService);\n\n\t// ==============================================================================\n\t// INPUT PROPERTIES\n\t// ==============================================================================\n\n\t/**\n\t * Select dropdown style variant\n\t * @defaultValue 'secondary'\n\t */\n\tvariant = input<SelectVariantProps>('secondary');\n\n\t/**\n\t * Select dropdown size variant\n\t * @defaultValue 'md'\n\t */\n\tsize = input<SelectSizeProps>('md');\n\n\t/**\n\t * Whether to use ghost (transparent) styling\n\t * @defaultValue false\n\t */\n\tghost = input<boolean>(false);\n\n\t/**\n\t * HTML name attribute for the select\n\t */\n\tname = input<string | null>(null);\n\n\t/**\n\t * Placeholder text when no option is selected\n\t */\n\tplaceholder = input<string>('');\n\n\t/**\n\t * Label text displayed above the select\n\t */\n\tlabel = input<string>('');\n\n\t/**\n\t * Two-way bindable selected value\n\t */\n\tvalue = model<any>();\n\n\t/**\n\t * Array of available options (primitives or objects)\n\t */\n\toptions = input<any[]>([]);\n\n\t/**\n\t * The object property to use for display text when options are objects\n\t * Falls back to common property names if not specified\n\t */\n\tdisplayKey = input<string>('');\n\n\t/**\n\t * The object property to use as the value when options are objects\n\t * Uses the entire object if not specified\n\t */\n\tvalueKey = input<string>('');\n\n\t/**\n\t * Whether to show a clear button next to the selected value\n\t * @default true\n\t */\n\tallowClear = input<boolean>(true);\n\n\t/**\n\t * Parent form group for reactive forms\n\t */\n\tparentForm = input<FormGroup | null>(null);\n\n\t/**\n\t * Form control name for reactive forms\n\t */\n\tformControlName = input<string>('');\n\n\t/**\n\t * Whether the select is disabled\n\t * @defaultValue false\n\t */\n\tdisabled = model<boolean>(false);\n\n\t/**\n\t * Event emitted when select loses focus\n\t */\n\tblurred = output<unknown>();\n\n\t/**\n\t * Event emitted when selection changes\n\t */\n\tvalueUpdated = output<any>();\n\n\t// ==============================================================================\n\t// ICONS\n\t// ==============================================================================\n\n\t/** Dropdown chevron icon */\n\ticonChevronDown = matKeyboardArrowDownOutline;\n\t/** Check icon for selected options */\n\ticonCheck = matCheckOutline;\n\t/** Close/clear icon */\n\ticonClose = matCloseOutline;\n\n\t// ==============================================================================\n\t// PRIVATE PROPERTIES\n\t// ==============================================================================\n\n\t/** Current animation state of the overlay */\n\tprivate readonly animationState = signal<AnimationState>('closed');\n\t/** Trigger for blur events in form validation */\n\tprivate readonly blurTrigger = signal(0);\n\t/** Active option index for keyboard navigation */\n\tprivate readonly activeOptionIndex = signal<number>(-1);\n\n\t// ==============================================================================\n\t// VIEW CHILDREN\n\t// ==============================================================================\n\n\t/** Reference to the trigger button element */\n\ttriggerRef = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n\n\t/** Reference to the options list container */\n\toptionsList = viewChild<ElementRef<HTMLDivElement>>('optionsList');\n\n\t/** Reference to the CDK listbox for keyboard navigation */\n\tlistbox = viewChild<CdkListbox>('listbox');\n\n\t// ==============================================================================\n\t// SIGNALS\n\t// ==============================================================================\n\n\t/** Width of the trigger button for overlay positioning */\n\ttriggerWidth = signal<number>(0);\n\n\t/** Tracks the overlay position to determine animation direction */\n\tprivate readonly currentPosition = signal<any>(null);\n\n\t/**\n\t * Static class mappings for different animation directions\n\t * Maps animation directions to complete Tailwind class names\n\t * All class names are static and detectable by Tailwind at build time\n\t */\n\tprivate readonly animationClassMap = {\n\t\tbottom: 'data-[state=opening]:animate-fade-in-up data-[state=open]:animate-fade-in-up data-[state=closing]:animate-fade-out-down',\n\t\ttop: 'data-[state=opening]:animate-fade-in-down data-[state=open]:animate-fade-in-down data-[state=closing]:animate-fade-out-up',\n\t\tleft: 'data-[state=opening]:animate-fade-in-left data-[state=open]:animate-fade-in-left data-[state=closing]:animate-fade-out-right',\n\t\tright: 'data-[state=opening]:animate-fade-in-right data-[state=open]:animate-fade-in-right data-[state=closing]:animate-fade-out-left',\n\t};\n\n\t/**\n\t * Computed animation direction based on overlay positioning\n\t * Detects actual position from CDK overlay and returns appropriate direction\n\t */\n\tanimationDirection = computed(() => {\n\t\tconst position = this.currentPosition();\n\t\tif (!position) return 'bottom'; // default\n\n\t\tconst overlayY = position?.connectionPair?.overlayY as string;\n\t\tconst overlayX = position?.connectionPair?.overlayX as string;\n\n\t\tif (overlayY === 'top') return 'top';\n\t\telse if (overlayY === 'bottom') return 'bottom';\n\t\telse if (overlayX === 'end') return 'left';\n\t\telse if (overlayX === 'start') return 'right';\n\t\treturn 'bottom';\n\t});\n\n\t/**\n\t * Computed class string for animations\n\t * Applies the correct animation based on position using static class names\n\t */\n\tanimationClasses = computed(() => {\n\t\tconst direction = this.animationDirection();\n\t\tconst baseClasses = this.animationClassMap[direction];\n\t\tconst durationClasses =\n\t\t\t'data-[state=closing]:animate-duration-150 data-[state=opening]:animate-duration-150 data-[state=open]:animate-duration-150 overflow-hidden';\n\t\treturn `${baseClasses} ${durationClasses}`;\n\t});\n\n\t// ==============================================================================\n\t// FORM CONTROL INTEGRATION\n\t// ==============================================================================\n\n\t/** Form control reference for reactive forms */\n\tprivate readonly formControl = computed(() => this.parentForm()?.get(this.formControlName()) as FormControl | null);\n\t/** Observable stream of form control */\n\tprivate readonly formControl$ = toObservable(this.formControl);\n\t/** Stream of form control status changes */\n\tprivate readonly statusChanges$ = this.formControl$.pipe(switchMap((control) => control?.statusChanges.pipe(startWith(control.status)) || []));\n\t/** Stream of form control value changes */\n\tprivate readonly stateChanges$ = this.formControl$.pipe(switchMap((control) => control?.valueChanges.pipe(startWith(control.value)) || []));\n\t/** Signal for form control status */\n\tprivate readonly statusSignal = toSignal(this.statusChanges$);\n\t/** Signal for form control state */\n\tprivate readonly stateSignal = toSignal(this.stateChanges$);\n\n\t// ==============================================================================\n\t// CONTROL VALUE ACCESSOR\n\t// ==============================================================================\n\n\t/** Callback function for value changes */\n\tprivate onChange = (value: any) => {};\n\t/** Callback function for touch events */\n\tprivate onTouched = () => {};\n\n\t// ==============================================================================\n\t// COMPUTED PROPERTIES\n\t// ==============================================================================\n\n\t/**\n\t * Whether the overlay is currently open or in the process of opening/closing\n\t * @returns True if overlay is visible or animating\n\t */\n\tisOpen = computed(() => {\n\t\tconst state = this.animationState();\n\t\treturn state === 'opening' || state === 'open' || state === 'closing';\n\t});\n\n\t/**\n\t * Whether the overlay is currently animating to open state\n\t * @returns True if overlay is opening or open\n\t */\n\tisAnimatingOpen = computed(() => {\n\t\tconst state = this.animationState();\n\t\treturn state === 'opening' || state === 'open';\n\t});\n\n\t/**\n\t * Current animation state for template binding\n\t * @returns Current animation state\n\t */\n\tdataState = computed(() => this.animationState());\n\n\t/**\n\t * Display value for the selected option\n\t * @returns Formatted display string for the current selection\n\t */\n\tdisplayValue = computed(() => {\n\t\tconst currentValue = this.value();\n\t\tif (!currentValue) return this.translatedPlaceholder();\n\n\t\t// If the current value is a string that matches one of the options, display it\n\t\tconst options = this.options();\n\t\tconst matchingOption = options.find((option) => {\n\t\t\tif (typeof option === 'string' && typeof currentValue === 'string') {\n\t\t\t\treturn option === currentValue;\n\t\t\t}\n\t\t\t// For objects, check if the current value matches the option or its value property\n\t\t\tconst optionValue = this.getOptionValue(option);\n\t\t\tconst currentOptionValue = this.getOptionValue(currentValue);\n\t\t\treturn optionValue === currentOptionValue || option === currentValue;\n\t\t});\n\n\t\tif (matchingOption) {\n\t\t\treturn this.getDisplayValue(matchingOption);\n\t\t}\n\n\t\t// If no matching option found, show placeholder (invalid value)\n\t\treturn this.translatedPlaceholder();\n\t});\n\n\t/**\n\t * Whether the clear button should be shown\n\t * @returns True if there's a valid selected value and clear is allowed\n\t */\n\tshowClearButton = computed(() => {\n\t\tif (!this.allowClear() || this.disabled()) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst currentValue = this.value();\n\t\tif (!currentValue) return false;\n\n\t\t// Only show clear button if the value is valid (exists in options)\n\t\tconst options = this.options();\n\t\treturn options.some((option) => {\n\t\t\tif (typeof option === 'string' && typeof currentValue === 'string') {\n\t\t\t\treturn option === currentValue;\n\t\t\t}\n\t\t\t// For objects, check if the current value matches the option or its value property\n\t\t\tconst optionValue = this.getOptionValue(option);\n\t\t\tconst currentOptionValue = this.getOptionValue(currentValue);\n\t\t\treturn optionValue === currentOptionValue || option === currentValue;\n\t\t});\n\t});\n\n\t/**\n\t * Translated placeholder text\n\t * @returns Translated placeholder or input value\n\t */\n\ttranslatedPlaceholder = computed(() => {\n\t\tconst customPlaceholder = this.placeholder();\n\t\treturn customPlaceholder || this.translateService.instant('sdk.select.placeholder');\n\t});\n\n\t/**\n\t * @internal\n\t * Computed base select classes\n\t */\n\tcomponentClass = computed(() => {\n\t\treturn cn(\n\t\t\tselectComponent({\n\t\t\t\tvariant: this.variant(),\n\t\t\t\tsize: this.size(),\n\t\t\t}),\n\t\t\t{ 'select-ghost': this.ghost() },\n\t\t);\n\t});\n\n\t/**\n\t * @internal\n\t * Computed error state classes\n\t */\n\terrorClass = computed(() => {\n\t\treturn cn(\n\t\t\tselectComponent({\n\t\t\t\tvariant: 'error',\n\t\t\t\tsize: this.size(),\n\t\t\t}),\n\t\t\t{ 'select-ghost': this.ghost() },\n\t\t);\n\t});\n\n\t/**\n\t * @internal\n\t * Computed success state classes\n\t */\n\tsuccessClass = computed(() => {\n\t\treturn cn(\n\t\t\tselectComponent({\n\t\t\t\tvariant: 'success',\n\t\t\t\tsize: this.size(),\n\t\t\t}),\n\t\t\t{ 'select-ghost': this.ghost() },\n\t\t);\n\t});\n\n\t/**\n\t * Validation-aware CSS classes based on form control state\n\t * @internal\n\t */\n\tvalidationClass = computed(() => {\n\t\tconst control = this.formControl();\n\t\tconst trigger = this.blurTrigger();\n\n\t\tif (!control) return this.componentClass();\n\n\t\tconst isTouched = control.touched || trigger > 0;\n\t\tthis.statusSignal();\n\t\tthis.stateSignal();\n\n\t\tif (control.dirty || isTouched) {\n\t\t\tif (control.invalid) return this.errorClass();\n\t\t\tif (control.valid) return this.successClass();\n\t\t}\n\n\t\treturn this.componentClass();\n\t});\n\n\t/**\n\t * CSS classes for the options menu\n\t * @internal\n\t */\n\tmenuClass = computed(() => {\n\t\treturn cn(\n\t\t\t'menu flex-nowrap max-h-72 overflow-y-auto overscroll-contain w-full p-0 focus-within:outline-none focus:outline-none focus-visible:outline-none',\n\t\t\t{\n\t\t\t\t'menu-xs': this.size() === 'xs',\n\t\t\t\t'menu-sm': this.size() === 'sm',\n\t\t\t\t'menu-md': this.size() === 'md',\n\t\t\t\t'menu-lg': this.size() === 'lg',\n\t\t\t\t'menu-xl': this.size() === 'xl',\n\t\t\t},\n\t\t);\n\t});\n\n\t// ==============================================================================\n\t// LIFECYCLE METHODS\n\t// ==============================================================================\n\n\t/**\n\t * Angular lifecycle hook called after view initialization\n\t * Updates the trigger width for proper overlay positioning\n\t */\n\tngAfterViewInit() {\n\t\tthis.updateTriggerWidth();\n\t}\n\n\t// ==============================================================================\n\t// CONTROL VALUE ACCESSOR IMPLEMENTATION\n\t// ==============================================================================\n\n\t/**\n\t * Writes a new value to the component\n\t * @param value - The new value to set\n\t */\n\twriteValue(value: any): void {\n\t\t// Only set the value if it's null/undefined or if it exists in the options\n\t\tif (!value) {\n\t\t\tthis.value.set(value);\n\t\t\treturn;\n\t\t}\n\n\t\tconst options = this.options();\n\t\tconst isValidValue = options.some((option) => {\n\t\t\tif (typeof option === 'string' && typeof value === 'string') {\n\t\t\t\treturn option === value;\n\t\t\t}\n\t\t\t// For objects, check if the value matches the option or its value property\n\t\t\tconst optionValue = this.getOptionValue(option);\n\t\t\tconst currentValue = this.getOptionValue(value);\n\t\t\treturn optionValue === currentValue || option === value;\n\t\t});\n\n\t\t// Only set the value if it's valid, otherwise set null\n\t\tthis.value.set(isValidValue ? value : null);\n\t}\n\n\t/**\n\t * Registers a callback function to be called when the value changes\n\t * @param fn - The callback function\n\t */\n\tregisterOnChange(fn: (value: any) => void): void {\n\t\tthis.onChange = fn;\n\t}\n\n\t/**\n\t * Registers a callback function to be called when the component is touched\n\t * @param fn - The callback function\n\t */\n\tregisterOnTouched(fn: () => void): void {\n\t\tthis.onTouched = fn;\n\t}\n\n\t/**\n\t * Sets the disabled state of the component\n\t * @param isDisabled - Whether the component should be disabled\n\t */\n\tsetDisabledState(isDisabled: boolean): void {\n\t\tthis.disabled.set(isDisabled);\n\t}\n\n\t// ==============================================================================\n\t// PUBLIC METHODS\n\t// ==============================================================================\n\n\t/**\n\t * Toggles the overlay open/closed state\n\t * Handles focus management and animation state transitions\n\t */\n\ttoggleOverlay() {\n\t\tconst currentState = this.animationState();\n\n\t\tif (currentState === 'closed') {\n\t\t\tthis.updateTriggerWidth();\n\t\t\tthis.animationState.set('opening');\n\t\t\t// Set first option as active and focus listbox after opening\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.setDefaultActiveOption();\n\t\t\t\t// Focus the listbox for keyboard navigation\n\t\t\t\tthis.optionsList()?.nativeElement?.focus();\n\t\t\t}, 100);\n\t\t} else if (currentState === 'open') {\n\t\t\tthis.animationState.set('closing');\n\t\t}\n\t}\n\n\t/**\n\t * Handles animation end events to update state\n\t * @param event - The animation event\n\t */\n\tonAnimationEnd(event: AnimationEvent) {\n\t\tif (event.animationName === 'fade-in-up') {\n\t\t\tthis.animationState.set('open');\n\t\t} else if (event.animationName === 'fade-out-down') {\n\t\t\tthis.animationState.set('closed');\n\t\t\tthis.activeOptionIndex.set(-1);\n\t\t\tthis.triggerBlur();\n\t\t\t// Return focus to trigger\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.triggerRef()?.nativeElement?.focus();\n\t\t\t}, 0);\n\t\t}\n\t}\n\n\t/**\n\t * Handles overlay detachment\n\t * Cleans up state and triggers blur\n\t */\n\thandleDetach() {\n\t\tthis.animationState.set('closed');\n\t\tthis.activeOptionIndex.set(-1);\n\t\tthis.triggerBlur();\n\t\t// Return focus to trigger\n\t\tsetTimeout(() => {\n\t\t\tthis.triggerRef()?.nativeElement?.focus();\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Handles overlay position changes to determine animation direction\n\t * @param event - The position change event from CDK overlay\n\t */\n\tonPositionChange(event: ConnectedOverlayPositionChange): void {\n\t\tthis.currentPosition.set(event?.connectionPair || null);\n\t}\n\n\t/**\n\t * Handles clicks outside the component\n\t * @param event - The mouse event\n\t */\n\thandleClickOutside(event: MouseEvent) {\n\t\tif (this.animationState() === 'open') {\n\t\t\tthis.animationState.set('closing');\n\t\t}\n\t\tevent.stopPropagation();\n\t\tthis.triggerBlur();\n\t}\n\n\t/**\n\t * Handles option selection\n\t * @param option - The selected option\n\t */\n\thandleOptionSelect(option: any) {\n\t\tthis.value.set(option);\n\t\tthis.onChange(option);\n\t\tthis.onTouched();\n\t\tthis.valueUpdated.emit(option);\n\t\tthis.animationState.set('closing');\n\t}\n\n\t/**\n\t * Handles CDK listbox selection changes\n\t * @param event - The selection change event\n\t */\n\thandleSelectionChange(event: any) {\n\t\tif (event.option) {\n\t\t\tthis.handleOptionSelect(event.option.value);\n\t\t}\n\t}\n\n\t/**\n\t * Handles keyboard events for option selection\n\t * @param event - The keyboard event\n\t */\n\thandleListboxKeydown(event: KeyboardEvent) {\n\t\tconst options = this.options();\n\t\tconst currentIndex = this.activeOptionIndex();\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tconst nextIndex = currentIndex < options.length - 1 ? currentIndex + 1 : 0;\n\t\t\t\tthis.setActiveOption(nextIndex);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowUp': {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tconst prevIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n\t\t\t\tthis.setActiveOption(prevIndex);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tif (currentIndex >= 0 && currentIndex < options.length) {\n\t\t\t\t\tthis.handleOptionSelect(options[currentIndex]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tthis.animationState.set('closing');\n\t\t\t\tthis.activeOptionIndex.set(-1);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Handles keyboard events on the trigger button\n\t * @param event - The keyboard event\n\t */\n\thandleTriggerKeydown(event: KeyboardEvent) {\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\tcase 'ArrowUp':\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tif (this.animationState() === 'closed') {\n\t\t\t\t\tthis.toggleOverlay();\n\t\t\t\t} else {\n\t\t\t\t\t// If already open, handle navigation\n\t\t\t\t\tthis.handleListboxKeydown(event);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tif (this.animationState() === 'open') {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tthis.animationState.set('closing');\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Clears the current selection\n\t */\n\tclearSelection() {\n\t\tthis.value.set(null);\n\t\tthis.onChange(null);\n\t\tthis.onTouched();\n\t\tthis.valueUpdated.emit(null);\n\t}\n\n\t/**\n\t * Handles clear selection button click\n\t * @param event - The click event\n\t */\n\thandleClearSelection(event: Event) {\n\t\tevent.stopPropagation();\n\t\tthis.clearSelection();\n\t}\n\n\t/**\n\t * Checks if an option is currently selected\n\t * @param option - The option to check\n\t * @returns True if the option is selected\n\t */\n\tisOptionSelected(option: any): boolean {\n\t\tconst currentValue = this.value();\n\t\tif (!currentValue) return false;\n\n\t\t// Direct comparison for strings\n\t\tif (typeof option === 'string' && typeof currentValue === 'string') {\n\t\t\treturn option === currentValue;\n\t\t}\n\n\t\t// For objects or mixed types, compare values\n\t\tconst optionValue = this.getOptionValue(option);\n\t\tconst currentValueForComparison = this.getOptionValue(currentValue);\n\n\t\t// Also check direct object equality\n\t\treturn optionValue === currentValueForComparison || option === currentValue;\n\t}\n\n\t/**\n\t * Checks if an option is currently active for keyboard navigation\n\t * @param index - The option index\n\t * @returns True if the option is active\n\t */\n\tisActiveOption(index: number): boolean {\n\t\treturn this.activeOptionIndex() === index;\n\t}\n\n\t/**\n\t * Gets the display value for an option\n\t * @param option - The option to get display value for\n\t * @returns The display string for the option\n\t */\n\tgetDisplayValue(option: any): string {\n\t\tif (!option) return '';\n\t\tconst displayKey = this.displayKey();\n\n\t\tif (displayKey && typeof option === 'object') {\n\t\t\treturn option[displayKey] || '';\n\t\t}\n\n\t\tif (typeof option === 'object') {\n\t\t\tconst commonKeys = ['name', 'label', 'text', 'title', 'displayName'];\n\t\t\tfor (const key of commonKeys) {\n\t\t\t\tif (option[key] !== undefined && option[key] !== null) {\n\t\t\t\t\treturn String(option[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst keys = Object.keys(option);\n\t\t\tfor (const key of keys) {\n\t\t\t\tconst value = option[key];\n\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\treturn String(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn JSON.stringify(option);\n\t\t}\n\n\t\treturn String(option);\n\t}\n\n\t// ==============================================================================\n\t// PRIVATE METHODS\n\t// ==============================================================================\n\n\t/**\n\t * Updates the trigger button width for overlay positioning\n\t */\n\tprivate updateTriggerWidth() {\n\t\tif (this.triggerRef) {\n\t\t\tconst width = this.triggerRef()?.nativeElement.offsetWidth;\n\t\t\tif (!width) return;\n\t\t\tthis.triggerWidth.set(width);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the value property from an option\n\t * @param option - The option to get value from\n\t * @returns The option value\n\t */\n\tprivate getOptionValue(option: any): any {\n\t\tif (!option) return option;\n\t\tconst valueKey = this.valueKey();\n\t\treturn valueKey && typeof option === 'object' ? option[valueKey] : option;\n\t}\n\n\t/**\n\t * Triggers blur event for form validation\n\t */\n\tprivate triggerBlur() {\n\t\tthis.blurTrigger.update((val) => val + 1);\n\t\tthis.onTouched();\n\t\tthis.blurred.emit(this.value());\n\t}\n\n\t/**\n\t * Sets the active option for keyboard navigation\n\t * @param index - The index of the option to make active\n\t */\n\tprivate setActiveOption(index: number) {\n\t\tthis.activeOptionIndex.set(index);\n\t\tthis.updateActiveOptionVisually();\n\t}\n\n\t/**\n\t * Sets the first option as active by default\n\t */\n\tprivate setDefaultActiveOption() {\n\t\tconst options = this.options();\n\t\tif (options.length > 0) {\n\t\t\tthis.setActiveOption(0);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the visual state of the active option\n\t */\n\tprivate updateActiveOptionVisually() {\n\t\tif (!this.optionsList()?.nativeElement) return;\n\n\t\t// Remove active class from all options\n\t\tconst allOptions = this.optionsList()?.nativeElement.querySelectorAll('[data-option-index]');\n\t\tif (!allOptions) return;\n\t\tfor (const option of Array.from(allOptions)) {\n\t\t\toption.classList.remove('cdk-option-active');\n\t\t}\n\n\t\t// Add active class to current option\n\t\tconst currentIndex = this.activeOptionIndex();\n\t\tif (currentIndex >= 0) {\n\t\t\tconst activeOption = this.optionsList()?.nativeElement.querySelector(`[data-option-index=\"${currentIndex}\"]`);\n\t\t\tif (activeOption) {\n\t\t\t\tactiveOption.classList.add('cdk-option-active');\n\t\t\t\t// Scroll into view if needed\n\t\t\t\tactiveOption.scrollIntoView({ block: 'nearest' });\n\t\t\t}\n\t\t}\n\t}\n}\n","@let isOpen = this.isOpen(); @let isAnimatingOpen = this.isAnimatingOpen(); @let triggerWidth = this.triggerWidth();\n@let dataState = this.dataState(); @let options = this.options(); @let displayValue = this.displayValue();\n@let label = this.label();\n\n<fieldset class=\"fieldset p-0\">\n\t@if (label) {\n\t\t<legend class=\"fieldset-legend font-body pt-0 text-pretty\">{{ label }}</legend>\n\t}\n\n\t<button\n\t\t#trigger\n\t\t[class]=\"validationClass()\"\n\t\t(click)=\"toggleOverlay()\"\n\t\t(keydown)=\"handleTriggerKeydown($event)\"\n\t\ttype=\"button\"\n\t\tcdkOverlayOrigin\n\t\taria-haspopup=\"true\"\n\t\trole=\"combobox\"\n\t\t[attr.aria-controls]=\"'select-list'\"\n\t\t[attr.aria-expanded]=\"isOpen\"\n\t\t[disabled]=\"disabled()\"\n\t>\n\t\t<span class=\"flex-1 truncate text-left\">\n\t\t\t{{ displayValue }}\n\t\t</span>\n\t\t<div class=\"inline-flex items-center justify-items-end gap-2\">\n\t\t\t<!-- Clear button -->\n\t\t\t@if (showClearButton()) {\n\t\t\t\t<div class=\"grid translate-x-full place-content-center\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"btn font-body btn-sm btn-secondary h-[1.5em] w-[1.5em] items-center p-0 align-top [font-size:inherit] leading-normal font-medium text-pretty\"\n\t\t\t\t\t\t(click)=\"handleClearSelection($event)\"\n\t\t\t\t\t\t(keydown.enter)=\"handleClearSelection($event)\"\n\t\t\t\t\t\t(keydown.space)=\"handleClearSelection($event)\"\n\t\t\t\t\t\t[attr.aria-label]=\"'Clear selection'\"\n\t\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<st-icon [icon]=\"iconClose\"></st-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t<st-icon\n\t\t\t\tclass=\"h-[1.5em] w-[1.5em] flex-0 translate-x-full transition-transform duration-200\"\n\t\t\t\t[class.rotate-180]=\"isAnimatingOpen\"\n\t\t\t\t[icon]=\"iconChevronDown\"\n\t\t\t></st-icon>\n\t\t</div>\n\t</button>\n\n\t<ng-template\n\t\tcdkConnectedOverlay\n\t\t[cdkConnectedOverlayOrigin]=\"trigger\"\n\t\t[cdkConnectedOverlayOpen]=\"isOpen\"\n\t\t[cdkConnectedOverlayWidth]=\"triggerWidth\"\n\t\t[cdkConnectedOverlayMinWidth]=\"triggerWidth\"\n\t\t(detach)=\"handleDetach()\"\n\t\t(overlayOutsideClick)=\"handleClickOutside($event)\"\n\t\t(positionChange)=\"onPositionChange($event)\"\n\t>\n\t\t<div\n\t\t\t[class]=\"'bg-base-200 rounded-box shadow-main border-neutral ' + animationClasses() + ' mt-1 w-full border border-solid'\"\n\t\t\t(animationend)=\"onAnimationEnd($event)\"\n\t\t\t[attr.data-state]=\"dataState\"\n\t\t>\n\t\t\t<!-- Options List -->\n\t\t\t@let menuClass = this.menuClass();\n\t\t\t<ul\n\t\t\t\t[class]=\"menuClass\"\n\t\t\t\tcdkListbox\n\t\t\t\tcdkListboxUseActiveDescendant\n\t\t\t\taria-labelledby=\"Select options\"\n\t\t\t\trole=\"listbox\"\n\t\t\t\t#optionsList\n\t\t\t\t[tabindex]=\"0\"\n\t\t\t\t(keydown)=\"handleListboxKeydown($event)\"\n\t\t\t\t(selectionChange)=\"handleSelectionChange($event)\"\n\t\t\t>\n\t\t\t\t@for (option of options; track $index) {\n\t\t\t\t\t<li [cdkOption]=\"option\" class=\"group\" [attr.data-option-index]=\"$index\" [class.cdk-option-active]=\"isActiveOption($index)\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"group-[.cdk-option-active]:bg-base-300 font-body flex w-full items-center justify-between rounded-none px-4 py-2 text-left leading-normal font-normal text-pretty transition-colors duration-150 ease-in-out\"\n\t\t\t\t\t\t\t(click)=\"handleOptionSelect(option)\"\n\t\t\t\t\t\t\ttabindex=\"-1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"flex-1 truncate\">{{ getDisplayValue(option) }}</span>\n\n\t\t\t\t\t\t\t@if (isOptionSelected(option)) {\n\t\t\t\t\t\t\t\t<st-icon class=\"h-4 w-4 shrink-0\" [icon]=\"iconCheck\"></st-icon>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</li>\n\t\t\t\t}\n\n\t\t\t\t<!-- Empty state -->\n\t\t\t\t@if (options.length === 0) {\n\t\t\t\t\t<li class=\"text-base-content/60 px-4 py-2 text-center\">\n\t\t\t\t\t\t<span>No options available</span>\n\t\t\t\t\t</li>\n\t\t\t\t}\n\t\t\t</ul>\n\t\t</div>\n\t</ng-template>\n\n\t<!-- Hidden label for accessibility -->\n\t<label class=\"sr-only\" [for]=\"name()\">{{ label }}</label>\n\n\t<!-- Additional content -->\n\t<ng-content></ng-content>\n</fieldset>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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