Component Reference
Signals Framework — canonical component library
On This Page
Form Inputs
Field
Search Input
Checkbox
Toggle
Toggle Row
Tag Input
Combobox
Autocomplete Panel
Number Input
Range Slider
Inline Edit
Calendar
Date Picker
Datetime Input
Colour Picker
Upload Zone
Dropzone
Matrix
Stars
Code Editor
WYSIWYG
Format Selector
Strategy Selector
Data Display
Table
Data List
Status Cells
Badges
Brand Secondary & Tertiary
Toolbar Chips
Status Badge
Avatar
Sparkline
Datetime Display
Stat Cards
Bar Chart
Qty Bar
Grid Table
Kanban Board
Tree View
Timeline
Catalogue Item Cell
Availability Bar
Photo Gallery
Scheduling Calendar
Page Header
Use .s-page-header for the top of every list/detail page. Breadcrumb + title + metadata left, actions right.
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
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).
Striped
Compact & Bordered
Inline Editing & Group Row
Sortable Headers with Indicators
Filter Row
With Footer Totals
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.
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.
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
With Title
Optional
title for messages that need a heading. Without one, the message itself carries the primary ink.Import failed
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.
// 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.
Summary Bar
Compact footer showing aggregate stats. Fixed at bottom of scrollable content.
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
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.
General Settings
Notification Channels
Custom Fields
Responsive Standards
Binding mobile/responsive rules for Signals UI. New components must comply;
remediation todos (P972–P974) bring existing surfaces into line.
Touch targets
Minimum tap target is 44×44px (
--s-touch-min) at the mobile breakpoint
(max-width: 767px, matching Tailwind md). Applies to .s-btn
(including xs/sm/icon — .s-btn-xs sets
display: inline-flex so min-height works even without .s-btn),
.s-pagination-btn, .header-icon-btn / .header-avatar-btn,
.header-mobile-nav-btn / .header-mobile-nav-close,
.subnav-link, .s-admin-nav-item, .s-tab,
.s-fav-toggle / .s2se-star, other icon-button families
(.s-toolbar-btn, .s-zoom-btn, .s-calendar-nav-btn,
.s-modal-close, .s-viz-btn, .s-pin-btn,
.s-number-input-btn), .s-row-actions__trigger,
.s-checkbox/.s-radio and native checkbox/radio hit areas
(label + 44×44 control border box), .sidebar-item / .s-sidebar-item,
filter .s-chip controls, and residual families (.s-pm-bulk-toggle,
.s-stock-count-step, .s-datepicker-clear, .s-cfs-entity,
.s-account-detail-bar / .s-account-detail-density-cell,
.s-returns-wb-flag, .s-dash-drill, standalone
text-[var(--link)] actions). Glyph/visual size may stay smaller — expand the
hit box via min-width/min-height or padding + negative margin.
Inline-link exemption
Bare inline text links inside table cells and prose are exempt from the 44×44
visual-size rule — do not pad them into oversized buttons. This includes
.s-cell-link (treat as inline-text-exempt in audits): still give comfortable
padding via padding + negative margin where row height allows, without forcing a 44×44
visual box. Card-list primary title links use the same hit-area technique.
Secondary/prose links stay inline.
Breakpoints
Primary phone layouts target 375px width. Use
max-width: 767px /
Tailwind max-md: for phone vs tablet+/desktop. Spot-check 320px worst-case and 768px mid layout
when a page has a distinct tablet treatment.
Tables → card-list
Under
md, data tables use card-list mode (primary field + subtitle + status chips + actions)
with per-entity column-priority config — see P973. Do not rely on horizontal scroll of full desktop columns as the only phone strategy.
Chip-collapse rule
Filter-chip rows on index pages must wrap in
<x-signals.filter-chip-row> so chips collapse
behind a single Filters control (with active-count badge) under the mobile breakpoint.
Drag needs a touch alternative
Every drag interaction (reorder, reschedule, kanban move) must ship a non-drag touch alternative
(menus, action sheets, up/down controls, date pickers). Drag may remain the desktop path; phone flows
must be completable end-to-end without drag — see P974.
Color Palette
All status/semantic colors available. These map to --s-{color}-bg and --s-{color}-bdr tokens.
Green
Amber
Red
Blue
Violet
Navy
Navy Mid
Navy Light
Grey
Grey Light
Typography
Page title — Chakra Petch 600
font-family: var(--font-display); font-size: var(--dl-text-hero); font-weight: 600; letter-spacing: -0.025em;
Section / card title — Chakra Petch 700
font-family: var(--font-display); font-size: var(--dl-text-title); font-weight: 700; sentence case;
Button / UI control — system sans 550
font-family: var(--font-sans); font-size: var(--dl-text-ui); font-weight: 550; sentence case;
Body text — system sans
font-family: var(--font-sans); font-size: var(--dl-text-body);
Label / meta / table header — system sans 550
font-family: var(--font-sans); font-size: var(--dl-text-label); font-weight: 550; sentence case;
AST-004821 — Martian Mono (asset identifiers only)
font-family: var(--font-mono); font-size: var(--dl-text-ui); font-variant-numeric: tabular-nums; .s-table-asset / .s-catalogue-item-sku;
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
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.
Toggle
Toggle switch. Add .on class for active state. From permissions.
Sidebar
Navigation sidebar with grouped items and badges. From live-filters.
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.
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.
Status Badge
Compact status indicators (lighter weight than s-badge). From plugin-system.
Active
Disabled
Error
Stars
Star rating display. From plugin-system.
JSON Viewer
Syntax-highlighted JSON display on dark background. From plugin-system.
Parsed View
Collapsible key-value sections on dark background. From plugin-system.
Form Section
Panel with header icon, title and body. From rate-engine.
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.
Qty Bar
Quantity availability indicator. Green fill on red background. From shortage-resolution.
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.
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.
Pin
Pin/favourite toggle button. Amber when active. From reporting.
Collapsible
Accordion panel with chevron indicator. From reporting.
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 File
Excel
JSON
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>.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>.Nothing matches ""
↑↓ navigate
↵ open
esc close
Press ⌘K to open the full-screen command palette with blurred backdrop.
Breadcrumb
Breadcrumb navigation. Uses existing
.s-breadcrumb CSS via <x-signals.breadcrumb>.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).
Delete Item
Are you sure you want to delete this item? This action cannot be undone.
Edit Rental
Bulk Import Preview
Review the following records before importing:
| Name | Type | Status | |
|---|---|---|---|
| Acme Events Ltd | [email protected] | Company | Ready |
| Jane Cooper | [email protected] | Contact | Ready |
| Sound Warehouse | [email protected] | Company | Duplicate? |
Timeline
Vertical timeline with colored dots and content. Uses
<x-signals.timeline> and <x-signals.timeline-item>.Order Confirmed
Order #OPP-2026-0148 confirmed by admin.
Items Dispatched
12 items dispatched via courier.
Quote Sent
Quote emailed to client.
Created
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":Drawer
Slide-over panel for detail views, quick-edit forms, and filters. Uses
<x-signals.drawer>. Click buttons to open.
Account Details
Filters
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.Delete Rental?
Archive Record?
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)
Multiple open
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
Email
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.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