Loomio DS

preview/nodes →preview/loomiohome

Visual reference for every token in app/globals.css. Single source of truth — what renders here is what the rest of the app gets.

Active DS
Loomio (default)
Theme

Click a variant — it applies to the whole app and persists across pages. To add a new DS: declare :root[data-ds="slug"] in globals.css + add an entry to DS_VARIANTS here.

What you're looking at

This page IS the Loomio design system — a single browsable reference for every visual decision in the app. It's structured in three layers, top to bottom:

  1. Foundation tokens — colours, type scale, spacing, radii, motion, semantic signals. These cascade through the entire app already; swapping a DS variant (Ember / Ink) changes them everywhere.
  2. Chrome primitives — class-based components the app currently uses (.ui-card, .signal-pill, <Button>). Today's screens are built from these.
  3. Bloom primitives — the new editorial direction (.loomio-glass, .loomio-display, .loomio-btn-accent, …). Opt-in classes. Use them in any screen to bring it into Bloom-feel.

How it rolls out: per-screen migration. We pick a screen (landing first), swap chrome → Bloom, you review the preview, sign off. Repeat for dashboard, editor, auth. No big bang — each step is reversible and one preview URL away.

Surfaces

Layered backgrounds from page (0) to floating panels.

surface-0
page
surface-1
panel
surface-2
raised
surface-3
input
surface-4
bg-node
bg-node-header
canvas-bg

Text

Five tiers of foreground colour. Use `var(--text-*)` directly.

text-primaryThe quick brown fox jumps
text-secondaryThe quick brown fox jumps
text-mutedThe quick brown fox jumps
text-placeholderThe quick brown fox jumps
text-inverseThe quick brown fox jumps

Borders

Four chrome borders + three node-specific.

border-subtle
border
border-strong
border-muted
border-node
border-node-hover
border-node-sel

Brand & accents

Greens carry continuity from Canvas. Six accents for node categories and emphasis.

brand-green-neon
accent
brand-green-mid
brand-green-dark
brand-blue
brand-cyan
brand-pink
brand-orange
brand-amber

Node categories

Each node type gets a coloured accent strip + signal-rail on the canvas.

default
--brand-green-neon
ai / llm
--node-accent-ai
image
--node-accent-image
video
--node-accent-video
3d
--node-accent-3d
tools
--node-accent-tools
html
--node-accent-html
design
--node-accent-design
export
--node-accent-export

Type scale

Geist for body/UI, Geist Mono for code/meta, Instrument Serif italic for editorial accents.

--text-2xsLoomio · the canvas
--text-xsLoomio · the canvas
--text-smLoomio · the canvas
--text-mdLoomio · the canvas
--text-baseLoomio · the canvas
--text-lgLoomio · the canvas
--text-xlLoomio · the canvas
--text-2xlLoomio · the canvas
--text-3xlLoomio · the canvas
--text-4xlLoomio · the canvas
--text-5xlLoomio · the canvas
--text-displayLoomio · the canvas
--text-heroLoomio · the canvas
Instrument Serif — editorial italic
Geist Mono — UPPERCASE LABELS · 12px · tracking-wide

Spacing

Tailwind-aligned scale. Use Tailwind classes (p-2, gap-3) by default; reach for var(--space-N) inside inline style or CSS.

--space-px
--space-0_5
--space-1
--space-1_5
--space-2
--space-2_5
--space-3
--space-4
--space-5
--space-6
--space-8
--space-10
--space-12
--space-16
--space-20
--space-24

Radii

Canonical card/button radius is --radius-lg (8px). Pill for chips.

--radius-sm
--radius-md
--radius-lg
--radius-xl
--radius-2xl
--radius-pill

Motion

Durations + easings. Hover the bars to feel each curve.

Durations
--duration-instant
--duration-fast
--duration-normal
--duration-slow
--duration-slower
Easings (220ms each — hover)
--ease-linear
--ease-out
--ease-in
--ease-in-out
--ease-spring

Signal

Semantic feedback. Use for toasts, chips, edge errors — beyond brand green.

success
success
warning
warning-fg
danger
danger-fg
info
info-fg

Buttons (UI primitive)

The shared <Button> component — five variants × three sizes. For Bloom-flavour pill buttons see the next section.

sm
md
lg
Bloom primitives

The new direction

Editorial-italic accents, drifting orbs, liquid glass, pill buttons, pulsing status dots. Each piece below is an opt-in CSS class in app/globals.css — sprinkle into any screen.

Typography roles

.loomio-{display, italic, eyebrow, body, mono} — semantic vocabulary, not raw sizes.

.loomio-display
Tools that bloom with you
.loomio-eyebrow
The studio · v2.0
.loomio-body

Loomio reads as editorial software — a slightly larger body, generous leading, and the occasional italic flourish where a wordmark or accent earns it. Reads like Bloom; works like a tool.

.loomio-mono
01 · canvas: 1920×1080 · nodes: 4 · ms: 312

Bloom buttons

