K

Core

Blade Components

The standalone `<x-wire::*>` components — buttons, badges, icons and the layout ones — usable in any Blade view, with no schema around them.

On this page

Everything the framework draws is also available as a plain Blade component. A view that is not a form, not a table and not an infolist can still use the same button, badge, icon and layout — which is what keeps an application's own screens from looking like a different product.

Blade Components

Foundation provides base components under the wire:: namespace. color and size speak the same vocabulary everywhere — primary, danger, success, warning, info and the hue names beside them — because every one of these resolves through the canonical owners (HasColor, HasSize) rather than carrying a palette of its own. outlined swaps the solid fill for a border.

{{-- Icon --}}
<x-wire::icon name="check" />
 
{{-- Badge --}}
<x-wire::badge color="success">Active</x-wire::badge>
 
{{-- Button --}}
<x-wire::button color="primary" size="sm">Save</x-wire::button>
 
{{-- Dropdown --}}
<x-wire::dropdown>
<x-slot:trigger>Options</x-slot:trigger>
<x-wire::dropdown.item>Edit</x-wire::dropdown.item>
<x-wire::dropdown.item>Delete</x-wire::dropdown.item>
</x-wire::dropdown>
 
{{-- A file: the picture when there is one, its extension over its family's colour otherwise --}}
<span class="flex h-10 w-10 overflow-hidden rounded-lg">
<x-wire::file-thumb :name="$file->name" :mime="$file->mime_type" :url="$file->previewUrl()" size="md" />
</span>

A menu row is <x-wire::menu-item> — a link, or a button that submits the form around it, drawn the way the framework's own menus draw one:

<x-wire::menu-item :href="route('profile')" icon="outline:user-circle" wire:navigate>
Profile
</x-wire::menu-item>

It is the core component; <x-wire-admin::menu-item> is the same row inside the admin shell's user menu, so anything you put there looks like what is already in it.

file-thumb fills whatever box it is put in — the same component is a 32-pixel row thumbnail and a full-bleed grid tile — and size (sm, md, lg) scales what is drawn inside it. It renders the picture only when the file is an image and a url was given; a PDF handed a perfectly good URL still gets the card, because a PDF drawn through <img> is a broken-image icon claiming the file is damaged.

Layout Components

A canonical layout vocabulary lives in NyonCode\WireCore\Foundation\Schema\* and is shared by both forms and infolists (the forms Layout\* classes extend the core versions). Use these in any ->schema([...]) array instead of ad-hoc Blade grids.

Component Purpose
Grid Responsive column grid
Section Titled card with heading/description
Fieldset Bordered group with a legend
Flex Side-by-side flexbox row that stacks on mobile
Tabs / Tab Tabbed panels
Wizard / Step Multi-step layout
Callout Soft colored notice box
EmptyState Icon + heading + description + actions
use NyonCode\WireCore\Foundation\Schema\{Grid, Section, Flex, Callout};
 
Section::make('Team')
->description('People with access.')
->schema([
// Int reflow, or a Filament-style per-breakpoint map.
Grid::make()->columns(['default' => 1, 'md' => 2, 'lg' => 3])->schema([...]),
]);
 
// Flex: control distribution, alignment, spacing, wrap and child growth.
Flex::make()->from('md')->justify('between')->align('center')->gap(6)->wrap()->grow(false)->schema([...]);
 
// Callout — color hues delegate to the canonical alert palette.
Callout::make()->warning()->heading('Heads up')->icon('exclamation-triangle')->dismissible()
->content('Something worth noticing.');

Callout is the shared owner of the notice surface; the forms Alert field is its field-style alias. Column counts (Grid, CheckboxList, Section, …) accept an int or a per-breakpoint map keyed by default/sm/md/lg/xl/2xl.

Standalone Blade tags

The same layouts are also exposed as slot-based wire:: tags for plain Blade views (no schema array):

<x-wire::callout color="warning" heading="Storage almost full" icon="exclamation-triangle" dismissible>
You have used 95% of your quota.
</x-wire::callout>
 
<x-wire::grid :columns="['default' => 1, 'md' => 2, 'lg' => 3]" gap="gap-3">…</x-wire::grid>
 
<x-wire::flex from="md" justify="between" align="center" :gap="4">…</x-wire::flex>
 
<x-wire::section heading="Profile" description="Basic info">…</x-wire::section>
<x-wire::fieldset legend="Billing address">…</x-wire::fieldset>
 
<x-wire::empty-state icon="outline:inbox" heading="No invoices yet" description="They will show up here.">
<button>New invoice</button> {{-- slot becomes the action row --}}
</x-wire::empty-state>
 
{{-- Alpine-driven; client-side state only (no per-step validation) --}}
<x-wire::tabs>
<x-wire::tab label="Profile">…</x-wire::tab>
<x-wire::tab label="Security">…</x-wire::tab>
</x-wire::tabs>
 
<x-wire::wizard>
<x-wire::step label="Account">…</x-wire::step>
<x-wire::step label="Confirm">…</x-wire::step>
</x-wire::wizard>

For validated multi-step flows use action-modal wizards (HasModal::steps()) or the form schema Wizard instead — the standalone <x-wire::tabs> / <x-wire::wizard> only switch panels client-side.

  • Schema — the same layouts as declarative components
  • Colors and Icons — the attributes these accept
  • The Admin Shell — a frame built out of these
  • Theming — overriding the views behind them