Skip to main content

TabView

Die TabView-Komponente ermöglicht die Organisation von Inhalten in Registerkarten, zwischen denen Benutzer wechseln können. Sie ist ideal für die Darstellung von verwandten Inhalten in einem begrenzten Raum.

Import

import { TabView } from '@smolitux/core';

Verwendung

Einfache Tabs

const tabs = [
{
id: 'tab1',
label: 'Profil',
content: <div>Profilinformationen hier...</div>
},
{
id: 'tab2',
label: 'Einstellungen',
content: <div>Einstellungen hier...</div>
},
{
id: 'tab3',
label: 'Benachrichtigungen',
content: <div>Benachrichtigungen hier...</div>
}
];

<TabView tabs={tabs} defaultTabId="tab1" />

Tabs mit Icons

import { UserIcon, CogIcon, BellIcon } from '@heroicons/react/outline';

const tabs = [
{
id: 'tab1',
label: 'Profil',
icon: <UserIcon className="w-5 h-5" />,
content: <div>Profilinformationen hier...</div>
},
{
id: 'tab2',
label: 'Einstellungen',
icon: <CogIcon className="w-5 h-5" />,
content: <div>Einstellungen hier...</div>
},
{
id: 'tab3',
label: 'Benachrichtigungen',
icon: <BellIcon className="w-5 h-5" />,
content: <div>Benachrichtigungen hier...</div>
}
];

<TabView tabs={tabs} defaultTabId="tab1" />

Tabs mit Badges

const tabs = [
{
id: 'tab1',
label: 'Inbox',
content: <div>Nachrichten hier...</div>,
badge: '5',
badgeColor: 'primary'
},
{
id: 'tab2',
label: 'Gesendet',
content: <div>Gesendete Nachrichten hier...</div>
},
{
id: 'tab3',
label: 'Spam',
content: <div>Spam-Nachrichten hier...</div>,
badge: '12',
badgeColor: 'danger'
}
];

<TabView tabs={tabs} defaultTabId="tab1" />

Verschiedene Tab-Varianten

// Standard-Tabs
<TabView tabs={tabs} variant="default" />

// Pill-Tabs
<TabView tabs={tabs} variant="pills" />

// Button-Tabs
<TabView tabs={tabs} variant="buttons" />

// Unterstrichene Tabs
<TabView tabs={tabs} variant="underline" />

// Minimale Tabs
<TabView tabs={tabs} variant="minimal" />

Tab-Positionen

// Tabs oben (Standard)
<TabView tabs={tabs} position="top" />

// Tabs unten
<TabView tabs={tabs} position="bottom" />

// Tabs links
<TabView tabs={tabs} position="left" />

// Tabs rechts
<TabView tabs={tabs} position="right" />

Kontrollierte Tabs

import { useState } from 'react';

function ControlledTabs() {
const [activeTab, setActiveTab] = useState('tab1');

return (
<TabView
tabs={tabs}
activeTabId={activeTab}
onTabChange={(tabId) => setActiveTab(tabId)}
/>
);
}

Props

PropTypStandardBeschreibung
tabsTabItem[]-Array von Tab-Objekten
defaultTabIdstring-ID des standardmäßig aktiven Tabs (unkontrollierter Modus)
activeTabIdstring-ID des aktiven Tabs (kontrollierter Modus)
onTabChange(tabId: string) => void-Callback-Funktion, die aufgerufen wird, wenn ein Tab gewechselt wird
variant'default' | 'pills' | 'buttons' | 'underline' | 'minimal''default'Visueller Stil der Tabs
fullWidthbooleanfalseOb die Tabs die volle Breite einnehmen sollen
classNamestring''Zusätzliche CSS-Klassen für den Container
tabsClassNamestring''Zusätzliche CSS-Klassen für die Tab-Leiste
contentClassNamestring''Zusätzliche CSS-Klassen für den Inhaltsbereich
position'top' | 'bottom' | 'left' | 'right''top'Position der Tab-Leiste relativ zum Inhalt
showContentbooleantrueOb der Inhalt angezeigt werden soll
lazybooleantrueOb Inhalte nur bei Bedarf gerendert werden sollen
tabSize'sm' | 'md' | 'lg''md'Größe der Tabs
centeredbooleanfalseOb die Tabs zentriert werden sollen

