{
  "$comment": "Lucian Labs brand tokens. Machine-readable mirror of the look specs (console.md, house-pour.md, punch-clock.md, field-notes.md, claudecore.md, yama-bruh.md, waveloop-admin.md). Agents: read AGENT.md first — https://lucianlabs.ca/branding/AGENT.md",
  "version": "1.3.7",
  "shared": {
    "monospace": "Inconsolata",
    "monospaceStack": "'Inconsolata', 'IBM Plex Mono', monospace",
    "monospaceException": "field-notes uses Fira Code, claudecore uses Space Mono, and yama-bruh uses Courier New for every role — each inherited from the identity it was extracted from, see field-notes.md / claudecore.md / yama-bruh.md",
    "motion": {
      "duration": "150ms",
      "easing": "ease",
      "animatableProperties": [
        "color",
        "background-color",
        "border-color",
        "opacity",
        "filter"
      ],
      "forbidden": [
        "entrance animation on page load"
      ],
      "note": "Transforms are per-look, not universal — see each look's motion rules. Console and House Pour have none of consequence; Punch Clock springs on press by design."
    },
    "boundary": "Every edge is var(--line) at the look's border width — 1px in console and house-pour, 2px in punch-clock.",
    "banned": {
      "fonts": [
        "Inter",
        "Poppins",
        "Nunito",
        "Montserrat",
        "ui-monospace",
        "SFMono-Regular",
        "Menlo"
      ],
      "colors": [
        "#6366f1",
        "#8b5cf6",
        "#a855f7",
        "purple-to-pink gradient"
      ],
      "patterns": [
        "emoji in UI text",
        "multi-stop gradient on text or buttons",
        "rounded-2xl + shadow-lg card stack",
        "centered hero + three feature cards + CTA band",
        "more than one accent hue per view"
      ],
      "copy": [
        "seamlessly",
        "effortlessly",
        "powerful",
        "beautiful",
        "Get Started",
        "Welcome back",
        "Oops",
        "exclamation marks"
      ]
    },
    "ux": {
      "spec": "https://lucianlabs.ca/branding/UX.md",
      "appliesTo": "every look, every platform",
      "units": "density-independent: 1 unit = 1 logical px at 1x = 1pt (Apple) = 1dp (Android)",
      "states": [
        "rest",
        "hover",
        "focus",
        "press",
        "busy",
        "disabled",
        "error",
        "selected"
      ],
      "focusRing": "2 units thick, 2-unit gap, in the look's interactive hue — required on every interactive element",
      "durations": {
        "instant": "60ms",
        "quick": "150ms",
        "settle": "300ms",
        "move": "600ms",
        "arrive": "850ms"
      },
      "curves": {
        "standard": [
          0.25,
          0.1,
          0.25,
          1
        ],
        "decelerate": [
          0.22,
          1,
          0.36,
          1
        ],
        "emphasised": [
          0.4,
          0,
          0.2,
          1
        ],
        "sharp": [
          0.7,
          0,
          0.3,
          1
        ],
        "spring": {
          "damping": 0.8,
          "response": "0.2s"
        }
      },
      "touchTargetMin": 44,
      "fieldTextMin": 16,
      "screenStates": [
        "first-run",
        "empty",
        "loading-first-paint",
        "busy",
        "partial-stale",
        "error"
      ],
      "stateEncoding": "colour + label + geometry, always all three — never hue alone",
      "toast": {
        "visible": "2200ms",
        "fade": "250ms",
        "position": "bottom centre",
        "concurrent": 1
      },
      "disabledSaysWhy": "a gated primary action carries the reason in its own label and updates live",
      "breakpointClasses": [
        "compact",
        "medium",
        "wide"
      ],
      "reducedMotion": "state change still lands; transforms and loops drop, colour/opacity stay",
      "transitions": {
        "spec": "https://lucianlabs.ca/branding/UX.md#2a--transitions-between-states",
        "rule": "every state change is a transition; label, colour and indicator arrive as one event; focus position is the one instant change",
        "table": {
          "rest<->hover": {
            "duration": "quick",
            "curve": "standard"
          },
          "hover->press": {
            "duration": "instant",
            "curve": "standard"
          },
          "press->release": {
            "duration": "settle",
            "curve": "decelerate",
            "springLooks": "spring"
          },
          "press->busy": {
            "duration": "quick",
            "after": "grace",
            "curve": "standard"
          },
          "busy->done": {
            "duration": "settle",
            "curve": "emphasised"
          },
          "busy->error": {
            "duration": "settle",
            "curve": "emphasised"
          },
          "done->rest": {
            "duration": "settle",
            "curve": "emphasised"
          },
          "enabled<->disabled": {
            "duration": "quick opacity + settle label",
            "curve": "standard / emphasised"
          },
          "labelA->labelB": {
            "duration": "settle",
            "curve": "emphasised",
            "moves": "out lifts 3 units on quick, in rises 3 units on quick, width tweens, digits roll"
          },
          "siblingA->siblingB": {
            "duration": "settle",
            "curve": "emphasised",
            "moves": "one shared indicator travels; labels cross at the midpoint"
          },
          "on<->off": {
            "duration": "settle",
            "curve": "emphasised"
          },
          "focusA->focusB": {
            "duration": "immediate"
          }
        },
        "dwell": {
          "grace": "300ms",
          "busyMinimum": "600ms",
          "confirmation": "1200ms",
          "error": "until the user acts",
          "toast": "2200ms"
        },
        "interruptible": "a new state retargets from the in-flight value"
      }
    },
    "catalogue": {
      "source": "https://lucianlabs.ca/v2/ll-brand.js",
      "note": "looks[*].tokens and looks[*].fonts are the SPEC (each look's .md/.css). looks[*].widget is what the ll-* widgets ship — the same look read for a thing that floats over a page (the deep/solid variants) — written from LL_LOOKS in v2/ll-brand.js by `node branding/sync-brands.mjs`. Edit the catalogue, then sync; never `widget` by hand."
    }
  },
  "looks": {
    "console": {
      "name": "Console",
      "slug": "console",
      "origin": "WaveLoop / Choppa",
      "mood": "instrument panel at 2am — dark, precise, sharp-cornered, nothing decorative",
      "useFor": [
        "audio tools",
        "dashboards",
        "dev tools",
        "monitors",
        "editors",
        "live state",
        "numeric readouts"
      ],
      "spec": "https://lucianlabs.ca/branding/console.md",
      "stylesheet": "https://lucianlabs.ca/branding/console.css",
      "reference": "https://lucianlabs.ca/branding/console.html",
      "tokens": {
        "--bg": "#101014",
        "--bg-deep": "#07080d",
        "--panel": "rgb(17 20 30 / 88%)",
        "--panel-solid": "#111420",
        "--ink": "#eaecf2",
        "--muted": "#aaafbd",
        "--faint": "#6b7185",
        "--line": "#383c4a",
        "--line-soft": "rgb(56 60 74 / 55%)",
        "--accent": "#397fd9",
        "--accent-2": "#ffa40a",
        "--good": "#4db378",
        "--bad": "#e6404d",
        "--radius": "0",
        "--font-display": "'Micro 5', monospace",
        "--font-body": "system-ui, -apple-system, 'Segoe UI', sans-serif",
        "--font-mono": "'Inconsolata', 'IBM Plex Mono', monospace"
      },
      "rules": {
        "radius": "0 on everything, no exceptions",
        "shadow": "none — depth comes from hairlines and panel translucency",
        "accentBudget": "one accent-carrying element per view; --accent-2 (gold) only for record/armed/destructive-live state",
        "backdrop": "radial blue + amber wash on the page background only",
        "labels": "uppercase, 0.06–0.08em tracking, --font-display"
      },
      "fonts": [
        {
          "family": "Micro 5",
          "role": "display",
          "source": "https://fonts.googleapis.com/css2?family=Micro+5&display=swap"
        },
        {
          "family": "Inconsolata",
          "role": "mono",
          "source": "https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&display=swap"
        }
      ],
      "widget": {
        "tokens": {
          "--bg": "#07080d",
          "--panel": "#111420",
          "--ink": "#eaecf2",
          "--muted": "#aaafbd",
          "--faint": "#6b7185",
          "--label": "#aaafbd",
          "--line": "#383c4a",
          "--accent": "#397fd9",
          "--accent-2": "#ffa40a",
          "--orb": "#397fd9",
          "--radius": "0",
          "--radius-btn": "0",
          "--border": "1px",
          "--shadow": "none",
          "--font-display": "'Micro 5', monospace",
          "--font-label": "'Micro 5', monospace",
          "--font-body": "system-ui, -apple-system, 'Segoe UI', sans-serif",
          "--font-num": "'Inconsolata', 'IBM Plex Mono', monospace",
          "--label-size": "0.775rem",
          "--wordmark-size": "0.9rem",
          "--name-size": "1.225rem",
          "--tracking": "0.07em",
          "--header-scale": "1.5"
        },
        "fonts": "Micro+5&family=Inconsolata:wght@400;700",
        "fontsHref": "https://fonts.googleapis.com/css2?family=Micro+5&family=Inconsolata:wght@400;700&display=swap",
        "transition": {
          "kind": "scanline",
          "ms": 600,
          "easing": "steps(8, end)"
        }
      }
    },
    "house-pour": {
      "name": "House Pour",
      "slug": "house-pour",
      "origin": "DrinkTix",
      "mood": "letterpressed card on ivory stock — warm, quiet, expensive",
      "useFor": [
        "elevated brand experiences",
        "premium and considered products",
        "anything where how it feels to use is part of what's on offer"
      ],
      "spec": "https://lucianlabs.ca/branding/house-pour.md",
      "stylesheet": "https://lucianlabs.ca/branding/house-pour.css",
      "reference": "https://lucianlabs.ca/branding/house-pour.html",
      "tokens": {
        "--bg": "#f7f5ef",
        "--bg-2": "#f1eee6",
        "--panel": "#fffefa",
        "--ink": "#262319",
        "--muted": "#71695a",
        "--faint": "#a79f8d",
        "--line": "rgba(38, 35, 25, 0.11)",
        "--line-2": "rgba(38, 35, 25, 0.2)",
        "--accent": "#a4813b",
        "--accent-2": "#c9a961",
        "--accent-soft": "rgba(164, 129, 59, 0.14)",
        "--good": "#3c7a52",
        "--bad": "#a03d38",
        "--radius": "10px",
        "--radius-pill": "14px",
        "--font-display": "'Cormorant Garamond', Georgia, serif",
        "--font-body": "'Avenir Next', Avenir, -apple-system, sans-serif",
        "--font-mono": "'Inconsolata', 'IBM Plex Mono', monospace",
        "--font-brand": "'Kaushan Script', cursive"
      },
      "rules": {
        "radius": "10px on cards, 8px on inputs, 14px on buttons and pills — rounded, never a full pill",
        "shadow": "one long soft shadow on raised surfaces: 0 1px 2px rgba(38,35,25,.04), 0 14px 34px -18px rgba(38,35,25,.18)",
        "accentBudget": "gold carries one primary action per view plus numeric totals; everything else is ink or muted",
        "backdrop": "faint gold + violet radial wash over a warm ivory gradient",
        "labels": "uppercase, 0.18–0.22em tracking, --font-body at 0.66rem, section headings trail a hairline rule"
      },
      "fonts": [
        {
          "family": "Cormorant Garamond",
          "role": "display",
          "source": "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,500;0,600;0,700;1,500&display=swap"
        },
        {
          "family": "Kaushan Script",
          "role": "wordmark",
          "source": "https://fonts.googleapis.com/css2?family=Kaushan+Script&display=swap"
        },
        {
          "family": "Inconsolata",
          "role": "mono",
          "source": "https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&display=swap"
        }
      ],
      "widget": {
        "tokens": {
          "--bg": "#f1eee6",
          "--panel": "#fffefa",
          "--ink": "#262319",
          "--muted": "#71695a",
          "--faint": "#a79f8d",
          "--label": "#71695a",
          "--line": "rgba(38, 35, 25, 0.2)",
          "--accent": "#a4813b",
          "--accent-2": "#a4813b",
          "--orb": "#a4813b",
          "--radius": "10px",
          "--radius-btn": "14px",
          "--border": "1px",
          "--shadow": "0 1px 2px rgba(38,35,25,.04), 0 14px 34px -18px rgba(38,35,25,.18)",
          "--font-display": "'Cormorant Garamond', Georgia, serif",
          "--font-label": "'Avenir Next', Avenir, -apple-system, sans-serif",
          "--font-body": "'Avenir Next', Avenir, -apple-system, sans-serif",
          "--font-num": "'Inconsolata', 'IBM Plex Mono', monospace",
          "--label-size": "0.55rem",
          "--wordmark-size": "0.975rem",
          "--name-size": "1.188rem",
          "--tracking": "0.2em",
          "--header-scale": "1"
        },
        "fonts": "Cormorant+Garamond:wght@500;600;700&family=Kaushan+Script&family=Inconsolata:wght@400;700",
        "fontsHref": "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@500;600;700&family=Kaushan+Script&family=Inconsolata:wght@400;700&display=swap",
        "transition": {
          "kind": "pour",
          "ms": 850,
          "easing": "cubic-bezier(0.22, 1, 0.36, 1)"
        }
      }
    },
    "punch-clock": {
      "name": "Punch Clock",
      "slug": "punch-clock",
      "origin": "Time Warrior",
      "mood": "an LED readout bolted to a steel box — one number rules the screen, a binary state says whether it's moving",
      "useFor": [
        "timers",
        "trackers",
        "counters",
        "meters",
        "money clocks",
        "streak apps",
        "anything that punches in and out"
      ],
      "spec": "https://lucianlabs.ca/branding/punch-clock.md",
      "stylesheet": "https://lucianlabs.ca/branding/punch-clock.css",
      "reference": "https://lucianlabs.ca/branding/punch-clock.html",
      "tokens": {
        "--bg": "#0e0e10",
        "--panel": "#1a1a1e",
        "--panel-2": "#232329",
        "--line": "#33333a",
        "--ink": "#ededf0",
        "--dim": "#666666",
        "--green": "#3fcc60",
        "--red": "#cc4040",
        "--cyan": "#5fb5ff",
        "--orange": "#cc8020",
        "--accent": "var(--green)",
        "--border": "2px",
        "--radius": "0",
        "--font-display": "'Micro 5', monospace",
        "--font-body": "'Finlandica', ui-sans-serif, system-ui, sans-serif",
        "--font-mono": "'Inconsolata', 'IBM Plex Mono', monospace"
      },
      "rules": {
        "radius": "0 everywhere; the attention orb is the single deliberate circle",
        "border": "2px on every border, divider, table rule and input — dropping to 1px turns this into console",
        "shadow": "none — flat opaque panels, no blur, no translucency",
        "hero": "exactly one figure at 84px Micro 5 (60px under 640px); everything else on the page is 30px or smaller",
        "signalBudget": "no one-accent cap — instead, every coloured element must map to a state the user can name. green = money/running, red = stop/delete, cyan = focus, orange = owed/warning",
        "numerals": "every number the user watches is Micro 5, tabular; prose and labels are Finlandica and never take the display face",
        "labels": "lowercase, dim, tracked 0.04–0.18em; section headings stay small so the hero figure dominates"
      },
      "motion": {
        "press": "scale(0.96) + opacity dip, spring back ~0.2s — the one house look where an :active transform is correct",
        "livePixel": "8px square breathing 0.35→1 opacity over 0.9s ease-in-out alternate; square, never round",
        "odometer": "live numerals roll rather than cut",
        "orb": "13px circle, 1.7s expanding ping; at most one, only to summon the user"
      },
      "nativeParity": {
        "path": "time-warrior/apps/mac/Sources/TimeWarriorBar/Theme.swift",
        "note": "SwiftUI port mirrors these tokens (panel(), field(), BrandButtonStyle, PulseSquare, Tile). Known drift: --dim is #666 on web and #cfcfd6 in Theme.swift; web is canonical until reconciled."
      },
      "fonts": [
        {
          "family": "Micro 5",
          "role": "display",
          "source": "https://fonts.googleapis.com/css2?family=Micro+5&display=swap"
        },
        {
          "family": "Finlandica",
          "role": "body",
          "source": "https://fonts.googleapis.com/css2?family=Finlandica:wght@400;500;600&display=swap"
        },
        {
          "family": "Inconsolata",
          "role": "mono",
          "source": "https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&display=swap"
        }
      ],
      "widget": {
        "tokens": {
          "--bg": "#0e0e10",
          "--panel": "#1a1a1e",
          "--ink": "#ededf0",
          "--muted": "#a5a5a8",
          "--faint": "#666666",
          "--label": "#8a8a90",
          "--line": "#33333a",
          "--accent": "#3fcc60",
          "--accent-2": "#cc8020",
          "--orb": "#3fcc60",
          "--radius": "0",
          "--radius-btn": "0",
          "--border": "2px",
          "--shadow": "none",
          "--font-display": "'Micro 5', monospace",
          "--font-label": "'Micro 5', monospace",
          "--font-body": "'Finlandica', ui-sans-serif, system-ui, sans-serif",
          "--font-num": "'Micro 5', monospace",
          "--label-size": "0.775rem",
          "--wordmark-size": "0.9rem",
          "--name-size": "1.225rem",
          "--tracking": "0.1em",
          "--header-scale": "1.5"
        },
        "fonts": "Micro+5&family=Finlandica:wght@400;700&family=Inconsolata:wght@400;700",
        "fontsHref": "https://fonts.googleapis.com/css2?family=Micro+5&family=Finlandica:wght@400;700&family=Inconsolata:wght@400;700&display=swap",
        "transition": {
          "kind": "glitch",
          "ms": 300,
          "easing": "linear"
        }
      }
    },
    "field-notes": {
      "name": "Field Notes",
      "slug": "field-notes",
      "origin": "lucianlabs.ca/blog",
      "mood": "a reading lamp over a dark desk — serif prose on plum-black, amber headings, lavender in the margins",
      "useFor": [
        "blogs",
        "essays",
        "writeups",
        "build logs as narrative",
        "documentation that argues",
        "changelogs with a point of view"
      ],
      "spec": "https://lucianlabs.ca/branding/field-notes.md",
      "stylesheet": "https://lucianlabs.ca/branding/field-notes.css",
      "reference": "https://lucianlabs.ca/branding/field-notes.html",
      "tokens": {
        "--bg": "#171519",
        "--panel": "#13111a",
        "--panel-2": "#1c1820",
        "--chip": "#221e2a",
        "--ink": "#d0ccd4",
        "--bright": "#ffffff",
        "--strong": "#e0dce4",
        "--soft": "#b8b0c0",
        "--muted": "#9990a0",
        "--faint": "#776e80",
        "--dim": "#554e5c",
        "--ghost": "#3a3440",
        "--line": "#2a2630",
        "--accent": "#e8a020",
        "--accent-2": "#c4a0d0",
        "--radius": "6px",
        "--radius-sm": "3px",
        "--font-display": "'Exo 2', sans-serif",
        "--font-body": "'Source Serif 4', Georgia, serif",
        "--font-mono": "'Fira Code', 'IBM Plex Mono', monospace"
      },
      "rules": {
        "radius": "6px on blocks, 3px on inline chips, nothing else",
        "shadow": "none — the only glow is text-shadow on reveal (h1, hovered post titles)",
        "accentBudget": "amber belongs to the text itself — links, h2, inline code, attribution; lavender only at the edges — hovers, curator, sign-off name, filed spines. They never trade jobs.",
        "type": "18px root and 1.8 leading are load-bearing; body is never pure white, h1 always is",
        "monospace": "Fira Code — the one exception to the house Inconsolata rule, inherited from the blog",
        "motion": "0.3s ease on color, border, padding, text-shadow; no transforms, nothing on load"
      },
      "fonts": [
        {
          "family": "Exo 2",
          "role": "display",
          "source": "https://fonts.googleapis.com/css2?family=Exo+2:wght@400;700&display=swap"
        },
        {
          "family": "Source Serif 4",
          "role": "body",
          "source": "https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,wght@0,400;0,600;1,400&display=swap"
        },
        {
          "family": "Fira Code",
          "role": "mono",
          "source": "https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500&display=swap"
        }
      ],
      "widget": {
        "tokens": {
          "--bg": "#13111a",
          "--panel": "#1c1820",
          "--ink": "#d0ccd4",
          "--muted": "#9990a0",
          "--faint": "#776e80",
          "--label": "#9990a0",
          "--line": "#2a2630",
          "--accent": "#e8a020",
          "--accent-2": "#c4a0d0",
          "--orb": "#e8a020",
          "--radius": "6px",
          "--radius-btn": "3px",
          "--border": "1px",
          "--shadow": "none",
          "--font-display": "'Exo 2', sans-serif",
          "--font-label": "'Exo 2', sans-serif",
          "--font-body": "'Source Serif 4', Georgia, serif",
          "--font-num": "'Fira Code', 'IBM Plex Mono', monospace",
          "--label-size": "0.575rem",
          "--wordmark-size": "0.825rem",
          "--name-size": "0.9rem",
          "--tracking": "0.08em",
          "--header-scale": "1"
        },
        "fonts": "Exo+2:wght@500;700&family=Source+Serif+4:wght@400;600&family=Fira+Code:wght@400;500",
        "fontsHref": "https://fonts.googleapis.com/css2?family=Exo+2:wght@500;700&family=Source+Serif+4:wght@400;600&family=Fira+Code:wght@400;500&display=swap",
        "transition": {
          "kind": "iris",
          "ms": 600,
          "easing": "cubic-bezier(0.4, 0, 0.2, 1)"
        }
      }
    },
    "claudecore": {
      "name": "Claudecore",
      "slug": "claudecore",
      "origin": "ll-shop widget / elijahlucian.ca widgets",
      "status": "iterating — extracted from shipped code, not designed first; the widget is the reference where the spec is silent",
      "mood": "a vending machine humming in a dark arcade — near-black glass, a navy hairline, sky-blue chrome, gold on the goods, everything floating in its own glow",
      "useFor": [
        "floating widgets",
        "docks",
        "mini-players",
        "pop-over shops",
        "corner panels over someone else's page",
        "the personal site"
      ],
      "spec": "https://lucianlabs.ca/branding/claudecore.md",
      "stylesheet": "https://lucianlabs.ca/branding/claudecore.css",
      "reference": "https://lucianlabs.ca/branding/claudecore.html",
      "implementation": "https://cdn.lucianlabs.ca/scripts/ll-shop.js",
      "tokens": {
        "--bg": "#060a10",
        "--bg-deep": "#000000",
        "--panel": "#0a0a0a",
        "--panel-2": "#111111",
        "--ink": "#dfe8f2",
        "--bright": "#ffffff",
        "--muted": "#9fb2c8",
        "--faint": "#7d8fa5",
        "--label": "#5d8fc9",
        "--line": "#2a4a70",
        "--line-2": "#1a2c44",
        "--line-soft": "#1a1a1a",
        "--line-sketch": "#303030",
        "--border": "1.5px",
        "--accent": "#4fc3f7",
        "--accent-hi": "#9fc4ea",
        "--accent-2": "#ffa40a",
        "--accent-2-hi": "#ffc45c",
        "--gold-a": "#d4a843",
        "--gold-b": "#e8842a",
        "--orb": "#397fd9",
        "--orb-hi": "#6db3f2",
        "--orb-lo": "#1e5aa8",
        "--good": "#1bbb41",
        "--bad": "#ff6b6b",
        "--radius": "8px",
        "--radius-sm": "4px",
        "--shadow": "0 4px 20px rgba(0,0,0,.6), 0 0 14px rgba(57,127,217,.18), inset 0 1px 0 rgba(255,255,255,.04)",
        "--shadow-bloom": "0 8px 26px rgba(0,0,0,.65), 0 0 24px rgba(79,195,247,.42), inset 0 1px 0 rgba(255,255,255,.14)",
        "--shadow-hard": "1px 1px 0 0 rgba(0,0,0,.5)",
        "--font-display": "'Finlandica', system-ui, sans-serif",
        "--font-body": "'Finlandica', system-ui, sans-serif",
        "--font-mono": "'Space Mono', 'Inconsolata', monospace",
        "--spring": "cubic-bezier(0.32, 0.9, 0.3, 1)",
        "--ease-in": "cubic-bezier(0.4, 0, 0.6, 1)",
        "--out": "420ms",
        "--in": "250ms",
        "--micro": "180ms"
      },
      "rules": {
        "radius": "8px on panels, 4px on everything inside them; the orb and the badge are the circles",
        "border": "1.5px --line navy on panels — a half-step between console and punch-clock; 1px --line-2 for inner dividers; 2px --line-sketch grey only around content (the sketch, the site's widget bodies)",
        "shadow": "three layers on every panel — drop, blue glow, inset top highlight — blooming on hover. The one dark look with shadows, because it floats over other pages",
        "labels": "blue, not grey: --label, uppercase, 0.14–0.18em, Finlandica 700. The wordmark is the same with one word in --accent",
        "accentBudget": "--accent (sky) speaks: chrome, tabs, links, the nudge — text and hairlines, never fills. --accent-2 (gold) sells: one CTA per view, the hire strip, the slots. The sketch takes the content's hue and is the only third colour",
        "gradients": "the named exception to the ban: a two-stop 135° gradient on the goods (slots) and the primary CTA only. Never on chrome, never on text",
        "productColours": "a slot may wear its product's own colour; the look dresses the machine, not the goods",
        "motion": "juice — transform + opacity only. --spring 420ms out, --ease-in 250ms back, --micro 180ms for colour. Hover nudges 2px and blooms, press scales .96, focus is a 2px accent ring. Open and close are a flip and a zoom: edge-on and invisible at 90°, turning to face you while growing to size (380ms in, 260ms out reversed), only on a user toggle",
        "monospace": "Space Mono — the look's exception to the house Inconsolata rule, inherited from elijahlucian.ca",
        "start": "closed. A floating widget arrives as an orb; state (open, tab, look) persists in localStorage",
        "orb": "every look collapses to its own icon, see orbs.css — claudecore is the blue sphere; console a pulsing block cursor; house-pour a violet swirl behind an ivory rim; punch-clock a green pip that glitches every seven seconds; field-notes the blog's codex mark ◈ with a Fira Code label"
      },
      "fonts": [
        {
          "family": "Finlandica",
          "role": "display + body",
          "source": "https://fonts.googleapis.com/css2?family=Finlandica:wght@300;400;700&display=swap"
        },
        {
          "family": "Space Mono",
          "role": "mono",
          "source": "https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&display=swap"
        }
      ],
      "widget": {
        "tokens": {
          "--bg": "#060a10",
          "--panel": "#0a0a0a",
          "--ink": "#dfe8f2",
          "--muted": "#9fb2c8",
          "--faint": "#7d8fa5",
          "--label": "#5d8fc9",
          "--line": "#2a4a70",
          "--accent": "#4fc3f7",
          "--accent-2": "#ffa40a",
          "--orb": "#397fd9",
          "--radius": "8px",
          "--radius-btn": "4px",
          "--border": "1.5px",
          "--shadow": "0 4px 20px rgba(0,0,0,0.6), 0 0 14px rgba(57,127,217,0.18), inset 0 1px 0 rgba(255,255,255,0.04)",
          "--font-display": "'Finlandica', system-ui, sans-serif",
          "--font-label": "'Finlandica', system-ui, sans-serif",
          "--font-body": "'Finlandica', system-ui, sans-serif",
          "--font-num": "'Space Mono', 'Inconsolata', monospace",
          "--label-size": "0.525rem",
          "--wordmark-size": "0.625rem",
          "--name-size": "0.9rem",
          "--tracking": "0.14em",
          "--header-scale": "1"
        },
        "fonts": "Finlandica:wght@300;400;700&family=Space+Mono:wght@400;700",
        "fontsHref": "https://fonts.googleapis.com/css2?family=Finlandica:wght@300;400;700&family=Space+Mono:wght@400;700&display=swap",
        "transition": {
          "kind": "curve",
          "ms": 600,
          "easing": "cubic-bezier(0.4, 0, 0.2, 1)"
        }
      }
    },
    "yama-bruh": {
      "name": "Yama-Bruh",
      "slug": "yama-bruh",
      "origin": "YAMA-BRUH (yama-bruh.lucianlabs.ca), after the Yamaha PortaSound PSS-470",
      "mood": "a 90s portable keyboard on the kitchen table — charcoal moulded plastic, teal silkscreen, chamfered caps whose colour is their job, one red LED number",
      "useFor": [
        "synths",
        "drum machines",
        "sequencers",
        "sound toys",
        "ringtone makers",
        "MIDI tools",
        "anything you play"
      ],
      "spec": "https://lucianlabs.ca/branding/yama-bruh.md",
      "stylesheet": "https://lucianlabs.ca/branding/yama-bruh.css",
      "reference": "https://lucianlabs.ca/branding/yama-bruh.html",
      "tokens": {
        "--bg": "#1a1a1a",
        "--panel": "rgba(0, 0, 0, 0.55)",
        "--panel-solid": "#0f0f0f",
        "--screen": "#060606",
        "--line": "#2a2a2a",
        "--line-hi": "#333333",
        "--line-lo": "#222222",
        "--ink": "#d0ccc4",
        "--label": "#ccccbb",
        "--muted": "#777777",
        "--faint": "#555555",
        "--dim": "#444444",
        "--accent": "#22ccaa",
        "--accent-hi": "#77ffdd",
        "--status": "#558877",
        "--led": "#ff4444",
        "--good": "#3cc88a",
        "--bad": "#ff4444",
        "--cap-green": "linear-gradient(180deg, #5aeaaa 0%, #3cc88a 12%, #30b87a 40%, #28a870 65%, #1e9060 88%, #1a7850 100%)",
        "--cap-yellow": "linear-gradient(180deg, #f0d060 0%, #d4b840 12%, #c0a830 40%, #b09820 65%, #988018 88%, #806810 100%)",
        "--cap-red": "linear-gradient(180deg, #dd4444 0%, #bb2828 20%, #992020 60%, #771818 100%)",
        "--cap-grey": "linear-gradient(180deg, #999999 0%, #777777 15%, #606060 55%, #505050 85%, #444444 100%)",
        "--cap-lit": "linear-gradient(180deg, #ffcc44 0%, #dd9922 12%, #cc8818 40%, #bb7710 65%, #aa6608 88%, #995500 100%)",
        "--radius": "2px",
        "--radius-cap": "1px",
        "--radius-housing": "4px",
        "--font-display": "'Courier New', Courier, monospace",
        "--font-body": "'Courier New', Courier, monospace",
        "--font-mono": "'Courier New', Courier, monospace"
      },
      "rules": {
        "depth": "moulded plastic lit from above — recessed plates with inset shadow, lit top edges, shadowed bottom edges, grooves, vents, ridged case edges",
        "type": "one silkscreen face, Courier New bold, uppercase, widely tracked; teal labels, cream numbers and wordmark, red LED for the number the device is showing",
        "monospace": "Courier New for every role — this look's named exception to the house Inconsolata rule",
        "caps": "cap colour is the function: green selects, yellow special, red transport, grey pattern, amber-lit engaged; caps are moulded multi-stop gradients",
        "accentBudget": "teal is the print and appears on every label; teal lit marks the one selected entry; red belongs to the LED and tempo",
        "radius": "1px caps, 2px plates, 4px housings",
        "selection": "lights in place — this look's sanctioned deviation from UX.md §2a's travelling indicator",
        "motion": "press drops 2 units and flattens the chamfer on instant; learn mode breathes on 0.9s; LED errors blink twice over 600ms"
      },
      "fonts": [
        {
          "family": "Courier New",
          "role": "display, body and mono",
          "source": "system face — ships on every platform"
        }
      ],
      "widget": {
        "tokens": {
          "--bg": "#1a1a1a",
          "--panel": "#0f0f0f",
          "--ink": "#d0ccc4",
          "--muted": "#ccccbb",
          "--faint": "#777777",
          "--label": "#22ccaa",
          "--line": "#2a2a2a",
          "--accent": "#22ccaa",
          "--accent-2": "#ff4444",
          "--orb": "#22ccaa",
          "--radius": "2px",
          "--radius-btn": "1px",
          "--border": "1px",
          "--shadow": "0 3px 4px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.04)",
          "--font-display": "'Courier New', Courier, monospace",
          "--font-label": "'Courier New', Courier, monospace",
          "--font-body": "'Courier New', Courier, monospace",
          "--font-num": "'Courier New', Courier, monospace",
          "--label-size": "0.6rem",
          "--wordmark-size": "0.85rem",
          "--name-size": "1rem",
          "--tracking": "0.18em",
          "--header-scale": "1"
        },
        "fonts": "",
        "fontsHref": "",
        "transition": {
          "kind": "led",
          "ms": 300,
          "easing": "linear"
        }
      }
    },
    "waveloop-admin": {
      "name": "WaveLoop Admin",
      "slug": "waveloop-admin",
      "origin": "waveloop.app/admin",
      "mood": "the borderless operator console — surfaces part by tone, controls fill instead of outline, Finlandica carries everything a person reads",
      "useFor": [
        "admin panels",
        "back-office",
        "ledgers",
        "dashboards with tables and actions",
        "review queues",
        "anything read and acted on for a long stretch"
      ],
      "spec": "https://lucianlabs.ca/branding/waveloop-admin.md",
      "stylesheet": "https://lucianlabs.ca/branding/waveloop-admin.css",
      "reference": "https://lucianlabs.ca/branding/waveloop-admin.html",
      "tokens": {
        "--ink": "rgb(236 239 245)",
        "--muted": "rgb(170 177 192)",
        "--faint": "rgb(170 177 192 / 60%)",
        "--navy": "rgb(20 25 32)",
        "--bg": "rgb(20 25 32)",
        "--s1": "rgb(24 30 40 / 88%)",
        "--s2": "rgb(31 38 50 / 92%)",
        "--s3": "rgb(39 47 61)",
        "--well": "rgb(8 11 16 / 70%)",
        "--sunk": "rgb(0 0 0 / 22%)",
        "--line": "rgb(255 255 255 / 10%)",
        "--accent": "rgb(57 127 217)",
        "--accent-hi": "rgb(126 183 255)",
        "--gold": "#ffa40a",
        "--hot": "rgb(236 84 96)",
        "--good": "rgb(74 190 130)",
        "--radius": "0",
        "--title": "'Micro 5', monospace",
        "--head": "'Finlandica', system-ui, sans-serif",
        "--body": "'Finlandica', system-ui, sans-serif",
        "--mono": "'Inconsolata', ui-monospace, Menlo, monospace"
      },
      "rules": {
        "separation": "tone and space — no borders anywhere; the only strokes are chart axes and gridlines",
        "surfaces": "page → s1 pane → s2 tile → s3 hover; fields sink to well, detail blocks to sunk; rows are 2.5% white tints with 4px gaps; tables zebra (even 2.5%, header band 4%, hover 5%)",
        "controls": "fills, not outlines: 7% white, 13% hovered, accent 26% when on, gold fill with dark ink for the one primary action; chips are 15–18% fills of their own colour",
        "tabs": "a segmented control sunk in a well; the active leaf is an accent 22% fill with accent-hi text",
        "focusRing": "2px accent, 2px offset — the only ring in the look",
        "type": "Finlandica reads everything; Micro 5 only the wordmark and product names; Inconsolata only what you would copy; nothing under 11px; numbers 700 and tabular",
        "headings": "sentence case at 22px 700, with a small tracked section number in accent-hi",
        "accentBudget": "gold carries numbers and the one primary action; accent carries interaction; good/hot are states",
        "motion": "0.15s on fills; nothing moves. Loading is a pulsing bar the size of the value it will become"
      },
      "fonts": [
        {
          "family": "Finlandica",
          "role": "everything read",
          "source": "https://ds.lucianlabs.ca/fonts/Finlandica.ttf"
        },
        {
          "family": "Micro 5",
          "role": "wordmark and product names",
          "source": "https://ds.lucianlabs.ca/fonts/Micro5-Regular.ttf"
        },
        {
          "family": "Inconsolata",
          "role": "what you would copy",
          "source": "https://ds.lucianlabs.ca/fonts/Inconsolata-Regular.ttf"
        }
      ]
    }
  }
}
