Token-driven button variants, radius tokens, and DRY component rendering. Customization now happens through token configuration — no component forks needed.
Added
radiustoken group (button/box) andTokens#radius/#radius!accessors.Tokens#button_style(variant)resolver and theTokens::ButtonStylevalue object: button variants (incl. an outline secondary) are now token-driven — set<variant>_text/<variant>_bordercolors instead of forking the component.- Box-scoped
info_box_background/info_box_border/info_box_texttokens (falling back to the page palette) plus a boxborder-radius. Tokens#load(group: {...})bulk-loader and a singleTokens#to_hsnapshot.
Changed
<button>and<cta>share abulletproof_button_tablescaffold;<cta>drops its hardcoded4pxradius in favor of theradiustoken.- The corner radius is now applied by default on
.button/.cta(the opt-in.radiusclass is gone);.button.secondary/.cta.secondarymirror the secondary color/border tokens. Cta/InfoBox#transformmarked overridable.
Fixed
- Outline secondary border no longer doubled on the nested anchor (cell-only).
- Dark mode keeps the secondary text readable on an outline (light) fill.
Removed
Tokens#colors/#fonts/#spacingsreaders — useTokens#to_hinstead.
Full Changelog: https://github.com/AdVitam/activemail/blob/master/CHANGELOG.md