TabItem Interface

EigenschaftTypBeschreibung
idstringEindeutige ID des Tabs
labelReactNodeLabel des Tabs
contentReactNodeInhalt des Tabs
iconReactNodeIcon des Tabs (optional)
disabledbooleanOb der Tab deaktiviert ist (optional)
badgestring | numberBadge-Text oder -Zahl (optional)
badgeColor'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default'Farbe des Badges (optional)

Barrierefreiheit

Die TabView-Komponente ist für Barrierefreiheit optimiert:

  • Verwendet die richtigen ARIA-Rollen (role="tablist", role="tab", role="tabpanel")
  • Tastaturnavigation: Tabs können mit den Pfeiltasten durchlaufen werden
  • Fokus-Management: Fokus wird korrekt zwischen Tabs bewegt
  • Screenreader-Unterstützung: Korrekte ARIA-Attribute für Beziehungen zwischen Tabs und Panels

Beispiele

Dynamische Tabs

import { useState } from 'react';
import { TabView, Button } from '@smolitux/core';

function DynamicTabs() {
const [tabs, setTabs] = useState([
{ id: 'tab1', label: 'Tab 1', content: <div>Inhalt von Tab 1</div> },
{ id: 'tab2', label: 'Tab 2', content: <div>Inhalt von Tab 2</div> }
]);

const [activeTab, setActiveTab] = useState('tab1');

const addTab = () => {
const newTabId = `tab${tabs.length + 1}`;
setTabs([
...tabs,
{
id: newTabId,
label: `Tab ${tabs.length + 1}`,
content: <div>Inhalt von Tab {tabs.length + 1}</div>
}
]);
setActiveTab(newTabId);
};

return (
<div>
<Button onClick={addTab} className="mb-4">Neuen Tab hinzufügen</Button>
<TabView
tabs={tabs}
activeTabId={activeTab}
onTabChange={setActiveTab}
/>
</div>
);
}

Tabs mit benutzerdefinierten Inhalten

const tabs = [
{
id: 'tab1',
label: (
<div className="flex items-center">
<span className="h-3 w-3 rounded-full bg-green-500 mr-2"></span>
Online
</div>
),
content: <div>Online-Status-Informationen</div>
},
{
id: 'tab2',
label: (
<div className="flex items-center">
<span className="h-3 w-3 rounded-full bg-red-500 mr-2"></span>
Offline
</div>
),
content: <div>Offline-Status-Informationen</div>
}
];

<TabView tabs={tabs} defaultTabId="tab1" />

Tabs mit Formularen

const tabs = [
{
id: 'personal',
label: 'Persönliche Daten',
content: (
<form>
<div className="space-y-4">
<Input label="Name" name="name" />
<Input label="E-Mail" name="email" type="email" />
<Input label="Telefon" name="phone" type="tel" />
</div>
</form>
)
},
{
id: 'address',
label: 'Adresse',
content: (
<form>
<div className="space-y-4">
<Input label="Straße" name="street" />
<Input label="PLZ" name="zip" />
<Input label="Stadt" name="city" />
</div>
</form>
)
},
{
id: 'payment',
label: 'Zahlungsinformationen',
content: (
<form>
<div className="space-y-4">
<Input label="Karteninhaber" name="cardHolder" />
<Input label="Kartennummer" name="cardNumber" />
<div className="flex space-x-4">
<Input label="Ablaufdatum" name="expiry" />
<Input label="CVC" name="cvc" />
</div>
</div>
</form>
)
}
];

<TabView tabs={tabs} defaultTabId="personal" />