Chromatic

Forces, intentions, palette tables, harmony laws

Chromatic Design System

A universal vibrational design system for Next.js applications based on Edwin Babbitt's Principles of Light and Color (1878) and Besant/Leadbeater's Thought-Forms (1901).

Use this to generate design tokens, Tailwind configs, and component themes for ANY application.


The Three Laws of Thought-Forms

Every design element is a "thought-form" - a visible manifestation of intention. Three principles govern their creation:

LawDeterminesApplication
Quality of thoughtCOLORUser's emotional/intentional state → chromatic palette
Nature of thoughtFORMType of action/content → shape language
Definiteness of thoughtCLARITYConfidence/certainty → outline sharpness, contrast

Part 1: Chromatic Color Science

CRITICAL: What "Chromatic" Actually Means

CHROMATIC ≠ Bright saturated colors

CHROMATIC = Gradation with hue-tinted grays (8-20% saturation)

The scientific color system uses subtle gray-tinted colors, not vivid saturated ones. This creates visual harmony and psychological calm.

// ❌ WRONG - This is NOT chromatic (too saturated)
const wrongBlue = "hsl(210, 80%, 50%)"

// ✅ CORRECT - This IS chromatic (gray-tinted)
const chromaticBlue = "hsl(210, 12%, 50%)"

Achromatic vs Chromatic

TypeDefinitionSaturationUse Case
AchromaticNo hue (black, white, gray)0%Neutral UI, text, borders
Chromatic GrayGray tinted with a hue8-20%Themed surfaces, accents

Part 2: The Three Forces

From Babbitt's spectrum analysis, all colors carry one of three fundamental forces:

Force Classification

ForceHue RangeQualityPhysiologicalMentalUse In UI
THERMALRed (0-30°)Heat, expansion, actionBlood-animating, warmingPassion, will, urgencyCTAs, alerts, energy
LUMINOUSYellow (40-60°)Light, clarity, balanceNerve-animatingIntellect, perceptionHighlights, focus states
ELECTRICALBlue-Violet (200-280°)Cold, contraction, calmNerve-soothing, coolingIntuition, spiritualityBackgrounds, trust, calm
NEUTRALGreen (90-150°)Balance, synthesisHarmonizingAdaptability, growthSuccess, nature, health

Part 3: Intention → Color Mapping

Primary Intentions

Map your app's purpose or user's emotional state to a chromatic palette:

export type DesignIntention =
  // THERMAL (action-oriented)
  | "urgency"      // Red-gray: alerts, errors, critical actions
  | "energy"       // Orange-gray: activation, enthusiasm, CTAs
  | "warmth"       // Amber-gray: comfort, hospitality, welcome
  
  // LUMINOUS (clarity-oriented)
  | "clarity"      // Yellow-gray: understanding, learning, focus
  | "optimism"     // Gold-gray: positivity, success, achievement
  
  // NEUTRAL (balance-oriented)
  | "growth"       // Green-gray: progress, health, nature
  | "harmony"      // Teal-gray: balance, wellness, equilibrium
  
  // ELECTRICAL (calm-oriented)
  | "trust"        // Blue-gray: reliability, professionalism, calm
  | "calm"         // Indigo-gray: peace, meditation, depth
  | "spirit"       // Violet-gray: creativity, luxury, transcendence
  
  // ACHROMATIC (neutral)
  | "neutral"      // Pure grays: minimal, professional, universal

Thought-Form Color Meanings

From Besant/Leadbeater's observations of actual thought emanations:

ColorPositive ExpressionShadow Expression
Rose/PinkAffection, love, careSelfish attachment
CrimsonStrong love, passionSensuality without love
OrangeAmbition, pride, achievementArrogance, conceit
YellowIntellect, understanding, wisdomCunning without wisdom
GreenSympathy, adaptability, healingJealousy (brownish-green)
BlueDevotion, loyalty, trustFanaticism (dark muddy blue)
VioletSpiritual aspiration, nobilitySpiritual pride
GrayDepression, fearMelancholy
BrownSelfishness, greedAvarice
BlackHatred, malice—

Avoiding Shadow Colors

Certain color combinations create "muddy" thought-forms. Avoid:

