Themes & design tokens
Every Canyon app consumes a three-tier design-token hierarchy. Primitives define raw values. Semantic references express intent. Component tokens apply overrides. Tokens are W3C DTCG-compliant, so they round-trip through Figma and your design pipeline without translation.
Token hierarchy
The three-tier model makes brand changes predictable. Swap a primitive, the semantic layer re-resolves, and every component that references it picks up the new value at build time. The format is W3C DTCG, so tokens round-trip cleanly through Figma, your design pipeline and any compliant tool.
primitivescolor, dimension, fontWeight, and so on.semanticcolor.background.default or color.primary.default. Never a raw value — always a reference.componentsbutton.primary.background, card.borderRadius, input.borderColor.Compilation
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ DESIGN TOKEN HIERARCHY (W3C DTCG) │
│ ═══════════════════════════════════════════════════════════════════════════════════════│
│ │
│ THEME STRUCTURE (each theme) │
│ ───────────────────────────────────────────────────────────────────────────── │
│ │
│ ┌─────────────────────┐ │
│ │ primitives │ Raw values (colors, spacing, radii) │
│ │ ───────────────── │ color.neutral.500: "#6b7280" │
│ │ │ spacing.4: "1rem" │
│ └──────────┬──────────┘ borderRadius.md: "0.375rem" │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ semantic │ Purpose-driven references │
│ │ ───────────────── │ color.background.default: "{color.white}" │
│ │ │ color.primary.default: "{color.indigo.500}" │
│ └──────────┬──────────┘ color.destructive.default: "{color.red.500}" │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ components │ Component-specific tokens │
│ │ ───────────────── │ button.primary.background: "{color.primary.default}" │
│ │ │ card.borderRadius: "{borderRadius.component.card}" │
│ └─────────────────────┘ input.borderColor: "{color.border.input}" │
│ │
│ COMPILED OUTPUT │
│ ───────────────────────────────────────────────────────────────────────────── │
│ │
│ primitives ─┐ │
│ semantic ─┼──► CSS custom properties (per theme) │
│ components ─┘──► JSON exports (consumed by agents and tooling) │
└─────────────────────────────────────────────────────────────────────────────────────────┘Included themes
Canyon ships with a set of first-party themes covering the dominant UI archetypes. Use one as-is, fork one, or bring your own — all three paths produce the same artefact.
Your own theme
There are three paths. All three produce the same artefact: a validated theme the platform auto-discovers.
1. Manual
- Define your primitives (colours, spacing, radii).
- Define semantic references (background, primary, destructive, …).
- Add any component-level overrides.
- Register the theme. It is available to every project in your organisation.
2. Figma import
- Export design tokens from Figma (Tokens Studio plugin or an equivalent W3C DTCG exporter).
- Upload the JSON to the themes endpoint; Canyon validates it and compiles a theme from it.
- Theme is available immediately.
3. AI-assisted generationAlpha
- Describe your brand in natural language (“Modern fintech, trustworthy blue, clean”).
- Canyon proposes a palette and semantic mappings.
- Review, refine, and export as a named theme.