Skip to content

Workshop

Whisper headlines on warm parchment, ink and linen pill buttons, ember links and a painted stage.

  • Light by default
  • 35 colours · 14 type steps
  • Inspired by cursor.com
Use Workshop
localhost:3000

The same generated app in every design. Scroll inside the window to see the whole page.

What it is

Workshop is a calm, warm system for tools people work in all day. Headlines sit at weight 400 on parchment, buttons are ink and linen pills, and cards are bone sheets cut at 4px with a faint ink line. One ember orange marks links, eyebrows, focus and a caret after the hero title; it never fills a surface. The product sits on a painted landscape and floats on one deep, soft shadow, while mono labels carry the technical voice. Dark mode is the same workshop at night, lit by an ember glow on the horizon.

Maintained by @agentic-studio in the open registry.

Best for

Developer tools, AI assistants and technical products that want to feel crafted and calm, not loud. It also suits writing, planning and docs tools whose product screens can carry the page.

Trade-offs

  • Weight 400 headlines and a short type scale make a quiet page. A brand that needs to shout will feel held back.
  • The painted stage is the signature, and it needs a product picture on top. A hero with no picture loses most of the character.
  • Ember text is deepened to #c33c00 in light so links pass 4.5:1. It reads as burnt orange next to the brighter ember of the caret.

Tokens

Generated from this design’s design.yaml, and shipped as CSS variables plus a Tailwind theme. Templates may use these names and nothing else.

Colours

Every colour token in design.yaml, grouped the way the system documents them. These are the light palette's values. The dark palette uses the same names with its own values, and tokens.css ships both.

Brand and accent

  • accent

    #c33c00

  • accent-1

    #3a6a9f

  • accent-2

    #1f8a65

  • accent-3

    #c08532

  • accent-4

    #cf2d56

  • accent-5

    #a5679f

  • accent-6

    #4299bf

  • accent-hover

    #a63300

  • accent-soft

    #fcece3

  • primary

    #26251e

Surface

  • canvas

    #f7f7f4

  • hairline

    rgb(38 37 30 / 0.1)

  • surface-card

    #f2f1ed

  • surface-dark

    #26251e

  • surface-dark-elevated

    #36352d

  • surface-soft

    #f2f1ed

  • surface-solid

    #fcfcf9

  • surface-strong

    #dcdbd5

Text

  • body

    #4a4943

  • body-strong

    #36352e

  • ink

    #26251e

  • muted

    #6a6963

  • muted-soft

    #8b8a84

  • on-accent

    #fcfcf9

  • on-dark

    #f7f7f4

  • on-primary

    #f7f7f4

Semantic

  • error

    #b11f47

  • success

    #2b7256

  • warning

    #875814

Other

  • danger

    #b11f47

  • danger-soft

    #fae8e9

  • error-soft

    #fae8e9

  • primary-hover

    #3b3a32

  • success-soft

    #e3f1e8

  • warning-soft

    #f7ebd7

Type scale

Each token rendered at its real size, weight, line height and tracking. Specimens fall back to this site's typeface when the design's own face is not installed locally, so read the numbers, not the letterforms.

  • Ship faster

    Token
    display-xl
    Values
    3.25rem · 52px · 400 · lh 1.08 · ls -0.026em
  • Ship faster

    Token
    display-lg
    Values
    2.75rem · 44px · 400 · lh 1.1 · ls -0.023em
  • Ship faster

    Token
    display-md
    Values
    2.25rem · 36px · 400 · lh 1.2 · ls -0.02em
  • Ship faster

    Token
    display-sm
    Values
    1.625rem · 26px · 400 · lh 1.25 · ls -0.012em
  • Ship faster

    Token
    title-lg
    Values
    1.375rem · 22px · 400 · lh 1.3 · ls -0.005em
  • Ship faster

    Token
    body-lg
    Values
    1.125rem · 18px · 400 · lh 1.55 · ls 0
  • Ship faster

    Token
    title-md
    Values
    1.125rem · 18px · 500 · lh 1.4 · ls 0
  • Ship faster

    Token
    body-md
    Values
    1rem · 16px · 400 · lh 1.5 · ls 0
  • Ship faster

    Token
    title-sm
    Values
    1rem · 16px · 500 · lh 1.45 · ls 0
  • Ship faster

    Token
    body-sm
    Values
    0.875rem · 14px · 400 · lh 1.5 · ls 0.01em
  • Ship faster

    Token
    button
    Values
    0.875rem · 14px · 400 · lh 1 · ls 0.01em
  • Ship faster

    Token
    nav-link
    Values
    0.875rem · 14px · 400 · lh 1.45 · ls 0.01em
  • Ship faster

    Token
    caption
    Values
    0.8125rem · 13px · 400 · lh 1.45 · ls 0.01em
  • SHIP FASTER

    Token
    caption-uppercase
    Values
    0.75rem · 12px · 500 · lh 1.6 · ls 0.04em