AvoidWhyInstead Use
Brownish-greenJealousy, deceitPure sage green-gray
Muddy red-brownAnger + selfishnessClear rose or crimson
Gray-greenDepression + jealousyEither pure gray or pure green
Murky orangePride corrupted by selfishnessClear amber-gray

Part 4: The Complete Chromatic Palette

HSL Values for All Chromatic Grays

export const CHROMATIC_PALETTE = {
  // ═══════════════════════════════════════════════════════════
  // ACHROMATIC (No hue - 0% saturation)
  // ═══════════════════════════════════════════════════════════
  achromatic: {
    50:  "hsl(0, 0%, 98%)",   // near-white
    100: "hsl(0, 0%, 96%)",
    200: "hsl(0, 0%, 90%)",
    300: "hsl(0, 0%, 80%)",
    400: "hsl(0, 0%, 65%)",
    500: "hsl(0, 0%, 50%)",   // normal gray - harmonizes with everything
    600: "hsl(0, 0%, 40%)",
    700: "hsl(0, 0%, 30%)",
    800: "hsl(0, 0%, 20%)",
    900: "hsl(0, 0%, 12%)",
    950: "hsl(0, 0%, 6%)",    // near-black
  },

  // ═══════════════════════════════════════════════════════════
  // THERMAL FORCE - Red/Orange (0-40°)
  // ═══════════════════════════════════════════════════════════
  
  // Red-Gray (Russet) - Urgency, passion, grounding
  redGray: {
    50:  "hsl(10, 12%, 97%)",
    100: "hsl(10, 12%, 93%)",
    200: "hsl(10, 12%, 85%)",
    300: "hsl(10, 14%, 72%)",
    400: "hsl(10, 14%, 58%)",
    500: "hsl(10, 16%, 48%)",  // primary
    600: "hsl(10, 16%, 40%)",
    700: "hsl(10, 18%, 32%)",
    800: "hsl(10, 18%, 24%)",
    900: "hsl(10, 20%, 16%)",
    950: "hsl(10, 20%, 10%)",
  },

  // Orange-Gray (Amber/Brown) - Energy, warmth, enthusiasm
  orangeGray: {
    50:  "hsl(30, 14%, 97%)",
    100: "hsl(30, 14%, 92%)",
    200: "hsl(30, 14%, 84%)",
    300: "hsl(30, 16%, 70%)",
    400: "hsl(30, 16%, 56%)",
    500: "hsl(30, 18%, 46%)",  // primary
    600: "hsl(30, 18%, 38%)",
    700: "hsl(30, 20%, 30%)",
    800: "hsl(30, 20%, 22%)",
    900: "hsl(30, 22%, 15%)",
    950: "hsl(30, 22%, 9%)",
  },

  // ═══════════════════════════════════════════════════════════
  // LUMINOUS FORCE - Yellow (45-60°)
  // ═══════════════════════════════════════════════════════════
  
  // Yellow-Gray (Citrine) - Clarity, intellect, optimism
  yellowGray: {
    50:  "hsl(50, 14%, 97%)",
    100: "hsl(50, 14%, 93%)",
    200: "hsl(50, 14%, 86%)",
    300: "hsl(50, 16%, 74%)",
    400: "hsl(50, 16%, 60%)",
    500: "hsl(50, 18%, 50%)",  // primary
    600: "hsl(50, 18%, 42%)",
    700: "hsl(50, 20%, 34%)",
    800: "hsl(50, 20%, 26%)",
    900: "hsl(50, 22%, 18%)",
    950: "hsl(50, 22%, 10%)",
  },

  // ═══════════════════════════════════════════════════════════
  // NEUTRAL FORCE - Green (90-160°)
  // ═══════════════════════════════════════════════════════════
  
  // Green-Gray (Sage) - Growth, balance, harmony
  greenGray: {
    50:  "hsl(120, 8%, 97%)",
    100: "hsl(120, 8%, 93%)",
    200: "hsl(120, 8%, 85%)",
    300: "hsl(120, 10%, 72%)",
    400: "hsl(120, 10%, 58%)",
    500: "hsl(120, 12%, 48%)",  // primary
    600: "hsl(120, 12%, 40%)",
    700: "hsl(120, 14%, 32%)",
    800: "hsl(120, 14%, 24%)",
    900: "hsl(120, 16%, 16%)",
    950: "hsl(120, 16%, 9%)",
  },

  // Teal-Gray - Balance, wellness, equilibrium
  tealGray: {
    50:  "hsl(170, 10%, 97%)",
    100: "hsl(170, 10%, 93%)",
    200: "hsl(170, 10%, 85%)",
    300: "hsl(170, 12%, 72%)",
    400: "hsl(170, 12%, 58%)",
    500: "hsl(170, 14%, 48%)",  // primary
    600: "hsl(170, 14%, 40%)",
    700: "hsl(170, 16%, 32%)",
    800: "hsl(170, 16%, 24%)",
    900: "hsl(170, 18%, 16%)",
    950: "hsl(170, 18%, 9%)",
  },

  // ═══════════════════════════════════════════════════════════
  // ELECTRICAL FORCE - Blue/Violet (200-280°)
  // ═══════════════════════════════════════════════════════════
  
  // Blue-Gray (Cool) - Trust, calm, professionalism
  blueGray: {
    50:  "hsl(210, 12%, 97%)",
    100: "hsl(210, 12%, 93%)",
    200: "hsl(210, 12%, 86%)",
    300: "hsl(210, 14%, 72%)",
    400: "hsl(210, 14%, 58%)",
    500: "hsl(210, 16%, 48%)",  // primary
    600: "hsl(210, 16%, 40%)",
    700: "hsl(210, 18%, 32%)",
    800: "hsl(210, 18%, 24%)",
    900: "hsl(210, 20%, 16%)",
    950: "hsl(210, 20%, 10%)",
  },

  // Indigo-Gray - Depth, meditation, intuition
  indigoGray: {
    50:  "hsl(240, 10%, 97%)",
    100: "hsl(240, 10%, 93%)",
    200: "hsl(240, 10%, 86%)",
    300: "hsl(240, 12%, 72%)",
    400: "hsl(240, 12%, 58%)",
    500: "hsl(240, 14%, 48%)",  // primary
    600: "hsl(240, 14%, 40%)",
    700: "hsl(240, 16%, 32%)",
    800: "hsl(240, 16%, 24%)",
    900: "hsl(240, 18%, 16%)",
    950: "hsl(240, 18%, 9%)",
  },

  // Violet-Gray (Mauve) - Creativity, spirit, luxury
  violetGray: {
    50:  "hsl(270, 10%, 97%)",
    100: "hsl(270, 10%, 93%)",
    200: "hsl(270, 10%, 86%)",
    300: "hsl(270, 12%, 72%)",
    400: "hsl(270, 12%, 58%)",
    500: "hsl(270, 14%, 50%)",  // primary
    600: "hsl(270, 14%, 42%)",
    700: "hsl(270, 16%, 34%)",
    800: "hsl(270, 16%, 26%)",
    900: "hsl(270, 18%, 18%)",
    950: "hsl(270, 18%, 10%)",
  },

  // ═══════════════════════════════════════════════════════════
  // THOUGHT-FORM SPECIAL COLORS
  // ═══════════════════════════════════════════════════════════
  
  // Rose-Gray - Affection, care, love (not romantic red)
  roseGray: {
    50:  "hsl(340, 12%, 97%)",
    100: "hsl(340, 12%, 93%)",
    200: "hsl(340, 12%, 86%)",
    300: "hsl(340, 14%, 74%)",
    400: "hsl(340, 14%, 60%)",
    500: "hsl(340, 16%, 52%)",  // primary
    600: "hsl(340, 16%, 44%)",
    700: "hsl(340, 18%, 36%)",
    800: "hsl(340, 18%, 28%)",
    900: "hsl(340, 20%, 20%)",
    950: "hsl(340, 20%, 12%)",
  },
}

