import type { JSX, ValidComponent } from "@solidjs/web"; import { dynamic } from "@solidjs/web"; import { omit } from "solid-js"; import { mergeRootProps } from "../../internals/merge-root-props"; import { resolveClassStyle } from "../../internals/resolve-class-style"; import type { BaseUIComponentProps } from "../../internals/types"; import { type AccordionItemState, useAccordionItemContext, } from "../accordion-item-context.ts"; export interface AccordionHeaderState extends AccordionItemState {} export interface AccordionHeaderProps extends BaseUIComponentProps<"h3", AccordionHeaderState> { /** Tag/component to render. Defaults to `"h3"`. */ as?: ValidComponent; } /** * Heading that labels the accordion's collapsible panel. Renders an `

` * element by default — override via `as` for a different heading level. * * The header inherits all item-level data attributes (`data-open`, * `data-closed`, `data-disabled`, `data-index`) so consumers can style * heading + trigger together. */ export function AccordionHeader(props: AccordionHeaderProps): JSX.Element { const item = useAccordionItemContext(); const userStyling = resolveClassStyle(props, () => item.state()); const userHtmlProps = omit(props, "class", "style", "attrs", "as") as Record< string, unknown >; const internalProps = { get "data-open"(): "" | undefined { return item.state().open ? "" : undefined; }, get "data-closed"(): "" | undefined { return item.state().open ? undefined : ""; }, get "data-disabled"(): "" | undefined { return item.state().disabled ? "" : undefined; }, get "data-index"() { const i = item.state().index; return Number.isInteger(i) ? String(i) : undefined; }, }; const styledUserProps = mergeRootProps(userStyling, userHtmlProps); const merged = mergeRootProps(internalProps, styledUserProps); const Tag = dynamic(() => props.as ?? "h3"); return ; }