{"version":3,"file":"Tabs.cjs","names":[],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n    id: string;\n    label: ReactNode;\n    content: ReactNode;\n    disabled?: boolean;\n}\n\nexport interface TabsProps {\n    items: TabItem[];\n    /** Initial active tab id. Defaults to the first non-disabled item. */\n    defaultId?: string;\n    /** Controlled active id. When provided, ignore internal state. */\n    activeId?: string;\n    onChange?: (id: string) => void;\n    variant?: \"underline\" | \"pill\";\n    className?: string;\n}\n\n/**\n * Accessible tabs with an underline (default) or pill variant. Controlled via\n * `activeId` + `onChange` or uncontrolled via `defaultId`.\n */\nexport function Tabs({\n    items,\n    defaultId,\n    activeId,\n    onChange,\n    variant = \"underline\",\n    className,\n}: TabsProps) {\n    const firstEnabled = items.find((item) => !item.disabled);\n    const [internal, setInternal] = useState<string | undefined>(defaultId ?? firstEnabled?.id);\n\n    const isControlled = activeId !== undefined;\n    const current = isControlled ? activeId : internal;\n    const active = items.find((item) => item.id === current) ?? firstEnabled;\n\n    function activate(id: string): void {\n        if (!isControlled) setInternal(id);\n        onChange?.(id);\n    }\n\n    return (\n        <div className={className}>\n            <div role=\"tablist\" className={cn(styles.tablist, variant === \"pill\" && styles.pill)}>\n                {items.map((item) => {\n                    const isActive = item.id === active?.id;\n                    return (\n                        <button\n                            key={item.id}\n                            type=\"button\"\n                            role=\"tab\"\n                            aria-selected={isActive}\n                            aria-controls={`panel-${item.id}`}\n                            id={`tab-${item.id}`}\n                            disabled={item.disabled}\n                            className={cn(styles.tab, isActive && styles.active)}\n                            onClick={() => activate(item.id)}\n                        >\n                            {item.label}\n                        </button>\n                    );\n                })}\n            </div>\n            {active && (\n                <div\n                    role=\"tabpanel\"\n                    id={`panel-${active.id}`}\n                    aria-labelledby={`tab-${active.id}`}\n                    className={styles.panel}\n                >\n                    {active.content}\n                </div>\n            )}\n        </div>\n    );\n}\n"],"mappings":"2HA2BA,SAAgB,EAAK,CACjB,QACA,YACA,WACA,WACA,UAAU,YACV,aACU,CACV,IAAM,EAAe,EAAM,KAAM,GAAS,CAAC,EAAK,QAAQ,EAClD,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAA6B,GAAa,GAAc,EAAE,EAEpF,EAAe,IAAa,IAAA,GAC5B,EAAU,EAAe,EAAW,EACpC,EAAS,EAAM,KAAM,GAAS,EAAK,KAAO,CAAO,GAAK,EAE5D,SAAS,EAAS,EAAkB,CAC3B,GAAc,EAAY,CAAE,EACjC,IAAW,CAAE,CACjB,CAEA,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,YAAhB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,KAAK,UAAU,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,IAAY,QAAU,EAAA,QAAO,IAAI,EAC9E,SAAA,EAAM,IAAK,GAAS,CACjB,IAAM,EAAW,EAAK,KAAO,GAAQ,GACrC,OACI,EAAA,EAAA,IAAA,CAAC,SAAD,CAEI,KAAK,SACL,KAAK,MACL,gBAAe,EACf,gBAAe,SAAS,EAAK,KAC7B,GAAI,OAAO,EAAK,KAChB,SAAU,EAAK,SACf,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,GAAY,EAAA,QAAO,MAAM,EACnD,YAAe,EAAS,EAAK,EAAE,EAE9B,SAAA,EAAK,KACF,EAXC,EAAK,EAWN,CAEhB,CAAC,CACA,CAAA,EACJ,IACG,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,KAAK,WACL,GAAI,SAAS,EAAO,KACpB,kBAAiB,OAAO,EAAO,KAC/B,UAAW,EAAA,QAAO,MAEjB,SAAA,EAAO,OACP,CAAA,CAER,GAEb"}