Ciaren

Design System

Design System

Ciaren uses a purple-based, minimalist visual language. This page is the single source of truth for colour, type, spacing, motion and component style — the web app and this documentation site share the same palette.

This page is the single source of truth for the Ciaren visual language. The web app (frontend/) and this documentation site share the same purple palette. Token references point at the live implementation in frontend/src/.

For contributors: tokens live in frontend/src/index.css as CSS variables and are exposed to Tailwind in frontend/tailwind.config.js. Never hard-code hex values in components — use the semantic token (bg-primary, text-muted-foreground, border-border, bg-brand-50, …).

Brand palette (purple)

The brand ramp is a single violet hue stepped from tint to shade. Use brand-600 as the canonical brand colour (it is also --primary).

TokenHSLUse
brand-50270 70% 98%page tints, hover wash
brand-100269 70% 95%subtle fills, chips
brand-200268 72% 90%borders on tinted cards, canvas dots
brand-300266 74% 82%muted accents
brand-400264 78% 71%gradients, secondary accents
brand-500262 83% 62%hover state of primary
brand-600262 83% 58%primary / brand
brand-700263 70% 50%pressed primary, links
brand-800263 67% 41%headings on tint
brand-900264 60% 33%deepest shade

Semantic tokens

TokenLightMeaning
background270 40% 99%app background (faint purple white)
foreground265 32% 12%primary text
card0 0% 100%raised surfaces
primary262 83% 58%brand actions, focus ring
secondary270 30% 96%secondary buttons / fills
muted / muted-foreground270 28% 96% / 264 12% 46%subdued surfaces & text
accent / accent-foreground266 85% 96% / 262 72% 42%hover/selected wash
border270 24% 91%hairlines
ring262 83% 58%focus outline

Status colours

TokenHSLUse
success160 70% 40%succeeded runs, valid state
warning38 92% 50%drift, outdated version pins
info215 85% 56%running / informational
destructive351 75% 53%failed runs, delete, errors

A dark theme is defined under .dark (enable via the class strategy) using the same token names, so components need no changes to support it.

Flow node categories

Nodes stay distinguishable on the canvas while harmonising with the brand. Each category has a badge / card / ring / text / dot theme in frontend/src/lib/nodeVisuals.ts. There are 9 categories, 80 nodes total (66 transformation nodes, including the 8 chart nodes, plus 8 input and 6 output file/SQL/storage nodes):

CategoryHueExample nodes
InputsemeraldFile Input, SQL Input, Storage Input
Cleaningskydrop/fill nulls, remove duplicates, filter rows, sort rows
Columnsindigorename, select, drop, split, map values, string transform
Reshapevioletgroup by, join, pivot/unpivot, concat rows
Analyticsfuchsiacalculated column, window function, bin column, parse dates
Data Qualityorangeassert not-null/unique/range/expression/row-count
Chartsrosebar, line, area, scatter, pie, histogram, box plot, correlation heatmap
Machine Learningpurpletrain/predict/evaluate, feature engineering, cross-validate
OutputsamberFile Output, SQL Output, Storage Output

Typography

  • Family: system UI stack (ui-sans-serif, system-ui, "Segoe UI", Roboto).
  • Headings: semibold, tight tracking. Page titles text-xl/text-2xl.
  • Body: text-sm is the default density; secondary text uses text-muted-foreground.
  • Numerals/code: monospace only for code export and column/type chips.

Radius, elevation, spacing

  • Radius: --radius: 0.65rem (rounded-lg/md/sm derive from it). Cards and panels use rounded-xl; chips use rounded-md.
  • Elevation: prefer hairline borders + shadow-sm; reserve shadow-md for hover and floating surfaces (dialogs, dropdowns, drag ghosts).
  • Spacing: 4-pt scale. Panel padding p-4/p-5; gaps gap-2/gap-3.

Motion

Small and quick — never distracting. Keyframes in tailwind.config.js:

ClassDurationUse
animate-fade-in180mscontent swaps
animate-fade-in-up220mscards/rows entering
animate-slide-in-right200msside panels
animate-scale-in140mspopovers, menus

Respect prefers-reduced-motion; keep transitions ≤ 250ms.

Gradients

brand-gradient (135° brand-600 → fuchsia) for hero chrome, and brand-text-gradient for the wordmark. Use sparingly — one hero accent per view.