Migrating to 0.3
The 0.3 token model and prop vocabulary, with a codemod for the utilities and a table for the props.
Last updated
0.3 replaces the 0.2 semantic tokens (--accent, --muted, --surface …)
with five hues times seven roles, and gives every component the same prop
vocabulary. Copied components are yours, so the migration touches your repo.
1. Update the tokens file
Re-run npx @ava-ui/apogee init to refresh theme.css, or copy the new
registry/tokens/theme.css over yours. If you had hand-edited colours, copy
scripts/hues.mjs from the package, change the values, and run
node node_modules/@ava-ui/apogee/scripts/build-tokens.mjs src/styles/apogee.css ./hues.mjs
(see Design tokens).
2. Run the codemod
It rewrites utility classes and var(--…) references in .astro, .mdx,
.md and .css files under ./src (run it from your project root):
node node_modules/@ava-ui/apogee/scripts/codemod-0.3.mjs --dry # list files it would change
node node_modules/@ava-ui/apogee/scripts/codemod-0.3.mjs # apply
Then re-add the components you had copied (npx @ava-ui/apogee add …) to pick
up their 0.3 versions, and diff against your local edits.
Utilities
| 0.2 | 0.3 |
|---|---|
bg-accent/5 |
bg-primary-faded-highlighted |
from-accent/20 |
from-primary/20 |
from-accent/10 |
from-primary/10 |
bg-muted/60 |
bg-neutral-faded-highlighted |
bg-muted-foreground/15 |
bg-neutral |
bg-muted-foreground/10 |
bg-neutral |
ring-background |
ring-page |
border-ring |
border-primary |
text-accent-hover |
text-primary |
bg-accent-hover |
bg-primary-highlighted |
text-accent-foreground |
text-on-primary |
border-accent/25 |
border-primary-faded |
bg-accent/10 |
bg-primary-faded |
bg-accent/15 |
bg-primary-faded |
bg-accent |
bg-primary |
text-accent |
text-primary |
border-accent |
border-primary |
outline-accent |
outline-primary |
bg-danger-hover |
bg-critical-highlighted |
text-danger-foreground |
text-on-critical |
border-danger/25 |
border-critical-faded |
bg-danger/10 |
bg-critical-faded |
bg-danger |
bg-critical |
text-danger |
text-critical |
border-danger |
border-critical |
text-success-foreground |
text-on-positive |
border-success/25 |
border-positive-faded |
bg-success/10 |
bg-positive-faded |
bg-success |
bg-positive |
text-success |
text-positive |
border-success |
border-positive |
text-warning-foreground |
text-on-warning |
border-warning/30 |
border-warning-faded |
bg-warning/10 |
bg-warning-faded |
text-muted-foreground |
text-neutral-faded |
bg-muted/40 |
bg-neutral-faded |
bg-muted/50 |
bg-neutral-faded |
hover:bg-muted |
hover:bg-neutral-faded-highlighted |
focus-visible:bg-muted |
focus-visible:bg-neutral-faded-highlighted |
aria-selected:bg-muted |
aria-selected:bg-neutral-faded-highlighted |
bg-muted |
bg-neutral-faded |
text-surface-foreground |
text-neutral |
bg-surface |
bg-elevation-raised |
border-border |
border-neutral |
divide-border |
divide-neutral |
bg-border |
bg-neutral |
bg-background/85 |
bg-page/85 |
bg-background |
bg-page |
text-background |
text-on-inverted |
bg-foreground |
bg-inverted |
text-foreground |
text-neutral |
outline-ring |
outline-primary |
ring-ring |
ring-neutral |
CSS variables
| 0.2 | 0.3 |
|---|---|
--accent-hover |
--background-primary-highlighted |
--accent-foreground |
--on-primary |
--accent |
--background-primary |
--danger-hover |
--background-critical-highlighted |
--danger-foreground |
--on-critical |
--danger |
--background-critical |
--success-foreground |
--on-positive |
--success |
--background-positive |
--warning-foreground |
--on-warning |
--warning |
--background-warning |
--muted-foreground |
--foreground-neutral-faded |
--muted |
--background-neutral-faded |
--surface-foreground |
--foreground-neutral |
--surface |
--background-elevation-raised |
--border |
--border-neutral |
--background |
--background-page |
--foreground |
--foreground-neutral |
--ring |
--border-primary |
--color-accent |
--background-primary |
--color-muted |
--background-neutral-faded |
--color-border |
--border-neutral |
--color-background |
--background-page |
--color-ring |
--border-primary |
--color-danger |
--background-critical |
--color-success |
--background-positive |
--duration-base |
--duration-medium |
--ease-smooth |
--ease-standard |
--ease-emphasized |
--ease-decelerate |
3. Rename props by hand
The vocabulary is the same everywhere: color is the hue, variant the fill
style, size one of small | medium | large | xlarge, directions start | end.
| Component | 0.2 | 0.3 |
|---|---|---|
| Button | variant="primary" |
(default) |
| Button | variant="secondary" |
variant="outline" color="neutral" |
| Button | variant="ghost" |
variant="ghost" color="neutral" |
| Button | variant="danger" |
color="critical" |
| Button | variant="link" |
use <Link> |
| Button | size="icon" |
iconOnly |
| Button, Input, Select, Textarea, Combobox, NumberInput, TagInput, PinInput, Checkbox, Radio, Switch, Avatar, AvatarGroup, Spinner, SegmentedControl, ToggleButton | size="sm" | "md" | "lg" |
size="small" | "medium" | "large" |
| Badge, Tag | variant="accent" |
color="primary" variant="solid" |
| Badge, Tag | variant="danger" |
color="critical" variant="solid" |
| Badge, Tag | variant="neutral" |
(default) |
| Alert | variant="info" | "success" | "warning" | "danger" |
color="primary" | "positive" | "warning" | "critical" |
| Toaster | apogeeToast(msg, { variant }) |
apogeeToast(msg, { color }), same mapping as Alert |
| Input | variant="floating" |
labelPosition="floating" |
| Input, Select, Textarea … | error (message) |
unchanged; add hasError to mark invalid without a message |
| Checkbox, Radio, Switch | — | gained size, hasError |
| Text | muted |
color="neutral-faded" |
| Text | size="sm" | "base" | "lg" |
size="small" | "medium" | "large" |
| Eyebrow | muted |
color="neutral-faded" |
| Container | size |
width (small | medium | large | xlarge | full) |
| Section | space="sm" | "md" | "lg" | "xl" |
spacing="small" | "medium" | "large" | "xlarge"; containerWidth |
| Dialog | variant="panel" position="end" |
position="end" |
| Dialog | variant="fullscreen" |
position="full-screen" |
| DataGrid column | align="left" | "right" |
align="start" | "end" |
| Card | — | gained raised, selected, padding |
| Link | — | gained color="primary" | "neutral" | "inherit" |
| NavLink | slots leading / trailing |
slots start / end |
| Stack | direction="col" |
direction="column" (0.4) |
| Progress, Slider, Rating, ProgressIndicator | — | gained color |
4. Typed props
Every component’s Props now extends Astro’s HTMLAttributes for its root
element. Unknown attributes still pass through, but a typo in a known one is a
type error under astro check. If you relied on the old [key: string]: any
escape hatch for a custom attribute, spread it from an object.
5. Check
npx astro check
npm run build
Then open your pages in both themes. The contrast gate covers the tokens; your own class combinations are yours to look at.