Part 5: Generating Design Tokens

The Generator Function

// lib/chromatic-generator.ts

import { CHROMATIC_PALETTE } from "./chromatic-palette"

export type DesignIntention =
  | "urgency" | "energy" | "warmth"           // thermal
  | "clarity" | "optimism"                     // luminous
  | "growth" | "harmony"                       // neutral
  | "trust" | "calm" | "spirit"               // electrical
  | "affection"                                // rose
  | "neutral"                                  // achromatic

export type DesignMode = "light" | "dark"

export interface ChromaticTokens {
  // Semantic colors
  background: string
  foreground: string
  card: string
  cardForeground: string
  primary: string
  primaryForeground: string
  secondary: string
  secondaryForeground: string
  muted: string
  mutedForeground: string
  accent: string
  accentForeground: string
  border: string
  input: string
  ring: string
  
  // State colors (always consistent)
  destructive: string
  destructiveForeground: string
  success: string
  successForeground: string
  warning: string
  warningForeground: string
}

const INTENTION_TO_PALETTE: Record<DesignIntention, keyof typeof CHROMATIC_PALETTE> = {
  urgency: "redGray",
  energy: "orangeGray",
  warmth: "orangeGray",
  clarity: "yellowGray",
  optimism: "yellowGray",
  growth: "greenGray",
  harmony: "tealGray",
  trust: "blueGray",
  calm: "indigoGray",
  spirit: "violetGray",
  affection: "roseGray",
  neutral: "achromatic",
}

