Breaking changes planned for the next major version of Pluma.

This document outlines all planned breaking changes for the next major version of Pluma. These changes are designed to improve consistency, maintainability, and the overall developer experience.
| Change | Affected | Codemod |
|---|---|---|
| Long-hand size names removed | size prop on Button, ButtonGroup, ProgressBar, SegmentedControl, Select, TextField, Toggle | — |
| Short-hand token names removed | s token | — |
*Primitive → Plain* rename | PopoverPrimitive, ModalPrimitive | — |
| Component removals | ToggleButton, LabelIcon | — |
| Button variant consolidation | variant prop on Button, ButtonGroup | button-variant-rename |
| Event handler standardization | onChange → onCheckedChange on OptionCard, Radio, Checkbox | — |
| Deprecated props removed | Button.isError, Snackbar.isError, Banner warning variant, Popover.ariaLabel, DataTable sorting APIs | — |
| Icon sizing + deprecations | All icon usage | — |
Test helper get removed | PlumaTestHelpers | — |
Codemods are a "—" today for most of these — see codemods/ for what ships alongside this repo. Additional codemods for the remaining migrations are planned; as new ones land, this table will be updated.
Long hand size prop values will be removed in favor of shorter, more consistent alternatives:
medium → mdsmall → smlarge → lgAffected Components:
Button - size propButtonGroup - size propProgressBar - size propSegmentedControl - size propSelect - size propTextField - size propToggle - size propShort hand token names will be removed to improve clarity:
s → sm*Primitive Components to Plain*All components with the *Primitive suffix will be renamed to use the Plain* prefix for better clarity:
PopoverPrimitive → PlainPopoverModalPrimitive → PlainModalThis affects all related subcomponents and utilities as well.
The following components will be removed entirely:
ToggleButton - Remove without replacementLabelIcon - Remove in favor of CoinButton variants will be consolidated from four to three. The current secondary variant is removed; the remaining variants shift down a tier so the visual styles each variant produces stay continuous:
| Current variant | After the major |
|---|---|
primary | primary (unchanged) |
secondary | removed |
tertiary | secondary (now the default-looking, less-prominent button) |
subtle | tertiary (now the most muted variant) |
A codemod and two intermediate flags are available so consumer apps can complete this migration ahead of the major release without any visual regressions:
unsafe_withSoftDeprecatedSecondaryVariant on PlumaProvider's componentConfig.PlumaButton (or per-button). Every variant="secondary" button then renders with the current tertiary styles — the look the new secondary will have post-major.unsafe_withMigratedButtonVariants flag (also on PlumaProvider or per-button), then run the button-variant-rename codemod. The codemod renames tertiary → secondary and subtle → tertiary across .tsx/.jsx (jscodeshift) and .gts/.gjs/.hbs (Glimmer AST) files. With the flag on, the renamed source renders identically to before — no visual regressions.See the codemod README for the full migration order, running instructions, and limitations.
Several components will migrate to more consistent event handler naming:
Change onChange to onCheckedChange:
OptionCard.onChange → OptionCard.onCheckedChangeRadio.onChange → Radio.onCheckedChangeCheckbox.onChange → Checkbox.onCheckedChangeisError prop (use isDanger instead)isError prop (use variant="error" instead)warning variant (use caution instead)ariaLabel prop (use description instead){ id, desc } object form for sortingonSortingChange prop (use onChange in the sorting object instead)Various individual icons have been deprecated and will either be:
get functionWhen using PlumaTestHelpers, developers should not use the get function anymore. Instead they should use extract and find.
For more information, please visit the Test Helpers docs.
To prepare for these changes:
medium, small, large with md, sm, lgs with sm*Primitive to Plain*onChange to onCheckedChange where applicableLabelIcon usage to the Coin componentunsafe_withMigratedButtonVariants on PlumaProvider, then run the button-variant-rename codemod to rename tertiary → secondary and subtle → tertiary in your sourceget with extract or findWe recommend updating these incrementally and testing thoroughly. The old APIs will continue to work until the next major version is released.
If you have any questions about these changes or need help with migration, feel free to reach out in the #pluma channel on Slack.