Skip to content

Presentation & theming ​

What the Themes screen manages — and why look-and-feel is runtime data instead of code.

What it is ​

A theme is one self-contained CSS file defining the app's full design-token contract (--ns-* custom properties); the active theme per surface — public site and admin back-office independently — is a D1 settings row an admin flips at /admin/themes. Components consume only the token contract, so switching themes restyles everything with no rebuild and no deploy.

Why it exists ​

NanaSelect has to look like NanaWall today, but presentation is one of the things the product deliberately experiments on: the 2026 presentation push runs multiple deepened themes and layouts side by side, and an experiment can split visitors between theme + layout variants to find the one that converts. That only works if presentation is data a runtime can switch, not code a release ships.

Separating the two surfaces (public vs. admin) means the back-office can stay stable and utilitarian while the buyer experience is restyled freely — changing one never restyles the other. And because a theme is a single token file, a bad theme degrades safely: a stale or invalid stored value falls back to the surface default rather than breaking rendering.

In the admin ​

ScreenHow-to
ThemesSwitching themes

Learn more ​