export function generateChromaticTokens(
  intention: DesignIntention,
  mode: DesignMode = "dark"
): ChromaticTokens {
  const paletteName = INTENTION_TO_PALETTE[intention]
  const palette = CHROMATIC_PALETTE[paletteName]
  const achromatic = CHROMATIC_PALETTE.achromatic
  
  if (mode === "dark") {
    return {
      background: palette[950],
      foreground: palette[50],
      card: palette[900],
      cardForeground: palette[100],
      primary: palette[400],
      primaryForeground: palette[950],
      secondary: palette[800],
      secondaryForeground: palette[200],
      muted: palette[800],
      mutedForeground: palette[400],
      accent: palette[700],
      accentForeground: palette[100],
      border: palette[700],
      input: palette[800],
      ring: palette[400],
      
      // Semantic states use achromatic + slight tint
      destructive: CHROMATIC_PALETTE.redGray[500],
      destructiveForeground: achromatic[50],
      success: CHROMATIC_PALETTE.greenGray[500],
      successForeground: achromatic[50],
      warning: CHROMATIC_PALETTE.yellowGray[500],
      warningForeground: achromatic[950],
    }
  } else {
    return {
      background: palette[50],
      foreground: palette[950],
      card: achromatic[50],
      cardForeground: palette[900],
      primary: palette[600],
      primaryForeground: palette[50],
      secondary: palette[100],
      secondaryForeground: palette[800],
      muted: palette[100],
      mutedForeground: palette[600],
      accent: palette[200],
      accentForeground: palette[800],
      border: palette[300],
      input: palette[200],
      ring: palette[500],
      
      destructive: CHROMATIC_PALETTE.redGray[600],
      destructiveForeground: achromatic[50],
      success: CHROMATIC_PALETTE.greenGray[600],
      successForeground: achromatic[50],
      warning: CHROMATIC_PALETTE.yellowGray[500],
      warningForeground: achromatic[950],
    }
  }
}

Part 6: Tailwind CSS Integration

Generated CSS Variables

// lib/generate-css.ts

export function generateCSSVariables(
  intention: DesignIntention,
  mode: DesignMode = "dark"
): string {
  const tokens = generateChromaticTokens(intention, mode)
  
  return `
:root {
  --background: ${tokens.background};
  --foreground: ${tokens.foreground};
  --card: ${tokens.card};
  --card-foreground: ${tokens.cardForeground};
  --primary: ${tokens.primary};
  --primary-foreground: ${tokens.primaryForeground};
  --secondary: ${tokens.secondary};
  --secondary-foreground: ${tokens.secondaryForeground};
  --muted: ${tokens.muted};
  --muted-foreground: ${tokens.mutedForeground};
  --accent: ${tokens.accent};
  --accent-foreground: ${tokens.accentForeground};
  --border: ${tokens.border};
  --input: ${tokens.input};
  --ring: ${tokens.ring};
  --destructive: ${tokens.destructive};
  --destructive-foreground: ${tokens.destructiveForeground};
  --success: ${tokens.success};
  --success-foreground: ${tokens.successForeground};
  --warning: ${tokens.warning};
  --warning-foreground: ${tokens.warningForeground};
}
  `.trim()
}

Tailwind Config

// tailwind.config.ts

import type { Config } from "tailwindcss"

