Skip to content
Sheet 01Palettes

Nine palettes.
One hue apart.

Every palette here is the same lightness and chroma ladder at a different hue. That is the whole system, and it is why a theme change cannot break the hierarchy, and why dark mode stops being a second design.

nocturneoklch(52.0%0.160296)

8palettes
32pairs each
0failing
1number changes
Sheet 02live · real components

Pick one. Watch what doesn’t change.

Not swatches. These are the site’s own components, imported and rendered in whichever palette is live. The nav above this page is one of them and is deliberately not copied in here, because a copy would drift from the thing it is arguing about.

akshitas.com — nocturneclears every pairtightest text pair 4.87 · text-subtle on cream-200body worst case 9.7332 checked
01

Turning rough ideas into products people use

Eight years across enterprise data tools and one consumer turnaround.

2.3 → 4.2

What the boAt Crest redesign moved, drawn in whichever palette is pressed.

store rating
02

One surface, three personas

Analysts, leads and admins reading the same data at different depths.

A palette that only recolours a card proves nothing about the system.

4.87text-subtle on cream-200
5.35text-subtle on surface
5.68accent-500 on cream-50
5.94accent-text on surface
All 32 pairs for nocturne

Measured at build from nocturne’s own tokens. A palette on the other ground checks a different set, because the pairs follow the ground the design actually draws.

ink-800 on cream-5014.94pass
ink-800 on cream-10014.12pass
ink-600 on cream-508.87pass
ink-600 on cream-1008.39pass
text-primary on band-dark17.32pass
text-secondary on band-dark8.43pass
text-primary on surface15.24pass
text-secondary on surface7.42pass
text-subtle on surface5.35pass
text-subtle on band-dark6.08pass
text-subtle on cream-2004.87pass
reference on band-dark8.43pass
reference on surface7.42pass
accent-text on surface5.94pass
accent-text on surface-well6.49pass
accent-text on band-dark6.75pass
on-dark on band-dark17.32pass
on-dark-muted on band-dark8.43pass
on-dark-quote on band-dark9.07pass
accent-on-dark on band-dark6.75pass
text-body on band-dark9.73pass
on-accent on accent6.75pass
accent-500 on cream-505.68pass
accent-500 on band-dark3.24pass
accent-500 on cream-100 (non-text)5.37pass
ink-400 on cream-50 (non-text)4.48pass
ink-400 on cream-100 (non-text)4.23pass
ink-400 on cream-200 (non-text)3.30pass
ground step cream-50 / cream-1001.06pass
ground step cream-100 / cream-20013.95pass
ground step cream-200 / cream-30010.63pass
cream-300 on band-dark13.26pass

Try it across the site

Applies nocturne to every page for 30 minutes. It expires on its own, and an exit control follows you until it does. Nothing is published.

Sheet 039 parts · all shipping

The kit.

Every part here is imported from the live site and rendered in whichever palette is live. Press one for the roles it reads and how to use it.

A part is a shipped public component that mounts on its own. That leaves out page-level sections, the fixed nav and reading indicator, and everything under the editor, which is frozen against the theme and so would sit here not moving.

9 shown

Section heading

Shipping on the public site today, in every palette on this page.

Structuregroup
text-primary · accent-text · text-subtleroles read
components/ui/SectionHeading.tsxships from
01

Turning rough ideas into products people use

Eight years across enterprise data tools and one consumer turnaround.

<SectionHeading index="01" title="…" subtext="…" />
Sheet 04Four moves

How to use it.

Role tokens in OKLCH, with the measured contrast riding inside the block as a comment.

01

Paste the block.

Everything is a role, so your components never name a colour. Swapping a theme touches this block and nothing else.

02

Change one number.

Move the hue and the whole palette moves with it. Lightness and chroma are held, so the contrast you measured still holds.

03

Dark mode is the same block.

Mirror the lightness values around the midpoint and leave hue alone. The identity survives and there is no second palette to maintain.

