BBuildspace UI

Design System

Ink & Paper — the full design.md reference behind every item in this registry.

Download design.md

Overview

BuildSpace should feel like a real product company with taste, not a generic SaaS kit and not a chaotic experimental playground. The design system in the reference page calls this balance out clearly: dense product UI stays composed and readable, while brand expression lives in a few deliberate devices such as stickers, tape dividers, serif italics, pastel accents, and 3D shapes.

The core principle is "ink & paper": sober, editorial restraint (the ink) carrying a few deliberate expressive flourishes (the paper's texture). We keep the information architecture sober and fast to scan, then add personality at the edges. Headlines can be dramatic. Status labels can tilt. Empty states can use shapes. Tables, forms, sidebars, and navigation should not look noisy.

This file is the source of truth for BuildSpace design direction. The implemented tokens live in packages/ui/src/styles/globals.css; when this document and the CSS disagree, treat this document as intent and fix the CSS.

Colors

The palette is built from a warm off-white canvas, near-black ink, and six soft pastel families. The canvas does most of the heavy lifting. Pastels are for emphasis, grouping, and tone, not for turning the whole product into candy.

Color usage should follow the density of the UI:

Card and accent discipline

The fun in this system comes from contrast, not from tinting everything. The marketing pages work because pastels are scarce and deliberate: white/paper card faces with ink borders and offset shadows, pastels as full-bleed section bands or small varied accents. Product UI must follow the same physics.

Typography

Typography is one of the most important brand signals in the system.

Rules for use:

Layout

Layout should create calm before it creates flair. The page examples consistently use generous spacing, straight cards, and clear section boundaries.

A useful mental model is: the scaffolding is quiet, the accents are loud.

Elevation & Depth

Depth in BuildSpace should feel like a physical sticker or printed card sitting on paper.

The product should never feel neumorphic, translucent, or over-animated.

Shapes

3D shapes are part of the identity, but they are not general-purpose decoration. The reference page is explicit here: shapes are for mood.

The same restraint applies to annotations. Short mono annotations can add voice in editorial sections, but dense app screens should stay clean.

Components

The system breaks cleanly into expressive accents and composed product primitives.

Expressive components:

Composed product primitives:

Recommended composition patterns from the reference page:

Do's and Don'ts

Semantic tokens (shadcn mapping)

The shadcn semantic variables in packages/ui/src/styles/globals.css map to this palette:

Dark mode maps the same variables to the colors-dark palette above: ink foundations, paper-tone foreground, unchanged pastel accents.

Dark mode

Dark mode is a paper/ink swap, not a dimmed version of light mode. The brand's dark pole is already defined by the marketing pages — the ink #121212 used for CTAs, borders, code blocks, and offset shadows is neutral near-black, never brown. Dark mode adopts that ink as the canvas. Do not build dark surfaces by darkening the warm paper tones; that produces brown-charcoal (#211e1b-style) foundations that read muddy and rob the pastels of their pop.

Accessibility

Raw design tokens (YAML frontmatter)
version: "alpha"
name: "BuildSpace"
description: "Ink & Paper: editorial serif headlines, composed product UI, pastel accents, sticker-lift shadows, and tilts reserved for expressive moments."
colors:
  primary: "#121212"
  on-primary: "#FBF9F7"
  background: "#FBF9F7"
  background-2: "#F3F1ED"
  surface: "#FFFFFF"
  text: "#121212"
  text-strong: "#262626"
  text-muted: "#666666"
  text-subtle: "#8C8C8C"
  border: "#E0E0E0"
  border-strong: "#D1D1D1"
  lilac-bg: "#EFDCF9"
  lilac-icon: "#E2BEF4"
  lilac-text: "#773399"
  lilac-dot: "#B152E0"
  peach-bg: "#FCEBD9"
  peach-icon: "#F8D1AA"
  peach-text: "#A35C29"
  peach-dot: "#EE8C2B"
  mint-bg: "#D1F0DC"
  mint-icon: "#ABE3BF"
  mint-text: "#267342"
  mint-dot: "#24DB67"
  sky-bg: "#D4F1F7"
  sky-icon: "#A8E4F0"
  sky-text: "#266673"
  sky-dot: "#67CFE4"
  butter-bg: "#FCF3C5"
  butter-icon: "#F9E586"
  butter-text: "#8F6B24"
  butter-dot: "#F7E06E"
  rose-bg: "#FADBE6"
  rose-icon: "#F4AFC6"
  rose-text: "#A32952"
  rose-dot: "#EC799F"
colors-dark:
  background: "#121212"
  background-2: "#1A1A1A"
  surface: "#1E1E1E"
  surface-raised: "#242424"
  text: "#F7F2EB"
  text-strong: "#FBF9F7"
  text-muted: "#A8A29A"
  text-subtle: "#7A756E"
  border: "#2E2E2E"
  border-strong: "#3D3D3D"
  primary: "#F7F2EB"
  on-primary: "#121212"
typography:
  display:
    fontFamily: "DM Serif Display"
    fontSize: "4.5rem"
    fontWeight: 400
    lineHeight: 0.95
    letterSpacing: "-0.03em"
  h1:
    fontFamily: "DM Serif Display"
    fontSize: "2.75rem"
    fontWeight: 400
    lineHeight: 1
    letterSpacing: "-0.02em"
  h2:
    fontFamily: "DM Serif Display"
    fontSize: "2rem"
    fontWeight: 400
    lineHeight: 1
    letterSpacing: "-0.02em"
  h3:
    fontFamily: "DM Serif Display"
    fontSize: "1.375rem"
    fontWeight: 400
    lineHeight: 1.15
    letterSpacing: "-0.02em"
  body:
    fontFamily: "DM Sans"
    fontSize: "0.9375rem"
    fontWeight: 400
    lineHeight: 1.55
  body-lg:
    fontFamily: "DM Sans"
    fontSize: "1rem"
    fontWeight: 400
    lineHeight: 1.55
  label:
    fontFamily: "DM Sans"
    fontSize: "0.875rem"
    fontWeight: 500
    lineHeight: 1.4
  caption:
    fontFamily: "DM Sans"
    fontSize: "0.8125rem"
    fontWeight: 400
    lineHeight: 1.45
  mono:
    fontFamily: "JetBrains Mono"
    fontSize: "0.6875rem"
    fontWeight: 500
    lineHeight: 1.4
    letterSpacing: "0.08em"
rounded:
  xs: "6px"
  sm: "10px"
  md: "14px"
  lg: "20px"
  xl: "28px"
  pill: "999px"
spacing:
  1: "4px"
  2: "8px"
  3: "12px"
  4: "16px"
  5: "20px"
  6: "24px"
  7: "32px"
  8: "40px"
  9: "56px"
  10: "72px"
components:
  sticker:
    backgroundColor: "{colors.butter-bg}"
    textColor: "{colors.butter-text}"
    typography: "{typography.mono}"
    rounded: "{rounded.pill}"
    padding: "4px 12px"
  chip:
    backgroundColor: "{colors.surface}"
    textColor: "{colors.text-strong}"
    typography: "{typography.caption}"
    rounded: "{rounded.pill}"
    padding: "4px 10px"
  button-primary:
    backgroundColor: "{colors.primary}"
    textColor: "{colors.on-primary}"
    typography: "{typography.label}"
    rounded: "{rounded.pill}"
    padding: "10px 18px"
  button-secondary:
    backgroundColor: "{colors.surface}"
    textColor: "{colors.text}"
    typography: "{typography.label}"
    rounded: "{rounded.pill}"
    padding: "10px 18px"
  button-accent:
    backgroundColor: "{colors.peach-bg}"
    textColor: "{colors.text}"
    typography: "{typography.label}"
    rounded: "{rounded.pill}"
    padding: "10px 18px"
  button-ghost:
    backgroundColor: "{colors.background}"
    textColor: "{colors.text-strong}"
    typography: "{typography.label}"
    rounded: "{rounded.pill}"
    padding: "10px 18px"
  input:
    backgroundColor: "{colors.surface}"
    textColor: "{colors.text}"
    typography: "{typography.body}"
    rounded: "{rounded.sm}"
    padding: "10px 14px"
  card:
    backgroundColor: "{colors.surface}"
    textColor: "{colors.text}"
    borderColor: "{colors.primary}"
    rounded: "{rounded.lg}"
    padding: "{spacing.6}"
  card-callout:
    backgroundColor: "{colors.mint-bg}"
    textColor: "{colors.text}"
    borderColor: "{colors.primary}"
    rounded: "{rounded.lg}"
    padding: "{spacing.6}"
  code-block:
    backgroundColor: "{colors.primary}"
    textColor: "{colors.on-primary}"
    typography: "{typography.mono}"
    rounded: "{rounded.md}"
    padding: "{spacing.4}"
  tabs:
    backgroundColor: "{colors.background-2}"
    textColor: "{colors.text-strong}"
    typography: "{typography.caption}"
    rounded: "{rounded.pill}"
    padding: "4px"
  table:
    backgroundColor: "{colors.surface}"
    textColor: "{colors.text}"
    typography: "{typography.body}"
    rounded: "{rounded.md}"
  empty-state:
    backgroundColor: "{colors.background}"
    textColor: "{colors.text}"
    rounded: "{rounded.lg}"
    padding: "{spacing.8}"