import { FormControlBase, FormState } from "../helper/internals/form-control-base"; export type SkyComboboxJustify = "flex-start" | "center" | "flex-end" | "space-between" | "space-around" | "space-evenly"; export type SkyComboboxErrorDisplayMode = "single" | "all" | "none"; export type SkyComboboxIconPosition = "left" | "right"; /** How multi-select values render in the field (single-select always uses plain text). */ export type SkyComboboxMultiDisplay = "chips" | "text" | "count"; export type SkyComboboxValueChangedDetail = { value: any | any[]; selectedItems: any[]; emittedValues?: any | any[]; isFilteredSelection?: boolean; }; export type SkyComboboxSearchQueryChangedDetail = { searchQuery: string; }; export type SkyComboboxValidationErrorDetail = { errors: string[]; }; export type SkyComboboxValidationSuccessDetail = { value: any; }; export type SkyComboboxIconClickDetail = { position: SkyComboboxIconPosition; event: MouseEvent; }; export type SkyComboboxAddNewOptionDetail = { value: string; }; /** Reserved key on `customRenderers` for renderer UI state (not an option renderer). */ export declare const COMBOBOX_RENDERERS_STATE_KEY = "$rendererState"; export type SkyComboboxRendererStateApi = { rendererState: Readonly>; patchRendererState: (patch: Record) => void; }; export type SkyComboboxOptionRenderContext = SkyComboboxRendererStateApi & { /** Index within the currently filtered dropdown list. */ index: number; /** Index in the original `options` array. */ sourceIndex: number; /** Plain display label (no highlight markup). */ label: string; /** Search-highlighted label HTML string (same as default option text). */ highlightedLabel: string; selected: boolean; /** Keyboard / pointer active row. */ active: boolean; multiSelect: boolean; }; export type SkyComboboxSelectedRenderContext = SkyComboboxRendererStateApi & { selectedItems: any[]; /** Index within `selectedItems`. */ index: number; multiSelect: boolean; multiDisplay: SkyComboboxMultiDisplay; /** Default plain label for this option. */ label: string; }; export type SkyComboboxOptionRenderer = (option: unknown, ctx: SkyComboboxOptionRenderContext) => unknown; export type SkyComboboxSelectedRenderer = (option: unknown, ctx: SkyComboboxSelectedRenderContext) => unknown; export type SkyComboboxCustomRenderers = { /** Custom dropdown option row content (host keeps checkbox / selected chrome). */ option?: SkyComboboxOptionRenderer; /** Custom selected-value / chip label content. */ selected?: SkyComboboxSelectedRenderer; [COMBOBOX_RENDERERS_STATE_KEY]?: Record; }; /** * @element sky-combobox * * @summary Interactive combobox with single/multi select, search, chips, validation, and popover-based option selection. * * @status stable * @since 1.0.0 * * @documentation https://sky-ui.com/components/combobox * @dependency sky-icon * @dependency sky-checkbox * @dependency sky-input * * @uiVModel value value-changed * @uiVModel searchQuery search-query-changed * * @slot icon-left - Slot for the left icon in the combobox (e.g., search icon). * @slot icon-right - Slot for the right icon in the combobox (e.g., dropdown icon). * @slot - Default slot for adding custom options or content. * * @csspart combo-box-container - The main container element wrapping the entire component * @csspart input-wrapper - The input field wrapper that contains chips, icons, and dropdown button * @csspart icon-slot - Both left and right icon containers * @csspart placeholder-label - The placeholder text label * @csspart clear-button - The clear (×) button * @csspart field-trailing - Trailing actions rail (clear, right icon, chevron) * @csspart dropdown-button - The dropdown toggle arrow button * @csspart chip-container - Container for the chips in multi-select mode * @csspart value-summary - Multi-select text/count summary (when `multi-display` is `text` or `count`) * @csspart chip - Individual chip element * @csspart single-select-chip - Chip shown in single-select mode * @csspart overflow-chip - The "+N" chip that shows hidden chips count * @csspart remove-chip-icon - The remove icon within chips * @csspart hidden-chips-dropdown - Dropdown that appears when clicking overflow chip * @csspart hidden-chip-inner - Individual chip in the hidden chips dropdown * @csspart hidden-chip-label - Label text in hidden chips dropdown * @csspart dropdown - The main dropdown container * @csspart search-container - Container for the search input in the dropdown * @csspart search-input - The search input field * @csspart add-option-icon - The "+" icon for adding new options * @csspart select-all - The "Select All" row in the dropdown * @csspart checkbox - Checkbox elements in multi-select mode * @csspart option - Individual option row in the dropdown * @csspart highlighted-text - Highlighted text in search results * @csspart no-options - "No options found" message * @csspart error-list - Container for validation error messages * @csspart error-item - Individual validation error message * @csspart dropdown-scroller - Scrollable container for dropdown options * @csspart chip-label - Label text within chips * * @fires {CustomEvent} value-changed - Fired whenever selection changes. * @fires {CustomEvent} search-query-changed - Fired when search query changes. * @fires {CustomEvent} validation-error - Fired when validation fails. * @fires {CustomEvent} validation-success - Fired when validation passes. * @fires {CustomEvent} icon-click - Fired when icon slot is clicked. * @fires {CustomEvent} add-new-option - Fired when user confirms adding a new option. * * @property {any} value - Current selection value (single) or value array (multi). * @property {string} placeholder - Main placeholder text. * @property {string} searchPlaceholder - Search input placeholder text. * @property {string} searchQuery - Current search filter text when `searchable` is enabled. Default: `""`. * @property {any[]} options - Available options list. * @property {boolean} searchable - Enables search input and filtering. * @property {boolean} addOption - Enables ad-hoc option creation from search query. * @property {boolean} multiSelect - Enables multi-select chip behavior. * @property {boolean} selectAll - Shows select-all row in eligible modes. * @property {boolean} clearable - Shows clear button when value exists. * @property {boolean} loading - Shows loading affordance. * @property {boolean} compact - Enables compact sizing. * @property {boolean} disabled - Disables interaction. * @property {boolean} required - Enables required validation. * @property {boolean} readonly - Enables read-only mode. * @property {boolean} emitFullObject - Emits full option objects in events. * @property {string} emittedKey - Key emitted from object options when `emitFullObject` is false. * @property {string} displayKey - Key used for visual labels in object options. * @property {SkyComboboxCustomRenderers} customRenderers - Named renderers: `option` (dropdown row), `selected` (value/chip label), optional `$rendererState`. * @property {number} visibleChips - Number of visible chips before `+N` overflow chip. * @property {number} chipSize - Maximum label length for each chip. * @property {string} color - Accent color token/CSS color. * @property {number} zIndex - Dropdown overlay z-index. * @property {string} height - Max dropdown scroll height. * @property {boolean} openAbove - Opens dropdown above when true. * @property {SkyComboboxJustify} justify - Option-row content justification. * @property {boolean} showErrors - Renders validation errors below control. * @property {SkyComboboxErrorDisplayMode} errorDisplayMode - Validation error rendering strategy. * @property {(value:any)=>true|string} validations - External validator callbacks. * @property {boolean} validationArrayFormat - Sends selected array into validators when true. * @property {string} prefix - Optional inline prefix text. * @property {string} suffix - Optional inline suffix text. * @property {string} prefixColor - Prefix color value. * @property {string} suffixColor - Suffix color value. * @property {string} requiredMessage - Required validation failure text. * @property {boolean} enforceMinOneSelection - Prevents clearing all selections in multi-select mode. * @property {boolean} validationActive - Enables validation UI state. * @property {boolean} invalid - Reflects invalid state. * @property {string} variant - Visual style: `default`, `highlight`, `fieldset`, or `inside`. * @property {string} label - Label text. Above the field by default; on the border for `fieldset`; inside the field for `inside`. * @property {SkyComboboxMultiDisplay} multiDisplay - Multi-select value UI: `chips` (default), `text` (comma-joined), or `count` (“N selected”). * @property {string} preset - Named prop preset from nearest `sky-config-provider`. Default: `""`. * * @method openDropdown Opens the combobox dropdown. * @method closeDropdown Closes the combobox dropdown. * @method clearSelection Clears current selection if allowed. * @method reset Resets combobox state and clears validation UI. * @method patchRendererState Merges keys into `customRenderers.$rendererState` and re-renders. * * @example * ```html * * ``` * ```vue * * ``` * ```jsx * export default function Demo() { * return ; * } * ``` */ export declare class SkyCombobox extends FormControlBase { static dependencies: Record; /** Current value. Set via attribute in HTML (e.g. value="option-1") or via JS (string or array when multiSelect). Not reflected when set to array from JS. */ value: any; placeholder: string; searchPlaceholder: string; label: string; private _options; get options(): any[]; set options(value: any[] | null | undefined); chipSize: number; color: string; clearable: boolean; loading: boolean; compact: boolean; disabled: boolean; searchable: boolean; multiSelect: boolean; visibleChips: number; selectAll: boolean; private _validations; get validations(): ((value: any) => true | string)[]; set validations(value: ((value: any) => true | string)[] | null | undefined); showErrors: boolean; errorDisplayMode: SkyComboboxErrorDisplayMode; required: boolean; emitFullObject: boolean; emittedKey: string; displayKey: string; private _customRenderers; /** * Named custom renderers for option rows and selected-value labels. * Coerces null/undefined to `{}` for safe framework binding. */ get customRenderers(): SkyComboboxCustomRenderers; set customRenderers(value: SkyComboboxCustomRenderers | null | undefined); addOption: boolean; validationArrayFormat: boolean; prefix: string; suffix: string; prefixColor: string; suffixColor: string; justify: SkyComboboxJustify; zIndex: number; height: string; requiredMessage: string; readonly: boolean; enforceMinOneSelection: boolean; openAbove: boolean; validationActive: boolean; invalid: boolean; variant: "default" | "highlight" | "fieldset" | "inside"; /** Multi-select field presentation. Ignored for single-select. */ multiDisplay: SkyComboboxMultiDisplay; /** Current search filter when `searchable`; exposed for controlled search / `v-model:search-query`. */ searchQuery: string; filteredOptions: any[]; focused: boolean; open: boolean; selectedItems: any[]; hiddenChipsOpen: boolean; activeIndex: number; validationErrors: string[]; validationStatus: any[]; private hasLeftIcon; private hasRightIcon; private optionSlotSet; private _rendererRuntimeState; private inputWrapperEl; private dropdownEl; private hiddenDropdownEl; private searchInputEl; private overflowChipEl; private comboContainerEl; private rowEls; private iconLeftEls; private iconRightEls; private _searchDebounceId; /** When true, skip willUpdate filtering so typing debounce can delay list work. */ private _deferSearchFilter; private _closeResetId; private static readonly _SEARCH_DEBOUNCE_MS; private static readonly _SEARCH_DEBOUNCE_OPTIONS_THRESHOLD; /** Matches PopoverController exit animation so list stays visible while closing. */ private static readonly _CLOSE_RESET_MS; private dropdownPopover; private hiddenPopover; /** Named prop preset from nearest `sky-config-provider`. */ preset: string; private _presets; static styles: import("lit").CSSResult; constructor(); static shadowRootOptions: { clonable?: boolean; customElementRegistry?: CustomElementRegistry | null; mode: ShadowRootMode; serializable?: boolean; slotAssignment?: SlotAssignmentMode; delegatesFocus: boolean; }; connectedCallback(): void; firstUpdated(): void; private refreshOptionSlots; /** Get the current value for form submission */ protected getFormValue(): FormState; /** Set value from form state (e.g., form reset) */ protected setValueFromFormState(state: FormState): void; protected syncFormValue(): void; private setValueFromArray; /** Get the validity anchor (for validation messages) */ protected getValidityAnchor(): HTMLElement | undefined; /** Check if empty (for required validation) */ protected isEmpty(): boolean; protected getNativeControl(): HTMLElement | null; /** Override to provide custom error messages */ protected getCustomErrorMessage(): string; /** Override form reset callback */ protected onFormReset(): void; /** Override form disabled callback */ protected onFormDisabled(disabled: boolean): void; /** Override form state restore callback */ protected onFormStateRestore(state: FormState): void; private toggleSelectAll; private isAllFilteredSelected; private truncateText; private validateInput; protected validateForForm(): string; focus(options?: FocusOptions): void; blur(): void; private handleFocus; /** * Resets combobox state and clears validation UI. * * @returns {void} */ reset(): void; /** * Opens the combobox dropdown. * * @returns {void} */ openDropdown(): void; /** * Closes the combobox dropdown. * * @returns {void} */ closeDropdown(): void; /** * Clears current selection when allowed by component settings. * * @returns {void} */ clearSelection(): void; private handleBlur; updated(changedProperties: Map): void; willUpdate(changedProperties: Map): void; /** Merges runtime renderer state (from `customRenderers.$rendererState`) and re-renders. */ patchRendererState(patch: Record): void; private syncRendererStateFromProp; private rendererStateApi; private buildOptionRenderContext; private buildSelectedRenderContext; private renderOptionContent; private renderSelectedLabel; private renderSelectedSummaryLabel; private syncSelectedItemsWithValue; private filterOptions; /** Emit search query for hosts / `v-model:search-query` when `searchQuery` changes outside the search input handler. */ private emitSearchQueryChanged; private handleSearchValueChanged; private handleSearchValueCleared; private applySearchQuery; disconnectedCallback(): void; private handleClear; selectOption(option: any): void; toggleHiddenChips(e: Event): void; renderHiddenChipsDropdown(): import("lit-html").TemplateResult<1>; removeChip(option: any): void; renderChips(): import("lit-html").TemplateResult<1>; private resolveMultiDisplay; /** Selected value area: chips, joined text, or count summary. */ private renderSelectedValue; handleKeydown(event: KeyboardEvent): void; private onSearchKeydown; /** Number of non-option rows before the first option (search + select-all). */ private get headerRows(); private getOptionByActiveIndex; /** * Commits the current keyboard highlight on Enter (search row vs select-all vs option). * Shared by {@link handleKeydown} and {@link onSearchKeydown} so focus in the search * field matches the same semantics as the input wrapper. */ private commitDropdownEnter; /** Focus logic when opening the dropdown. */ private focusOnOpen; private canAddaddOption; private handleAddaddOption; scrollActiveItemIntoView(): void; toggleDropdown(event: MouseEvent): void; renderDropdown(): import("lit-html").TemplateResult<1>; getOptionValue(option: any): any; /** * Stable string key for comparing options / selection identity. * Prefer `emittedKey` when present on object options; for other objects use * JSON.stringify — never String(object) ("[object Object]"), which makes every * option look selected when `emitFullObject` is true. */ private optionKey; getOptionLabel(option: any): string; renderValidationErrors(): import("lit-html").TemplateResult<1> | null; getErrorMessages(): string[]; handleIconClick(position: "left" | "right", event: MouseEvent): void; private onIconSlotChange; render(): import("lit-html").TemplateResult<1>; }