Blocks · Interactive patterns

Real app surfaces, fully wired

Eight families of interactive surfaces — chat, wizards, uploads, search, filters, tables, tag inputs, date pickers. Five variants each, every one a working demo with real state.

Chat & conversation

Message threads, typing indicators, suggestion chips, threaded replies, and a full-app chat layout.

Classic chat

Bubble thread with composer. Enter or click Send pushes a new message; bot echoes after a beat.

.chat.chat-thread.chat-msg
Hey — what brings you in today?
Just exploring the framework.
Nice. Try sending a message below.

With typing indicator

After you send, three-dot indicator appears while the agent "thinks", then replies.

.chat-typing
Ask me anything about LSD.

Suggestion chips

Quick-reply chips below the input. Click one to send it as a message.

.chat-suggestions
How can I help? Pick a suggestion or type your own.

Threaded replies

Click Reply under a message to compose a nested response inline.

.chat-thread-replies
Shipping the new motion library tomorrow.
Anyone able to QA the timeline?

Full-app layout

Sidebar contacts + main thread + composer. Click a contact to switch threads.

.chat-app
Hey, looping you in on the new release.
Sounds good.

Multi-step wizards

Segmented step indicators, side rails, summary review, onboarding cards, and per-step circular progress.

3-step form

Segmented indicator + form panel + Back/Next. Steps validate before advancing.

.wiz.wiz-steps
  1. 1Account
  2. 2Profile
  3. 3Done

Create your account

Side progress rail

Left rail lists all steps with active / completed / upcoming states. Click completed to revisit.

.wiz-rail
  1. 1Account
  2. 2Workspace
  3. 3Members
  4. 4Confirm

Account

Review & submit

Final step shows captured fields with per-section Edit buttons that jump back.

.wiz-summary
  1. 1Details
  2. 2Address
  3. 3Review

Details

Onboarding cards

Full-bleed welcome cards with skip / next. Dots show position.

.wiz-onb

Welcome to LSD

Design tokens, motion, components — all in one substrate.

Circular per-step progress

Each step has sub-tasks; the ring fills as you check them off.

.wiz-circ
0%

Set up your profile

File upload

Drop zones, preview grids, progress lists, image crop, and multi-step workflows.

Drop zone

Drag files over to highlight. Click to browse. Names appear under the zone.

.up-drop

Drop zone + thumbnails

Each uploaded file becomes a tile. Click × to remove.

.up-preview-grid

Progress list

Each upload animates a bar from 0–100% in real time.

.up-row__bar

Image cropper

Crop frame is draggable inside the preview. Apply to "save" the crop.

.up-crop

Multi-step workflow

Drop → Preview → Uploading → Done. Step indicator fills as you advance.

.up-steps

Classic results list

Type to filter results in real time. Count chip updates.

.sr.sr-list
9 results

With filter chips

Toggle category chips to narrow results. Multiple chips combine.

.sr-filters

Typeahead dropdown

Dropdown opens as you type. Arrow keys navigate, Enter selects.

.sr-dropdown

Grouped by category

Results group under section headers as you search.

.sr-group-h

Empty state with suggestions

When nothing matches, suggest popular searches as chips.

.sr-empty

Filter sidebars

Vertical facets, price ranges, collapsible groups, active-chip strips, and mobile drawers.

Checkbox facets

Each checkbox filters the result list live.

.flt.flt-check

Price range + clear

Dual-handle range slider plus a Clear all button.

.flt-range

Collapsible groups

Click a group header to expand or collapse its facets.

.flt-collapse
Item A
Item B
Item C

Active filter chips

Applied facets appear as removable chips above the results.

.flt-active
No filters applied
Result A
Result B

Mobile drawer

On narrow widths, the sidebar collapses behind a Filters button that opens a full-screen drawer.

.flt-drawer
Item A
Item B
Item C

Sortable tables

Sorting, pagination, row actions, inline edit, and expandable detail rows.

Sortable headers

Click a column header to sort ascending; click again for descending.

.tbl
Name Role Status
Plover HexstromEngineerActive
Plover HexstromArchitectActive
Plover HexstromResearcherAway
Plover HexstromMaintainerActive

Paginated

Five rows per page. Next/Prev and numbered buttons navigate.

.tbl-paginate
IDUserPlan

Row actions + bulk select

Per-row buttons plus a select-all checkbox. Bulk bar appears when rows selected.

.tbl-actions.tbl-bulkbar
0 selected
NameEmailActions
Adaada@lab.io
Gracegrace@lab.io
Alanalan@lab.io

Inline edit

Double-click a cell to edit. Enter or blur to save, Escape to cancel.

.is-edit
NameRoleEmail
Plover HexstromEngineerada@lab.io
Plover HexstromArchitectgrace@lab.io
Plover HexstromResearcheralan@lab.io

Expandable rows

Click a row to reveal a detail panel below it.

.tbl-expand
OrderCustomerTotal
#1024Plover Hexstrom$129.00
Items: 3 · Shipped 2026-04-11 · Tracking 1Z999AA1
#1025Plover Hexstrom$59.00
Items: 1 · Pending · ETA 2026-05-18
#1026Plover Hexstrom$249.00
Items: 5 · Delivered 2026-04-30

Tag inputs

Typed-text-to-chip patterns with suggestions, limits, colors, and grouping.

Classic chips on Enter

Type a word, press Enter — it becomes a chip. Click × to remove.

.tag-input

With suggestions

As you type, a dropdown shows matches. Click or arrow + Enter to add.

.sr-dropdown

With max limit

Maximum 5 tags; counter shows remaining; input disables at limit.

.tag-input__counter
5 remaining

Auto color-coded tags

Each new tag gets a stable color hash from its label.

.lsd-chip

Grouped by category

Type cat:value (e.g. color:red) to add a tag into a named group.

.tag-input__group-h

Date pickers

Single date, range, date+time, presets, and inline calendars.

Single date

Click input to open the calendar popover. Pick a day to populate.

.dp

Date range

Pick start, then end. Days between highlight as the range.

.dp.is-in-range

Date + time

Pick a day, then set hours and minutes below.

.dp-cal__time

Range presets

Today, Yesterday, Last 7 days, Last 30 days, plus a custom calendar.

.dp-presets

Inline calendar

Always-visible calendar, no popover. Useful for booking flows.

.dp.is-inline
No date selected