SIGNALS Documentation
API Reference
Component Reference
Signals Framework — canonical component library
Design language v2 — sans label voice · mono = asset identifiers only · 3px interactive radius · single-step elevation View proposal
Page Header
Use .s-page-header for the top of every list/detail page. Breadcrumb + title + metadata left, actions right.
Rentals / All Items
Rental Grid
Active 15 Jan - 28 Feb 2026 Acme Corp
Buttons
Standard Variants
With Icons
Sizes
Outline Variants
Icon-Only & Block
Disabled & Loading
Toolbar Chips
Toggle chips for toolbar filters. Add .on class for active state.
Standard
Active Cancelled Quote Confirmed
Color Variants
Green Amber Red Blue Violet
With Count & Removable
Equipment 92 Services 34 Audio Lighting
Badges
Use .s-badge with a color modifier. Optional .s-badge-dot for status dot.
All Colors (with dot)
Active Pending Overdue Processing Archived Syncing System
Without Dot
Confirmed Draft Cancelled In Progress Archived
Lifecycle
Draft Quote Order Processing
Outline & Count
Outline Green Outline Blue Outline Red Outline Amber
5 12 99+ 3
Actor Badge
<x-signals.actor-badge :log="$log" /> — the one convention for rendering who performed an audited action, on every timeline and audit table. Pass an ActionLog and the component reads its typed actor (ActorType owns the badge colour); add by to render "by Name" for timeline bodies. Plain UI users show a name with no badge; every non-human actor is typed.
Ada Lovelace Warehouse SyncAPI ClaudeAgent SystemSystemcli Xero SyncPlugin Overdue chaseWorkflow
Brand Secondary & Tertiary
Opt-in helpers for the secondary and tertiary brand colours set in Admin → Setup → Branding. Nothing in the nav, sidebar or primary CTAs reads them, so a brand palette can never repaint core chrome. Colours resolve from --brand-secondary / --brand-tertiary and their -ink / on-* derivatives.
Secondary Badge
Sub-hire Partner Managed
Secondary Chip
Partner network Managed accounts 7
Tertiary Surface
Quiet highlight
A soft tinted panel for supporting content — callouts, empty-state hints, secondary summaries.
Status Cells
Compact inline status for table cells. Sans label voice (11px / 550) with --dl-radius; same type scale as badges.
All Colors
Confirmed Provisional Cancelled Sub-hired Archived Syncing System
Outline Variant
Active Warning Error Info
Tabs
Underline tabs. Add .on class for active. Optional .s-tab-count for counts.
Table
Use .s-table-wrap > .s-table. Headers: sans label / 550, sentence case. Cells: sans --dl-text-ui. Amounts/dates/quantities: .s-cell-mono (sans + tabular-nums). Asset/serial IDs: .s-table-asset (mono). Use .s-cell-link for clickable refs.
Standard
Reference Title Account Status Total Starts
OPP-2026-0148 Summer Festival Main Stage Acme Events Ltd Confirmed 12,450.00 15 Mar 2026
OPP-2026-0147 Corporate Awards Dinner Globex Corporation Provisional 8,200.00 22 Mar 2026
OPP-2026-0146 Wedding Reception — Smith Jane Smith Cancelled 3,800.00 28 Mar 2026
Asset identifiers (.s-table-asset)
.s-table-asset keeps Martian Mono for asset/serial numbers only. .s-cell-mono is repurposed to sans + tabular-nums (no longer mono).
Asset Catalogue Item Barcode Qty
AST-004821 Shure SM58 Microphone 8901234567890 1
AST-004822 JBL EON615 Speaker 8901234567891 2
AST-004830 Chauvet Rogue R2 Wash 8901234567902 4
Striped
SKUCatalogue ItemCategoryQty
MIC-SM58Shure SM58Audio24
SPK-EON615JBL EON615Audio12
LGT-PAR64PAR64 LEDLighting48
CAB-XLR5XLR Cable 5mCables100
STD-MICMic StandStands30
Compact & Bordered
DayMonTueWedThuFri
PA System24420
Lighting Rig11331
Staging01100
Inline Editing & Group Row
ItemQtyRateTotal
Audio Equipment
Shure SM58 Microphone45.00180.00
JBL EON615 Speaker120.00240.00
Lighting
PAR64 LED25.00200.00
Sortable Headers with Indicators
Reference Title Category Status Total Date
OPP-2026-0148 Summer Festival Main Stage Events Confirmed 12,450.00 15 Mar 2026
OPP-2026-0149 Corporate Awards Dinner Corporate Provisional 8,200.00 22 Mar 2026
OPP-2026-0150 Outdoor Cinema Screening Entertainment Quote 4,680.00 01 Apr 2026
Filter Row
SKU Catalogue Item Category Status Stock
MIC-SM58 Shure SM58 Audio Active 24
SPK-EON615 JBL EON615 Audio Active 12
LGT-PAR64 PAR64 LED Lighting Low Stock 3
STG-4X8 Stage Deck 4x8 Staging Out of Stock 0
With Footer Totals
ItemQtyRateDiscountTotal
PA System (d&b E12)1850.000.00850.00
Stage Monitor (Wedge)465.00-26.00234.00
Radio Mic (Sennheiser)645.000.00270.00
XLR Cable 10m125.000.0060.00
Checkbox
Custom checkbox. Add .checked class for checked state.
Search Input
Use <x-signals.search> everywhere. Sans UI voice with --dl-radius; focus border uses brand ink. For toolbars, tables, and standalone use.
Toolbar
Toolbar sits between page header and content. Use .s-toolbar-sep for dividers, .s-toolbar-right for right-aligned items.
All Equipment Services
Active Archived
Dropdown / Popover
Use .s-dropdown inside a relative flightcase. Shown via Alpine x-show or display toggle.
Status
Confirmed
Provisional

