angular-perfect-select 1.1.0 → 2.0.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/README.md +271 -3
- package/dist/README.md +271 -3
- package/dist/fesm2022/angular-perfect-select.mjs +376 -10
- package/dist/fesm2022/angular-perfect-select.mjs.map +1 -1
- package/dist/index.d.ts +76 -3
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-perfect-select.mjs","sources":["../../src/lib/animations/select.animations.ts","../../src/lib/directives/click-outside.directive.ts","../../src/lib/constants/themes.constant.ts","../../src/lib/components/perfect-select/perfect-select.component.ts","../../src/lib/components/perfect-select/perfect-select.component.html","../../src/public-api.ts","../../src/angular-perfect-select.ts"],"sourcesContent":["import {\n trigger,\n transition,\n style,\n animate,\n query,\n stagger,\n AnimationTriggerMetadata\n} from '@angular/animations';\n\nexport const dropdownAnimation: AnimationTriggerMetadata = trigger('dropdown', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(-10px)' }),\n animate(\n '200ms cubic-bezier(0.4, 0, 0.2, 1)',\n style({ opacity: 1, transform: 'translateY(0)' })\n )\n ]),\n transition(':leave', [\n animate('150ms ease-out', style({ opacity: 0 }))\n ])\n]);\n\nexport const tagAnimation: AnimationTriggerMetadata = trigger('tag', [\n transition(':enter', [\n style({ opacity: 0, transform: 'scale(0.8)' }),\n animate(\n '200ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n style({ opacity: 1, transform: 'scale(1)' })\n )\n ]),\n transition(':leave', [\n animate('150ms ease-out', style({ opacity: 0, transform: 'scale(0.8)' }))\n ])\n]);\n\nexport const optionListAnimation: AnimationTriggerMetadata = trigger('optionList', [\n transition(':enter', [\n query('.option', [\n style({ opacity: 0, transform: 'translateY(-5px)' }),\n stagger(15, [\n animate(\n '150ms ease-out',\n style({ opacity: 1, transform: 'translateY(0)' })\n )\n ])\n ], { optional: true })\n ])\n]);\n\nexport const selectAnimations = [dropdownAnimation, tagAnimation, optionListAnimation];\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n Output\n} from '@angular/core';\n\n@Directive({\n selector: '[clickOutside]',\n standalone: true\n})\nexport class ClickOutsideDirective {\n @Output() clickOutside = new EventEmitter<void>();\n\n constructor(private elementRef: ElementRef) {}\n\n @HostListener('document:click', ['$event'])\n onClick(event: MouseEvent): void {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.clickOutside.emit();\n }\n }\n}\n","export interface ThemeColors {\n primary: string;\n secondary: string;\n tag: string;\n tagText: string;\n tagBorder: string;\n}\n\nexport type ThemeName = 'blue' | 'purple' | 'green' | 'red' | 'orange' | 'pink' | 'dark';\n\nexport const THEMES: Record<ThemeName, ThemeColors> = {\n blue: {\n primary: '#2684FF',\n secondary: '#DEEBFF',\n tag: '#E6F2FF',\n tagText: '#0052CC',\n tagBorder: '#CCE0FF'\n },\n purple: {\n primary: '#9333EA',\n secondary: '#F3E8FF',\n tag: '#FAF5FF',\n tagText: '#7E22CE',\n tagBorder: '#E9D5FF'\n },\n green: {\n primary: '#10B981',\n secondary: '#D1FAE5',\n tag: '#ECFDF5',\n tagText: '#059669',\n tagBorder: '#A7F3D0'\n },\n red: {\n primary: '#EF4444',\n secondary: '#FEE2E2',\n tag: '#FEF2F2',\n tagText: '#DC2626',\n tagBorder: '#FECACA'\n },\n orange: {\n primary: '#F97316',\n secondary: '#FFEDD5',\n tag: '#FFF7ED',\n tagText: '#EA580C',\n tagBorder: '#FED7AA'\n },\n pink: {\n primary: '#EC4899',\n secondary: '#FCE7F3',\n tag: '#FDF2F8',\n tagText: '#DB2777',\n tagBorder: '#FBCFE8'\n },\n dark: {\n primary: '#1F2937',\n secondary: '#E5E7EB',\n tag: '#F3F4F6',\n tagText: '#111827',\n tagBorder: '#D1D5DB'\n }\n};\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n computed,\n HostListener,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ElementRef,\n ViewChild\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { selectAnimations } from '../../animations/select.animations';\nimport { ClickOutsideDirective } from '../../directives/click-outside.directive';\nimport { THEMES, ThemeName } from '../../constants/themes.constant';\nimport { SelectOption } from '../../models/select-option.interface';\nimport {\n SelectChangeEvent,\n SelectInputChangeEvent,\n SelectCreateOptionEvent,\n SelectOptionsLoadedEvent,\n SelectLoadErrorEvent\n} from '../../models/select-events.interface';\n\n@Component({\n selector: 'ng-perfect-select',\n standalone: true,\n imports: [CommonModule, FormsModule, ClickOutsideDirective],\n templateUrl: './perfect-select.component.html',\n styleUrls: ['./perfect-select.component.scss'],\n animations: selectAnimations,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: PerfectSelectComponent,\n multi: true\n }]\n})\nexport class PerfectSelectComponent implements ControlValueAccessor, OnInit, OnChanges, OnDestroy {\n\n // Core Props\n @Input() options: SelectOption[] = [];\n @Input() placeholder = 'Select...';\n\n // React-Select Compatible Props (dual naming)\n @Input() isMulti = false;\n @Input() set multiple(value: boolean) { this.isMulti = value; }\n @Input() isSearchable = true;\n @Input() set searchable(value: boolean) { this.isSearchable = value; }\n @Input() isClearable = true;\n @Input() set clearable(value: boolean) { this.isClearable = value; }\n @Input() isDisabled = false;\n @Input() set disabled(value: boolean) { this.isDisabled = value; }\n @Input() isLoading = false;\n @Input() set loading(value: boolean) { this.isLoading = value; }\n @Input() isRtl = false;\n @Input() closeMenuOnSelect = true;\n @Input() hideSelectedOptions = false;\n\n // Creatable Mode\n @Input() isCreatable = false;\n @Input() allowCreateWhileLoading = false;\n @Input() createOptionPosition: 'first' | 'last' = 'last';\n @Input() formatCreateLabel: (inputValue: string) => string = (inputValue) => `Create \"${inputValue}\"`;\n\n // Async Loading\n @Input() loadOptions: ((inputValue: string) => Promise<SelectOption[]>) | null = null;\n @Input() cacheOptions = true;\n @Input() defaultOptions = false;\n\n // Styling & Theming\n @Input() selectSize: 'smaller' | 'small' | 'medium' | 'large' | 'larger' = 'medium';\n @Input() containerSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'md';\n @Input() theme: ThemeName = 'blue';\n @Input() borderRadius = '8px';\n @Input() customStyles: {\n container?: string;\n control?: string;\n menu?: string;\n option?: string;\n tag?: string;\n } = {};\n @Input() maxHeight = '300px';\n @Input() menuPlacement: 'auto' | 'top' | 'bottom' = 'auto';\n @Input() menuPosition: 'absolute' | 'fixed' = 'absolute';\n\n // Option Customization\n @Input() getOptionLabel: (option: SelectOption) => string = (option) => option.label || String(option.value);\n @Input() getOptionValue: (option: SelectOption) => any = (option) => option.id || option.value;\n @Input() isOptionDisabled: (option: SelectOption) => boolean = (option) => option.disabled || false;\n @Input() filterOption: ((option: SelectOption, inputValue: string) => boolean) | null = null;\n\n // Grouping\n @Input() isGrouped = false;\n @Input() groupBy: ((option: SelectOption) => string) | null = null;\n\n // Advanced Features\n @Input() showSelectAll = false;\n @Input() selectAllText = 'Select All';\n @Input() deselectAllText = 'Deselect All';\n @Input() showOptionIcons = false;\n @Input() showOptionBadges = false;\n @Input() maxOptionsDisplay = 1000;\n @Input() optionHeight = 40;\n @Input() emptyStateText = 'No options available';\n @Input() emptySearchText = 'No results found';\n\n // v1.0.1 Features\n @Input() maxSelectedOptions: number | null = null;\n @Input() maxSelectedMessage: string = 'Maximum selections reached';\n @Input() debounceTime: number = 300;\n @Input() minSearchLength: number = 0;\n @Input() minSearchMessage: string = 'Type to search...';\n\n // Behavior\n @Input() name = 'angular-perfect-select';\n @Input() id = 'angular-perfect-select';\n @Input() autoFocus = false;\n @Input() openMenuOnFocus = false;\n @Input() openMenuOnClick = true;\n @Input() tabSelectsValue = true;\n @Input() backspaceRemovesValue = true;\n @Input() escapeClearsValue = false;\n @Input() noOptionsMessage: () => string = () => 'No options';\n @Input() loadingMessage: () => string = () => 'Loading...';\n\n // Events\n @Output() change = new EventEmitter<SelectChangeEvent>();\n @Output() clear = new EventEmitter<void>();\n @Output() focus = new EventEmitter<void>();\n @Output() blur = new EventEmitter<void>();\n @Output() menuOpen = new EventEmitter<void>();\n @Output() menuClose = new EventEmitter<void>();\n @Output() inputChange = new EventEmitter<SelectInputChangeEvent>();\n @Output() createOption = new EventEmitter<SelectCreateOptionEvent>();\n @Output() optionsLoaded = new EventEmitter<SelectOptionsLoadedEvent>();\n @Output() loadError = new EventEmitter<SelectLoadErrorEvent>();\n\n // ViewChildren\n @ViewChild('selectContainer') selectContainerRef!: ElementRef;\n @ViewChild('searchInput') searchInputRef!: ElementRef;\n @ViewChild('menuRef') menuElementRef!: ElementRef;\n\n // Signals for reactive state\n isOpen = signal(false);\n searchTerm = signal('');\n highlightedIndex = signal(-1);\n internalValue = signal<any>(this.isMulti ? [] : null);\n internalOptions = signal<SelectOption[]>([]);\n isLoadingAsync = signal(false);\n private optionsCache = new Map<string, SelectOption[]>();\n private debounceTimeout: any = null;\n\n // Computed signals\n currentTheme = computed(() => THEMES[this.theme] || THEMES.blue);\n\n filteredOptions = computed(() => {\n const term = this.searchTerm();\n const opts = this.internalOptions();\n\n // Check min search length\n if (this.minSearchLength > 0 && term.length < this.minSearchLength) {\n return [];\n }\n\n if (!term) return opts;\n\n return opts.filter(option => {\n if (this.filterOption) {\n return this.filterOption(option, term);\n }\n const label = this.getOptionLabel(option);\n return label.toLowerCase().includes(term.toLowerCase());\n });\n });\n\n selectedOptions = computed(() => {\n const value = this.internalValue();\n if (!value) return [];\n\n const allOptions = this.internalOptions();\n\n if (this.isMulti) {\n const values = Array.isArray(value) ? value : [];\n // Map values to option objects\n return values.map(v => {\n const found = allOptions.find(opt => this.getOptionValue(opt) === v);\n return found || { id: v, label: String(v), value: v };\n });\n }\n\n // Single select - find the option by value\n const found = allOptions.find(opt => this.getOptionValue(opt) === value);\n return found ? [found] : [];\n });\n\n displayText = computed(() => {\n const selected = this.selectedOptions();\n if (selected.length === 0) {\n return this.placeholder;\n }\n\n if (this.isMulti) {\n return `${selected.length} selected`;\n }\n\n return this.getOptionLabel(selected[0]);\n });\n\n groupedOptions = computed(() => {\n if (!this.isGrouped || !this.groupBy) {\n return null;\n }\n\n const opts = this.filteredOptions();\n const groups: Record<string, SelectOption[]> = {};\n\n opts.forEach(option => {\n const group = this.groupBy!(option);\n if (!groups[group]) {\n groups[group] = [];\n }\n groups[group].push(option);\n });\n\n return groups;\n });\n\n displayOptions = computed(() => {\n let opts = this.filteredOptions();\n\n if (this.isCreatable && this.searchTerm() && !this.isLoadingAsync()) {\n const term = this.searchTerm();\n const exactMatch = opts.some(opt =>\n this.getOptionLabel(opt).toLowerCase() === term.toLowerCase()\n );\n\n if (!exactMatch) {\n const createOption: SelectOption = {\n id: '__create__',\n label: this.formatCreateLabel(term),\n value: term,\n __isCreate__: true\n };\n\n if (this.createOptionPosition === 'first') {\n opts = [createOption, ...opts];\n } else {\n opts = [...opts, createOption];\n }\n }\n }\n\n return opts;\n });\n\n allOptionsSelected = computed(() => {\n if (!this.isMulti) return false;\n const opts = this.filteredOptions().filter(opt => !this.isOptionDisabled(opt));\n const selected = this.selectedOptions();\n return opts.length > 0 && opts.every(opt =>\n selected.some(s => this.getOptionValue(s) === this.getOptionValue(opt))\n );\n });\n\n someOptionsSelected = computed(() => {\n if (!this.isMulti) return false;\n const opts = this.filteredOptions().filter(opt => !this.isOptionDisabled(opt));\n const selected = this.selectedOptions();\n const selectedCount = opts.filter(opt =>\n selected.some(s => this.getOptionValue(s) === this.getOptionValue(opt))\n ).length;\n return selectedCount > 0 && selectedCount < opts.length;\n });\n\n // v1.0.1 Computed signals\n isMaxSelectionReached = computed(() => {\n if (!this.isMulti || this.maxSelectedOptions === null) return false;\n const selected = this.selectedOptions();\n return selected.length >= this.maxSelectedOptions;\n });\n\n showMinSearchMessage = computed(() => {\n if (this.minSearchLength === 0) return false;\n const term = this.searchTerm();\n return this.isOpen() && term.length > 0 && term.length < this.minSearchLength;\n });\n\n // Helper method for template\n getEnabledOptionsCount(): number {\n return this.filteredOptions().filter(opt => !this.isOptionDisabled(opt)).length;\n }\n\n // ControlValueAccessor\n private onChange: any = () => {};\n private onTouched: any = () => {};\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n // Update internal options when the options input changes\n if (changes['options'] && this.options.length > 0 && !this.loadOptions) {\n this.internalOptions.set([...this.options]);\n }\n\n // Update closeMenuOnSelect based on isMulti\n if (changes['isMulti'] && this.isMulti && this.closeMenuOnSelect === true) {\n this.closeMenuOnSelect = false;\n }\n }\n\n writeValue(value: any): void {\n this.internalValue.set(value);\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n }\n\n ngOnInit(): void {\n // Initialize options\n if (this.options.length > 0) {\n this.internalOptions.set([...this.options]);\n }\n\n // Update closeMenuOnSelect based on isMulti (initial setup)\n if (this.isMulti && this.closeMenuOnSelect === true) {\n this.closeMenuOnSelect = false;\n }\n\n // Load default options if async\n if (this.loadOptions && this.defaultOptions) {\n this.handleLoadOptions('');\n }\n\n // Auto-focus if needed\n if (this.autoFocus) {\n setTimeout(() => {\n if (this.searchInputRef) {\n this.searchInputRef.nativeElement.focus();\n }\n });\n }\n }\n\n ngOnDestroy(): void {\n // Clear debounce timeout\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n }\n\n // Keyboard Navigation\n @HostListener('keydown', ['$event'])\n handleKeydown(event: KeyboardEvent): void {\n if (this.isDisabled) return;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) {\n this.toggleDropdown();\n } else {\n this.moveHighlight(1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.moveHighlight(-1);\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.isOpen()) {\n const index = this.highlightedIndex();\n const opts = this.displayOptions();\n if (index >= 0 && index < opts.length) {\n this.selectOption(opts[index]);\n }\n } else {\n this.toggleDropdown();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n if (this.isOpen()) {\n this.closeDropdown();\n }\n if (this.escapeClearsValue) {\n this.clearSelection(event);\n }\n break;\n\n case 'Tab':\n if (this.isOpen() && this.tabSelectsValue) {\n const index = this.highlightedIndex();\n const opts = this.displayOptions();\n if (index >= 0 && index < opts.length) {\n event.preventDefault();\n this.selectOption(opts[index]);\n }\n }\n if (this.isOpen()) {\n this.closeDropdown();\n }\n break;\n\n case 'Backspace':\n if (this.backspaceRemovesValue && this.isMulti && !this.searchTerm()) {\n const selected = this.selectedOptions();\n if (selected.length > 0) {\n event.preventDefault();\n this.removeOption(selected[selected.length - 1], event);\n }\n }\n break;\n }\n }\n\n // Toggle dropdown\n toggleDropdown(): void {\n if (this.isDisabled) return;\n\n if (this.isOpen()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n openDropdown(): void {\n this.isOpen.set(true);\n this.menuOpen.emit();\n\n // Focus search input\n setTimeout(() => {\n if (this.isSearchable && this.searchInputRef) {\n this.searchInputRef.nativeElement.focus();\n }\n });\n }\n\n closeDropdown(): void {\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.highlightedIndex.set(-1);\n this.menuClose.emit();\n this.onTouched();\n }\n\n // Select option\n selectOption(option: SelectOption): void {\n if (this.isOptionDisabled(option)) return;\n\n // Handle create option\n if (option.__isCreate__) {\n const newOption: SelectOption = {\n id: Date.now().toString(),\n label: this.searchTerm(),\n value: this.searchTerm(),\n __isNew__: true\n };\n this.internalOptions.update(opts => [...opts, newOption]);\n this.createOption.emit({ option: newOption });\n option = newOption;\n }\n\n const optionValue = this.getOptionValue(option);\n\n if (this.isMulti) {\n const currentValue = Array.isArray(this.internalValue()) ? [...this.internalValue()] : [];\n const exists = currentValue.includes(optionValue);\n\n let newValue: any[];\n if (exists) {\n newValue = currentValue.filter((v: any) => v !== optionValue);\n } else {\n // Check max selection limit\n if (this.maxSelectedOptions !== null && currentValue.length >= this.maxSelectedOptions) {\n return; // Don't allow selection beyond max\n }\n newValue = [...currentValue, optionValue];\n }\n\n this.internalValue.set(newValue);\n this.onChange(newValue);\n this.change.emit({\n value: newValue,\n option,\n action: exists ? 'remove-value' : 'select-option'\n });\n } else {\n this.internalValue.set(optionValue);\n this.onChange(optionValue);\n this.change.emit({\n value: optionValue,\n option,\n action: 'select-option'\n });\n }\n\n if (this.closeMenuOnSelect) {\n this.closeDropdown();\n }\n\n this.searchTerm.set('');\n }\n\n // Remove option (multi-select)\n removeOption(option: SelectOption, event: Event): void {\n event.stopPropagation();\n\n const currentValue = Array.isArray(this.internalValue()) ? [...this.internalValue()] : [];\n const optionValue = this.getOptionValue(option);\n const newValue = currentValue.filter((v: any) => v !== optionValue);\n\n this.internalValue.set(newValue);\n this.onChange(newValue);\n this.change.emit({\n value: newValue,\n option,\n action: 'remove-value'\n });\n }\n\n // Clear selection\n clearSelection(event: Event): void {\n event.stopPropagation();\n\n const newValue = this.isMulti ? [] : null;\n this.internalValue.set(newValue);\n this.onChange(newValue);\n this.change.emit({\n value: newValue,\n action: 'clear'\n });\n this.clear.emit();\n }\n\n // Select All / Deselect All\n selectAll(): void {\n let opts = this.filteredOptions().filter(opt => !this.isOptionDisabled(opt));\n\n // Respect max selection limit\n if (this.maxSelectedOptions !== null && opts.length > this.maxSelectedOptions) {\n opts = opts.slice(0, this.maxSelectedOptions);\n }\n\n const values = opts.map(opt => this.getOptionValue(opt));\n this.internalValue.set(values);\n this.onChange(values);\n this.change.emit({\n value: values,\n option: opts,\n action: 'select-all'\n });\n }\n\n deselectAll(): void {\n this.internalValue.set([]);\n this.onChange([]);\n this.change.emit({\n value: [],\n action: 'deselect-all'\n });\n }\n\n // Search input change\n onSearchChange(term: string): void {\n this.searchTerm.set(term);\n this.highlightedIndex.set(0);\n this.inputChange.emit({\n value: term,\n action: 'input-change'\n });\n\n // Trigger async loading if configured with debounce\n if (this.loadOptions) {\n // Clear existing timeout\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n\n // Set new timeout for debounced loading\n this.debounceTimeout = setTimeout(() => {\n this.handleLoadOptions(term);\n }, this.debounceTime);\n }\n }\n\n // Async loading\n async handleLoadOptions(inputValue: string): Promise<void> {\n if (!this.loadOptions) return;\n\n // Check cache\n if (this.cacheOptions && this.optionsCache.has(inputValue)) {\n this.internalOptions.set(this.optionsCache.get(inputValue)!);\n return;\n }\n\n this.isLoadingAsync.set(true);\n\n try {\n const options = await this.loadOptions(inputValue);\n this.internalOptions.set(options);\n\n if (this.cacheOptions) {\n this.optionsCache.set(inputValue, options);\n }\n\n this.optionsLoaded.emit({ options });\n } catch (error) {\n this.loadError.emit({ error: error as Error });\n } finally {\n this.isLoadingAsync.set(false);\n }\n }\n\n // Move highlight index\n moveHighlight(direction: number): void {\n const opts = this.displayOptions();\n if (opts.length === 0) return;\n\n let newIndex = this.highlightedIndex() + direction;\n\n if (newIndex < 0) newIndex = 0;\n if (newIndex >= opts.length) newIndex = opts.length - 1;\n\n this.highlightedIndex.set(newIndex);\n this.scrollHighlightedIntoView();\n }\n\n // Scroll highlighted option into view\n scrollHighlightedIntoView(): void {\n setTimeout(() => {\n if (!this.menuElementRef) return;\n\n const menu = this.menuElementRef.nativeElement;\n const highlighted = menu.querySelector('.option.highlighted');\n\n if (highlighted) {\n const menuRect = menu.getBoundingClientRect();\n const optionRect = highlighted.getBoundingClientRect();\n\n if (optionRect.bottom > menuRect.bottom) {\n menu.scrollTop += optionRect.bottom - menuRect.bottom;\n } else if (optionRect.top < menuRect.top) {\n menu.scrollTop -= menuRect.top - optionRect.top;\n }\n }\n });\n }\n\n // Click outside handler\n onClickOutside(): void {\n if (this.isOpen()) {\n this.closeDropdown();\n this.blur.emit();\n }\n }\n\n // Check if option is selected\n isSelected(option: SelectOption): boolean {\n const selected = this.selectedOptions();\n const optionValue = this.getOptionValue(option);\n return selected.some(s => this.getOptionValue(s) === optionValue);\n }\n\n // Sanitize HTML for icons\n sanitizeHtml(html: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n\n // Track by function for ngFor\n trackByValue(index: number, option: SelectOption): any {\n return this.getOptionValue(option);\n }\n\n trackByGroup(index: number, item: [string, SelectOption[]]): string {\n return item[0];\n }\n}\n","<div\n #selectContainer\n class=\"select-container {{selectSize}} {{containerSize}} theme-{{theme}}\"\n [class.disabled]=\"isDisabled\"\n [class.rtl]=\"isRtl\"\n (clickOutside)=\"onClickOutside()\"\n role=\"combobox\"\n tabindex=\"0\"\n [attr.aria-controls]=\"'options-list'\"\n [attr.aria-expanded]=\"isOpen()\"\n (focus)=\"openMenuOnFocus && !isOpen() && toggleDropdown(); focus.emit()\"\n [style]=\"customStyles.container || ''\"\n>\n <!-- Main Select Trigger -->\n <div\n class=\"select-trigger\"\n [class.open]=\"isOpen()\"\n [class.focused]=\"isOpen()\"\n (click)=\"openMenuOnClick && toggleDropdown()\"\n [attr.tabindex]=\"isDisabled ? -1 : 0\"\n role=\"button\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-label]=\"placeholder\"\n >\n <!-- Selected Value Display -->\n <div class=\"select-value\">\n <!-- Multi-select Tags -->\n @if (isMulti && selectedOptions().length > 0) {\n <div class=\"tags\">\n @for (option of selectedOptions(); track trackByValue($index, option)) {\n <span class=\"tag\" [class.disabled]=\"isDisabled\" [@tag]>\n <span class=\"tag-label\">{{getOptionLabel(option)}}</span>\n @if (!isDisabled) {\n <button\n class=\"tag-remove\"\n (click)=\"removeOption(option, $event)\"\n [attr.aria-label]=\"'Remove ' + getOptionLabel(option)\"\n type=\"button\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\">\n <path d=\"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z\"></path>\n </svg>\n </button>\n }\n </span>\n }\n </div>\n } @else {\n <!-- Single Select or Placeholder -->\n <span class=\"placeholder\" [class.has-value]=\"selectedOptions().length > 0\">\n {{displayText()}}\n </span>\n }\n </div>\n\n <!-- Actions (Clear, Loading, Arrow) -->\n <div class=\"select-actions\">\n @if (isLoading || isLoadingAsync()) {\n <div class=\"spinner\"></div>\n }\n @if (isClearable && selectedOptions().length > 0 && !isDisabled && !isLoading && !isLoadingAsync()) {\n <button\n class=\"clear-button\"\n (click)=\"clearSelection($event)\"\n aria-label=\"Clear selection\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path d=\"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z\"></path>\n </svg>\n </button>\n }\n <span class=\"separator\"></span>\n <span class=\"arrow\" [class.open]=\"isOpen()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path d=\"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z\"></path>\n </svg>\n </span>\n </div>\n </div>\n\n <!-- Dropdown Menu -->\n @if (isOpen()) {\n <div\n #menuRef\n class=\"dropdown {{menuPlacement}}\"\n [class.fixed]=\"menuPosition === 'fixed'\"\n [style.max-height]=\"maxHeight\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"isMulti\"\n [@dropdown]\n >\n <!-- Search Input -->\n @if (isSearchable) {\n <div class=\"search-container\">\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search...\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Search options\"\n aria-autocomplete=\"list\"\n />\n </div>\n }\n\n <!-- Options List -->\n <div class=\"options-list\" id=\"options-list\">\n <!-- Max Selection Message -->\n @if (isMaxSelectionReached()) {\n <div class=\"info-message max-selection\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm1 15H9v-2h2v2zm0-4H9V5h2v6z\"/>\n </svg>\n {{maxSelectedMessage}}\n </div>\n }\n\n <!-- Min Search Length Message -->\n @if (showMinSearchMessage()) {\n <div class=\"info-message min-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm1 15H9v-2h2v2zm0-4H9V5h2v6z\"/>\n </svg>\n {{minSearchMessage}} ({{searchTerm().length}}/{{minSearchLength}})\n </div>\n }\n\n @if (isLoadingAsync()) {\n <div class=\"loading-message\">{{loadingMessage()}}</div>\n } @else if (displayOptions().length === 0 && !showMinSearchMessage()) {\n <div class=\"no-options\">\n {{searchTerm() ? emptySearchText : emptyStateText}}\n </div>\n } @else if (!showMinSearchMessage()) {\n <!-- Select All (Multi-select only) -->\n @if (isMulti && showSelectAll && !searchTerm()) {\n <div class=\"select-all-container\">\n <button\n class=\"select-all-button\"\n (click)=\"allOptionsSelected() ? deselectAll() : selectAll()\"\n type=\"button\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allOptionsSelected()\"\n [indeterminate]=\"someOptionsSelected()\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n readonly\n />\n <span class=\"select-all-text\">\n {{allOptionsSelected() ? deselectAllText : selectAllText}}\n </span>\n <span class=\"select-all-count\">\n ({{selectedOptions().length}}/{{getEnabledOptionsCount()}})\n </span>\n </button>\n </div>\n }\n\n <!-- Grouped Options -->\n @if (isGrouped && groupedOptions()) {\n @for (group of groupedOptions() | keyvalue; track trackByGroup($index, [$any(group.key), $any(group.value)])) {\n <div class=\"option-group\">\n <div class=\"option-group-label\">{{group.key}}</div>\n @for (option of $any(group.value); track trackByValue($index, option); let idx = $index) {\n <div\n class=\"option\"\n [class.selected]=\"isSelected(option)\"\n [class.highlighted]=\"idx === highlightedIndex()\"\n [class.disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n [class.hidden]=\"hideSelectedOptions && isSelected(option)\"\n [class.create-option]=\"option.__isCreate__\"\n (click)=\"selectOption(option)\"\n (keydown)=\"$event.key === 'Enter' && selectOption(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n tabindex=\"-1\"\n >\n <!-- Checkbox for multi-select -->\n @if (isMulti) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n readonly\n />\n }\n\n <!-- Option Icon -->\n @if (showOptionIcons && option.icon) {\n <div class=\"option-icon\">\n @if (option.icon.includes('<')) {\n <div [innerHTML]=\"sanitizeHtml(option.icon)\"></div>\n } @else {\n <img [src]=\"option.icon\" [alt]=\"getOptionLabel(option)\" />\n }\n </div>\n }\n\n <!-- Option Content -->\n <div class=\"option-content\">\n <div class=\"option-label\">{{getOptionLabel(option)}}</div>\n @if (option.description) {\n <div class=\"option-description\">{{option.description}}</div>\n }\n </div>\n\n <!-- Option Badge -->\n @if (showOptionBadges && option.badge) {\n <span\n class=\"option-badge\"\n [style.background-color]=\"option.badgeColor || currentTheme().primary\"\n >\n {{option.badge}}\n </span>\n }\n\n <!-- Check Icon for selected -->\n @if (!isMulti && isSelected(option)) {\n <svg class=\"check-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\">\n <path d=\"M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z\"></path>\n </svg>\n }\n </div>\n }\n </div>\n }\n } @else {\n <!-- Regular (Ungrouped) Options -->\n @for (option of displayOptions(); track trackByValue($index, option); let idx = $index) {\n <div\n class=\"option\"\n [class.selected]=\"isSelected(option)\"\n [class.highlighted]=\"idx === highlightedIndex()\"\n [class.disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n [class.hidden]=\"hideSelectedOptions && isSelected(option)\"\n [class.create-option]=\"option.__isCreate__\"\n (click)=\"selectOption(option)\"\n (keydown)=\"$event.key === 'Enter' && selectOption(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n tabindex=\"-1\"\n >\n <!-- Checkbox for multi-select -->\n @if (isMulti) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n readonly\n />\n }\n\n <!-- Option Icon -->\n @if (showOptionIcons && option.icon) {\n <div class=\"option-icon\">\n @if (option.icon.includes('<')) {\n <div [innerHTML]=\"sanitizeHtml(option.icon)\"></div>\n } @else {\n <img [src]=\"option.icon\" [alt]=\"getOptionLabel(option)\" />\n }\n </div>\n }\n\n <!-- Option Content -->\n <div class=\"option-content\">\n <div class=\"option-label\">{{getOptionLabel(option)}}</div>\n @if (option.description) {\n <div class=\"option-description\">{{option.description}}</div>\n }\n </div>\n\n <!-- Option Badge -->\n @if (showOptionBadges && option.badge) {\n <span\n class=\"option-badge\"\n [style.background-color]=\"option.badgeColor || currentTheme().primary\"\n >\n {{option.badge}}\n </span>\n }\n\n <!-- Check Icon for selected -->\n @if (!isMulti && isSelected(option)) {\n <svg class=\"check-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\">\n <path d=\"M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z\"></path>\n </svg>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n }\n</div>\n\n<!-- Hidden native select for form compatibility -->\n@if (isMulti) {\n <select [name]=\"name\" [id]=\"id\" multiple style=\"display: none;\" [attr.aria-hidden]=\"true\">\n @for (option of selectedOptions(); track trackByValue($index, option)) {\n <option [value]=\"getOptionValue(option)\" selected>{{getOptionLabel(option)}}</option>\n }\n </select>\n} @else {\n @if (selectedOptions().length > 0) {\n <select [name]=\"name\" [id]=\"id\" style=\"display: none;\" [attr.aria-hidden]=\"true\">\n <option [value]=\"getOptionValue(selectedOptions()[0])\" selected>{{getOptionLabel(selectedOptions()[0])}}</option>\n </select>\n }\n}\n","/*\n * Public API Surface of angular-perfect-select\n */\n\n// Main Component\nexport * from './lib/components/perfect-select/perfect-select.component';\n\n// Models & Interfaces\nexport * from './lib/models/select-option.interface';\nexport * from './lib/models/select-events.interface';\n\n// Constants & Themes\nexport * from './lib/constants/themes.constant';\n\n// Animations\nexport * from './lib/animations/select.animations';\n\n// Directives\nexport * from './lib/directives/click-outside.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"angular-perfect-select.mjs","sources":["../../src/lib/animations/select.animations.ts","../../src/lib/directives/click-outside.directive.ts","../../src/lib/constants/themes.constant.ts","../../src/lib/components/perfect-select/perfect-select.component.ts","../../src/lib/components/perfect-select/perfect-select.component.html","../../src/public-api.ts","../../src/angular-perfect-select.ts"],"sourcesContent":["import {\n trigger,\n transition,\n style,\n animate,\n query,\n stagger,\n AnimationTriggerMetadata\n} from '@angular/animations';\n\nexport const dropdownAnimation: AnimationTriggerMetadata = trigger('dropdown', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(-10px)' }),\n animate(\n '200ms cubic-bezier(0.4, 0, 0.2, 1)',\n style({ opacity: 1, transform: 'translateY(0)' })\n )\n ]),\n transition(':leave', [\n animate('150ms ease-out', style({ opacity: 0 }))\n ])\n]);\n\nexport const tagAnimation: AnimationTriggerMetadata = trigger('tag', [\n transition(':enter', [\n style({ opacity: 0, transform: 'scale(0.8)' }),\n animate(\n '200ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n style({ opacity: 1, transform: 'scale(1)' })\n )\n ]),\n transition(':leave', [\n animate('150ms ease-out', style({ opacity: 0, transform: 'scale(0.8)' }))\n ])\n]);\n\nexport const optionListAnimation: AnimationTriggerMetadata = trigger('optionList', [\n transition(':enter', [\n query('.option', [\n style({ opacity: 0, transform: 'translateY(-5px)' }),\n stagger(15, [\n animate(\n '150ms ease-out',\n style({ opacity: 1, transform: 'translateY(0)' })\n )\n ])\n ], { optional: true })\n ])\n]);\n\nexport const selectAnimations = [dropdownAnimation, tagAnimation, optionListAnimation];\n","import {\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n Output\n} from '@angular/core';\n\n@Directive({\n selector: '[clickOutside]',\n standalone: true\n})\nexport class ClickOutsideDirective {\n @Output() clickOutside = new EventEmitter<void>();\n\n constructor(private elementRef: ElementRef) {}\n\n @HostListener('document:click', ['$event'])\n onClick(event: MouseEvent): void {\n const clickedInside = this.elementRef.nativeElement.contains(event.target);\n if (!clickedInside) {\n this.clickOutside.emit();\n }\n }\n}\n","export interface ThemeColors {\n primary: string;\n secondary: string;\n tag: string;\n tagText: string;\n tagBorder: string;\n}\n\nexport type ThemeName = 'blue' | 'purple' | 'green' | 'red' | 'orange' | 'pink' | 'dark';\n\nexport const THEMES: Record<ThemeName, ThemeColors> = {\n blue: {\n primary: '#2684FF',\n secondary: '#DEEBFF',\n tag: '#E6F2FF',\n tagText: '#0052CC',\n tagBorder: '#CCE0FF'\n },\n purple: {\n primary: '#9333EA',\n secondary: '#F3E8FF',\n tag: '#FAF5FF',\n tagText: '#7E22CE',\n tagBorder: '#E9D5FF'\n },\n green: {\n primary: '#10B981',\n secondary: '#D1FAE5',\n tag: '#ECFDF5',\n tagText: '#059669',\n tagBorder: '#A7F3D0'\n },\n red: {\n primary: '#EF4444',\n secondary: '#FEE2E2',\n tag: '#FEF2F2',\n tagText: '#DC2626',\n tagBorder: '#FECACA'\n },\n orange: {\n primary: '#F97316',\n secondary: '#FFEDD5',\n tag: '#FFF7ED',\n tagText: '#EA580C',\n tagBorder: '#FED7AA'\n },\n pink: {\n primary: '#EC4899',\n secondary: '#FCE7F3',\n tag: '#FDF2F8',\n tagText: '#DB2777',\n tagBorder: '#FBCFE8'\n },\n dark: {\n primary: '#1F2937',\n secondary: '#E5E7EB',\n tag: '#F3F4F6',\n tagText: '#111827',\n tagBorder: '#D1D5DB'\n }\n};\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n computed,\n HostListener,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ElementRef,\n ViewChild,\n ContentChild,\n TemplateRef,\n forwardRef,\n effect\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ScrollingModule, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\nimport { selectAnimations } from '../../animations/select.animations';\nimport { ClickOutsideDirective } from '../../directives/click-outside.directive';\nimport { THEMES, ThemeName } from '../../constants/themes.constant';\nimport { SelectOption } from '../../models/select-option.interface';\nimport { ValidationState } from '../../models/validation.types';\nimport {\n SelectChangeEvent,\n SelectInputChangeEvent,\n SelectCreateOptionEvent,\n SelectOptionsLoadedEvent,\n SelectLoadErrorEvent,\n SelectCopyEvent,\n SelectPasteEvent,\n SelectScrollEndEvent\n} from '../../models/select-events.interface';\n\n@Component({\n selector: 'ng-perfect-select',\n standalone: true,\n imports: [CommonModule, FormsModule, ClickOutsideDirective, ScrollingModule],\n templateUrl: './perfect-select.component.html',\n styleUrls: ['./perfect-select.component.scss'],\n animations: selectAnimations,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PerfectSelectComponent),\n multi: true\n }]\n})\nexport class PerfectSelectComponent implements ControlValueAccessor, OnInit, OnChanges, OnDestroy {\n\n // Core Props\n @Input() options: SelectOption[] = [];\n @Input() placeholder = 'Select...';\n\n // React-Select Compatible Props (dual naming)\n @Input() isMulti = false;\n @Input() set multiple(value: boolean) { this.isMulti = value; }\n @Input() isSearchable = true;\n @Input() set searchable(value: boolean) { this.isSearchable = value; }\n @Input() isClearable = true;\n @Input() set clearable(value: boolean) { this.isClearable = value; }\n @Input() isDisabled = false;\n @Input() set disabled(value: boolean) { this.isDisabled = value; }\n @Input() isLoading = false;\n @Input() set loading(value: boolean) { this.isLoading = value; }\n @Input() isRtl = false;\n @Input() closeMenuOnSelect = true;\n @Input() hideSelectedOptions = false;\n\n // Creatable Mode\n @Input() isCreatable = false;\n @Input() allowCreateWhileLoading = false;\n @Input() createOptionPosition: 'first' | 'last' = 'last';\n @Input() formatCreateLabel: (inputValue: string) => string = (inputValue) => `Create \"${inputValue}\"`;\n\n // Async Loading\n @Input() loadOptions: ((inputValue: string) => Promise<SelectOption[]>) | null = null;\n @Input() cacheOptions = true;\n @Input() defaultOptions = false;\n\n // Styling & Theming\n @Input() selectSize: 'smaller' | 'small' | 'medium' | 'large' | 'larger' = 'medium';\n @Input() containerSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'md';\n @Input() theme: ThemeName = 'blue';\n @Input() borderRadius = '8px';\n @Input() customStyles: {\n container?: string;\n control?: string;\n menu?: string;\n option?: string;\n tag?: string;\n } = {};\n @Input() maxHeight = '300px';\n @Input() menuPlacement: 'auto' | 'top' | 'bottom' = 'auto';\n @Input() menuPosition: 'absolute' | 'fixed' = 'absolute';\n\n // Option Customization\n @Input() getOptionLabel: (option: SelectOption) => string = (option) => option.label || String(option.value);\n @Input() getOptionValue: (option: SelectOption) => any = (option) => option.id || option.value;\n @Input() isOptionDisabled: (option: SelectOption) => boolean = (option) => option.disabled || false;\n @Input() filterOption: ((option: SelectOption, inputValue: string) => boolean) | null = null;\n\n // Grouping\n @Input() isGrouped = false;\n @Input() groupBy: ((option: SelectOption) => string) | null = null;\n\n // Advanced Features\n @Input() showSelectAll = false;\n @Input() selectAllText = 'Select All';\n @Input() deselectAllText = 'Deselect All';\n @Input() showOptionIcons = false;\n @Input() showOptionBadges = false;\n @Input() maxOptionsDisplay = 1000;\n @Input() optionHeight = 40;\n @Input() emptyStateText = 'No options available';\n @Input() emptySearchText = 'No results found';\n\n // v1.0.1 Features\n @Input() maxSelectedOptions: number | null = null;\n @Input() maxSelectedMessage: string = 'Maximum selections reached';\n @Input() debounceTime: number = 300;\n @Input() minSearchLength: number = 0;\n @Input() minSearchMessage: string = 'Type to search...';\n\n // v1.2.0 Features - Virtual Scrolling\n @Input() enableVirtualScroll: boolean = false;\n @Input() virtualScrollItemSize: number = 40;\n @Input() virtualScrollMinBufferPx: number = 200;\n @Input() virtualScrollMaxBufferPx: number = 400;\n\n // v1.2.0 Features - Validation States\n @Input() validationState: ValidationState = 'default';\n @Input() validationMessage: string = '';\n @Input() showValidationIcon: boolean = true;\n\n // v1.2.0 Features - Tooltips\n @Input() showTooltips: boolean = false;\n @Input() tooltipDelay: number = 300;\n @Input() getOptionTooltip: (option: SelectOption) => string = (option) => option.tooltip || '';\n\n // v1.2.0 Features - Recent Selections\n @Input() showRecentSelections: boolean = false;\n @Input() recentSelectionsLimit: number = 5;\n @Input() recentSelectionsLabel: string = 'Recent';\n @Input() enableRecentSelectionsPersistence: boolean = false;\n\n // v1.2.0 Features - Infinite Scroll / Pagination\n @Input() enableInfiniteScroll: boolean = false;\n @Input() infiniteScrollThreshold: number = 80;\n @Input() totalOptionsCount: number | null = null;\n\n // v1.2.0 Features - Advanced Keyboard\n @Input() enableAdvancedKeyboard: boolean = true;\n @Input() typeAheadDelay: number = 500;\n @Input() enableCopyPaste: boolean = true;\n @Input() copyDelimiter: string = ', ';\n @Input() pasteDelimiter: string = ',';\n\n // Behavior\n @Input() name = 'angular-perfect-select';\n @Input() id = 'angular-perfect-select';\n @Input() autoFocus = false;\n @Input() openMenuOnFocus = false;\n @Input() openMenuOnClick = true;\n @Input() tabSelectsValue = true;\n @Input() backspaceRemovesValue = true;\n @Input() escapeClearsValue = false;\n @Input() noOptionsMessage: () => string = () => 'No options';\n @Input() loadingMessage: () => string = () => 'Loading...';\n\n // Events\n @Output() change = new EventEmitter<SelectChangeEvent>();\n @Output() clear = new EventEmitter<void>();\n @Output() focus = new EventEmitter<void>();\n @Output() blur = new EventEmitter<void>();\n @Output() menuOpen = new EventEmitter<void>();\n @Output() menuClose = new EventEmitter<void>();\n @Output() inputChange = new EventEmitter<SelectInputChangeEvent>();\n @Output() createOption = new EventEmitter<SelectCreateOptionEvent>();\n @Output() optionsLoaded = new EventEmitter<SelectOptionsLoadedEvent>();\n @Output() loadError = new EventEmitter<SelectLoadErrorEvent>();\n\n // v1.2.0 Events\n @Output() copy = new EventEmitter<SelectCopyEvent>();\n @Output() paste = new EventEmitter<SelectPasteEvent>();\n @Output() scrollEnd = new EventEmitter<SelectScrollEndEvent>();\n\n // ViewChildren\n @ViewChild('selectContainer') selectContainerRef!: ElementRef;\n @ViewChild('searchInput') searchInputRef!: ElementRef;\n @ViewChild('menuRef') menuElementRef!: ElementRef;\n @ViewChild(CdkVirtualScrollViewport) virtualScrollViewport?: CdkVirtualScrollViewport;\n\n // ContentChildren - Custom Templates\n @ContentChild('optionTemplate', { read: TemplateRef }) optionTemplate?: TemplateRef<any>;\n @ContentChild('selectedOptionTemplate', { read: TemplateRef }) selectedOptionTemplate?: TemplateRef<any>;\n\n // Signals for reactive state\n isOpen = signal(false);\n searchTerm = signal('');\n highlightedIndex = signal(-1);\n internalValue = signal<any>(this.isMulti ? [] : null);\n internalOptions = signal<SelectOption[]>([]);\n isLoadingAsync = signal(false);\n private optionsCache = new Map<string, SelectOption[]>();\n private debounceTimeout: any = null;\n\n // v1.2.0 Signals\n recentSelections = signal<SelectOption[]>([]);\n typeAheadBuffer = signal<string>('');\n hoveredOptionIndex = signal<number>(-1);\n isScrolling = signal<boolean>(false);\n\n // v1.2.0 Private state\n private typeAheadTimeout: any = null;\n private tooltipTimeout: any = null;\n private recentSelectionsStorageKey = '';\n private scrollEndTimeout: any = null;\n\n // Computed signals\n currentTheme = computed(() => THEMES[this.theme] || THEMES.blue);\n\n filteredOptions = computed(() => {\n const term = this.searchTerm();\n const opts = this.internalOptions();\n\n // Check min search length\n if (this.minSearchLength > 0 && term.length < this.minSearchLength) {\n return [];\n }\n\n if (!term) return opts;\n\n return opts.filter(option => {\n if (this.filterOption) {\n return this.filterOption(option, term);\n }\n const label = this.getOptionLabel(option);\n return label.toLowerCase().includes(term.toLowerCase());\n });\n });\n\n selectedOptions = computed(() => {\n const value = this.internalValue();\n if (!value) return [];\n\n const allOptions = this.internalOptions();\n\n if (this.isMulti) {\n const values = Array.isArray(value) ? value : [];\n // Map values to option objects\n return values.map(v => {\n const found = allOptions.find(opt => this.getOptionValue(opt) === v);\n return found || { id: v, label: String(v), value: v };\n });\n }\n\n // Single select - find the option by value\n const found = allOptions.find(opt => this.getOptionValue(opt) === value);\n return found ? [found] : [];\n });\n\n displayText = computed(() => {\n const selected = this.selectedOptions();\n if (selected.length === 0) {\n return this.placeholder;\n }\n\n if (this.isMulti) {\n return `${selected.length} selected`;\n }\n\n return this.getOptionLabel(selected[0]);\n });\n\n groupedOptions = computed(() => {\n if (!this.isGrouped || !this.groupBy) {\n return null;\n }\n\n const opts = this.filteredOptions();\n const groups: Record<string, SelectOption[]> = {};\n\n opts.forEach(option => {\n const group = this.groupBy!(option);\n if (!groups[group]) {\n groups[group] = [];\n }\n groups[group].push(option);\n });\n\n return groups;\n });\n\n displayOptions = computed(() => {\n let opts = this.filteredOptions();\n\n if (this.isCreatable && this.searchTerm() && !this.isLoadingAsync()) {\n const term = this.searchTerm();\n const exactMatch = opts.some(opt =>\n this.getOptionLabel(opt).toLowerCase() === term.toLowerCase()\n );\n\n if (!exactMatch) {\n const createOption: SelectOption = {\n id: '__create__',\n label: this.formatCreateLabel(term),\n value: term,\n __isCreate__: true\n };\n\n if (this.createOptionPosition === 'first') {\n opts = [createOption, ...opts];\n } else {\n opts = [...opts, createOption];\n }\n }\n }\n\n return opts;\n });\n\n allOptionsSelected = computed(() => {\n if (!this.isMulti) return false;\n const opts = this.filteredOptions().filter(opt => !this.isOptionDisabled(opt));\n const selected = this.selectedOptions();\n return opts.length > 0 && opts.every(opt =>\n selected.some(s => this.getOptionValue(s) === this.getOptionValue(opt))\n );\n });\n\n someOptionsSelected = computed(() => {\n if (!this.isMulti) return false;\n const opts = this.filteredOptions().filter(opt => !this.isOptionDisabled(opt));\n const selected = this.selectedOptions();\n const selectedCount = opts.filter(opt =>\n selected.some(s => this.getOptionValue(s) === this.getOptionValue(opt))\n ).length;\n return selectedCount > 0 && selectedCount < opts.length;\n });\n\n // v1.0.1 Computed signals\n isMaxSelectionReached = computed(() => {\n if (!this.isMulti || this.maxSelectedOptions === null) return false;\n const selected = this.selectedOptions();\n return selected.length >= this.maxSelectedOptions;\n });\n\n showMinSearchMessage = computed(() => {\n if (this.minSearchLength === 0) return false;\n const term = this.searchTerm();\n return this.isOpen() && term.length > 0 && term.length < this.minSearchLength;\n });\n\n // v1.2.0 Computed signals\n displayOptionsWithRecent = computed(() => {\n if (!this.showRecentSelections || this.searchTerm()) {\n return this.displayOptions();\n }\n\n const recent = this.recentSelections();\n const display = this.displayOptions();\n\n // Filter out recent options from display list to avoid duplicates\n const displayWithoutRecent = display.filter(opt =>\n !recent.some(r => this.getOptionValue(r) === this.getOptionValue(opt))\n );\n\n // Combine recent (marked) and regular options\n const markedRecent = recent.map(opt => ({ ...opt, __isRecent__: true }));\n return [...markedRecent, ...displayWithoutRecent];\n });\n\n validationIconName = computed(() => {\n const state = this.validationState;\n switch (state) {\n case 'error': return 'error';\n case 'warning': return 'warning';\n case 'success': return 'check_circle';\n case 'info': return 'info';\n default: return '';\n }\n });\n\n // Helper method for template\n getEnabledOptionsCount(): number {\n return this.filteredOptions().filter(opt => !this.isOptionDisabled(opt)).length;\n }\n\n // ControlValueAccessor\n private onChange: any = () => {};\n private onTouched: any = () => {};\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n // Update internal options when the options input changes\n if (changes['options'] && this.options.length > 0 && !this.loadOptions) {\n this.internalOptions.set([...this.options]);\n }\n\n // Update closeMenuOnSelect based on isMulti\n if (changes['isMulti'] && this.isMulti && this.closeMenuOnSelect === true) {\n this.closeMenuOnSelect = false;\n }\n }\n\n writeValue(value: any): void {\n this.internalValue.set(value);\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.isDisabled = disabled;\n }\n\n ngOnInit(): void {\n // Initialize options\n if (this.options.length > 0) {\n this.internalOptions.set([...this.options]);\n }\n\n // Update closeMenuOnSelect based on isMulti (initial setup)\n if (this.isMulti && this.closeMenuOnSelect === true) {\n this.closeMenuOnSelect = false;\n }\n\n // Load default options if async\n if (this.loadOptions && this.defaultOptions) {\n this.handleLoadOptions('');\n }\n\n // v1.2.0: Initialize recent selections\n if (this.showRecentSelections) {\n this.recentSelectionsStorageKey = `ps-recent-${this.name || this.id}`;\n this.loadRecentSelections();\n }\n\n // Auto-focus if needed\n if (this.autoFocus) {\n setTimeout(() => {\n if (this.searchInputRef) {\n this.searchInputRef.nativeElement.focus();\n }\n });\n }\n }\n\n ngOnDestroy(): void {\n // Clear debounce timeout\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n\n // v1.2.0: Clear new timeouts\n if (this.typeAheadTimeout) {\n clearTimeout(this.typeAheadTimeout);\n }\n if (this.tooltipTimeout) {\n clearTimeout(this.tooltipTimeout);\n }\n if (this.scrollEndTimeout) {\n clearTimeout(this.scrollEndTimeout);\n }\n }\n\n // Keyboard Navigation\n @HostListener('keydown', ['$event'])\n handleKeydown(event: KeyboardEvent): void {\n if (this.isDisabled) return;\n\n // v1.2.0: Advanced keyboard shortcuts\n if (this.enableAdvancedKeyboard) {\n // Ctrl/Cmd + A: Select All\n if ((event.ctrlKey || event.metaKey) && event.key === 'a' && this.isMulti && this.isOpen()) {\n event.preventDefault();\n this.selectAll();\n return;\n }\n\n // Ctrl/Cmd + C: Copy\n if ((event.ctrlKey || event.metaKey) && event.key === 'c' && this.enableCopyPaste) {\n if (this.selectedOptions().length > 0) {\n event.preventDefault();\n this.copySelectedValues();\n }\n return;\n }\n\n // Ctrl/Cmd + V: Paste\n if ((event.ctrlKey || event.metaKey) && event.key === 'v' && this.enableCopyPaste && this.isMulti) {\n // Let browser handle paste, we'll catch it in the paste event\n return;\n }\n\n // Home: Jump to first option\n if (event.key === 'Home' && this.isOpen()) {\n event.preventDefault();\n this.highlightedIndex.set(0);\n this.scrollHighlightedIntoView();\n return;\n }\n\n // End: Jump to last option\n if (event.key === 'End' && this.isOpen()) {\n event.preventDefault();\n const opts = this.displayOptions();\n this.highlightedIndex.set(Math.max(0, opts.length - 1));\n this.scrollHighlightedIntoView();\n return;\n }\n\n // Type-ahead: Single character typing\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey && this.isOpen()) {\n this.handleTypeAhead(event.key);\n }\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) {\n this.toggleDropdown();\n } else {\n this.moveHighlight(1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.moveHighlight(-1);\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.isOpen()) {\n const index = this.highlightedIndex();\n const opts = this.showRecentSelections ? this.displayOptionsWithRecent() : this.displayOptions();\n if (index >= 0 && index < opts.length) {\n this.selectOption(opts[index]);\n }\n } else {\n this.toggleDropdown();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n if (this.isOpen()) {\n this.closeDropdown();\n }\n if (this.escapeClearsValue) {\n this.clearSelection(event);\n }\n break;\n\n case 'Tab':\n if (this.isOpen() && this.tabSelectsValue) {\n const index = this.highlightedIndex();\n const opts = this.displayOptions();\n if (index >= 0 && index < opts.length) {\n event.preventDefault();\n this.selectOption(opts[index]);\n }\n }\n if (this.isOpen()) {\n this.closeDropdown();\n }\n break;\n\n case 'Backspace':\n if (this.backspaceRemovesValue && this.isMulti && !this.searchTerm()) {\n const selected = this.selectedOptions();\n if (selected.length > 0) {\n event.preventDefault();\n this.removeOption(selected[selected.length - 1], event);\n }\n }\n break;\n }\n }\n\n // v1.2.0: Paste event handler\n @HostListener('paste', ['$event'])\n handlePaste(event: ClipboardEvent): void {\n if (!this.enableCopyPaste || !this.isMulti || this.isDisabled) return;\n\n const pastedText = event.clipboardData?.getData('text');\n if (!pastedText) return;\n\n event.preventDefault();\n this.pasteValues(pastedText);\n }\n\n // Toggle dropdown\n toggleDropdown(): void {\n if (this.isDisabled) return;\n\n if (this.isOpen()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n openDropdown(): void {\n this.isOpen.set(true);\n this.menuOpen.emit();\n\n // Focus search input\n setTimeout(() => {\n if (this.isSearchable && this.searchInputRef) {\n this.searchInputRef.nativeElement.focus();\n }\n });\n }\n\n closeDropdown(): void {\n this.isOpen.set(false);\n this.searchTerm.set('');\n this.highlightedIndex.set(-1);\n this.menuClose.emit();\n this.onTouched();\n }\n\n // Select option\n selectOption(option: SelectOption): void {\n if (this.isOptionDisabled(option)) return;\n\n // Handle create option\n if (option.__isCreate__) {\n const newOption: SelectOption = {\n id: Date.now().toString(),\n label: this.searchTerm(),\n value: this.searchTerm(),\n __isNew__: true\n };\n this.internalOptions.update(opts => [...opts, newOption]);\n this.createOption.emit({ option: newOption });\n option = newOption;\n }\n\n const optionValue = this.getOptionValue(option);\n\n if (this.isMulti) {\n const currentValue = Array.isArray(this.internalValue()) ? [...this.internalValue()] : [];\n const exists = currentValue.includes(optionValue);\n\n let newValue: any[];\n if (exists) {\n newValue = currentValue.filter((v: any) => v !== optionValue);\n } else {\n // Check max selection limit\n if (this.maxSelectedOptions !== null && currentValue.length >= this.maxSelectedOptions) {\n return; // Don't allow selection beyond max\n }\n newValue = [...currentValue, optionValue];\n }\n\n this.internalValue.set(newValue);\n this.onChange(newValue);\n this.change.emit({\n value: newValue,\n option,\n action: exists ? 'remove-value' : 'select-option'\n });\n\n // v1.2.0: Track recent selection\n if (!exists && this.showRecentSelections) {\n this.addToRecentSelections(option);\n }\n } else {\n this.internalValue.set(optionValue);\n this.onChange(optionValue);\n this.change.emit({\n value: optionValue,\n option,\n action: 'select-option'\n });\n\n // v1.2.0: Track recent selection\n if (this.showRecentSelections) {\n this.addToRecentSelections(option);\n }\n }\n\n if (this.closeMenuOnSelect) {\n this.closeDropdown();\n }\n\n this.searchTerm.set('');\n }\n\n // Remove option (multi-select)\n removeOption(option: SelectOption, event: Event): void {\n event.stopPropagation();\n\n const currentValue = Array.isArray(this.internalValue()) ? [...this.internalValue()] : [];\n const optionValue = this.getOptionValue(option);\n const newValue = currentValue.filter((v: any) => v !== optionValue);\n\n this.internalValue.set(newValue);\n this.onChange(newValue);\n this.change.emit({\n value: newValue,\n option,\n action: 'remove-value'\n });\n }\n\n // Clear selection\n clearSelection(event: Event): void {\n event.stopPropagation();\n\n const newValue = this.isMulti ? [] : null;\n this.internalValue.set(newValue);\n this.onChange(newValue);\n this.change.emit({\n value: newValue,\n action: 'clear'\n });\n this.clear.emit();\n }\n\n // Select All / Deselect All\n selectAll(): void {\n let opts = this.filteredOptions().filter(opt => !this.isOptionDisabled(opt));\n\n // Respect max selection limit\n if (this.maxSelectedOptions !== null && opts.length > this.maxSelectedOptions) {\n opts = opts.slice(0, this.maxSelectedOptions);\n }\n\n const values = opts.map(opt => this.getOptionValue(opt));\n this.internalValue.set(values);\n this.onChange(values);\n this.change.emit({\n value: values,\n option: opts,\n action: 'select-all'\n });\n }\n\n deselectAll(): void {\n this.internalValue.set([]);\n this.onChange([]);\n this.change.emit({\n value: [],\n action: 'deselect-all'\n });\n }\n\n // Search input change\n onSearchChange(term: string): void {\n this.searchTerm.set(term);\n this.highlightedIndex.set(0);\n this.inputChange.emit({\n value: term,\n action: 'input-change'\n });\n\n // Trigger async loading if configured with debounce\n if (this.loadOptions) {\n // Clear existing timeout\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout);\n }\n\n // Set new timeout for debounced loading\n this.debounceTimeout = setTimeout(() => {\n this.handleLoadOptions(term);\n }, this.debounceTime);\n }\n }\n\n // Async loading\n async handleLoadOptions(inputValue: string): Promise<void> {\n if (!this.loadOptions) return;\n\n // Check cache\n if (this.cacheOptions && this.optionsCache.has(inputValue)) {\n this.internalOptions.set(this.optionsCache.get(inputValue)!);\n return;\n }\n\n this.isLoadingAsync.set(true);\n\n try {\n const options = await this.loadOptions(inputValue);\n this.internalOptions.set(options);\n\n if (this.cacheOptions) {\n this.optionsCache.set(inputValue, options);\n }\n\n this.optionsLoaded.emit({ options });\n } catch (error) {\n this.loadError.emit({ error: error as Error });\n } finally {\n this.isLoadingAsync.set(false);\n }\n }\n\n // Move highlight index\n moveHighlight(direction: number): void {\n const opts = this.displayOptions();\n if (opts.length === 0) return;\n\n let newIndex = this.highlightedIndex() + direction;\n\n if (newIndex < 0) newIndex = 0;\n if (newIndex >= opts.length) newIndex = opts.length - 1;\n\n this.highlightedIndex.set(newIndex);\n this.scrollHighlightedIntoView();\n }\n\n // Scroll highlighted option into view\n scrollHighlightedIntoView(): void {\n setTimeout(() => {\n if (!this.menuElementRef) return;\n\n const menu = this.menuElementRef.nativeElement;\n const highlighted = menu.querySelector('.option.highlighted');\n\n if (highlighted) {\n const menuRect = menu.getBoundingClientRect();\n const optionRect = highlighted.getBoundingClientRect();\n\n if (optionRect.bottom > menuRect.bottom) {\n menu.scrollTop += optionRect.bottom - menuRect.bottom;\n } else if (optionRect.top < menuRect.top) {\n menu.scrollTop -= menuRect.top - optionRect.top;\n }\n }\n });\n }\n\n // Click outside handler\n onClickOutside(): void {\n if (this.isOpen()) {\n this.closeDropdown();\n this.blur.emit();\n }\n }\n\n // Check if option is selected\n isSelected(option: SelectOption): boolean {\n const selected = this.selectedOptions();\n const optionValue = this.getOptionValue(option);\n return selected.some(s => this.getOptionValue(s) === optionValue);\n }\n\n // Sanitize HTML for icons\n sanitizeHtml(html: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n\n // Track by function for ngFor\n trackByValue(index: number, option: SelectOption): any {\n return this.getOptionValue(option);\n }\n\n trackByGroup(index: number, item: [string, SelectOption[]]): string {\n return item[0];\n }\n\n // ==================== v1.2.0 NEW METHODS ====================\n\n // Copy selected values to clipboard\n copySelectedValues(): void {\n const selected = this.selectedOptions();\n if (selected.length === 0) return;\n\n const values = selected.map(opt => this.getOptionLabel(opt));\n const formattedText = values.join(this.copyDelimiter);\n\n // Copy to clipboard using modern API\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(formattedText).then(() => {\n this.copy.emit({ values: selected.map(opt => this.getOptionValue(opt)), formattedText });\n });\n } else {\n // Fallback for older browsers\n const textarea = document.createElement('textarea');\n textarea.value = formattedText;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n this.copy.emit({ values: selected.map(opt => this.getOptionValue(opt)), formattedText });\n }\n }\n\n // Paste values from clipboard\n pasteValues(pastedText: string): void {\n const values = pastedText\n .split(this.pasteDelimiter)\n .map(v => v.trim())\n .filter(v => v.length > 0);\n\n if (values.length === 0) return;\n\n this.paste.emit({ values, pastedText });\n\n // Find matching options and select them\n const allOptions = this.internalOptions();\n const currentValue = Array.isArray(this.internalValue()) ? [...this.internalValue()] : [];\n\n values.forEach(value => {\n const option = allOptions.find(opt =>\n this.getOptionLabel(opt).toLowerCase() === value.toLowerCase() ||\n String(this.getOptionValue(opt)).toLowerCase() === value.toLowerCase()\n );\n\n if (option && !currentValue.includes(this.getOptionValue(option))) {\n // Check max selection limit\n if (this.maxSelectedOptions === null || currentValue.length < this.maxSelectedOptions) {\n currentValue.push(this.getOptionValue(option));\n }\n }\n });\n\n this.internalValue.set(currentValue);\n this.onChange(currentValue);\n this.change.emit({\n value: currentValue,\n action: 'set-value'\n });\n }\n\n // Type-ahead functionality\n handleTypeAhead(key: string): void {\n // Clear previous timeout\n if (this.typeAheadTimeout) {\n clearTimeout(this.typeAheadTimeout);\n }\n\n // Append key to buffer\n const newBuffer = this.typeAheadBuffer() + key.toLowerCase();\n this.typeAheadBuffer.set(newBuffer);\n\n // Find matching option\n const opts = this.displayOptions();\n const matchIndex = opts.findIndex(opt =>\n this.getOptionLabel(opt).toLowerCase().startsWith(newBuffer)\n );\n\n if (matchIndex !== -1) {\n this.highlightedIndex.set(matchIndex);\n this.scrollHighlightedIntoView();\n }\n\n // Clear buffer after delay\n this.typeAheadTimeout = setTimeout(() => {\n this.typeAheadBuffer.set('');\n }, this.typeAheadDelay);\n }\n\n // Recent selections management\n addToRecentSelections(option: SelectOption): void {\n const recent = this.recentSelections();\n const optionValue = this.getOptionValue(option);\n\n // Remove if already exists\n const filtered = recent.filter(r => this.getOptionValue(r) !== optionValue);\n\n // Add to beginning\n const updated = [option, ...filtered].slice(0, this.recentSelectionsLimit);\n this.recentSelections.set(updated);\n\n // Save to storage if enabled\n if (this.enableRecentSelectionsPersistence) {\n this.saveRecentSelections();\n }\n }\n\n loadRecentSelections(): void {\n if (!this.enableRecentSelectionsPersistence) return;\n\n try {\n const stored = localStorage.getItem(this.recentSelectionsStorageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n this.recentSelections.set(parsed.slice(0, this.recentSelectionsLimit));\n }\n } catch (error) {\n console.warn('Failed to load recent selections:', error);\n }\n }\n\n saveRecentSelections(): void {\n if (!this.enableRecentSelectionsPersistence) return;\n\n try {\n const recent = this.recentSelections();\n localStorage.setItem(this.recentSelectionsStorageKey, JSON.stringify(recent));\n } catch (error) {\n console.warn('Failed to save recent selections:', error);\n }\n }\n\n // Infinite scroll handler\n onOptionsScroll(event: Event): void {\n if (!this.enableInfiniteScroll) return;\n\n const target = event.target as HTMLElement;\n const scrollTop = target.scrollTop;\n const scrollHeight = target.scrollHeight;\n const clientHeight = target.clientHeight;\n\n const scrollPercentage = ((scrollTop + clientHeight) / scrollHeight) * 100;\n\n // Clear previous timeout\n if (this.scrollEndTimeout) {\n clearTimeout(this.scrollEndTimeout);\n }\n\n // Debounce scroll end detection\n this.scrollEndTimeout = setTimeout(() => {\n if (scrollPercentage >= this.infiniteScrollThreshold) {\n this.scrollEnd.emit({ scrollTop, scrollHeight, clientHeight });\n }\n }, 100);\n }\n\n // Virtual scroll index tracking\n onVirtualScrollIndexChange(index: number): void {\n // Update highlighted index for virtual scroll\n if (this.enableVirtualScroll) {\n this.highlightedIndex.set(index);\n }\n }\n\n // Tooltip methods\n showTooltip(option: SelectOption, index: number): void {\n if (!this.showTooltips) return;\n\n this.hoveredOptionIndex.set(index);\n }\n\n hideTooltip(): void {\n this.hoveredOptionIndex.set(-1);\n }\n\n getTooltipContent(option: SelectOption): string {\n return this.getOptionTooltip(option) || option.tooltip || '';\n }\n\n // Validation state CSS class\n getValidationClass(): string {\n return `validation-${this.validationState}`;\n }\n}\n","<div\n #selectContainer\n class=\"select-container {{selectSize}} {{containerSize}} theme-{{theme}} {{getValidationClass()}}\"\n [class.disabled]=\"isDisabled\"\n [class.rtl]=\"isRtl\"\n [class.has-validation]=\"validationState !== 'default'\"\n (clickOutside)=\"onClickOutside()\"\n role=\"combobox\"\n tabindex=\"0\"\n [attr.aria-controls]=\"'options-list'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"validationState === 'error'\"\n (focus)=\"openMenuOnFocus && !isOpen() && toggleDropdown(); focus.emit()\"\n [style]=\"customStyles.container || ''\"\n>\n <!-- Main Select Trigger -->\n <div\n class=\"select-trigger\"\n [class.open]=\"isOpen()\"\n [class.focused]=\"isOpen()\"\n (click)=\"openMenuOnClick && toggleDropdown()\"\n [attr.tabindex]=\"isDisabled ? -1 : 0\"\n role=\"button\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-label]=\"placeholder\"\n >\n <!-- Selected Value Display -->\n <div class=\"select-value\">\n <!-- Multi-select Tags -->\n @if (isMulti && selectedOptions().length > 0) {\n <div class=\"tags\">\n @for (option of selectedOptions(); track trackByValue($index, option)) {\n <span class=\"tag\" [class.disabled]=\"isDisabled\" [@tag]>\n <span class=\"tag-label\">{{getOptionLabel(option)}}</span>\n @if (!isDisabled) {\n <button\n class=\"tag-remove\"\n (click)=\"removeOption(option, $event)\"\n [attr.aria-label]=\"'Remove ' + getOptionLabel(option)\"\n type=\"button\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\">\n <path d=\"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z\"></path>\n </svg>\n </button>\n }\n </span>\n }\n </div>\n } @else {\n <!-- Single Select or Placeholder -->\n <span class=\"placeholder\" [class.has-value]=\"selectedOptions().length > 0\">\n {{displayText()}}\n </span>\n }\n </div>\n\n <!-- Actions (Clear, Loading, Arrow) -->\n <div class=\"select-actions\">\n @if (isLoading || isLoadingAsync()) {\n <div class=\"spinner\"></div>\n }\n @if (isClearable && selectedOptions().length > 0 && !isDisabled && !isLoading && !isLoadingAsync()) {\n <button\n class=\"clear-button\"\n (click)=\"clearSelection($event)\"\n aria-label=\"Clear selection\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path d=\"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z\"></path>\n </svg>\n </button>\n }\n <span class=\"separator\"></span>\n <span class=\"arrow\" [class.open]=\"isOpen()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path d=\"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z\"></path>\n </svg>\n </span>\n </div>\n </div>\n\n <!-- Dropdown Menu -->\n @if (isOpen()) {\n <div\n #menuRef\n class=\"dropdown {{menuPlacement}}\"\n [class.fixed]=\"menuPosition === 'fixed'\"\n [style.max-height]=\"maxHeight\"\n role=\"listbox\"\n [attr.aria-multiselectable]=\"isMulti\"\n [@dropdown]\n >\n <!-- Search Input -->\n @if (isSearchable) {\n <div class=\"search-container\">\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search...\"\n [value]=\"searchTerm()\"\n (input)=\"onSearchChange($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Search options\"\n aria-autocomplete=\"list\"\n />\n </div>\n }\n\n <!-- Options List -->\n <div\n class=\"options-list\"\n id=\"options-list\"\n (scroll)=\"onOptionsScroll($event)\"\n >\n <!-- Max Selection Message -->\n @if (isMaxSelectionReached()) {\n <div class=\"info-message max-selection\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm1 15H9v-2h2v2zm0-4H9V5h2v6z\"/>\n </svg>\n {{maxSelectedMessage}}\n </div>\n }\n\n <!-- Min Search Length Message -->\n @if (showMinSearchMessage()) {\n <div class=\"info-message min-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm1 15H9v-2h2v2zm0-4H9V5h2v6z\"/>\n </svg>\n {{minSearchMessage}} ({{searchTerm().length}}/{{minSearchLength}})\n </div>\n }\n\n @if (isLoadingAsync()) {\n <div class=\"loading-message\">{{loadingMessage()}}</div>\n } @else if (displayOptions().length === 0 && !showMinSearchMessage()) {\n <div class=\"no-options\">\n {{searchTerm() ? emptySearchText : emptyStateText}}\n </div>\n } @else if (!showMinSearchMessage()) {\n <!-- Select All (Multi-select only) -->\n @if (isMulti && showSelectAll && !searchTerm()) {\n <div class=\"select-all-container\">\n <button\n class=\"select-all-button\"\n (click)=\"allOptionsSelected() ? deselectAll() : selectAll()\"\n type=\"button\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allOptionsSelected()\"\n [indeterminate]=\"someOptionsSelected()\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n readonly\n />\n <span class=\"select-all-text\">\n {{allOptionsSelected() ? deselectAllText : selectAllText}}\n </span>\n <span class=\"select-all-count\">\n ({{selectedOptions().length}}/{{getEnabledOptionsCount()}})\n </span>\n </button>\n </div>\n }\n\n <!-- Grouped Options -->\n @if (isGrouped && groupedOptions()) {\n @for (group of groupedOptions() | keyvalue; track trackByGroup($index, [$any(group.key), $any(group.value)])) {\n <div class=\"option-group\">\n <div class=\"option-group-label\">{{group.key}}</div>\n @for (option of $any(group.value); track trackByValue($index, option); let idx = $index) {\n <div\n class=\"option\"\n [class.selected]=\"isSelected(option)\"\n [class.highlighted]=\"idx === highlightedIndex()\"\n [class.disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n [class.hidden]=\"hideSelectedOptions && isSelected(option)\"\n [class.create-option]=\"option.__isCreate__\"\n (click)=\"selectOption(option)\"\n (keydown)=\"$event.key === 'Enter' && selectOption(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n tabindex=\"-1\"\n >\n <!-- Checkbox for multi-select -->\n @if (isMulti) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n readonly\n />\n }\n\n <!-- Option Icon -->\n @if (showOptionIcons && option.icon) {\n <div class=\"option-icon\">\n @if (option.icon.includes('<')) {\n <div [innerHTML]=\"sanitizeHtml(option.icon)\"></div>\n } @else {\n <img [src]=\"option.icon\" [alt]=\"getOptionLabel(option)\" />\n }\n </div>\n }\n\n <!-- Option Content -->\n <div class=\"option-content\">\n <div class=\"option-label\">{{getOptionLabel(option)}}</div>\n @if (option.description) {\n <div class=\"option-description\">{{option.description}}</div>\n }\n </div>\n\n <!-- Option Badge -->\n @if (showOptionBadges && option.badge) {\n <span\n class=\"option-badge\"\n [style.background-color]=\"option.badgeColor || currentTheme().primary\"\n >\n {{option.badge}}\n </span>\n }\n\n <!-- Check Icon for selected -->\n @if (!isMulti && isSelected(option)) {\n <svg class=\"check-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\">\n <path d=\"M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z\"></path>\n </svg>\n }\n </div>\n }\n </div>\n }\n } @else {\n <!-- v1.2.0: Recent Selections Header -->\n @if (showRecentSelections && !searchTerm() && recentSelections().length > 0) {\n <div class=\"section-header\">{{recentSelectionsLabel}}</div>\n }\n\n <!-- Regular (Ungrouped) Options - Virtual Scroll or Standard -->\n @if (enableVirtualScroll) {\n <!-- Virtual Scroll Mode -->\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize\"\n [minBufferPx]=\"virtualScrollMinBufferPx\"\n [maxBufferPx]=\"virtualScrollMaxBufferPx\"\n [style.height.px]=\"maxHeight\"\n class=\"virtual-scroll-viewport\"\n >\n @for (option of (showRecentSelections ? displayOptionsWithRecent() : displayOptions()); track trackByValue($index, option); let idx = $index) {\n <div\n class=\"option\"\n [class.selected]=\"isSelected(option)\"\n [class.highlighted]=\"idx === highlightedIndex()\"\n [class.disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n [class.hidden]=\"hideSelectedOptions && isSelected(option)\"\n [class.create-option]=\"option.__isCreate__\"\n [class.recent-option]=\"option.__isRecent__\"\n (click)=\"selectOption(option)\"\n (keydown)=\"$event.key === 'Enter' && selectOption(option)\"\n (mouseenter)=\"showTooltip(option, idx)\"\n (mouseleave)=\"hideTooltip()\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n [attr.title]=\"showTooltips ? getTooltipContent(option) : null\"\n tabindex=\"-1\"\n >\n <!-- Custom Template or Default Rendering -->\n @if (optionTemplate) {\n <ng-container\n *ngTemplateOutlet=\"optionTemplate; context: { $implicit: option, index: idx, selected: isSelected(option) }\"\n ></ng-container>\n } @else {\n <!-- Default Option Content (same as before) -->\n @if (isMulti) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n readonly\n />\n }\n\n @if (showOptionIcons && option.icon) {\n <div class=\"option-icon\">\n @if (option.icon.includes('<')) {\n <div [innerHTML]=\"sanitizeHtml(option.icon)\"></div>\n } @else {\n <img [src]=\"option.icon\" [alt]=\"getOptionLabel(option)\" />\n }\n </div>\n }\n\n <div class=\"option-content\">\n <div class=\"option-label\">{{getOptionLabel(option)}}</div>\n @if (option.description) {\n <div class=\"option-description\">{{option.description}}</div>\n }\n </div>\n\n @if (showOptionBadges && option.badge) {\n <span\n class=\"option-badge\"\n [style.background-color]=\"option.badgeColor || currentTheme().primary\"\n >\n {{option.badge}}\n </span>\n }\n\n @if (!isMulti && isSelected(option)) {\n <svg class=\"check-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\">\n <path d=\"M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z\"></path>\n </svg>\n }\n }\n </div>\n }\n </cdk-virtual-scroll-viewport>\n } @else {\n <!-- Standard Rendering (Non-Virtual Scroll) -->\n @for (option of (showRecentSelections ? displayOptionsWithRecent() : displayOptions()); track trackByValue($index, option); let idx = $index) {\n <div\n class=\"option\"\n [class.selected]=\"isSelected(option)\"\n [class.highlighted]=\"idx === highlightedIndex()\"\n [class.disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n [class.hidden]=\"hideSelectedOptions && isSelected(option)\"\n [class.create-option]=\"option.__isCreate__\"\n [class.recent-option]=\"option.__isRecent__\"\n (click)=\"selectOption(option)\"\n (keydown)=\"$event.key === 'Enter' && selectOption(option)\"\n (mouseenter)=\"showTooltip(option, idx)\"\n (mouseleave)=\"hideTooltip()\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isOptionDisabled(option) || (isMaxSelectionReached() && !isSelected(option))\"\n [attr.title]=\"showTooltips ? getTooltipContent(option) : null\"\n tabindex=\"-1\"\n >\n <!-- Custom Template or Default Rendering -->\n @if (optionTemplate) {\n <ng-container\n *ngTemplateOutlet=\"optionTemplate; context: { $implicit: option, index: idx, selected: isSelected(option) }\"\n ></ng-container>\n } @else {\n <!-- Default Option Content -->\n @if (isMulti) {\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(option)\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n readonly\n />\n }\n\n @if (showOptionIcons && option.icon) {\n <div class=\"option-icon\">\n @if (option.icon.includes('<')) {\n <div [innerHTML]=\"sanitizeHtml(option.icon)\"></div>\n } @else {\n <img [src]=\"option.icon\" [alt]=\"getOptionLabel(option)\" />\n }\n </div>\n }\n\n <div class=\"option-content\">\n <div class=\"option-label\">{{getOptionLabel(option)}}</div>\n @if (option.description) {\n <div class=\"option-description\">{{option.description}}</div>\n }\n </div>\n\n @if (showOptionBadges && option.badge) {\n <span\n class=\"option-badge\"\n [style.background-color]=\"option.badgeColor || currentTheme().primary\"\n >\n {{option.badge}}\n </span>\n }\n\n @if (!isMulti && isSelected(option)) {\n <svg class=\"check-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\">\n <path d=\"M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z\"></path>\n </svg>\n }\n }\n </div>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- v1.2.0: Validation Message -->\n @if (validationMessage && validationState !== 'default') {\n <div class=\"validation-message {{getValidationClass()}}\">\n @if (showValidationIcon) {\n <span class=\"validation-icon\">\n @if (validationState === 'error') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm1 15H9v-2h2v2zm0-4H9V5h2v6z\"/>\n </svg>\n } @else if (validationState === 'warning') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm1 15H9v-2h2v2zm0-4H9V5h2v6z\"/>\n </svg>\n } @else if (validationState === 'success') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm-1.707 13.707l-3.5-3.5 1.414-1.414L9 11.586l5.293-5.293 1.414 1.414-6.5 6.5z\"/>\n </svg>\n } @else if (validationState === 'info') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zm1 15H9v-6h2v6zm0-8H9V5h2v2z\"/>\n </svg>\n }\n </span>\n }\n <span class=\"validation-text\">{{validationMessage}}</span>\n </div>\n }\n</div>\n\n<!-- Hidden native select for form compatibility -->\n@if (isMulti) {\n <select [name]=\"name\" [id]=\"id\" multiple style=\"display: none;\" [attr.aria-hidden]=\"true\">\n @for (option of selectedOptions(); track trackByValue($index, option)) {\n <option [value]=\"getOptionValue(option)\" selected>{{getOptionLabel(option)}}</option>\n }\n </select>\n} @else {\n @if (selectedOptions().length > 0) {\n <select [name]=\"name\" [id]=\"id\" style=\"display: none;\" [attr.aria-hidden]=\"true\">\n <option [value]=\"getOptionValue(selectedOptions()[0])\" selected>{{getOptionLabel(selectedOptions()[0])}}</option>\n </select>\n }\n}\n","/*\n * Public API Surface of angular-perfect-select\n */\n\n// Main Component\nexport * from './lib/components/perfect-select/perfect-select.component';\n\n// Models & Interfaces\nexport * from './lib/models/select-option.interface';\nexport * from './lib/models/select-events.interface';\nexport * from './lib/models/validation.types';\n\n// Constants & Themes\nexport * from './lib/constants/themes.constant';\n\n// Animations\nexport * from './lib/animations/select.animations';\n\n// Directives\nexport * from './lib/directives/click-outside.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as angular_perfect_select from 'angular-perfect-select';
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
|
-
import { OnInit, OnChanges, OnDestroy, EventEmitter, ElementRef, SimpleChanges } from '@angular/core';
|
|
3
|
+
import { OnInit, OnChanges, OnDestroy, EventEmitter, ElementRef, TemplateRef, SimpleChanges } from '@angular/core';
|
|
4
4
|
import { ControlValueAccessor } from '@angular/forms';
|
|
5
5
|
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
|
6
|
+
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
|
6
7
|
import { AnimationTriggerMetadata } from '@angular/animations';
|
|
7
8
|
|
|
8
9
|
interface ThemeColors {
|
|
@@ -25,8 +26,16 @@ interface SelectOption {
|
|
|
25
26
|
badge?: string;
|
|
26
27
|
badgeColor?: string;
|
|
27
28
|
group?: string;
|
|
29
|
+
tooltip?: string;
|
|
28
30
|
__isNew__?: boolean;
|
|
29
31
|
__isCreate__?: boolean;
|
|
32
|
+
__isRecent__?: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type ValidationState = 'default' | 'error' | 'warning' | 'success' | 'info';
|
|
36
|
+
interface ValidationConfig {
|
|
37
|
+
state: ValidationState;
|
|
38
|
+
message?: string;
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
type SelectChangeAction = 'select-option' | 'remove-value' | 'clear' | 'set-value' | 'select-all' | 'deselect-all';
|
|
@@ -49,6 +58,19 @@ interface SelectOptionsLoadedEvent {
|
|
|
49
58
|
interface SelectLoadErrorEvent {
|
|
50
59
|
error: Error;
|
|
51
60
|
}
|
|
61
|
+
interface SelectCopyEvent {
|
|
62
|
+
values: any[];
|
|
63
|
+
formattedText: string;
|
|
64
|
+
}
|
|
65
|
+
interface SelectPasteEvent {
|
|
66
|
+
values: string[];
|
|
67
|
+
pastedText: string;
|
|
68
|
+
}
|
|
69
|
+
interface SelectScrollEndEvent {
|
|
70
|
+
scrollTop: number;
|
|
71
|
+
scrollHeight: number;
|
|
72
|
+
clientHeight: number;
|
|
73
|
+
}
|
|
52
74
|
|
|
53
75
|
declare class PerfectSelectComponent implements ControlValueAccessor, OnInit, OnChanges, OnDestroy {
|
|
54
76
|
private sanitizer;
|
|
@@ -108,6 +130,28 @@ declare class PerfectSelectComponent implements ControlValueAccessor, OnInit, On
|
|
|
108
130
|
debounceTime: number;
|
|
109
131
|
minSearchLength: number;
|
|
110
132
|
minSearchMessage: string;
|
|
133
|
+
enableVirtualScroll: boolean;
|
|
134
|
+
virtualScrollItemSize: number;
|
|
135
|
+
virtualScrollMinBufferPx: number;
|
|
136
|
+
virtualScrollMaxBufferPx: number;
|
|
137
|
+
validationState: ValidationState;
|
|
138
|
+
validationMessage: string;
|
|
139
|
+
showValidationIcon: boolean;
|
|
140
|
+
showTooltips: boolean;
|
|
141
|
+
tooltipDelay: number;
|
|
142
|
+
getOptionTooltip: (option: SelectOption) => string;
|
|
143
|
+
showRecentSelections: boolean;
|
|
144
|
+
recentSelectionsLimit: number;
|
|
145
|
+
recentSelectionsLabel: string;
|
|
146
|
+
enableRecentSelectionsPersistence: boolean;
|
|
147
|
+
enableInfiniteScroll: boolean;
|
|
148
|
+
infiniteScrollThreshold: number;
|
|
149
|
+
totalOptionsCount: number | null;
|
|
150
|
+
enableAdvancedKeyboard: boolean;
|
|
151
|
+
typeAheadDelay: number;
|
|
152
|
+
enableCopyPaste: boolean;
|
|
153
|
+
copyDelimiter: string;
|
|
154
|
+
pasteDelimiter: string;
|
|
111
155
|
name: string;
|
|
112
156
|
id: string;
|
|
113
157
|
autoFocus: boolean;
|
|
@@ -128,9 +172,15 @@ declare class PerfectSelectComponent implements ControlValueAccessor, OnInit, On
|
|
|
128
172
|
createOption: EventEmitter<SelectCreateOptionEvent>;
|
|
129
173
|
optionsLoaded: EventEmitter<SelectOptionsLoadedEvent>;
|
|
130
174
|
loadError: EventEmitter<SelectLoadErrorEvent>;
|
|
175
|
+
copy: EventEmitter<SelectCopyEvent>;
|
|
176
|
+
paste: EventEmitter<SelectPasteEvent>;
|
|
177
|
+
scrollEnd: EventEmitter<SelectScrollEndEvent>;
|
|
131
178
|
selectContainerRef: ElementRef;
|
|
132
179
|
searchInputRef: ElementRef;
|
|
133
180
|
menuElementRef: ElementRef;
|
|
181
|
+
virtualScrollViewport?: CdkVirtualScrollViewport;
|
|
182
|
+
optionTemplate?: TemplateRef<any>;
|
|
183
|
+
selectedOptionTemplate?: TemplateRef<any>;
|
|
134
184
|
isOpen: _angular_core.WritableSignal<boolean>;
|
|
135
185
|
searchTerm: _angular_core.WritableSignal<string>;
|
|
136
186
|
highlightedIndex: _angular_core.WritableSignal<number>;
|
|
@@ -139,6 +189,14 @@ declare class PerfectSelectComponent implements ControlValueAccessor, OnInit, On
|
|
|
139
189
|
isLoadingAsync: _angular_core.WritableSignal<boolean>;
|
|
140
190
|
private optionsCache;
|
|
141
191
|
private debounceTimeout;
|
|
192
|
+
recentSelections: _angular_core.WritableSignal<SelectOption[]>;
|
|
193
|
+
typeAheadBuffer: _angular_core.WritableSignal<string>;
|
|
194
|
+
hoveredOptionIndex: _angular_core.WritableSignal<number>;
|
|
195
|
+
isScrolling: _angular_core.WritableSignal<boolean>;
|
|
196
|
+
private typeAheadTimeout;
|
|
197
|
+
private tooltipTimeout;
|
|
198
|
+
private recentSelectionsStorageKey;
|
|
199
|
+
private scrollEndTimeout;
|
|
142
200
|
currentTheme: _angular_core.Signal<angular_perfect_select.ThemeColors>;
|
|
143
201
|
filteredOptions: _angular_core.Signal<SelectOption[]>;
|
|
144
202
|
selectedOptions: _angular_core.Signal<(SelectOption | {
|
|
@@ -153,6 +211,8 @@ declare class PerfectSelectComponent implements ControlValueAccessor, OnInit, On
|
|
|
153
211
|
someOptionsSelected: _angular_core.Signal<boolean>;
|
|
154
212
|
isMaxSelectionReached: _angular_core.Signal<boolean>;
|
|
155
213
|
showMinSearchMessage: _angular_core.Signal<boolean>;
|
|
214
|
+
displayOptionsWithRecent: _angular_core.Signal<SelectOption[]>;
|
|
215
|
+
validationIconName: _angular_core.Signal<"error" | "warning" | "info" | "" | "check_circle">;
|
|
156
216
|
getEnabledOptionsCount(): number;
|
|
157
217
|
private onChange;
|
|
158
218
|
private onTouched;
|
|
@@ -165,6 +225,7 @@ declare class PerfectSelectComponent implements ControlValueAccessor, OnInit, On
|
|
|
165
225
|
ngOnInit(): void;
|
|
166
226
|
ngOnDestroy(): void;
|
|
167
227
|
handleKeydown(event: KeyboardEvent): void;
|
|
228
|
+
handlePaste(event: ClipboardEvent): void;
|
|
168
229
|
toggleDropdown(): void;
|
|
169
230
|
openDropdown(): void;
|
|
170
231
|
closeDropdown(): void;
|
|
@@ -182,8 +243,20 @@ declare class PerfectSelectComponent implements ControlValueAccessor, OnInit, On
|
|
|
182
243
|
sanitizeHtml(html: string): SafeHtml;
|
|
183
244
|
trackByValue(index: number, option: SelectOption): any;
|
|
184
245
|
trackByGroup(index: number, item: [string, SelectOption[]]): string;
|
|
246
|
+
copySelectedValues(): void;
|
|
247
|
+
pasteValues(pastedText: string): void;
|
|
248
|
+
handleTypeAhead(key: string): void;
|
|
249
|
+
addToRecentSelections(option: SelectOption): void;
|
|
250
|
+
loadRecentSelections(): void;
|
|
251
|
+
saveRecentSelections(): void;
|
|
252
|
+
onOptionsScroll(event: Event): void;
|
|
253
|
+
onVirtualScrollIndexChange(index: number): void;
|
|
254
|
+
showTooltip(option: SelectOption, index: number): void;
|
|
255
|
+
hideTooltip(): void;
|
|
256
|
+
getTooltipContent(option: SelectOption): string;
|
|
257
|
+
getValidationClass(): string;
|
|
185
258
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PerfectSelectComponent, never>;
|
|
186
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PerfectSelectComponent, "ng-perfect-select", never, { "options": { "alias": "options"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "isMulti": { "alias": "isMulti"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "isSearchable": { "alias": "isSearchable"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "isClearable": { "alias": "isClearable"; "required": false; }; "clearable": { "alias": "clearable"; "required": false; }; "isDisabled": { "alias": "isDisabled"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "isRtl": { "alias": "isRtl"; "required": false; }; "closeMenuOnSelect": { "alias": "closeMenuOnSelect"; "required": false; }; "hideSelectedOptions": { "alias": "hideSelectedOptions"; "required": false; }; "isCreatable": { "alias": "isCreatable"; "required": false; }; "allowCreateWhileLoading": { "alias": "allowCreateWhileLoading"; "required": false; }; "createOptionPosition": { "alias": "createOptionPosition"; "required": false; }; "formatCreateLabel": { "alias": "formatCreateLabel"; "required": false; }; "loadOptions": { "alias": "loadOptions"; "required": false; }; "cacheOptions": { "alias": "cacheOptions"; "required": false; }; "defaultOptions": { "alias": "defaultOptions"; "required": false; }; "selectSize": { "alias": "selectSize"; "required": false; }; "containerSize": { "alias": "containerSize"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "borderRadius": { "alias": "borderRadius"; "required": false; }; "customStyles": { "alias": "customStyles"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; "menuPlacement": { "alias": "menuPlacement"; "required": false; }; "menuPosition": { "alias": "menuPosition"; "required": false; }; "getOptionLabel": { "alias": "getOptionLabel"; "required": false; }; "getOptionValue": { "alias": "getOptionValue"; "required": false; }; "isOptionDisabled": { "alias": "isOptionDisabled"; "required": false; }; "filterOption": { "alias": "filterOption"; "required": false; }; "isGrouped": { "alias": "isGrouped"; "required": false; }; "groupBy": { "alias": "groupBy"; "required": false; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; }; "selectAllText": { "alias": "selectAllText"; "required": false; }; "deselectAllText": { "alias": "deselectAllText"; "required": false; }; "showOptionIcons": { "alias": "showOptionIcons"; "required": false; }; "showOptionBadges": { "alias": "showOptionBadges"; "required": false; }; "maxOptionsDisplay": { "alias": "maxOptionsDisplay"; "required": false; }; "optionHeight": { "alias": "optionHeight"; "required": false; }; "emptyStateText": { "alias": "emptyStateText"; "required": false; }; "emptySearchText": { "alias": "emptySearchText"; "required": false; }; "maxSelectedOptions": { "alias": "maxSelectedOptions"; "required": false; }; "maxSelectedMessage": { "alias": "maxSelectedMessage"; "required": false; }; "debounceTime": { "alias": "debounceTime"; "required": false; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; }; "minSearchMessage": { "alias": "minSearchMessage"; "required": false; }; "name": { "alias": "name"; "required": false; }; "id": { "alias": "id"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "openMenuOnFocus": { "alias": "openMenuOnFocus"; "required": false; }; "openMenuOnClick": { "alias": "openMenuOnClick"; "required": false; }; "tabSelectsValue": { "alias": "tabSelectsValue"; "required": false; }; "backspaceRemovesValue": { "alias": "backspaceRemovesValue"; "required": false; }; "escapeClearsValue": { "alias": "escapeClearsValue"; "required": false; }; "noOptionsMessage": { "alias": "noOptionsMessage"; "required": false; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; }; }, { "change": "change"; "clear": "clear"; "focus": "focus"; "blur": "blur"; "menuOpen": "menuOpen"; "menuClose": "menuClose"; "inputChange": "inputChange"; "createOption": "createOption"; "optionsLoaded": "optionsLoaded"; "loadError": "loadError"; },
|
|
259
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PerfectSelectComponent, "ng-perfect-select", never, { "options": { "alias": "options"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "isMulti": { "alias": "isMulti"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "isSearchable": { "alias": "isSearchable"; "required": false; }; "searchable": { "alias": "searchable"; "required": false; }; "isClearable": { "alias": "isClearable"; "required": false; }; "clearable": { "alias": "clearable"; "required": false; }; "isDisabled": { "alias": "isDisabled"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "isRtl": { "alias": "isRtl"; "required": false; }; "closeMenuOnSelect": { "alias": "closeMenuOnSelect"; "required": false; }; "hideSelectedOptions": { "alias": "hideSelectedOptions"; "required": false; }; "isCreatable": { "alias": "isCreatable"; "required": false; }; "allowCreateWhileLoading": { "alias": "allowCreateWhileLoading"; "required": false; }; "createOptionPosition": { "alias": "createOptionPosition"; "required": false; }; "formatCreateLabel": { "alias": "formatCreateLabel"; "required": false; }; "loadOptions": { "alias": "loadOptions"; "required": false; }; "cacheOptions": { "alias": "cacheOptions"; "required": false; }; "defaultOptions": { "alias": "defaultOptions"; "required": false; }; "selectSize": { "alias": "selectSize"; "required": false; }; "containerSize": { "alias": "containerSize"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "borderRadius": { "alias": "borderRadius"; "required": false; }; "customStyles": { "alias": "customStyles"; "required": false; }; "maxHeight": { "alias": "maxHeight"; "required": false; }; "menuPlacement": { "alias": "menuPlacement"; "required": false; }; "menuPosition": { "alias": "menuPosition"; "required": false; }; "getOptionLabel": { "alias": "getOptionLabel"; "required": false; }; "getOptionValue": { "alias": "getOptionValue"; "required": false; }; "isOptionDisabled": { "alias": "isOptionDisabled"; "required": false; }; "filterOption": { "alias": "filterOption"; "required": false; }; "isGrouped": { "alias": "isGrouped"; "required": false; }; "groupBy": { "alias": "groupBy"; "required": false; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; }; "selectAllText": { "alias": "selectAllText"; "required": false; }; "deselectAllText": { "alias": "deselectAllText"; "required": false; }; "showOptionIcons": { "alias": "showOptionIcons"; "required": false; }; "showOptionBadges": { "alias": "showOptionBadges"; "required": false; }; "maxOptionsDisplay": { "alias": "maxOptionsDisplay"; "required": false; }; "optionHeight": { "alias": "optionHeight"; "required": false; }; "emptyStateText": { "alias": "emptyStateText"; "required": false; }; "emptySearchText": { "alias": "emptySearchText"; "required": false; }; "maxSelectedOptions": { "alias": "maxSelectedOptions"; "required": false; }; "maxSelectedMessage": { "alias": "maxSelectedMessage"; "required": false; }; "debounceTime": { "alias": "debounceTime"; "required": false; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; }; "minSearchMessage": { "alias": "minSearchMessage"; "required": false; }; "enableVirtualScroll": { "alias": "enableVirtualScroll"; "required": false; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; }; "virtualScrollMinBufferPx": { "alias": "virtualScrollMinBufferPx"; "required": false; }; "virtualScrollMaxBufferPx": { "alias": "virtualScrollMaxBufferPx"; "required": false; }; "validationState": { "alias": "validationState"; "required": false; }; "validationMessage": { "alias": "validationMessage"; "required": false; }; "showValidationIcon": { "alias": "showValidationIcon"; "required": false; }; "showTooltips": { "alias": "showTooltips"; "required": false; }; "tooltipDelay": { "alias": "tooltipDelay"; "required": false; }; "getOptionTooltip": { "alias": "getOptionTooltip"; "required": false; }; "showRecentSelections": { "alias": "showRecentSelections"; "required": false; }; "recentSelectionsLimit": { "alias": "recentSelectionsLimit"; "required": false; }; "recentSelectionsLabel": { "alias": "recentSelectionsLabel"; "required": false; }; "enableRecentSelectionsPersistence": { "alias": "enableRecentSelectionsPersistence"; "required": false; }; "enableInfiniteScroll": { "alias": "enableInfiniteScroll"; "required": false; }; "infiniteScrollThreshold": { "alias": "infiniteScrollThreshold"; "required": false; }; "totalOptionsCount": { "alias": "totalOptionsCount"; "required": false; }; "enableAdvancedKeyboard": { "alias": "enableAdvancedKeyboard"; "required": false; }; "typeAheadDelay": { "alias": "typeAheadDelay"; "required": false; }; "enableCopyPaste": { "alias": "enableCopyPaste"; "required": false; }; "copyDelimiter": { "alias": "copyDelimiter"; "required": false; }; "pasteDelimiter": { "alias": "pasteDelimiter"; "required": false; }; "name": { "alias": "name"; "required": false; }; "id": { "alias": "id"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "openMenuOnFocus": { "alias": "openMenuOnFocus"; "required": false; }; "openMenuOnClick": { "alias": "openMenuOnClick"; "required": false; }; "tabSelectsValue": { "alias": "tabSelectsValue"; "required": false; }; "backspaceRemovesValue": { "alias": "backspaceRemovesValue"; "required": false; }; "escapeClearsValue": { "alias": "escapeClearsValue"; "required": false; }; "noOptionsMessage": { "alias": "noOptionsMessage"; "required": false; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; }; }, { "change": "change"; "clear": "clear"; "focus": "focus"; "blur": "blur"; "menuOpen": "menuOpen"; "menuClose": "menuClose"; "inputChange": "inputChange"; "createOption": "createOption"; "optionsLoaded": "optionsLoaded"; "loadError": "loadError"; "copy": "copy"; "paste": "paste"; "scrollEnd": "scrollEnd"; }, ["optionTemplate", "selectedOptionTemplate"], never, true, never>;
|
|
187
260
|
}
|
|
188
261
|
|
|
189
262
|
declare const dropdownAnimation: AnimationTriggerMetadata;
|
|
@@ -201,4 +274,4 @@ declare class ClickOutsideDirective {
|
|
|
201
274
|
}
|
|
202
275
|
|
|
203
276
|
export { ClickOutsideDirective, PerfectSelectComponent, THEMES, dropdownAnimation, optionListAnimation, selectAnimations, tagAnimation };
|
|
204
|
-
export type { InputChangeAction, SelectChangeAction, SelectChangeEvent, SelectCreateOptionEvent, SelectInputChangeEvent, SelectLoadErrorEvent, SelectOption, SelectOptionsLoadedEvent, ThemeColors, ThemeName };
|
|
277
|
+
export type { InputChangeAction, SelectChangeAction, SelectChangeEvent, SelectCopyEvent, SelectCreateOptionEvent, SelectInputChangeEvent, SelectLoadErrorEvent, SelectOption, SelectOptionsLoadedEvent, SelectPasteEvent, SelectScrollEndEvent, ThemeColors, ThemeName, ValidationConfig, ValidationState };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "angular-perfect-select",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "A modern, feature-rich select component for Angular with react-select API compatibility",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -30,26 +30,28 @@
|
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"@angular/animations": "^20.0.0",
|
|
33
|
+
"@angular/cdk": "^20.0.0",
|
|
33
34
|
"@angular/common": "^20.0.0",
|
|
34
35
|
"@angular/core": "^20.0.0",
|
|
35
36
|
"@angular/forms": "^20.0.0"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
39
|
"@angular-devkit/build-angular": "^20.0.0",
|
|
40
|
+
"@angular/animations": "^20.0.0",
|
|
41
|
+
"@angular/cdk": "^20.2.14",
|
|
39
42
|
"@angular/cli": "^20.0.0",
|
|
43
|
+
"@angular/common": "^20.0.0",
|
|
40
44
|
"@angular/compiler": "^20.0.0",
|
|
41
45
|
"@angular/compiler-cli": "^20.0.0",
|
|
42
|
-
"@angular/animations": "^20.0.0",
|
|
43
|
-
"@angular/common": "^20.0.0",
|
|
44
46
|
"@angular/core": "^20.0.0",
|
|
45
47
|
"@angular/forms": "^20.0.0",
|
|
46
48
|
"@angular/platform-browser": "^20.0.0",
|
|
47
49
|
"@angular/platform-browser-dynamic": "^20.0.0",
|
|
48
|
-
"
|
|
49
|
-
"zone.js": "~0.15.0",
|
|
50
|
+
"ng-packagr": "^20.0.0",
|
|
50
51
|
"rxjs": "~7.8.0",
|
|
51
52
|
"tslib": "^2.3.0",
|
|
52
|
-
"
|
|
53
|
+
"typescript": "~5.8.0",
|
|
54
|
+
"zone.js": "~0.15.0"
|
|
53
55
|
},
|
|
54
56
|
"files": [
|
|
55
57
|
"dist",
|