UNPKG

bits-ui

Version:

The headless components for Svelte.

365 lines (364 loc) 15.3 kB
/** * Based on Radix UI's Navigation Menu * https://www.radix-ui.com/docs/primitives/components/navigation-menu */ import { type AnyFn, type ReadableBox, type ReadableBoxedValues, type WithRefProps, type WritableBox, type WritableBoxedValues, DOMContext } from "svelte-toolbelt"; import { Context } from "runed"; import { type Snippet } from "svelte"; import { SvelteMap } from "svelte/reactivity"; import { type Direction, type Orientation } from "../../shared/index.js"; import type { BitsFocusEvent, BitsKeyboardEvent, BitsMouseEvent, BitsPointerEvent, RefAttachment } from "../../internal/types.js"; import type { FocusEventHandler, KeyboardEventHandler, MouseEventHandler, PointerEventHandler } from "svelte/elements"; import { RovingFocusGroup } from "../../internal/roving-focus-group.js"; export declare const NavigationMenuItemContext: Context<NavigationMenuItemState>; interface NavigationMenuProviderStateOpts extends ReadableBoxedValues<{ dir: Direction; orientation: Orientation; }>, WritableBoxedValues<{ rootNavigationMenuRef: HTMLElement | null; value: string; previousValue: string; }> { isRootMenu: boolean; onTriggerEnter: (itemValue: string, itemState: NavigationMenuItemState | null) => void; onTriggerLeave?: () => void; onContentEnter?: () => void; onContentLeave?: () => void; onItemSelect: (itemValue: string, itemState: NavigationMenuItemState | null) => void; onItemDismiss: () => void; } declare class NavigationMenuProviderState { static create(opts: NavigationMenuProviderStateOpts): NavigationMenuProviderState; readonly opts: NavigationMenuProviderStateOpts; indicatorTrackRef: WritableBox<HTMLElement | null>; viewportRef: WritableBox<HTMLElement | null>; viewportContent: SvelteMap<string, NavigationMenuItemState>; onTriggerEnter: NavigationMenuProviderStateOpts["onTriggerEnter"]; onTriggerLeave: () => void; onContentEnter: () => void; onContentLeave: () => void; onItemSelect: NavigationMenuProviderStateOpts["onItemSelect"]; onItemDismiss: NavigationMenuProviderStateOpts["onItemDismiss"]; activeItem: NavigationMenuItemState | null; prevActiveItem: NavigationMenuItemState | null; constructor(opts: NavigationMenuProviderStateOpts); setActiveItem: (item: NavigationMenuItemState | null) => void; } interface NavigationMenuRootStateOpts extends WithRefProps, WritableBoxedValues<{ value: string; }>, ReadableBoxedValues<{ dir: Direction; orientation: Orientation; delayDuration: number; skipDelayDuration: number; }> { } export declare class NavigationMenuRootState { #private; static create(opts: NavigationMenuRootStateOpts): NavigationMenuRootState; readonly opts: NavigationMenuRootStateOpts; readonly attachment: RefAttachment; provider: NavigationMenuProviderState; previousValue: WritableBox<string>; isDelaySkipped: WritableBox<boolean>; constructor(opts: NavigationMenuRootStateOpts); setValue: (newValue: string, itemState: NavigationMenuItemState | null) => void; readonly props: { readonly id: string; readonly "data-orientation": "horizontal" | "vertical"; readonly dir: Direction; }; } interface NavigationMenuSubStateOpts extends WithRefProps, WritableBoxedValues<{ value: string; }>, ReadableBoxedValues<{ orientation: Orientation; }> { } export declare class NavigationMenuSubState { static create(opts: NavigationMenuSubStateOpts): NavigationMenuSubState; readonly opts: NavigationMenuSubStateOpts; readonly context: NavigationMenuProviderState; previousValue: WritableBox<string>; readonly subProvider: NavigationMenuProviderState; readonly attachment: RefAttachment; constructor(opts: NavigationMenuSubStateOpts, context: NavigationMenuProviderState); setValue: (newValue: string, itemState: NavigationMenuItemState | null) => void; readonly props: { readonly id: string; readonly "data-orientation": "horizontal" | "vertical"; }; } interface NavigationMenuListStateOpts extends WithRefProps { } export declare class NavigationMenuListState { static create(opts: NavigationMenuListStateOpts): NavigationMenuListState; wrapperId: WritableBox<string>; wrapperRef: WritableBox<HTMLElement | null>; readonly opts: NavigationMenuListStateOpts; readonly context: NavigationMenuProviderState; readonly attachment: RefAttachment; readonly wrapperAttachment: RefAttachment; listTriggers: HTMLElement[]; readonly rovingFocusGroup: RovingFocusGroup; wrapperMounted: boolean; constructor(opts: NavigationMenuListStateOpts, context: NavigationMenuProviderState); registerTrigger(trigger: HTMLElement | null): () => void; readonly wrapperProps: { readonly id: string; }; readonly props: { readonly id: string; readonly "data-orientation": "horizontal" | "vertical"; }; } interface NavigationMenuItemStateOpts extends WithRefProps, ReadableBoxedValues<{ value: string; openOnHover: boolean; }> { } export declare class NavigationMenuItemState { #private; static create(opts: NavigationMenuItemStateOpts): NavigationMenuItemState; readonly opts: NavigationMenuItemStateOpts; readonly attachment: RefAttachment; readonly listContext: NavigationMenuListState; contentNode: HTMLElement | null; triggerNode: HTMLElement | null; focusProxyNode: HTMLElement | null; restoreContentTabOrder: AnyFn; wasEscapeClose: boolean; readonly contentId: string | undefined; readonly triggerId: string | undefined; contentChildren: ReadableBox<Snippet | undefined>; contentChild: ReadableBox<Snippet<[{ props: Record<string, unknown>; }]> | undefined>; contentProps: ReadableBox<Record<string, unknown>>; domContext: DOMContext; constructor(opts: NavigationMenuItemStateOpts, listContext: NavigationMenuListState); onEntryKeydown: (side?: "start" | "end") => void; onFocusProxyEnter: (side?: "start" | "end") => void; onRootContentClose: () => void; onContentFocusOutside: () => void; props: { readonly id: string; }; } interface NavigationMenuTriggerStateOpts extends WithRefProps, ReadableBoxedValues<{ disabled: boolean | null | undefined; }> { } export declare class NavigationMenuTriggerState { static create(opts: NavigationMenuTriggerStateOpts): NavigationMenuTriggerState; readonly opts: NavigationMenuTriggerStateOpts; readonly attachment: RefAttachment; focusProxyId: WritableBox<string>; focusProxyRef: WritableBox<HTMLElement | null>; readonly focusProxyAttachment: RefAttachment; context: NavigationMenuProviderState; itemContext: NavigationMenuItemState; listContext: NavigationMenuListState; hasPointerMoveOpened: WritableBox<boolean>; wasClickClose: boolean; focusProxyMounted: boolean; readonly open: boolean; constructor(opts: NavigationMenuTriggerStateOpts, context: { provider: NavigationMenuProviderState; item: NavigationMenuItemState; list: NavigationMenuListState; sub: NavigationMenuSubState | null; }); onpointerenter: (_: BitsPointerEvent<HTMLButtonElement>) => void; onpointermove: PointerEventHandler<HTMLElement>; onpointerleave: PointerEventHandler<HTMLElement>; onclick: MouseEventHandler<HTMLButtonElement>; onkeydown: KeyboardEventHandler<HTMLButtonElement>; focusProxyOnFocus: FocusEventHandler<HTMLElement>; readonly props: { readonly id: string; readonly disabled: boolean | null | undefined; readonly "data-disabled": "" | undefined; readonly "data-state": "open" | "closed"; readonly "data-value": string; readonly "aria-expanded": "true" | "false"; readonly "aria-controls": string | undefined; readonly onpointermove: PointerEventHandler<HTMLElement>; readonly onpointerleave: PointerEventHandler<HTMLElement>; readonly onpointerenter: (_: BitsPointerEvent<HTMLButtonElement>) => void; readonly onclick: MouseEventHandler<HTMLButtonElement>; readonly onkeydown: KeyboardEventHandler<HTMLButtonElement>; }; readonly focusProxyProps: { readonly id: string; readonly tabindex: 0; readonly onfocus: FocusEventHandler<HTMLElement>; }; } interface NavigationMenuLinkStateOpts extends WithRefProps, ReadableBoxedValues<{ active: boolean; onSelect: (e: Event) => void; }> { } export declare class NavigationMenuLinkState { #private; static create(opts: NavigationMenuLinkStateOpts): NavigationMenuLinkState; readonly opts: NavigationMenuLinkStateOpts; readonly context: { provider: NavigationMenuProviderState; item: NavigationMenuItemState; }; readonly attachment: RefAttachment; isFocused: boolean; constructor(opts: NavigationMenuLinkStateOpts, context: { provider: NavigationMenuProviderState; item: NavigationMenuItemState; }); onclick: (e: BitsMouseEvent<HTMLAnchorElement>) => void; onkeydown: (e: BitsKeyboardEvent) => void; onfocus: (_: BitsFocusEvent) => void; onblur: (_: BitsFocusEvent) => void; onpointerenter: PointerEventHandler<HTMLAnchorElement>; onpointermove: PointerEventHandler<HTMLElement>; readonly props: { readonly id: string; readonly "data-active": "" | undefined; readonly "aria-current": "page" | undefined; readonly "data-focused": "" | undefined; readonly onclick: (e: BitsMouseEvent<HTMLAnchorElement>) => void; readonly onkeydown: (e: BitsKeyboardEvent) => void; readonly onfocus: (_: BitsFocusEvent) => void; readonly onblur: (_: BitsFocusEvent) => void; readonly onpointerenter: PointerEventHandler<HTMLAnchorElement>; readonly onpointermove: PointerEventHandler<HTMLElement>; }; } interface NavigationMenuIndicatorStateOpts extends WithRefProps { } export declare class NavigationMenuIndicatorState { static create(): NavigationMenuIndicatorState; readonly context: NavigationMenuProviderState; readonly isVisible: boolean; constructor(context: NavigationMenuProviderState); } export declare class NavigationMenuIndicatorImplState { static create(opts: NavigationMenuIndicatorStateOpts): NavigationMenuIndicatorImplState; readonly opts: NavigationMenuIndicatorStateOpts; readonly attachment: RefAttachment; context: NavigationMenuProviderState; listContext: NavigationMenuListState; position: { size: number; offset: number; } | null; readonly isHorizontal: boolean; readonly isVisible: boolean; readonly activeTrigger: HTMLElement | null; readonly shouldRender: boolean; constructor(opts: NavigationMenuIndicatorStateOpts, context: { provider: NavigationMenuProviderState; list: NavigationMenuListState; }); handlePositionChange: () => void; readonly props: { readonly id: string; readonly "data-state": "hidden" | "visible"; readonly "data-orientation": "horizontal" | "vertical"; readonly style: { readonly left: number; readonly width: string; readonly transform: string; readonly position: "absolute"; } | { readonly top: number; readonly height: string; readonly transform: string; readonly position: "absolute"; }; }; } interface NavigationMenuContentStateOpts extends WithRefProps { } export declare class NavigationMenuContentState { static create(opts: NavigationMenuContentStateOpts): NavigationMenuContentState; readonly opts: NavigationMenuContentStateOpts; readonly context: NavigationMenuProviderState; readonly itemContext: NavigationMenuItemState; readonly listContext: NavigationMenuListState; readonly attachment: RefAttachment; mounted: boolean; readonly open: boolean; readonly value: string; readonly isLastActiveValue: boolean; constructor(opts: NavigationMenuContentStateOpts, context: { provider: NavigationMenuProviderState; item: NavigationMenuItemState; list: NavigationMenuListState; }); onpointerenter: (_: BitsPointerEvent) => void; onpointerleave: PointerEventHandler<HTMLElement>; readonly props: { readonly id: string; readonly onpointerenter: (_: BitsPointerEvent) => void; readonly onpointerleave: PointerEventHandler<HTMLElement>; }; } type MotionAttribute = "to-start" | "to-end" | "from-start" | "from-end"; interface NavigationMenuContentImplStateOpts extends WithRefProps { } export declare class NavigationMenuContentImplState { static create(opts: NavigationMenuContentImplStateOpts, itemState?: NavigationMenuItemState): NavigationMenuContentImplState; readonly opts: NavigationMenuContentImplStateOpts; readonly itemContext: NavigationMenuItemState; readonly context: NavigationMenuProviderState; readonly listContext: NavigationMenuListState; readonly attachment: RefAttachment; prevMotionAttribute: MotionAttribute | null; readonly motionAttribute: MotionAttribute | null; domContext: DOMContext; constructor(opts: NavigationMenuContentImplStateOpts, itemContext: NavigationMenuItemState); onFocusOutside: (e: Event) => void; onInteractOutside: (e: PointerEvent) => void; onkeydown: (e: BitsKeyboardEvent) => void; onEscapeKeydown: (_: KeyboardEvent) => void; readonly props: { readonly id: string; readonly "aria-labelledby": string | undefined; readonly "data-motion": MotionAttribute | undefined; readonly "data-orientation": "horizontal" | "vertical"; readonly "data-state": "open" | "closed"; readonly onkeydown: (e: BitsKeyboardEvent) => void; }; } interface NavigationMenuViewportStateOpts extends WithRefProps { } export declare class NavigationMenuViewportState { static create(opts: NavigationMenuViewportStateOpts): NavigationMenuViewportState; readonly opts: NavigationMenuViewportStateOpts; readonly context: NavigationMenuProviderState; readonly attachment: RefAttachment; readonly open: boolean; readonly viewportWidth: string | undefined; readonly viewportHeight: string | undefined; readonly activeContentValue: string; size: { width: number; height: number; } | null; contentNode: HTMLElement | null; mounted: boolean; constructor(opts: NavigationMenuViewportStateOpts, context: NavigationMenuProviderState); readonly props: { readonly id: string; readonly "data-state": "open" | "closed"; readonly "data-orientation": "horizontal" | "vertical"; readonly style: { readonly pointerEvents: "none" | undefined; readonly "--bits-navigation-menu-viewport-width": string | undefined; readonly "--bits-navigation-menu-viewport-height": string | undefined; }; readonly onpointerenter: () => void; readonly onpointerleave: () => void; }; } export {};