Cancelled
Availability Bar
Compact availability indicator for table cells. Fill width = percentage available.
20 / 20
12 / 20
3 / 20
0 / 20 Shortage
Catalogue Item Cell
Used in tables to show a product with thumbnail, name, and SKU. Name is body sans; .s-catalogue-item-sku stays mono (asset-style identifier).
🎤
Shure SM58 Microphone
SKU-MIC-SM58
🔊
JBL EON615 Speaker
SKU-SPK-EON615
Card
Generic card container. Use .s-card-header + .s-card-body for structured content.
Standard with Header Actions
Recent Activity

Card body content goes here. Use for settings panels, detail views, widgets, etc.

With Footer
Confirm Dispatch

12 items will be dispatched to Acme Events Ltd. This action cannot be undone.

Cover Image & Horizontal
🎤
Audio Pack 8 items · £450/day
📦
Staging Package 24 items across 3 categories. Includes assembly.
Stat Card
148
Active Rentals
£52.4k
Revenue This Month
23
Pending Quotes
Toast Notification
Transient status message. Never hand-built in application code — dispatch one and the app layout renders it into the live stack (#s-toast-stack), which anchors top-right under the header and grows downward. Sits at --dl-z-toast, the system z-index ceiling, so a toast dispatched from inside a modal, wizard or drawer is never occluded.
Dispatching
// Livewire component — renders on the current page
$this->dispatch('toast', type: 'success', message: __('Account saved.'));

// Across a redirect — flashed to session, shown on the next render
flash_toast('error', __('Could not delete the invoice.'));

// Plain JS
window.signals.toast({ type: 'warning', message: 'Stock is running low.' });
type is one of success, error, warning, info (unrecognised values fall back to success; danger is accepted as an alias of error). Identical messages dispatched within 800ms of each other are de-duplicated, and the stack holds a maximum of five toasts — the oldest is retired when a sixth arrives.
Variants
Account saved.
Three items are short for this booking.
Availability is recalculating in the background.
With Title
Optional title for messages that need a heading. Without one, the message itself carries the primary ink.
Duration & Dismissal
Every toast has a close (×) button — a real <button>, tab-reachable, labelled “Dismiss notification”, and Esc dismisses it while focused. Clicking the toast body also dismisses it, unless text is selected. Closing cancels any pending auto-dismiss timer and plays the exit animation before the toast is removed; the toasts below it slide up rather than jumping.
VariantDefault durationRationale
success4.5sConfirmation only — read at a glance.
info6sUsually carries a detail worth reading.
warning8sNeeds to be noticed and understood.
errorStickyExplains why something failed — never taken away automatically.
// Override the default: milliseconds, or 0 / null to make it sticky
$this->dispatch('toast', type: 'success', message: __('Saved.'), duration: 10000);
$this->dispatch('toast', type: 'error', message: __('Failed.'), duration: 6000);

// Suppress the close button (rare — the toast must then be auto-dismissing)
$this->dispatch('toast', type: 'info', message: __('Syncing…'), dismissible: false);
Auto-dismiss countdowns pause while the pointer is over the toast or focus is inside it, and resume on leave with at least 600ms left on the clock.
Accessibility & Motion
The stack container is a polite live region present from page load, so success, info and warning announce as they arrive without interrupting. error toasts override this with role="alert" / aria-live="assertive" so a failure is announced immediately. Each toast is aria-atomic, so it is read as a whole rather than re-reading the stack. Toasts enter at full height with a 260ms slide-and-fade from the right — no height grow — and leave over 180ms, after which the stack closes the gap over 220ms so the toasts below slide up rather than jump. Under prefers-reduced-motion: reduce both reduce to a plain 120ms fade with no translation or scale.
Save Indicator
Inline pulsing indicator for autosave confirmation. Typically positioned top-right.
Saved
Keyboard Hints
Esc Close ⌘S Save ↑↓ Navigate Enter Select Tab Next Cell
Bulk Action Bar
Fixed bottom bar when items are selected. Uses .s-bulk-btn with SVG icons. Add .visible class to show.
3 selected
Summary Bar
Compact footer showing aggregate stats. Fixed at bottom of scrollable content.
Catalogue Items: 24 Available: 18 Low Stock: 4 Out of Stock: 2
Legend / Key
Use below availability matrices or any color-coded visualisation. Rental status, availability, and phase keys share this component — see the Colour Coding docs.
Key: Available Low Out of Stock N/A
Tooltip
Fixed-position tooltip shown on hover. Position via JS. Add .visible class to show.
Shure SM58
Stock 20
Allocated 14

Available 6
Empty State
&#x1f50d;
No results found
Try adjusting your search or filter criteria
Section Label
Sans label voice (11px / 550, sentence case) for grouping content. Consistent across all views.
Responsive Standards
Binding mobile/responsive rules for Signals UI. New components must comply; remediation todos (P972–P974) bring existing surfaces into line.
Touch targets
Inline-link exemption
Breakpoints
Tables → card-list
Chip-collapse rule
Drag needs a touch alternative
Color Palette
All status/semantic colors available. These map to --s-{color}-bg and --s-{color}-bdr tokens.
Typography
Page title — Chakra Petch 600
Section / card title — Chakra Petch 700
Button / UI control — system sans 550
Body text — system sans
Label / meta / table header — system sans 550
AST-004821 — Martian Mono (asset identifiers only)
Version Tree
Hierarchical quote version tree with active/selected states. From rental-lifecycle.
v3 Final revision Confirmed $12,450.00
15 Mar 2026
v2 Added lighting $10,800.00
10 Mar 2026
v1 Initial quote $8,200.00
05 Mar 2026
Panel
Card panel with header/title/body. From rental-lifecycle.
Event Stream
Panel body content goes here.
Event Stream
Timeline-style event rows with color-coded left borders. From rental-lifecycle.
RentalCreated Sarah Chen 2 min ago
StatusChanged System 5 min ago
from: Draft to: Quote
ItemAdded Mike Ross 1 hour ago
State Diagram
Three-column state machine visualization. From rental-lifecycle.
Draft
Draft
new
Quote
Provisional
quotation
Order
Confirmed
order
Stat Cards
Icon + label + value stat cards in a 4-column grid. From field-registry.
Total Fields
142
Core
98
Computed
28
Custom
16
Button Dropdown
Custom styled select element with dropdown arrow. From field-registry.
Multi-Pane
Sidebar + editor layout. Active item is green. From permissions.
Roles
Admin
Manager
Operator
Editor content area
Toggle
Toggle switch. Add .on class for active state. From permissions.
Sidebar
Navigation sidebar with grouped items and badges. From live-filters.
Views
System
All Rentals System
Active Orders System
Personal
My Quotes Personal
Column Config
Draggable column config with grip handles and toggles. From live-filters.
Visible Columns
Reference
Title
Status
Unsaved Bar
Fixed notification bar for unsaved changes. Navy background, pulsing amber dot. From settings-admin.
You have unsaved changes
Toggle Row
Label + description + toggle in a row. From settings-admin.
Enable two-factor authentication
Require 2FA for all admin accounts
Allow public registration
Users can create their own accounts
Colour Picker
Swatch + hex value display. From settings-admin.
#059669
#2563eb
#0f172a
Upload Zone
Small dashed upload area for logos/icons. From settings-admin.
Upload logo
Matrix
Grid table for tax rates, permission matrices, etc. From settings-admin.
Region Standard Reduced Zero
United Kingdom20%5%0%
Germany19%7%0%
France20%5.5%0%
Status Badge
Compact status indicators (lighter weight than s-badge). From plugin-system.
Active Disabled Error
Stars
Star rating display. From plugin-system.
4.0 / 5
JSON Viewer
Syntax-highlighted JSON display on dark background. From plugin-system.
{
  <span class="s-json-key">"name"</span>: <span class="s-json-string">"signals/analytics"</span>,
  <span class="s-json-key">"version"</span>: <span class="s-json-string">"1.2.0"</span>,
  <span class="s-json-key">"enabled"</span>: <span class="s-json-bool">true</span>,
  <span class="s-json-key">"priority"</span>: <span class="s-json-number">10</span>,
  <span class="s-json-key">"config"</span>: <span class="s-json-null">null</span>
}
Parsed View
Collapsible key-value sections on dark background. From plugin-system.
Parsed View
Metadata
Name signals/analytics Version 1.2.0 Author Signals Team
Form Section
Panel with header icon, title and body. From rate-engine.
Period Settings
Form fields go here.
Multiplier Table
Editable table with input cells for rate multipliers. From rate-engine.
Period Days Multiplier
1 Day 1
2 Days 2
1 Week 7
Strategy Selector
Radio-style card selector with icons. From rate-engine.
Period
Charge per time period
Usage
Charge per use
Fixed
One-time charge
Hybrid
Combined strategy
Bar Chart
Horizontal bar chart with labels. From shortage-resolution.
PA Systems
12
Stage Decks
8
Cables
4
Qty Bar
Quantity availability indicator. Green fill on red background. From shortage-resolution.
6 of 10 available
2 of 10 available
Dispatch Urgency
Color-coded urgency text. From shortage-resolution.
Tomorrow 3 days 2 weeks
Grid Table
CSS Grid-based table layout (not HTML table). From shortage-resolution.
Catalogue Item
Qty
Status
JBL VTX V25-II
12
Shortage
Chauvet Rogue R2
8
Available
Code Editor
The single code/markup editing surface for the whole app — a CodeMirror 6 editor backed by the window.signals.codeEditor factory (resources/js/code-editor.js), exactly like the toast system and dashboard grid are backed by their own factories. Never hand-roll a CodeMirror mount or a font-mono textarea for code: every surface that edits HTML, CSS, Markdown, JSON or YAML uses this component. In production it backs the document template editor, the email layout editor, the email template body, and the plugin signals.yaml validator.
Single-document surface
<x-signals.code-editor
    property="bodyMarkdown"
    :content="$bodyMarkdown"
    language="markdown"
    sync-event="email-template-editor-sync"
    :label="__('Body markdown editor')"
    :rows="16" />
Multi-tab surface
<x-signals.code-editor
    :tab-properties="['body' => 'bodyHtml', 'styles' => 'stylesCss']"
    :contents="['body' => $bodyHtml, 'styles' => $stylesCss]"
    :tab-languages="['styles' => 'css']"
    language="html"
    :active-tab="$activeTab"
    active-tab-model="activeTab"
    sync-event="document-template-editor-sync"
    :label="__('Body editor')" />
active-tab-model names a Livewire property that is entangled, so switching tabs swaps both the buffer and the language mode without a round trip. active-tab is the server-rendered tab and decides which property the fallback textarea binds to.
Props
property        single Livewire property to bind (shorthand for tab-properties)
content         initial content for the single-property form
tab-properties  map of tab => Livewire property
contents        map of tab => initial content
language        default mode: html | css | markdown | json | yaml (unknown => plain text)
tab-languages   map of tab => mode, overriding `language` for that tab
active-tab      server-rendered tab (drives the fallback textarea binding)
active-tab-model  Livewire property entangled to follow tab switches
sync-event      Livewire event that pushes server content back into the buffer
insert-event    window event carrying a snippet to insert at the caret
debounce        ms before the buffer is pushed to Livewire (default 500)
lint            opt in to inline lint squiggles + lint gutter (default off)
diagnostics-event  Livewire event carrying server diagnostics (requires `lint`)
label           accessible name, applied to BOTH the editor and the fallback
rows            rows on the fallback textarea
textarea-id     id for the fallback textarea, so an existing <label for> keeps working
host-class / host-style / fallback-class / hint-class / textarea-class
Syncing back from the server
The buffer lives client-side. Any server-side mutation of a bound property (save, version restore, reset to default, load example) must dispatch the surface's sync-event, or the editor keeps showing the stale buffer and overwrites the change on the next keystroke.
$this->bodyMarkdown = $template->body_markdown;
$this->dispatch('email-template-editor-sync');
Linting (opt-in)
<x-signals.code-editor
    property="yamlInput"
    :content="$yamlInput"
    language="yaml"
    lint
    :diagnostics-event="\App\Livewire\Plugins\ManifestTools::DIAGNOSTICS_EVENT"
    :label="__('signals.yaml editor')" />
lint is off by default and adds nothing to a surface that does not ask for it — no extension, no gutter, no behaviour change. With it on the editor renders data-lint="true" and gains two diagnostic sources:
Syntax squiggles for the yaml and json modes, read straight off the Lezer parse tree's error nodes — no YAML/JSON parser dependency is involved. Other modes lint nothing.
Server diagnostics, when diagnostics-event names a Livewire event whose payload is ['diagnostics' => [['line' => 12, 'message' => '…', 'severity' => 'error'], …]]. This is how the plugin manifest validator projects ManifestValidator rule failures — cross-field rules no syntax linter could ever know — onto the offending lines. Dispatch it on every validation, including successful ones: an empty list is what clears stale squiggles. Lines are 1-based and clamped, so a stale line never throws.
$this->dispatch(self::DIAGNOSTICS_EVENT, diagnostics: $this->validatorDiagnostics());
Linting is a CodeMirror-only affordance: on the textarea fallback the event is simply retained and nothing is rendered. The structured results panel therefore stays the authoritative, exhaustive list of failures — squiggles augment it, they never replace it.
Inserting snippets
<button x-on:click="$dispatch('code-editor-insert-snippet', { snippet: '{{ account.name }}' })">Insert</button>
Field/slot browsers insert at the caret via this window event. If CodeMirror never mounted, the component falls back to calling the Livewire component's insertSnippet($snippet) method server-side — a first-class supported path, not a degraded one.
Fallback & accessibility
If the CodeMirror bundle fails to load or the mount throws, [data-testid="codemirror-fallback"] is revealed: a plain textarea bound with wire:model.live.debounce.{debounce}ms and an alert explaining the degradation. The debounce is emitted from App\Support\CodeEditorDefaults::DEBOUNCE_MS for both the textarea and the JS factory, so the two cannot drift. label is applied to the CodeMirror content element (via contentAttributes) as well as the fallback textarea, so the accessible name is identical either way. Editor colours are CSS custom properties, so the editor follows the app's .dark theme, and CodeMirror's own dark flag is reconfigured live when the theme toggles.
WYSIWYG
Toolbar with icon buttons + textarea, for prose content. From notification-admin. For code or markup (HTML, CSS, Markdown, JSON, YAML) use <x-signals.code-editor> instead — this component is the plain-prose primitive and deliberately has no syntax highlighting.
Viz Buttons
Toggle button group for switching visualization types. From reporting.
Report Sidebar
Grouped sidebar list with source badges and pin buttons. From reporting.
Revenue
Revenue by Month Rental
Revenue by Category Rental
Inventory
Stock Utilisation Inv
Pin
Pin/favourite toggle button. Amber when active. From reporting.
Collapsible
Accordion panel with chevron indicator. From reporting.
Report Builder
Collapsible content goes here.
Zoom Controls
Zoom in/out with level display.
100%
Stepper
Multi-step progress indicator with done/active/pending states. From import-export.
Upload
2 Map Fields
3 Validate
4 Import
Dropzone
Drag-and-drop file upload area. From import-export.
Drop your file here or click to browse
Supports CSV, XLSX, JSON (max 50MB)
Format Selector
Card-based format/option selector. From import-export.
CSV
CSV File
XLS
Excel
JSON
JSON
PDF
PDF
Progress Bar
Horizontal progress bar with label and percentage. From import-export.
Importing records... 68%
Validating fields 100%
Avatar
User avatar with image, initials, color, and status indicator. Use <x-signals.avatar> Blade component.
Sizes
XS
SM
MD
LG
Indicators
ON
AW
OF
Avatar Group
AB
CD
EF
+3
Loading Button
Add .s-btn-loading to any .s-btn to show a spinner. CSS-only modifier.
Split Button
Button with dropdown for secondary actions. Uses <x-signals.split-button>.
Save as Draft
Save & Close

Discard
Duplicate
Archive
Pagination
Page navigation with numbered buttons, ellipsis, and per-page selector. CSS demo below; use <x-signals.pagination> with a Laravel paginator.
… 1–25 of 300
Card Variants
Card footer slot and horizontal layout. Extends existing <x-signals.card>.
Card with Footer
Confirm Action

Are you sure you want to proceed?

Horizontal Card
📦
Equipment Package

24 items across 3 categories

Simple Tooltip
Lightweight hover tooltip. Uses <x-signals.tip>. Pure CSS, no Alpine.
Top tooltip Bottom tooltip Left tooltip Right tooltip
Skeleton
Loading placeholder with shimmer animation. Use <x-signals.skeleton>.
Command Palette
Full-screen overlay with blurred backdrop. Press Cmd+K to open, or click the button below. Uses <x-signals.command-palette>.
Press ⌘K to open the full-screen command palette with blurred backdrop.
Breadcrumb
Breadcrumb navigation. Uses existing .s-breadcrumb CSS via <x-signals.breadcrumb>.
Dashboard / Rentals / OPP-2026-0148
Calendar
Mini month calendar with day selection, event dots, range selection, and adjacent month navigation. Uses <x-signals.calendar> with Alpine.
Single Date + Events
Date Range
Adjacent Month Nav
Spinner
SVG-based loading spinner. CSS-only — no border-radius needed.
Popover
Click-triggered floating panel with title, body, and optional footer. Uses <x-signals.popover>.
Stock Details

Item has 16 units available across 2 warehouses.

Date Picker
Date input with calendar dropdown, range mode, and optional time picker. Uses <x-signals.datepicker>. Composes the Calendar component.
Single Date
Date + Time
Date Range
Field
Form field wrapper with label, help text, and error state. Uses <x-signals.field> with s-input, s-textarea, s-checkbox, s-radio classes.
Standard Inputs
We'll never share your email.
Checkbox, Radio & Toggle
Choose which notifications to receive.
This field is required.
Input Groups
https://
£ GBP
kg
Modal
Full-page overlay dialog with blur backdrop, focus trap, and escape-to-close. Uses <x-signals.modal>. Click buttons below to open live modals.
Conventions. <x-signals.modal> is the default for new and rebuilt UI. Existing <flux:modal> usages may remain where already established (migration is a follow-up). Never hand-roll fixed-inset dialog markup — use the Signals modal (or <x-signals.wizard-modal> for multi-step flows).
Timeline
Vertical timeline with colored dots and content. Uses <x-signals.timeline> and <x-signals.timeline-item>.
Order Confirmed
08 Mar 2026 · 14:30
Order #OPP-2026-0148 confirmed by admin.
Items Dispatched
07 Mar 2026 · 09:15
12 items dispatched via courier.
Quote Sent
05 Mar 2026 · 11:00
Quote emailed to client.
Created
04 Mar 2026 · 16:45
Rental created.
Datetime Display
Formatted date/time display in mono font. Uses <x-signals.datetime>.
08 Mar 2026 14:30 08 Mar 2026 08 Mar 2026 14:30 6 months ago
Datetime Input
Combined date picker + time input. Uses <x-signals.datetime-input>. Composes the Date Picker with built-in time picker.
Date + Time
Date Only (no time)
Empty State
Alert / Banner
System messages, validation summaries, status banners. Use <x-signals.alert>. Supports info/success/warning/danger types.
Information
Your import is being processed. This may take a few minutes.
Success
Rental #1042 has been confirmed and the client notified.
Low Stock Warning
3 items are below minimum assets. Review allocations.
Payment Failed
Invoice #INV-2026-089 payment was declined. Please retry.
Dismissible variant:
Tip
You can customise columns by clicking the gear icon in the toolbar.
Banner (full-width, no side borders) — add class="s-banner":
Scheduled maintenance tonight at 22:00 UTC. Expect brief downtime.
Drawer
Slide-over panel for detail views, quick-edit forms, and filters. Uses <x-signals.drawer>. Click buttons to open.
Tag Input
Multi-value tokenised input for tags, categories, recipients. Uses <x-signals.tag-input>. Type and press Enter, or select from suggestions.
Combobox
Searchable select / autocomplete. Uses <x-signals.combobox>. Type to filter, arrow keys to navigate, Enter to select.
No results found
Confirmation Dialog
Lightweight destructive action confirmation. Uses <x-signals.confirm>. Reuses modal backdrop and sizing.
Copy Button
One-click copy for API keys, share links, reference numbers. Uses <x-signals.copy-btn>.
Accordion
Grouped collapsible sections with mutual exclusion. Uses <x-signals.accordion> + <x-signals.accordion-item>.
Single open (default)
Configure your company name, logo, address, and contact details.
Set default payment terms, tax rates, and invoice numbering sequences.
Choose which email and in-app notifications you receive.
Multiple open
Navigate to Rentals and click the + New Rental button.
Open a rental, click Actions, then select Issue Invoice.
Inline Edit
Click-to-edit fields. Uses <x-signals.inline-edit>. Click the value to edit, Enter to save, Escape to cancel.
Title
Quantity
Number Input
Stepper-style number input with +/- buttons and min/max bounds. Uses <x-signals.number-input>.
Default (step 1)
Step 5, min 0, max 100
Range Slider
Drag-based range selection. Uses <x-signals.range-slider>.
0 500
Quick Filters
Horizontal chip bar for one-click filter presets. Uses <x-signals.quick-filters>. Uses wire:click for Livewire integration.
Notification Center
Bell-icon dropdown with grouped notifications. Uses <x-signals.notification-center>. Real-time updates via Reverb in production.
Notifications
Rental Confirmed OPP-2026-1042 "Summer Festival" confirmed by client
2m ago
New Message Jane Cooper sent you a message about the PA system
15m ago
Stock Alert Martin guitars below minimum level (2 remaining)
1h ago
Kanban Board
Columnar card layout for pipeline views. Uses <x-signals.kanban>, <x-signals.kanban-column>, <x-signals.kanban-card>.
Quote 3
Summer Festival
OPP-1042 · Acme Events
£12,500.00
Corporate Launch
OPP-1043 · TechCo
£8,200.00
Wedding Reception
OPP-1044 · Private
£3,750.00
Confirmed 2
Music Awards
OPP-1038 · MusicCo
£45,000.00
Trade Show
OPP-1040 · ExpoWorld
£18,900.00
In Progress 1
Brand Launch
OPP-1035 · InnovateCo
£22,100.00
Completed 0
Tree View
Hierarchical expandable tree for category browsing. Uses <x-signals.tree-view>. Click arrows to expand/collapse.
Audio
Speakers
Line Array
Monitors
Subwoofers
Mixers
Microphones
Lighting
Moving Heads
LED Wash
Control
Staging
Data List
Key-value pair display for detail views. Uses <x-signals.data-list>. Supports horizontal, vertical, and grid layouts.
Horizontal (default)
Reference
OPP-2026-1042
Title
Summer Festival 2026
Account
Acme Events Ltd
Status
Confirmed
Total
£12,500.00
Grid layout
Company
Acme Events Ltd
Phone
+44 20 7946 0958
Type
Company
Created
15 Jan 2026
Last Active
3 days ago
Sparkline
Tiny inline trend line for dashboard cards and table cells. Uses <x-signals.sparkline>. Pure SVG, no chart library.
Revenue +14%
Returns -25%
Utilisation ~50%
Photo Gallery
Grid of thumbnails with lightbox overlay. Uses <x-signals.gallery>. Click to open lightbox, arrow keys to navigate.
Scheduling Calendar
Full-page day/week/month scheduling grid. Distinct from .s-calendar (section 72) — this is the hour-axis activity/resource calendar. Event blocks are positioned absolutely via inline top/height/left/width set by JS; owner tints mirror the .s-avatar-* palette. The --s-cal-hour-h custom property (default 44px) drives all hour-row and event geometry.
All day
Summer Festival Prep
08:00
09:00
10:00
11:00
12:00
Mon
16
09:00
Load-in Call
Summer Festival · Wembley Arena
Tue
17
10:00
Site Survey
Corporate Launch · ExCeL
Wed
18
08:00
Pre-rig Check
Wrapper & axes (day/week)
s-cal — wrapper (flex column); sets --s-cal-hour-h (default 44px).
s-cal-gutter — left hour-label column; s-cal-gutter-spacer top spacer aligns with column headers.
s-cal-grid — scrollable flex row of day/owner columns alongside the gutter.
s-cal-col — a single day or owner column (events absolutely positioned inside); s-cal-nonwork shades weekend/off-hours.
s-cal-colbody — column body that hour rows divide and events position against.
s-cal-colhead — sticky column header (avatar / day label); .today tints it green.
s-cal-colhead-dow / s-cal-colhead-date — day-of-week label and date number inside a column header.
s-cal-hour — an hour-row line (also gutter hour labels); s-cal-nonwork modifier shades off-hours rows.
s-cal-now — current-time accent line (blue, 2px) across the active column.
All-day band
s-cal-allday — full-width band above the hour grid.
s-cal-allday-label — left "All day" label cell.
s-cal-allday-grid — 7-column (or n-column) grid for multi-day spanning bars; set grid-template-columns to match visible day count.
s-cal-allday-bar — spanning all-day bar; .completed (strikethrough, 0.6 opacity), .cancelled (dashed, 0.55 opacity) state modifiers.
Event blocks (day/week)
s-cal-event — absolutely-positioned event block; top/height/left/width set by JS as percentages of the column window.
  .completed — muted background, strikethrough title, 0.6 opacity.
  .cancelled — muted background, dashed left border, 0.55 opacity.
  .s-cal-event-continue-top / .s-cal-event-continue-bottom — dashed edge cue that a multi-day event continues onto the adjacent day.
s-cal-event-title — event title (bold, truncated).
s-cal-event-time — start time (mono, muted).
s-cal-event-sub — secondary "regarding" line beneath the title (mono, muted).
s-cal-event-meta — flex meta row for priority + type icons + location.
s-cal-event-prio — priority marker; s-cal-prio-high (red), s-cal-prio-normal (amber), s-cal-prio-low (muted).
s-cal-event-loc — location with leading icon inside the meta row.
s-cal-event-avatars / s-cal-event-avatars-more — overlapping owner/participant avatar stack with overflow count.
s-cal-event-{green|blue|amber|violet|cyan|navy} — owner tint (background + currentColor border/text); mirrors .s-avatar-* palette.
Month grid
s-cal-month — 7-column CSS grid; one row per calendar week.
s-cal-month-dow — day-of-week header cell.
s-cal-month-cell — a day cell; .other-month (subtle bg), .nonwork (hover bg), .today (green inset ring) state modifiers.
s-cal-month-daynum — day number inside a cell; green filled circle on .today.
s-cal-chip — compact event chip inside a month cell; .completed / .cancelled modifiers.
s-cal-chip-dot — colour dot leading a chip; s-cal-chip-time — chip time (mono); s-cal-chip-sub — secondary line.
s-cal-chip-{green|blue|amber|violet|cyan|navy} — chip currentColor modifiers.
s-cal-more — "+N more" overflow link inside a month cell.
Unscheduled tray
s-cal-unscheduled — collapsible tray below the grid listing events without a fixed time.
s-cal-unscheduled-header — tray toggle header.
s-cal-unscheduled-body — scrollable list flightcase.
s-cal-unscheduled-item — a single unscheduled activity row (left-border tinted);
  s-cal-unscheduled-item-title (bold title) + s-cal-unscheduled-owner (mono, muted) inside.
Autocomplete Panel
Chrome for a server-searched autocomplete dropdown — the sibling of <x-signals.combobox> for cases where results come from a debounced Livewire query per keystroke (wire:model.live.debounce.300ms + an updatedXSearch()/computed property) rather than a pre-loaded :options array. Uses <x-signals.autocomplete-panel>. It owns the opaque background, the shared floating z-index band (--dl-z-floating), max-height scroll, and the empty/no-results state — the caller keeps its own search input and renders its own result rows (typically <button role="option" wire:key=... wire:click=...>) into the default slot. Pair with <x-signals.autocomplete-selected> (below) for the chosen-value state.
With results
Empty state
No companies found
Selected-value display (<x-signals.autocomplete-selected>)
Acme Events Ltd