"use client"; import clsx from "clsx"; import { Children, useContext, useState } from "react"; import type { CSSProperties, FC, HTMLAttributes, PropsWithChildren, } from "react"; import { DisabledContext } from "../../contexts/DisabledContext"; import { Text } from "../Text"; import styles from "./Fieldset.module.css"; const Status: FC = ({ children }) => { return
{children}
; }; const Actions: FC = ({ children }) => { return (
{children}
); }; interface FooterProps { style?: CSSProperties; disabled?: boolean; highlight?: boolean; } interface IFooter extends FC> { Status: typeof Status; Actions: typeof Actions; } const Footer: IFooter = ({ children, style, disabled, highlight }) => { const ctxDisabled = useContext(DisabledContext); const isDisabled = disabled ?? ctxDisabled; return (
{isDisabled &&
} {children}
); }; Footer.Status = Status; Footer.Actions = Actions; interface Fs { Tabs: FC< PropsWithChildren<{ tabs: string[] }> & HTMLAttributes >; Fieldset: FC< PropsWithChildren<{ disabled?: boolean }> & HTMLAttributes >; Content: FC< PropsWithChildren<{ disabled?: boolean }> & HTMLAttributes >; Title: FC; Subtitle: FC; ErrorText: FC; Footer: typeof Footer; } const Tabs = ({ children, tabs, ...props }) => { const [activeIndex, setActiveIndex] = useState(0); return (
{tabs.map((e, i) => ( ))}
{Children.toArray(children)[activeIndex]}
); }; const ErrorText = ({ children }) => { return {children}; }; /** * # fs * @example * ```tsx * * * fs.Title * fs.Subtitle * * * fs.Footer.Status * * * * * * ``` */ const fs: Fs = { Tabs: Tabs, Fieldset: ({ className, disabled, ...props }) => (
), Content: ({ className, children, disabled, ...props }) => { const ctxDisabled = useContext(DisabledContext); const isDisabled = disabled ?? ctxDisabled; return (
{isDisabled &&
} {children}
); }, Title: ({ children, ...props }) => ( {children} ), Subtitle: ({ children, ...props }) => ( {children} ), ErrorText: ErrorText, Footer: Footer, }; export default fs;