Crusher UI Kit 0.3.0 is here — composition primitives, per-mode brand tuning
Local Proving Ground Live framework review surface for themes, runtime, and component quality.
Static + bundler ready
New…
Open…
Exit
Undo
Redo
Preferences
Zoom In
Zoom Out
Generators
Generate README
Generate Summary
Open Command Palette
Crusher UI Kit

The design system that powers everything I ship.

Tokens, themes, components, and runtime contracts I built because nothing off the shelf fit my ecosystem. Powers the personal site, portfolio, and a growing set of tools — and stays small enough to read end-to-end.

7 dialects Web Components + tokens Static-HTML or package consumers No-framework runtime
Try the framework View on GitHub
Live Controls Theme, mode, density, and brand
Local review

Switch dialects, light/dark, density, and brand color, then keep the exact URL for follow-up review.

light
dark
glass
minimal
futuristic
neobrutal
neumorph
brutal
bento
compact
cozy
comfortable
Shortcut: ⌘/Ctrl + K for Palette Resize to test menubar overflow
7 dialects

One framework, seven visual identities.

Tap a card to apply its theme across the whole page. Every section below — including the chrome itself — re-renders.

What just shipped

Try every M1 feature without leaving this page.

Each card below is both a marketing beat and a live QA fixture — interactive demo on top, state inspector below. New milestones append more cards.

Project Website + Verification Harness

Review the whole framework from one page.

This site is the canonical coverage surface for Crusher UI Kit. Use it to scan every public element, verify theme behavior, test runtime controls, and catch regressions before packaging or integrating the framework into other products.

Atoms

Low-level controls, feedback, and inline utility surfaces.

Forms

Label, field, hint, and error composition contract.

Molecules

Layout, overlay, selection, and intermediate interaction patterns.

Organisms

Shells, navigation, timelines, tables, and page-level surfaces.

Framework Reach

One system, multiple product shapes

  • Static HTML via standalone build and theme CSS.
  • Bundler apps via package root, runtime helpers, and exported themes.
  • Shared layout primitives for portfolio, SaaS, dashboard, and AI surfaces.

Review Workflow

Use this page as the release gate

  • Scan the landing section in light and dark mode for overall balance.
  • Check atoms and overlays for spacing, hover, disabled, and empty states.
  • Finish with runtime controls, toasts, and table flows before packaging.

What To Watch

Theme regressions show up first in shared surfaces

  • Menubar, toolbars, filter bars, chips, and badges.
  • Focus rings, contrast, and dense-mode spacing.
  • Busy, empty, and validation states that are easy to forget.
Framework Primitives

Start here to validate the framework-level shell, layout primitives, navigation rails, and dashboard surfaces that make Crusher usable as a product foundation instead of just a component dump.

Phase 4 Launch flow
Reusable shell Command surfaces Theme-aware
Shell primitives Navigation Dashboard summaries
Sync shell
+12.4% vs last week

Composed main surface

Use crusher-app-shell to place navigation and supporting rails, then nest crusher-grid and crusher-stack for page-level composition.

Add crusher-nav-list for reusable side navigation and crusher-stat for dashboard summaries before dropping into tables or domain-specific screens.

Context rail

Attach filters, status, or command surfaces without bespoke layout CSS.

Live Responsive Reusable

The same shell contract can wrap a portfolio, admin page, AI workspace, or infra console.

Linked card surface

crusher-card-link turns any card composition into a full-surface navigation target without forcing card content structure.

Highlighted card

Brand-accented border, hover-lift opt-in.

Dense data card

Tighter padding for dashboard tiles.

Muted comfortable card

Lower-emphasis background, generous padding.

Atoms

Atoms should hold up across every theme, size, and state. This section is where we validate low-level controls before trusting them inside bigger product compositions.

Hover + focus Disabled Filled + empty Feedback tones

Buttons

Variants

Primary Secondary Outline Ghost Subtle Destructive

Sizes

Small Medium Large

States

Loading… Disabled Disabled secondary
Full width

Inputs & Toggles

Text entry

Binary controls

Unchecked Checked Disabled
Off On Disabled

Feedback Surfaces

Chips

Chip Secondary chip Warning Danger Neutral

Badges & tooltip

Badge Brand Success Warning Error Tooltip

Icon links

Code Block

Syntax colors, chrome, and surface contrast should hold across all dialects.

{`const hello = (name) => console.log('Hello', name);
hello('Crusher');`}
            

Form Primitives

The field contract needs to support neutral, hint, and error states without bespoke page CSS.

Work email Use a valid address to clear the error state.
Validate Submit

Selects & Dropdowns

Static, async, and nested selection surfaces should stay legible in every theme.

Select states

Development
Staging
Production

Nested actions

New File
New Folder
AI Tools
Generate Summary
Generate README
Overlays & Navigation

These components handle transient interaction: dialogs, tabs, menus, quick actions, and runtime-driven command surfaces. They are often where theme regressions show up first.

