Type: pick one, maybe two

One typeface is a perfectly good answer, and the system font stack is a genuinely good choice — it's fast, it loads instantly, and it looks native on every platform.

If you want something with more character, use it for headings only and keep the system stack for body text. Two typefaces is the maximum; three looks like a ransom note.

Set your body size at 16–18px minimum. Smaller is a common mistake and the most common accessibility complaint about small sites.

Colour: build from tokens

Define your colours as CSS custom properties once, then use only those names. Never a raw hex value in a rule.

You need fewer than you think: a background, a slightly raised surface, a border, main text, muted text, one accent, and semantic colours for error and success. That's eight or nine values and it covers a whole application.

Doing this also makes dark mode nearly free — you override the token values, not the rules.

Contrast is non-negotiable

4.5:1 for body text, 3:1 for large text. Check it, don't guess — the grey-on-grey that looks elegant on your calibrated screen is illegible on a phone outdoors.

This is the accessibility rule with the widest impact, because it affects everyone in bright light, everyone over about forty, and every cheap screen.

Avoid pure black and pure white

#000 on #fff is harsher than it needs to be. Very dark grey on very slightly off-white reads more comfortably. In dark mode, pure black with pure white text produces visible halation — a near-black background and a slightly dimmed white are better.

palette.txt
Build me a colour system for <describe the product and the feeling>.

Define as CSS custom properties: background, raised surface, border,
text, muted text, one accent, plus error and success.

Give me both light and dark values, with the dark set as an override
of the same tokens.

Check every text-on-background pair against 4.5:1 and tell me the
actual ratios. If any fail, fix them and say what you changed.

No pure black, no pure white. Explain your accent choice in one line.

Ask for the contrast ratios explicitly. Models will confidently produce a palette that fails contrast unless checking is part of the request.