04

Check it. Don't trust it.

OKLCH is an authoring model, not a contrast certificate. Perceptual lightness and WCAG luminance are different measures. The 32 pairs above are computed at build from these tokens. Run the same check on yours.

custom properties

The contrast report rides inside the block as a comment, so the figures travel with the tokens.

/*
 nocturne — a palette from akshitas.com
 dark ground. Its counterpart is redline.

 Values are OKLCH, as authored. Lightness carries the hierarchy, chroma the energy,
 hue the identity — so retheming this block is a change to the third number.

 measured contrast, 32 pairs the design actually draws
   ink-800 on cream-50                14.94
   ink-800 on cream-100               14.12
   ink-600 on cream-50                8.87
   ink-600 on cream-100               8.39
   text-primary on band-dark          17.32
   text-secondary on band-dark        8.43
   text-primary on surface            15.24
   text-secondary on surface          7.42
   text-subtle on surface             5.35
   text-subtle on band-dark           6.08
   text-subtle on cream-200           4.87
   reference on band-dark             8.43
   reference on surface               7.42
   accent-text on surface             5.94
   accent-text on surface-well        6.49
   accent-text on band-dark           6.75
   on-dark on band-dark               17.32
   on-dark-muted on band-dark         8.43
   on-dark-quote on band-dark         9.07
   accent-on-dark on band-dark        6.75
   text-body on band-dark             9.73
   on-accent on accent                6.75
   accent-500 on cream-50             5.68
   accent-500 on band-dark            3.24
   accent-500 on cream-100 (non-text) 5.37
   ink-400 on cream-50 (non-text)     4.48
   ink-400 on cream-100 (non-text)    4.23
   ink-400 on cream-200 (non-text)    3.30
   ground step cream-50 / cream-100   1.06
   ground step cream-100 / cream-200  13.95
   ground step cream-200 / cream-300  10.63
   cream-300 on band-dark             13.26
*/
:root {
  --color-accent: oklch(69.9% 0.171 296.0);
  --color-accent-500: oklch(52.0% 0.160 296);
  --color-accent-600: oklch(45.0% 0.164 296);
  --color-accent-on-dark: oklch(69.9% 0.171 296.0);
  --color-accent-text: oklch(69.9% 0.171 296.0);
  --color-background: oklch(16.9% 0.023 279.6);
  --color-band-dark: oklch(16.9% 0.023 279.6);
  --color-border: oklch(29.6% 0.020 277.0);
  --color-bounce: oklch(99.5% 0.003 282);
  --color-canvas: oklch(92.0% 0.024 282);
  --color-case-study-sand: oklch(16.9% 0.023 279.6);
  --color-cream-100: oklch(96.8% 0.016 282);
  --color-cream-200: oklch(26.4% 0.021 280.8);
  --color-cream-300: oklch(88.0% 0.033 282);
  --color-cream-50: oklch(98.5% 0.007 282);
  --color-danger-600: oklch(45.0% 0.16 25);
  --color-draft-600: oklch(48.0% 0.100 75);
  --color-etch: oklch(96.5% 0.007 277.2);
  --color-glow-paper: oklch(0.63 0.160 296 / 0.2);
  --color-glow-web: oklch(48.0% 0.125 259);
  --color-ink-200: oklch(80.0% 0.023 282);
  --color-ink-400: oklch(56.0% 0.030 282);
  --color-ink-600: oklch(40.0% 0.030 282);
  --color-ink-800: oklch(26.2% 0.038 282);
  --color-ink-950: oklch(15.0% 0.039 282);
  --color-on-accent: oklch(16.9% 0.023 279.6);
  --color-on-dark: oklch(96.5% 0.007 277.2);
  --color-on-dark-muted: oklch(74.4% 0.014 286.0);
  --color-on-dark-quote: oklch(77.6% 0.131 297.8);
  --color-reference: oklch(74.4% 0.014 286.0);
  --color-rule: oklch(48.5% 0.039 282);
  --color-smoke-1: oklch(0.84 0.020 282 / 0.74);
  --color-smoke-2: oklch(0.90 0.020 282 / 0.74);
  --color-smoke-3: oklch(0.97 0.014 282 / 0.74);
  --color-smoke-4: oklch(0.87 0.017 282 / 0.74);
  --color-success-50: oklch(94.5% 0.030 145);
  --color-success-700: oklch(46.0% 0.075 145);
  --color-surface: oklch(23.1% 0.023 280.7);
  --color-surface-well: oklch(19.1% 0.022 280.0);
  --color-text-body: oklch(78.5% 0.013 281.0);
  --color-text-lead: oklch(86.5% 0.010 279.7);
  --color-text-primary: oklch(96.5% 0.007 277.2);
  --color-text-secondary: oklch(74.4% 0.014 286.0);
  --color-text-subtle: oklch(65.7% 0.016 285.9);
  --color-vessel-capsule: oklch(82.9% 0.012 286.1);
  --color-vessel-glass: oklch(94.5% 0.027 282);
  --color-vessel-ink: oklch(15.6% 0.036 281.4);
  --color-vessel-pearl: oklch(96.5% 0.016 282);
  --color-vessel-shadow: oklch(92.5% 0.021 282);
  --color-vessel-wave: oklch(93.5% 0.017 282);
}

