@raintonic/formaui 0.9.0 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/raintonic-formaui-components-accordion.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-alert.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-avatar.mjs +3 -3
- package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-button-group.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-card.mjs +78 -8
- package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-chip.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-data-table.mjs +80 -11
- package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-date-picker.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-drawer.mjs +37 -6
- package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +1 -1
- package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -2
- package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-input.mjs +14 -0
- package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-number-input.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-password-input.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-progressbar.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-radio.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-select.mjs +15 -7
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-side-panel.mjs +40 -6
- package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-time-picker.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs +19 -8
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toolbar.mjs +10 -4
- package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tooltip.mjs +102 -8
- package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-topbar.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-topbar.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree-select.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-tree.mjs +4 -4
- package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-services-dialog.mjs +8 -4
- package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
- package/fesm2022/raintonic-formaui.mjs +1 -1
- package/fesm2022/raintonic-formaui.mjs.map +1 -1
- package/llms-full.txt +72 -27
- package/package.json +1 -1
- package/styles/generated/_tokens.scss +9 -9
- package/styles/partials/components/_dialog.scss +24 -0
- package/styles/styles.css +24 -9
- package/types/raintonic-formaui-components-card.d.ts +46 -2
- package/types/raintonic-formaui-components-card.d.ts.map +1 -1
- package/types/raintonic-formaui-components-data-table.d.ts +50 -3
- package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
- package/types/raintonic-formaui-components-drawer.d.ts +20 -2
- package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
- package/types/raintonic-formaui-components-form-field.d.ts +10 -0
- package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
- package/types/raintonic-formaui-components-input.d.ts +9 -0
- package/types/raintonic-formaui-components-input.d.ts.map +1 -1
- package/types/raintonic-formaui-components-select.d.ts +8 -1
- package/types/raintonic-formaui-components-select.d.ts.map +1 -1
- package/types/raintonic-formaui-components-side-panel.d.ts +24 -2
- package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
- package/types/raintonic-formaui-components-toggle-group.d.ts +1 -1
- package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -1
- package/types/raintonic-formaui-components-toolbar.d.ts +5 -1
- package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
- package/types/raintonic-formaui-components-tooltip.d.ts +55 -4
- package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
- package/types/raintonic-formaui-services-dialog.d.ts +12 -1
- package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
- package/types/raintonic-formaui.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-select.mjs","sources":["../../../lib/components/select/select-tokens.ts","../../../lib/components/select/option-base.ts","../../../lib/components/select/option.component.ts","../../../lib/components/select/select.component.ts","../../../lib/components/select/select.component.html","../../../lib/components/select/raintonic-formaui-components-select.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Interface representing the parent select contract that options need.\r\n * Used to break the circular dependency between select and option components.\r\n */\r\nexport interface FuiSelectParent {\r\n multiple(): boolean;\r\n _onOptionSelected(option: any): void;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the parent select to options.\r\n */\r\nexport const FUI_SELECT = new InjectionToken<FuiSelectParent>('FUI_SELECT');\r\n\r\n/**\r\n * Vertical offset (px) between the select trigger bottom and overlay panel top.\r\n * The default popup positions use 4px, but the select needs 16px for better\r\n * visual spacing between the trigger and the dropdown panel.\r\n */\r\nexport const FUI_SELECT_OVERLAY_OFFSET = 16;\r\n","import {\r\n Directive,\r\n InjectionToken,\r\n input,\r\n output,\r\n InputSignal,\r\n OutputEmitterRef,\r\n ElementRef,\r\n inject,\r\n signal,\r\n WritableSignal,\r\n HostListener,\r\n OnDestroy,\r\n} from '@angular/core';\r\n\r\nimport { Subject } from 'rxjs';\r\nimport { FUI_SELECT } from './select-tokens';\r\n\r\n/**\r\n * Injection token for querying all option-like components\r\n * via contentChildren from parent components.\r\n *\r\n * FuiOptionComponent provides this token so a single\r\n * contentChildren(FUI_OPTION) query captures all options.\r\n */\r\nexport const FUI_OPTION = new InjectionToken<FuiOptionBase>('FUI_OPTION');\r\n\r\n/**\r\n * Abstract base class for FuiOptionComponent.\r\n *\r\n * Defines the contract that parent components rely on.\r\n * FuiOptionComponent provides FUI_OPTION for DI-based querying.\r\n *\r\n * Uses @Directive() so Angular recognises input()/output()/signal()/HostListener\r\n * calls as valid (they are only valid on @Component or @Directive classes).\r\n */\r\n@Directive()\r\nexport abstract class FuiOptionBase implements OnDestroy {\r\n static nextId = 0;\r\n\r\n /**\r\n * The value of the option\r\n */\r\n readonly value: InputSignal<unknown> = input<unknown>(undefined);\r\n\r\n /**\r\n * Whether the option is disabled\r\n * @default false\r\n */\r\n readonly disabled: InputSignal<boolean> = input(false);\r\n\r\n /**\r\n * Event emitted when the option is selected\r\n */\r\n readonly selectionChange: OutputEmitterRef<{ source: FuiOptionBase; value: unknown }> = output();\r\n\r\n // Internal state\r\n readonly _selected: WritableSignal<boolean> = signal(false);\r\n readonly _active: WritableSignal<boolean> = signal(false);\r\n readonly stateChanges = new Subject<void>();\r\n\r\n // Element reference\r\n protected readonly _element: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n // Parent select (optional — may not exist if used standalone)\r\n protected readonly _parentSelect = inject(FUI_SELECT, { optional: true });\r\n\r\n // Unique ID\r\n readonly id = `fui-option-${FuiOptionBase.nextId++}`;\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // View value (text content)\r\n get viewValue(): string {\r\n return (this._element.nativeElement.textContent || '').trim();\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n _handleClick(event: Event): void {\r\n if (!this.disabled()) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Notify parent select\r\n if (this._parentSelect) {\r\n this._parentSelect._onOptionSelected(this);\r\n } else {\r\n // Standalone usage — emit event\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n _handleMouseEnter(): void {\r\n if (!this.disabled()) {\r\n this._active.set(true);\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n _handleMouseLeave(): void {\r\n this._active.set(false);\r\n }\r\n\r\n /**\r\n * Selects the option\r\n */\r\n select(): void {\r\n if (!this._selected()) {\r\n this._selected.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the option\r\n */\r\n deselect(): void {\r\n if (this._selected()) {\r\n this._selected.set(false);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as active (keyboard navigation)\r\n */\r\n setActive(): void {\r\n if (!this._active()) {\r\n this._active.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as inactive\r\n */\r\n setInactive(): void {\r\n if (this._active()) {\r\n this._active.set(false);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets focus onto this option\r\n */\r\n focus(): void {\r\n const element = this._element.nativeElement;\r\n if (typeof element.focus === 'function') {\r\n element.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the label to be used when displaying the option\r\n */\r\n getLabel(): string {\r\n return this.viewValue;\r\n }\r\n\r\n /**\r\n * Gets the host element\r\n */\r\n _getHostElement(): HTMLElement {\r\n return this._element.nativeElement;\r\n }\r\n\r\n /** Emits the selection change event */\r\n private _emitSelectionChangeEvent(): void {\r\n this.selectionChange.emit({ source: this, value: this.value() });\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, ViewEncapsulation, computed, Signal } from '@angular/core';\r\n\r\nimport { FuiCheckboxComponent } from '@raintonic/formaui/components/checkbox';\r\nimport { FuiOptionBase, FUI_OPTION } from './option-base';\r\n\r\n/**\r\n * # FuiOption Component\r\n *\r\n * Individual option component for use within fui-select.\r\n * Works like Angular Material's mat-option with full accessibility support.\r\n *\r\n * ## Features\r\n * - Disabled state support\r\n * - Selection state management\r\n * - Full accessibility support (ARIA attributes)\r\n * - Keyboard navigation support\r\n * - Custom content projection\r\n * - Smooth hover animations\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Option\r\n * ```html\r\n * <fui-select placeholder=\"Select a status\">\r\n * <fui-option value=\"active\">Active</fui-option>\r\n * <fui-option value=\"inactive\">Inactive</fui-option>\r\n * <fui-option value=\"pending\" [disabled]=\"true\">Pending (Disabled)</fui-option>\r\n * </fui-select>\r\n * ```\r\n *\r\n * ### Option with Custom Content\r\n * ```html\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">\r\n * <fui-icon name=\"flag-us\"></fui-icon>\r\n * United States\r\n * </fui-option>\r\n * <fui-option value=\"ca\">\r\n * <fui-icon name=\"flag-ca\"></fui-icon>\r\n * Canada\r\n * </fui-option>\r\n * </fui-select>\r\n * ```\r\n *\r\n * ### Multi-Select Options\r\n * When `fui-select` has `[multiple]=\"true\"`, `<fui-option>` automatically renders\r\n * a checkbox indicator:\r\n * ```html\r\n * <fui-select [multiple]=\"true\" placeholder=\"Select skills\">\r\n * <fui-option value=\"js\">JavaScript</fui-option>\r\n * <fui-option value=\"ts\">TypeScript</fui-option>\r\n * <fui-option value=\"py\">Python</fui-option>\r\n * </fui-select>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-option',\r\n standalone: true,\r\n imports: [FuiCheckboxComponent],\r\n template: `\r\n @if (_isMultiParent()) {\r\n <fui-checkbox\r\n class=\"fui-option__checkbox\"\r\n [checked]=\"_selected()\"\r\n [disabled]=\"disabled()\"\r\n [tabIndex]=\"-1\"\r\n aria-hidden=\"true\"\r\n />\r\n } @else if (_selected()) {}\r\n <span class=\"fui-option__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n `,\r\n styleUrls: ['./option.component.scss'],\r\n providers: [\r\n {\r\n provide: FUI_OPTION,\r\n useExisting: FuiOptionComponent,\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-option',\r\n '[class.fui-option--selected]': '_selected()',\r\n '[class.fui-option--disabled]': 'disabled()',\r\n '[class.fui-option--active]': '_active()',\r\n role: 'option',\r\n '[attr.id]': 'id',\r\n '[attr.aria-selected]': '_selected()',\r\n '[attr.aria-disabled]': 'disabled()',\r\n '[attr.tabindex]': '-1',\r\n },\r\n})\r\nexport class FuiOptionComponent extends FuiOptionBase {\r\n /** Whether the parent select is in multi-select mode */\r\n readonly _isMultiParent: Signal<boolean> = computed(() => this._parentSelect?.multiple() ?? false);\r\n}\r\n","import {\r\n AfterContentInit,\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n InputSignal,\r\n OnDestroy,\r\n output,\r\n OutputEmitterRef,\r\n signal,\r\n Signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport {\r\n injectNgControl,\r\n FuiPopupOverlayDirective,\r\n FuiFormControlSyncDirective,\r\n} from '@raintonic/formaui/cdk/form-field';\r\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport {\r\n computeMultiDisplayValue,\r\n syncMultiOptions,\r\n isEmpty,\r\n findInitialActiveOptionIndex,\r\n computeNextActiveOptionIndex,\r\n computePagedActiveOptionIndex,\r\n scrollOptionIntoView,\r\n announceMessage,\r\n computeActiveDescendant,\r\n getEnabledOptions,\r\n applyOptionSelection,\r\n} from '@raintonic/formaui/core';\r\nimport { FuiOptionBase, FUI_OPTION } from './option-base';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FUI_FORM_FIELD } from '@raintonic/formaui/components/form-field';\r\nimport { FUI_SELECT, FUI_SELECT_OVERLAY_OFFSET } from './select-tokens';\r\n\r\n/**\r\n * Available select sizes\r\n */\r\nexport type FuiSelectSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Available select variants following Carbon Design System patterns\r\n */\r\nexport type FuiSelectVariant = 'outlined' | 'filled';\r\n\r\n/**\r\n * Selection change event object emitted when the select's selection changes\r\n */\r\nexport interface FuiSelectChange {\r\n source: FuiSelectComponent;\r\n value: unknown;\r\n}\r\n\r\n/**\r\n * # fui-select Component\r\n *\r\n * A select component designed to work seamlessly with fui-form-field.\r\n * Similar to Angular Material's mat-select integration with mat-form-field.\r\n * Provides full Reactive Forms support with validation and error handling.\r\n *\r\n * ## Features\r\n * - Works inside fui-form-field like mat-select\r\n * - Full Reactive Forms integration (ControlValueAccessor)\r\n * - Multiple selection support\r\n * - Options via projected content (fui-option)\r\n * - Disabled and readonly states\r\n * - Full accessibility support\r\n * - Full keyboard navigation (Arrow keys, Enter, Space, Escape, Home, End)\r\n * - Type-ahead search functionality\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Select with Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * <fui-option value=\"mx\">Mexico</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Reactive Forms and Validation\r\n * ```html\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select formControlName=\"country\" placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * </fui-select>\r\n * <fui-error *ngIf=\"form.get('country')?.hasError('required')\">\r\n * Country is required\r\n * </fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * ```\r\n *\r\n * ### Multiple Selection\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Skills</label>\r\n * <fui-select formControlName=\"skills\" [multiple]=\"true\">\r\n * <fui-option value=\"js\">JavaScript</fui-option>\r\n * <fui-option value=\"ts\">TypeScript</fui-option>\r\n * <fui-option value=\"py\">Python</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-select',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, FuiIconComponent],\r\n templateUrl: './select.component.html',\r\n styleUrls: ['./select.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n hostDirectives: [\r\n {\r\n directive: FuiPopupOverlayDirective,\r\n inputs: ['positions', 'panelClass', 'backdropClass', 'scrollStrategy', 'minWidthFromTrigger'],\r\n outputs: ['openedChange', 'escapeKey'],\r\n },\r\n FuiFormControlSyncDirective,\r\n ],\r\n host: {\r\n class: 'fui-select',\r\n '[attr.id]': 'id',\r\n '[class.fui-select--open]': 'panelOpen()',\r\n '[class.fui-select--disabled]': 'disabled()',\r\n '[class.fui-select--multiple]': 'multiple()',\r\n '[class.fui-select--readonly]': 'readonly()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiSelectComponent,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiSelectComponent,\r\n },\r\n {\r\n provide: FUI_SELECT,\r\n useExisting: FuiSelectComponent,\r\n },\r\n ],\r\n})\r\nexport class FuiSelectComponent\r\n implements ControlValueAccessor, FuiFormFieldControl, OnDestroy, AfterContentInit, AfterViewInit\r\n{\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-select';\r\n\r\n // Injected host directives\r\n private readonly _popup = inject(FuiPopupOverlayDirective);\r\n private readonly _formSync = inject(FuiFormControlSyncDirective);\r\n\r\n // Optional parent form-field (null when used standalone)\r\n private readonly _parentFormField = inject(FUI_FORM_FIELD, { optional: true });\r\n\r\n // Inputs using new signal-based API\r\n readonly placeholderInput: InputSignal<string> = input('', { alias: 'placeholder' });\r\n readonly disabledInput: InputSignal<boolean> = input(false, { alias: 'disabled' });\r\n readonly readonlyInput: InputSignal<boolean> = input(false, { alias: 'readonly' });\r\n readonly multiple: InputSignal<boolean> = input(false);\r\n\r\n /**\r\n * Comparison function for option values.\r\n * Defaults to strict equality (`===`). Override when options use object\r\n * values and you need to match by a property (e.g. comparing by `id`).\r\n */\r\n readonly compareWith: InputSignal<(o1: unknown, o2: unknown) => boolean> = input<\r\n (o1: unknown, o2: unknown) => boolean\r\n >((o1, o2) => o1 === o2);\r\n\r\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | null> = input<ErrorStateMatcher | null>(null);\r\n\r\n // Outputs\r\n readonly valueChange: OutputEmitterRef<unknown> = output<unknown>();\r\n readonly selectionChange: OutputEmitterRef<FuiSelectChange> = output<FuiSelectChange>();\r\n readonly openedChange: OutputEmitterRef<boolean> = output<boolean>();\r\n\r\n // Internal state signals\r\n private readonly _value: WritableSignal<unknown> = signal(null);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n // FuiFormFieldControl implementation\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-select-${FuiSelectComponent.nextId++}`;\r\n _ariaDescribedby: string | null = null;\r\n\r\n // Error state\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n readonly errorState = this._errorState;\r\n\r\n // Form control references\r\n private readonly _ngControlRef = injectNgControl();\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n // Interface implementation\r\n readonly placeholder = computed(() => this.placeholderInput());\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n readonly required = this._required;\r\n\r\n readonly value = this._value;\r\n\r\n readonly focused = this._focused;\r\n\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n readonly disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled());\r\n readonly readonly = computed(() => this.readonlyInput());\r\n\r\n readonly empty = computed(() => isEmpty(this._value()));\r\n\r\n readonly id = this._uid;\r\n\r\n // ViewChild for trigger and panel\r\n @ViewChild('trigger', { static: true }) trigger?: ElementRef<HTMLDivElement>;\r\n @ViewChild('panel', { static: true }) panel?: ElementRef<HTMLDivElement>;\r\n\r\n // ContentChildren for options\r\n readonly options = contentChildren(FUI_OPTION, { descendants: true });\r\n\r\n // Panel open/close state — projected from the popup overlay directive\r\n readonly panelOpen = computed(() => this._popup.panelOpen());\r\n\r\n // Active option index for keyboard navigation\r\n private readonly _activeOptionIndex: WritableSignal<number> = signal(-1);\r\n readonly activeOptionIndex = this._activeOptionIndex.asReadonly();\r\n\r\n // Live announcement for screen readers\r\n readonly _liveAnnouncement: WritableSignal<string> = signal('');\r\n\r\n // Type-ahead search\r\n private readonly _typeaheadBuffer: WritableSignal<string> = signal('');\r\n private _typeaheadResetTimer: ReturnType<typeof setTimeout> | null = null;\r\n private readonly TYPE_AHEAD_DEBOUNCE = 200;\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: unknown) => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n private _onTouched: () => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n\r\n // Computed properties\r\n readonly displayValue: Signal<string> = computed(() => computeMultiDisplayValue(this));\r\n\r\n constructor() {\r\n // Set valueAccessor after NgControl is resolved\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Effect to emit state changes\r\n effect(() => {\r\n // Track all reactive inputs and internal signals\r\n this.placeholderInput();\r\n this.readonly();\r\n this.disabledInput();\r\n this.multiple();\r\n this.errorStateMatcher();\r\n this._focused();\r\n this._disabled();\r\n this._value();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n\r\n // Emit state change\r\n this.stateChanges.next();\r\n });\r\n\r\n // Effect to update options selected state when value or options change\r\n effect(() => {\r\n syncMultiOptions(this);\r\n // Notify form-field that state may have changed (for display value updates)\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n if (this._typeaheadResetTimer) {\r\n clearTimeout(this._typeaheadResetTimer);\r\n }\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n // Set up initial selection based on value\r\n this._syncOptionsSelection();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Wire popup-overlay directive. Both trigger and panel use static:true so refs are\r\n // resolved here regardless of panel open state (panel is always rendered via [hidden]).\r\n this._popup.setTrigger(this.trigger ?? null);\r\n this._popup.setPanel(this.panel ?? null);\r\n this._popup.panelClass.set(['fui-select-overlay-panel']);\r\n this._popup.backdropClass.set('fui-select-backdrop');\r\n\r\n // Position the overlay panel 16px below the form-field wrapper (or trigger).\r\n // This gives visual breathing room between the trigger and the dropdown.\r\n this._popup.positions.set([\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: FUI_SELECT_OVERLAY_OFFSET,\r\n },\r\n ]);\r\n\r\n // When inside a form-field, use the form-field wrapper as the width reference for\r\n // the overlay panel so the dropdown spans the full width (including prefix/suffix).\r\n if (this._parentFormField) {\r\n this._popup.widthElement.set(this._parentFormField.getConnectedOverlayOrigin());\r\n }\r\n\r\n // Wire form-control-sync directive signals\r\n this._formSync.errorState.set(this._errorState);\r\n this._formSync.errorStateMatcher.set(this.errorStateMatcher());\r\n this._formSync.required.set(this._required);\r\n this._formSync.ngControlDisabled.set(this._ngControlDisabled);\r\n this._formSync.stateChanges.set(this.stateChanges);\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n /** Sets the select value from the form model. Null/undefined coerces to null. */\r\n writeValue(value: unknown): void {\r\n this._value.set(value ?? null);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Registers the callback Angular calls when the value should propagate to the model. */\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /** Registers the callback Angular calls when the control should be marked as touched. */\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /** Enables or disables the control programmatically; mirrors the `disabled` form-control state. */\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // FuiFormFieldControl implementation\r\n /** Opens the panel when the form-field container is clicked, unless disabled or readonly. */\r\n onContainerClick(_event: MouseEvent): void {\r\n if (!this.disabled() && !this.readonly()) {\r\n this.toggle();\r\n }\r\n }\r\n\r\n /** Stores the space-separated list of IDs for the aria-describedby attribute. */\r\n setDescribedByIds(ids: string[]): void {\r\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\r\n }\r\n\r\n // Sync options selection state with current value\r\n private _syncOptionsSelection(): void {\r\n syncMultiOptions(this);\r\n }\r\n\r\n // Focus/blur event handlers from template\r\n _onFocus(): void {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n\r\n _onBlur(event?: FocusEvent): void {\r\n if (this.panelOpen()) {\r\n // Check if focus moved to the overlay panel (e.g. clicking an option).\r\n // In that case, don't close — the user is interacting with the dropdown.\r\n const relatedTarget = event?.relatedTarget as HTMLElement | null;\r\n const overlayElement = this._popup.overlayRef()?.overlayElement;\r\n if (relatedTarget && overlayElement?.contains(relatedTarget)) {\r\n return;\r\n }\r\n // Focus left the select entirely (e.g. Tab) — close without restoring focus\r\n this.close(false);\r\n }\r\n this._focused.set(false);\r\n this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n // Public methods\r\n /** Focuses the select trigger element. */\r\n focus(): void {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n\r\n /** Blurs the select trigger element. */\r\n blur(): void {\r\n this.trigger?.nativeElement.blur();\r\n }\r\n\r\n /** Toggles the select panel. No-op if disabled. */\r\n toggle(): void {\r\n if (this.disabled()) return;\r\n if (this._popup.panelOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the select panel. No-op if disabled, readonly, or already open. */\r\n open(): void {\r\n if (this.disabled() || this.readonly() || this._popup.panelOpen()) return;\r\n // Ensure DOM focus is on the trigger so blur/Tab work correctly\r\n this.trigger?.nativeElement.focus();\r\n this._focused.set(true);\r\n this._setInitialActiveOption();\r\n this._popup.open();\r\n if (this._popup.panelOpen()) {\r\n this._scrollToActiveOption();\r\n this.openedChange.emit(true);\r\n }\r\n }\r\n\r\n /** Closes the select panel and restores focus to the trigger unless `restoreFocus` is false. No-op if already closed. */\r\n close(restoreFocus = true): void {\r\n if (!this._popup.panelOpen()) return;\r\n this._focused.set(false);\r\n this._activeOptionIndex.set(-1);\r\n this._onTouched();\r\n this._popup.close();\r\n this.openedChange.emit(false);\r\n\r\n // Return focus to trigger only when explicitly requested (e.g. Escape, backdrop click).\r\n // When closing via Tab, let the browser move focus naturally.\r\n // Focus synchronously to avoid race conditions with Tab key presses.\r\n if (restoreFocus) {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n }\r\n\r\n // Handle option selection (called by FuiOptionComponent)\r\n _onOptionSelected(option: FuiOptionBase): void {\r\n const result = applyOptionSelection(this, option);\r\n\r\n this._value.set(result.newValue);\r\n this._onChange(result.newValue);\r\n this.valueChange.emit(result.newValue);\r\n this.selectionChange.emit({ source: this, value: result.newValue });\r\n this.stateChanges.next();\r\n\r\n if (result.wasSelected) {\r\n this._announce(`${option.getLabel()} deselected`);\r\n } else {\r\n this._announce(`${option.getLabel()} selected`);\r\n }\r\n\r\n if (!this.multiple()) {\r\n this.close();\r\n }\r\n }\r\n\r\n // Handle keyboard navigation\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n const isOpen = this.panelOpen();\r\n\r\n if (!isOpen) {\r\n this._handleClosedKeydown(event);\r\n } else {\r\n this._handleOpenKeydown(event);\r\n }\r\n }\r\n\r\n // Handle keydown when panel is closed\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const key = event.key;\r\n\r\n switch (key) {\r\n case 'Enter':\r\n case ' ':\r\n case 'ArrowDown':\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.open();\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._selectFirstOption();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._selectLastOption();\r\n break;\r\n default:\r\n // Type-ahead when closed\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Handle keydown when panel is open\r\n private _handleOpenKeydown(event: KeyboardEvent): void {\r\n const key = event.key;\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n\r\n switch (key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._setNextActiveOption(1);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._setNextActiveOption(-1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(0);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(opts.length - 1);\r\n break;\r\n case 'PageDown':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n this._setActiveOptionIndex(computePagedActiveOptionIndex(opts.length, activeIndex, 1));\r\n }\r\n break;\r\n case 'PageUp':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n this._setActiveOptionIndex(computePagedActiveOptionIndex(opts.length, activeIndex, -1));\r\n }\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n if (activeIndex >= 0 && activeIndex < opts.length) {\r\n this._onOptionSelected(opts[activeIndex]);\r\n }\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.close();\r\n break;\r\n case 'Tab':\r\n // Don't preventDefault — let browser handle Tab naturally.\r\n // _onBlur will close the panel when focus leaves the trigger.\r\n break;\r\n default:\r\n // Type-ahead when open\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n event.preventDefault();\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Set the next active option based on delta\r\n private _setNextActiveOption(delta: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) return;\r\n this._setActiveOptionIndex(computeNextActiveOptionIndex(opts.length, this._activeOptionIndex(), delta));\r\n }\r\n\r\n // Set the active option index\r\n private _setActiveOptionIndex(index: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (index < 0 || index >= opts.length) return;\r\n\r\n // Update active state on options\r\n const allOpts = this.options();\r\n allOpts.forEach((opt) => {\r\n opt.setInactive();\r\n });\r\n\r\n const activeOption = opts[index];\r\n activeOption.setActive();\r\n this._activeOptionIndex.set(index);\r\n scrollOptionIntoView(activeOption._getHostElement(), this.panel?.nativeElement);\r\n\r\n // Announce active option for screen readers (when panel is open and using keyboard)\r\n if (this.panelOpen()) {\r\n const label = activeOption.getLabel();\r\n const selectedState = activeOption._selected ? (activeOption._selected() ? ', selected' : '') : '';\r\n this._announce(`${label}${selectedState}, ${index + 1} of ${opts.length}`);\r\n }\r\n }\r\n\r\n // Set initial active option when opening\r\n private _setInitialActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) {\r\n this._activeOptionIndex.set(-1);\r\n return;\r\n }\r\n\r\n const initialIndex = findInitialActiveOptionIndex(opts, this._value(), this.multiple(), this.compareWith());\r\n this._setActiveOptionIndex(initialIndex);\r\n }\r\n\r\n // Scroll to active option\r\n private _scrollToActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n if (activeIndex < 0 || activeIndex >= opts.length) return;\r\n scrollOptionIntoView(opts[activeIndex]._getHostElement(), this.panel?.nativeElement);\r\n }\r\n\r\n // Handle type-ahead search\r\n private _handleTypeahead(char: string): void {\r\n // Clear timer and append char to buffer\r\n if (this._typeaheadResetTimer) {\r\n clearTimeout(this._typeaheadResetTimer);\r\n }\r\n this._typeaheadBuffer.update((b) => b + char.toLowerCase());\r\n\r\n // Find matching option\r\n const opts = this._getEnabledOptions();\r\n const matchIndex = opts.findIndex((opt) => opt.getLabel().toLowerCase().startsWith(this._typeaheadBuffer()));\r\n\r\n if (matchIndex >= 0) {\r\n if (this.panelOpen()) {\r\n this._setActiveOptionIndex(matchIndex);\r\n } else {\r\n // Select the option when closed\r\n this._onOptionSelected(opts[matchIndex]);\r\n }\r\n }\r\n\r\n // Clear buffer after debounce\r\n this._typeaheadResetTimer = setTimeout(() => {\r\n this._typeaheadBuffer.set('');\r\n }, this.TYPE_AHEAD_DEBOUNCE);\r\n }\r\n\r\n // Select first non-disabled option\r\n private _selectFirstOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[0]);\r\n }\r\n }\r\n\r\n // Select last non-disabled option\r\n private _selectLastOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[opts.length - 1]);\r\n }\r\n }\r\n\r\n // Get all non-disabled options\r\n private _getEnabledOptions(): FuiOptionBase[] {\r\n return getEnabledOptions(this.options());\r\n }\r\n\r\n // Get the active option's id for aria-activedescendant\r\n _getActiveDescendant(): string | null {\r\n return computeActiveDescendant(this._getEnabledOptions(), this._activeOptionIndex());\r\n }\r\n\r\n private _announce(message: string): void {\r\n announceMessage(this._liveAnnouncement, message);\r\n }\r\n\r\n // Mat-select compatibility methods\r\n get selected(): Signal<unknown> {\r\n return this.value;\r\n }\r\n\r\n /** @internal Helper to check if a value is an array. Used by tests. */\r\n isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n }\r\n}\r\n","<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ displayValue() }}</span>\r\n }\r\n </span>\r\n\r\n @if (!readonly() && !disabled()) {\r\n <span class=\"fui-select__arrow\" aria-hidden=\"true\">\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </span>\r\n }\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel (always rendered; hidden when closed so #panel ViewChild is always available) -->\r\n<div\r\n #panel\r\n [hidden]=\"false\"\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n>\r\n <ng-content></ng-content>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-select.mjs","sources":["../../../lib/components/select/select-tokens.ts","../../../lib/components/select/option-base.ts","../../../lib/components/select/option.component.ts","../../../lib/components/select/select.component.ts","../../../lib/components/select/select.component.html","../../../lib/components/select/raintonic-formaui-components-select.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Interface representing the parent select contract that options need.\r\n * Used to break the circular dependency between select and option components.\r\n */\r\nexport interface FuiSelectParent {\r\n multiple(): boolean;\r\n _onOptionSelected(option: any): void;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the parent select to options.\r\n */\r\nexport const FUI_SELECT = new InjectionToken<FuiSelectParent>('FUI_SELECT');\r\n\r\n/**\r\n * Vertical offset (px) between the select trigger bottom and overlay panel top.\r\n * The default popup positions use 4px, but the select needs 16px for better\r\n * visual spacing between the trigger and the dropdown panel.\r\n */\r\nexport const FUI_SELECT_OVERLAY_OFFSET = 16;\r\n","import {\r\n Directive,\r\n InjectionToken,\r\n input,\r\n output,\r\n InputSignal,\r\n OutputEmitterRef,\r\n ElementRef,\r\n inject,\r\n signal,\r\n WritableSignal,\r\n HostListener,\r\n OnDestroy,\r\n} from '@angular/core';\r\n\r\nimport { Subject } from 'rxjs';\r\nimport { FUI_SELECT } from './select-tokens';\r\n\r\n/**\r\n * Injection token for querying all option-like components\r\n * via contentChildren from parent components.\r\n *\r\n * FuiOptionComponent provides this token so a single\r\n * contentChildren(FUI_OPTION) query captures all options.\r\n */\r\nexport const FUI_OPTION = new InjectionToken<FuiOptionBase>('FUI_OPTION');\r\n\r\n/**\r\n * Abstract base class for FuiOptionComponent.\r\n *\r\n * Defines the contract that parent components rely on.\r\n * FuiOptionComponent provides FUI_OPTION for DI-based querying.\r\n *\r\n * Uses @Directive() so Angular recognises input()/output()/signal()/HostListener\r\n * calls as valid (they are only valid on @Component or @Directive classes).\r\n */\r\n@Directive()\r\nexport abstract class FuiOptionBase implements OnDestroy {\r\n static nextId = 0;\r\n\r\n /**\r\n * The value of the option\r\n */\r\n readonly value: InputSignal<unknown> = input<unknown>(undefined);\r\n\r\n /**\r\n * Whether the option is disabled\r\n * @default false\r\n */\r\n readonly disabled: InputSignal<boolean> = input(false);\r\n\r\n /**\r\n * Event emitted when the option is selected\r\n */\r\n readonly selectionChange: OutputEmitterRef<{ source: FuiOptionBase; value: unknown }> = output();\r\n\r\n // Internal state\r\n readonly _selected: WritableSignal<boolean> = signal(false);\r\n readonly _active: WritableSignal<boolean> = signal(false);\r\n readonly stateChanges = new Subject<void>();\r\n\r\n // Element reference\r\n protected readonly _element: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n // Parent select (optional — may not exist if used standalone)\r\n protected readonly _parentSelect = inject(FUI_SELECT, { optional: true });\r\n\r\n // Unique ID\r\n readonly id = `fui-option-${FuiOptionBase.nextId++}`;\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // View value (text content)\r\n get viewValue(): string {\r\n return (this._element.nativeElement.textContent || '').trim();\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n _handleClick(event: Event): void {\r\n if (!this.disabled()) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Notify parent select\r\n if (this._parentSelect) {\r\n this._parentSelect._onOptionSelected(this);\r\n } else {\r\n // Standalone usage — emit event\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n _handleMouseEnter(): void {\r\n if (!this.disabled()) {\r\n this._active.set(true);\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n _handleMouseLeave(): void {\r\n this._active.set(false);\r\n }\r\n\r\n /**\r\n * Selects the option\r\n */\r\n select(): void {\r\n if (!this._selected()) {\r\n this._selected.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the option\r\n */\r\n deselect(): void {\r\n if (this._selected()) {\r\n this._selected.set(false);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as active (keyboard navigation)\r\n */\r\n setActive(): void {\r\n if (!this._active()) {\r\n this._active.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets the option as inactive\r\n */\r\n setInactive(): void {\r\n if (this._active()) {\r\n this._active.set(false);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Sets focus onto this option\r\n */\r\n focus(): void {\r\n const element = this._element.nativeElement;\r\n if (typeof element.focus === 'function') {\r\n element.focus();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the label to be used when displaying the option\r\n */\r\n getLabel(): string {\r\n return this.viewValue;\r\n }\r\n\r\n /**\r\n * Gets the host element\r\n */\r\n _getHostElement(): HTMLElement {\r\n return this._element.nativeElement;\r\n }\r\n\r\n /** Emits the selection change event */\r\n private _emitSelectionChangeEvent(): void {\r\n this.selectionChange.emit({ source: this, value: this.value() });\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, ViewEncapsulation, computed, Signal } from '@angular/core';\r\n\r\nimport { FuiCheckboxComponent } from '@raintonic/formaui/components/checkbox';\r\nimport { FuiOptionBase, FUI_OPTION } from './option-base';\r\n\r\n/**\r\n * # FuiOption Component\r\n *\r\n * Individual option component for use within fui-select.\r\n * Works like Angular Material's mat-option with full accessibility support.\r\n *\r\n * ## Features\r\n * - Disabled state support\r\n * - Selection state management\r\n * - Full accessibility support (ARIA attributes)\r\n * - Keyboard navigation support\r\n * - Custom content projection\r\n * - Smooth hover animations\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Option\r\n * ```html\r\n * <fui-select placeholder=\"Select a status\">\r\n * <fui-option value=\"active\">Active</fui-option>\r\n * <fui-option value=\"inactive\">Inactive</fui-option>\r\n * <fui-option value=\"pending\" [disabled]=\"true\">Pending (Disabled)</fui-option>\r\n * </fui-select>\r\n * ```\r\n *\r\n * ### Option with Custom Content\r\n * ```html\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">\r\n * <fui-icon name=\"flag-us\"></fui-icon>\r\n * United States\r\n * </fui-option>\r\n * <fui-option value=\"ca\">\r\n * <fui-icon name=\"flag-ca\"></fui-icon>\r\n * Canada\r\n * </fui-option>\r\n * </fui-select>\r\n * ```\r\n *\r\n * ### Multi-Select Options\r\n * When `fui-select` has `[multiple]=\"true\"`, `<fui-option>` automatically renders\r\n * a checkbox indicator:\r\n * ```html\r\n * <fui-select [multiple]=\"true\" placeholder=\"Select skills\">\r\n * <fui-option value=\"js\">JavaScript</fui-option>\r\n * <fui-option value=\"ts\">TypeScript</fui-option>\r\n * <fui-option value=\"py\">Python</fui-option>\r\n * </fui-select>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-option',\r\n standalone: true,\r\n imports: [FuiCheckboxComponent],\r\n template: `\r\n @if (_isMultiParent()) {\r\n <fui-checkbox\r\n class=\"fui-option__checkbox\"\r\n [checked]=\"_selected()\"\r\n [disabled]=\"disabled()\"\r\n [tabIndex]=\"-1\"\r\n aria-hidden=\"true\"\r\n />\r\n } @else if (_selected()) {}\r\n <span class=\"fui-option__content\">\r\n <ng-content></ng-content>\r\n </span>\r\n `,\r\n styleUrls: ['./option.component.scss'],\r\n providers: [\r\n {\r\n provide: FUI_OPTION,\r\n useExisting: FuiOptionComponent,\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-option',\r\n '[class.fui-option--selected]': '_selected()',\r\n '[class.fui-option--disabled]': 'disabled()',\r\n '[class.fui-option--active]': '_active()',\r\n role: 'option',\r\n '[attr.id]': 'id',\r\n '[attr.aria-selected]': '_selected()',\r\n '[attr.aria-disabled]': 'disabled()',\r\n '[attr.tabindex]': '-1',\r\n },\r\n})\r\nexport class FuiOptionComponent extends FuiOptionBase {\r\n /** Whether the parent select is in multi-select mode */\r\n readonly _isMultiParent: Signal<boolean> = computed(() => this._parentSelect?.multiple() ?? false);\r\n}\r\n","import {\r\n AfterContentInit,\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n InputSignal,\r\n OnDestroy,\r\n output,\r\n OutputEmitterRef,\r\n signal,\r\n Signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport {\r\n injectNgControl,\r\n FuiPopupOverlayDirective,\r\n FuiFormControlSyncDirective,\r\n} from '@raintonic/formaui/cdk/form-field';\r\nimport { FUI_FORM_FIELD_CONTROL, FuiFormFieldControl, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport {\r\n computeMultiDisplayValue,\r\n syncMultiOptions,\r\n isEmpty,\r\n findInitialActiveOptionIndex,\r\n computeNextActiveOptionIndex,\r\n computePagedActiveOptionIndex,\r\n scrollOptionIntoView,\r\n announceMessage,\r\n computeActiveDescendant,\r\n getEnabledOptions,\r\n applyOptionSelection,\r\n} from '@raintonic/formaui/core';\r\nimport { FuiOptionBase, FUI_OPTION } from './option-base';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FUI_FORM_FIELD } from '@raintonic/formaui/components/form-field';\r\nimport { FUI_SELECT, FUI_SELECT_OVERLAY_OFFSET } from './select-tokens';\r\n\r\n/**\r\n * Available select sizes\r\n */\r\nexport type FuiSelectSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Available select variants following Carbon Design System patterns\r\n */\r\nexport type FuiSelectVariant = 'outlined' | 'filled';\r\n\r\n/**\r\n * Selection change event object emitted when the select's selection changes\r\n */\r\nexport interface FuiSelectChange {\r\n source: FuiSelectComponent;\r\n value: unknown;\r\n}\r\n\r\n/**\r\n * # fui-select Component\r\n *\r\n * A select component designed to work seamlessly with fui-form-field.\r\n * Similar to Angular Material's mat-select integration with mat-form-field.\r\n * Provides full Reactive Forms support with validation and error handling.\r\n *\r\n * ## Features\r\n * - Works inside fui-form-field like mat-select\r\n * - Full Reactive Forms integration (ControlValueAccessor)\r\n * - Multiple selection support\r\n * - Options via projected content (fui-option)\r\n * - Disabled and readonly states\r\n * - Full accessibility support\r\n * - Full keyboard navigation (Arrow keys, Enter, Space, Escape, Home, End)\r\n * - Type-ahead search functionality\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Select with Form Field\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * <fui-option value=\"mx\">Mexico</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### With Reactive Forms and Validation\r\n * ```html\r\n * <form [formGroup]=\"form\">\r\n * <fui-form-field>\r\n * <label>Country</label>\r\n * <fui-select formControlName=\"country\" placeholder=\"Select a country\">\r\n * <fui-option value=\"us\">United States</fui-option>\r\n * <fui-option value=\"ca\">Canada</fui-option>\r\n * </fui-select>\r\n * <fui-error *ngIf=\"form.get('country')?.hasError('required')\">\r\n * Country is required\r\n * </fui-error>\r\n * </fui-form-field>\r\n * </form>\r\n * ```\r\n *\r\n * ### Multiple Selection\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Skills</label>\r\n * <fui-select formControlName=\"skills\" [multiple]=\"true\">\r\n * <fui-option value=\"js\">JavaScript</fui-option>\r\n * <fui-option value=\"ts\">TypeScript</fui-option>\r\n * <fui-option value=\"py\">Python</fui-option>\r\n * </fui-select>\r\n * </fui-form-field>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-select',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, FuiIconComponent],\r\n templateUrl: './select.component.html',\r\n styleUrls: ['./select.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n hostDirectives: [\r\n {\r\n directive: FuiPopupOverlayDirective,\r\n inputs: ['positions', 'panelClass', 'backdropClass', 'scrollStrategy', 'minWidthFromTrigger'],\r\n outputs: ['openedChange', 'escapeKey'],\r\n },\r\n FuiFormControlSyncDirective,\r\n ],\r\n host: {\r\n class: 'fui-select',\r\n '[attr.id]': 'id',\r\n '[class.fui-select--open]': 'panelOpen()',\r\n '[class.fui-select--disabled]': 'disabled()',\r\n '[class.fui-select--multiple]': 'multiple()',\r\n '[class.fui-select--short]': 'short()',\r\n '[class.fui-select--readonly]': 'readonly()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiSelectComponent,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiSelectComponent,\r\n },\r\n {\r\n provide: FUI_SELECT,\r\n useExisting: FuiSelectComponent,\r\n },\r\n ],\r\n})\r\nexport class FuiSelectComponent\r\n implements ControlValueAccessor, FuiFormFieldControl, OnDestroy, AfterContentInit, AfterViewInit\r\n{\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-select';\r\n\r\n // Injected host directives\r\n private readonly _popup = inject(FuiPopupOverlayDirective);\r\n private readonly _formSync = inject(FuiFormControlSyncDirective);\r\n\r\n // Optional parent form-field (null when used standalone)\r\n private readonly _parentFormField = inject(FUI_FORM_FIELD, { optional: true });\r\n\r\n // Inputs using new signal-based API\r\n readonly placeholderInput: InputSignal<string> = input('', { alias: 'placeholder' });\r\n readonly disabledInput: InputSignal<boolean> = input(false, { alias: 'disabled' });\r\n readonly readonlyInput: InputSignal<boolean> = input(false, { alias: 'readonly' });\r\n readonly multiple: InputSignal<boolean> = input(false);\r\n\r\n /**\r\n * When `true`, drops the `min-width` floor so the select can shrink to fit\r\n * its selected value instead of holding a stable minimum width. Only visible\r\n * where the container lets the field size to its content; no visible change\r\n * when the field is stretched to a fixed or full width.\r\n */\r\n readonly short = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Comparison function for option values.\r\n * Defaults to strict equality (`===`). Override when options use object\r\n * values and you need to match by a property (e.g. comparing by `id`).\r\n */\r\n readonly compareWith: InputSignal<(o1: unknown, o2: unknown) => boolean> = input<\r\n (o1: unknown, o2: unknown) => boolean\r\n >((o1, o2) => o1 === o2);\r\n\r\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | null> = input<ErrorStateMatcher | null>(null);\r\n\r\n // Outputs\r\n readonly valueChange: OutputEmitterRef<unknown> = output<unknown>();\r\n readonly selectionChange: OutputEmitterRef<FuiSelectChange> = output<FuiSelectChange>();\r\n readonly openedChange: OutputEmitterRef<boolean> = output<boolean>();\r\n\r\n // Internal state signals\r\n private readonly _value: WritableSignal<unknown> = signal(null);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n // FuiFormFieldControl implementation\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-select-${FuiSelectComponent.nextId++}`;\r\n _ariaDescribedby: string | null = null;\r\n\r\n // Error state\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n readonly errorState = this._errorState;\r\n\r\n // Form control references\r\n private readonly _ngControlRef = injectNgControl();\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n // Interface implementation\r\n readonly placeholder = computed(() => this.placeholderInput());\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n readonly required = this._required;\r\n\r\n readonly value = this._value;\r\n\r\n readonly focused = this._focused;\r\n\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n readonly disabled = computed(() => this._disabled() || this.disabledInput() || this._ngControlDisabled());\r\n readonly readonly = computed(() => this.readonlyInput());\r\n\r\n readonly empty = computed(() => isEmpty(this._value()));\r\n\r\n readonly id = this._uid;\r\n\r\n // ViewChild for trigger and panel\r\n @ViewChild('trigger', { static: true }) trigger?: ElementRef<HTMLDivElement>;\r\n @ViewChild('panel', { static: true }) panel?: ElementRef<HTMLDivElement>;\r\n\r\n // ContentChildren for options\r\n readonly options = contentChildren(FUI_OPTION, { descendants: true });\r\n\r\n // Panel open/close state — projected from the popup overlay directive\r\n readonly panelOpen = computed(() => this._popup.panelOpen());\r\n\r\n // Active option index for keyboard navigation\r\n private readonly _activeOptionIndex: WritableSignal<number> = signal(-1);\r\n readonly activeOptionIndex = this._activeOptionIndex.asReadonly();\r\n\r\n // Live announcement for screen readers\r\n readonly _liveAnnouncement: WritableSignal<string> = signal('');\r\n\r\n // Type-ahead search\r\n private readonly _typeaheadBuffer: WritableSignal<string> = signal('');\r\n private _typeaheadResetTimer: ReturnType<typeof setTimeout> | null = null;\r\n private readonly TYPE_AHEAD_DEBOUNCE = 200;\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: unknown) => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n private _onTouched: () => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n\r\n // Computed properties\r\n readonly displayValue: Signal<string> = computed(() => computeMultiDisplayValue(this));\r\n\r\n constructor() {\r\n // Set valueAccessor after NgControl is resolved\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Effect to emit state changes\r\n effect(() => {\r\n // Track all reactive inputs and internal signals\r\n this.placeholderInput();\r\n this.readonly();\r\n this.disabledInput();\r\n this.multiple();\r\n this.errorStateMatcher();\r\n this._focused();\r\n this._disabled();\r\n this._value();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n\r\n // Emit state change\r\n this.stateChanges.next();\r\n });\r\n\r\n // Effect to update options selected state when value or options change\r\n effect(() => {\r\n syncMultiOptions(this);\r\n // Notify form-field that state may have changed (for display value updates)\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n if (this._typeaheadResetTimer) {\r\n clearTimeout(this._typeaheadResetTimer);\r\n }\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n // Set up initial selection based on value\r\n this._syncOptionsSelection();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Wire popup-overlay directive. Both trigger and panel use static:true so refs are\r\n // resolved here regardless of panel open state (panel is always rendered via [hidden]).\r\n this._popup.setTrigger(this.trigger ?? null);\r\n this._popup.setPanel(this.panel ?? null);\r\n this._popup.panelClass.set(['fui-select-overlay-panel']);\r\n this._popup.backdropClass.set('fui-select-backdrop');\r\n\r\n // Position the overlay panel 16px below the form-field wrapper (or trigger).\r\n // This gives visual breathing room between the trigger and the dropdown.\r\n this._popup.positions.set([\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: FUI_SELECT_OVERLAY_OFFSET,\r\n },\r\n ]);\r\n\r\n // When inside a form-field, use the form-field wrapper as the width reference for\r\n // the overlay panel so the dropdown spans the full width (including prefix/suffix).\r\n if (this._parentFormField) {\r\n this._popup.widthElement.set(this._parentFormField.getConnectedOverlayOrigin());\r\n }\r\n\r\n // Wire form-control-sync directive signals\r\n this._formSync.errorState.set(this._errorState);\r\n this._formSync.errorStateMatcher.set(this.errorStateMatcher());\r\n this._formSync.required.set(this._required);\r\n this._formSync.ngControlDisabled.set(this._ngControlDisabled);\r\n this._formSync.stateChanges.set(this.stateChanges);\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n /** Sets the select value from the form model. Null/undefined coerces to null. */\r\n writeValue(value: unknown): void {\r\n this._value.set(value ?? null);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Registers the callback Angular calls when the value should propagate to the model. */\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /** Registers the callback Angular calls when the control should be marked as touched. */\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /** Enables or disables the control programmatically; mirrors the `disabled` form-control state. */\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // FuiFormFieldControl implementation\r\n /** Opens the panel when the form-field container is clicked, unless disabled or readonly. */\r\n onContainerClick(_event: MouseEvent): void {\r\n if (!this.disabled() && !this.readonly()) {\r\n this.toggle();\r\n }\r\n }\r\n\r\n /** Stores the space-separated list of IDs for the aria-describedby attribute. */\r\n setDescribedByIds(ids: string[]): void {\r\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\r\n }\r\n\r\n // Sync options selection state with current value\r\n private _syncOptionsSelection(): void {\r\n syncMultiOptions(this);\r\n }\r\n\r\n // Focus/blur event handlers from template\r\n _onFocus(): void {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n\r\n _onBlur(event?: FocusEvent): void {\r\n if (this.panelOpen()) {\r\n // Check if focus moved to the overlay panel (e.g. clicking an option).\r\n // In that case, don't close — the user is interacting with the dropdown.\r\n const relatedTarget = event?.relatedTarget as HTMLElement | null;\r\n const overlayElement = this._popup.overlayRef()?.overlayElement;\r\n if (relatedTarget && overlayElement?.contains(relatedTarget)) {\r\n return;\r\n }\r\n // Focus left the select entirely (e.g. Tab) — close without restoring focus\r\n this.close(false);\r\n }\r\n this._focused.set(false);\r\n this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n // Public methods\r\n /** Focuses the select trigger element. */\r\n focus(): void {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n\r\n /** Blurs the select trigger element. */\r\n blur(): void {\r\n this.trigger?.nativeElement.blur();\r\n }\r\n\r\n /** Toggles the select panel. No-op if disabled. */\r\n toggle(): void {\r\n if (this.disabled()) return;\r\n if (this._popup.panelOpen()) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the select panel. No-op if disabled, readonly, or already open. */\r\n open(): void {\r\n if (this.disabled() || this.readonly() || this._popup.panelOpen()) return;\r\n // Ensure DOM focus is on the trigger so blur/Tab work correctly\r\n this.trigger?.nativeElement.focus();\r\n this._focused.set(true);\r\n this._setInitialActiveOption();\r\n this._popup.open();\r\n if (this._popup.panelOpen()) {\r\n this._scrollToActiveOption();\r\n this.openedChange.emit(true);\r\n }\r\n }\r\n\r\n /** Closes the select panel and restores focus to the trigger unless `restoreFocus` is false. No-op if already closed. */\r\n close(restoreFocus = true): void {\r\n if (!this._popup.panelOpen()) return;\r\n this._focused.set(false);\r\n this._activeOptionIndex.set(-1);\r\n this._onTouched();\r\n this._popup.close();\r\n this.openedChange.emit(false);\r\n\r\n // Return focus to trigger only when explicitly requested (e.g. Escape, backdrop click).\r\n // When closing via Tab, let the browser move focus naturally.\r\n // Focus synchronously to avoid race conditions with Tab key presses.\r\n if (restoreFocus) {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n }\r\n\r\n // Handle option selection (called by FuiOptionComponent)\r\n _onOptionSelected(option: FuiOptionBase): void {\r\n const result = applyOptionSelection(this, option);\r\n\r\n this._value.set(result.newValue);\r\n this._onChange(result.newValue);\r\n this.valueChange.emit(result.newValue);\r\n this.selectionChange.emit({ source: this, value: result.newValue });\r\n this.stateChanges.next();\r\n\r\n if (result.wasSelected) {\r\n this._announce(`${option.getLabel()} deselected`);\r\n } else {\r\n this._announce(`${option.getLabel()} selected`);\r\n }\r\n\r\n if (!this.multiple()) {\r\n this.close();\r\n }\r\n }\r\n\r\n // Handle keyboard navigation\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n const isOpen = this.panelOpen();\r\n\r\n if (!isOpen) {\r\n this._handleClosedKeydown(event);\r\n } else {\r\n this._handleOpenKeydown(event);\r\n }\r\n }\r\n\r\n // Handle keydown when panel is closed\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const key = event.key;\r\n\r\n switch (key) {\r\n case 'Enter':\r\n case ' ':\r\n case 'ArrowDown':\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.open();\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._selectFirstOption();\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._selectLastOption();\r\n break;\r\n default:\r\n // Type-ahead when closed\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Handle keydown when panel is open\r\n private _handleOpenKeydown(event: KeyboardEvent): void {\r\n const key = event.key;\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n\r\n switch (key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._setNextActiveOption(1);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._setNextActiveOption(-1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(0);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(opts.length - 1);\r\n break;\r\n case 'PageDown':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n this._setActiveOptionIndex(computePagedActiveOptionIndex(opts.length, activeIndex, 1));\r\n }\r\n break;\r\n case 'PageUp':\r\n event.preventDefault();\r\n if (opts.length > 0) {\r\n this._setActiveOptionIndex(computePagedActiveOptionIndex(opts.length, activeIndex, -1));\r\n }\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault();\r\n if (activeIndex >= 0 && activeIndex < opts.length) {\r\n this._onOptionSelected(opts[activeIndex]);\r\n }\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.close();\r\n break;\r\n case 'Tab':\r\n // Don't preventDefault — let browser handle Tab naturally.\r\n // _onBlur will close the panel when focus leaves the trigger.\r\n break;\r\n default:\r\n // Type-ahead when open\r\n if (key.length === 1 && !event.ctrlKey && !event.metaKey) {\r\n event.preventDefault();\r\n this._handleTypeahead(key);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Set the next active option based on delta\r\n private _setNextActiveOption(delta: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) return;\r\n this._setActiveOptionIndex(computeNextActiveOptionIndex(opts.length, this._activeOptionIndex(), delta));\r\n }\r\n\r\n // Set the active option index\r\n private _setActiveOptionIndex(index: number): void {\r\n const opts = this._getEnabledOptions();\r\n if (index < 0 || index >= opts.length) return;\r\n\r\n // Update active state on options\r\n const allOpts = this.options();\r\n allOpts.forEach((opt) => {\r\n opt.setInactive();\r\n });\r\n\r\n const activeOption = opts[index];\r\n activeOption.setActive();\r\n this._activeOptionIndex.set(index);\r\n scrollOptionIntoView(activeOption._getHostElement(), this.panel?.nativeElement);\r\n\r\n // Announce active option for screen readers (when panel is open and using keyboard)\r\n if (this.panelOpen()) {\r\n const label = activeOption.getLabel();\r\n const selectedState = activeOption._selected ? (activeOption._selected() ? ', selected' : '') : '';\r\n this._announce(`${label}${selectedState}, ${index + 1} of ${opts.length}`);\r\n }\r\n }\r\n\r\n // Set initial active option when opening\r\n private _setInitialActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length === 0) {\r\n this._activeOptionIndex.set(-1);\r\n return;\r\n }\r\n\r\n const initialIndex = findInitialActiveOptionIndex(opts, this._value(), this.multiple(), this.compareWith());\r\n this._setActiveOptionIndex(initialIndex);\r\n }\r\n\r\n // Scroll to active option\r\n private _scrollToActiveOption(): void {\r\n const opts = this._getEnabledOptions();\r\n const activeIndex = this._activeOptionIndex();\r\n if (activeIndex < 0 || activeIndex >= opts.length) return;\r\n scrollOptionIntoView(opts[activeIndex]._getHostElement(), this.panel?.nativeElement);\r\n }\r\n\r\n // Handle type-ahead search\r\n private _handleTypeahead(char: string): void {\r\n // Clear timer and append char to buffer\r\n if (this._typeaheadResetTimer) {\r\n clearTimeout(this._typeaheadResetTimer);\r\n }\r\n this._typeaheadBuffer.update((b) => b + char.toLowerCase());\r\n\r\n // Find matching option\r\n const opts = this._getEnabledOptions();\r\n const matchIndex = opts.findIndex((opt) => opt.getLabel().toLowerCase().startsWith(this._typeaheadBuffer()));\r\n\r\n if (matchIndex >= 0) {\r\n if (this.panelOpen()) {\r\n this._setActiveOptionIndex(matchIndex);\r\n } else {\r\n // Select the option when closed\r\n this._onOptionSelected(opts[matchIndex]);\r\n }\r\n }\r\n\r\n // Clear buffer after debounce\r\n this._typeaheadResetTimer = setTimeout(() => {\r\n this._typeaheadBuffer.set('');\r\n }, this.TYPE_AHEAD_DEBOUNCE);\r\n }\r\n\r\n // Select first non-disabled option\r\n private _selectFirstOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[0]);\r\n }\r\n }\r\n\r\n // Select last non-disabled option\r\n private _selectLastOption(): void {\r\n const opts = this._getEnabledOptions();\r\n if (opts.length > 0) {\r\n this._onOptionSelected(opts[opts.length - 1]);\r\n }\r\n }\r\n\r\n // Get all non-disabled options\r\n private _getEnabledOptions(): FuiOptionBase[] {\r\n return getEnabledOptions(this.options());\r\n }\r\n\r\n // Get the active option's id for aria-activedescendant\r\n _getActiveDescendant(): string | null {\r\n return computeActiveDescendant(this._getEnabledOptions(), this._activeOptionIndex());\r\n }\r\n\r\n private _announce(message: string): void {\r\n announceMessage(this._liveAnnouncement, message);\r\n }\r\n\r\n // Mat-select compatibility methods\r\n get selected(): Signal<unknown> {\r\n return this.value;\r\n }\r\n\r\n /** @internal Helper to check if a value is an array. Used by tests. */\r\n isArray(value: unknown): value is unknown[] {\r\n return Array.isArray(value);\r\n }\r\n}\r\n","<!-- Select Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-select__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n [attr.role]=\"'combobox'\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-expanded]=\"panelOpen()\"\r\n [attr.aria-disabled]=\"disabled()\"\r\n [attr.aria-invalid]=\"errorState()\"\r\n [attr.aria-describedby]=\"_ariaDescribedby\"\r\n [attr.aria-required]=\"required()\"\r\n [attr.aria-readonly]=\"readonly() ? 'true' : null\"\r\n [attr.aria-label]=\"empty() ? placeholder() : null\"\r\n aria-autocomplete=\"none\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n (focus)=\"_onFocus()\"\r\n (blur)=\"_onBlur($event)\"\r\n>\r\n <span class=\"fui-select__value\">\r\n @if (empty()) {\r\n <span class=\"fui-select__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-select__value-text\">{{ displayValue() }}</span>\r\n }\r\n </span>\r\n\r\n @if (!readonly() && !disabled()) {\r\n <span class=\"fui-select__arrow\" aria-hidden=\"true\">\r\n <fui-icon name=\"caret-down\" size=\"sm\"></fui-icon>\r\n </span>\r\n }\r\n</div>\r\n\r\n<!-- Live region for screen reader announcements -->\r\n<span class=\"fui-sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">{{ _liveAnnouncement() }}</span>\r\n\r\n<!-- Dropdown Panel (always rendered; hidden when closed so #panel ViewChild is always available) -->\r\n<div\r\n #panel\r\n [hidden]=\"false\"\r\n [id]=\"id + '-panel'\"\r\n class=\"fui-select__panel\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple()\"\r\n [attr.aria-label]=\"placeholder()\"\r\n>\r\n <ng-content></ng-content>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, inject, ChangeDetectorRef, input, output, effect, HostListener, ViewChild, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { Injectable, Directive, inject, ChangeDetectorRef, input, output, contentChild, computed, effect, HostListener, ViewChild, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { DOCUMENT } from '@angular/common';
|
|
5
5
|
import { FuiIconComponent } from '@raintonic/formaui/components/icon';
|
|
@@ -15,11 +15,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
15
15
|
args: [{ providedIn: 'root' }]
|
|
16
16
|
}] });
|
|
17
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Marker directive for projecting custom markup into the side-panel header
|
|
20
|
+
* title area. Apply the `fuiSidePanelTitle` attribute to the element you want
|
|
21
|
+
* rendered as the title. When present, it visually replaces the string
|
|
22
|
+
* `title`, which still provides the panel's accessible name.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* <fui-side-panel title="Details">
|
|
26
|
+
* <span fuiSidePanelTitle>Custom <em>title</em> markup</span>
|
|
27
|
+
* </fui-side-panel>
|
|
28
|
+
*/
|
|
29
|
+
class FuiSidePanelTitle {
|
|
30
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSidePanelTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
31
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.6", type: FuiSidePanelTitle, isStandalone: true, selector: "[fuiSidePanelTitle]", host: { classAttribute: "fui-side-panel__title-slot" }, ngImport: i0 });
|
|
32
|
+
}
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSidePanelTitle, decorators: [{
|
|
34
|
+
type: Directive,
|
|
35
|
+
args: [{
|
|
36
|
+
selector: '[fuiSidePanelTitle]',
|
|
37
|
+
standalone: true,
|
|
38
|
+
host: {
|
|
39
|
+
class: 'fui-side-panel__title-slot',
|
|
40
|
+
},
|
|
41
|
+
}]
|
|
42
|
+
}] });
|
|
43
|
+
|
|
18
44
|
/**
|
|
19
45
|
* @component FuiSidePanelComponent
|
|
20
46
|
* @selector fui-side-panel
|
|
21
47
|
* @description A slide-in side panel overlay with optional backdrop, focus trapping, and keyboard dismiss.
|
|
22
48
|
* Renders from the right edge of the viewport with configurable width and top offset.
|
|
49
|
+
* A projected `fuiSidePanelTitle` element visually replaces the string `title` in the header;
|
|
50
|
+
* the `title` input still provides the accessible name via `aria-label`.
|
|
23
51
|
*
|
|
24
52
|
* @input open - Whether the side panel is visible. Default false.
|
|
25
53
|
* @input title - Title text displayed in the panel header.
|
|
@@ -34,6 +62,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
34
62
|
*
|
|
35
63
|
* @example
|
|
36
64
|
* <fui-side-panel [open]="isPanelOpen" title="Details" (closed)="isPanelOpen = false">
|
|
65
|
+
* <span fuiSidePanelTitle>Custom <em>title</em> markup</span>
|
|
37
66
|
* <p>Panel content here.</p>
|
|
38
67
|
* </fui-side-panel>
|
|
39
68
|
*/
|
|
@@ -51,6 +80,9 @@ class FuiSidePanelComponent {
|
|
|
51
80
|
/** ID of an element that labels the side panel */
|
|
52
81
|
ariaLabelledBy = input(null, ...(ngDevMode ? [{ debugName: "ariaLabelledBy" }] : /* istanbul ignore next */ []));
|
|
53
82
|
closed = output();
|
|
83
|
+
// Projected title detection — true when a [fuiSidePanelTitle] element is provided.
|
|
84
|
+
_projectedTitle = contentChild(FuiSidePanelTitle, ...(ngDevMode ? [{ debugName: "_projectedTitle" }] : /* istanbul ignore next */ []));
|
|
85
|
+
_hasProjectedTitle = computed(() => !!this._projectedTitle(), ...(ngDevMode ? [{ debugName: "_hasProjectedTitle" }] : /* istanbul ignore next */ []));
|
|
54
86
|
_panelElement;
|
|
55
87
|
_previouslyFocusedElement = null;
|
|
56
88
|
constructor() {
|
|
@@ -64,7 +96,9 @@ class FuiSidePanelComponent {
|
|
|
64
96
|
this._restoreFocus();
|
|
65
97
|
}
|
|
66
98
|
});
|
|
67
|
-
this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {
|
|
99
|
+
this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {
|
|
100
|
+
this._cdr.markForCheck();
|
|
101
|
+
});
|
|
68
102
|
}
|
|
69
103
|
onKeydown(event) {
|
|
70
104
|
if (!this.open())
|
|
@@ -139,7 +173,7 @@ class FuiSidePanelComponent {
|
|
|
139
173
|
return Array.from(panel.querySelectorAll(selectors)).filter((el) => el.offsetParent !== null);
|
|
140
174
|
}
|
|
141
175
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
142
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiSidePanelComponent, isStandalone: true, selector: "fui-side-panel", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, topOffset: { classPropertyName: "topOffset", publicName: "topOffset", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "class.fui-side-panel--open": "open()", "class.fui-side-panel--no-backdrop": "!hasBackdrop()", "style.--_side-panel-top-offset": "topOffset()" }, classAttribute: "fui-side-panel" }, viewQueries: [{ propertyName: "_panelElement", first: true, predicate: ["panelElement"], descendants: true }], ngImport: i0, template: "@if (open() && hasBackdrop()) {\r\n <div class=\"fui-side-panel__backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n}\r\n<div\r\n #panelElement\r\n class=\"fui-side-panel__panel\"\r\n [style.width]=\"width()\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"open() ? 'true' : null\"\r\n [attr.aria-label]=\"ariaLabel() || (!ariaLabelledBy() ? title() : null)\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\r\n tabindex=\"-1\"\r\n>\r\n <div class=\"fui-side-panel__header\">\r\n <span class=\"fui-side-panel__title\">{{ title() }}</span>\r\n <button type=\"button\" class=\"fui-side-panel__close\" (click)=\"close()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n <div class=\"fui-side-panel__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"fui-side-panel__footer\">\r\n <ng-content select=\"[sidePanelFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-side-panel{--fui-side-panel-z-index: 10;--fui-side-panel-bg: var(--fui-bg-default);--fui-side-panel-border-color: var(--fui-border-default);--fui-side-panel-shadow: -4px 0 16px rgba(0, 0, 0, .1);--fui-side-panel-backdrop-color: rgba(0, 0, 0, .2);--fui-side-panel-header-padding: var(--fui-spacing-6) var(--fui-spacing-7);--fui-side-panel-content-padding: var(--fui-spacing-4);--fui-side-panel-footer-padding: var(--fui-spacing-6) var(--fui-spacing-7);position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;pointer-events:none;z-index:var(--fui-side-panel-z-index);overflow:hidden}.fui-side-panel--open{pointer-events:auto}.fui-side-panel--no-backdrop.fui-side-panel--open{pointer-events:none}.fui-side-panel__backdrop{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;background-color:var(--fui-side-panel-backdrop-color);z-index:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-side-panel__panel{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;display:flex;flex-direction:column;background-color:var(--fui-side-panel-bg);border-left:
|
|
176
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiSidePanelComponent, isStandalone: true, selector: "fui-side-panel", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, topOffset: { classPropertyName: "topOffset", publicName: "topOffset", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "class.fui-side-panel--open": "open()", "class.fui-side-panel--no-backdrop": "!hasBackdrop()", "style.--_side-panel-top-offset": "topOffset()" }, classAttribute: "fui-side-panel" }, queries: [{ propertyName: "_projectedTitle", first: true, predicate: FuiSidePanelTitle, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_panelElement", first: true, predicate: ["panelElement"], descendants: true }], ngImport: i0, template: "@if (open() && hasBackdrop()) {\r\n <div class=\"fui-side-panel__backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n}\r\n<div\r\n #panelElement\r\n class=\"fui-side-panel__panel\"\r\n [style.width]=\"width()\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"open() ? 'true' : null\"\r\n [attr.aria-label]=\"ariaLabel() || (!ariaLabelledBy() ? title() : null)\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\r\n tabindex=\"-1\"\r\n>\r\n <div class=\"fui-side-panel__header\">\r\n @if (_hasProjectedTitle()) {\r\n <span class=\"fui-side-panel__title\"><ng-content select=\"[fuiSidePanelTitle]\"></ng-content></span>\r\n } @else {\r\n <span class=\"fui-side-panel__title\">{{ title() }}</span>\r\n }\r\n <button type=\"button\" class=\"fui-side-panel__close\" (click)=\"close()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n <div class=\"fui-side-panel__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"fui-side-panel__footer\">\r\n <ng-content select=\"[sidePanelFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-side-panel{--fui-side-panel-z-index: 10;--fui-side-panel-bg: var(--fui-bg-default);--fui-side-panel-border-color: var(--fui-border-default);--fui-side-panel-shadow: -4px 0 16px rgba(0, 0, 0, .1);--fui-side-panel-backdrop-color: rgba(0, 0, 0, .2);--fui-side-panel-header-padding: var(--fui-spacing-6) var(--fui-spacing-7);--fui-side-panel-content-padding: var(--fui-spacing-4);--fui-side-panel-footer-padding: var(--fui-spacing-6) var(--fui-spacing-7);position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;pointer-events:none;z-index:var(--fui-side-panel-z-index);overflow:hidden}.fui-side-panel--open{pointer-events:auto}.fui-side-panel--no-backdrop.fui-side-panel--open{pointer-events:none}.fui-side-panel__backdrop{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;background-color:var(--fui-side-panel-backdrop-color);z-index:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-side-panel__panel{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;display:flex;flex-direction:column;background-color:var(--fui-side-panel-bg);border-left:var(--fui-border-width-sm) solid var(--fui-side-panel-border-color);box-shadow:var(--fui-side-panel-shadow);z-index:2;transform:translate(100%);transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-side-panel--open .fui-side-panel__panel{transform:translate(0)}.fui-side-panel__panel{pointer-events:auto}.fui-side-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-side-panel-header-padding);border-bottom:var(--fui-border-width-sm) solid var(--fui-side-panel-border-color);flex-shrink:0}.fui-side-panel__title{font-size:var(--fui-text-md);font-weight:var(--fui-weight-semibold);color:var(--fui-text-primary)}.fui-side-panel__close{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);cursor:pointer;transition:background-color var(--fui-duration-base) var(--fui-ease-in-out),color var(--fui-duration-base) var(--fui-ease-in-out)}.fui-side-panel__close:hover{background-color:var(--fui-bg-subtle);color:var(--fui-text-primary)}.fui-side-panel__content{flex:1;overflow-y:auto;background-color:var(--fui-bg-subtle);padding:var(--fui-side-panel-content-padding)}.fui-side-panel__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--fui-spacing-4);padding:var(--fui-side-panel-footer-padding);border-top:var(--fui-border-width-sm) solid var(--fui-side-panel-border-color);flex-shrink:0}.fui-side-panel__footer:empty{display:none}@media(prefers-reduced-motion:reduce){.fui-side-panel__backdrop,.fui-side-panel__panel,.fui-side-panel__close{transition:none}}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
143
177
|
}
|
|
144
178
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiSidePanelComponent, decorators: [{
|
|
145
179
|
type: Component,
|
|
@@ -148,8 +182,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
148
182
|
'[class.fui-side-panel--open]': 'open()',
|
|
149
183
|
'[class.fui-side-panel--no-backdrop]': '!hasBackdrop()',
|
|
150
184
|
'[style.--_side-panel-top-offset]': 'topOffset()',
|
|
151
|
-
}, template: "@if (open() && hasBackdrop()) {\r\n <div class=\"fui-side-panel__backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n}\r\n<div\r\n #panelElement\r\n class=\"fui-side-panel__panel\"\r\n [style.width]=\"width()\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"open() ? 'true' : null\"\r\n [attr.aria-label]=\"ariaLabel() || (!ariaLabelledBy() ? title() : null)\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\r\n tabindex=\"-1\"\r\n>\r\n <div class=\"fui-side-panel__header\">\r\n <span class=\"fui-side-panel__title\">{{ title() }}</span>\r\n <button type=\"button\" class=\"fui-side-panel__close\" (click)=\"close()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n <div class=\"fui-side-panel__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"fui-side-panel__footer\">\r\n <ng-content select=\"[sidePanelFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-side-panel{--fui-side-panel-z-index: 10;--fui-side-panel-bg: var(--fui-bg-default);--fui-side-panel-border-color: var(--fui-border-default);--fui-side-panel-shadow: -4px 0 16px rgba(0, 0, 0, .1);--fui-side-panel-backdrop-color: rgba(0, 0, 0, .2);--fui-side-panel-header-padding: var(--fui-spacing-6) var(--fui-spacing-7);--fui-side-panel-content-padding: var(--fui-spacing-4);--fui-side-panel-footer-padding: var(--fui-spacing-6) var(--fui-spacing-7);position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;pointer-events:none;z-index:var(--fui-side-panel-z-index);overflow:hidden}.fui-side-panel--open{pointer-events:auto}.fui-side-panel--no-backdrop.fui-side-panel--open{pointer-events:none}.fui-side-panel__backdrop{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;background-color:var(--fui-side-panel-backdrop-color);z-index:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-side-panel__panel{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;display:flex;flex-direction:column;background-color:var(--fui-side-panel-bg);border-left:
|
|
152
|
-
}], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], topOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "topOffset", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledBy", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], _panelElement: [{
|
|
185
|
+
}, template: "@if (open() && hasBackdrop()) {\r\n <div class=\"fui-side-panel__backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n}\r\n<div\r\n #panelElement\r\n class=\"fui-side-panel__panel\"\r\n [style.width]=\"width()\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"open() ? 'true' : null\"\r\n [attr.aria-label]=\"ariaLabel() || (!ariaLabelledBy() ? title() : null)\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\r\n tabindex=\"-1\"\r\n>\r\n <div class=\"fui-side-panel__header\">\r\n @if (_hasProjectedTitle()) {\r\n <span class=\"fui-side-panel__title\"><ng-content select=\"[fuiSidePanelTitle]\"></ng-content></span>\r\n } @else {\r\n <span class=\"fui-side-panel__title\">{{ title() }}</span>\r\n }\r\n <button type=\"button\" class=\"fui-side-panel__close\" (click)=\"close()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n <div class=\"fui-side-panel__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"fui-side-panel__footer\">\r\n <ng-content select=\"[sidePanelFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes fui-skeleton-pulse{0%{opacity:1}50%{opacity:.4}to{opacity:1}}@keyframes fui-spin{to{transform:rotate(360deg)}}@keyframes fui-shake{0%,to{transform:translate(0)}10%,30%,50%,70%,90%{transform:translate(-2px)}20%,40%,60%,80%{transform:translate(2px)}}.fui-motion-fade-in{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-motion-fade-out{transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in);transition-delay:0ms}.fui-motion-slide-in-bottom{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-bottom.fui-motion-entering{transform:translateY(1rem)}.fui-motion-slide-in-top{transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:translateY(0)}.fui-motion-slide-in-top.fui-motion-entering{transform:translateY(-1rem)}.fui-motion-scale-in{transition-property:transform,opacity;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms;transform:scale(1);opacity:1}.fui-motion-scale-in.fui-motion-entering{transform:scale(.95);opacity:0}.fui-no-motion{transition:none!important;animation:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}@keyframes fui-pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.05)}to{transform:scale(1);opacity:1}}@keyframes fui-slide-in{0%{transform:translate(120%)}to{transform:translate(0)}}.fui-slide-in{animation:fui-slide-in var(--fui-duration-base) var(--fui-ease-out)}@keyframes fui-popover-enter{0%{opacity:0;transform:translateY(-14px)}60%{opacity:1}to{opacity:1;transform:translateY(0)}}.fui-side-panel{--fui-side-panel-z-index: 10;--fui-side-panel-bg: var(--fui-bg-default);--fui-side-panel-border-color: var(--fui-border-default);--fui-side-panel-shadow: -4px 0 16px rgba(0, 0, 0, .1);--fui-side-panel-backdrop-color: rgba(0, 0, 0, .2);--fui-side-panel-header-padding: var(--fui-spacing-6) var(--fui-spacing-7);--fui-side-panel-content-padding: var(--fui-spacing-4);--fui-side-panel-footer-padding: var(--fui-spacing-6) var(--fui-spacing-7);position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;pointer-events:none;z-index:var(--fui-side-panel-z-index);overflow:hidden}.fui-side-panel--open{pointer-events:auto}.fui-side-panel--no-backdrop.fui-side-panel--open{pointer-events:none}.fui-side-panel__backdrop{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;left:0;background-color:var(--fui-side-panel-backdrop-color);z-index:1;transition-property:opacity;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-side-panel__panel{position:fixed;top:var(--_side-panel-top-offset, 0);right:0;bottom:0;display:flex;flex-direction:column;background-color:var(--fui-side-panel-bg);border-left:var(--fui-border-width-sm) solid var(--fui-side-panel-border-color);box-shadow:var(--fui-side-panel-shadow);z-index:2;transform:translate(100%);transition-property:transform;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-out);transition-delay:0ms}.fui-side-panel--open .fui-side-panel__panel{transform:translate(0)}.fui-side-panel__panel{pointer-events:auto}.fui-side-panel__header{display:flex;align-items:center;justify-content:space-between;padding:var(--fui-side-panel-header-padding);border-bottom:var(--fui-border-width-sm) solid var(--fui-side-panel-border-color);flex-shrink:0}.fui-side-panel__title{font-size:var(--fui-text-md);font-weight:var(--fui-weight-semibold);color:var(--fui-text-primary)}.fui-side-panel__close{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;background:transparent;border-radius:var(--fui-radius-sm);color:var(--fui-text-secondary);cursor:pointer;transition:background-color var(--fui-duration-base) var(--fui-ease-in-out),color var(--fui-duration-base) var(--fui-ease-in-out)}.fui-side-panel__close:hover{background-color:var(--fui-bg-subtle);color:var(--fui-text-primary)}.fui-side-panel__content{flex:1;overflow-y:auto;background-color:var(--fui-bg-subtle);padding:var(--fui-side-panel-content-padding)}.fui-side-panel__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--fui-spacing-4);padding:var(--fui-side-panel-footer-padding);border-top:var(--fui-border-width-sm) solid var(--fui-side-panel-border-color);flex-shrink:0}.fui-side-panel__footer:empty{display:none}@media(prefers-reduced-motion:reduce){.fui-side-panel__backdrop,.fui-side-panel__panel,.fui-side-panel__close{transition:none}}\n"] }]
|
|
186
|
+
}], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], topOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "topOffset", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledBy", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], _projectedTitle: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FuiSidePanelTitle), { isSignal: true }] }], _panelElement: [{
|
|
153
187
|
type: ViewChild,
|
|
154
188
|
args: ['panelElement', { static: false }]
|
|
155
189
|
}], onKeydown: [{
|
|
@@ -161,5 +195,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
161
195
|
* Generated bundle index. Do not edit.
|
|
162
196
|
*/
|
|
163
197
|
|
|
164
|
-
export { FuiSidePanelComponent, FuiSidePanelIntl };
|
|
198
|
+
export { FuiSidePanelComponent, FuiSidePanelIntl, FuiSidePanelTitle };
|
|
165
199
|
//# sourceMappingURL=raintonic-formaui-components-side-panel.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-side-panel.mjs","sources":["../../../lib/components/side-panel/side-panel.intl.ts","../../../lib/components/side-panel/side-panel.component.ts","../../../lib/components/side-panel/side-panel.component.html","../../../lib/components/side-panel/raintonic-formaui-components-side-panel.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiSidePanelIntl extends FuiIntlBase {\r\n closeAriaLabel = 'Close panel';\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n effect,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n output,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiSidePanelIntl } from './side-panel.intl';\r\n\r\n/**\r\n * @component FuiSidePanelComponent\r\n * @selector fui-side-panel\r\n * @description A slide-in side panel overlay with optional backdrop, focus trapping, and keyboard dismiss.\r\n * Renders from the right edge of the viewport with configurable width and top offset.\r\n *\r\n * @input open - Whether the side panel is visible. Default false.\r\n * @input title - Title text displayed in the panel header.\r\n * @input width - CSS width of the panel. Default '500px'.\r\n * @input hasBackdrop - Whether to show a backdrop behind the panel. Default true.\r\n * @input topOffset - CSS top offset (e.g. to clear a fixed toolbar). Default '0px'.\r\n * @input ariaLabel - ARIA label for the panel when no visible title is present.\r\n * @input ariaLabelledBy - ID of an element that labels the panel.\r\n * @output closed - Emits when the panel requests closing (close button, Escape, or backdrop click).\r\n *\r\n * @cssvar --_side-panel-top-offset - Internal CSS variable set from the topOffset input.\r\n *\r\n * @example\r\n * <fui-side-panel [open]=\"isPanelOpen\" title=\"Details\" (closed)=\"isPanelOpen = false\">\r\n * <p>Panel content here.</p>\r\n * </fui-side-panel>\r\n */\r\n@Component({\r\n selector: 'fui-side-panel',\r\n standalone: true,\r\n imports: [FuiIconComponent],\r\n templateUrl: './side-panel.component.html',\r\n styleUrl: './side-panel.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-side-panel',\r\n '[class.fui-side-panel--open]': 'open()',\r\n '[class.fui-side-panel--no-backdrop]': '!hasBackdrop()',\r\n '[style.--_side-panel-top-offset]': 'topOffset()',\r\n },\r\n})\r\nexport class FuiSidePanelComponent {\r\n private readonly _document = inject(DOCUMENT);\r\n readonly intl = inject(FuiSidePanelIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n\r\n readonly open = input(false);\r\n readonly title = input('');\r\n readonly width = input('500px');\r\n readonly hasBackdrop = input(true);\r\n readonly topOffset = input('0px');\r\n\r\n /** ARIA label for the side panel, used when no visible title is present */\r\n readonly ariaLabel = input<string | null>(null);\r\n\r\n /** ID of an element that labels the side panel */\r\n readonly ariaLabelledBy = input<string | null>(null);\r\n\r\n readonly closed = output();\r\n\r\n @ViewChild('panelElement', { static: false })\r\n private _panelElement?: ElementRef<HTMLElement>;\r\n\r\n private _previouslyFocusedElement: HTMLElement | null = null;\r\n\r\n constructor() {\r\n // Watch open state changes for focus management\r\n effect(() => {\r\n const isOpen = this.open();\r\n if (isOpen) {\r\n this._saveFocusAndTrap();\r\n } else {\r\n this._restoreFocus();\r\n }\r\n });\r\n\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => { this._cdr.markForCheck(); });\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (!this.open()) return;\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n }\r\n\r\n // Focus trap cycling\r\n if (event.key === 'Tab') {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length === 0) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const firstFocusable = focusableElements[0];\r\n const lastFocusable = focusableElements[focusableElements.length - 1];\r\n const activeElement = this._document.activeElement;\r\n\r\n if (event.shiftKey) {\r\n if (activeElement === firstFocusable) {\r\n event.preventDefault();\r\n lastFocusable.focus();\r\n }\r\n } else {\r\n if (activeElement === lastFocusable) {\r\n event.preventDefault();\r\n firstFocusable.focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n close(): void {\r\n this.closed.emit();\r\n }\r\n\r\n private _saveFocusAndTrap(): void {\r\n this._previouslyFocusedElement = this._document.activeElement as HTMLElement;\r\n // Focus the panel after it renders\r\n setTimeout(() => {\r\n this._focusFirstTabbable();\r\n });\r\n }\r\n\r\n private _restoreFocus(): void {\r\n if (this._previouslyFocusedElement) {\r\n this._previouslyFocusedElement.focus();\r\n this._previouslyFocusedElement = null;\r\n }\r\n }\r\n\r\n private _focusFirstTabbable(): void {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length > 0) {\r\n focusableElements[0].focus();\r\n } else {\r\n this._panelElement?.nativeElement.focus();\r\n }\r\n }\r\n\r\n private _getFocusableElements(): HTMLElement[] {\r\n const panel = this._panelElement?.nativeElement;\r\n if (!panel) return [];\r\n\r\n const selectors = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'input:not([disabled])',\r\n 'select:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable=\"true\"]',\r\n ].join(',');\r\n\r\n return Array.from(panel.querySelectorAll<HTMLElement>(selectors)).filter((el) => el.offsetParent !== null);\r\n }\r\n}\r\n","@if (open() && hasBackdrop()) {\r\n <div class=\"fui-side-panel__backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n}\r\n<div\r\n #panelElement\r\n class=\"fui-side-panel__panel\"\r\n [style.width]=\"width()\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"open() ? 'true' : null\"\r\n [attr.aria-label]=\"ariaLabel() || (!ariaLabelledBy() ? title() : null)\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\r\n tabindex=\"-1\"\r\n>\r\n <div class=\"fui-side-panel__header\">\r\n <span class=\"fui-side-panel__title\">{{ title() }}</span>\r\n <button type=\"button\" class=\"fui-side-panel__close\" (click)=\"close()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n <div class=\"fui-side-panel__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"fui-side-panel__footer\">\r\n <ng-content select=\"[sidePanelFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-side-panel.mjs","sources":["../../../lib/components/side-panel/side-panel.intl.ts","../../../lib/components/side-panel/side-panel-title.directive.ts","../../../lib/components/side-panel/side-panel.component.ts","../../../lib/components/side-panel/side-panel.component.html","../../../lib/components/side-panel/raintonic-formaui-components-side-panel.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiSidePanelIntl extends FuiIntlBase {\r\n closeAriaLabel = 'Close panel';\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marker directive for projecting custom markup into the side-panel header\r\n * title area. Apply the `fuiSidePanelTitle` attribute to the element you want\r\n * rendered as the title. When present, it visually replaces the string\r\n * `title`, which still provides the panel's accessible name.\r\n *\r\n * @example\r\n * <fui-side-panel title=\"Details\">\r\n * <span fuiSidePanelTitle>Custom <em>title</em> markup</span>\r\n * </fui-side-panel>\r\n */\r\n@Directive({\r\n selector: '[fuiSidePanelTitle]',\r\n standalone: true,\r\n host: {\r\n class: 'fui-side-panel__title-slot',\r\n },\r\n})\r\nexport class FuiSidePanelTitle {}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n contentChild,\r\n effect,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n output,\r\n Signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiSidePanelIntl } from './side-panel.intl';\r\nimport { FuiSidePanelTitle } from './side-panel-title.directive';\r\n\r\n/**\r\n * @component FuiSidePanelComponent\r\n * @selector fui-side-panel\r\n * @description A slide-in side panel overlay with optional backdrop, focus trapping, and keyboard dismiss.\r\n * Renders from the right edge of the viewport with configurable width and top offset.\r\n * A projected `fuiSidePanelTitle` element visually replaces the string `title` in the header;\r\n * the `title` input still provides the accessible name via `aria-label`.\r\n *\r\n * @input open - Whether the side panel is visible. Default false.\r\n * @input title - Title text displayed in the panel header.\r\n * @input width - CSS width of the panel. Default '500px'.\r\n * @input hasBackdrop - Whether to show a backdrop behind the panel. Default true.\r\n * @input topOffset - CSS top offset (e.g. to clear a fixed toolbar). Default '0px'.\r\n * @input ariaLabel - ARIA label for the panel when no visible title is present.\r\n * @input ariaLabelledBy - ID of an element that labels the panel.\r\n * @output closed - Emits when the panel requests closing (close button, Escape, or backdrop click).\r\n *\r\n * @cssvar --_side-panel-top-offset - Internal CSS variable set from the topOffset input.\r\n *\r\n * @example\r\n * <fui-side-panel [open]=\"isPanelOpen\" title=\"Details\" (closed)=\"isPanelOpen = false\">\r\n * <span fuiSidePanelTitle>Custom <em>title</em> markup</span>\r\n * <p>Panel content here.</p>\r\n * </fui-side-panel>\r\n */\r\n@Component({\r\n selector: 'fui-side-panel',\r\n standalone: true,\r\n imports: [FuiIconComponent],\r\n templateUrl: './side-panel.component.html',\r\n styleUrl: './side-panel.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-side-panel',\r\n '[class.fui-side-panel--open]': 'open()',\r\n '[class.fui-side-panel--no-backdrop]': '!hasBackdrop()',\r\n '[style.--_side-panel-top-offset]': 'topOffset()',\r\n },\r\n})\r\nexport class FuiSidePanelComponent {\r\n private readonly _document = inject(DOCUMENT);\r\n readonly intl = inject(FuiSidePanelIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n\r\n readonly open = input(false);\r\n readonly title = input('');\r\n readonly width = input('500px');\r\n readonly hasBackdrop = input(true);\r\n readonly topOffset = input('0px');\r\n\r\n /** ARIA label for the side panel, used when no visible title is present */\r\n readonly ariaLabel = input<string | null>(null);\r\n\r\n /** ID of an element that labels the side panel */\r\n readonly ariaLabelledBy = input<string | null>(null);\r\n\r\n readonly closed = output();\r\n\r\n // Projected title detection — true when a [fuiSidePanelTitle] element is provided.\r\n private readonly _projectedTitle = contentChild(FuiSidePanelTitle);\r\n readonly _hasProjectedTitle: Signal<boolean> = computed(() => !!this._projectedTitle());\r\n\r\n @ViewChild('panelElement', { static: false })\r\n private _panelElement?: ElementRef<HTMLElement>;\r\n\r\n private _previouslyFocusedElement: HTMLElement | null = null;\r\n\r\n constructor() {\r\n // Watch open state changes for focus management\r\n effect(() => {\r\n const isOpen = this.open();\r\n if (isOpen) {\r\n this._saveFocusAndTrap();\r\n } else {\r\n this._restoreFocus();\r\n }\r\n });\r\n\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this._cdr.markForCheck();\r\n });\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (!this.open()) return;\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n }\r\n\r\n // Focus trap cycling\r\n if (event.key === 'Tab') {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length === 0) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const firstFocusable = focusableElements[0];\r\n const lastFocusable = focusableElements[focusableElements.length - 1];\r\n const activeElement = this._document.activeElement;\r\n\r\n if (event.shiftKey) {\r\n if (activeElement === firstFocusable) {\r\n event.preventDefault();\r\n lastFocusable.focus();\r\n }\r\n } else {\r\n if (activeElement === lastFocusable) {\r\n event.preventDefault();\r\n firstFocusable.focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n close(): void {\r\n this.closed.emit();\r\n }\r\n\r\n private _saveFocusAndTrap(): void {\r\n this._previouslyFocusedElement = this._document.activeElement as HTMLElement;\r\n // Focus the panel after it renders\r\n setTimeout(() => {\r\n this._focusFirstTabbable();\r\n });\r\n }\r\n\r\n private _restoreFocus(): void {\r\n if (this._previouslyFocusedElement) {\r\n this._previouslyFocusedElement.focus();\r\n this._previouslyFocusedElement = null;\r\n }\r\n }\r\n\r\n private _focusFirstTabbable(): void {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length > 0) {\r\n focusableElements[0].focus();\r\n } else {\r\n this._panelElement?.nativeElement.focus();\r\n }\r\n }\r\n\r\n private _getFocusableElements(): HTMLElement[] {\r\n const panel = this._panelElement?.nativeElement;\r\n if (!panel) return [];\r\n\r\n const selectors = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'input:not([disabled])',\r\n 'select:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable=\"true\"]',\r\n ].join(',');\r\n\r\n return Array.from(panel.querySelectorAll<HTMLElement>(selectors)).filter((el) => el.offsetParent !== null);\r\n }\r\n}\r\n","@if (open() && hasBackdrop()) {\r\n <div class=\"fui-side-panel__backdrop\" (click)=\"close()\" aria-hidden=\"true\"></div>\r\n}\r\n<div\r\n #panelElement\r\n class=\"fui-side-panel__panel\"\r\n [style.width]=\"width()\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"open() ? 'true' : null\"\r\n [attr.aria-label]=\"ariaLabel() || (!ariaLabelledBy() ? title() : null)\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\r\n tabindex=\"-1\"\r\n>\r\n <div class=\"fui-side-panel__header\">\r\n @if (_hasProjectedTitle()) {\r\n <span class=\"fui-side-panel__title\"><ng-content select=\"[fuiSidePanelTitle]\"></ng-content></span>\r\n } @else {\r\n <span class=\"fui-side-panel__title\">{{ title() }}</span>\r\n }\r\n <button type=\"button\" class=\"fui-side-panel__close\" (click)=\"close()\" [attr.aria-label]=\"intl.closeAriaLabel\">\r\n <fui-icon name=\"x\" size=\"sm\"></fui-icon>\r\n </button>\r\n </div>\r\n <div class=\"fui-side-panel__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"fui-side-panel__footer\">\r\n <ng-content select=\"[sidePanelFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|