UI Kit — 114 Components

New in v2.11–v2.15

Total Pool

$161,107

Available

$98,432

Claimed

$62,675

Active Reps

85

Recent Contributions

Invoice # Rep Customer Amount Source Status Campaign
INV-20260312

Kevin Fischer

Iowa

Midwest Grain Co $4,218.50 Price Page Available Q2 2026 Incentive
INV-20260309

Randy Symes

North

Northern Steel Works $7,892.00 Job Contract Claimed Q2 2026 Incentive
INV-20260305

Mark Beaver

West

Pacific Hydraulics $2,105.75 Kit/Prod Available Q2 2026 Incentive
INV-20260228

Todd Townsend

South

Gulf Coast Mfg $11,340.00 BTS Claimed Q1 2026 Payout
INV-20260225

Eric Striegel

VP

Heartland Equipment $15,600.25 Price Page Available Q2 2026 Incentive
INV-20260220

Greg Ervin

Iowa

Prairie Valley Feed $3,475.00 Job Contract Available Q2 2026 Incentive
INV-20260215

Jake Morrison

West

Summit Precision Inc $8,920.50 Kit/Prod Claimed Q1 2026 Payout
INV-20260210

Dan Larsen

North

Tri-State Fabrication $5,310.00 BTS Available Q2 2026 Incentive
Showing 1-8 of 247

Form Elements

Buttons

Primary
Outline
Danger
Icon

Status Badges

Draft Active Finalized Error Price Page Job Contract Kit/Prod BTS Available Claimed Tier 1 Tier 2 Tier 3

Campaign Cards

Q2 2026 Incentive Pool

Apr 1, 2026 - Jun 30, 2026

$75,000 Active 3 categories, 12 targets

Q3 2026 Performance Bonus

Jul 1, 2026 - Sep 30, 2026

$50,000 Draft 2 categories, 6 targets

Q1 2026 Payout

Jan 1, 2026 - Mar 31, 2026

$36,107 Finalized 4 categories, 18 targets

Category Editor Preview

Category Settings
Targets
Total Revenue
100%
New Customers
60% $125,000
Existing Accounts
40% $200,000
Key Accounts
70% $140,000
Scoring Ranges
Min % Max % Payout % Label
0 50 0% Below Threshold
50 80 50% Developing
80 100 80% On Track
100 120 100% Target Met
120 999 150% Exceeds (Capped)

Description List

Order Number
ORD-2024-00142
Customer
Acme Industrial Supply
Status
Shipped
Total
$4,285.00
Rep Name
John Smith
Region
North Central
Phone
(515) 555-0142
Email
jsmith@example.com
Hire Date
2019-03-15
Quota
$1,200,000

Skeleton Loaders

Text

Card

Avatar

Stat Card

Slide-Over / Drawer

Order Details

Order #
ORD-2024-00142
Customer
Acme Industrial Supply
Total
$4,285.00

Radio Group

Report Frequency
Export Size

Sortable Table

Status
Jane CooperIowa92.4%Active
Bob WilsonNorth87.1%Active
Alice ParkWest76.8%Probation

Dividers

Simple horizontal divider:


Divider with label:

OR

Vertical divider (inline):

Left
Right

Button Group

View Toggle

Period Filter (sm)

Timeline / Activity Feed

Order shipped to customer

Tracking number: 1Z999AA10123456784

Payment approved

Authorized $4,285.00 via PO-20241031

Order modified by admin

Quantity changed from 10 to 12 on line item #3

Order created

Accordion / Collapsible

Flat (single open)

Contact IT support at ext. 1234 or submit a ticket through the help desk portal.
0-150% scale: Below 80% = Developing, 80-99% = On Track, 100%+ = Target Met, 120%+ = Exceeds.
RSMs create campaigns and assign reps in their region. VPs can view all but cannot edit outside their own.

Nested (with children)

Ball valves, butterfly valves, check valves, gate valves. All sourced from ISO-certified manufacturers.
Threaded, weld, flanged, and compression fittings in carbon steel, stainless, and brass.
Electric, pneumatic, and hydraulic actuators for process control and automation.
3 active regions with 42 total reps across the territory.
Primary territory covering Des Moines metro and surrounding counties. RSM: Jane Cooper.
Minnesota, Wisconsin, and the Dakotas. RSM: Bob Wilson.
Application preferences, notification settings, and API configuration. Leaf item — no children.

