@raintonic/formaui 0.9.0 → 0.9.2
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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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-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 +2 -2
- package/fesm2022/raintonic-formaui-components-form-field.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 +4 -4
- package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-side-panel.mjs +2 -2
- 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 +4 -4
- package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -1
- package/fesm2022/raintonic-formaui-components-toolbar.mjs +2 -2
- package/fesm2022/raintonic-formaui-components-toolbar.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.mjs +1 -1
- package/fesm2022/raintonic-formaui.mjs.map +1 -1
- package/llms-full.txt +8 -8
- package/package.json +1 -1
- package/styles/generated/_tokens.scss +8 -8
- package/styles/styles.css +8 -8
- package/types/raintonic-formaui.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-autocomplete.mjs","sources":["../../../lib/components/autocomplete/autocomplete.intl.ts","../../../lib/components/autocomplete/autocomplete.component.ts","../../../lib/components/autocomplete/autocomplete.component.html","../../../lib/components/autocomplete/raintonic-formaui-components-autocomplete.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiAutocompleteIntl extends FuiIntlBase {\r\n /** Placeholder text for the search input inside the panel. */\r\n searchPlaceholder = 'Search...';\r\n\r\n /** Aria label for the clear selection button. */\r\n clearSelectionAriaLabel = 'Clear selection';\r\n\r\n /** Text shown when the search filter has no matching options. */\r\n noResultsText = 'No results found';\r\n\r\n /** Announced via live region when panel opens, indicating how many results are available. */\r\n resultsAvailableText(count: number): string {\r\n return count === 1 ? '1 result available.' : `${count} results available.`;\r\n }\r\n}\r\n","import {\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 InjectionToken,\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\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 { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiFormFieldComponent, FuiPrefixDirective } from '@raintonic/formaui/components/form-field';\r\nimport { FuiInputDirective } from '@raintonic/formaui/components/input';\r\nimport {\r\n FUI_FORM_FIELD_CONTROL,\r\n FuiFormFieldControl,\r\n ErrorStateMatcher,\r\n syncMultiOptions,\r\n computeMultiDisplayValue,\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 noop,\r\n} from '@raintonic/formaui/core';\r\nimport { FUI_FORM_FIELD } from '@raintonic/formaui/components/form-field';\r\nimport { FuiOptionBase, FUI_OPTION } from '@raintonic/formaui/components/select';\r\nimport { FUI_SELECT, FuiSelectParent } from '@raintonic/formaui/components/select';\r\nimport { FuiAutocompleteIntl } from './autocomplete.intl';\r\n\r\n/**\r\n * Selection change event object emitted when the autocomplete's selection changes\r\n */\r\nexport interface FuiAutocompleteChange<T = unknown> {\r\n source: FuiAutocompleteComponent<T>;\r\n value: T | T[] | null;\r\n}\r\n\r\nexport const FUI_AUTOCOMPLETE = new InjectionToken<FuiAutocompleteComponent>('FUI_AUTOCOMPLETE');\r\n\r\n/**\r\n * # fui-autocomplete Component\r\n *\r\n * An autocomplete component that works inside fui-form-field.\r\n * Options are content-projected as `<fui-option>` children — same API as `<fui-select>`.\r\n * Search filtering is always enabled, CSS-hiding non-matching options.\r\n *\r\n * ## Features\r\n * - Content-projected `<fui-option>` children matching the `<fui-select>` API\r\n * - Built-in search filtering — CSS-hides non-matching options\r\n * - Single and multiple selection\r\n * - Full keyboard navigation\r\n * - Full Reactive Forms integration\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Autocomplete\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Framework</label>\r\n * <fui-autocomplete placeholder=\"Select a framework\" formControlName=\"framework\">\r\n * @for (fw of frameworks; track fw) {\r\n * <fui-option [value]=\"fw\">{{ fw.label }}</fui-option>\r\n * }\r\n * </fui-autocomplete>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### Multiple Selection\r\n * ```html\r\n * <fui-autocomplete [multiple]=\"true\" placeholder=\"Select tags\" formControlName=\"tags\">\r\n * @for (tag of tags; track tag) {\r\n * <fui-option [value]=\"tag\">{{ tag }}</fui-option>\r\n * }\r\n * </fui-autocomplete>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-autocomplete',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, FuiIconComponent, FuiFormFieldComponent, FuiInputDirective, FuiPrefixDirective],\r\n templateUrl: './autocomplete.component.html',\r\n styleUrls: ['./autocomplete.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-autocomplete',\r\n '[attr.id]': 'id',\r\n '[class.fui-autocomplete--open]': 'panelOpen()',\r\n '[class.fui-autocomplete--disabled]': 'disabled()',\r\n '[class.fui-autocomplete--focused]': 'focused()',\r\n '[class.fui-autocomplete--error]': 'errorState()',\r\n '[class.fui-autocomplete--readonly]': 'readonly()',\r\n '[class.fui-autocomplete--multiple]': 'multiple()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiAutocompleteComponent,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiAutocompleteComponent,\r\n },\r\n {\r\n provide: FUI_AUTOCOMPLETE,\r\n useExisting: FuiAutocompleteComponent,\r\n },\r\n {\r\n provide: FUI_SELECT,\r\n useExisting: FuiAutocompleteComponent,\r\n },\r\n ],\r\n})\r\nexport class FuiAutocompleteComponent<T = unknown>\r\n implements ControlValueAccessor, FuiFormFieldControl, FuiSelectParent, AfterViewInit, OnDestroy\r\n{\r\n static nextId = 0;\r\n readonly controlType = 'fui-autocomplete';\r\n\r\n // Injected dependencies\r\n private readonly _popup = inject(FuiPopupOverlayDirective);\r\n private readonly _formSync = inject(FuiFormControlSyncDirective);\r\n private readonly _parentFormField = inject(FUI_FORM_FIELD, { optional: true });\r\n readonly intl = inject(FuiAutocompleteIntl);\r\n\r\n // --- Inputs ---\r\n readonly placeholderInput = input('', { alias: 'placeholder' });\r\n readonly disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });\r\n readonly readonlyInput = input(false, { alias: 'readonly', transform: booleanAttribute });\r\n readonly multiple = 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 = input<ErrorStateMatcher | null>(null);\r\n\r\n // --- Outputs ---\r\n readonly valueChange: OutputEmitterRef<T | T[] | null> = output<T | T[] | null>();\r\n readonly selectionChange: OutputEmitterRef<FuiAutocompleteChange<T>> = output<FuiAutocompleteChange<T>>();\r\n readonly openedChange: OutputEmitterRef<boolean> = output<boolean>();\r\n readonly searchChange: OutputEmitterRef<string> = output<string>();\r\n\r\n // --- Internal state ---\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 private readonly _readOnly: WritableSignal<boolean> = signal(false);\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-autocomplete-${FuiAutocompleteComponent.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\r\n private readonly _ngControlRef = injectNgControl();\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n // Computed interface properties\r\n readonly placeholder = computed(() => this.placeholderInput());\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n readonly required = this._required;\r\n readonly value = this._value;\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() || this._readOnly());\r\n readonly empty = computed(() => isEmpty(this._value()));\r\n readonly id = this._uid;\r\n\r\n // --- View refs ---\r\n @ViewChild('trigger', { static: false }) trigger?: ElementRef<HTMLDivElement>;\r\n @ViewChild('panel', { static: true }) panel?: ElementRef<HTMLDivElement>;\r\n @ViewChild('searchInput', { static: false }) searchInput?: ElementRef<HTMLElement>;\r\n\r\n // --- Content-projected options ---\r\n readonly options = contentChildren(FUI_OPTION, { descendants: true });\r\n\r\n // --- Panel state ---\r\n readonly panelOpen = computed(() => this._popup.panelOpen());\r\n\r\n // --- Search ---\r\n readonly searchTerm: WritableSignal<string> = signal('');\r\n\r\n // --- Active option index ---\r\n readonly activeIndex: WritableSignal<number> = signal(-1);\r\n\r\n // --- Visible (not filtered-out) options — single source of truth for search filtering ---\r\n readonly _visibleOptions: Signal<readonly FuiOptionBase[]> = computed(() => {\r\n const term = this.searchTerm();\r\n const opts = this.options();\r\n if (!term.trim()) {\r\n return opts;\r\n }\r\n const lower = term.toLowerCase().trim();\r\n return opts.filter((o) => o.getLabel().toLowerCase().includes(lower));\r\n });\r\n\r\n readonly _visibleOptionCount: Signal<number> = computed(() => this._visibleOptions().length);\r\n\r\n // --- Live announcement ---\r\n readonly _liveAnnouncement: WritableSignal<string> = signal('');\r\n\r\n // --- ControlValueAccessor callbacks ---\r\n private _onChange = noop;\r\n private _onTouched = noop;\r\n\r\n // --- Computed ---\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 // State changes effect\r\n effect(() => {\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 this.stateChanges.next();\r\n });\r\n\r\n // Sync option states when value or options change\r\n effect(() => {\r\n syncMultiOptions(this);\r\n this.stateChanges.next();\r\n });\r\n\r\n // Sync DOM visibility to match _visibleOptions computed signal\r\n // One-way sync: computed signal is the source of truth, DOM is updated to match\r\n effect(() => {\r\n const term = this.searchTerm();\r\n const opts = this.options();\r\n const visible = this._visibleOptions();\r\n const visibleSet = new Set(visible);\r\n for (const opt of opts) {\r\n opt._getHostElement().style.display = visibleSet.has(opt) ? '' : 'none';\r\n }\r\n });\r\n\r\n // Announce visible results count when search term or panel state changes\r\n effect(() => {\r\n const term = this.searchTerm();\r\n const visible = this._visibleOptions();\r\n const isOpen = this._popup.panelOpen();\r\n // Only announce when the panel is open and search filtering is active\r\n if (isOpen && term.trim()) {\r\n this._announce(this.intl.resultsAvailableText(visible.length));\r\n }\r\n });\r\n\r\n // Focus management: move focus to search input when panel opens\r\n let _panelInitialized = false;\r\n effect(() => {\r\n const isOpen = this._popup.panelOpen();\r\n if (!_panelInitialized) {\r\n _panelInitialized = true;\r\n return;\r\n }\r\n if (isOpen) {\r\n queueMicrotask(() => {\r\n this.searchInput?.nativeElement.focus();\r\n });\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._popup.setTrigger(this.trigger ?? null);\r\n this._popup.setPanel(this.panel ?? null);\r\n this._popup.panelClass.set(['fui-autocomplete-overlay-panel']);\r\n this._popup.backdropClass.set('fui-autocomplete-backdrop');\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: 16,\r\n },\r\n ]);\r\n\r\n if (this._parentFormField) {\r\n this._popup.widthElement.set(this._parentFormField.getConnectedOverlayOrigin());\r\n }\r\n\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 ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // --- ControlValueAccessor ---\r\n writeValue(value: unknown): void {\r\n this._value.set(value ?? null);\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // --- FuiFormFieldControl ---\r\n onContainerClick(_event: MouseEvent): void {\r\n if (this.disabled()) return;\r\n if (this.multiple() && this.panelOpen()) return;\r\n this.toggle();\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\r\n }\r\n\r\n setReadOnly(readOnly: boolean): void {\r\n this._readOnly.set(readOnly);\r\n }\r\n\r\n // --- Public API ---\r\n\r\n /** Clears the current value. */\r\n clear(event: Event): void {\r\n event.stopPropagation();\r\n this._value.set(null);\r\n this._onChange(null);\r\n this.valueChange.emit(null);\r\n this.selectionChange.emit({ source: this, value: null });\r\n this.stateChanges.next();\r\n }\r\n\r\n focus(): void {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n\r\n blur(): void {\r\n this.trigger?.nativeElement.blur();\r\n }\r\n\r\n /** Opens the panel. */\r\n open(): void {\r\n if (this.disabled() || this.readonly() || this._popup.panelOpen()) return;\r\n this._focused.set(true);\r\n this.searchTerm.set('');\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 // Announce how many results are available\r\n this._announce(this.intl.resultsAvailableText(this.options().length));\r\n }\r\n }\r\n\r\n /** Closes the panel. */\r\n close(restoreFocus = true): void {\r\n if (!this._popup.panelOpen()) return;\r\n this._focused.set(false);\r\n this.activeIndex.set(-1);\r\n this.searchTerm.set('');\r\n this._onTouched();\r\n this._popup.close();\r\n this.openedChange.emit(false);\r\n if (restoreFocus) {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n }\r\n\r\n /** Toggles the panel. */\r\n toggle(): void {\r\n if (this.disabled() || this.readonly()) return;\r\n this._popup.toggle();\r\n }\r\n\r\n // --- Selection ---\r\n\r\n /**\r\n * Called by fui-option via FUI_SELECT._onOptionSelected.\r\n * Implements FuiSelectParent.\r\n */\r\n _onOptionSelected(option: FuiOptionBase): void {\r\n const result = applyOptionSelection(this, option);\r\n const newValue = result.newValue as T | T[] | null;\r\n\r\n this._value.set(newValue);\r\n this._onChange(newValue);\r\n this.valueChange.emit(newValue);\r\n this.selectionChange.emit({ source: this, value: newValue });\r\n 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 // --- Search ---\r\n\r\n onSearchInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n const term = target.value;\r\n this.searchTerm.set(term);\r\n this.searchChange.emit(term);\r\n\r\n // Reset active index to first visible enabled option\r\n const enabled = getEnabledOptions(this._visibleOptions());\r\n this.activeIndex.set(enabled.length > 0 ? 0 : -1);\r\n }\r\n\r\n // --- Keyboard Navigation ---\r\n\r\n /** Entry point for trigger keydown */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n if (!this.panelOpen()) {\r\n this._handleClosedKeydown(event);\r\n } else {\r\n this._handlePanelKeydown(event);\r\n }\r\n }\r\n\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n switch (event.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 }\r\n }\r\n\r\n /** Handle keydown inside the panel (search input or item list) */\r\n _handlePanelKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n const opts = this._getVisibleEnabledOptions();\r\n const activeIdx = this.activeIndex();\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(computeNextActiveOptionIndex(opts.length, activeIdx, 1));\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(computeNextActiveOptionIndex(opts.length, activeIdx, -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, activeIdx, 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, activeIdx, -1));\r\n }\r\n break;\r\n case 'Enter':\r\n event.preventDefault();\r\n if (activeIdx >= 0 && activeIdx < opts.length) {\r\n this._onOptionSelected(opts[activeIdx]);\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 this.close();\r\n break;\r\n }\r\n }\r\n\r\n private _setActiveOptionIndex(index: number): void {\r\n const opts = this._getVisibleEnabledOptions();\r\n if (index < 0 || index >= opts.length) return;\r\n\r\n // Deactivate all visible options\r\n this.options().forEach((opt) => {\r\n opt.setInactive();\r\n });\r\n\r\n const activeOption = opts[index];\r\n activeOption.setActive();\r\n this.activeIndex.set(index);\r\n scrollOptionIntoView(activeOption._getHostElement(), this.panel?.nativeElement, '.fui-autocomplete__options');\r\n\r\n // Announce active item\r\n const label = activeOption.getLabel();\r\n this._announce(`${label}, ${index + 1} of ${opts.length}`);\r\n }\r\n\r\n private _setInitialActiveOption(): void {\r\n const opts = this._getVisibleEnabledOptions();\r\n if (opts.length === 0) {\r\n this.activeIndex.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 private _scrollToActiveOption(): void {\r\n const opts = this._getVisibleEnabledOptions();\r\n const activeIdx = this.activeIndex();\r\n if (activeIdx < 0 || activeIdx >= opts.length) return;\r\n scrollOptionIntoView(opts[activeIdx]._getHostElement(), this.panel?.nativeElement, '.fui-autocomplete__options');\r\n }\r\n\r\n /** Get visible (non-hidden) enabled options for keyboard navigation */\r\n private _getVisibleEnabledOptions(): FuiOptionBase[] {\r\n return getEnabledOptions(this._visibleOptions());\r\n }\r\n\r\n /** aria-activedescendant */\r\n _getActiveDescendant(): string | null {\r\n const opts = this._getVisibleEnabledOptions();\r\n return computeActiveDescendant(opts, this.activeIndex());\r\n }\r\n\r\n // --- Announcement ---\r\n\r\n private _announce(message: string): void {\r\n announceMessage(this._liveAnnouncement, message);\r\n }\r\n}\r\n","<!-- Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-autocomplete__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n 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 aria-autocomplete=\"list\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n>\r\n <span class=\"fui-autocomplete__value\">\r\n @if (empty()) {\r\n <span class=\"fui-autocomplete__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-autocomplete__value-text\">{{ displayValue() }}</span>\r\n }\r\n </span>\r\n\r\n @if (!readonly() && !disabled()) {\r\n @if (!empty()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-autocomplete__clear\"\r\n role=\"button\"\r\n [attr.aria-label]=\"intl.clearSelectionAriaLabel\"\r\n (click)=\"clear($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\r\n <path\r\n d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n\r\n <span class=\"fui-autocomplete__arrow\" [class.fui-autocomplete__arrow--open]=\"panelOpen()\" 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 so #panel ViewChild is always available) -->\r\n<div #panel [hidden]=\"false\" [id]=\"id + '-panel'\" class=\"fui-autocomplete__panel\">\r\n <!-- Search Input -->\r\n <div class=\"fui-autocomplete__search-input\">\r\n <fui-form-field hideSubscript>\r\n <fui-icon fuiPrefix name=\"magnifying-glass\" size=\"sm\" />\r\n <input\r\n #searchInput\r\n fuiInput\r\n type=\"text\"\r\n [placeholder]=\"intl.searchPlaceholder\"\r\n [value]=\"searchTerm()\"\r\n autocomplete=\"off\"\r\n role=\"searchbox\"\r\n aria-label=\"Search\"\r\n (input)=\"onSearchInput($event)\"\r\n (keydown)=\"_handlePanelKeydown($event)\"\r\n />\r\n </fui-form-field>\r\n </div>\r\n\r\n <!-- Options List -->\r\n <div\r\n class=\"fui-autocomplete__options\"\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\r\n <!-- No results empty state when search has no matching options -->\r\n @if (searchTerm() && _visibleOptions().length === 0) {\r\n <div class=\"fui-autocomplete__no-results\" role=\"status\">\r\n {{ intl.noResultsText }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Panel Actions (e.g., Add new option, Refresh) -->\r\n <div class=\"fui-autocomplete__panel-actions\">\r\n <ng-content select=\"[fuiAutocompletePanelActions]\"></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-autocomplete.mjs","sources":["../../../lib/components/autocomplete/autocomplete.intl.ts","../../../lib/components/autocomplete/autocomplete.component.ts","../../../lib/components/autocomplete/autocomplete.component.html","../../../lib/components/autocomplete/raintonic-formaui-components-autocomplete.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiAutocompleteIntl extends FuiIntlBase {\r\n /** Placeholder text for the search input inside the panel. */\r\n searchPlaceholder = 'Search...';\r\n\r\n /** Aria label for the clear selection button. */\r\n clearSelectionAriaLabel = 'Clear selection';\r\n\r\n /** Text shown when the search filter has no matching options. */\r\n noResultsText = 'No results found';\r\n\r\n /** Announced via live region when panel opens, indicating how many results are available. */\r\n resultsAvailableText(count: number): string {\r\n return count === 1 ? '1 result available.' : `${count} results available.`;\r\n }\r\n}\r\n","import {\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 InjectionToken,\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\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 { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiFormFieldComponent, FuiPrefixDirective } from '@raintonic/formaui/components/form-field';\r\nimport { FuiInputDirective } from '@raintonic/formaui/components/input';\r\nimport {\r\n FUI_FORM_FIELD_CONTROL,\r\n FuiFormFieldControl,\r\n ErrorStateMatcher,\r\n syncMultiOptions,\r\n computeMultiDisplayValue,\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 noop,\r\n} from '@raintonic/formaui/core';\r\nimport { FUI_FORM_FIELD } from '@raintonic/formaui/components/form-field';\r\nimport { FuiOptionBase, FUI_OPTION } from '@raintonic/formaui/components/select';\r\nimport { FUI_SELECT, FuiSelectParent } from '@raintonic/formaui/components/select';\r\nimport { FuiAutocompleteIntl } from './autocomplete.intl';\r\n\r\n/**\r\n * Selection change event object emitted when the autocomplete's selection changes\r\n */\r\nexport interface FuiAutocompleteChange<T = unknown> {\r\n source: FuiAutocompleteComponent<T>;\r\n value: T | T[] | null;\r\n}\r\n\r\nexport const FUI_AUTOCOMPLETE = new InjectionToken<FuiAutocompleteComponent>('FUI_AUTOCOMPLETE');\r\n\r\n/**\r\n * # fui-autocomplete Component\r\n *\r\n * An autocomplete component that works inside fui-form-field.\r\n * Options are content-projected as `<fui-option>` children — same API as `<fui-select>`.\r\n * Search filtering is always enabled, CSS-hiding non-matching options.\r\n *\r\n * ## Features\r\n * - Content-projected `<fui-option>` children matching the `<fui-select>` API\r\n * - Built-in search filtering — CSS-hides non-matching options\r\n * - Single and multiple selection\r\n * - Full keyboard navigation\r\n * - Full Reactive Forms integration\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Autocomplete\r\n * ```html\r\n * <fui-form-field>\r\n * <label>Framework</label>\r\n * <fui-autocomplete placeholder=\"Select a framework\" formControlName=\"framework\">\r\n * @for (fw of frameworks; track fw) {\r\n * <fui-option [value]=\"fw\">{{ fw.label }}</fui-option>\r\n * }\r\n * </fui-autocomplete>\r\n * </fui-form-field>\r\n * ```\r\n *\r\n * ### Multiple Selection\r\n * ```html\r\n * <fui-autocomplete [multiple]=\"true\" placeholder=\"Select tags\" formControlName=\"tags\">\r\n * @for (tag of tags; track tag) {\r\n * <fui-option [value]=\"tag\">{{ tag }}</fui-option>\r\n * }\r\n * </fui-autocomplete>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-autocomplete',\r\n standalone: true,\r\n imports: [ReactiveFormsModule, FuiIconComponent, FuiFormFieldComponent, FuiInputDirective, FuiPrefixDirective],\r\n templateUrl: './autocomplete.component.html',\r\n styleUrls: ['./autocomplete.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-autocomplete',\r\n '[attr.id]': 'id',\r\n '[class.fui-autocomplete--open]': 'panelOpen()',\r\n '[class.fui-autocomplete--disabled]': 'disabled()',\r\n '[class.fui-autocomplete--focused]': 'focused()',\r\n '[class.fui-autocomplete--error]': 'errorState()',\r\n '[class.fui-autocomplete--readonly]': 'readonly()',\r\n '[class.fui-autocomplete--multiple]': 'multiple()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiAutocompleteComponent,\r\n multi: true,\r\n },\r\n {\r\n provide: FUI_FORM_FIELD_CONTROL,\r\n useExisting: FuiAutocompleteComponent,\r\n },\r\n {\r\n provide: FUI_AUTOCOMPLETE,\r\n useExisting: FuiAutocompleteComponent,\r\n },\r\n {\r\n provide: FUI_SELECT,\r\n useExisting: FuiAutocompleteComponent,\r\n },\r\n ],\r\n})\r\nexport class FuiAutocompleteComponent<T = unknown>\r\n implements ControlValueAccessor, FuiFormFieldControl, FuiSelectParent, AfterViewInit, OnDestroy\r\n{\r\n static nextId = 0;\r\n readonly controlType = 'fui-autocomplete';\r\n\r\n // Injected dependencies\r\n private readonly _popup = inject(FuiPopupOverlayDirective);\r\n private readonly _formSync = inject(FuiFormControlSyncDirective);\r\n private readonly _parentFormField = inject(FUI_FORM_FIELD, { optional: true });\r\n readonly intl = inject(FuiAutocompleteIntl);\r\n\r\n // --- Inputs ---\r\n readonly placeholderInput = input('', { alias: 'placeholder' });\r\n readonly disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });\r\n readonly readonlyInput = input(false, { alias: 'readonly', transform: booleanAttribute });\r\n readonly multiple = 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 = input<ErrorStateMatcher | null>(null);\r\n\r\n // --- Outputs ---\r\n readonly valueChange: OutputEmitterRef<T | T[] | null> = output<T | T[] | null>();\r\n readonly selectionChange: OutputEmitterRef<FuiAutocompleteChange<T>> = output<FuiAutocompleteChange<T>>();\r\n readonly openedChange: OutputEmitterRef<boolean> = output<boolean>();\r\n readonly searchChange: OutputEmitterRef<string> = output<string>();\r\n\r\n // --- Internal state ---\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 private readonly _readOnly: WritableSignal<boolean> = signal(false);\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-autocomplete-${FuiAutocompleteComponent.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\r\n private readonly _ngControlRef = injectNgControl();\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n // Computed interface properties\r\n readonly placeholder = computed(() => this.placeholderInput());\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n readonly required = this._required;\r\n readonly value = this._value;\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() || this._readOnly());\r\n readonly empty = computed(() => isEmpty(this._value()));\r\n readonly id = this._uid;\r\n\r\n // --- View refs ---\r\n @ViewChild('trigger', { static: false }) trigger?: ElementRef<HTMLDivElement>;\r\n @ViewChild('panel', { static: true }) panel?: ElementRef<HTMLDivElement>;\r\n @ViewChild('searchInput', { static: false }) searchInput?: ElementRef<HTMLElement>;\r\n\r\n // --- Content-projected options ---\r\n readonly options = contentChildren(FUI_OPTION, { descendants: true });\r\n\r\n // --- Panel state ---\r\n readonly panelOpen = computed(() => this._popup.panelOpen());\r\n\r\n // --- Search ---\r\n readonly searchTerm: WritableSignal<string> = signal('');\r\n\r\n // --- Active option index ---\r\n readonly activeIndex: WritableSignal<number> = signal(-1);\r\n\r\n // --- Visible (not filtered-out) options — single source of truth for search filtering ---\r\n readonly _visibleOptions: Signal<readonly FuiOptionBase[]> = computed(() => {\r\n const term = this.searchTerm();\r\n const opts = this.options();\r\n if (!term.trim()) {\r\n return opts;\r\n }\r\n const lower = term.toLowerCase().trim();\r\n return opts.filter((o) => o.getLabel().toLowerCase().includes(lower));\r\n });\r\n\r\n readonly _visibleOptionCount: Signal<number> = computed(() => this._visibleOptions().length);\r\n\r\n // --- Live announcement ---\r\n readonly _liveAnnouncement: WritableSignal<string> = signal('');\r\n\r\n // --- ControlValueAccessor callbacks ---\r\n private _onChange = noop;\r\n private _onTouched = noop;\r\n\r\n // --- Computed ---\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 // State changes effect\r\n effect(() => {\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 this.stateChanges.next();\r\n });\r\n\r\n // Sync option states when value or options change\r\n effect(() => {\r\n syncMultiOptions(this);\r\n this.stateChanges.next();\r\n });\r\n\r\n // Sync DOM visibility to match _visibleOptions computed signal\r\n // One-way sync: computed signal is the source of truth, DOM is updated to match\r\n effect(() => {\r\n const term = this.searchTerm();\r\n const opts = this.options();\r\n const visible = this._visibleOptions();\r\n const visibleSet = new Set(visible);\r\n for (const opt of opts) {\r\n opt._getHostElement().style.display = visibleSet.has(opt) ? '' : 'none';\r\n }\r\n });\r\n\r\n // Announce visible results count when search term or panel state changes\r\n effect(() => {\r\n const term = this.searchTerm();\r\n const visible = this._visibleOptions();\r\n const isOpen = this._popup.panelOpen();\r\n // Only announce when the panel is open and search filtering is active\r\n if (isOpen && term.trim()) {\r\n this._announce(this.intl.resultsAvailableText(visible.length));\r\n }\r\n });\r\n\r\n // Focus management: move focus to search input when panel opens\r\n let _panelInitialized = false;\r\n effect(() => {\r\n const isOpen = this._popup.panelOpen();\r\n if (!_panelInitialized) {\r\n _panelInitialized = true;\r\n return;\r\n }\r\n if (isOpen) {\r\n queueMicrotask(() => {\r\n this.searchInput?.nativeElement.focus();\r\n });\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._popup.setTrigger(this.trigger ?? null);\r\n this._popup.setPanel(this.panel ?? null);\r\n this._popup.panelClass.set(['fui-autocomplete-overlay-panel']);\r\n this._popup.backdropClass.set('fui-autocomplete-backdrop');\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: 16,\r\n },\r\n ]);\r\n\r\n if (this._parentFormField) {\r\n this._popup.widthElement.set(this._parentFormField.getConnectedOverlayOrigin());\r\n }\r\n\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 ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // --- ControlValueAccessor ---\r\n writeValue(value: unknown): void {\r\n this._value.set(value ?? null);\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // --- FuiFormFieldControl ---\r\n onContainerClick(_event: MouseEvent): void {\r\n if (this.disabled()) return;\r\n if (this.multiple() && this.panelOpen()) return;\r\n this.toggle();\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n this._ariaDescribedby = ids.length ? ids.join(' ') : null;\r\n }\r\n\r\n setReadOnly(readOnly: boolean): void {\r\n this._readOnly.set(readOnly);\r\n }\r\n\r\n // --- Public API ---\r\n\r\n /** Clears the current value. */\r\n clear(event: Event): void {\r\n event.stopPropagation();\r\n this._value.set(null);\r\n this._onChange(null);\r\n this.valueChange.emit(null);\r\n this.selectionChange.emit({ source: this, value: null });\r\n this.stateChanges.next();\r\n }\r\n\r\n focus(): void {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n\r\n blur(): void {\r\n this.trigger?.nativeElement.blur();\r\n }\r\n\r\n /** Opens the panel. */\r\n open(): void {\r\n if (this.disabled() || this.readonly() || this._popup.panelOpen()) return;\r\n this._focused.set(true);\r\n this.searchTerm.set('');\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 // Announce how many results are available\r\n this._announce(this.intl.resultsAvailableText(this.options().length));\r\n }\r\n }\r\n\r\n /** Closes the panel. */\r\n close(restoreFocus = true): void {\r\n if (!this._popup.panelOpen()) return;\r\n this._focused.set(false);\r\n this.activeIndex.set(-1);\r\n this.searchTerm.set('');\r\n this._onTouched();\r\n this._popup.close();\r\n this.openedChange.emit(false);\r\n if (restoreFocus) {\r\n this.trigger?.nativeElement.focus();\r\n }\r\n }\r\n\r\n /** Toggles the panel. */\r\n toggle(): void {\r\n if (this.disabled() || this.readonly()) return;\r\n this._popup.toggle();\r\n }\r\n\r\n // --- Selection ---\r\n\r\n /**\r\n * Called by fui-option via FUI_SELECT._onOptionSelected.\r\n * Implements FuiSelectParent.\r\n */\r\n _onOptionSelected(option: FuiOptionBase): void {\r\n const result = applyOptionSelection(this, option);\r\n const newValue = result.newValue as T | T[] | null;\r\n\r\n this._value.set(newValue);\r\n this._onChange(newValue);\r\n this.valueChange.emit(newValue);\r\n this.selectionChange.emit({ source: this, value: newValue });\r\n 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 // --- Search ---\r\n\r\n onSearchInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n const term = target.value;\r\n this.searchTerm.set(term);\r\n this.searchChange.emit(term);\r\n\r\n // Reset active index to first visible enabled option\r\n const enabled = getEnabledOptions(this._visibleOptions());\r\n this.activeIndex.set(enabled.length > 0 ? 0 : -1);\r\n }\r\n\r\n // --- Keyboard Navigation ---\r\n\r\n /** Entry point for trigger keydown */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n if (!this.panelOpen()) {\r\n this._handleClosedKeydown(event);\r\n } else {\r\n this._handlePanelKeydown(event);\r\n }\r\n }\r\n\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n switch (event.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 }\r\n }\r\n\r\n /** Handle keydown inside the panel (search input or item list) */\r\n _handlePanelKeydown(event: KeyboardEvent): void {\r\n if (this.disabled()) return;\r\n\r\n const opts = this._getVisibleEnabledOptions();\r\n const activeIdx = this.activeIndex();\r\n\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(computeNextActiveOptionIndex(opts.length, activeIdx, 1));\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this._setActiveOptionIndex(computeNextActiveOptionIndex(opts.length, activeIdx, -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, activeIdx, 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, activeIdx, -1));\r\n }\r\n break;\r\n case 'Enter':\r\n event.preventDefault();\r\n if (activeIdx >= 0 && activeIdx < opts.length) {\r\n this._onOptionSelected(opts[activeIdx]);\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 this.close();\r\n break;\r\n }\r\n }\r\n\r\n private _setActiveOptionIndex(index: number): void {\r\n const opts = this._getVisibleEnabledOptions();\r\n if (index < 0 || index >= opts.length) return;\r\n\r\n // Deactivate all visible options\r\n this.options().forEach((opt) => {\r\n opt.setInactive();\r\n });\r\n\r\n const activeOption = opts[index];\r\n activeOption.setActive();\r\n this.activeIndex.set(index);\r\n scrollOptionIntoView(activeOption._getHostElement(), this.panel?.nativeElement, '.fui-autocomplete__options');\r\n\r\n // Announce active item\r\n const label = activeOption.getLabel();\r\n this._announce(`${label}, ${index + 1} of ${opts.length}`);\r\n }\r\n\r\n private _setInitialActiveOption(): void {\r\n const opts = this._getVisibleEnabledOptions();\r\n if (opts.length === 0) {\r\n this.activeIndex.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 private _scrollToActiveOption(): void {\r\n const opts = this._getVisibleEnabledOptions();\r\n const activeIdx = this.activeIndex();\r\n if (activeIdx < 0 || activeIdx >= opts.length) return;\r\n scrollOptionIntoView(opts[activeIdx]._getHostElement(), this.panel?.nativeElement, '.fui-autocomplete__options');\r\n }\r\n\r\n /** Get visible (non-hidden) enabled options for keyboard navigation */\r\n private _getVisibleEnabledOptions(): FuiOptionBase[] {\r\n return getEnabledOptions(this._visibleOptions());\r\n }\r\n\r\n /** aria-activedescendant */\r\n _getActiveDescendant(): string | null {\r\n const opts = this._getVisibleEnabledOptions();\r\n return computeActiveDescendant(opts, this.activeIndex());\r\n }\r\n\r\n // --- Announcement ---\r\n\r\n private _announce(message: string): void {\r\n announceMessage(this._liveAnnouncement, message);\r\n }\r\n}\r\n","<!-- Trigger -->\r\n<div\r\n #trigger\r\n [id]=\"id\"\r\n class=\"fui-autocomplete__trigger\"\r\n [attr.tabindex]=\"disabled() ? -1 : 0\"\r\n 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 aria-autocomplete=\"list\"\r\n [attr.aria-activedescendant]=\"panelOpen() ? _getActiveDescendant() : null\"\r\n [attr.aria-controls]=\"panelOpen() ? id + '-panel' : null\"\r\n (keydown)=\"_handleKeydown($event)\"\r\n>\r\n <span class=\"fui-autocomplete__value\">\r\n @if (empty()) {\r\n <span class=\"fui-autocomplete__placeholder\">{{ placeholder() }}</span>\r\n } @else {\r\n <span class=\"fui-autocomplete__value-text\">{{ displayValue() }}</span>\r\n }\r\n </span>\r\n\r\n @if (!readonly() && !disabled()) {\r\n @if (!empty()) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-autocomplete__clear\"\r\n role=\"button\"\r\n [attr.aria-label]=\"intl.clearSelectionAriaLabel\"\r\n (click)=\"clear($event)\"\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\r\n <path\r\n d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\"\r\n />\r\n </svg>\r\n </button>\r\n }\r\n\r\n <span class=\"fui-autocomplete__arrow\" [class.fui-autocomplete__arrow--open]=\"panelOpen()\" 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 so #panel ViewChild is always available) -->\r\n<div #panel [hidden]=\"false\" [id]=\"id + '-panel'\" class=\"fui-autocomplete__panel\">\r\n <!-- Search Input -->\r\n <div class=\"fui-autocomplete__search-input\">\r\n <fui-form-field hideSubscript>\r\n <fui-icon fuiPrefix name=\"magnifying-glass\" size=\"sm\" />\r\n <input\r\n #searchInput\r\n fuiInput\r\n type=\"text\"\r\n [placeholder]=\"intl.searchPlaceholder\"\r\n [value]=\"searchTerm()\"\r\n autocomplete=\"off\"\r\n role=\"searchbox\"\r\n aria-label=\"Search\"\r\n (input)=\"onSearchInput($event)\"\r\n (keydown)=\"_handlePanelKeydown($event)\"\r\n />\r\n </fui-form-field>\r\n </div>\r\n\r\n <!-- Options List -->\r\n <div\r\n class=\"fui-autocomplete__options\"\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\r\n <!-- No results empty state when search has no matching options -->\r\n @if (searchTerm() && _visibleOptions().length === 0) {\r\n <div class=\"fui-autocomplete__no-results\" role=\"status\">\r\n {{ intl.noResultsText }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Panel Actions (e.g., Add new option, Refresh) -->\r\n <div class=\"fui-autocomplete__panel-actions\">\r\n <ng-content select=\"[fuiAutocompletePanelActions]\"></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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"}
|
|
@@ -52,11 +52,11 @@ class FuiAvatarComponent {
|
|
|
52
52
|
return this.alt() ?? (this.fullName() ? `Avatar for ${this.fullName()}` : 'User avatar');
|
|
53
53
|
}, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
54
54
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
55
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiAvatarComponent, isStandalone: true, selector: "fui-avatar", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fullName: { classPropertyName: "fullName", publicName: "fullName", isSignal: true, isRequired: true, transformFunction: null }, initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"fui-avatar\" [style.--fui-avatar-size.px]=\"pixelSize()\" [style.font-size.px]=\"fontSize()\">\r\n <div class=\"fui-avatar__initials\" role=\"img\" [attr.aria-label]=\"ariaLabel()\" [fuiTooltip]=\"fullName()\">\r\n {{ _initials() }}\r\n </div>\r\n\r\n <ng-content select=\"[avatar-badge]\"></ng-content>\r\n</div>\r\n", styles: [":host{display:flex}.fui-avatar{--fui-avatar-size:
|
|
55
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiAvatarComponent, isStandalone: true, selector: "fui-avatar", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fullName: { classPropertyName: "fullName", publicName: "fullName", isSignal: true, isRequired: true, transformFunction: null }, initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"fui-avatar\" [style.--fui-avatar-size.px]=\"pixelSize()\" [style.font-size.px]=\"fontSize()\">\r\n <div class=\"fui-avatar__initials\" role=\"img\" [attr.aria-label]=\"ariaLabel()\" [fuiTooltip]=\"fullName()\">\r\n {{ _initials() }}\r\n </div>\r\n\r\n <ng-content select=\"[avatar-badge]\"></ng-content>\r\n</div>\r\n", styles: [":host{display:flex}.fui-avatar{--fui-avatar-size: 40px;--fui-avatar-border-radius: var(--fui-radius-pill);--fui-avatar-border-color: var(--fui-border-default);contain:content;inline-size:var(--fui-avatar-size);block-size:var(--fui-avatar-size);position:relative;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--fui-avatar-border-radius);overflow:hidden;flex-shrink:0}.fui-avatar__initials{inline-size:100%;block-size:100%;display:grid;place-items:center;color:var(--fui-text-primary);font-weight:var(--fui-weight-medium);text-transform:uppercase;background-color:var(--fui-primary-muted)}.fui-avatar ::ng-deep [avatar-badge]{position:absolute;inset-inline-end:-2px;inset-block-end:-2px;transform:translate(0)}\n"], dependencies: [{ kind: "directive", type: FuiTooltipDirective, selector: "[fuiTooltip]", inputs: ["fuiTooltip", "fuiTooltipPosition", "fuiTooltipSize", "fuiTooltipTrigger", "fuiTooltipShowDelay", "fuiTooltipHideDelay", "fuiTooltipDisabled", "fuiTooltipMaxWidth", "fuiTooltipOffset", "fuiTooltipArrow", "fuiTooltipShow"], exportAs: ["fuiTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
56
56
|
}
|
|
57
57
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiAvatarComponent, decorators: [{
|
|
58
58
|
type: Component,
|
|
59
|
-
args: [{ selector: 'fui-avatar', standalone: true, imports: [FuiTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"fui-avatar\" [style.--fui-avatar-size.px]=\"pixelSize()\" [style.font-size.px]=\"fontSize()\">\r\n <div class=\"fui-avatar__initials\" role=\"img\" [attr.aria-label]=\"ariaLabel()\" [fuiTooltip]=\"fullName()\">\r\n {{ _initials() }}\r\n </div>\r\n\r\n <ng-content select=\"[avatar-badge]\"></ng-content>\r\n</div>\r\n", styles: [":host{display:flex}.fui-avatar{--fui-avatar-size:
|
|
59
|
+
args: [{ selector: 'fui-avatar', standalone: true, imports: [FuiTooltipDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"fui-avatar\" [style.--fui-avatar-size.px]=\"pixelSize()\" [style.font-size.px]=\"fontSize()\">\r\n <div class=\"fui-avatar__initials\" role=\"img\" [attr.aria-label]=\"ariaLabel()\" [fuiTooltip]=\"fullName()\">\r\n {{ _initials() }}\r\n </div>\r\n\r\n <ng-content select=\"[avatar-badge]\"></ng-content>\r\n</div>\r\n", styles: [":host{display:flex}.fui-avatar{--fui-avatar-size: 40px;--fui-avatar-border-radius: var(--fui-radius-pill);--fui-avatar-border-color: var(--fui-border-default);contain:content;inline-size:var(--fui-avatar-size);block-size:var(--fui-avatar-size);position:relative;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--fui-avatar-border-radius);overflow:hidden;flex-shrink:0}.fui-avatar__initials{inline-size:100%;block-size:100%;display:grid;place-items:center;color:var(--fui-text-primary);font-weight:var(--fui-weight-medium);text-transform:uppercase;background-color:var(--fui-primary-muted)}.fui-avatar ::ng-deep [avatar-badge]{position:absolute;inset-inline-end:-2px;inset-block-end:-2px;transform:translate(0)}\n"] }]
|
|
60
60
|
}], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], fullName: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullName", required: true }] }], initials: [{ type: i0.Input, args: [{ isSignal: true, alias: "initials", required: false }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }] } });
|
|
61
61
|
|
|
62
62
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-avatar.mjs","sources":["../../../lib/components/avatar/avatar.component.ts","../../../lib/components/avatar/avatar.component.html","../../../lib/components/avatar/raintonic-formaui-components-avatar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, Signal } from '@angular/core';\r\nimport { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\n\r\nexport type FuiAvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\r\n\r\n/**\r\n * @component FuiAvatarComponent\r\n * @selector fui-avatar\r\n * @description Displays a user avatar with initials-only fallback (no image tag).\r\n * Shows computed initials from fullName with a tooltip on hover.\r\n *\r\n * @input size - Avatar size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' or a numeric pixel value. Default 'md'.\r\n * @input fullName - Required. Full name used to compute initials and tooltip.\r\n * @input initials - Optional override for the computed initials string.\r\n * @input alt - Custom aria-label override. Defaults to \"Avatar for {fullName}\".\r\n *\r\n * @example\r\n * <fui-avatar fullName=\"Jane Doe\" size=\"md\"></fui-avatar>\r\n */\r\n@Component({\r\n selector: 'fui-avatar',\r\n standalone: true,\r\n imports: [FuiTooltipDirective],\r\n templateUrl: './avatar.component.html',\r\n styleUrls: ['./avatar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FuiAvatarComponent {\r\n // Inputs (signals)\r\n readonly size = input<FuiAvatarSize | number>('md');\r\n readonly fullName = input.required<string>();\r\n readonly initials = input<string | undefined>();\r\n readonly alt = input<string | null>(null);\r\n\r\n // Derived values\r\n\r\n readonly _initials: Signal<string> = computed(() => {\r\n const override = this.initials();\r\n if (override) return override;\r\n\r\n const parts = this.fullName().split(' ').filter(Boolean);\r\n const name = parts[0];\r\n const surname = parts[1];\r\n if (!name) return '?';\r\n if (!surname) return name.slice(0, 2).toUpperCase();\r\n return (name[0] + surname[0]).toUpperCase();\r\n });\r\n\r\n readonly pixelSize: Signal<number> = computed(() => {\r\n const s = this.size();\r\n if (typeof s === 'number') return s;\r\n return { xs: 24, sm: 32, md: 40, lg: 48, xl: 56, '2xl': 64 }[s];\r\n });\r\n\r\n readonly fontSize: Signal<number> = computed(() => {\r\n const s = this.size();\r\n if (typeof s === 'number') return s;\r\n return { xs: 10, sm: 12, md: 14, lg: 16, xl: 20, '2xl': 24 }[s];\r\n });\r\n\r\n readonly ariaLabel: Signal<string> = computed(() => {\r\n return this.alt() ?? (this.fullName() ? `Avatar for ${this.fullName()}` : 'User avatar');\r\n });\r\n}\r\n","<div class=\"fui-avatar\" [style.--fui-avatar-size.px]=\"pixelSize()\" [style.font-size.px]=\"fontSize()\">\r\n <div class=\"fui-avatar__initials\" role=\"img\" [attr.aria-label]=\"ariaLabel()\" [fuiTooltip]=\"fullName()\">\r\n {{ _initials() }}\r\n </div>\r\n\r\n <ng-content select=\"[avatar-badge]\"></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-avatar.mjs","sources":["../../../lib/components/avatar/avatar.component.ts","../../../lib/components/avatar/avatar.component.html","../../../lib/components/avatar/raintonic-formaui-components-avatar.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, Signal } from '@angular/core';\r\nimport { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\n\r\nexport type FuiAvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\r\n\r\n/**\r\n * @component FuiAvatarComponent\r\n * @selector fui-avatar\r\n * @description Displays a user avatar with initials-only fallback (no image tag).\r\n * Shows computed initials from fullName with a tooltip on hover.\r\n *\r\n * @input size - Avatar size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' or a numeric pixel value. Default 'md'.\r\n * @input fullName - Required. Full name used to compute initials and tooltip.\r\n * @input initials - Optional override for the computed initials string.\r\n * @input alt - Custom aria-label override. Defaults to \"Avatar for {fullName}\".\r\n *\r\n * @example\r\n * <fui-avatar fullName=\"Jane Doe\" size=\"md\"></fui-avatar>\r\n */\r\n@Component({\r\n selector: 'fui-avatar',\r\n standalone: true,\r\n imports: [FuiTooltipDirective],\r\n templateUrl: './avatar.component.html',\r\n styleUrls: ['./avatar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FuiAvatarComponent {\r\n // Inputs (signals)\r\n readonly size = input<FuiAvatarSize | number>('md');\r\n readonly fullName = input.required<string>();\r\n readonly initials = input<string | undefined>();\r\n readonly alt = input<string | null>(null);\r\n\r\n // Derived values\r\n\r\n readonly _initials: Signal<string> = computed(() => {\r\n const override = this.initials();\r\n if (override) return override;\r\n\r\n const parts = this.fullName().split(' ').filter(Boolean);\r\n const name = parts[0];\r\n const surname = parts[1];\r\n if (!name) return '?';\r\n if (!surname) return name.slice(0, 2).toUpperCase();\r\n return (name[0] + surname[0]).toUpperCase();\r\n });\r\n\r\n readonly pixelSize: Signal<number> = computed(() => {\r\n const s = this.size();\r\n if (typeof s === 'number') return s;\r\n return { xs: 24, sm: 32, md: 40, lg: 48, xl: 56, '2xl': 64 }[s];\r\n });\r\n\r\n readonly fontSize: Signal<number> = computed(() => {\r\n const s = this.size();\r\n if (typeof s === 'number') return s;\r\n return { xs: 10, sm: 12, md: 14, lg: 16, xl: 20, '2xl': 24 }[s];\r\n });\r\n\r\n readonly ariaLabel: Signal<string> = computed(() => {\r\n return this.alt() ?? (this.fullName() ? `Avatar for ${this.fullName()}` : 'User avatar');\r\n });\r\n}\r\n","<div class=\"fui-avatar\" [style.--fui-avatar-size.px]=\"pixelSize()\" [style.font-size.px]=\"fontSize()\">\r\n <div class=\"fui-avatar__initials\" role=\"img\" [attr.aria-label]=\"ariaLabel()\" [fuiTooltip]=\"fullName()\">\r\n {{ _initials() }}\r\n </div>\r\n\r\n <ng-content select=\"[avatar-badge]\"></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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"}
|
|
@@ -101,7 +101,7 @@ class FuiBadgeComponent {
|
|
|
101
101
|
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
102
102
|
}
|
|
103
103
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
104
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiBadgeComponent, isStandalone: true, selector: "fui-badge", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, customColor: { classPropertyName: "customColor", publicName: "customColor", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status" }, properties: { "class": "computedClasses()", "style": "computedStyles()", "attr.aria-label": "ariaLabel() || null" } }, ngImport: i0, template: "<div class=\"fui-badge__content\">\r\n @if (icon()) {\r\n <fui-icon class=\"fui-badge__icon\" [name]=\"icon()!\" [size]=\"iconSize()\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"fui-badge__label\">{{ label() }}</span>\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)}}:host.fui-badge{--fui-badge-bg: transparent;--fui-badge-color: inherit;--fui-badge-font-size: var(--fui-text-sm);--fui-badge-font-weight: var(--fui-weight-medium);--fui-badge-border-radius: var(--fui-radius-pill);--fui-badge-gap: var(--fui-spacing-2);--fui-badge-height-sm: 1.25rem;--fui-badge-height-md: 1.5rem;--fui-badge-height-lg: 2rem;contain:content;display:inline-flex;align-items:center;justify-content:center;font-family:var(--fui-font-sans);font-size:var(--fui-badge-font-size);font-weight:var(--fui-badge-font-weight);border-radius:var(--fui-badge-border-radius);background-color:var(--fui-badge-bg);color:var(--fui-badge-color);white-space:nowrap;transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-badge .fui-badge__content{display:flex;align-items:center;gap:var(--fui-badge-gap)}:host.fui-badge .fui-badge__label{line-height:1}:host.fui-badge .fui-badge__icon{display:inline-flex;align-items:center;justify-content:center}:host.fui-badge--sm{height:var(--fui-badge-height-sm);padding:0 var(--fui-spacing-4);font-size:var(--fui-text-sm)}:host.fui-badge--md{height:var(--fui-badge-height-md);padding:0 var(--fui-spacing-6);font-size:var(--fui-text-base)}:host.fui-badge--lg{height:var(--fui-badge-height-lg);padding:0 var(--fui-spacing-7);font-size:var(--fui-text-md)}:host.fui-badge--primary{--fui-badge-bg: var(--fui-primary-20);--fui-badge-color: var(--fui-
|
|
104
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiBadgeComponent, isStandalone: true, selector: "fui-badge", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, customColor: { classPropertyName: "customColor", publicName: "customColor", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status" }, properties: { "class": "computedClasses()", "style": "computedStyles()", "attr.aria-label": "ariaLabel() || null" } }, ngImport: i0, template: "<div class=\"fui-badge__content\">\r\n @if (icon()) {\r\n <fui-icon class=\"fui-badge__icon\" [name]=\"icon()!\" [size]=\"iconSize()\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"fui-badge__label\">{{ label() }}</span>\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)}}:host.fui-badge{--fui-badge-bg: transparent;--fui-badge-color: inherit;--fui-badge-font-size: var(--fui-text-sm);--fui-badge-font-weight: var(--fui-weight-medium);--fui-badge-border-radius: var(--fui-radius-pill);--fui-badge-gap: var(--fui-spacing-2);--fui-badge-height-sm: 1.25rem;--fui-badge-height-md: 1.5rem;--fui-badge-height-lg: 2rem;contain:content;display:inline-flex;align-items:center;justify-content:center;font-family:var(--fui-font-sans);font-size:var(--fui-badge-font-size);font-weight:var(--fui-badge-font-weight);border-radius:var(--fui-badge-border-radius);background-color:var(--fui-badge-bg);color:var(--fui-badge-color);white-space:nowrap;transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-badge .fui-badge__content{display:flex;align-items:center;gap:var(--fui-badge-gap)}:host.fui-badge .fui-badge__label{line-height:1}:host.fui-badge .fui-badge__icon{display:inline-flex;align-items:center;justify-content:center}:host.fui-badge--sm{height:var(--fui-badge-height-sm);padding:0 var(--fui-spacing-4);font-size:var(--fui-text-sm)}:host.fui-badge--md{height:var(--fui-badge-height-md);padding:0 var(--fui-spacing-6);font-size:var(--fui-text-base)}:host.fui-badge--lg{height:var(--fui-badge-height-lg);padding:0 var(--fui-spacing-7);font-size:var(--fui-text-md)}:host.fui-badge--primary{--fui-badge-bg: var(--fui-primary-20);--fui-badge-color: var(--fui-primary-fg)}:host.fui-badge--secondary{--fui-badge-bg: var(--fui-neutral-20);--fui-badge-color: var(--fui-neutral-80)}:host.fui-badge--success{--fui-badge-bg: var(--fui-success-20);--fui-badge-color: var(--fui-success-80)}:host.fui-badge--info{--fui-badge-bg: var(--fui-info-20);--fui-badge-color: var(--fui-info-80)}:host.fui-badge--warning{--fui-badge-bg: var(--fui-warning-20);--fui-badge-color: var(--fui-warning-80)}:host.fui-badge--error{--fui-badge-bg: var(--fui-error-20);--fui-badge-color: var(--fui-error-80)}:host.fui-badge--custom{--fui-badge-bg: transparent;--fui-badge-color: inherit}@media(prefers-reduced-motion:reduce){:host.fui-badge{transition:none}}\n"], dependencies: [{ kind: "component", type: FuiIconComponent, selector: "fui-icon", inputs: ["name", "size", "weight", "color", "ariaLabel", "spin", "pulse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
105
105
|
}
|
|
106
106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiBadgeComponent, decorators: [{
|
|
107
107
|
type: Component,
|
|
@@ -110,7 +110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
110
110
|
'[style]': 'computedStyles()',
|
|
111
111
|
role: 'status',
|
|
112
112
|
'[attr.aria-label]': 'ariaLabel() || null',
|
|
113
|
-
}, template: "<div class=\"fui-badge__content\">\r\n @if (icon()) {\r\n <fui-icon class=\"fui-badge__icon\" [name]=\"icon()!\" [size]=\"iconSize()\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"fui-badge__label\">{{ label() }}</span>\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)}}:host.fui-badge{--fui-badge-bg: transparent;--fui-badge-color: inherit;--fui-badge-font-size: var(--fui-text-sm);--fui-badge-font-weight: var(--fui-weight-medium);--fui-badge-border-radius: var(--fui-radius-pill);--fui-badge-gap: var(--fui-spacing-2);--fui-badge-height-sm: 1.25rem;--fui-badge-height-md: 1.5rem;--fui-badge-height-lg: 2rem;contain:content;display:inline-flex;align-items:center;justify-content:center;font-family:var(--fui-font-sans);font-size:var(--fui-badge-font-size);font-weight:var(--fui-badge-font-weight);border-radius:var(--fui-badge-border-radius);background-color:var(--fui-badge-bg);color:var(--fui-badge-color);white-space:nowrap;transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-badge .fui-badge__content{display:flex;align-items:center;gap:var(--fui-badge-gap)}:host.fui-badge .fui-badge__label{line-height:1}:host.fui-badge .fui-badge__icon{display:inline-flex;align-items:center;justify-content:center}:host.fui-badge--sm{height:var(--fui-badge-height-sm);padding:0 var(--fui-spacing-4);font-size:var(--fui-text-sm)}:host.fui-badge--md{height:var(--fui-badge-height-md);padding:0 var(--fui-spacing-6);font-size:var(--fui-text-base)}:host.fui-badge--lg{height:var(--fui-badge-height-lg);padding:0 var(--fui-spacing-7);font-size:var(--fui-text-md)}:host.fui-badge--primary{--fui-badge-bg: var(--fui-primary-20);--fui-badge-color: var(--fui-
|
|
113
|
+
}, template: "<div class=\"fui-badge__content\">\r\n @if (icon()) {\r\n <fui-icon class=\"fui-badge__icon\" [name]=\"icon()!\" [size]=\"iconSize()\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"fui-badge__label\">{{ label() }}</span>\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)}}:host.fui-badge{--fui-badge-bg: transparent;--fui-badge-color: inherit;--fui-badge-font-size: var(--fui-text-sm);--fui-badge-font-weight: var(--fui-weight-medium);--fui-badge-border-radius: var(--fui-radius-pill);--fui-badge-gap: var(--fui-spacing-2);--fui-badge-height-sm: 1.25rem;--fui-badge-height-md: 1.5rem;--fui-badge-height-lg: 2rem;contain:content;display:inline-flex;align-items:center;justify-content:center;font-family:var(--fui-font-sans);font-size:var(--fui-badge-font-size);font-weight:var(--fui-badge-font-weight);border-radius:var(--fui-badge-border-radius);background-color:var(--fui-badge-bg);color:var(--fui-badge-color);white-space:nowrap;transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}:host.fui-badge .fui-badge__content{display:flex;align-items:center;gap:var(--fui-badge-gap)}:host.fui-badge .fui-badge__label{line-height:1}:host.fui-badge .fui-badge__icon{display:inline-flex;align-items:center;justify-content:center}:host.fui-badge--sm{height:var(--fui-badge-height-sm);padding:0 var(--fui-spacing-4);font-size:var(--fui-text-sm)}:host.fui-badge--md{height:var(--fui-badge-height-md);padding:0 var(--fui-spacing-6);font-size:var(--fui-text-base)}:host.fui-badge--lg{height:var(--fui-badge-height-lg);padding:0 var(--fui-spacing-7);font-size:var(--fui-text-md)}:host.fui-badge--primary{--fui-badge-bg: var(--fui-primary-20);--fui-badge-color: var(--fui-primary-fg)}:host.fui-badge--secondary{--fui-badge-bg: var(--fui-neutral-20);--fui-badge-color: var(--fui-neutral-80)}:host.fui-badge--success{--fui-badge-bg: var(--fui-success-20);--fui-badge-color: var(--fui-success-80)}:host.fui-badge--info{--fui-badge-bg: var(--fui-info-20);--fui-badge-color: var(--fui-info-80)}:host.fui-badge--warning{--fui-badge-bg: var(--fui-warning-20);--fui-badge-color: var(--fui-warning-80)}:host.fui-badge--error{--fui-badge-bg: var(--fui-error-20);--fui-badge-color: var(--fui-error-80)}:host.fui-badge--custom{--fui-badge-bg: transparent;--fui-badge-color: inherit}@media(prefers-reduced-motion:reduce){:host.fui-badge{transition:none}}\n"] }]
|
|
114
114
|
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], customColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "customColor", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
|
|
115
115
|
|
|
116
116
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-badge.mjs","sources":["../../../lib/components/badge/badge.types.ts","../../../lib/components/badge/badge.component.ts","../../../lib/components/badge/badge.component.html","../../../lib/components/badge/raintonic-formaui-components-badge.ts"],"sourcesContent":["export type FuiBadgeSize = 'sm' | 'md' | 'lg';\r\n\r\nexport interface FuiBadgeCustomColorObject {\r\n label: string;\r\n background: string;\r\n}\r\n\r\nexport type FuiBadgeCustomColor = string | FuiBadgeCustomColorObject;\r\n\r\nexport type FuiBadgeVariant = 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'error' | 'custom';\r\n\r\nexport const FUI_BADGE_SIZES: readonly FuiBadgeSize[] = ['sm', 'md', 'lg'] as const;\r\n\r\nexport const FUI_BADGE_VARIANTS: readonly FuiBadgeVariant[] = [\r\n 'primary',\r\n 'secondary',\r\n 'success',\r\n 'info',\r\n 'warning',\r\n 'error',\r\n 'custom',\r\n] as const;\r\n","import { ChangeDetectionStrategy, Component, computed, input, Signal } from '@angular/core';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport {\r\n FuiBadgeCustomColor,\r\n FuiBadgeCustomColorObject,\r\n FuiBadgeSize,\r\n FuiBadgeVariant,\r\n FUI_BADGE_SIZES,\r\n FUI_BADGE_VARIANTS,\r\n} from './badge.types';\r\n\r\n/**\r\n * @component FuiBadgeComponent\r\n * @selector fui-badge\r\n * @description Displays a small label badge with optional icon and color variants.\r\n * Supports custom colors with automatic text contrast calculation.\r\n *\r\n * @input label - (required) Text content of the badge.\r\n * @input icon - Optional Phosphor icon name displayed before the label.\r\n * @input customColor - Optional hex color or `{ label, background }` object that overrides the variant palette.\r\n * - Hex string: used as label color; background is the same hex with 16% alpha.\r\n * - Object: `{ label, background }` both as hex; applied as-is.\r\n * @input size - Badge size: 'sm' | 'md' | 'lg'. Default 'md'.\r\n * @input variant - Color variant: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info'. Default 'primary'.\r\n * @input ariaLabel - Accessible label override for screen readers.\r\n *\r\n * @example\r\n * <fui-badge label=\"Active\" variant=\"success\" icon=\"check-circle\"></fui-badge>\r\n */\r\n@Component({\r\n selector: 'fui-badge',\r\n standalone: true,\r\n imports: [FuiIconComponent],\r\n templateUrl: './badge.component.html',\r\n styleUrls: ['./badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[style]': 'computedStyles()',\r\n role: 'status',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n },\r\n})\r\nexport class FuiBadgeComponent {\r\n /** Hex pattern: #rgb, #rgba, #rrggbb, #rrggbbaa */\r\n private static readonly _HEX_PATTERN = /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\r\n\r\n readonly label = input.required<string>();\r\n\r\n readonly icon = input<string | null>(null);\r\n\r\n readonly customColor = input<FuiBadgeCustomColor | null>(null);\r\n\r\n readonly size = input<FuiBadgeSize, FuiBadgeSize | string>('md', {\r\n transform: (v) => ((FUI_BADGE_SIZES as readonly string[]).includes(v) ? (v as FuiBadgeSize) : 'md'),\r\n });\r\n\r\n readonly variant = input<FuiBadgeVariant, FuiBadgeVariant | string>('primary', {\r\n transform: (v) => ((FUI_BADGE_VARIANTS as readonly string[]).includes(v) ? (v as FuiBadgeVariant) : 'primary'),\r\n });\r\n\r\n readonly ariaLabel = input<string | null>(null);\r\n\r\n /**\r\n * Resolved custom color pair (label + background).\r\n * - String input: must be a valid hex → used as label color, background is same hex with 16% alpha.\r\n * - Object input: `{ label, background }` used directly (both must be valid hex).\r\n * Returns null for invalid values to prevent CSS injection.\r\n */\r\n readonly resolvedCustomColor: Signal<FuiBadgeCustomColorObject | null> = computed(() => {\r\n const value = this.customColor();\r\n if (!value) return null;\r\n\r\n if (typeof value === 'string') {\r\n if (!FuiBadgeComponent._HEX_PATTERN.test(value)) {\r\n console.warn(`[FormaUI] Invalid badge color: \"${value}\"`);\r\n return null;\r\n }\r\n return { label: value, background: this.hexToRgba(value, 0.16) };\r\n }\r\n\r\n const { label, background } = value;\r\n if (!FuiBadgeComponent._HEX_PATTERN.test(label) || !FuiBadgeComponent._HEX_PATTERN.test(background)) {\r\n console.warn(`[FormaUI] Invalid badge color object:`, value);\r\n return null;\r\n }\r\n return { label, background };\r\n });\r\n\r\n readonly computedStyles = computed(() => {\r\n const resolved = this.resolvedCustomColor();\r\n if (!resolved) return {} as Record<string, string>;\r\n return {\r\n 'background-color': resolved.background,\r\n color: resolved.label,\r\n } as Record<string, string>;\r\n });\r\n\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const effectiveVariant = this.resolvedCustomColor() ? 'custom' : this.variant();\r\n const classes: string[] = ['fui-badge', `fui-badge--${effectiveVariant}`, `fui-badge--${this.size()}`];\r\n\r\n if (this.icon()) {\r\n classes.push('fui-badge--with-icon');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n readonly iconSize: Signal<'sm' | 'md' | 'lg'> = computed(() => {\r\n const size = this.size();\r\n if (size === 'lg') return 'md';\r\n return 'sm';\r\n });\r\n\r\n private hexToRgba(hex: string, alpha: number): string {\r\n let h = hex.slice(1);\r\n if (h.length === 3 || h.length === 4) {\r\n h = h\r\n .split('')\r\n .map((c) => c + c)\r\n .join('');\r\n }\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n }\r\n}\r\n","<div class=\"fui-badge__content\">\r\n @if (icon()) {\r\n <fui-icon class=\"fui-badge__icon\" [name]=\"icon()!\" [size]=\"iconSize()\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"fui-badge__label\">{{ label() }}</span>\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-badge.mjs","sources":["../../../lib/components/badge/badge.types.ts","../../../lib/components/badge/badge.component.ts","../../../lib/components/badge/badge.component.html","../../../lib/components/badge/raintonic-formaui-components-badge.ts"],"sourcesContent":["export type FuiBadgeSize = 'sm' | 'md' | 'lg';\r\n\r\nexport interface FuiBadgeCustomColorObject {\r\n label: string;\r\n background: string;\r\n}\r\n\r\nexport type FuiBadgeCustomColor = string | FuiBadgeCustomColorObject;\r\n\r\nexport type FuiBadgeVariant = 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'error' | 'custom';\r\n\r\nexport const FUI_BADGE_SIZES: readonly FuiBadgeSize[] = ['sm', 'md', 'lg'] as const;\r\n\r\nexport const FUI_BADGE_VARIANTS: readonly FuiBadgeVariant[] = [\r\n 'primary',\r\n 'secondary',\r\n 'success',\r\n 'info',\r\n 'warning',\r\n 'error',\r\n 'custom',\r\n] as const;\r\n","import { ChangeDetectionStrategy, Component, computed, input, Signal } from '@angular/core';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport {\r\n FuiBadgeCustomColor,\r\n FuiBadgeCustomColorObject,\r\n FuiBadgeSize,\r\n FuiBadgeVariant,\r\n FUI_BADGE_SIZES,\r\n FUI_BADGE_VARIANTS,\r\n} from './badge.types';\r\n\r\n/**\r\n * @component FuiBadgeComponent\r\n * @selector fui-badge\r\n * @description Displays a small label badge with optional icon and color variants.\r\n * Supports custom colors with automatic text contrast calculation.\r\n *\r\n * @input label - (required) Text content of the badge.\r\n * @input icon - Optional Phosphor icon name displayed before the label.\r\n * @input customColor - Optional hex color or `{ label, background }` object that overrides the variant palette.\r\n * - Hex string: used as label color; background is the same hex with 16% alpha.\r\n * - Object: `{ label, background }` both as hex; applied as-is.\r\n * @input size - Badge size: 'sm' | 'md' | 'lg'. Default 'md'.\r\n * @input variant - Color variant: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info'. Default 'primary'.\r\n * @input ariaLabel - Accessible label override for screen readers.\r\n *\r\n * @example\r\n * <fui-badge label=\"Active\" variant=\"success\" icon=\"check-circle\"></fui-badge>\r\n */\r\n@Component({\r\n selector: 'fui-badge',\r\n standalone: true,\r\n imports: [FuiIconComponent],\r\n templateUrl: './badge.component.html',\r\n styleUrls: ['./badge.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class]': 'computedClasses()',\r\n '[style]': 'computedStyles()',\r\n role: 'status',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n },\r\n})\r\nexport class FuiBadgeComponent {\r\n /** Hex pattern: #rgb, #rgba, #rrggbb, #rrggbbaa */\r\n private static readonly _HEX_PATTERN = /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\r\n\r\n readonly label = input.required<string>();\r\n\r\n readonly icon = input<string | null>(null);\r\n\r\n readonly customColor = input<FuiBadgeCustomColor | null>(null);\r\n\r\n readonly size = input<FuiBadgeSize, FuiBadgeSize | string>('md', {\r\n transform: (v) => ((FUI_BADGE_SIZES as readonly string[]).includes(v) ? (v as FuiBadgeSize) : 'md'),\r\n });\r\n\r\n readonly variant = input<FuiBadgeVariant, FuiBadgeVariant | string>('primary', {\r\n transform: (v) => ((FUI_BADGE_VARIANTS as readonly string[]).includes(v) ? (v as FuiBadgeVariant) : 'primary'),\r\n });\r\n\r\n readonly ariaLabel = input<string | null>(null);\r\n\r\n /**\r\n * Resolved custom color pair (label + background).\r\n * - String input: must be a valid hex → used as label color, background is same hex with 16% alpha.\r\n * - Object input: `{ label, background }` used directly (both must be valid hex).\r\n * Returns null for invalid values to prevent CSS injection.\r\n */\r\n readonly resolvedCustomColor: Signal<FuiBadgeCustomColorObject | null> = computed(() => {\r\n const value = this.customColor();\r\n if (!value) return null;\r\n\r\n if (typeof value === 'string') {\r\n if (!FuiBadgeComponent._HEX_PATTERN.test(value)) {\r\n console.warn(`[FormaUI] Invalid badge color: \"${value}\"`);\r\n return null;\r\n }\r\n return { label: value, background: this.hexToRgba(value, 0.16) };\r\n }\r\n\r\n const { label, background } = value;\r\n if (!FuiBadgeComponent._HEX_PATTERN.test(label) || !FuiBadgeComponent._HEX_PATTERN.test(background)) {\r\n console.warn(`[FormaUI] Invalid badge color object:`, value);\r\n return null;\r\n }\r\n return { label, background };\r\n });\r\n\r\n readonly computedStyles = computed(() => {\r\n const resolved = this.resolvedCustomColor();\r\n if (!resolved) return {} as Record<string, string>;\r\n return {\r\n 'background-color': resolved.background,\r\n color: resolved.label,\r\n } as Record<string, string>;\r\n });\r\n\r\n readonly computedClasses: Signal<string> = computed(() => {\r\n const effectiveVariant = this.resolvedCustomColor() ? 'custom' : this.variant();\r\n const classes: string[] = ['fui-badge', `fui-badge--${effectiveVariant}`, `fui-badge--${this.size()}`];\r\n\r\n if (this.icon()) {\r\n classes.push('fui-badge--with-icon');\r\n }\r\n\r\n return classes.join(' ');\r\n });\r\n\r\n readonly iconSize: Signal<'sm' | 'md' | 'lg'> = computed(() => {\r\n const size = this.size();\r\n if (size === 'lg') return 'md';\r\n return 'sm';\r\n });\r\n\r\n private hexToRgba(hex: string, alpha: number): string {\r\n let h = hex.slice(1);\r\n if (h.length === 3 || h.length === 4) {\r\n h = h\r\n .split('')\r\n .map((c) => c + c)\r\n .join('');\r\n }\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n }\r\n}\r\n","<div class=\"fui-badge__content\">\r\n @if (icon()) {\r\n <fui-icon class=\"fui-badge__icon\" [name]=\"icon()!\" [size]=\"iconSize()\" aria-hidden=\"true\" />\r\n }\r\n <span class=\"fui-badge__label\">{{ label() }}</span>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -84,7 +84,7 @@ class FuiButtonGroupComponent {
|
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
86
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiButtonGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
87
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiButtonGroupComponent, isStandalone: true, selector: "fui-button-group", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "ariaLabel()" }, classAttribute: "fui-button-group" }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [".fui-button-group{contain:layout style;display:inline-flex;align-items:center;gap:0;background-color:var(--fui-bg-subtle);padding:var(--fui-spacing-2);border-radius:var(--fui-radius-sm);box-sizing:border-box}.fui-button-group .fui-button{margin:0}.fui-button-group .fui-button-group__button--middle{border-radius:
|
|
87
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.6", type: FuiButtonGroupComponent, isStandalone: true, selector: "fui-button-group", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "ariaLabel()" }, classAttribute: "fui-button-group" }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [".fui-button-group{contain:layout style;display:inline-flex;align-items:center;gap:0;background-color:var(--fui-bg-subtle);padding:var(--fui-spacing-2);border-radius:var(--fui-radius-sm);box-sizing:border-box}.fui-button-group .fui-button{margin:0}.fui-button-group .fui-button-group__button--middle{border-radius:var(--fui-radius-none)}.fui-button-group .fui-button-group__button--first{border-top-right-radius:var(--fui-radius-none);border-bottom-right-radius:var(--fui-radius-none)}.fui-button-group .fui-button-group__button--last{border-top-left-radius:var(--fui-radius-none);border-bottom-left-radius:var(--fui-radius-none)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
88
88
|
}
|
|
89
89
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiButtonGroupComponent, decorators: [{
|
|
90
90
|
type: Component,
|
|
@@ -92,7 +92,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
92
92
|
class: 'fui-button-group',
|
|
93
93
|
role: 'group',
|
|
94
94
|
'[attr.aria-label]': 'ariaLabel()',
|
|
95
|
-
}, styles: [".fui-button-group{contain:layout style;display:inline-flex;align-items:center;gap:0;background-color:var(--fui-bg-subtle);padding:var(--fui-spacing-2);border-radius:var(--fui-radius-sm);box-sizing:border-box}.fui-button-group .fui-button{margin:0}.fui-button-group .fui-button-group__button--middle{border-radius:
|
|
95
|
+
}, styles: [".fui-button-group{contain:layout style;display:inline-flex;align-items:center;gap:0;background-color:var(--fui-bg-subtle);padding:var(--fui-spacing-2);border-radius:var(--fui-radius-sm);box-sizing:border-box}.fui-button-group .fui-button{margin:0}.fui-button-group .fui-button-group__button--middle{border-radius:var(--fui-radius-none)}.fui-button-group .fui-button-group__button--first{border-top-right-radius:var(--fui-radius-none);border-bottom-right-radius:var(--fui-radius-none)}.fui-button-group .fui-button-group__button--last{border-top-left-radius:var(--fui-radius-none);border-bottom-left-radius:var(--fui-radius-none)}\n"] }]
|
|
96
96
|
}], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
|
|
97
97
|
|
|
98
98
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raintonic-formaui-components-button-group.mjs","sources":["../../../lib/components/button-group/button-group.component.ts","../../../lib/components/button-group/raintonic-formaui-components-button-group.ts"],"sourcesContent":["import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n AfterContentInit,\r\n ElementRef,\r\n Renderer2,\r\n inject,\r\n effect,\r\n input,\r\n} from '@angular/core';\r\n\r\n/**\r\n * # Button Group Component\r\n *\r\n * A container component that groups multiple buttons together, creating a unified\r\n * visual element with connected borders. Follows Carbon Design System patterns.\r\n *\r\n * ## Features\r\n * - Groups multiple buttons into a single visual unit\r\n * - Removes internal border-radius, keeping only the extremities rounded\r\n * - Surface-02 background with small padding\r\n * - Automatically handles button border-radius for first and last buttons\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Button Group\r\n * ```html\r\n * <fui-button-group>\r\n * <button fuiButton variant=\"secondary\">Left</button>\r\n * <button fuiButton variant=\"secondary\">Center</button>\r\n * <button fuiButton variant=\"secondary\">Right</button>\r\n * </fui-button-group>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiButtonGroupComponent } from '@raintonic/formaui/components/button-group';\r\n * import { FuiButtonDirective } from '@raintonic/formaui/components/button';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiButtonGroupComponent, FuiButtonDirective],\r\n * template: `\r\n * <fui-button-group>\r\n * <button fuiButton variant=\"secondary\">Option 1</button>\r\n * <button fuiButton variant=\"secondary\">Option 2</button>\r\n * <button fuiButton variant=\"secondary\">Option 3</button>\r\n * </fui-button-group>\r\n * `\r\n * })\r\n * export class MyComponent {}\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-button-group',\r\n standalone: true,\r\n template: `<ng-content></ng-content>`,\r\n styleUrls: ['./button-group.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-button-group',\r\n role: 'group',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n },\r\n})\r\nexport class FuiButtonGroupComponent implements AfterContentInit {\r\n /**\r\n * Accessible label for the button group\r\n */\r\n readonly ariaLabel = input<string | undefined>(undefined);\r\n\r\n private readonly _elementRef = inject(ElementRef);\r\n private readonly _renderer = inject(Renderer2);\r\n\r\n constructor() {\r\n // Set up an effect to handle dynamic button changes\r\n effect(() => {\r\n this._updateButtonStyles();\r\n });\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n this._updateButtonStyles();\r\n }\r\n\r\n private _updateButtonStyles(): void {\r\n const hostElement = this._elementRef.nativeElement as HTMLElement;\r\n const buttons = hostElement.querySelectorAll('[fuiButton]');\r\n\r\n buttons.forEach((button, index) => {\r\n // Remove all position classes first\r\n this._renderer.removeClass(button, 'fui-button-group__button--first');\r\n this._renderer.removeClass(button, 'fui-button-group__button--middle');\r\n this._renderer.removeClass(button, 'fui-button-group__button--last');\r\n this._renderer.removeClass(button, 'fui-button-group__button--only');\r\n\r\n // Add appropriate class based on position\r\n if (buttons.length === 1) {\r\n this._renderer.addClass(button, 'fui-button-group__button--only');\r\n } else if (index === 0) {\r\n this._renderer.addClass(button, 'fui-button-group__button--first');\r\n } else if (index === buttons.length - 1) {\r\n this._renderer.addClass(button, 'fui-button-group__button--last');\r\n } else {\r\n this._renderer.addClass(button, 'fui-button-group__button--middle');\r\n }\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCG;MAcU,uBAAuB,CAAA;AAClC;;AAEG;AACM,IAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,gFAAC;AAExC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAE9C,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ;IAEA,kBAAkB,GAAA;QAChB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,aAA4B;QACjE,MAAM,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAE3D,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;;YAEhC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,iCAAiC,CAAC;YACrE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,kCAAkC,CAAC;YACtE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACpE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC;;AAGpE,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACxB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACnE;AAAO,iBAAA,IAAI,KAAK,KAAK,CAAC,EAAE;gBACtB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iCAAiC,CAAC;YACpE;iBAAO,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACnE;iBAAO;gBACL,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,kCAAkC,CAAC;YACrE;AACF,QAAA,CAAC,CAAC;IACJ;uGA1CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,6VAVxB,CAAA,yBAAA,CAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"raintonic-formaui-components-button-group.mjs","sources":["../../../lib/components/button-group/button-group.component.ts","../../../lib/components/button-group/raintonic-formaui-components-button-group.ts"],"sourcesContent":["import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n AfterContentInit,\r\n ElementRef,\r\n Renderer2,\r\n inject,\r\n effect,\r\n input,\r\n} from '@angular/core';\r\n\r\n/**\r\n * # Button Group Component\r\n *\r\n * A container component that groups multiple buttons together, creating a unified\r\n * visual element with connected borders. Follows Carbon Design System patterns.\r\n *\r\n * ## Features\r\n * - Groups multiple buttons into a single visual unit\r\n * - Removes internal border-radius, keeping only the extremities rounded\r\n * - Surface-02 background with small padding\r\n * - Automatically handles button border-radius for first and last buttons\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Button Group\r\n * ```html\r\n * <fui-button-group>\r\n * <button fuiButton variant=\"secondary\">Left</button>\r\n * <button fuiButton variant=\"secondary\">Center</button>\r\n * <button fuiButton variant=\"secondary\">Right</button>\r\n * </fui-button-group>\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * import { FuiButtonGroupComponent } from '@raintonic/formaui/components/button-group';\r\n * import { FuiButtonDirective } from '@raintonic/formaui/components/button';\r\n *\r\n * @Component({\r\n * standalone: true,\r\n * imports: [FuiButtonGroupComponent, FuiButtonDirective],\r\n * template: `\r\n * <fui-button-group>\r\n * <button fuiButton variant=\"secondary\">Option 1</button>\r\n * <button fuiButton variant=\"secondary\">Option 2</button>\r\n * <button fuiButton variant=\"secondary\">Option 3</button>\r\n * </fui-button-group>\r\n * `\r\n * })\r\n * export class MyComponent {}\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-button-group',\r\n standalone: true,\r\n template: `<ng-content></ng-content>`,\r\n styleUrls: ['./button-group.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-button-group',\r\n role: 'group',\r\n '[attr.aria-label]': 'ariaLabel()',\r\n },\r\n})\r\nexport class FuiButtonGroupComponent implements AfterContentInit {\r\n /**\r\n * Accessible label for the button group\r\n */\r\n readonly ariaLabel = input<string | undefined>(undefined);\r\n\r\n private readonly _elementRef = inject(ElementRef);\r\n private readonly _renderer = inject(Renderer2);\r\n\r\n constructor() {\r\n // Set up an effect to handle dynamic button changes\r\n effect(() => {\r\n this._updateButtonStyles();\r\n });\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n this._updateButtonStyles();\r\n }\r\n\r\n private _updateButtonStyles(): void {\r\n const hostElement = this._elementRef.nativeElement as HTMLElement;\r\n const buttons = hostElement.querySelectorAll('[fuiButton]');\r\n\r\n buttons.forEach((button, index) => {\r\n // Remove all position classes first\r\n this._renderer.removeClass(button, 'fui-button-group__button--first');\r\n this._renderer.removeClass(button, 'fui-button-group__button--middle');\r\n this._renderer.removeClass(button, 'fui-button-group__button--last');\r\n this._renderer.removeClass(button, 'fui-button-group__button--only');\r\n\r\n // Add appropriate class based on position\r\n if (buttons.length === 1) {\r\n this._renderer.addClass(button, 'fui-button-group__button--only');\r\n } else if (index === 0) {\r\n this._renderer.addClass(button, 'fui-button-group__button--first');\r\n } else if (index === buttons.length - 1) {\r\n this._renderer.addClass(button, 'fui-button-group__button--last');\r\n } else {\r\n this._renderer.addClass(button, 'fui-button-group__button--middle');\r\n }\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCG;MAcU,uBAAuB,CAAA;AAClC;;AAEG;AACM,IAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,gFAAC;AAExC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AAE9C,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ;IAEA,kBAAkB,GAAA;QAChB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,aAA4B;QACjE,MAAM,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAE3D,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,KAAI;;YAEhC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,iCAAiC,CAAC;YACrE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,kCAAkC,CAAC;YACtE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACpE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,gCAAgC,CAAC;;AAGpE,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACxB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACnE;AAAO,iBAAA,IAAI,KAAK,KAAK,CAAC,EAAE;gBACtB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iCAAiC,CAAC;YACpE;iBAAO,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAC;YACnE;iBAAO;gBACL,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,kCAAkC,CAAC;YACrE;AACF,QAAA,CAAC,CAAC;IACJ;uGA1CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,6VAVxB,CAAA,yBAAA,CAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ynBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAU1B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EACN,CAAA,yBAAA,CAA2B,EAAA,eAAA,EAEpB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,kBAAkB;AACzB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,mBAAmB,EAAE,aAAa;AACnC,qBAAA,EAAA,MAAA,EAAA,CAAA,ynBAAA,CAAA,EAAA;;;ACjEH;;AAEG;;;;"}
|
|
@@ -230,7 +230,7 @@ class FuiCardComponent {
|
|
|
230
230
|
return !!this.actionsCmp;
|
|
231
231
|
}
|
|
232
232
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
233
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiCardComponent, isStandalone: true, selector: "fui-card", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "keydown": "onKeyDown($event)", "click": "onClick($event)" }, properties: { "class": "computedClasses()", "attr.role": "clickable() ? \"button\" : \"region\"", "attr.tabindex": "clickable() && !disabled() ? \"0\" : null", "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.aria-labelledby": "headerId" }, classAttribute: "fui-card" }, queries: [{ propertyName: "headerCmp", first: true, predicate: FuiCardHeaderComponent, descendants: true }, { propertyName: "actionsCmp", first: true, predicate: FuiCardActionsComponent, descendants: true }], ngImport: i0, template: "@if (hasHeader) {\r\n <div class=\"fui-card__header\">\r\n <ng-content select=\"fui-card-header, [rtCardHeader]\"></ng-content>\r\n </div>\r\n}\r\n\r\n<div class=\"fui-card__content\" [class.fui-card__content--no-padding]=\"padding() === 'none'\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (hasActions) {\r\n <div class=\"fui-card__actions\">\r\n <ng-content select=\"fui-card-actions, [rtCardActions]\"></ng-content>\r\n </div>\r\n}\r\n", styles: [".fui-text-xs{font-size:var(--fui-text-sm);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.24px}.fui-text-sm{font-size:var(--fui-text-base);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.56px}.fui-text-md{font-size:var(--fui-text-md);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-lg{font-size:var(--fui-text-lg);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-xl{font-size:var(--fui-text-xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-display-xs{font-size:var(--fui-text-2xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-snug);letter-spacing:.48px}.fui-display-sm{font-size:var(--fui-text-3xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-md{font-size:var(--fui-text-4xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-lg{font-size:var(--fui-text-5xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-xl{font-size:var(--fui-text-6xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.2px}.fui-display-2xl{font-size:var(--fui-text-7xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.44px}.fui-code-01{font-family:var(--fui-font-mono);font-size:var(--fui-text-sm);line-height:var(--fui-leading-loose)}.fui-code-02{font-family:var(--fui-font-mono);font-size:var(--fui-text-base);line-height:var(--fui-leading-relaxed)}.fui-font-light{font-weight:var(--fui-weight-light)}.fui-font-regular{font-weight:var(--fui-weight-regular)}.fui-font-medium{font-weight:var(--fui-weight-medium)}.fui-font-semibold{font-weight:var(--fui-weight-semibold)}.fui-font-bold{font-weight:var(--fui-weight-bold)}@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-card{--fui-card-bg: var(--fui-bg-default);--fui-card-border-color: var(--fui-border-default);--fui-card-header-padding: var(--fui-spacing-7) var(--fui-spacing-9);--fui-card-actions-gap: var(--fui-spacing-4);contain:layout style;display:flex;flex-direction:column;position:relative;border-radius:var(--fui-card-border-radius);background-color:var(--fui-card-bg);box-shadow:var(--fui-shadow-xs);backdrop-filter:blur(8px);overflow:hidden;transition-property:box-shadow,transform,border-color;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-card--elevated{box-shadow:var(--fui-card-shadow);border:none}.fui-card--elevated.fui-card--hovered:not(.fui-card--disabled){box-shadow:var(--fui-card-shadow-hover)}.fui-card--outlined{border:1px solid var(--fui-border-default)}.fui-card--outlined.fui-card--hovered:not(.fui-card--disabled){border-color:var(--fui-border-strong)}.fui-card--flat{box-shadow:none;border:1px solid transparent}.fui-card--clickable{cursor:pointer;transition:transform var(--fui-duration-fast) var(--fui-ease-in-out),box-shadow var(--fui-duration-fast) var(--fui-ease-in-out)}.fui-card--clickable:hover{transform:translateY(-2px);box-shadow:0 4px 8px #0000001a}.fui-card--clickable:focus-visible{outline:2px solid var(--fui-primary-10);transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-card--disabled{opacity:var(--fui-state-disabled-opacity);cursor:not-allowed}.fui-card--padding-none .fui-card__content{padding:0}.fui-card--padding-sm .fui-card__content{padding:var(--fui-spacing-6)}.fui-card--padding-md .fui-card__content{padding:var(--fui-spacing-7)}.fui-card--padding-lg .fui-card__content{padding:var(--fui-spacing-9)}.fui-card--padding-xl .fui-card__content{padding:var(--fui-spacing-11)}.fui-card__header{border-bottom:1px solid var(--fui-border-default);font-weight:var(--fui-weight-medium)}.fui-card__header:empty{display:none}.fui-card__content{flex:1;padding:var(--fui-card-padding)}.fui-card__content--no-padding{padding:0}.fui-card__content>:first-child{margin-top:0}.fui-card__content>:last-child{margin-bottom:0}.fui-card__actions{padding-bottom:0;display:flex;gap:var(--fui-spacing-4);align-items:center;justify-content:flex-end}.fui-card__actions:empty{display:none}.fui-card__actions--align-start{justify-content:flex-start}.fui-card__actions--align-center{justify-content:center}.fui-card__actions--align-end{justify-content:flex-end}.fui-card-header{padding:var(--fui-spacing-7) var(--fui-spacing-9);display:flex;flex-direction:column;gap:var(--fui-spacing-2)}.fui-card-header__title{color:var(--fui-text-primary);margin:0}.fui-card-header__subtitle{font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);color:var(--fui-text-secondary);margin:0}.fui-card-header__content:empty{margin-top:0}.fui-card-actions{display:flex;gap:var(--fui-spacing-4);align-items:center}.fui-card-actions--align-start{justify-content:flex-start}.fui-card-actions--align-center{justify-content:center}.fui-card-actions--align-end{justify-content:flex-end}.fui-card-actions--paddingless{padding:0}.fui-card-actions .fui-button+.fui-button{margin-left:var(--fui-spacing-4)}@media(min-width:640px){.fui-card--padding-sm .fui-card__content{padding:var(--fui-spacing-2)}.fui-card--padding-md .fui-card__content{padding:var(--fui-spacing-6)}.fui-card--padding-lg .fui-card__content{padding:var(--fui-spacing-9)}.fui-card__actions{padding:0 var(--fui-spacing-6) var(--fui-spacing-6);gap:var(--fui-spacing-2);flex-wrap:wrap}}.fui-card--horizontal{flex-direction:row}.fui-card--horizontal .fui-card__content{flex:1}.fui-card--horizontal .fui-card__actions{flex-direction:column;padding:var(--fui-spacing-7)}.fui-card__image{width:100%;height:auto;border-radius:var(--fui-card-border-radius) var(--fui-card-border-radius) 0 0}.fui-card__image:only-child{border-radius:var(--fui-card-border-radius)}.fui-card__media{position:relative;overflow:hidden;border-radius:var(--fui-card-border-radius) var(--fui-card-border-radius) 0 0}.fui-card__media img,.fui-card__media video{width:100%;height:auto;display:block}.fui-card__media:last-child{border-radius:0 0 var(--fui-card-border-radius) var(--fui-card-border-radius)}.fui-card__media:only-child{border-radius:var(--fui-card-border-radius)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
233
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: FuiCardComponent, isStandalone: true, selector: "fui-card", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "keydown": "onKeyDown($event)", "click": "onClick($event)" }, properties: { "class": "computedClasses()", "attr.role": "clickable() ? \"button\" : \"region\"", "attr.tabindex": "clickable() && !disabled() ? \"0\" : null", "attr.aria-disabled": "disabled() ? \"true\" : null", "attr.aria-labelledby": "headerId" }, classAttribute: "fui-card" }, queries: [{ propertyName: "headerCmp", first: true, predicate: FuiCardHeaderComponent, descendants: true }, { propertyName: "actionsCmp", first: true, predicate: FuiCardActionsComponent, descendants: true }], ngImport: i0, template: "@if (hasHeader) {\r\n <div class=\"fui-card__header\">\r\n <ng-content select=\"fui-card-header, [rtCardHeader]\"></ng-content>\r\n </div>\r\n}\r\n\r\n<div class=\"fui-card__content\" [class.fui-card__content--no-padding]=\"padding() === 'none'\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (hasActions) {\r\n <div class=\"fui-card__actions\">\r\n <ng-content select=\"fui-card-actions, [rtCardActions]\"></ng-content>\r\n </div>\r\n}\r\n", styles: [".fui-text-xs{font-size:var(--fui-text-sm);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.24px}.fui-text-sm{font-size:var(--fui-text-base);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.56px}.fui-text-md{font-size:var(--fui-text-md);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-lg{font-size:var(--fui-text-lg);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-xl{font-size:var(--fui-text-xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-display-xs{font-size:var(--fui-text-2xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-snug);letter-spacing:.48px}.fui-display-sm{font-size:var(--fui-text-3xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-md{font-size:var(--fui-text-4xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-lg{font-size:var(--fui-text-5xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-xl{font-size:var(--fui-text-6xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.2px}.fui-display-2xl{font-size:var(--fui-text-7xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.44px}.fui-code-01{font-family:var(--fui-font-mono);font-size:var(--fui-text-sm);line-height:var(--fui-leading-loose)}.fui-code-02{font-family:var(--fui-font-mono);font-size:var(--fui-text-base);line-height:var(--fui-leading-relaxed)}.fui-font-light{font-weight:var(--fui-weight-light)}.fui-font-regular{font-weight:var(--fui-weight-regular)}.fui-font-medium{font-weight:var(--fui-weight-medium)}.fui-font-semibold{font-weight:var(--fui-weight-semibold)}.fui-font-bold{font-weight:var(--fui-weight-bold)}@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-card{--fui-card-bg: var(--fui-bg-default);--fui-card-border-color: var(--fui-border-default);--fui-card-header-padding: var(--fui-spacing-7) var(--fui-spacing-9);--fui-card-actions-gap: var(--fui-spacing-4);contain:layout style;display:flex;flex-direction:column;position:relative;border-radius:var(--fui-card-border-radius);background-color:var(--fui-card-bg);box-shadow:var(--fui-shadow-xs);backdrop-filter:blur(8px);overflow:hidden;transition-property:box-shadow,transform,border-color;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-card--elevated{box-shadow:var(--fui-card-shadow);border:none}.fui-card--elevated.fui-card--hovered:not(.fui-card--disabled){box-shadow:var(--fui-card-shadow-hover)}.fui-card--outlined{border:var(--fui-border-width-sm) solid var(--fui-border-default)}.fui-card--outlined.fui-card--hovered:not(.fui-card--disabled){border-color:var(--fui-border-strong)}.fui-card--flat{box-shadow:none;border:var(--fui-border-width-sm) solid transparent}.fui-card--clickable{cursor:pointer;transition:transform var(--fui-duration-fast) var(--fui-ease-in-out),box-shadow var(--fui-duration-fast) var(--fui-ease-in-out)}.fui-card--clickable:hover{transform:translateY(-2px);box-shadow:0 4px 8px #0000001a}.fui-card--clickable:focus-visible{outline:2px solid var(--fui-primary-10);transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-card--disabled{opacity:var(--fui-state-disabled-opacity);cursor:not-allowed}.fui-card--padding-none .fui-card__content{padding:0}.fui-card--padding-sm .fui-card__content{padding:var(--fui-spacing-6)}.fui-card--padding-md .fui-card__content{padding:var(--fui-spacing-7)}.fui-card--padding-lg .fui-card__content{padding:var(--fui-spacing-9)}.fui-card--padding-xl .fui-card__content{padding:var(--fui-spacing-11)}.fui-card__header{border-bottom:var(--fui-border-width-sm) solid var(--fui-border-default);font-weight:var(--fui-weight-medium)}.fui-card__header:empty{display:none}.fui-card__content{flex:1;padding:var(--fui-card-padding)}.fui-card__content--no-padding{padding:0}.fui-card__content>:first-child{margin-top:0}.fui-card__content>:last-child{margin-bottom:0}.fui-card__actions{padding-bottom:0;display:flex;gap:var(--fui-spacing-4);align-items:center;justify-content:flex-end}.fui-card__actions:empty{display:none}.fui-card__actions--align-start{justify-content:flex-start}.fui-card__actions--align-center{justify-content:center}.fui-card__actions--align-end{justify-content:flex-end}.fui-card-header{padding:var(--fui-spacing-7) var(--fui-spacing-9);display:flex;flex-direction:column;gap:var(--fui-spacing-2)}.fui-card-header__title{color:var(--fui-text-primary);margin:0}.fui-card-header__subtitle{font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);color:var(--fui-text-secondary);margin:0}.fui-card-header__content:empty{margin-top:0}.fui-card-actions{display:flex;gap:var(--fui-spacing-4);align-items:center}.fui-card-actions--align-start{justify-content:flex-start}.fui-card-actions--align-center{justify-content:center}.fui-card-actions--align-end{justify-content:flex-end}.fui-card-actions--paddingless{padding:0}.fui-card-actions .fui-button+.fui-button{margin-left:var(--fui-spacing-4)}@media(min-width:640px){.fui-card--padding-sm .fui-card__content{padding:var(--fui-spacing-2)}.fui-card--padding-md .fui-card__content{padding:var(--fui-spacing-6)}.fui-card--padding-lg .fui-card__content{padding:var(--fui-spacing-9)}.fui-card__actions{padding:0 var(--fui-spacing-6) var(--fui-spacing-6);gap:var(--fui-spacing-2);flex-wrap:wrap}}.fui-card--horizontal{flex-direction:row}.fui-card--horizontal .fui-card__content{flex:1}.fui-card--horizontal .fui-card__actions{flex-direction:column;padding:var(--fui-spacing-7)}.fui-card__image{width:100%;height:auto;border-radius:var(--fui-card-border-radius) var(--fui-card-border-radius) 0 0}.fui-card__image:only-child{border-radius:var(--fui-card-border-radius)}.fui-card__media{position:relative;overflow:hidden;border-radius:var(--fui-card-border-radius) var(--fui-card-border-radius) 0 0}.fui-card__media img,.fui-card__media video{width:100%;height:auto;display:block}.fui-card__media:last-child{border-radius:0 0 var(--fui-card-border-radius) var(--fui-card-border-radius)}.fui-card__media:only-child{border-radius:var(--fui-card-border-radius)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
234
234
|
}
|
|
235
235
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FuiCardComponent, decorators: [{
|
|
236
236
|
type: Component,
|
|
@@ -241,7 +241,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
241
241
|
'[attr.tabindex]': 'clickable() && !disabled() ? "0" : null',
|
|
242
242
|
'[attr.aria-disabled]': 'disabled() ? "true" : null',
|
|
243
243
|
'[attr.aria-labelledby]': 'headerId',
|
|
244
|
-
}, template: "@if (hasHeader) {\r\n <div class=\"fui-card__header\">\r\n <ng-content select=\"fui-card-header, [rtCardHeader]\"></ng-content>\r\n </div>\r\n}\r\n\r\n<div class=\"fui-card__content\" [class.fui-card__content--no-padding]=\"padding() === 'none'\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (hasActions) {\r\n <div class=\"fui-card__actions\">\r\n <ng-content select=\"fui-card-actions, [rtCardActions]\"></ng-content>\r\n </div>\r\n}\r\n", styles: [".fui-text-xs{font-size:var(--fui-text-sm);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.24px}.fui-text-sm{font-size:var(--fui-text-base);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.56px}.fui-text-md{font-size:var(--fui-text-md);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-lg{font-size:var(--fui-text-lg);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-xl{font-size:var(--fui-text-xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-display-xs{font-size:var(--fui-text-2xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-snug);letter-spacing:.48px}.fui-display-sm{font-size:var(--fui-text-3xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-md{font-size:var(--fui-text-4xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-lg{font-size:var(--fui-text-5xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-xl{font-size:var(--fui-text-6xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.2px}.fui-display-2xl{font-size:var(--fui-text-7xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.44px}.fui-code-01{font-family:var(--fui-font-mono);font-size:var(--fui-text-sm);line-height:var(--fui-leading-loose)}.fui-code-02{font-family:var(--fui-font-mono);font-size:var(--fui-text-base);line-height:var(--fui-leading-relaxed)}.fui-font-light{font-weight:var(--fui-weight-light)}.fui-font-regular{font-weight:var(--fui-weight-regular)}.fui-font-medium{font-weight:var(--fui-weight-medium)}.fui-font-semibold{font-weight:var(--fui-weight-semibold)}.fui-font-bold{font-weight:var(--fui-weight-bold)}@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-card{--fui-card-bg: var(--fui-bg-default);--fui-card-border-color: var(--fui-border-default);--fui-card-header-padding: var(--fui-spacing-7) var(--fui-spacing-9);--fui-card-actions-gap: var(--fui-spacing-4);contain:layout style;display:flex;flex-direction:column;position:relative;border-radius:var(--fui-card-border-radius);background-color:var(--fui-card-bg);box-shadow:var(--fui-shadow-xs);backdrop-filter:blur(8px);overflow:hidden;transition-property:box-shadow,transform,border-color;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-card--elevated{box-shadow:var(--fui-card-shadow);border:none}.fui-card--elevated.fui-card--hovered:not(.fui-card--disabled){box-shadow:var(--fui-card-shadow-hover)}.fui-card--outlined{border:
|
|
244
|
+
}, template: "@if (hasHeader) {\r\n <div class=\"fui-card__header\">\r\n <ng-content select=\"fui-card-header, [rtCardHeader]\"></ng-content>\r\n </div>\r\n}\r\n\r\n<div class=\"fui-card__content\" [class.fui-card__content--no-padding]=\"padding() === 'none'\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n@if (hasActions) {\r\n <div class=\"fui-card__actions\">\r\n <ng-content select=\"fui-card-actions, [rtCardActions]\"></ng-content>\r\n </div>\r\n}\r\n", styles: [".fui-text-xs{font-size:var(--fui-text-sm);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.24px}.fui-text-sm{font-size:var(--fui-text-base);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);letter-spacing:.56px}.fui-text-md{font-size:var(--fui-text-md);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-lg{font-size:var(--fui-text-lg);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-text-xl{font-size:var(--fui-text-xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal)}.fui-display-xs{font-size:var(--fui-text-2xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-snug);letter-spacing:.48px}.fui-display-sm{font-size:var(--fui-text-3xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-md{font-size:var(--fui-text-4xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-lg{font-size:var(--fui-text-5xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight)}.fui-display-xl{font-size:var(--fui-text-6xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.2px}.fui-display-2xl{font-size:var(--fui-text-7xl);font-style:normal;font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-tight);letter-spacing:-1.44px}.fui-code-01{font-family:var(--fui-font-mono);font-size:var(--fui-text-sm);line-height:var(--fui-leading-loose)}.fui-code-02{font-family:var(--fui-font-mono);font-size:var(--fui-text-base);line-height:var(--fui-leading-relaxed)}.fui-font-light{font-weight:var(--fui-weight-light)}.fui-font-regular{font-weight:var(--fui-weight-regular)}.fui-font-medium{font-weight:var(--fui-weight-medium)}.fui-font-semibold{font-weight:var(--fui-weight-semibold)}.fui-font-bold{font-weight:var(--fui-weight-bold)}@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-card{--fui-card-bg: var(--fui-bg-default);--fui-card-border-color: var(--fui-border-default);--fui-card-header-padding: var(--fui-spacing-7) var(--fui-spacing-9);--fui-card-actions-gap: var(--fui-spacing-4);contain:layout style;display:flex;flex-direction:column;position:relative;border-radius:var(--fui-card-border-radius);background-color:var(--fui-card-bg);box-shadow:var(--fui-shadow-xs);backdrop-filter:blur(8px);overflow:hidden;transition-property:box-shadow,transform,border-color;transition-duration:var(--fui-duration-base);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-card--elevated{box-shadow:var(--fui-card-shadow);border:none}.fui-card--elevated.fui-card--hovered:not(.fui-card--disabled){box-shadow:var(--fui-card-shadow-hover)}.fui-card--outlined{border:var(--fui-border-width-sm) solid var(--fui-border-default)}.fui-card--outlined.fui-card--hovered:not(.fui-card--disabled){border-color:var(--fui-border-strong)}.fui-card--flat{box-shadow:none;border:var(--fui-border-width-sm) solid transparent}.fui-card--clickable{cursor:pointer;transition:transform var(--fui-duration-fast) var(--fui-ease-in-out),box-shadow var(--fui-duration-fast) var(--fui-ease-in-out)}.fui-card--clickable:hover{transform:translateY(-2px);box-shadow:0 4px 8px #0000001a}.fui-card--clickable:focus-visible{outline:2px solid var(--fui-primary-10);transition-property:all;transition-duration:var(--fui-duration-fast);transition-timing-function:var(--fui-ease-in-out);transition-delay:0ms}.fui-card--disabled{opacity:var(--fui-state-disabled-opacity);cursor:not-allowed}.fui-card--padding-none .fui-card__content{padding:0}.fui-card--padding-sm .fui-card__content{padding:var(--fui-spacing-6)}.fui-card--padding-md .fui-card__content{padding:var(--fui-spacing-7)}.fui-card--padding-lg .fui-card__content{padding:var(--fui-spacing-9)}.fui-card--padding-xl .fui-card__content{padding:var(--fui-spacing-11)}.fui-card__header{border-bottom:var(--fui-border-width-sm) solid var(--fui-border-default);font-weight:var(--fui-weight-medium)}.fui-card__header:empty{display:none}.fui-card__content{flex:1;padding:var(--fui-card-padding)}.fui-card__content--no-padding{padding:0}.fui-card__content>:first-child{margin-top:0}.fui-card__content>:last-child{margin-bottom:0}.fui-card__actions{padding-bottom:0;display:flex;gap:var(--fui-spacing-4);align-items:center;justify-content:flex-end}.fui-card__actions:empty{display:none}.fui-card__actions--align-start{justify-content:flex-start}.fui-card__actions--align-center{justify-content:center}.fui-card__actions--align-end{justify-content:flex-end}.fui-card-header{padding:var(--fui-spacing-7) var(--fui-spacing-9);display:flex;flex-direction:column;gap:var(--fui-spacing-2)}.fui-card-header__title{color:var(--fui-text-primary);margin:0}.fui-card-header__subtitle{font-size:var(--fui-text-base);font-weight:var(--fui-weight-regular);line-height:var(--fui-leading-normal);color:var(--fui-text-secondary);margin:0}.fui-card-header__content:empty{margin-top:0}.fui-card-actions{display:flex;gap:var(--fui-spacing-4);align-items:center}.fui-card-actions--align-start{justify-content:flex-start}.fui-card-actions--align-center{justify-content:center}.fui-card-actions--align-end{justify-content:flex-end}.fui-card-actions--paddingless{padding:0}.fui-card-actions .fui-button+.fui-button{margin-left:var(--fui-spacing-4)}@media(min-width:640px){.fui-card--padding-sm .fui-card__content{padding:var(--fui-spacing-2)}.fui-card--padding-md .fui-card__content{padding:var(--fui-spacing-6)}.fui-card--padding-lg .fui-card__content{padding:var(--fui-spacing-9)}.fui-card__actions{padding:0 var(--fui-spacing-6) var(--fui-spacing-6);gap:var(--fui-spacing-2);flex-wrap:wrap}}.fui-card--horizontal{flex-direction:row}.fui-card--horizontal .fui-card__content{flex:1}.fui-card--horizontal .fui-card__actions{flex-direction:column;padding:var(--fui-spacing-7)}.fui-card__image{width:100%;height:auto;border-radius:var(--fui-card-border-radius) var(--fui-card-border-radius) 0 0}.fui-card__image:only-child{border-radius:var(--fui-card-border-radius)}.fui-card__media{position:relative;overflow:hidden;border-radius:var(--fui-card-border-radius) var(--fui-card-border-radius) 0 0}.fui-card__media img,.fui-card__media video{width:100%;height:auto;display:block}.fui-card__media:last-child{border-radius:0 0 var(--fui-card-border-radius) var(--fui-card-border-radius)}.fui-card__media:only-child{border-radius:var(--fui-card-border-radius)}\n"] }]
|
|
245
245
|
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], headerCmp: [{
|
|
246
246
|
type: ContentChild,
|
|
247
247
|
args: [FuiCardHeaderComponent]
|