import React, { Fragment, type ComponentProps, type FC, type ReactNode } from 'react'; import { Tabs } from '@base-ui/react/tabs'; import { cn } from '@wener/console'; import { Daisy } from '@wener/console/daisy'; import { flexRender, type FlexRenderable } from '@wener/reaction'; import { isNodeTypeOf } from '../utils/isNodeTypeOf'; export type DaisyTabsCompositeProps = Omit & { ref?: React.Ref; list?: ReactNode; // content?:ReactNode tabs?: Array<{ label?: ReactNode; trigger?: ReactNode; key?: string; href?: string; icon?: FlexRenderable; action?: ReactNode; content?: ReactNode; asChild?: boolean; }>; renderList?: (props: { children: ReactNode }) => ReactNode; renderContent?: (props: { children: ReactNode }) => ReactNode; } & Pick; export const DaisyTabsComposite = ({ children, renderContent = (props) => props.children, renderList = (props) => props.children, tabs = [], list, size, variant, title, action, ref, ...props }: DaisyTabsCompositeProps) => { if (!list) { list = ( {tabs.map((item, index) => { const { label, href, icon } = item; const key = item.key ?? String(index); const Tag = item.href ? 'a' : 'button'; let trigger: ReactNode; if (isNodeTypeOf(item.trigger, [DaisyTabsTrigger, Tabs.Tab])) { trigger = item.trigger; } else if (item.trigger) { trigger = ( {item.trigger} ); } else if (item.href) { trigger = ( {flexRender(icon, {})} {label} ); } else { trigger = ( {flexRender(icon, {})} {label} ); } return trigger; })} ); } let hasContent = tabs.some((v) => v.content); let content: ReactNode = null; if (hasContent) { content = ( {tabs.map((item, index) => { const key = item.key ?? String(index); let c = isNodeTypeOf(item.content, [DaisyTabsPanel, Tabs.Panel]) ? ( item.content ) : ( {item.content} ); return c; })} ); } return ( {renderList({ children: list })} {children} {renderContent({ children: content })} ); }; export interface DaisyTabsRootProps extends React.ComponentProps {} export const DaisyTabsRoot: FC = ({ className, ...props }) => { return ; }; export interface DaisyTabsPanelProps extends React.ComponentProps {} export const DaisyTabsPanel: FC = ({ className, ...props }) => { return ; }; export interface DaisyTabsListProps extends Omit, 'title'> { size?: Daisy.SizeType; variant?: 'boxed' | 'bordered' | 'lifted'; action?: React.ReactNode; title?: React.ReactNode; } export const DaisyTabsList: FC = ({ className, variant, size, action, title, children, ...props }) => { const sz = Daisy.getSize(size); return ( {variant === 'lifted' && (

{title}

)}
{children}
{variant === 'lifted' && (
)} {variant === 'lifted' && action && (
{action}
)} ); }; export interface DaisyTabsTriggerProps extends ComponentProps {} export const DaisyTabsTrigger: FC = ({ className, ...props }) => { return ( ); }; export const DaisyTabs = { Composite: DaisyTabsComposite, Root: DaisyTabsRoot, List: DaisyTabsList, Tab: DaisyTabsTrigger, Trigger: DaisyTabsTrigger, // Backward compatibility alias Panel: DaisyTabsPanel, Content: DaisyTabsPanel, // Backward compatibility alias } as const;