What changed in S2?
Spectrum 2 introduces a new visual language, updated design tokens, a consolidated package structure, and new components. It's a breaking change — but a gradual migration is possible by running v3 and S2 side by side.
New package
S2 ships as a single @react-spectrum/s2 package instead of the per-component packages in v3.
New design tokens
Design tokens are generated from the new Spectrum 2 system using the style() macro instead of CSS modules.
Updated props
Some prop names and component APIs have changed (e.g. variant replaces isQuiet/isEmphasized on ActionButton).
Migration steps
Install the S2 package alongside v3
S2 uses a single package. You can install it without removing v3 to allow gradual migration.
npm install @react-spectrum/s2
Update imports
S2 exports components from the top-level package. Update your import paths:
v3 (before)
import {Button} from '@adobe/react-spectrum'; import {ComboBox} from '@react-spectrum/combobox';
S2 (after)
import {Button} from '@react-spectrum/s2'; import {ComboBox} from '@react-spectrum/s2';
Update ActionButton props
ActionButton's isQuiet and isEmphasized props are replaced by a unified variant:
v3
<ActionButton isEmphasized> Edit </ActionButton>
S2
<ActionButton variant="accent"> Edit </ActionButton>
Adopt the style() macro
S2 uses a Parcel / webpack / Vite macro for design tokens. Instead of inline style props or CSS modules, wrap your styles with style():
import {style} from '@react-spectrum/s2/style' with {type: 'macro'}; <Button styles={style({marginTop: 'size-100'})}> Save </Button>
Test both providers side by side
Wrap S2 components in Provider from @react-spectrum/s2. You can keep v3's Provider for unchanged components.