import type { JSX } from 'solid-js'; import { createComponent, createUniqueId, mergeProps } from 'solid-js'; import { omitProps } from 'solid-use/props'; import type { SelectOptionStateOptions, SelectOptionStateRenderProps, } from '../../states/create-select-option-state'; import { SelectOptionStateProvider, createSelectOptionState, } from '../../states/create-select-option-state'; import createDynamic from '../../utils/create-dynamic'; import type { DynamicProps, HeadlessProps, ValidConstructor } from '../../utils/dynamic-prop'; import { createARIADisabledState, createActiveState, createDisabledState, createExpandedState, createSelectedState, } from '../../utils/state-props'; import type { Prettify } from '../../utils/types'; import { useAccordionContext } from './AccordionContext'; import { AccordionItemContext } from './AccordionItemContext'; import { ACCORDION_ITEM_TAG } from './tags'; export type AccordionItemprops = Prettify< SelectOptionStateOptions & SelectOptionStateRenderProps >; export type AccordionItemProps = HeadlessProps< T, AccordionItemprops >; /** * One section of an `Accordion`. The required `value` prop is the id this * section is selected by. * * Renders a `
` by default. * * @see {@link https://github.com/lxsmnsyc/terracotta/blob/main/docs/components/accordion.md} */ export function AccordionItem( props: AccordionItemProps, ): JSX.Element { useAccordionContext('AccordionItem'); const buttonID = createUniqueId(); const panelID = createUniqueId(); const state = createSelectOptionState(props); return createComponent(AccordionItemContext.Provider, { value: { buttonID, panelID }, get children() { return createDynamic( () => props.as ?? ('div' as T), mergeProps( omitProps(props, ['as', 'children', 'value', 'disabled']), ACCORDION_ITEM_TAG, createDisabledState(() => state.disabled()), createARIADisabledState(() => state.disabled()), createSelectedState(() => state.isSelected()), createExpandedState(() => state.isSelected()), createActiveState(() => state.isActive()), { get children() { return createComponent(SelectOptionStateProvider, { state, get children() { return props.children; }, }); }, }, ) as DynamicProps, ); }, }); }