Versioning

The Guide (Introduction + Getting Started) is versioned by route — each release is its own file under content/<version>/, so a release's guide stays one readable page instead of being threaded through <Version> blocks. The picker swaps the version segment and navigates; / redirects to the default. Reference pages (Theming, Components, Dashboard, Shape Studio, and this page) are shared across versions.

Per-version pages (the routing model)

content/
  1.0/    index.mdx  getting-started.mdx  _meta.ts   →  /1.0, /1.0/getting-started
  0.9/    index.mdx  getting-started.mdx  _meta.ts   →  /0.9/…
  canary/ index.mdx  getting-started.mdx  _meta.ts   →  /canary/…
  theming.mdx  components.mdx  …                     →  shared (no version segment)
  • The picker (top-right) swaps the leading /<version>/ segment and routes there.
  • ThemeScript reads the version from the URL before paint and sets <html data-version>, so the sidebar shows only the active release's Guide group (the others are hidden in neumorphic.css) with no flash.
  • The install snippet pins to the version you're reading — try the picker:
npm install soft-ui-docs@0.9.90
pnpm add soft-ui-docs@0.9.90
yarn add soft-ui-docs@0.9.90
bun add soft-ui-docs@0.9.90
npx jsr add soft-ui-docs@0.9.90

To add a versioned page, drop the same filename in each content/<version>/ folder. To add a shared page, put it at the content/ root.

In-page differences (when a whole new page is overkill)

For shared pages, or a sentence-level difference, gate inline with the global <html data-version> (set by the picker). You're viewing the v0.9.90 docs.

Blocks — <Version> with is / since / until / not:

- 📦 Shown on every released version, not canary (not="canary").

A word or two — data-doc-version (CSS-only, no JS, no flash):

useShape() now returns a Promisereturns the value synchronously in this version.