Base is the unmodified v2 Button (Button.tsx, button.css, stories). No changes yet; proposal changes go on top.
Icon, Spinner, Tally, Tooltip come from the published package. utils.tsx holds stand-ins for what it doesn't export (button types, StatusDot, extractText, mergeClasses); the port uses the real @libs/... imports and deletes it.
The package's own .pds-button CSS is also loaded (it ships index.css), so the local button.css overrides it by class name. Any rule removed from the local copy would still come through from the package.
renderedIcon is guarded on iconName because the published package types it as required.
Found in the v2 source, not changed: .pds-button--s sets -button-gap-inline (missing a dash), so its gap variable is never set for size s (inherits the base value, which happens to match).
Agentic is an isAgentic boolean modifier, not a variant or a separate component. Erika's design needs an agentic version of each variant (it layers on primary, secondary and others), so a single variant='agentic' could not combine with them, and a separate component would re-implement every variant. Replaces an earlier variant='agentic' attempt.
Supported on primary and secondary only (the two visible in the design); other variants warn in dev like tally/statusDot. Open: do subtle, critical, critical-secondary, reverse and reverse-secondary get the border, or only the spinner?
Border:--pds-gradient-ai-active (same token as pds-ai-active-border and the agentic Spinner). A gradient can't go in border-color, so the border is transparent, the gradient paints the border-box, and the fill layers sit on the padding-box. An opaque --pds-color-surface-default layer stops the gradient showing through translucent fills (secondary). Static, not animated. Open: animate?
Working spinner:isWorking passes color='agentic' to the Spinner when isAgentic. Imports ../Spinner/Spinner (the Spinner proposal), so that proposal must land first or together. isLoading clears the gradient so the pulse shows cleanly.
Agentic and tally/statusDot are not combined yet (they follow the variant lists).
No agentic link. The link variant has no border or fill for the gradient to attach to, and gradient text would hurt contrast. Out of scope; isAgentic on link warns in dev like the other unsupported variants.
Button group media query: v2's button.css uses @media (--pds-bp-m) (a custom media query). This repo has no postcss custom-media plugin, so the query was dropped and .pds-button-group stayed stacked at every width. The local copy uses (min-width: 768px) instead; the port restores (--pds-bp-m). A stacked group below 768px is v2's intended mobile behavior.
Button Group stories removed (ButtonGroup, ButtonGroupWithCancel, ButtonGroupInline). A group is layout around ordinary Buttons, which inherit isAgentic and every other option, so the proposal doesn't need to demo it. The .pds-button-group CSS is unchanged in button.css.