Komponenten
Card, Accordion, Dropdown, Tabs
card
resources/views/demo/core/examples/basics/card.blade.php
<div class="row g-3">
<div class="col-lg-6">
<x-card>
<x-slot name="headerLeft"><strong>Kontakt</strong></x-slot>
<x-slot name="headerRight">
<x-button.link href="#ex-basics-card" type="outline-secondary" class="btn-sm">
<i class="bi bi-pencil-square"></i>
</x-button.link>
</x-slot>
Erika Mustermann, Musterstadt
<x-slot name="footer">
<small class="text-body-secondary">Slots: headerLeft, headerRight, footer</small>
</x-slot>
</x-card>
</div>
<div class="col-lg-6">
{{-- Slot header ersetzt den kompletten Kartenkopf --}}
<x-card class="border-primary">
<x-slot name="header">
<div class="card-header text-bg-primary">Eigener Kopf über den Slot header</div>
</x-slot>
Ohne headerLeft/headerRight zeigt die Karte Platzhaltertexte – deshalb hier header.
</x-card>
</div>
</div>
accordion, accordion.item
resources/views/demo/core/examples/basics/accordion.blade.php
{{-- acc_id und row_id stabil wählen (nicht rand()), damit Livewire-Re-Renders
die Zuordnung von Button und Collapse nicht zerstören. --}}
<x-accordion acc_id="demo-accordion">
<x-accordion.item acc_id="demo-accordion" row_id="demo-acc-1" header="Was ist ein Prop?" :collapsed="false">
Eine polymorphe Eigenschaft (key, state, type, value), die an jedes Model gehängt werden kann.
</x-accordion.item>
<x-accordion.item acc_id="demo-accordion" row_id="demo-acc-2" header="Welche Typen gibt es?">
birth_date, death_date, iban und metadata.
</x-accordion.item>
<x-accordion.item acc_id="demo-accordion" row_id="demo-acc-3" header="Und die Status?">
active, error, verified, unverified und pending.
</x-accordion.item>
</x-accordion>
dropdown, dropdown.list, dropdown.click, dropdown.sort
click(): 0× · Sortierung: name aufsteigend
resources/views/demo/core/examples/basics/dropdown.blade.php
<div>
<div class="d-flex flex-wrap gap-3 align-items-start">
{{-- dropdown: Button mit frei gestaltbarem, dunklem Menü --}}
<x-dropdown label="<i class='bi bi-funnel'></i> dropdown" :toggle="true" width="16rem">
<div class="px-3 py-2 small">Beliebiger Inhalt im Menü.</div>
</x-dropdown>
{{-- dropdown.list: Einträge aus option (href => Text) --}}
<x-dropdown.list label="dropdown.list" :option="[
route('demo.core.layout') => 'App-Shell',
route('demo.core.livewire') => 'Livewire',
route('demo.core.registries') => 'Registries',
]" />
{{-- dropdown.click: wire:click auf eine Methode der Livewire-Komponente --}}
<x-dropdown.list label="dropdown.click">
<x-dropdown.click click="click">Methode click() aufrufen</x-dropdown.click>
<x-dropdown.click click="click" confirm="Wirklich ausführen?">Mit wire:confirm</x-dropdown.click>
</x-dropdown.list>
{{-- dropdown.sort: ruft sortBy() und liest sortField/sortAsc der Komponente --}}
<x-dropdown.list label="dropdown.sort">
<x-dropdown.sort field="name" label="Name" :wire="$this" />
<x-dropdown.sort field="city" label="Ort" :wire="$this" />
</x-dropdown.list>
</div>
<p class="small text-body-secondary mt-3 mb-0">
click(): {{ $clicks }}× · Sortierung: {{ $sortField }} {{ $sortAsc ? 'aufsteigend' : 'absteigend' }}
</p>
</div>
Formularfelder
Drei Familien: field.html.default für klassische Formulare (name, old(), @error), field.wire.default (Tags slim.*) und field.wire.float (Tags wire.*) für Livewire. Die wire-Felder erkennen selbst, ob die Komponente ein form- oder item-Objekt hat, und binden dann form.feld bzw. item.feld.
field.html.default – field, field.select, field.text
resources/views/demo/core/examples/fields/html-default.blade.php
{{-- field.html.default: klassische Formularfelder mit name, old() und @error --}}
<x-form action="#" method="GET" onsubmit="event.preventDefault()">
<div class="row g-3">
<div class="col-md-6">
<x-field field="name" label="Name" value="Erika Mustermann" />
</div>
<div class="col-md-6">
<x-field field="email" label="E-Mail" type="email" value="erika.mustermann@example.com" />
</div>
<div class="col-md-6">
<label class="form-label">field.select</label>
<x-field.select field="city" label="Ort" value="Testdorf" :options="[
'Musterstadt' => 'Musterstadt',
'Beispielhausen' => 'Beispielhausen',
'Testdorf' => 'Testdorf',
]" />
</div>
<div class="col-md-6">
<label class="form-label">field.text</label>
<x-field.text field="memo" rows="3" value="Mehrzeiliger Text" />
</div>
</div>
</x-form>
field.wire.default – slim, slim.select, slim.text
Livewire-Zustand: name = „Erika Mustermann“, city = „Musterstadt“, memo = „Freitext mit wire:model gebunden.“
resources/views/demo/core/examples/fields/wire-default.blade.php
<div>
{{-- field.wire.default (Tags slim.*): kompakte Felder ohne Label mit wire:model --}}
<div class="row g-3">
<div class="col-md-4">
<x-slim field="name" label="Name" modifier="live" />
</div>
<div class="col-md-4">
<x-slim.select field="city" modifier="live" :option="[
'Musterstadt' => 'Musterstadt',
'Beispielhausen' => 'Beispielhausen',
'Testdorf' => 'Testdorf',
]" />
</div>
<div class="col-md-4">
<x-slim.text field="memo" rows="2" modifier="blur" />
</div>
</div>
<p class="small text-body-secondary mt-3 mb-0">
Livewire-Zustand: name = „{{ $name }}“, city = „{{ $city }}“, memo = „{{ $memo }}“
</p>
</div>
field.wire.float – wire.input, wire.select, wire.select-enum, wire.search, wire.text
Livewire-Zustand: name = „Erika Mustermann“, city = „Musterstadt“, status = „lead“, search = „“
resources/views/demo/core/examples/fields/wire-float.blade.php
<div>
{{-- field.wire.float (Tags wire.*): Floating Labels mit wire:model --}}
<div class="row g-3">
<div class="col-md-6">
<x-wire.input field="name" label="Name" modifier="live" />
</div>
<div class="col-md-6">
<x-wire.select field="city" label="Ort" modifier="live" :options="[
'Musterstadt' => 'Musterstadt',
'Beispielhausen' => 'Beispielhausen',
'Testdorf' => 'Testdorf',
]" />
</div>
<div class="col-md-6">
<x-wire.select-enum field="status" label="Status (Enum)" modifier="live"
:options="\App\Enums\ContactStatus::cases()" />
</div>
<div class="col-md-6">
<x-wire.search field="search" label="Suche" modifier="live" />
</div>
<div class="col-12">
<x-wire.text field="memo" label="Notiz" rows="3" modifier="blur" />
</div>
</div>
<p class="small text-body-secondary mt-3 mb-0">
Livewire-Zustand: name = „{{ $name }}“, city = „{{ $city }}“, status = „{{ $status }}“,
search = „{{ $search }}“
</p>
</div>
form.* – input, select, textarea, group, label, cancel, submit
resources/views/demo/core/examples/fields/forms.blade.php
{{-- form.*: Floating-Label-Felder für klassische Formulare; x-form ergänzt @csrf und Method-Spoofing --}}
<x-form action="#" method="PUT" onsubmit="event.preventDefault()">
<div class="row g-3">
<div class="col-md-6">
<x-form.input field="name" label="Name" value="Max Mustermann" />
</div>
<div class="col-md-6">
<x-form.select field="city" label="Ort" value="Beispielhausen" :options="[
'Musterstadt' => 'Musterstadt',
'Beispielhausen' => 'Beispielhausen',
'Testdorf' => 'Testdorf',
]" />
</div>
<div class="col-12">
<x-form.textarea field="memo" label="Notiz" value="Text im Floating-Label-Textfeld" />
</div>
<div class="col-12">
<x-form.group>
<span class="input-group-text"><i class="bi bi-at"></i></span>
<input type="email" class="form-control" placeholder="form.group = input-group">
</x-form.group>
</div>
<div class="col-12 d-flex gap-2">
<x-form.label label="form.label:" class="col-form-label" />
<x-form.cancel />
<x-form.submit>Speichern</x-form.submit>
</div>
</div>
</x-form>