Variant-driven buttons
A reusable button component should centralize its base geometry and expose a small set of variants. This keeps visual consistency across an application.
Separate variant from state
Color and visual emphasis are variant concerns. Disabled, loading and focus states are interaction concerns. Model both clearly so combinations remain predictable.
Do not expose every utility
A component API such as variant="primary" and size="sm" is easier for a team to understand than asking every developer to construct a class string manually.