shuttering
The house style, made durable — themes, components, motion, charts, and agent-native surfaces, shipped as versioned packages so every application is built with the same hand.
What it is
Shuttering is the reusable formwork concrete is poured into — the frame that shapes the structure, then is struck once it sets. This is that, for frontends: a coherent set of tokens, components, motion, and machine-readable surfaces, each shipped as a versioned @shuttering/* package. Every application inherits one house style rather than forking it, and a change made here reaches every consumer through a normal dependency bump.
Packages
Eight packages, one acyclic dependency graph. Install only what an application needs.
- @shuttering/tokens
- The single source of truth — design tokens as Tailwind v4 @theme CSS and a typed TS mirror, kept in lockstep by a parity test.
- @shuttering/utils
- cn(), locale-aware formatters, and the focus-trap / reduced-motion / theme / palette hooks, plus the pre-paint theme script.
- @shuttering/motion
- MotionProvider, the shared easing / spring / duration constants, and the reduced-motion-aware primitives.
- @shuttering/ui
- The component library — cva primitives, Base UI accessibility primitives, and the bespoke house pieces.
- @shuttering/charts
- An ECharts wrapper and a token→chart theme bridge that reads live CSS variables, so chart colors cannot drift from the tokens.
- @shuttering/agent
- The always-on agent-native surfaces — the query engine, CopyAsApi, AgentPanel, validateSearch helpers, and discovery generators.
- @shuttering/ai
- AI-native UI primitives — chat threads, streaming text, a thinking indicator, tool-call cards, a composer, and a chatbot.
- @shuttering/signature
- The identity layer — domain palettes and voice, the signature motion hand, and the user-acknowledgment kit, so applications share one base without sharing one personality.
Agent-native by default
Being machine-readable is an invariant, not a mode.
Any view that renders a query emits its machine-readable surfaces unconditionally — inline JSON-LD, a copy-as-API affordance, and a shareable deep link — the same way a human sees the chart. There is no operator toggle to switch them on. This documentation site dogfoods the same surfaces: every page is deep-linkable, and its discovery manifest is generated from the page registry the site is built from.