import type { JSX, ValidComponent } from "@solidjs/web"; import { dynamic } from "@solidjs/web"; import { omit, untrack } from "solid-js"; import { composeRefs, userRef } from "../../internals/compose-refs"; import { mergeRootProps } from "../../internals/merge-root-props"; import { resolveClassStyle } from "../../internals/resolve-class-style"; import type { BaseUIComponentProps } from "../../internals/types"; import { useSelectItemContext } from "../item/select-item-context"; import { useSelectRootContext } from "../select-root-context"; // biome-ignore lint/complexity/noBannedTypes: public empty-state for consumer type references. export type SelectItemTextState = {}; export interface SelectItemTextProps extends BaseUIComponentProps<"div", SelectItemTextState> { as?: ValidComponent; } const EMPTY_STATE: SelectItemTextState = {}; /** * `` — a `
` that carries the selectable text label * inside a ``. */ export function SelectItemText(props: SelectItemTextProps): JSX.Element { const item = useSelectItemContext(); const root = useSelectRootContext(); const setRef = (node: HTMLElement | null): void => untrack(() => { item.textRef.current = node; if (!node || !item.hasRegistered()) return; const selectedTextEl = root.selectedItemTextRef.current; const hasNoSelectedItemText = selectedTextEl === null || !selectedTextEl.isConnected; if ( item.selectedByFocus() || (hasNoSelectedItemText && item.indexRef.current === 0) ) { root.selectedItemTextRef.current = node; } }); const userClassStyle = resolveClassStyle(props, () => EMPTY_STATE); const userProps = omit(props, "as", "class", "style", "attrs"); const merged = mergeRootProps(userClassStyle, userProps); const Tag = dynamic(() => props.as ?? "div"); return ; }