import type { JSX, Accessor, Setter } from "solid-js"; import { createContext, useContext, createSignal, onMount, For, } from "solid-js"; import { Button } from "@/components/Button"; import clsx from "clsx"; type TabType = { label: string; value: string; }; type TabsContextType = { selectedTab: Accessor; setSelectedTab: Setter; tabs: Accessor; addTab: (tab: TabType) => void; }; const TabsContext = createContext({ selectedTab: () => "", setSelectedTab: () => {}, tabs: () => [], addTab: () => {}, }); export default function Tabs(props: { defaultSelectedTab?: string; children: JSX.Element; }) { const [selectedTab, setSelectedTab] = createSignal( props.defaultSelectedTab || "", ); const [tabs, setTabs] = createSignal([]); const addTab = (tab: TabType) => { setTabs((prevTabs) => { // Append to the end of the array and make sure it's unique if (prevTabs.some((t) => t.value === tab.value)) { return prevTabs; } return [...prevTabs, tab]; }); }; return (
    {(tab) => (
  • setSelectedTab(tab.value)} />
  • )}
{props.children}
); } function TabItem(props: { tab: TabType; isSelected: boolean; select: () => void; }) { return ( ); } Tabs.Item = (props: { label: string; value: string; children: JSX.Element; }) => { const tabsContext = useContext(TabsContext); if (!tabsContext) { throw new Error("Tabs.Item must be used within Tabs"); } onMount(() => { tabsContext.addTab({ label: props.label, value: props.value }); }); return (
{props.children}
); };