File Upload

Click to upload or drag and drop

PDF, XLSX, CSV · Max 10MB

With uploaded files

  • Q4-2024-Sales-Report.xlsx 2.4 MB
  • territory-map.pdf 856 KB

Chip / Tag Input

Notification Counter & Copy Button

Notification Badge

3 12 99+

Copy to Clipboard

ORD-2024-00142

SSE Connection Status

Connected Connecting... Disconnected

Interactive demo — toggle:

Stepper / Wizard

Step of 3

Popover

Positions: bottom-start (default), bottom-center, bottom-end, top-*, left, right

Left-aligned

Panel's left edge aligns with trigger's left edge. No centering, no flicker.

Centered

Panel centers on trigger. Use when trigger is wide enough that centering looks natural.

Right-aligned

Panel's right edge aligns with trigger's right edge. Good for right-side nav items.


Top Nav with Slide-Down Panels

Click the bell or search icons to see slide-down panels. Dashboard and Settings are simple links.

Document Viewer Modal

Draggable, resizable modal with zoom controls for PDF and HTML documents.

Document Viewer

Log Console

Standalone mode — embedded in page. Has level filters, search, pause/resume, copy line, auto-scroll.

Click to add entries. Try pausing, filtering, and scrolling up.
Console
No log entries No entries match filters
/ entries PAUSED AUTO-SCROLL

Health Indicators, Status Dots & Environment Badges

Health Indicators (pulsing)

Healthy Degraded Down Unknown

Status Dots (match/fail indicators)

Match Mismatch Partial Neutral

Match Method Badges

Exact Prefix Suffix Fuzzy Combined No Match

Environment Badges

PROD STAGING DEV TEST

Validation Scores

Match: 94% Match: 72% Match: 38%

Comparison Table

Field Invoice ERP System
PO Number PO-2024-00847 PO-2024-00847
Quantity 12 10
Unit Price $42.50 $42.50
Ship-To 123 Industrial Pkwy 123 Industrial Parkway

Bordered Cards, Service Health & Pipeline Flow

Order Acknowledgment

Pending

23

Processed

847

Accounts Payable

Pending

8

Processed

312

Receiving (muted)

Pending

0

Processed

156

This Service

Task Orchestrator

v2.4.1

Processes

3

SSE Clients

12

Open App

Data Workers

v1.8.0

Active

4/6

Queue

23

Open App

API Gateway

v1.2.3

Uptime

0%

Last Seen

2h ago

Open App

Pipeline Flow

ExtractedIngest
ValidatedWorker
StagingIngest
WrittenAPI

Async Select & Editable Fields

Loading State

Loading...

Loaded State

Error Fallback

Could not load options — enter value manually

Editable Field Toggle

Freight

Tax

PO Number

Invoice Date

Search with Results

Simple Layout (label + description)

Multi-Column Layout (orders/invoices)

Form Group, Validation, Date Range, Time, Kbd

Contact Information

Required fields for the primary contact.

Looks good

Please enter a valid email address

Reporting Period
to

Keyboard Shortcuts

Quick search Ctrl+K
Save Ctrl+S
Close Esc

Inline Confirm

Truncate with Expand

This is a long block of text that demonstrates the truncation component. It contains multiple sentences that will be cut off after two lines with a "Show more" button below. When expanded, the full text is visible including this final sentence about territory assignments in the North Central region.

Page Footer & Sidebar User Block

Footer

Sidebar User Block

J

Jane Cooper

Regional Sales Manager

Error Reference, Loading Overlay & Blocking Modals

Error Reference IDs

4-char Base34 code. Short enough to read over the phone. Click to copy.

Loading Overlay

Content underneath...

Loading scorecard...

Blocking Modals

Toast Notifications

Toasts stack top-right. Click buttons to trigger live demos. Sticky toasts stay until dismissed.

Authentication Modals

Charts (Plotly.js)

Requires plotly-2.35.0.min.js in your template. If not loaded, a styled error appears instead.

Bar Chart — Regional Sales by Quarter

Line Chart — Revenue vs Target

Donut — Sales by Region

Gauge — KPI Score

Sparklines (pure SVG — no Plotly)

Revenue +12.4%
Orders +3.1%
Errors -2.8%

No Plotly needed. Use preserveAspectRatio="none" to fill container width.

Stat Cards with Sparklines

Revenue

$145.2K

+12.4%