const config: Config = {
  darkMode: ["class"],
  content: ["./app/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}"],
  theme: {
    extend: {
      colors: {
        background: "var(--background)",
        foreground: "var(--foreground)",
        card: {
          DEFAULT: "var(--card)",
          foreground: "var(--card-foreground)",
        },
        primary: {
          DEFAULT: "var(--primary)",
          foreground: "var(--primary-foreground)",
        },
        secondary: {
          DEFAULT: "var(--secondary)",
          foreground: "var(--secondary-foreground)",
        },
        muted: {
          DEFAULT: "var(--muted)",
          foreground: "var(--muted-foreground)",
        },
        accent: {
          DEFAULT: "var(--accent)",
          foreground: "var(--accent-foreground)",
        },
        destructive: {
          DEFAULT: "var(--destructive)",
          foreground: "var(--destructive-foreground)",
        },
        success: {
          DEFAULT: "var(--success)",
          foreground: "var(--success-foreground)",
        },
        warning: {
          DEFAULT: "var(--warning)",
          foreground: "var(--warning-foreground)",
        },
        border: "var(--border)",
        input: "var(--input)",
        ring: "var(--ring)",
      },
    },
  },
  plugins: [require("tailwindcss-animate")],
}

export default config

Part 7: Form Language (Nature of Thought → Shape)

Shape Principles from Thought-Forms

The nature of a thought determines its form:

NatureForm CharacteristicCSS/Design Application
Directed intentionPointed, projectile-likeArrow icons, pointed buttons, chevrons
Radiating loveStar-like, outward raysStarburst patterns, radial gradients
Protective careEnclosing, shell-likeCards with rounded corners, containers
Intellectual focusSharp, crystallineGeometric shapes, crisp borders
Spiritual aspirationUpward-reaching, spire-likeTall containers, upward arrows
Vague emotionCloud-like, undefinedBlur effects, soft shadows, gradients
Strong emotionDense, saturated coreSolid fills, high contrast
Weak/uncertainThin, fragmentedDotted lines, low opacity, outlines

Border Radius Scale

export const FORM_RADII = {
  // Definite, intellectual, precise
  sharp: "0px",
  
  // Slightly softened, professional
  subtle: "2px",
  
  // Balanced, approachable
  balanced: "6px",
  
  // Friendly, warm
  soft: "12px",
  
  // Nurturing, protective
  rounded: "20px",
  
  // Spiritual, ethereal
  full: "9999px",
}

Clarity Scale (Definiteness → Outline)

export const CLARITY_LEVELS = {
  // Crystal clear intention - sharp borders, high contrast
  definite: {
    borderWidth: "1px",
    borderOpacity: 1,
    shadowBlur: "0px",
    contrast: "high",
  },
  
  // Mostly clear - slight softness
  clear: {
    borderWidth: "1px",
    borderOpacity: 0.8,
    shadowBlur: "4px",
    contrast: "medium-high",
  },
  
  // Balanced - natural softness
  balanced: {
    borderWidth: "1px",
    borderOpacity: 0.6,
    shadowBlur: "8px",
    contrast: "medium",
  },
  
  // Contemplative - dreamlike quality
  soft: {
    borderWidth: "0px",
    borderOpacity: 0.4,
    shadowBlur: "16px",
    contrast: "low",
  },
  
  // Meditative - ethereal, undefined
  ethereal: {
    borderWidth: "0px",
    borderOpacity: 0.2,
    shadowBlur: "32px",
    contrast: "very-low",
  },
}

Part 8: Laws of Chromatic Harmony

The Gradation Law

"A beautiful Gradation of Chromatic Grays... are so exquisitely blended, like the gradations of nature, that it is impossible to perceive the degrees of progression."

Never make jarring leaps in lightness or saturation. Always use adjacent steps:

// ✅ CORRECT - Gradual progression
<div className="bg-blueGray-900 text-blueGray-100">
  <div className="bg-blueGray-800" /> {/* one step lighter */}
</div>

// ❌ WRONG - Jarring leap
<div className="bg-blueGray-900 text-blueGray-100">
  <div className="bg-blueGray-200" /> {/* too much contrast */}
</div>

The Harmony Law

Adjacent colors in your palette must share undertones:

// ✅ HARMONIOUS - Same hue family
primary: "blueGray"
accent: "indigoGray"  // adjacent on color wheel