Transient surfaces Keyboard flows Nested actions Global runtime triggers

Modal

Review focus trap, header/footer spacing, and destructive-action clarity.

Open modal
Escape to close Footer actions Backdrop lock

Confirm Action

Are you sure you want to proceed?
Cancel Confirm

Tabs

Selected state, panel visibility, and border treatments need to remain stable across dialects.

Settings overview

Validate active tab chrome, default spacing, and readable secondary text.

Runtime config Theme hooks

Command Palette

Press ⌘/Ctrl+K or use the button.

Open Palette Show Toast
Keyboard shortcut Async command provider Global runtime API
  • Open Settings
  • Scale cluster to 5 nodes
  • Tail app logs

Empty State

Use this for no-results, no-data, or not-yet-configured surfaces.

Reset filters
Alerts

Inline contextual alerts for status feedback. Variant tokens map directly to --crusher-color-status-*. Dismissible alerts persist their closed state to crusher_prefs.alertsDismissed.

5 variants Dismissible + persistent Slotted title, body, actions, icon
Heads up M3 (crusher-ui-kit@0.2.0) is in development. The first new primitive — crusher-alert — is rendered here. Dismissible alert This alert remembers when you close it via crusher_prefs.alertsDismissed[id].
Form Field

crusher-field is a form-field wrapper that auto-wires aria-labelledby, aria-describedby, and aria-invalid on the slotted control — no consumer markup needed. Supports vertical (default) and horizontal orientations.

Auto a11y wiring Vertical & horizontal Error > helper precedence

1 — Vertical + helper text

2 — Vertical + error state (aria-invalid)

3 — Horizontal orientation

4 — Disabled state (label color only; slotted control self-disables)

Disclosure

crusher-disclosure is a thin Lit wrapper over native <details>. Open state reflects bidirectionally — set the open attribute programmatically or let the user toggle. Also available as a CSS-only .crusher-disclosure utility for no-build consumers.

Bidirectional open-state reflection Height animation (Chrome 129+) CSS-only utility

1 — Lit wrapper, summary attr (starts closed)

  • Unlimited projects
  • Priority support
  • Custom domain

2 — Lit wrapper, starts open

v0.3.0 ships crusher-field, crusher-disclosure, and button enhancements.

3 — CSS-only utility (no Lit import needed)

Plain HTML disclosure

Works without the Lit component. Add class="crusher-disclosure" to any <details>. Tokens resolve from the same design system.

Stack — orientation & wrap

crusher-stack now accepts orientation (vertical | horizontal) and wrap. The default is vertical, so existing usage is unchanged. Horizontal clusters with wrap replace bespoke chip-row and action-bar CSS across consumers.

Non-breaking Cluster + wrap No new element

1 — Vertical (default, unchanged)

First Second Third

2 — Horizontal cluster (chip row)

React TypeScript Lit Web Components

3 — Horizontal + wrap (tag list / action bar)

Design system Web components Open source Token-driven Multi-theme Light + dark A11y first
Organisms

Organisms prove that Crusher can compose into real product surfaces: timelines, data tables, navigation-aware layouts, and dashboard content instead of isolated snippets.

Composed surfaces Busy + empty states Selection + filtering

Timeline

Day 1

Foundation

Tokens, reset, typography.

Day 5

Components

Buttons, inputs, overlays, data.

Skill Bars

Table States

Busy and empty surfaces should still feel like part of the same framework, not fallback browser UI.

Busy

Empty

Refresh Export
Resizable columns Sticky pins Selectable rows
24 visible 0 selected
Live dataset wiring through framework workflow primitives
Focus running
All status
Running
Starting
Stopped
All regions
us-east-1
eu-west-1
ap-south-1
Clear

SaaS connection status

Inline indicator for any external connection (OAuth, DB, webhook, service). Five states covering the realistic lifecycle: connected, disconnected, re-authorize required, error, connecting.

Manage Reconnect Connect Retry

Wire the cta slot's button to your own click handler — the component is a passive status surface, no events fire.

Avatar profile menu

Avatar-anchored dropdown for SaaS app shells. Click the avatar to open the panel — user info at the top, consumer-slotted menu items in the body, pinned footer slot for the sign-out action.

Profile Billing Team settings
Documentation Contact support

Initials fallback when no avatar-url is set. Set avatar-url="https://…" to render an image instead.

SaaS pricing tiers

