{{-- ShiftBridge Tabs Component Usage:

Content for tab 1

Content for tab 2

Vertical tab content

Pills style tabs

Underline style tabs

Full width tabs

Props: - tabs: array (required) - [['id' => 'tab1', 'label' => 'Tab 1', 'icon' => 'home', 'disabled' => false, 'badge' => 'New']] - active: string (default active tab ID) - variant: string (default, pills, underline, cards) - vertical: boolean (vertical layout) - fullWidth: boolean (tabs take full width) - size: string (sm, md, lg) - id: string (tabs container ID) --}} @props([ 'tabs' => [], 'active' => null, 'variant' => 'default', 'vertical' => false, 'fullWidth' => false, 'size' => 'md', 'id' => null, ]) @php // Generate unique ID $tabsId = $id ?? 'tabs-' . uniqid(); // Normalize tabs $normalizedTabs = []; foreach ($tabs as $key => $tab) { if (is_string($tab)) { $normalizedTabs[] = [ 'id' => is_string($key) ? $key : 'tab-' . $key, 'label' => $tab, 'icon' => null, 'disabled' => false, 'badge' => null, ]; } else { $normalizedTabs[] = [ 'id' => $tab['id'] ?? $key, 'label' => $tab['label'] ?? '', 'icon' => $tab['icon'] ?? null, 'disabled' => $tab['disabled'] ?? false, 'badge' => $tab['badge'] ?? null, ]; } } // Set default active tab $activeTab = $active ?? ($normalizedTabs[0]['id'] ?? null); // Size classes $tabPadding = match($size) { 'sm' => 'px-3 py-1.5 text-sm', 'md' => 'px-4 py-2.5 text-sm', 'lg' => 'px-5 py-3 text-base', default => 'px-4 py-2.5 text-sm', }; $iconSize = match($size) { 'sm' => 'w-4 h-4', 'md' => 'w-4 h-4', 'lg' => 'w-5 h-5', default => 'w-4 h-4', }; // Variant classes for tabs $getTabClasses = function($tab, $isActive, $variant, $tabPadding, $fullWidth) { $baseClasses = 'inline-flex items-center gap-2 font-medium transition-all duration-150 whitespace-nowrap'; if ($fullWidth) { $baseClasses .= ' flex-1 justify-center'; } $stateClasses = ''; if ($tab['disabled']) { $stateClasses = 'opacity-50 cursor-not-allowed text-[var(--sb-text-secondary)]'; } elseif ($variant === 'pills') { $stateClasses = $isActive ? 'bg-[var(--sb-primary)] text-white rounded-md shadow-sm' : 'text-[var(--sb-text-secondary)] hover:text-[var(--sb-text-primary)] hover:bg-slate-100 rounded-md'; } elseif ($variant === 'underline') { $stateClasses = $isActive ? 'text-[var(--sb-primary)] border-b-2 border-[var(--sb-primary)] -mb-px' : 'text-[var(--sb-text-secondary)] hover:text-[var(--sb-text-primary)] border-b-2 border-transparent hover:border-[var(--sb-border)] -mb-px'; } elseif ($variant === 'cards') { $stateClasses = $isActive ? 'bg-white text-[var(--sb-primary)] border-t-2 border-x border-[var(--sb-border)] rounded-t-md -mb-px z-10' : 'text-[var(--sb-text-secondary)] hover:text-[var(--sb-text-primary)] border-b border-[var(--sb-border)] hover:bg-slate-50'; } else { // Default variant $stateClasses = $isActive ? 'bg-[var(--sb-card-header-bg)] text-[var(--sb-primary)] border border-[var(--sb-border)] border-b-transparent rounded-t-md -mb-px z-10' : 'text-[var(--sb-text-secondary)] hover:text-[var(--sb-text-primary)] hover:bg-[var(--sb-card-header-bg)] border border-transparent border-b-[var(--sb-border)] rounded-t-md -mb-px'; } return implode(' ', [$baseClasses, $tabPadding, $stateClasses]); }; // Container classes $containerClasses = $vertical ? 'flex gap-4' : 'flex flex-col'; $listClasses = $vertical ? 'flex flex-col gap-1 min-w-[200px]' : 'flex border-b border-[var(--sb-border)]' . ($fullWidth ? ' w-full' : ''); $contentClasses = $vertical ? 'flex-1' : 'mt-0'; // Icon mapping $iconSvg = function($icon, $size) { return match($icon) { 'home' => '', 'user' => '', 'settings' => '', 'bell' => '', 'shield' => '', 'mail' => '', 'file' => '', 'grid' => '', 'list' => '', 'star' => '', 'heart' => '', 'calendar' => '', 'clock' => '', 'check' => '', default => null, }; }; @endphp
{{-- Tab List --}}
@foreach($normalizedTabs as $tab) @php $isActive = $activeTab === $tab['id']; $tabClasses = $getTabClasses($tab, $isActive, $variant, $tabPadding, $fullWidth); @endphp @endforeach
{{-- Tab Panels --}}
@foreach($normalizedTabs as $tab) @php $isActive = $activeTab === $tab['id']; $panelId = $tabsId . '-panel-' . $tab['id']; @endphp
{{ ${'panel' . $tab['id']} ?? '' }}
@endforeach