{{-- Shared tab-group — the ONE tablist implementation (navigation.tabs). ARIA button-tablist with roving tabindex, Arrow/Home/End keyboard support, optional persistence, and HTMX-safe vanilla-JS init (no jQuery). Replaces the legacy jQuery-UI tabs wrapper and the four hand-rolled copies of the same pattern (board tabs, report deck, goal dialog, Resource Allocation). Props: group string REQUIRED. Unique id prefix for this group on the page; tab/panel ids derive from it ({group}-tab-{name} / {group}-panel-{name}). label string REQUIRED. aria-label for the tablist. variant string 'attached' (default) — gradient accent band with a translucent framed segment group (board/report look), or 'floating' — free-floating fully-rounded pills (RA look). dark bool Floating variant only: dark-header color scheme (server-stamped, mirrors the theme's color mode). panels string 'toggle' (default) — the JS shows/hides elements marked data-tabs-panel for this group; 'manual' — the JS only manages tab state and dispatches the event below, and the page's own JS moves content (e.g. a deck track). storage string 'none' (default) | 'session' | 'local' — where the active tab persists across reloads. storageKey string Storage key; REQUIRED when storage != none. Scope it per entity (e.g. "ra-tab-{programId}"). Slots: default The x-global::navigation.tabs.tab children. actions Optional right-side cluster (filters, period pickers, pager arrows). Attached variant renders it inside the band. Panel contract (caller-rendered):
Event contract: on every activation the root dispatches a bubbling CustomEvent "lt:tabs:changed" with detail {group, name, index} — pages with special behavior (deck translation, lazy loads) listen for it. --}} @props([ 'group', 'label', 'variant' => 'attached', 'dark' => false, 'panels' => 'toggle', 'storage' => 'none', 'storageKey' => null, ])
merge(['class' => 'lt-tabs lt-tabs--'.$variant.($dark ? ' lt-tabs--dark' : '')]) }} data-lt-tabs="{{ $group }}" data-tabs-panels="{{ $panels }}" data-tabs-storage="{{ $storage }}" @if ($storageKey) data-tabs-storage-key="{{ $storageKey }}" @endif>
{{ $slot }}
@isset ($actions)
attributes->merge(['class' => 'lt-tabs-actions']) }}>{{ $actions }}
@endisset
@once('lt-tabs-script') @endonce