bits-ui
Version:
The headless components for Svelte.
361 lines (360 loc) • 12.7 kB
TypeScript
import { type WritableBoxedValues, type ReadableBoxedValues } from "svelte-toolbelt";
import type { CommandState } from "./types.js";
import type { BitsKeyboardEvent, BitsMouseEvent, BitsPointerEvent, RefAttachment, WithRefOpts } from "../../internal/types.js";
interface GridItem {
index: number;
firstRowOfGroup: boolean;
ref: HTMLElement;
}
type ItemsGrid = GridItem[][];
interface CommandRootStateOpts extends WithRefOpts, ReadableBoxedValues<{
filter: (value: string, search: string, keywords?: string[]) => number;
shouldFilter: boolean;
loop: boolean;
vimBindings: boolean;
columns: number | null;
disablePointerSelection: boolean;
disableInitialScroll: boolean;
onStateChange?: (state: Readonly<CommandState>) => void;
}>, WritableBoxedValues<{
value: string;
}> {
}
export declare class CommandRootState {
#private;
static create(opts: CommandRootStateOpts): CommandRootState;
readonly opts: CommandRootStateOpts;
readonly attachment: RefAttachment;
sortAfterTick: boolean;
sortAndFilterAfterTick: boolean;
allItems: Set<string>;
allGroups: Map<string, Set<string>>;
allIds: Map<string, {
value: string;
keywords?: string[];
}>;
key: number;
viewportNode: HTMLElement | null;
inputNode: HTMLElement | null;
labelNode: HTMLElement | null;
commandState: CommandState;
_commandState: CommandState;
setState<K extends keyof CommandState>(key: K, value: CommandState[K], preventScroll?: boolean): void;
constructor(opts: CommandRootStateOpts);
/**
* Sets current value and triggers re-render if cleared.
*
* @param value - New value to set
*/
setValue(value: string, opts?: boolean): void;
/**
* Gets all non-disabled, visible command items.
*
* @returns Array of valid item elements
* @remarks Exposed for direct item access and bound checking
*/
getValidItems(): HTMLElement[];
/**
* Gets all visible command items.
*
* @returns Array of valid item elements
* @remarks Exposed for direct item access and bound checking
*/
getVisibleItems(): HTMLElement[];
/** Returns all visible items in a matrix structure
*
* @remarks Returns empty if the command isn't configured as a grid
*
* @returns
*/
get itemsGrid(): ItemsGrid;
/**
* Sets selection to item at specified index in valid items array.
* If index is out of bounds, does nothing.
*
* @param index - Zero-based index of item to select
* @remarks
* Uses `getValidItems()` to get selectable items, filtering out disabled/hidden ones.
* Access valid items directly via `getValidItems()` to check bounds before calling.
*
* @example
* // get valid items length for bounds check
* const items = getValidItems()
* if (index < items.length) {
* updateSelectedToIndex(index)
* }
*/
updateSelectedToIndex(index: number): void;
/**
* Updates selected item by moving up/down relative to current selection.
* Handles wrapping when loop option is enabled.
*
* @param change - Direction to move: 1 for next item, -1 for previous item
* @remarks
* The loop behavior wraps:
* - From last item to first when moving next
* - From first item to last when moving previous
*
* Uses `getValidItems()` to get all selectable items, which filters out disabled/hidden items.
* You can call `getValidItems()` directly to get the current valid items array.
*
* @example
* // select next item
* updateSelectedByItem(1)
*
* // get all valid items
* const items = getValidItems()
*/
updateSelectedByItem(change: number): void;
/**
* Moves selection to the first valid item in the next/previous group.
* If no group is found, falls back to selecting the next/previous item globally.
*
* @param change - Direction to move: 1 for next group, -1 for previous group
* @example
* // move to first item in next group
* updateSelectedByGroup(1)
*
* // move to first item in previous group
* updateSelectedByGroup(-1)
*/
updateSelectedByGroup(change: 1 | -1): void;
/**
* Maps item id to display value and search keywords.
* Returns cleanup function to remove mapping.
*
* @param id - Unique item identifier
* @param value - Display text
* @param keywords - Optional search boost terms
* @returns Cleanup function
*/
registerValue(value: string, keywords?: string[]): () => void;
/**
* Registers item in command list and its group.
* Handles filtering, sorting and selection updates.
*
* @param id - Item identifier
* @param groupId - Optional group to add item to
* @returns Cleanup function that handles selection
*/
registerItem(id: string, groupId: string | undefined): () => void;
/**
* Creates empty group if not exists.
*
* @param id - Group identifier
* @returns Cleanup function
*/
registerGroup(id: string): () => void;
get isGrid(): boolean;
onkeydown(e: BitsKeyboardEvent): void;
props: {
readonly id: string;
readonly role: "application";
readonly tabindex: -1;
readonly onkeydown: (e: BitsKeyboardEvent) => void;
};
}
interface CommandEmptyStateOpts extends WithRefOpts, ReadableBoxedValues<{
forceMount: boolean;
}> {
}
export declare class CommandEmptyState {
#private;
static create(opts: CommandEmptyStateOpts): CommandEmptyState;
readonly opts: CommandEmptyStateOpts;
readonly root: CommandRootState;
readonly attachment: RefAttachment;
readonly shouldRender: boolean;
constructor(opts: CommandEmptyStateOpts, root: CommandRootState);
readonly props: {
readonly id: string;
readonly role: "presentation";
};
}
interface CommandGroupContainerStateOpts extends WithRefOpts, ReadableBoxedValues<{
value: string;
forceMount: boolean;
}> {
}
export declare class CommandGroupContainerState {
static create(opts: CommandGroupContainerStateOpts): CommandGroupContainerState;
readonly opts: CommandGroupContainerStateOpts;
readonly root: CommandRootState;
readonly attachment: RefAttachment;
readonly shouldRender: boolean;
headingNode: HTMLElement | null;
trueValue: string;
constructor(opts: CommandGroupContainerStateOpts, root: CommandRootState);
readonly props: {
readonly id: string;
readonly role: "presentation";
readonly hidden: true | undefined;
readonly "data-value": string;
};
}
interface CommandGroupHeadingStateOpts extends WithRefOpts {
}
export declare class CommandGroupHeadingState {
static create(opts: CommandGroupHeadingStateOpts): CommandGroupHeadingState;
readonly opts: CommandGroupHeadingStateOpts;
readonly group: CommandGroupContainerState;
readonly attachment: RefAttachment;
constructor(opts: CommandGroupHeadingStateOpts, group: CommandGroupContainerState);
readonly props: {
readonly id: string;
};
}
interface CommandGroupItemsStateOpts extends WithRefOpts {
}
export declare class CommandGroupItemsState {
static create(opts: CommandGroupItemsStateOpts): CommandGroupItemsState;
readonly opts: CommandGroupItemsStateOpts;
readonly group: CommandGroupContainerState;
readonly attachment: RefAttachment;
constructor(opts: CommandGroupItemsStateOpts, group: CommandGroupContainerState);
readonly props: {
readonly id: string;
readonly role: "group";
readonly "aria-labelledby": string | undefined;
};
}
interface CommandInputStateOpts extends WithRefOpts, WritableBoxedValues<{
value: string;
}>, ReadableBoxedValues<{
autofocus: boolean;
}> {
}
export declare class CommandInputState {
#private;
static create(opts: CommandInputStateOpts): CommandInputState;
readonly opts: CommandInputStateOpts;
readonly root: CommandRootState;
readonly attachment: RefAttachment;
constructor(opts: CommandInputStateOpts, root: CommandRootState);
readonly props: {
readonly id: string;
readonly type: "text";
readonly autocomplete: "off";
readonly autocorrect: "off";
readonly spellcheck: false;
readonly "aria-autocomplete": "list";
readonly role: "combobox";
readonly "aria-expanded": "true" | "false";
readonly "aria-controls": string | undefined;
readonly "aria-labelledby": string | undefined;
readonly "aria-activedescendant": string | undefined;
};
}
interface CommandItemStateOpts extends WithRefOpts, ReadableBoxedValues<{
value: string;
disabled: boolean;
onSelect: () => void;
forceMount: boolean;
keywords: string[];
}> {
group: CommandGroupContainerState | null;
}
export declare class CommandItemState {
#private;
static create(opts: Omit<CommandItemStateOpts, "group">): CommandItemState;
readonly opts: CommandItemStateOpts;
readonly root: CommandRootState;
readonly attachment: RefAttachment;
readonly shouldRender: boolean;
readonly isSelected: boolean;
trueValue: string;
constructor(opts: CommandItemStateOpts, root: CommandRootState);
onpointermove(_: BitsPointerEvent): void;
onclick(_: BitsMouseEvent): void;
readonly props: {
readonly id: string;
readonly "aria-disabled": "true" | "false";
readonly "aria-selected": "true" | "false";
readonly "data-disabled": "" | undefined;
readonly "data-selected": "" | undefined;
readonly "data-value": string;
readonly "data-group": string | undefined;
readonly role: "option";
readonly onpointermove: (_: BitsPointerEvent) => void;
readonly onclick: (_: BitsMouseEvent) => void;
};
}
interface CommandLoadingStateOpts extends WithRefOpts, ReadableBoxedValues<{
progress: number;
}> {
}
export declare class CommandLoadingState {
static create(opts: CommandLoadingStateOpts): CommandLoadingState;
readonly opts: CommandLoadingStateOpts;
readonly attachment: RefAttachment;
constructor(opts: CommandLoadingStateOpts);
readonly props: {
readonly id: string;
readonly role: "progressbar";
readonly "aria-valuenow": number;
readonly "aria-valuemin": 0;
readonly "aria-valuemax": 100;
readonly "aria-label": "Loading...";
};
}
interface CommandSeparatorStateOpts extends WithRefOpts, ReadableBoxedValues<{
forceMount: boolean;
}> {
}
export declare class CommandSeparatorState {
static create(opts: CommandSeparatorStateOpts): CommandSeparatorState;
readonly opts: CommandSeparatorStateOpts;
readonly root: CommandRootState;
readonly attachment: RefAttachment;
readonly shouldRender: boolean;
constructor(opts: CommandSeparatorStateOpts, root: CommandRootState);
readonly props: {
readonly id: string;
readonly "aria-hidden": "true";
};
}
interface CommandListStateOpts extends WithRefOpts, ReadableBoxedValues<{
ariaLabel: string;
}> {
}
export declare class CommandListState {
static create(opts: CommandListStateOpts): CommandListState;
readonly opts: CommandListStateOpts;
readonly root: CommandRootState;
readonly attachment: RefAttachment;
constructor(opts: CommandListStateOpts, root: CommandRootState);
readonly props: {
readonly id: string;
readonly role: "listbox";
readonly "aria-label": string;
};
}
interface CommandLabelStateOpts extends WithRefOpts, ReadableBoxedValues<{
for?: string;
}> {
}
export declare class CommandLabelState {
static create(opts: CommandLabelStateOpts): CommandLabelState;
readonly opts: CommandLabelStateOpts;
readonly root: CommandRootState;
readonly attachment: RefAttachment;
constructor(opts: CommandLabelStateOpts, root: CommandRootState);
readonly props: {
readonly id: string;
readonly for: string | undefined;
readonly style: import("svelte-toolbelt").StyleProperties;
};
}
interface CommandViewportStateOpts extends WithRefOpts {
}
export declare class CommandViewportState {
static create(opts: CommandViewportStateOpts): CommandViewportState;
readonly opts: CommandViewportStateOpts;
readonly list: CommandListState;
readonly attachment: RefAttachment;
constructor(opts: CommandViewportStateOpts, list: CommandListState);
readonly props: {
readonly id: string;
};
}
export {};