.vendo/theme.json (or a runtime VendoProvider.theme override), and every
shipped chrome surface, including the
prewired primitives, picks them up automatically.
This page covers how to set the theme and see it flow through; the exact
token shape and CSS variable tables live in the reference section at the
end.
Set the theme
vendo init extracts .vendo/theme.json and names it in the
<VendoProvider theme={...}> paste it prints. vendo sync regenerates the file on
each build, so a fresh install renders on brand without passing theme by
hand.
Pass partial runtime overrides through VendoProvider.theme when you want to
adjust tokens without touching the file. Shipped chrome derives its colors,
typography, radius, density, and motion from these tokens and does not
hardcode a Vendo brand.
Generation receives the same theme. Optional design rules add
generation-time guidance without changing runtime tokens: set
createVendo({ apps: { designRules } }) in config, or keep a
.vendo/design-rules.md file, re-read per generation (a non-blank config
value wins over the file).
See it flow through
VendoProvider emits stable CSS custom properties derived from density and
motion. Chrome and the prewired primitives read them directly, and you can
consume the same variables from your own styles. It also derives
--vendo-color-scheme from your background color and stamps a
--fl-kb-inset variable while the mobile takeover is open. All three are
covered in the reference below.
Theme reference
The VendoTheme shape
Density variables
--vendo-density-* names are stable: new variables may be added under this
prefix, but the ones below will not be renamed.
density: "compact" tightens control sizes, padding, and gaps; density: "comfortable" relaxes them. Every compact value is less than or equal to
its comfortable counterpart.
Color scheme
VendoProvider derives color-scheme from the WCAG relative luminance of
colors.background and exposes it as --vendo-color-scheme. Backgrounds
below the flip point (L < 0.179) resolve to dark; everything else,
including unparseable values, resolves to light.
Chrome uses this variable to activate
light-dark() branches, so a
dark-brand host automatically gets the dark chrome treatment without any
extra configuration. Set colors.background in .vendo/theme.json (or
through a VendoProvider.theme override) and the scheme follows.
.vendo/theme.json
--vendo-color-scheme from your own styles if you want custom
surfaces to track the same flip:
Motion
motion: "reduced" collapses --vendo-motion-duration to 0ms so chrome
respects user reduced-motion preferences. The easing curve stays constant.
Reference the variables from your own CSS to keep custom surfaces in sync
with the current theme:
Mobile takeover
Shipped overlay and palette chrome switch to a full-viewport takeover at viewports 767px wide and narrower. The takeover covers the host layout instead of docking inside a squeezed column and portals todocument.body
so transformed host ancestors cannot confine it. It honors iOS safe-area
insets on all four edges. On touch devices (pointer: coarse), the composer
and palette search render at 16px to prevent iOS auto-zoom, and icon buttons
and the overlay close control expand to a 44px touch target. Desktop chrome
is unchanged.
The takeover surface stamps a stable --fl-kb-inset CSS variable derived
from visualViewport so the composer lifts above the on-screen keyboard.
Read it from your own styles if you render a custom surface inside a
takeover:
--fl-kb-inset is 0px when no keyboard is open and outside of takeover mode.