CardTabContainer e CardTabButton oferecem uma variação estilizada dos tabs tradicionais, apresentando navegação por abas com visual de cartões. Ideais para dashboards, painéis administrativos e interfaces que precisam de uma separação visual mais definida entre as opções de navegação.tsx
import { CardTabContainer, CardTabButton } from "@arkyn/components";
tsx
<CardTabContainer><CardTabButton value="overview">Visão Geral</CardTabButton><CardTabButton value="analytics">Analytics</CardTabButton><CardTabButton value="reports">Relatórios</CardTabButton></CardTabContainer>
defaultValue.tsx
<CardTabContainer defaultValue="dashboard"><CardTabButton value="dashboard">Dashboard</CardTabButton><CardTabButton value="analytics">Analytics</CardTabButton><CardTabButton value="settings">Configurações</CardTabButton></CardTabContainer>
tsx
<CardTabContainer defaultValue="sales"><CardTabButton value="sales"><TrendingUp size={16} style={{ marginRight: "8px" }} />Vendas</CardTabButton><CardTabButton value="products"><Package size={16} style={{ marginRight: "8px" }} />Produtos</CardTabButton><CardTabButton value="customers"><Users size={16} style={{ marginRight: "8px" }} />Clientes</CardTabButton></CardTabContainer>
onChange para reagir a mudanças de aba e controlar conteúdo dinâmico.tsx
function CardTabExample() {const [activeTab, setActiveTab] = useState("overview");return (<div><CardTabContainerdefaultValue="overview"onChange={(value) => {setActiveTab(value);console.log("CardTab ativa:", value);}}><CardTabButton value="overview"><BarChart3 size={16} style={{ marginRight: "8px" }} />Visão Geral</CardTabButton><CardTabButton value="performance"><TrendingUp size={16} style={{ marginRight: "8px" }} />Performance</CardTabButton><CardTabButton value="reports"><FileText size={16} style={{ marginRight: "8px" }} />Relatórios</CardTabButton></CardTabContainer>{/* Renderizar conteúdo baseado na aba ativa */}<divstyle={{marginTop: "20px",padding: "20px",border: "1px solid #e2e8f0",borderRadius: "8px",}}>{activeTab === "overview" && <div>Conteúdo da Visão Geral</div>}{activeTab === "performance" && <div>Conteúdo da Performance</div>}{activeTab === "reports" && <div>Conteúdo dos Relatórios</div>}</div></div>);}
tsx
<CardTabContainer defaultValue="current"><CardTabButton value="current">Atual</CardTabButton><CardTabButton value="maintenance" disabled>Em Manutenção</CardTabButton><CardTabButton value="coming-soon" disabled>Em Breve</CardTabButton></CardTabContainer>
tsx
<CardTabContainer disabled><CardTabButton value="option1">Opção 1</CardTabButton><CardTabButton value="option2">Opção 2</CardTabButton><CardTabButton value="option3">Opção 3</CardTabButton></CardTabContainer>
CardTabButton pode ter seu próprio handler de clique além da mudança de aba.tsx
function NavigationCardTabs() {const handleBookmarksClick = () => {console.log("Favoritos clicado");// Lógica específica para favoritostrackEvent("cardtab_clicked", { tab: "bookmarks" });loadUserBookmarks();};const handleStarredClick = () => {console.log("Destacados clicado");// Lógica específica para destacadosloadStarredItems();};return (<CardTabContainerdefaultValue="bookmarks"onChange={(value) => {console.log("CardTab mudou para:", value);updateUserPreference("lastTab", value);}}><CardTabButton value="bookmarks" onClick={handleBookmarksClick}><Bookmark size={16} style={{ marginRight: "8px" }} />Favoritos</CardTabButton><CardTabButton value="starred" onClick={handleStarredClick}><Star size={16} style={{ marginRight: "8px" }} />Destacados</CardTabButton><CardTabButton value="recent"><Calendar size={16} style={{ marginRight: "8px" }} />Recentes</CardTabButton></CardTabContainer>);}
tsx
function AdvancedCardTabExample() {const [activeTab, setActiveTab] = useState("dashboard");const [tabHistory, setTabHistory] = useState<string[]>(["dashboard"]);const [loadingStates, setLoadingStates] = useState<Record<string, boolean>>({});const handleTabChange = async (newTab: string) => {// Mostrar loading statesetLoadingStates((prev) => ({ ...prev, [newTab]: true }));try {// Simular carregamento de dadosawait loadTabData(newTab);setActiveTab(newTab);setTabHistory((prev) => [...prev, newTab]);// AnalyticstrackEvent("cardtab_navigation", {from: activeTab,to: newTab,timestamp: Date.now(),});} catch (error) {console.error("Erro ao carregar dados da aba:", error);} finally {setLoadingStates((prev) => ({ ...prev, [newTab]: false }));}};const goToPreviousTab = () => {if (tabHistory.length > 1) {const newHistory = tabHistory.slice(0, -1);const previousTab = newHistory[newHistory.length - 1];setTabHistory(newHistory);setActiveTab(previousTab);}};return (<div className="advanced-cardtab-container"><div className="cardtab-controls"><buttononClick={goToPreviousTab}disabled={tabHistory.length <= 1}className="back-button">← Voltar</button><span className="current-tab-info">Seção atual: <strong>{activeTab}</strong></span></div><CardTabContainerdefaultValue={activeTab}onChange={handleTabChange}className="advanced-cardtabs"><CardTabButton value="dashboard"><BarChart3 size={16} style={{ marginRight: "8px" }} />Dashboard{loadingStates.dashboard && <div className="loading-indicator" />}</CardTabButton><CardTabButton value="analytics"><TrendingUp size={16} style={{ marginRight: "8px" }} />Analytics{loadingStates.analytics && <div className="loading-indicator" />}</CardTabButton><CardTabButton value="reports"><FileText size={16} style={{ marginRight: "8px" }} />Relatórios{loadingStates.reports && <div className="loading-indicator" />}</CardTabButton><CardTabButton value="settings"><Settings size={16} style={{ marginRight: "8px" }} />Configurações{loadingStates.settings && <div className="loading-indicator" />}</CardTabButton></CardTabContainer><div className="cardtab-content"><DynamicTabContent activeTab={activeTab} /></div><div className="navigation-history"><small>Histórico: {tabHistory.join(" → ")}</small></div></div>);}
children - ReactNode (obrigatório)
Componentes CardTabButton 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 CardTabContainer)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
onClick, children e ref. CardTabButton suporta todas as propriedades
HTML de button exceto children, value e type.role="tablist", CardTabButton usa role="tab"CardTabButton deve ter um value únicoCardTabContainer fornece contexto para CardTabButtondefaultValue para estado inicial, onChange para mudançasCardTabButton usa elemento <button> nativoCardTabContainer usa elemento <nav> para navegaçãoCardTabContainer disabled sobrescreve CardTabButton disabledonClick em CardTabButton é chamado além da mudança de aba