Frame Design System

Pills & Tags

StatusTag

#MasterUsed in: Wingman 20 · WorkPal 7

Semantic status pill for pending, processing, review and completed states.

View source

Requires React 19, ReactDOM 19, TypeScript and lucide-react 1.14.0. Import frame.css once and use a frame-root wrapper; set its background to var(--color-bg-page) and color to var(--color-text-primary), or supply a matching host surface; add dark to an ancestor for dark mode.

THE canonical pill component. Every tag/badge/pill renders through this. 8 semantic variants × 2 sizes × icon override.

pendingin-progressin-reviewsuccessfailedexpiredneutral
pendingin-progressin-reviewsuccessfailedexpiredneutral
OutlineOutline failed
Variant × state matrix (6×1 = 6 cells)
variant ↓ / state →default
pending
pending
in-progress
in-progress
in-review
in-review
success
success
failed
failed
neutral
neutral

Tag

#MasterUsed in: Wingman 5 · WorkPal 3

Compact neutral label with an optional outline and tooltip.

View source

Requires React 19, ReactDOM 19, TypeScript and lucide-react 1.14.0. Import frame.css once and use a frame-root wrapper; set its background to var(--color-bg-page) and color to var(--color-text-primary), or supply a matching host surface; add dark to an ancestor for dark mode.

Thin alias — neutral StatusTag at size='sm' with no icon. Inline labels: emoji chips, n/3 counters, type labels.

Betan/3OutlineTooltip

Chip

#MasterUsed in: Wingman 7 · WorkPal 4

Compact rounded-full chip for inline suggestions, selections, draggable trait pickers.

Removable
Variant × state matrix (2×3 = 6 cells)
variant ↓ / state →defaulthoverdisabled
label only
icon + label

FilterChip

#MasterUsed in: Wingman 6 · WorkPal 5

Filter-bar chip — distinct from Chip (uses `type-detail` not `type-h2`, supports a count badge).

Variant × state matrix (2×3 = 6 cells)
variant ↓ / state →defaulthoverdisabled
default
active

UtilityChip

#MasterUsed in: Wingman 0 · WorkPal 2

Compact context action with optional pressed state for prompt toolbars.

View source

Requires React 19, ReactDOM 19, TypeScript and lucide-react 1.14.0. Import frame.css once and use a frame-root wrapper; set its background to var(--color-bg-page) and color to var(--color-text-primary), or supply a matching host surface; add dark to an ancestor for dark mode.

Mono-text utility pill for paths, IDs, tool-surface labels. Solid bg-bg-hover on hover (not gradient).

IconBadge

#MasterUsed in: Wingman 16 · WorkPal 1

Decorative icon badge for message context or workflow groups; not an interactive control.

View source

Requires React 19, ReactDOM 19, TypeScript and lucide-react 1.14.0. Import frame.css once and use a frame-root wrapper; set its background to var(--color-bg-page) and color to var(--color-text-primary), or supply a matching host surface; add dark to an ancestor for dark mode.

Decorative icon-in-circle badge (non-interactive, aria-hidden) — a round bg-bg-hover plate behind a glyph, used next to list items / section headers. For a CLICKABLE round icon use IconButton.

StatusStrip

#MasterUsed in: Wingman 0 · WorkPal 1

DS-147. One-line passive status above a content area — a bg-bg-hover strip (fill only, no border) with a 16px secondary glyph and a type-caption line. Not a control, no dismiss. Pass role='status' when it appears or changes after load.

Couldn’t reach this folder’s remote — working from its local copy for now.

With role="status" — announced when it appears.

TimePill

#MasterUsed in: Wingman 0 · WorkPal 1

Compact time or effort label using the shared status presentation.

View source

Requires React 19, ReactDOM 19, TypeScript and lucide-react 1.14.0. Import frame.css once and use a frame-root wrapper; set its background to var(--color-bg-page) and color to var(--color-text-primary), or supply a matching host surface; add dark to an ancestor for dark mode.

Thin alias — StatusTag (in-progress, sm) with a User icon. 'time estimate' semantics at call sites.

~3 minjust now

SampleWorkspaceLabel

#MasterUsed in: Wingman 0 · WorkPal 2

DS-145. Passive blue label saying the data on screen is a sample. placement='inline' sits to the right of a page title on the same line and wraps under it on narrow screens (WorkPal guest mode: label 'Sample data' with a sign-in tooltip, on every page that would show the user's own content); placement='edge' is the ribbon pulled flush to a panel's left edge (default label).

OverviewSample data
Sample workspace