Depth in Pindoba comes from layered shadows and backdrop blur. Both are tokens, and the shadows already know about the theme mode.
Use boxShadow with a token name. The scale runs xs, sm, md, lg, xl, 2xl, plus inner for pressed or recessed surfaces.
import { css } from "@pindoba/styled-system/css";
<div className={css({ boxShadow: "md", borderRadius: "lg" })}>Raised card</div>;
Each tier follows two rules so shadows look smooth and match the border system:
border.* tokens use. It is mixed with color-mix, so it follows the ramp when you re-theme.Shadows are semantic tokens: dark mode uses the same geometry at a much higher opacity, because a shadow tuned for a light surface vanishes on a dark one. You never write a _dark override.
| token | layers | description |
|---|---|---|
| xs | 2 | Hairline lift: inputs, chips |
| sm | 2 | Small controls and resting cards |
| md | 3 | Cards and raised panels |
| lg | 3 | Popovers and menus |
| xl | 3 | Dialogs and drawers |
| 2xl | 3 | Hero and floating surfaces |
| inner | 2 (inset) | Recessed or pressed surfaces |
The blurs tokens feed backdropBlur, filter blur and the translucent (trslct) utility.
| token | value | size |
|---|---|---|
| none | 0px | 0px |
| 2xs | 0.05rem | 0.5px |
| xs | 0.1rem | 1px |
| sm | 0.2rem | 2px |
| md | 0.4rem | 4px |
| lg | 0.8rem | 8px |
| xl | 1.6rem | 16px |
| 2xl | 2.0rem | 20px |
| 3xl | 2.4rem | 24px |
| 4xl | 3.2rem | 32px |
| 5xl | 4.0rem | 40px |
trslct accepts none through xl only. It applies backdrop-filter: blur(<token>) saturate(150%) brightness(100%).
<nav
className={css({ trslct: "md", backgroundColor: "neutral.surface.peak/60" })}
>
Glass navigation
</nav>
Give a glass surface a translucent background (a color with alpha) so there is something to blur through.
Compare every shadow on each surface, then pick a blur token to see it over a busy background.
On surface.ground. Shadows are mode-aware, so switch the theme to
compare.
The glass uses trslct, which accepts none to xl. The larger tokens are for backdropBlur and filter: blur().
xs-sm resting, md-lg raised, xl-2xl overlays_dark shadow overrides; the tokens already flipinner on pressed states rather than inventing an inset shadow