Guias Tailwind CSS somente CSS com variantes de estilo de borda, levantada, caixa e pílula. Estado e tamanhos ativos, sem necessidade de JavaScript. WCAG AA acessível, funciona com Django, HTMX, Laravel, React e qualquer pilha.
Os componentes da guia organizam o conteúdo em seções separadas entre as quais os usuários podem alternar sem sair da página. Construídas com HTML semântico e padrões de entrada de rádio, as guias fornecem navegação intuitiva para agrupar informações relacionadas. O sistema de guias Frutjam oferece suporte a vários tamanhos, estilos e direções de layout – somente CSS ou controlado por JavaScript – tornando-o ideal para painéis, documentação e interfaces com guias.
Somente CSS, sem necessidade de JavaScript. WCAG AA acessível e independente de estrutura - funciona com Django, HTMX, Laravel, React e qualquer pilha.
| Aula | Tipo | Descrição |
|---|---|---|
| tabs | Base | Contêiner para um grupo de entradas de guias e painéis de conteúdo |
| tab | Modificador | Entrada de rádio de guia individual |
| tab-content | Modificador | Painel de conteúdo associado a uma guia |
| tab-active | Modificador | Força o estado ativo/selecionado em uma guia (para guias controladas por JS) |
| tab-disabled | Modificador | Aparência desativada para uma guia |
| tabs-underline | Estilo | Estilo do indicador de sublinhado |
| tabs-lifted | Estilo | Estilo de aba levantada semelhante a um cartão |
| tabs-box | Estilo | Guias em formato de pílula em caixa |
| tabs-vertical | Modificador | Layout de guia vertical com guias em uma coluna do lado esquerdo |
| tabs-end | Modificador | Alinha a linha da guia ao final (à direita no LTR) |
| tabs-bottom | Modificador | Coloca guias abaixo do painel de conteúdo |
| tabs-xs | Tamanho | Preenchimento de aba extra pequena |
| tabs-sm | Tamanho | Preenchimento de aba pequena |
| tabs-md | Tamanho | Preenchimento de guia médio (padrão) |
| tabs-lg | Tamanho | Preenchimento de aba grande |
| tabs-xl | Tamanho | Preenchimento de aba extra grande |
Uso Básico
As guias padrão usam um estilo simples de sublinhado ativo com entradas de rádio. Cada entrada tab é emparelhada com um painel tab-content imediatamente após ela.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="tabs"> <input type="radio" name="tabs-basic" class="tab" aria-label="Overview" checked> <div class="tab-content pt-4"> <p>Overview content: a high-level summary of features, metrics, or status. This panel is visible by default.</p> </div> <input type="radio" name="tabs-basic" class="tab" aria-label="Details"> <div class="tab-content pt-4"> <p>Details content: in-depth information such as configuration options, data breakdown, or extended documentation.</p> </div> <input type="radio" name="tabs-basic" class="tab" aria-label="Activity"> <div class="tab-content pt-4"> <p>Activity content: a timeline, event log, or recent changes relevant to this section.</p> </div> </div> |
Estilos de guia
Use tabs-underline, tabs-box ou tabs-lifted para alterar o estilo visual da faixa de guias.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <div class="tabs tabs-underline"> <input type="radio" name="style-underline" class="tab" aria-label="Overview" checked> <div class="tab-content pt-4">Underline style — a colored bottom border marks the active tab against a full-width separator line.</div> <input type="radio" name="style-underline" class="tab" aria-label="Details"> <div class="tab-content pt-4">Details panel.</div> <input type="radio" name="style-underline" class="tab" aria-label="Activity"> <div class="tab-content pt-4">Activity panel.</div> </div> <div class="tabs tabs-box"> <input type="radio" name="style-box" class="tab" aria-label="Overview" checked> <div class="tab-content pt-4">Box style — the active tab gets a raised background inside a tinted pill container.</div> <input type="radio" name="style-box" class="tab" aria-label="Details"> <div class="tab-content pt-4">Details panel.</div> <input type="radio" name="style-box" class="tab" aria-label="Activity"> <div class="tab-content pt-4">Activity panel.</div> </div> <div class="tabs tabs-lifted"> <input type="radio" name="style-lifted" class="tab" aria-label="Overview" checked> <div class="tab-content p-4">Lifted style — the active tab appears as a card tab with borders that merge into the content panel below.</div> <input type="radio" name="style-lifted" class="tab" aria-label="Details"> <div class="tab-content p-4">Details panel.</div> <input type="radio" name="style-lifted" class="tab" aria-label="Activity"> <div class="tab-content p-4">Activity panel.</div> </div> |
Tamanhos de guia
Dimensione o preenchimento da guia de tabs-xs para tabs-xl para corresponder à densidade do seu layout.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <div class="tabs tabs-underline tabs-xs"> <input type="radio" name="size-xs" class="tab" aria-label="Extra Small" checked> <div class="tab-content pt-3">Extra small tabs</div> <input type="radio" name="size-xs" class="tab" aria-label="Tab 2"> <div class="tab-content pt-3">Content</div> </div> <div class="tabs tabs-underline tabs-sm"> <input type="radio" name="size-sm" class="tab" aria-label="Small" checked> <div class="tab-content pt-3">Small tabs</div> <input type="radio" name="size-sm" class="tab" aria-label="Tab 2"> <div class="tab-content pt-3">Content</div> </div> <div class="tabs tabs-underline tabs-md"> <input type="radio" name="size-md" class="tab" aria-label="Medium" checked> <div class="tab-content pt-3">Medium tabs (default)</div> <input type="radio" name="size-md" class="tab" aria-label="Tab 2"> <div class="tab-content pt-3">Content</div> </div> <div class="tabs tabs-underline tabs-lg"> <input type="radio" name="size-lg" class="tab" aria-label="Large" checked> <div class="tab-content pt-3">Large tabs</div> <input type="radio" name="size-lg" class="tab" aria-label="Tab 2"> <div class="tab-content pt-3">Content</div> </div> <div class="tabs tabs-underline tabs-xl"> <input type="radio" name="size-xl" class="tab" aria-label="Extra Large" checked> <div class="tab-content pt-3">Extra large tabs</div> <input type="radio" name="size-xl" class="tab" aria-label="Tab 2"> <div class="tab-content pt-3">Content</div> </div> |
Guias com botões
Combine tab com btn para renderizar guias como botões estilizados. A classe btn assume as cores e o raio da borda enquanto a lógica de seleção de guias é preservada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="tabs gap-2"> <input type="radio" name="btn-tabs" class="tab btn btn-sm" aria-label="Home" checked> <div class="tab-content pt-4"> <p>Home — your primary landing panel with quick access to key actions and a summary view.</p> </div> <input type="radio" name="btn-tabs" class="tab btn btn-sm" aria-label="Profile"> <div class="tab-content pt-4"> <p>Profile — manage personal information, preferences, and account details.</p> </div> <input type="radio" name="btn-tabs" class="tab btn btn-sm" aria-label="Settings"> <div class="tab-content pt-4"> <p>Settings — configure notifications, privacy options, and connected integrations.</p> </div> </div> |
Guias desativadas
Adicione tab-disabled e o atributo disabled para evitar a interação com uma guia.
1 2 3 4 5 6 7 8 9 10 | <div class="tabs tabs-underline"> <input type="radio" name="disabled-tabs" class="tab" aria-label="Available" checked> <div class="tab-content pt-4">This tab is active and accessible.</div> <input type="radio" name="disabled-tabs" class="tab tab-disabled" aria-label="Unavailable" disabled> <div class="tab-content pt-4">This content is not reachable.</div> <input type="radio" name="disabled-tabs" class="tab" aria-label="Another"> <div class="tab-content pt-4">Another available tab panel.</div> </div> |
Guias verticais
tabs-vertical muda para um layout de grade com guias em uma coluna do lado esquerdo e o conteúdo preenchendo a direita. Uma linha separadora de altura total é adicionada automaticamente entre as colunas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <div class="tabs tabs-vertical"> <input type="radio" name="vertical" class="tab" aria-label="General" checked> <div class="tab-content px-6 py-2"> <h3 class="font-semibold mb-1">General Settings</h3> <p>Manage your display name, language preference, and time zone.</p> </div> <input type="radio" name="vertical" class="tab" aria-label="Security"> <div class="tab-content px-6 py-2"> <h3 class="font-semibold mb-1">Security</h3> <p>Update your password, enable two-factor authentication, and review active sessions.</p> </div> <input type="radio" name="vertical" class="tab" aria-label="Notifications"> <div class="tab-content px-6 py-2"> <h3 class="font-semibold mb-1">Notifications</h3> <p>Choose which events trigger email, push, or in-app notifications.</p> </div> <input type="radio" name="vertical" class="tab" aria-label="Billing"> <div class="tab-content px-6 py-2"> <h3 class="font-semibold mb-1">Billing</h3> <p>View invoices, update your payment method, and manage your subscription plan.</p> </div> </div> |
Guias na parte inferior
tabs-bottom inverte o layout para que o conteúdo apareça acima da faixa de guias, útil para barras de navegação em estilo móvel ou barras de ferramentas inferiores.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="tabs tabs-bottom tabs-underline"> <input type="radio" name="bottom-tabs" class="tab" aria-label="Feed" checked> <div class="tab-content pb-4"> <p>Feed — latest posts and updates from people you follow.</p> </div> <input type="radio" name="bottom-tabs" class="tab" aria-label="Explore"> <div class="tab-content pb-4"> <p>Explore — discover trending topics, creators, and recommended content.</p> </div> <input type="radio" name="bottom-tabs" class="tab" aria-label="Saved"> <div class="tab-content pb-4"> <p>Saved — articles and posts you bookmarked for later.</p> </div> </div> |
Guias alinhadas ao final
tabs-end empurra a faixa de guias para a direita (final) do contêiner, útil para navegação secundária ou menus de ação.
1 2 3 4 5 6 7 8 9 10 | <div class="tabs tabs-underline tabs-end"> <input type="radio" name="end-tabs" class="tab" aria-label="Week" checked> <div class="tab-content pt-4">Weekly view — aggregated metrics for the past 7 days.</div> <input type="radio" name="end-tabs" class="tab" aria-label="Month"> <div class="tab-content pt-4">Monthly view — trend analysis over the past 30 days.</div> <input type="radio" name="end-tabs" class="tab" aria-label="Year"> <div class="tab-content pt-4">Yearly view — annual summary and year-over-year comparison.</div> </div> |
Guias controladas por JavaScript
Para padrões que não sejam de rádio (por exemplo, links âncora, conteúdo dinâmico), adicione tab-active à guia selecionada em JavaScript. O tab-content emparelhado é mostrado através do seletor .tab-active + .tab-content.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <div class="tabs tabs-box" id="js-tabs"> <button class="tab tab-active" data-tab="0">Dashboard</button> <div class="tab-content pt-4">Dashboard panel — visible because this tab has <code>tab-active</code>.</div> <button class="tab" data-tab="1">Reports</button> <div class="tab-content pt-4">Reports panel.</div> <button class="tab" data-tab="2">Integrations</button> <div class="tab-content pt-4">Integrations panel.</div> </div> <script> document.querySelectorAll('#js-tabs .tab').forEach(tab => { tab.addEventListener('click', () => { document.querySelectorAll('#js-tabs .tab').forEach(t => t.classList.remove('tab-active')); tab.classList.add('tab-active'); }); }); </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import { useTabs } from 'frutjam/react' export default function TabsDemo() { const tabs = useTabs(0) return ( <div className="tabs tabs-box"> <button {...tabs.tabProps(0)}>Dashboard</button> <div {...tabs.panelProps(0)} className="tab-content pt-4">Dashboard panel.</div> <button {...tabs.tabProps(1)}>Reports</button> <div {...tabs.panelProps(1)} className="tab-content pt-4">Reports panel.</div> <button {...tabs.tabProps(2)}>Integrations</button> <div {...tabs.panelProps(2)} className="tab-content pt-4">Integrations panel.</div> </div> ) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <script setup> import { ref } from 'vue' const active = ref(0) </script> <template> <div class="tabs tabs-box"> <button v-for="(label, i) in ['Dashboard', 'Reports', 'Integrations']" :key="i" class="tab" :class="{ 'tab-active': active === i }" :aria-selected="active === i" role="tab" @click="active = i" ></button> <div class="tab-content pt-4" :hidden="active !== 0">Dashboard panel.</div> <div class="tab-content pt-4" :hidden="active !== 1">Reports panel.</div> <div class="tab-content pt-4" :hidden="active !== 2">Integrations panel.</div> </div> </template> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <script> let active = $state(0) const labels = ['Dashboard', 'Reports', 'Integrations'] </script> <div class="tabs tabs-box"> {#each labels as label, i} <button class="tab" class:tab-active={active === i} aria-selected={active === i} role="tab" onclick={() => active = i} >{label}</button> <div class="tab-content pt-4" hidden={active !== i}>{label} panel.</div> {/each} </div> |
Usando Claude Code, Cursor ou outro editor de IA?
Cherry MCP fornece ao seu editor de IA os nomes exatos das classes Guias e a estrutura sob demanda. Chega de aulas alucinadas.