Typefaces

The families the generated Tailwind theme points at. A licensed face is named here even when the substitute below is what actually renders.

  • DisplayInstrument Sans, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
  • BodyInstrument Sans, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif
  • MonoRed Hat Mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace

Spacing scale

Drawn at true size. These are the only gaps and paddings a generated repo is allowed to use.

  • xxs0.25rem · 4px
  • xs0.5rem · 8px
  • sm0.75rem · 12px
  • md1rem · 16px
  • lg1.5rem · 24px
  • xl2rem · 32px
  • xxl3rem · 48px
  • section5rem · 80px

Radius scale

Sample shapes at true corner radius. Buttons and inputs sit at the small end of this scale, feature cards at the large end.

  • xs0.125rem · 2px
  • sm0.1875rem · 3px
  • lg0.25rem · 4px
  • md0.25rem · 4px
  • xl0.5rem · 8px
  • full9999px
  • pill9999px

Elevation

Shadow tokens on a neutral card, at true blur and spread.

  • insetinset 0 -1px 0 0 rgb(38 37 30 / 0.08)
  • lift0 28px 70px 0 rgb(38 37 30 / 0.14), 0 14px 32px 0 rgb(38 37 30 / 0.1)
  • overlay0 25px 50px -12px rgb(38 37 30 / 0.25), 0 12px 24px -8px rgb(38 37 30 / 0.15)
  • ring0 0 0 3px rgb(195 60 0 / 0.18)
  • soft0 1px 2px 0 rgb(38 37 30 / 0.04), 0 8px 24px -6px rgb(38 37 30 / 0.12)
  • xs0 0 #0000

DESIGN.md

Ships in your repo as DESIGN.md. The designer agent reads it before it may introduce a new visual pattern. This is the briefing, not a page about the briefing.

Workshop is a calm, warm design for tools people work in all day. It reads like a quiet workshop on parchment: weight 400 headlines, ink and linen pill buttons, bone paper cut at 4px and mono caps for labels. One ember orange lives only in text and thin marks. Product pictures float on a landscape painted in CSS.

Read this before you add a screen, a component or a colour. The tokens live in src/app/globals.css, the faces in src/app/fonts.ts, the kit in src/components/ui/.

At a glance

