Romanesca RosenkreuzFour dark rooms. One signature. A theme family where the code colours never change and the room always does — engineered in OKLCH, measured against WCAG, and defended by a build that refuses to ship a colour it cannot prove. The ideaMost theme families change everything between variants, so switching means relearning what a string looks like. This one changes only the room. The syntax palette is shared by all four variants, byte for byte. A keyword is the same white in Schatten as in Graphit; a number is the same amber. What moves is the architecture around it — the depth of the surfaces, the colour of the lines, the accent that marks what is active. You can switch variants by mood or by ambient light without your code becoming unfamiliar.
The four rooms
Pick one with What is engineered hereLines that existA stroke is defined by the contrast ratio it must achieve against the surface it divides, not by a colour someone picked. The build solves for the lightness that hits the target, per surface, per variant. This matters more than it sounds. A fixed lightness step gives a different
contrast ratio on every surface, because relative luminance is nearly flat near
black — and two of these variants are built on
Three levels, each named for its job: Foregrounds that are measured, not guessedEvery colour that sits on a coloured fill — badges, buttons, prominent status items — picks black or white by measuring both. Rheingold's gold badge used to carry white text at ratio 4.89; it now carries black, and no one had to notice. Depth that is frozenThe six surfaces of each room are authored by hand, not generated. The build pins their OKLCH lightness to a baseline and fails if any of them drifts, so the depth can never be quietly lost to a refactor. It also enforces that the ladder climbs: a variant whose sidebar and editor read as one surface is a bug, not a preference. Neutrals with a temperatureEach room's greys carry a trace of its own hue — chroma below Coverage903 of VS Code's 910 official colour keys, up from 366. Newly dressed in 1.0: the entire overview ruler, every context menu, the terminal's missing half, sticky scroll, inlay hints, merge conflicts, the debug console, test explorer and coverage, notebooks, inline AI edits, and tab hover states. Seven keys are left unset on purpose — The gatesThe build refuses to write a theme that fails any of these.
Architecture
The chain runs one way: a colour module may read roles, never a raw palette. That is what makes "which line goes here?" a question with one answer instead of twenty, and it is why the sixteen hand-picked accent opacities the old build carried collapsed into one six-step scale. Adding a colour means finding the module that owns its namespace and reaching for the role that names the job. If no role fits, that is a signal the role layer is missing a job — not an invitation to reach past it. Recommended settings
Semantic highlighting is worth turning on — 40 semantic rules ship here and they carry the type-aware colours that textmate scopes cannot resolve. ChangelogSee CHANGELOG.md. Built by Adi Sunetra · kasuganozomi Licensed CC BY-NC-ND 4.0 — see LICENSE |