API freeze
Slate 3.x stable freezes the contracts below for rename. Treat them as stable for apps and agents. Surfaces still marked experimental may deepen behavior without renaming props or tokens.
Do not rename these props, event fields, or CSS variables without a major version.
Progressive form props (frozen)
These props auto-compose field / field-label / field-description / field-error on form controls:
| Prop | Role |
|---|---|
label |
Accessible control label |
description |
Help text under the control |
errorMessage |
Explicit error copy (alongside Livewire/$errors) |
name / errorKey |
Validation key wiring |
showError |
Whether to render the error slot (where supported) |
Frozen on: input, textarea, select, checkbox, switch, radio, radio-group, file-input.
help remains a deprecated alias of description on text-like controls — prefer description.
<x-slate::input
label="Email"
type="email"
wire:model="email"
description="We will never share your email."
errorMessage="Please enter a valid email address."
/>
Toast event shape (frozen)
| Event | slate-toast on window |
| Listen | <x-slate::toaster /> (@slate-toast.window) |
detail fields (frozen names):
| Field | Type | Notes |
|---|---|---|
id |
string? |
Auto-generated when omitted |
title |
string? |
Primary text |
description |
string? |
Secondary text |
variant |
string? |
default | destructive | success | warning | info |
duration |
number? |
ms; 0 = no auto-dismiss; default from toaster duration |
window.dispatchEvent(new CustomEvent('slate-toast', {
detail: {
title: 'Saved',
description: 'Your changes were stored.',
variant: 'success',
duration: 4000,
},
}))
Action buttons stay compositional (toast-action) — not part of the event payload.
Design tokens (frozen names)
Do not rename these --slate-* variables. Values may still be tuned in patch releases.
| Group | Tokens |
|---|---|
| Core | --slate-radius, --slate-background, --slate-foreground, --slate-card, --slate-card-foreground, --slate-popover, --slate-popover-foreground |
| Brand | --slate-primary, --slate-primary-foreground, --slate-secondary, --slate-secondary-foreground, --slate-muted, --slate-muted-foreground, --slate-accent, --slate-accent-foreground |
| Status | --slate-destructive, --slate-destructive-foreground, --slate-success, --slate-success-foreground, --slate-warning, --slate-warning-foreground, --slate-info, --slate-info-foreground |
| Chrome | --slate-border, --slate-input, --slate-ring |
| Sidebar | --slate-sidebar, --slate-sidebar-foreground, --slate-sidebar-accent, --slate-sidebar-accent-foreground, --slate-sidebar-border, --slate-sidebar-ring |
Full tables: Design tokens. Playground: Themes.
Experimental
Still free to deepen (behavior / a11y) without renaming frozen contracts:
- Calendar / combobox / chart depth beyond current keyboard, Livewire, and a11y baselines
- Nested overlay stacking edge cases beyond scroll-lock + topmost Escape
- MCP catalog coverage and helper aliases (
@electrik/slate-mcp) - Block gallery markup on the docs site
When a page or prop is experimental, docs say so explicitly. Prefer frozen contracts when generating Blade for consumers.