// ❌ DISCORDANT - Clashing undertones
primary: "blueGray"
accent: "orangeGray"  // opposite, creates tension

The Normal Gray Principle

Normal gray (50% lightness, 0% saturation) harmonizes with everything.

Use achromatic gray as a bridge between different chromatic families:

// Bridging two different chromatic palettes
<div className="bg-blueGray-900">
  <div className="bg-achromatic-800" /> {/* neutral transition */}
  <div className="bg-orangeGray-800" /> {/* now feels harmonious */}
</div>

Part 9: Usage Examples

Example 1: Trust-Focused SaaS Dashboard

// Intention: trust (professional, reliable, calm)
const tokens = generateChromaticTokens("trust", "dark")

Produces blue-gray palette with subtle undertones that convey professionalism without being cold.

Example 2: Wellness App

// Intention: harmony (balanced, natural, healing)
const tokens = generateChromaticTokens("harmony", "light")

Produces teal-gray palette that feels natural and calming.

Example 3: Creative Portfolio

// Intention: spirit (creative, unique, aspirational)
const tokens = generateChromaticTokens("spirit", "dark")

Produces violet-gray palette that feels luxurious and creative.

Example 4: E-commerce (Energy + Warmth)

// Intention: energy (activating, encouraging action)
const tokens = generateChromaticTokens("energy", "light")

Produces orange-gray palette that's warm and action-oriented without being aggressive.


Part 10: Quick Reference

Intention → Palette Mapping

IntentionPaletteForceHueBest For
urgencyredGrayThermal10°Alerts, errors, critical
energyorangeGrayThermal30°CTAs, activation, enthusiasm
warmthorangeGrayThermal30°Hospitality, welcome, comfort
clarityyellowGrayLuminous50°Learning, documentation, focus
optimismyellowGrayLuminous50°Success states, achievements
growthgreenGrayNeutral120°Progress, health, nature
harmonytealGrayNeutral170°Wellness, balance, equilibrium
trustblueGrayElectrical210°Professional, reliable, calm
calmindigoGrayElectrical240°Meditation, depth, intuition
spiritvioletGrayElectrical270°Creativity, luxury, transcendence
affectionroseGraySpecial340°Care, love, nurturing
neutralachromatic—0°Minimal, universal, professional

Saturation Guidelines

Element TypeSaturation Range
Backgrounds8-12%
Cards/Surfaces10-14%
Text (on dark)0% (pure white/gray)
Borders12-16%
Interactive elements14-18%
Focus states16-20%

Never Use

  • Saturation above 25% for any surface
  • Pure black (hsl(0, 0%, 0%)) - use 950 shades instead
  • Pure white (hsl(0, 0%, 100%)) - use 50 shades instead
  • Brownish-green combinations (jealousy/deceit)
  • Gray-green without clear separation (depression)

TypeScript Package

Full Type Definitions

// types/chromatic.ts

export type ChromaticHue = 
  | "redGray" 
  | "orangeGray" 
  | "yellowGray" 
  | "greenGray" 
  | "tealGray"
  | "blueGray" 
  | "indigoGray" 
  | "violetGray" 
  | "roseGray"
  | "achromatic"

export type ChromaticShade = 
  | 50 | 100 | 200 | 300 | 400 
  | 500 | 600 | 700 | 800 | 900 | 950

export type Force = "thermal" | "luminous" | "neutral" | "electrical"

export interface ChromaticColor {
  hue: ChromaticHue
  shade: ChromaticShade
  hsl: string
  force: Force
}

export interface ThoughtFormProperties {
  quality: DesignIntention      // → determines color
  nature: FormNature            // → determines shape
  definiteness: ClarityLevel    // → determines outline
}

export type FormNature = 
  | "directed"      // pointed, projectile
  | "radiating"     // star-like, outward
  | "protective"    // enclosing, shell
  | "intellectual"  // crystalline, sharp
  | "aspirational"  // upward, spire
  | "emotional"     // cloud-like, soft

export type ClarityLevel = 
  | "definite" 
  | "clear" 
  | "balanced" 
  | "soft" 
  | "ethereal"

"Quality of thought determines colour. Nature of thought determines form. Definiteness of thought determines clearness of outline."
— Besant & Leadbeater, Thought-Forms (1901)