Theming

One file drives everything. Mizu's look lives in CSS custom properties, mapped to Tailwind v4 utilities. Recolor the system by changing a handful of tokens.

The token block

Add this to src/app.css after @import 'tailwindcss';. Semantic tokens (--background, --primary, …) are mapped with @theme inline so utilities like bg-primary react to light and dark automatically.

:root {
	--background: #e9f2f8;
	--foreground: #14303f;
	--card: #ffffff;
	--muted: #d8e7f1;
	--muted-foreground: #587688;
	--primary: #01b2ff;          /* aqua hero */
	--primary-foreground: #ffffff;
	--border: #c3d9e7;
	--ring: #38bdf8;

	/* Glass + gloss materials */
	--glass: rgba(255, 255, 255, 0.6);
	--glass-border: rgba(255, 255, 255, 0.7);
	--sheen: rgba(255, 255, 255, 0.55);

	/* Glossy gradients + elevation (abbreviated) */
	--gradient-primary: linear-gradient(180deg, #5cd5ff, #01b2ff 48%, #0090d9);
	--elevation-aqua: inset 0 1px 0 rgba(255,255,255,.5), 0 4px 12px rgba(1,178,255,.35);
}

.dark {
	--background: #061520;       /* deep water */
	--foreground: #e3f1fa;
	--primary: #29c7ff;
	/* …each token gets a dark variant… */
}

The aqua ramp

mizu-50 through mizu-950. The hero is mizu-500. Swap these to re-tint the whole system.

50100200300400500600700800900950

Material utilities

Beyond colors, Mizu adds a small set of Frutiger Aero surface utilities you can use anywhere.

glass / glass-strong Frosted translucent surface + backdrop blur.
gloss The wet top sheen (a ::before highlight). Needs relative + overflow-hidden.
gradient-primary / -surface / … Glossy 180° gradients for fills.
shadow-aqua / -glass / -bevel / -pressed Layered elevation, from cyan glow to recessed wells.

Dark mode

Mizu uses a class strategy: add dark to <html>. The included theme store handles persistence and a no-flash inline script. Toggle it with the sun/moon button in the header.