TabContainer e TabButton trabalham juntos para criar interfaces de navegação por abas intuitivas e acessíveis. O TabContainer atua como wrapper fornecendo contexto e estado, enquanto os TabButton são os elementos clicáveis individuais que representam cada aba.tsx
import { TabContainer, TabButton } from "@arkyn/components";
tsx
<TabContainer><TabButton value="home">Home</TabButton><TabButton value="about">Sobre</TabButton><TabButton value="contact">Contato</TabButton></TabContainer>
defaultValue.tsx
<TabContainer defaultValue="dashboard"><TabButton value="dashboard">Dashboard</TabButton><TabButton value="analytics">Analytics</TabButton><TabButton value="settings">Configurações</TabButton></TabContainer>
tsx
<TabContainer defaultValue="profile"><TabButton value="profile"><User size={16} style={{ marginRight: "6px" }} />Perfil</TabButton><TabButton value="settings"><Settings size={16} style={{ marginRight: "6px" }} />Configurações</TabButton><TabButton value="notifications"><Bell size={16} style={{ marginRight: "6px" }} />Notificações</TabButton></TabContainer>
onChange para reagir a mudanças de aba e controlar conteúdo dinâmico.tsx
function TabExample() {const [activeTab, setActiveTab] = useState("overview");return (<div><TabContainerdefaultValue="overview"onChange={(value) => {setActiveTab(value);console.log("Aba ativa:", value);}}><TabButton value="overview"><BarChart3 size={16} style={{ marginRight: "6px" }} />Visão Geral</TabButton><TabButton value="reports"><FileText size={16} style={{ marginRight: "6px" }} />Relatórios</TabButton><TabButton value="calendar"><Calendar size={16} style={{ marginRight: "6px" }} />Calendário</TabButton></TabContainer>{/* Renderizar conteúdo baseado na aba ativa */}<divstyle={{marginTop: "16px",padding: "16px",border: "1px solid #e2e8f0",}}>{activeTab === "overview" && <div>Conteúdo da Visão Geral</div>}{activeTab === "reports" && <div>Conteúdo dos Relatórios</div>}{activeTab === "calendar" && <div>Conteúdo do Calendário</div>}</div></div>);}
tsx
<TabContainer defaultValue="available"><TabButton value="available">Disponível</TabButton><TabButton value="disabled" disabled>Desabilitada</TabButton><TabButton value="coming-soon" disabled>Em Breve</TabButton></TabContainer>
tsx
<TabContainer disabled><TabButton value="tab1">Tab 1</TabButton><TabButton value="tab2">Tab 2</TabButton><TabButton value="tab3">Tab 3</TabButton></TabContainer>
TabButton pode ter seu próprio handler de clique além da mudança de aba.tsx
function NavigationTabs() {const handleFavoritesClick = () => {console.log("Favoritos clicado");// Lógica específica para favoritostrackEvent("tab_clicked", { tab: "favorites" });};const handleBookmarksClick = () => {console.log("Marcadores clicado");// Lógica específica para marcadoresloadBookmarks();};return (<TabContainerdefaultValue="favorites"onChange={(value) => {console.log("Aba mudou para:", value);updateURL(value);}}><TabButton value="favorites" onClick={handleFavoritesClick}><Star size={16} style={{ marginRight: "6px" }} />Favoritos</TabButton><TabButton value="bookmarks" onClick={handleBookmarksClick}><Bookmark size={16} style={{ marginRight: "6px" }} />Marcadores</TabButton><TabButton value="history"><Calendar size={16} style={{ marginRight: "6px" }} />Histórico</TabButton></TabContainer>);}
tsx
function ControlledTabExample() {const [activeTab, setActiveTab] = useState("dashboard");const [tabHistory, setTabHistory] = useState<string[]>(["dashboard"]);const handleTabChange = (newTab: string) => {setActiveTab(newTab);setTabHistory((prev) => [...prev, newTab]);};const goToPreviousTab = () => {if (tabHistory.length > 1) {const newHistory = tabHistory.slice(0, -1);const previousTab = newHistory[newHistory.length - 1];setTabHistory(newHistory);setActiveTab(previousTab);}};return (<div><div style={{ marginBottom: "16px" }}><button onClick={goToPreviousTab} disabled={tabHistory.length <= 1}>← Voltar</button><span style={{ marginLeft: "16px" }}>Aba atual: {activeTab}</span></div><TabContainer defaultValue={activeTab} onChange={handleTabChange}><TabButton value="dashboard">Dashboard</TabButton><TabButton value="analytics">Analytics</TabButton><TabButton value="reports">Relatórios</TabButton><TabButton value="settings">Configurações</TabButton></TabContainer><div style={{ marginTop: "16px" }}><strong>Histórico de navegação:</strong>{tabHistory.join(" → ")}</div></div>);}
children - ReactNode (obrigatório)
Componentes TabButton e outros elementos filhosdisabled - boolean (padrão: false)
Se todas as abas devem estar desabilitadasdefaultValue - string
Valor da aba que deve estar ativa inicialmenteonChange - (index: string) => void
Função callback chamada quando a aba ativa muda, recebe o valor da nova abaclassName - string
Classes CSS adicionais para estilização do containerchildren - ReactNode (obrigatório)
Conteúdo a ser exibido dentro do botão da abavalue - string (obrigatório)
Identificador único para o botão da abadisabled - boolean (padrão: false)
Se este botão específico deve estar desabilitado (pode ser sobrescrito pelo TabContainer)onClick - (event: MouseEvent<HTMLButtonElement>) => void
Função callback chamada quando o botão é clicado (além da mudança de aba)className - string
Classes CSS adicionais para estilização do botãonav exceto
onChange, children e ref. TabButton suporta todas as propriedades
HTML de button exceto children, value e type.role="tablist", TabButton usa role="tab"TabButton deve ter um value únicoTabContainer fornece contexto para TabButtondefaultValue para estado inicial, onChange para mudançasTabButton usa elemento <button> nativoTabContainer usa elemento <nav> para navegaçãoTabContainer disabled sobrescreve TabButton disabledonClick em TabButton é chamado além da mudança de aba