Orders

847

+3.1%

Avg Score

87.3%

+2.1%

Errors

3

-2

Chart Card (with time range selector)

Revenue by Region

Grouped quarterly comparison

Live Chart (SSE-driven)

Live Metrics — auto-updating every 2s

Streaming

Data Table — Sortable, Filterable, Paginated

Config-driven: column definitions control sort, filter type (text/select), cell rendering (text/badge/currency/date). Built-in search, pagination, row selection.

selected
rows
No rows match filters
{# close tab x-data #}

Score Badges

Default: 110% 100% 85% 55% 30%
With icons: 110% 85% 30%
Small: 110% 85% 30%
Inverse: (lower is better) 45% 85% 150%
Custom suffix: 99.9% uptime 4.2x 82 pts

Goal Progress

Revenue — exceeding goal

$510,000 of $472,000 108%

Revenue — below target

$195,000 of $472,000 41%

Margin % — percent format

27.5% of 25.0% 110%

Error Rate — inverse (lower is better)

2.1% of 5.0% 42%

Compact mode (for table cells)

$510,000 / $472,000 108% $195,000 / $472,000 41%

Accordion Table

| groups
Total

Target Rows

Revenue Growth
$510,000 / $472,000 108%
108%
110% payout
60% weight
ledger
New Accounts
3 / 8 38%
38%
0% payout
25% weight
manual
Return Rate
2.1% / 5.0% 42%
42%
120% payout
15% weight
query
Customer Retention
92 / 95 97%

Form Sizing

Small

$

Medium (default)

$

Large

$

Expandable Record

Dynamic Badges

Click to cycle status:

Alpine x-for badges:

Slider / Range Input

Single Slider

0 100

Volume:

0 100

Brightness (step 5):

Range Slider (dual handle)

$ $

Price range: $ — $

OTP / Verification Code Input

6-digit numeric

Entered:

4-character alphanumeric (large)

Entered:

Scroll Area

Vertical scroll (auto-hide)

Horizontal scroll

Context Menu

Right-click anywhere in this area

Context menu will appear at cursor position

Carousel

Resizable Panels

Left Panel

Drag the divider to resize. This panel shows a navigation or filter area.

Item 1
Item 2
Item 3

Right Panel

Main content area. Resizes proportionally as you drag the handle.

Calendar

Single date selection

Selected:

Date range selection

Range: to

Column Filters

Filter toolbar with column filters

Sources: | Date: | Status:

Scorecard Components

Score Hero

112%

Blended Payout Score

Score Gauge

Revenue Target

$842,500 / $750,000

112% of goal

Pass / Fail Badges

Pass Static pass
Fail Static fail
Editable (click to toggle)

Category Card (ranged)

Gross Profit Revenue

Weight: 40%

112%
$842,500 / $750,000

Category Card (pass/fail)

CRM Compliance

Weight: 10%

Pass

Container queries (v2.0)

v2 cards opt into Tailwind v4 container queries via the @container utility. When a parent declares @container, descendant @sm: / @md: / @max-xs: variants react to the parent's width rather than the viewport. Drop the same card into a sidebar or split-pane and it auto-collapses to a single column.

Note: the visual demo below uses raw container-type: inline-size CSS rather than Tailwind's @container utility so the snippet stays self-contained and easy to paste into arbitrary markup. The canonical reference using real macros + Tailwind v4 utility classes lives at examples/container_queries.html — it renders the same stat_card_spark macros under Tailwind v4 in two parents of different widths and is the source of truth for how production code should opt in.

Wide host (≥ 480px container)

Total

$161K

Available

$98K

Pending

42

Active Reps

23

4-up grid, sparklines visible.

Narrow host (< 480px container, e.g. sidebar)

Total

$161K

Available

$98K

Pending

42

Active Reps

23

Same cards collapse to single column; sparklines hidden — driven by container width, not viewport.

Production usage (Tailwind v4 / v3 + container-queries plugin):

{# Parent opts into container queries — cards inside react to its width. #}
<div class="@container max-w-md">
  {{ '{{' }} stat_card_spark("Total", "$161K", data=trend) {{ '}}' }}
  {{ '{{' }} stat_card_spark("Avg",   "$ 98K", data=trend) {{ '}}' }}
</div>

{# stat_card_spark already wraps itself in @container, so the sparkline
   auto-hides at @max-xs and the badge wraps cleanly without any extra
   props on the macro — purely structural opt-in. #}

v2.11–v2.15 Additions

Components and store additions shipped after v2.10. Each block below is a live demo — toggle dark mode in the header to see both palettes. The full parameter schema for every macro lives in docs/REFERENCE.md.

count_badge v2.12

Inline numeric badge with overflow rendering — count=250, max=99 renders "99+".

Inbox7 Pending42 Archive99+ Errors3

$store.ui viewport + route state v2.13

Reactive breakpoint, isMobile, matchBreakpoint(), and currentRoute from core-stores.js. Resize the window — the readout updates live (rAF-throttled).

Breakpoint
isMobile
matchBreakpoint('lg')
currentRoute

validation_strip v2.14 · #356

Attachable pass/warn/fail/neutral segmented bar for card headers. Colors match validation_score; role="meter" + aria-valuetext.

PO 12345 — Acme Corp
4/7
Flush under header (sm height, tooltips, rollup).
Extraction Results
10/10
All fields10
Handoff Summary
3/12
Neutral segment available for 'pending' states.

status_page with polling v2.14 · #355

Live health board — simulated fetch every 4s. Banner + pill colors derive from overall status. Polling pauses while the tab is hidden (try switching tabs).

Last polled:

alpine_dropdown_portal v2.14

Menu teleports to <body> so overflow-hidden ancestors can't clip it. Escape + click-outside both dismiss.

(Demo inlines the panel instead of teleporting — the macro uses x-teleport="body" to escape clipping parents.)

alpine_debounced_input v2.14

Input with x-model.debounce.Nms baked in. Type fast — the "debounced value" only updates 300ms after you stop.

Live input:
Debounced (300ms):

alpine_x_init_boundary v2.14

Captures parent-scope expressions into local reactive properties via x-effect with a _lastValue guard. Canonical fix shape for the method-body scope trap (#245/#247).

Owner (via boundary):  ·  Total:  ·  Tier:

reactive_list v2.14

x-for with keyed children, enter/leave transitions, and drag-to-reorder. Drag rows to reorder — the debug readout shows the current order.

Current order:

progress_bar(value_var=, max_var=) v2.20 · #406

Reactive width + label + auto-color for streaming progress. Click Tick to advance; with color="auto" the bar changes color as it crosses thresholds (red<50 → amber<75 → blue<100 → green=100).

/
15%

card(clickable=, on_click=, aria_label_var=) v2.20 · #405

Cards as button-role selection tiles: role="button", tabindex="0", click + enter + space all fire on_click, plus a keyboard focus ring. Try Tab through the tiles and press Enter or Space.

Selected:

card(x_style_var=) v2.20 · #402

Alpine :style on the outer wrapper. Use for user-resizable dashboard tiles where grid-column: span N comes from state.

card(collapsible=, open_var=) v2.20 · #401

Sectioned-variant header becomes a toggle: chevron rotates, body wraps in x-show + x-collapse. The header_right slot is wrapped in @click.stop so nested buttons don't toggle the card.

Tables Used by This Process

Click the header or press Space/Enter to toggle

invoices.raw_header
invoices.line_item
vendors.master
gl.period

expandable_record(on_expand=) v2.20 · #403

Fires only on the expand transition (not collapse) — the toggle-then-guard pattern prevents lazy-load calls from double-firing on rapid re-toggle. Click a row to simulate a detail fetch; watch the "expands" counter tick only on open.

Expand-fired count:

service_health_card(status_var=) + pipeline_flow(steps_var=) v2.20 · #399

Reactive variants for polled Alpine status. Click the buttons to simulate a suite health change — border, dot, label, and pipeline connectors all re-paint from the shared Alpine state without a page reload.

Ingest Pipeline

status:

Both macros still accept their static Jinja inputs (status= / steps=) as a pre-hydration server render; the vars shown here are the additive reactive path.

pipeline_flow(variant="metrics") v2.21 · #409

Boxed-tile layout with count + label + success_rate per stage. Tile color is derived from success_rate against the thresholds param (default [95, 80]): ≥95 green, ≥80 amber, >0 red, else gray. Both variants — status (v2.20) and metrics (v2.21) — are rendered below from the same Alpine dataset.

Static steps= works identically — same thresholds, same palette. The thresholds=[99, 95] param tightens the green band for SLA-strict pipelines.

backup_list v2.24 · #417

Rolling list of DB backup files with state-dependent restore actions. Each row is in one of three states (live / staged / archived) and only the actions valid for that state render. busy_var globally locks the table while an operation is in flight; consumer-owned confirm_modal wires through shared Alpine scope.

Last action: ⟳ working…

The demo handler simulates a 900ms operation — note that every action button across the table disables while busy is true. In a real app, load_live and promote would flip a confirm_modal rather than firing immediately.

alpine_json_island v2.19 · #350

Server payload in a <script type="application/json"> tag, parsed at the x-data boundary. _safe_json escapes <, >, & in string values so </script> inside the payload cannot break out.

inside string stays escaped"}
Name:
Terms:
Active:
Note round-trip:

The note contains a literal </script> sequence — view source to confirm the payload escaped it to so the browser didn't terminate the tag early.

alpine_shortcut_binding v2.19 · #350

Window-scoped keyboard shortcut with an optional when= guard. Focus this demo (or click into it) then press the shortcuts below.

Esc always fires
G guarded
Ctrl+K prevented
Last key: Fired: times

alpine_polling_timer v2.19 · #350

setInterval with Alpine lifecycle — automatic teardown, pause on tab hidden, immediate tick on resume, reactive active_var. Toggle the checkbox or switch tabs to see pause/resume.

Ticks
Last tick
State

Switch to another tab and come back — the counter pauses while hidden and fires an immediate tick on return (no up-to-intervalms wait for fresh data).

modal(size=...) v2.15.0 · #368

Modals now accept a size param mapping to Tailwind's max-w-* scale. Click any button to open its corresponding size.

Size:

Master-detail and data-heavy modals fit here without bypassing the macro (and losing $store.ui.modalStack + a11y wiring).

Reactive placeholder + event modifiers v2.15.0 · #357 #369

placeholder_var binds a live expression; on_input_modifiers="debounce.300ms" restores the .debounce.Nms Alpine modifier that pre-macro inline HTML had. Type fast and watch the ticker stall.

Mode:
Mode:
Every keystroke:
Debounced (300ms):

slide_over + document_viewer modal stacking v2.15.1 · #374

Both register with $store.ui.modalStack so Escape closes only the top one. Open several layers and press Esc repeatedly — they unstack one at a time.

Stack demo requires live Alpine + core-stores.js; the mechanics are tested in tests/test_js.py::TestCoreStoresV214ModalStack and verified in tests/test_macros.py::TestModalStackIntegration.

v2.28 — Composable slots (Phase 1 of #420)

Two macros — data_table and stat_card — accept a {% raw %}{% call(slot) macro(...) %}{% endraw %} wrapper that lets the consumer compose any markup (including nested macros) into named cell regions. Backwards-compatible: every existing call site renders exactly as in v2.27. Full convention in docs/CONVENTION.md. Closes consumer issue #437.

data_table — per-column slot, dispatched by column key v2.28 · #437

Replicates COE's extraction-models reference table: model name with conditional Recommended badge + sub-text description, provider/status/tier badges in adjacent cells. Each column with "slot": true delegates rendering to the consumer's {% raw %}{% call(slot) %}{% endraw %} body, which dispatches on slot (the column key). Inside the body, row and ri are Alpine identifiers — bind reactively per row.

Model Provider Tier Status Added

Four columns slot in rich content composed via badge + health_indicator nested macro calls; the Added column has no slot flag and falls through to the macro's existing default cell rendering. The 80-line hand-rolled equivalent in ifp_coe/templates/partials/tabs/settings_tab.html:454 can now be replaced.

stat_card — fixed-name slots (icon, value, trend) v2.28 · #420

Wrap with {% raw %}{% call(slot) stat_card(label="…") %}{% endraw %} to take over the icon, value, and trend cells. Use this when the existing value_html escape hatch isn't ergonomic — e.g. composing a sparkline in the trend slot or a multi-color value with prefix/suffix.

Revenue (MTD)

$1,234.56 USD

Revenue (MTD)

$1,234.56

+12%

Margin

23.4% target 25%
+5pp

Left: all three slots filled (composed icon + multi-color value + sparkline). Middle: no {% raw %}{% call %}{% endraw %} wrapper, default rendering. Right: only the value slot filled — icon and trend keep their defaults because per-slot fallback kicks in when the caller emits empty for a given slot. Wrapping the macro doesn't cost you the chrome defaults you didn't override.