4 shared libs — the vocabulary every template and custom scene resolves to. Curves, text fitting, and the brand tokens. Install any of them into your own project; each ships with its source.
The vocabulary everything else resolves to — curves, text fitting, brand tokens. Read these instead of reinventing values.
animation-utilsCore motion vocabulary — interpolate, spring, Easing (incl. Easing.bezier), the SPRING_* presets, stagger, cubicBezier. Every custom scene's curves resolve to these; do not reinvent values.
EASE.outExpoEASE.outBackEASE.inOutCubicEASE.anticipateEASE.popEASE.editorialSPRING_SMOOTH · peak 1.00SPRING_SNAPPY · peak 1.11SPRING_CRISP · peak 1.25SPRING_BOUNCY · peak 1.28Sampled from the real functions. Easings run the full 0→1; springs are windowed to the first 30% because that is where they move — all four have settled by roughly t=0.2. Only SPRING_SMOOTH arrives without overshoot; the peak on each plot is how far past 1 it travels before settling.
text-utilsText measurement and fitting helpers — notably fitTextSize(text, baseSize, maxWidth) for shrink-to-fit copy in fixed-width containers.
26.0px13.9px13.0pxSame box, same base size — fitTextSize shrinks longer copy to fit. It stops at minScale (half the base size by default), so copy past that still overflows, as the third line shows. That floor is deliberate: shrinking further would produce text nobody can read at arm's length.
tokensThe canonical brand-token resolver: one derivation path from a config's style + brandKit to the resolved accent / surface / surface_elevated / content / muted / font / script_font tokens, plus fontStack(). Read tokens from here instead of hardcoding colors or font stacks.
accent#22c55esecondary#c9922esurface#0a0a14surface_elevated#14141dcontent#ffffffmuted#a7a6b0Resolved live from { accent: "#22c55e", secondary: "#c9922e" } — everything else is derived, which is why a scene should read tokens rather than hardcode hex.
motion-stdlibThe higher-level motion vocabulary custom scenes compose with — phase, staggerWindow, punch, cascade, typewriter, countUp, particles, burst, glow, vignette, grain, drift, sweep, morph, orbit, pathDraw. These are already globals inside a custom_* scene; install this item when you want them in your own project.
npx vanillasky r▌cascade, typewriter, countUp and punch, each driven by the same 0→1 progress a scene gets.
Inside a custom scene you just reference a primitive by component name — nothing to install. To pull the source into your own React project, map the namespace once in components.json and add what you want.
# in your own React project
npx shadcn add @vanillasky/countUpNumber # a primitive
npx shadcn add @vanillasky/motion-stdlib # the motion vocabularyInstalling into your app does not change what the vanillasky CLI renders — to change a scene there, eject it as componentSource. See Templates & the registry.