Plan-card primitive for billing / upgrade pages. Three tier variants demonstrated below: standard, featured (the recommended tier, visually elevated), and current (the user's active plan). Both flags can coexist.

  • 1 connected QBO company
  • 5 vendor changes / month
  • Email verification
  • Community support
Select Starter
Most popular
  • 5 connected QBO companies
  • Unlimited vendor changes
  • Email + SMS verification (v1.5)
  • Audit-grade PDF export
  • Priority support
Upgrade to Pro
  • Unlimited QBO companies
  • Unlimited vendor changes
  • White-label audit PDFs
  • SSO + team roles
  • Dedicated success manager
Current plan

Slot a feature list as the default content; slot the action button into cta; optionally slot a "Most popular" / "Save 20%" pill into badge. The built-in "Current plan" badge appears automatically when current is set.

Invoice list

Past invoices in a table with predefined columns (date / number / amount / status badge / download link). Composes crusher-table; layers invoice-specific formatting (locale-aware dates, currency-aware amounts, provider-agnostic status badges covering Polar / Stripe / Paddle conventions).

Property: .invoices = [{ id, number?, date, amount, currency?, status, download_url?, hosted_url? }]. amount-in-cents if you're passing minor units. Listens for invoice-download event for tracking.

Payment method

Display-only card: brand + last 4 + expiry, plus optional email and Default / Expired badges. CTA slot for the "Manage" link to the provider's hosted portal — card collection happens at the billing provider, not in your UI.

Manage Update Add a payment method

File upload

Drag-drop zone + native file picker + per-file validation (size, accept-types, max-files). Manages selected-files state + UX; the consumer wires the actual upload (fetch / XHR / FormData submit). Designed for CSV imports + bulk uploads.

Listens for files-change event with { files, errors } detail; call .clear() after a successful upload to reset.

Currency input

Locale-formatted on blur (1234.51,234.50), raw numeric while focused. inputmode="decimal" shows the right mobile keypad. Compatible with native form submission + crusher-field labels/errors.

Sparkline

Opinionated minimal trend — single line / area / dots, no axes or legend. For inline "trend at a glance" cards. NOT a chart library; use a real one (Recharts, Chart.js) for axes / tooltips / multi-series.

brand · area · first/last
success · all dots
danger · line only
Runtime & Verification

This section is the runtime sanity surface. Use it to confirm URL state sync, theme switching, palette behavior, and toast rendering without leaving the project website.

Theme sync URL state Palette API Toast variants

Runtime Control Center

Use this view to verify state sync, jump between focused review sections, and confirm the current route is shareable before you leave the local proving ground.

Focused review links

Current view

view: / review: full matrix: 14 views density: 3 modes

Theme Quick Picks

Jump between dialects without scrolling back to the top controls.

Light mode Dark mode Toggle density

Current Runtime State

These values should always mirror the URL and top control panel.

theme: glass mode: light density: comfortable brand: default
Copy state URL Open command palette

Toast Center

Validate success, info, warning, and destructive feedback without changing sections.

Success toast Info toast Warning toast Danger toast

Audio Player

Opt-in ambient audio control for creative sites, games, demos, and branded experiences. preload="none" by default — audio is fetched only when the user clicks play.

Verification Checklist

Use this as the final pass before carrying Crusher into another repo.

  • Check hero, menus, chips, and cards in light and dark mode.
  • Cycle density and confirm rows, fields, and toolbars still breathe correctly.
  • Trigger validation, toasts, modal, dropdown, and command palette.
  • Review normal, busy, empty, and filtered table surfaces.

Style Switcher Showroom

One component, eight live configurations. Every tile below is a real <crusher-style-switcher inline> writing to the same global <html> state — toggle dark mode in any tile and they all sync. The inline attribute (new in 0.3.1) flips the default floating slide-out into an in-flow block for documentation pages, settings panels, and embedded admin UIs.

Full panel Default — mode + brand colors + theme primary + 7 dialects. Use when the consumer needs every lever. <crusher-style-switcher inline></crusher-style-switcher>
Mode only Just the light/dark toggle. Best when the rest of the brand is fixed. <crusher-style-switcher inline hide-themes hide-colors hide-theme-color>
Colors only — defaults Four built-in brand accents. Mode + dialects hidden. <crusher-style-switcher inline hide-mode hide-themes hide-theme-color>
Custom 3 colors Consumer picks the count and the hex values via the swatches attribute. swatches="sky:#0ea5e9, emerald:#10b981, violet:#8b5cf6"
Custom 6 colors Same attribute, different palette. No fixed slot count — consumer decides. swatches="rose:#f43f5e, amber:#f59e0b, lime:#84cc16, teal:#14b8a6, indigo:#6366f1, fuchsia:#d946ef"
Site-locked (no dialects) Mode + brand color, but the visual dialect is owned by the site. The typical product-site config. <crusher-style-switcher inline hide-themes hide-theme-color>
Music only Everything hidden, audio player in the extra slot. Useful for creative sites that just want ambient sound control. <crusher-style-switcher inline hide-mode hide-themes hide-colors hide-theme-color> <crusher-audio-player slot="extra" src="..." loop> </crusher-style-switcher>
Full panel + music Everything together. The portfolio-grade config: mode, brand, dialects, plus ambient audio in the extra slot. <crusher-style-switcher inline> <crusher-audio-player slot="extra" src="..." loop> </crusher-style-switcher>