Design System
The visual language of dadeda.design. Every choice is deliberate — from the
#DADEDA canvas color (which IS the brand name, a hex code that
sounds like "data") to the OKLCH color space that ensures perceptual uniformity
across brand and data visualization palettes.
Brand Canvas
#DADEDA — RGB(218, 222, 218). A sage mist with barely perceptible
green undertone. 86% lightness, 1% saturation. The foundation everything lives on.
--color-canvas #DADEDA — sage mist--color-canvas-light Light variant--color-canvas-dark Dark variantBrand Accents
Bold colors that pop against the sage canvas. Inspired by Philadelphia industrial patina and neon energy.
--color-accent-green Neon green — primary accent--color-accent-blue Blueprint cyan — systems--color-accent-hot Energy accentNeutrals
--color-surface Surface--color-text-primary Text primary--color-text-secondary Text secondary--color-text-muted Text muted--color-border BorderData Viz — Categorical
Okabe-Ito hue identity, re-anchored on a monotonic lightness ladder (L 0.32 → 0.92, ≥8 units between adjacent stops) so the palette also reads cleanly in grayscale. Stock Okabe-Ito collides at Sky Blue ≈ Orange in luminance; this version doesn't. CVD-safe across protan / deutan / tritan; chroma is near max sustainable at each (L, H) so the palette feels chromatic, not flat.
--viz-1 Dark sage--viz-2 Blue--viz-3 Vermillion--viz-4 Bluish green--viz-5 Reddish purple--viz-6 Orange--viz-7 Sky blue--viz-8 YellowCompact comparison — color above, grayscale below. Each stop should remain visibly distinct in both bars when testing CVD types:
Data Viz — Card-Safe Categorical
The site's category accents already carry meaning: green signals See Work cards (H ≈ 130–170), amber signals Get to Know cards (H ≈ 50–100). Any chart that renders inside an expanded card overlay, on top of the Scrambler background, or near category UI must avoid those hue bands so data categories don't leak meaning into the surrounding interface (or absorb it).
vizCardSafe is a 7-stop monotonic-L palette restricted to
reds (H 0–40), blues (H 200–280), purples / magentas (H 290–350), and
low-chroma neutrals.
vizCardSafe[0] Near-blackvizCardSafe[1] BluevizCardSafe[2] VermillionvizCardSafe[3] Reddish purplevizCardSafe[4] PurplevizCardSafe[5] Sky bluevizCardSafe[6] Light coralCompact comparison — color above, grayscale below:
Data Viz — Scales
Sequential, diverging, and cyclical scales live in
src/lib/tokens.ts (array-shaped, consumed directly by D3).
Full swatch UI is on the Phase 8 polish list; the values are listed
below for reference and copy.
- Sequential single-hue (7 stops, light → dark)
-
vizSeq.sagevizSeq.blueprintvizSeq.ambervizSeq.brownvizSeq.grayDefault to
grayorbrownwhen color would distract from the data. - Sequential multi-hue (7 stops)
-
vizSeqMulti.cividisvizSeqMulti.dadedaDefault:
cividis(CVD-verified; no green hues that confuse protan / deutan). Brand-flavored optiondadedapasses the L-monotonicity test but requires visual review under deutan / protan / tritan simulators before using it in shipped viz; if a simulation flattens or inverts the ramp, fall back tocividis. - Diverging (7 stops, neutral midpoint)
-
vizDiv.brbgvizDiv.rdbuvizDiv.puorvizDiv.graybrbgis the project's default.gray(warm-cool through light, very low chroma) for direction without color attention. - Cyclical (12 stops, constant L, hue rotation)
-
vizCycUse for time-of-day, day-of-year, angles, phase. Never use a sequential ramp for cyclical data.
Palette governance
- Brand colors (DADEDA sage, neon green, blueprint blue, hot accent) stay out of viz except for ≤2–3 categorical brands where meaning is unambiguous (Fantasy red + #DADEDA being canonical), and only when the resulting set passes deuteranopia simulation.
- Inside cards / on Scrambler bg: use
vizCardSafefor categorical,vizSeq.blueprint / brown / grayfor sequential,vizDiv.rdbu / grayfor diverging. AvoidvizSeq.sage / amber,vizSeqMulti.dadeda,vizDiv.brbg / puor, andvizCycin those contexts; their hues collide with See Work green or GTK amber. - Default to
vizSeq.grayorvizSeq.brownwhenever color would distract: small multiples, secondary charts, annotation layers, table-as-chart cells. - Cyclical data uses
vizCyc, never a sequential ramp. For cyclical data inside cards, use a brightness-only cycle throughvizSeq.graywith explicit hour / phase labels. - D3 scales import from
tokens.ts; no inline hex in viz code.
Typography
Spacing
--space-1 0.25rem --space-2 0.5rem --space-3 0.75rem --space-4 1rem --space-6 1.5rem --space-8 2rem --space-12 3rem --space-16 4rem --space-24 6rem AI Interaction Design
The site is built for two audiences in parallel: humans who arrive at a browser, and agents who arrive on behalf of a human or alongside one. The principles below shape every WebMCP tool, every piece of structured data, and every UI affordance that participates in agent flow.
- Agent transparency
- Every agent action is observable and reversible. When a tool runs, the targeted control glows (amber → green) and is briefly non-interactive so the user can see "an agent is acting on this." On completion the glow recedes; nothing happens silently. The window.dadeda registry is inspectable from any console.
- Cognitive amplification, not replacement
- Agents extend what a user is already doing — surfacing information, navigating the site, drafting a share — but the user stays the author of intent. Drawing on Bret Victor's direct- manipulation tradition and Microsoft's HAX guidelines: the agent assists, the human chooses.
- Taste-conducive interaction
- The system reflects the user's choices rather than imposing a default. The Scrambler arrangement is one valid state of many; agents can rearrange it. Privacy preferences are user-controlled.
- Privacy-by-design defaults
-
Agents access only what's needed. Privacy preferences default to
off for analytics and agent storage; on for agent discovery (so
the site is honest about what it offers, but doesn't write
anything to the device without consent). Set or read via the
setPrivacyPreferencestool, with a UI surface as a parallel control. - Markdown-first content delivery for agents
-
Agents read structured content faster than rendered HTML. The
site exposes
llms.txtat the root, JSON-LD (Person,WebSite,Organization) in<head>, and a planned.mdendpoint per content page. The Scrambler card collection is agent-queryable viagetSiteMap/searchCardswith full content shape to alleviate a need for agents to scrape the rendered HTML. - Progressive enhancement
- The site works without agents. The Scrambler navigates by mouse, keyboard, and touch; the Knob has direct human controls; cards link normally. Agent capability is additive. Bring an agent and you get more, but you don't need one.
Why These Choices
- Why OKLCH?
- Perceptually uniform, which means that equal numeric changes produce equal visual changes. Critical for data viz palettes where lightness differences encode meaning.
- Why #DADEDA?
- The brand IS the color. dadeda.design, the hex code, the sage mist canvas. One identity.
- Why Tailwind + vanilla CSS?
- Tailwind for layout and structural utility. Vanilla CSS for animation, D3 viz, and the Scrambler 3D transforms where programmatic control matters. Each tool where it's strongest.
- Why no shadow DOM?
- I plan to add D3.js works to the site. D3 needs direct DOM access for
d3.select(). Svelte compiles to direct DOM operations, so there's no encapsulation barrier, no workarounds needed.