About CSS Theme Generator
Ramps are built in OKLCH rather than HSL because OKLCH lightness is perceptual: the 300 step of a blue and the 300 step of a yellow look equally light, where HSL would make one glaring and the other muddy. Your exact colour lands in the ramp unchanged at the step nearest its lightness, so the swatch in the brand guide is the swatch in the code.
Pick a primary colour and, optionally, an accent, and the generator builds three eleven-step ramps — primary, accent and a neutral tinted towards the primary — then assembles them into a light theme and a dark theme with named tokens: background, surface, border, text, muted text, primary and its hover state, and the text colour that sits on each filled colour. The preview draws a card, a button, a link and an input in whichever theme is selected, and four contrast checks under it report whether the text in that theme reads.
The ramps follow the same shape as Tailwind's own palettes, running from a 50 that is nearly white to a 950 that is nearly black, with the most saturated steps in the middle. Chroma is not held constant along the ramp: the pale and dark ends are pulled towards grey, because a tint that keeps full saturation looks dyed and a shade that keeps it looks muddy. A muted base colour produces a muted ramp rather than being forced vivid, so the character of the colour you chose survives.
The neutral is derived from the primary's hue with a small amount of chroma. Pure greys next to a coloured brand look detached, as though the interface and the branding came from different projects; a neutral that leans a few degrees towards the primary reads as belonging to it. You can override it with any hex value if the brand has its own grey.
Text on a filled colour is chosen by measurement, not convention. For each filled token the generator compares white against the ramp's darkest step and uses whichever gives the higher contrast, so a light accent gets dark text and a deep primary gets white without you having to notice. The CSS export writes both themes — a :root block, a data-theme attribute block, and a prefers-color-scheme media query guarded so an explicit choice still wins — which is the pattern that behaves correctly for the three states a visitor can be in.