ThemeLight first: parchment #f7f7f4 and ink #26251e. Dark is the same workshop after hours: #151410 with bone text.
TypeInstrument Sans at 400 and 500 for everything; Red Hat Mono for eyebrows, labels, ids and code.
ColourWarm neutrals, one ember (#c33c00 for text, #f54e00 for marks) and a cool blue kept only for text selection.
ShapeButtons are pills. Cards, fields, tiles, menus and stages are cut at 4px. App windows and dialogs get 8px.
DepthFlat paper under a 10% ink hairline. One deep, soft lift shadow for things that float.
SignatureA landscape painted in CSS under the product, and a blinking ember caret after the hero headline.

Principles

  1. Whisper, don't shout: headings sit at weight 400 at every size.
  2. Ember is ink, not paint: it marks text and thin lines, never a surface.
  3. Pills for actions, 4px cuts for everything else.
  4. A hairline first, a shadow only when something floats.
  5. The painting is the loudest thing on the page, and the product sits on it.

Colour

Palette

TokenLightDarkRole
canvas (--background)#f7f7f4#151410The page floor
surface-soft#f2f1ed#1a1915Section bands, sidebars, table heads
surface-card (--muted)#f2f1ed#1d1c18Tinted fills: inactive tabs, hover rows, code
surface-strong#dcdbd5#34332cPressed fills, progress tracks
surface-solid (--popover)#fcfcf9#24231eMenus, selects, toasts: always opaque
card#f2f1ed#1d1c18The card fill
surface-dark#26251e#0e0d0aThe inverted panel
hairline (--border)rgb(38 37 30 / 0.1)rgb(236 235 229 / 0.1)Every border and divider
ink (--foreground)#26251e#ecebe5Headings and primary text
body-strong#36352e#dcdbd3Emphasised body text
body#4a4943#c4c3bbRunning text
muted (--muted-foreground)#6a6963#a09f97Secondary text, captions
muted-soft#8b8a84#7a7971Placeholders, disabled text, icons at rest
primary#26251e#ecebe5The action colour
accent (--accent-fill)#c33c00#fa5a12The saturated accent: links, the accent badge
accent-soft#fcece3#301408The tint an accent label sits on
danger (--destructive)#b11f47#ec7385Destructive actions and errors

success, warning and error each come with a -soft tint for the back of a badge or an alert: #2b7256, #875814 and #b11f47 in light, #66c093, #e5b568 and #ee7d8d in dark.

Workshop's own variables, read by the landing hooks and the kit: --ember (#f54e00 light, #f54e00 dark), --selection (rgb(139 196 248 / 0.45) light, rgb(139 196 248 / 0.3) dark), --paint-sky (#cbc5bf light, #1d1b21 dark), --paint-haze (#ddd3c2 light, #2e2c32 dark), --paint-ridge (#a9968f light, #3b2f33 dark), --paint-earth (#7c6f59 light, #221d16 dark), --paint-water (#a599a3 light, #1e252b dark), --paint-glow (rgb(250 238 214 / 0.6) light, rgb(245 78 0 / 0.3) dark), --paint-grain (rgb(38 37 30 / 0.03) light, rgb(236 235 229 / 0.025) dark).

How colour is used

  • Parchment #f7f7f4 is the canvas. Bone #f2f1ed carries cards and the one soft band, linen #e6e5e0 fills second buttons and tiles, and paper #fcfcf9 is menus and fields.
  • Ink #26251e is text and the primary pill. Body, body-strong and muted step it down for long text and metadata.
  • Ember text #c33c00 marks links, eyebrows and focus. The brighter #f54e00 is only for the hero caret and the small caret before each eyebrow.
  • Muted text and ember words never sit on linen, where they drop below 4.5:1. Use body or body-strong there.
  • Text selection is the one cool tone: a pale blue under ink text.

Charts

accent-1 to accent-6 (also chart-1 to chart-6) are six series colours ordered so neighbours stay distinguishable. A painter's box: slate, verdant, amber, crimson, mauve and cerulean, brighter in dark. None of them is ember, so data never competes with links. Assign them in order; never let colour be the only way to tell two series apart.

Dark mode

The palette is declared twice in src/app/globals.css: light on :root, dark under @media (prefers-color-scheme: dark) and again on .dark, where the class wins in both directions. @theme inline points every utility at those variables, so bg-canvas is one class that follows the mode. src/lib/design.ts sets the theme a first visit opens in: light here, because Workshop is drawn in light first. The theme menu in the header offers light, dark and system and remembers the choice.

Type

Faces

  • Instrument Sans (font-display, font-body): headings and display type; running text and interface copy.
  • Red Hat Mono (font-mono): code, ids and tabular labels.

Instrument Sans is a calm, slightly warm grotesque that whispers at 400 with tight tracking, so one family sets every heading, button and paragraph. Red Hat Mono sits on a 0.6em advance and stays light at 12px, so eyebrows and labels read as quiet metadata, not a terminal.

Every face loads through next/font/google in src/app/fonts.ts: downloaded at build time and served from this app. Change a face there and here, together.

Scale

TokenSizeLineTrackingWeightUse
text-display-xl52px1.08-0.026em400The hero headline, desktop
text-display-lg44px1.1-0.023em400The hero headline, tablet
text-display-md36px1.2-0.02em400Section headlines, the hero on phones
text-display-sm26px1.25-0.012em400Section headlines on phones, big numbers
text-title-lg22px1.3-0.005em400Page titles in the app
text-title-md18px1.40500Card titles
text-title-sm16px1.450500Small headings, table titles
text-body-lg18px1.550400Lead paragraphs
text-body-md16px1.50400Running text
text-body-sm14px1.50.01em400Interface copy, table cells
text-caption13px1.450.01em400Metadata, helper text
text-caption-uppercase12px1.60.04em500Eyebrows above headings
text-button14px10.01em400Buttons
text-nav-link14px1.450.01em400Header and footer links

Rules: one h1 per page. Display sizes are for marketing pages; the app tops out at text-title-lg. Two weights: 400 for headings, body and buttons, 500 for small titles, labels and names. Tracking tightens as size grows, from +0.01em at 14px to -0.026em at 52px. Mono caps at 12px carry eyebrows, table heads and stat labels.

Space and layout

  • Spacing tokens: xxs 4px, xs 8px, sm 12px, md 16px, lg 24px, xl 32px, xxl 48px, section 80px (the gap between landing sections).
  • Content sits in max-w-content (1280px) with px-md on phones and px-lg from sm up. Reading text stops at max-w-measure (672px).
  • A 4px base unit. Controls are 32 to 44px tall, gaps are 8px and card padding is 24px.
  • Sections sit 80px apart on parchment. Space separates them, never a rule.
  • Hero text and section heads sit left on the content column. The logo caption and the closing panel stay centred.
  • Content column 80rem with 16px and 24px gutters.

Shape and depth

TokenValueWhere
rounded-xs2pxBreadcrumb, Checkbox, Kbd
rounded-sm3pxAccordion, Badge, DropdownMenu, Select, Tabs, Tooltip, the landing page
rounded-md4pxAlert, Card, DropdownMenu, Input, Popover, Select, Skeleton, Toaster, the landing page
rounded-lg4pxThe landing page
rounded-xl8pxAlertDialog, Dialog, the landing page
rounded-pill9999pxButton, Progress, Switch, Tabs, Toaster, the landing page
rounded-full9999pxAvatar, Dialog, RadioGroup, Sheet, Switch

Buttons, tab tracks, switches and avatars are round. Cards, fields, tiles, menus and painted stages are cut at 4px; app windows and dialogs at 8px. Resting surfaces are flat under a 10% ink hairline. Menus get a faint soft shadow, floating windows the deep lift shadow and dialogs the overlay shadow.

Components

Every component lives in src/components/ui/ and is written against the tokens above. Import from there; never restyle a kit component inline to make a one-off.

ComponentIn Workshop
ButtonEvery size is a pill and icon buttons are 40px circles. Grotesque at 400, sentence case, no shadow: 14px labels, 16px on the large size. Sizes are 32, 40 and 44px tall. Primary is an ink pill, secondary a linen pill, outline a hairline ring, ghost is body text, link is ember text with an underline on hover. Focus is a 2px ember outline and a press sinks 1px.
BadgeA paper tag cut at 3px, not a pill: mono 12px, sentence case, no border. Neutral is linen, accent is ember on the pale ember tint, and status colours sit on their soft tints. The uppercase variant is mono caps.
CardBone paper cut at 4px with a 10% ink hairline, flat, with no hover lift. Soft drops the line, strong is linen, outline is see-through and dark is an ink block. Titles are 18px at 500.
Input, Textarea, SelectPaper fields cut at 4px with a 20% ink line. Inputs are 40px tall; textareas start at 96px with relaxed lines. Focus turns the line ember and adds a soft ember halo. An invalid field gets the danger line, and a danger halo on focus. Select menus are paper with linen highlights and mono caps group labels.
Checkbox, RadioGroup, SwitchCheckboxes are paper boxes cut at 2px that fill with ink when checked. Radios are paper circles with a 6px ink dot. Both have a grey line that holds 3:1 on parchment. The switch is a pill track, stone with a line when off and ink when on, with a thumb on a soft shadow. Focus is the 2px ember outline.
TabsDefault tabs are a linen pill track with a flat paper pill and a hairline for the active tab. Line tabs read like editor file tabs: a hairline row and a 1px ink rule under the active one. Tab labels are 14px at 400.
AccordionRows split by hairlines. Questions are 16px at 500 in ink and turn ember on hover. A thin muted chevron turns over when a row opens. Answers are 16px body text.
Dialog, AlertDialog, SheetAn ink scrim at 45% with no blur. Paper panels with 8px corners, a hairline and the overlay shadow. Side sheets stay square; top and bottom sheets round only their inner edge, and a hairline runs under the sheet title. Titles are 22px at 400. Actions are right-aligned pills, primary last. The close button is a ghost circle.
DropdownMenu, Popover, Select content, TooltipPaper menus cut at 4px with a hairline and a soft shadow. Items are cut at 3px with a linen highlight, group labels are mono caps and shortcuts are mono. Tooltips are small flat ink tags with parchment text, inverted in dark.
TableRows split by hairlines under a bone head with mono caps labels in muted. Rows tint on hover. Numbers are tabular; set ids and file names in mono.
AlertCut at 4px with a hairline. Info is bone with an ink icon; success, warning and danger sit on their soft tints with the icon in the status colour.
Avatar, Progress, Skeleton, Spinner, Separator, Kbd, Breadcrumb, Pagination, Field, Label, ToasterAvatars are circles with body-strong initials on linen. Progress is a 4px ink bar on a stone track, never ember. Skeletons are linen shapes and the spinner is a turning arc in the text colour. Separators are 1px hairlines; Kbd is a small paper keycap in mono with an inset bottom rule. Breadcrumbs are muted with the current page in ink. Pagination uses ghost pills with mono page numbers, and the current page is a paper pill with a hairline. Labels are 14px at 500 in ink, help text is muted and errors are danger text. Toasts are paper cards at the bottom right on a soft shadow, with an ink pill action.

The landing page

The landing page is the same in every design; the design decides how it looks. Its sections carry data-slot hooks (listed at the top of src/components/marketing/section-heading.tsx) that globals.css may style. Workshop styles these:

  • hero-backdrop: switched off, so the hero sits on flat parchment.
  • hero, hero-title: text sits left on the column; the headline is 400 in balanced lines and ends in a slow blinking ember caret.
  • hero-eyebrow: a linen pill in mono 12px with body-strong text.
  • hero-actions: left-aligned, and the outline button becomes a linen pill, so the pair reads ink and linen.
  • hero-note: mono 12px metadata.
  • hero-visual: a landscape painted in CSS (hazy sky, cream peak, rose cliffs, umber shore, mauve lake, warm horizon light, faint grain), inset to the page gutter, with the window floating on it.
  • product-preview-bar: a bone title bar with an inset rule, grey dots and a short title stub.
  • section-heading, section-title: heads sit left like a notebook page, and titles whisper at 400 in balanced lines.
  • section-eyebrow: ember mono caps that open on a still ember caret, the hero's caret at rest.
  • section: no rules between sections; how it works is the one bone band, and soft bands lose their lines.
  • logo-cloud, logo: one row of linen tiles cut at 4px, 72px tall, with the wordmark in body colour.
  • feature-icon, step-marker: small paper keycaps with a hairline and an inset bottom rule; icons are thin ash lines and step numbers are mono ink.
  • stat, stat-value: mono caps labels over 400 figures with tabular numbers.
  • testimonial: the quote a size up in ink, the name at 500.
  • showcase-visual: each picture sits on its own smaller painting, mirrored on even rows, with the outer card on paper and the lift shadow.
  • cta-panel: the same painting at night, with an ember glow under the buttons and a linen second button.
  • site-header, site-nav, brand: 56px, ink brand, ink-toned nav centred between the brand and the actions; a hairline fades in once the page scrolls.
  • site-footer: on the canvas, not a band, with mono column titles in muted.

Everything else is type, space and the kit.

Signed-in screens

The dashboard is parchment with a bone sidebar, bone cards cut at 4px with no shadow, 22px weight 400 page titles and mono caps table heads. Sign-in is one bone card centred on parchment with paper fields, an ink pill and ember text links, and no painting.

Do and don't

Do

  • Set every heading at weight 400 and let tracking tighten with size.
  • Make every button a pill and cut everything else at 4px. Windows and dialogs get 8px.
  • Keep ember for text and thin marks: links, eyebrows, the focus ring, the carets, an unread dot.
  • Put product pictures on a painted stage and float them on the lift shadow.
  • Pair one ink pill with one linen pill in an action group, with one primary per view.
  • Set eyebrows, table heads, ids, file names, shortcuts and counts in Red Hat Mono.
  • Layer bone cards on parchment with the 10% ink hairline before reaching for a shadow.
  • Use tabular numbers for stats, prices, tables and counts.

Don't

  • Don't use pure white or pure black. Paper #fcfcf9 is the lightest colour and ink #26251e the darkest in light.
  • Don't set a heading, title, label or button past weight 500. Only strong text in long prose goes bolder.
  • Don't fill anything with ember: no ember buttons, bands, icon fills or big badge backs.
  • Don't add gradients, glows or washes outside the three painted stages. The kit is flat.
  • Don't round cards, fields, tiles, menus or stages past 4px, and don't make a card a pill.
  • Don't tint icons. Icons are thin lines in muted or ink.
  • Don't put muted text or ember words on linen. Use body or body-strong there.
  • Don't tint shadows cool or give a resting card a shadow.

Working in this design

Pasting from shadcn/ui. The token layer carries shadcn's variable names, so most snippets render unmodified. Two utility names mean something else here: bg-muted becomes bg-surface-card, and bg-accent / text-accent-foreground (a hover surface upstream) become bg-surface-card / text-ink. Here muted is a text colour and accent is the saturated accent.

Adding a token. Add it to all three palette blocks in globals.css (light, the dark media query, .dark), map it in @theme inline, and document it in the palette table above. Check contrast in both modes.

Adding a component. Check the kit first: most needs are a variant of Button, Card or Badge, or a composition on the page. A new component gets its own file in src/components/ui/, token classes only, a data-slot, and a row in the Components table here. The designer subagent owns this.

Build a repo in Workshop

The builder opens with Workshop picked. Pick your batteries and the design is applied to every template before the zip is built.