import React from 'react'; import classnames from 'classnames'; import { Accordion as CoreAccordion, type AccordionItemProps as CoreAccordionItemProps, type AccordionProps as CoreAccordionProps, } from '@shoptet/ui-core-web'; import type { Exact } from '@shoptet/utils'; import type { OmitPrivate } from '../../types'; import { Icon } from '../Icon/Icon'; // ─── Accordion ────────────────────────────────────────────────────────────── export interface InheritedCoreAccordionProps extends OmitPrivate> {} export interface AccordionOwnProps { children: React.ReactNode; /** * Add background to the accordion. * @default false */ withBackground?: boolean; /** * Add a divider between accordion items. * @default 'off' */ divider?: 'off' | 'top' | 'bottom' | 'topBottom'; /** * Renders the accordion with compact spacing and a smaller title. * @default false */ dense?: boolean; } export interface AccordionProps extends AccordionOwnProps, InheritedCoreAccordionProps {} // ─── AccordionItem ─────────────────────────────────────────────────────────── export interface InheritedCoreAccordionItemProps extends OmitPrivate< Omit > {} export interface AccordionItemOwnProps { /** * Title of the accordion item. */ title: string; /** * Content of the accordion item. */ children: React.ReactNode; } export interface AccordionItemProps extends AccordionItemOwnProps, InheritedCoreAccordionItemProps {} function AccordionItem({ title, children, ...restProps }: AccordionItemProps) { restProps satisfies Exact; return ( classnames('accordion__item', { 'accordion__item--open': state.expanded, }) } {...restProps} > {title} classnames('accordion__content', { 'accordion__content--open': state.expanded })} > {children} ); } // ─── Accordion compound component ─────────────────────────────────────────── export const Accordion = Object.assign( function Accordion({ withBackground, divider = 'off', dense = false, children, ...restProps }: AccordionProps) { restProps satisfies Exact; return ( {children} ); }, { Item: Object.assign(AccordionItem, { displayName: 'Accordion.Item', }), } );