/* sRGB fallback, GENERATED from the values above — do not edit it by hand, and do not treat it
   as the palette. It exists for browsers with no oklch() support and is otherwise unread. The
   eight-digit entries carry the alpha the six-digit form would silently drop. */
@supports not (color: oklch(0% 0 0)) {
  :root {
    --color-accent: #a984fb;
    --color-accent-500: #734fb9;
    --color-accent-600: #6039a4;
    --color-accent-on-dark: #a984fb;
    --color-accent-text: #a984fb;
    --color-background: #0d0e19;
    --color-band-dark: #0d0e19;
    --color-border: #2a2c37;
    --color-bounce: #fdfdff;
    --color-canvas: #e2e3f5;
    --color-case-study-sand: #0d0e19;
    --color-cream-100: #f2f3ff;
    --color-cream-200: #23242f;
    --color-cream-300: #d3d5ed;
    --color-cream-50: #f9faff;
    --color-danger-600: #9b1e22;
    --color-draft-600: #7e5403;
    --color-etch: #f2f3f8;
    --color-glow-paper: #9371de33;
    --color-glow-web: #2e5ca3;
    --color-ink-200: #bbbccd;
    --color-ink-400: #717386;
    --color-ink-600: #454658;
    --color-ink-800: #212237;
    --color-ink-950: #09081b;
    --color-on-accent: #0d0e19;
    --color-on-dark: #f2f3f8;
    --color-on-dark-muted: #ababb5;
    --color-on-dark-quote: #c0a3ff;
    --color-reference: #ababb5;
    --color-rule: #5b5d75;
    --color-smoke-1: #c8c9d8bd;
    --color-smoke-2: #dbddebbd;
    --color-smoke-3: #f3f4ffbd;
    --color-smoke-4: #d2d3dfbd;
    --color-success-50: #e1f3e1;
    --color-success-700: #3c633d;
    --color-surface: #1b1c28;
    --color-surface-well: #12131e;
    --color-text-body: #b7b8c1;
    --color-text-lead: #d1d2d9;
    --color-text-primary: #f2f3f8;
    --color-text-secondary: #ababb5;
    --color-text-subtle: #90909b;
    --color-vessel-capsule: #c6c6cf;
    --color-vessel-glass: #e9ebff;
    --color-vessel-ink: #0a0a1b;
    --color-vessel-pearl: #f1f2fe;
    --color-vessel-shadow: #e3e5f4;
    --color-vessel-wave: #e7e8f5;
  }
}

Free to use. No attribution needed.