{{-- One tab's panel, inside ``, which draws the bar from its own `tabs` list. Shown while its `name` is the chosen one; every panel is rendered, so switching never waits on the server. The id and the `hidden` panels come from the server, not from Alpine: until Alpine boots, every panel would otherwise be on screen at once — four `role="tabpanel"` regions for a screen reader to walk — and the tab buttons' `aria-controls` would point at nothing (N-05). `` renders this slot before its own view, so it cannot hand the panel anything; the panel reads the attributes written on `` off the component stack (Blade's `@aware` mechanism) and repeats the two lines tabs.blade.php runs on them. The two must agree, so change them together. The panel renders `data-md-tab-panel`, drawn by resources/css/components/tabs.css. --}} @props([ 'name', ]) @php $aware = fn (string $key, $default = null) => $__env->getConsumableComponentData($key, $default); $tabs = $aware('tabs', []); // `wire:model` is a key, not a prop, and its modifiers are part of the key: the spellings that // make sense on a tab set. An exotic one only means the panel falls back to the first tab. $model = collect(['wire:model', 'wire:model.live', 'wire:model.blur', 'wire:model.change', 'wire:model.lazy']) ->map(fn (string $key) => $aware($key)) ->first(fn ($value): bool => filled($value)); $tabsId = $aware('id') ?? 'tabs-'.substr(md5($model.'|'.implode('|', array_column($tabs, 'name'))), 0, 8); $initial = $aware('selected') ?? (collect($tabs)->first(fn (array $tab): bool => ! ($tab['disabled'] ?? false))['name'] ?? null); if ($model !== null && ($component = \Livewire\Livewire::current()) !== null && filled(data_get($component, $model))) { $initial = data_get($component, $model); } @endphp