@ariakit/react-core
Version:
Ariakit React core
450 lines (449 loc) • 28.3 kB
TypeScript
import type { AnyObject, BooleanOrCallback, EmptyObject } from "@ariakit/core/utils/types";
import type { CSSProperties, ReactNode, RefCallback, RefObject } from "react";
import type { Options, Props } from "../utils/types.ts";
import type { CollectionStore, CollectionStoreItem } from "./collection-store.ts";
declare const TagName = "div";
type TagName = typeof TagName;
type NestedRendererItemProps = Pick<CollectionRendererOptions, "gap" | "orientation" | "itemSize" | "estimatedItemSize" | "padding" | "paddingStart" | "paddingEnd">;
interface ItemObject extends AnyObject, NestedRendererItemProps {
/**
* The item unique identifier. If not specified, an ID will be assigned based
* on the item's index. If it's a nested item and the item is not included in
* the `items` property of its parent, it must be composed by all the
* ancestors' IDs and the item's ID, separated by slashes (e.g.,
* `grand/parent/item`).
*/
id?: string;
/**
* The item style object. If the `width` or `height` properties are
* specificed, they will be used to calculate the item size.
*/
style?: CSSProperties;
/**
* A list of nested items. Passing this property will help measure the item
* size.
*/
items?: Item[];
/**
* The rendered item element. This property is assigned to the `items` state
* on the collection store and can be used to calculate the item size.
*/
element?: HTMLElement | null;
}
type Item = ItemObject | Omit<string, string> | Omit<number, string> | Omit<boolean, string> | null | undefined;
type Items<T extends Item> = number | readonly T[];
interface BaseItemProps {
id: string;
ref: RefCallback<HTMLElement>;
style: CSSProperties;
index: number;
}
type ItemProps<T extends Item, P extends BaseItemProps = BaseItemProps> = unknown extends T ? P : P & (T extends AnyObject ? T : {
value: T;
});
type RawItemProps<T extends Item> = unknown extends T ? EmptyObject : T extends AnyObject ? T : {
value: T;
};
declare function getItemId(item: Item, index: number, baseId?: string): string;
declare function getItem<T extends Item = any>(items: Items<T>, index: number): RawItemProps<T> | null;
export declare function useCollectionRenderer<T extends Item = any>({ store, items: itemsProp, initialItems, gap, itemSize, estimatedItemSize, overscan: overscanProp, orientation: orientationProp, padding, paddingStart, paddingEnd, persistentIndices, renderOnScroll, renderOnResize, children: renderItem, ...props }: CollectionRendererProps<T>): {
children: ReactNode[];
wrapElement?: import("../utils/types.ts").WrapElement;
render?: import("../utils/types.ts").RenderProp | import("react").ReactElement;
ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | RefObject<HTMLDivElement> | null | undefined;
defaultChecked?: boolean | undefined | undefined;
defaultValue?: string | number | readonly string[] | undefined;
suppressContentEditableWarning?: boolean | undefined | undefined;
suppressHydrationWarning?: boolean | undefined | undefined;
accessKey?: string | undefined | undefined;
autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
autoFocus?: boolean | undefined | undefined;
className?: string | undefined | undefined;
contentEditable?: "inherit" | (boolean | "false" | "true") | "plaintext-only" | undefined;
contextMenu?: string | undefined | undefined;
dir?: string | undefined | undefined;
draggable?: (boolean | "false" | "true") | undefined;
enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
hidden?: boolean | undefined | undefined;
id?: string | undefined | undefined;
lang?: string | undefined | undefined;
nonce?: string | undefined | undefined;
slot?: string | undefined | undefined;
spellCheck?: (boolean | "false" | "true") | undefined;
style?: CSSProperties | undefined;
tabIndex?: number | undefined | undefined;
title?: string | undefined | undefined;
translate?: "yes" | "no" | undefined | undefined;
radioGroup?: string | undefined | undefined;
role?: import("react").AriaRole | undefined;
about?: string | undefined | undefined;
content?: string | undefined | undefined;
datatype?: string | undefined | undefined;
inlist?: any;
prefix?: string | undefined | undefined;
property?: string | undefined | undefined;
rel?: string | undefined | undefined;
resource?: string | undefined | undefined;
rev?: string | undefined | undefined;
typeof?: string | undefined | undefined;
vocab?: string | undefined | undefined;
autoCorrect?: string | undefined | undefined;
autoSave?: string | undefined | undefined;
color?: string | undefined | undefined;
itemProp?: string | undefined | undefined;
itemScope?: boolean | undefined | undefined;
itemType?: string | undefined | undefined;
itemID?: string | undefined | undefined;
itemRef?: string | undefined | undefined;
results?: number | undefined | undefined;
security?: string | undefined | undefined;
unselectable?: "on" | "off" | undefined | undefined;
inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
is?: string | undefined | undefined;
exportparts?: string | undefined | undefined;
part?: string | undefined | undefined;
"aria-activedescendant"?: string | undefined | undefined;
"aria-atomic"?: (boolean | "false" | "true") | undefined;
"aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
"aria-braillelabel"?: string | undefined | undefined;
"aria-brailleroledescription"?: string | undefined | undefined;
"aria-busy"?: (boolean | "false" | "true") | undefined;
"aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
"aria-colcount"?: number | undefined | undefined;
"aria-colindex"?: number | undefined | undefined;
"aria-colindextext"?: string | undefined | undefined;
"aria-colspan"?: number | undefined | undefined;
"aria-controls"?: string | undefined | undefined;
"aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
"aria-describedby"?: string | undefined | undefined;
"aria-description"?: string | undefined | undefined;
"aria-details"?: string | undefined | undefined;
"aria-disabled"?: (boolean | "false" | "true") | undefined;
"aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
"aria-errormessage"?: string | undefined | undefined;
"aria-expanded"?: (boolean | "false" | "true") | undefined;
"aria-flowto"?: string | undefined | undefined;
"aria-grabbed"?: (boolean | "false" | "true") | undefined;
"aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
"aria-hidden"?: (boolean | "false" | "true") | undefined;
"aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
"aria-keyshortcuts"?: string | undefined | undefined;
"aria-label"?: string | undefined | undefined;
"aria-labelledby"?: string | undefined | undefined;
"aria-level"?: number | undefined | undefined;
"aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
"aria-modal"?: (boolean | "false" | "true") | undefined;
"aria-multiline"?: (boolean | "false" | "true") | undefined;
"aria-multiselectable"?: (boolean | "false" | "true") | undefined;
"aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
"aria-owns"?: string | undefined | undefined;
"aria-placeholder"?: string | undefined | undefined;
"aria-posinset"?: number | undefined | undefined;
"aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
"aria-readonly"?: (boolean | "false" | "true") | undefined;
"aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
"aria-required"?: (boolean | "false" | "true") | undefined;
"aria-roledescription"?: string | undefined | undefined;
"aria-rowcount"?: number | undefined | undefined;
"aria-rowindex"?: number | undefined | undefined;
"aria-rowindextext"?: string | undefined | undefined;
"aria-rowspan"?: number | undefined | undefined;
"aria-selected"?: (boolean | "false" | "true") | undefined;
"aria-setsize"?: number | undefined | undefined;
"aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
"aria-valuemax"?: number | undefined | undefined;
"aria-valuemin"?: number | undefined | undefined;
"aria-valuenow"?: number | undefined | undefined;
"aria-valuetext"?: string | undefined | undefined;
dangerouslySetInnerHTML?: {
__html: string | TrustedHTML;
} | undefined | undefined;
onCopy?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
onCopyCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
onCut?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
onCutCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
onPaste?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
onPasteCapture?: import("react").ClipboardEventHandler<HTMLDivElement> | undefined;
onCompositionEnd?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
onCompositionStart?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
onCompositionUpdate?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLDivElement> | undefined;
onFocus?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
onFocusCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
onBlur?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
onBlurCapture?: import("react").FocusEventHandler<HTMLDivElement> | undefined;
onChange?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onChangeCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onBeforeInput?: import("react").InputEventHandler<HTMLDivElement> | undefined;
onBeforeInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onInput?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onInputCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onReset?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onResetCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onSubmit?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onSubmitCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onInvalid?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onInvalidCapture?: import("react").FormEventHandler<HTMLDivElement> | undefined;
onLoad?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onLoadCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onError?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onErrorCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onKeyDown?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
onKeyPress?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
onKeyUp?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLDivElement> | undefined;
onAbort?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onAbortCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onCanPlay?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onCanPlayCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onCanPlayThrough?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onDurationChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onDurationChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onEmptied?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onEmptiedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onEncrypted?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onEncryptedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onEnded?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onEndedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onLoadedData?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onLoadedDataCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onLoadedMetadata?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onLoadStart?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onLoadStartCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onPause?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onPauseCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onPlay?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onPlayCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onPlaying?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onPlayingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onProgress?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onProgressCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onRateChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onRateChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onSeeked?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onSeekedCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onSeeking?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onSeekingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onStalled?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onStalledCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onSuspend?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onSuspendCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onTimeUpdate?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onVolumeChange?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onWaiting?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onWaitingCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onAuxClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onAuxClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onContextMenu?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onContextMenuCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onDoubleClick?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onDoubleClickCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onDrag?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragEnd?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragEndCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragEnter?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragEnterCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragExit?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragExitCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragLeave?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragLeaveCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragOver?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragOverCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragStart?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDragStartCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDrop?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onDropCapture?: import("react").DragEventHandler<HTMLDivElement> | undefined;
onMouseDown?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseDownCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseEnter?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseLeave?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseMove?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseMoveCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseOut?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseOutCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseOver?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseOverCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseUp?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onMouseUpCapture?: import("react").MouseEventHandler<HTMLDivElement> | undefined;
onSelect?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onSelectCapture?: import("react").ReactEventHandler<HTMLDivElement> | undefined;
onTouchCancel?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onTouchCancelCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onTouchEnd?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onTouchEndCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onTouchMove?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onTouchMoveCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onTouchStart?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onTouchStartCapture?: import("react").TouchEventHandler<HTMLDivElement> | undefined;
onPointerDown?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerDownCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerMove?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerMoveCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerUp?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerUpCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerCancel?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerCancelCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerEnter?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerLeave?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerOver?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerOverCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerOut?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onPointerOutCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onGotPointerCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onLostPointerCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLDivElement> | undefined;
onScroll?: import("react").UIEventHandler<HTMLDivElement> | undefined;
onScrollCapture?: import("react").UIEventHandler<HTMLDivElement> | undefined;
onWheel?: import("react").WheelEventHandler<HTMLDivElement> | undefined;
onWheelCapture?: import("react").WheelEventHandler<HTMLDivElement> | undefined;
onAnimationStart?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
onAnimationEnd?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
onAnimationIteration?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLDivElement> | undefined;
onTransitionEnd?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLDivElement> | undefined;
key?: import("react").Key | null | undefined;
};
export declare const CollectionRenderer: <T extends Item = any>(props: CollectionRendererProps<T>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
export declare const getCollectionRendererItem: typeof getItem;
export declare const getCollectionRendererItemId: typeof getItemId;
export type CollectionRendererItemObject = ItemObject;
export type CollectionRendererItem = Item;
export type CollectionRendererBaseItemProps = BaseItemProps;
export type CollectionRendererItemProps<T extends Item, P extends BaseItemProps = BaseItemProps> = ItemProps<T, P>;
export interface CollectionRendererOptions<T extends Item = any> extends Options {
/**
* Object returned by the
* [`useCollectionStore`](https://ariakit.org/reference/use-collection-store)
* hook. If not provided, the closest
* [Collection](https://ariakit.org/components/collection) component's
* context will be used.
*
* The store
* [`items`](https://ariakit.org/reference/use-collection-store#items) state
* will be used to render the items if the
* [`items`](https://ariakit.org/reference/collection-items#items) prop is not
* provided.
*/
store?: CollectionStore<T extends CollectionStoreItem ? T : CollectionStoreItem>;
/**
* All items to be rendered. This prop can be either a memoized array of items
* or a number representing the total number of items to be rendered.
*
* When passing an array, each item can be either a primitive value or an
* object. If it's a primitive value, an object with the `value` property will
* be automatically created for each item and passed as an argument to the
* function that renders the item. If it's an object, the entire object will
* be passed.
*
* The item object can have any shape, but some **optional** properties have
* particular functions:
* - `id`: The same as the HTML attribute. If not provided, one will be
* generated automatically.
* - `style`: The same as the HTML attribute. This will be merged with the
* styles generated by the component for each item. If the `width` or
* `height` properties are explicitly provided here, they will be used to
* calculate the item's size. This is useful when rendering items with known
* variable sizes.
* - `items`: An array of items to be rendered as children of this item. This
* is useful when rendering nested items. This property is recommended when
* rendering nested items because it will help the parent renderer calculate
* the size and position of the nested items.
*
* Also, When rendering nested renderers, you can optionally include props
* like `gap`, `orientation`, `itemSize`, `estimatedItemSize`, `padding`,
* `paddingStart`, and `paddingEnd`. These props will help the parent renderer
* calculate the size and position of the nested renderers.
*/
items?: Items<T>;
/**
* Whether the items should be rendered when the closest scrollable ancestor
* is scrolled.
* @default true
*/
renderOnScroll?: BooleanOrCallback<Event>;
/**
* Whether the items should be rendered when the closest scrollable ancestor
* is resized.
* @default true
*/
renderOnResize?: BooleanOrCallback<Element>;
/**
* The number of items to render initially. Can be set to a negative number to
* render items from the end of the list.
* @default 0
*/
initialItems?: number;
/**
* Whether the items should be rendered vertically or horizontally.
* @default "vertical"
*/
orientation?: "vertical" | "horizontal";
/**
* The fixed size of each item in pixels. If not provided, the size will be
* automatically calculated.
*/
itemSize?: number;
/**
* The estimated size of each item in pixels. This is used to calculate the
* initial size of the items before they are rendered.
* @default 40
*/
estimatedItemSize?: number;
/**
* The gap between each item in pixels.
* @default 0
*/
gap?: number;
/**
* The number of items to render before and after the visible items.
* @default 1
*/
overscan?: number;
/**
* The item indices that should always be rendered.
*/
persistentIndices?: number[];
/**
* The padding between the items and the container in pixels. This value will
* be used for both the `paddingStart` and `paddingEnd` props, if they are not
* explicitly provided.
* @default 0
*/
padding?: number;
/**
* The padding between the items and the container's start edge in pixels.
* This value will override the `padding` prop if it is explicitly provided.
* @default 0
*/
paddingStart?: number;
/**
* The padding between the items and the container's end edge in pixels. This
* value will override the `padding` prop if it is explicitly provided.
* @default 0
*/
paddingEnd?: number;
/**
* The `children` should be a function that receives item props and returns a
* React element. The item props should be spread onto the element that
* renders the item.
*/
children?: (item: ItemProps<T>) => ReactNode;
}
export interface CollectionRendererProps<T extends Item = any> extends Props<TagName, CollectionRendererOptions<T>> {
}
export {};