.loomio-btn / -btn-solid / -btn-accent. Pill-shaped CTAs with glow on accent.

Bloom input

.loomio-input — soft glass field with brand-green focus ring.

Tags + status dot

.loomio-tag with -coral / -teal / -active variants. .loomio-dot pulses.

defaultdraftstablelive
running · 312ms

Liquid glass

.loomio-glass — backdrop-blur 28px + saturate 160%. -active variant adds brand-green inner glow.

idle
.loomio-glass

Floating glass card. Reads against orbs in the background.

active
.loomio-glass-active

Same backdrop, plus brand-green inner glow + halo for emphasis state.

Canvas (editor) — truthful mock

Mirror of the real /editor: top-bar with project label + RUN FLOW, vertical icon rail, three nodes with real form fields, NeonEdge connectors, bottom zoom toolbar. The DS preview shouldn't lie about what production looks like.

Loomio
fintech-hero4 / 3
FRT FIGMA
Prompt
BRIEF
On-brand hero · fintech · italic display accents
Any LLM
PROVIDER
Anthropic
MODEL
Claude Sonnet 4
TEMP
0.7
THINKING
Streaming · 2.1s · 412 tokens
HTML · 1080×1080
RATIO
1:1
DS
FRT Figma
PREVIEW
FRT · pricing
Modern, playful
platform.
starter
$12
pro
$39
team
$99
100%
+

Dashboard — truthful mock

Mirror of the real /dashboard: 'Projects' heading + inline usage stats, templates row with category icons and tags, project cards with mini 3-node snapshots + optional DS chip + relative time.

ruben.gasparovi@gmail.com
Projects
Spend
$0.33
Tokens
21.3K
Runs
28
Success
96%
START FROM A TEMPLATE
ALL
BRAND 2
IMAGE 4
RESEARCH 1
2 NODES
On-brand social card
Prompt → HTML Generator. Fastest way to ship a 1080×1080 that respects your DS.
HTMLdesign-system1-click
3 NODES
LLM-written image prompt
Brief → Claude writes the photo prompt → FLUX renders. Richer than you can dictate.
FLUXClaudechained
3 NODES
Recreate a screenshot in HTML
Drop an image, write what to keep, get an on-brand HTML rebuild.
HTMLreferencestrict
YOUR PROJECTS · 18
+
NEW CANVAS
0
fintech-hero
about 3 hours ago
1
FRT FIGMA
YERUBIAN · armenian
Sweet n' sour,
my type of flavor.
@yerubian
Yerubian
2 days ago
1
FUNDERS.VC
FUNDERS · investor deck
10K+ pitches analyzed
94%
Success
2min
Avg time
8x
Faster
Funders.vc
11 days ago

Truthful integration: the dashboard mock now matches what users see in production — inline usage stats, templates row with category icons + tags, project cards with mini-canvas snapshots and DS chips. Migration replaces inline styles with .ui-card + Bloom typography + tag/dot primitives.

Components

Class-based primitives from globals.css. Reuse before inventing.

.signal-pill / .ui-chip
ACTIVE
4 NODES · 6 EDGES
readme.md
v2.1.0
.ui-card
Card title
Hover for the lift transition.
.glass-card (backdrop-blur)
Glass
Used for floating toolbars / control bars over the canvas.

Coverage

What a DS swap actually controls. Full = override the listed tokens and the whole surface flips. Partial / manual = some sites still bake values inline.

Brand palette (greens + 6 accents)
full
hex + RGB tuples, --brand-*
Node category accents (8 types)
full
--node-accent-{ai,image,video,3d,tools,html,design,export}
Signal colours (success/warning/danger/info)
full
--signal-* incl. bg/border/fg variants
Surfaces (5 levels) + theme variants
full
--surface-*, --bg-*
Text tiers (5)
full
--text-* incl. light-theme overrides
Borders + radii
full
--border-*, --radius-*
Type scale + tracking + leading
full
--text-2xs..--text-hero, --tracking-*, --leading-*
Motion (durations + easings)
full
--duration-*, --ease-*
Button primitive (5 variants × hover)
full
--button-{variant}-{bg,fg,border,bg-hover}
Modal accent gradient
full
--modal-accent-gradient
Edges (canvas wires)
full
--edge-*
Structural neutrals (white / black)
full
--white, --black + RGB tuples; alpha variants via rgb(var(--*-rgb) / a)
Inline `style={...}` colours
full
brand + 13 accents + white/black swept; no literal hex remains in JSX
rgba(R, G, B, a) alphas
full
brand + node accents + white/black/text rgba swept to rgb(var / a)
Type sizes in components (text-[Npx])
full
9/10/11/12/13/14/16/18px swept to --text-* vars (6 outliers left)
Spacing rhythm in components
full
Tailwind p-N/m-N aligns 1:1 with --space-N; both produce identical px values
Misc theme-coupled grays (#eee, #94A3B8 etc.)
manual
a handful of one-off shades remain hard-coded; sweep when a DS needs them
Tokens live in app/globals.css. Edit there; this page reflects automatically.