Handoff: Agentic Split Button
What and why
A split button for actions the agent does: a primary action grouped with a menu of more actions, with the AI gradient as the border around the whole control (the primary action and the caret together). A separate component (decided 2026-10-21): a copy of the PDS v2 Split Button, always agentic, with the secondary look only (no variant, no primary version), like the Agentic Button. The existing Split Button needs no change.
- Figma / Jira: none. Source: the designer's request and decisions in design review.
- Context:
context.md
Exploration and decisions
- One border around the control, not on each half. The wrapper paints the gradient on its border-box (the Button's technique); the halves are a plain secondary Button and a plain Menu Button with their own borders removed.
- Same height as an Agentic Button. The wrapper's border adds two border widths, so in this state the halves are that much shorter (
--button-heightoverridden forsandm): the control is 32px and 40px high. - The separator between the halves keeps the secondary border color, not a gradient.
isAnimatedshimmers the border (opt-in; off for reduced motion).- Secondary only. Primary was built first and dropped to match the Agentic Button.
Full list: decisions.md.
API
The Split Button props (actionItems, size, iconName, placement, anchorToFullButton, moreActionsLabel, disabled, id, className) except variant, plus:
| Prop | Type | Default | Purpose |
|---|---|---|---|
isAnimated |
boolean |
false |
Shimmers the gradient border. Off for reduced motion. |
Variants and states: sizes s and m; with icon; disabled. Stories: Default, With Icon, Disabled, All Sizes.
Tokens used
--pds-animation-duration-ai-shimmer--pds-border-radius-button--pds-border-width-default--pds-color-button-secondary-background-default,--pds-color-button-secondary-border--pds-color-surface-default--pds-gradient-ai-active--pds-spacing-button-height-m,--pds-spacing-button-height-s--pds-spacing-m,--pds-spacing-s
Impact
From impact.md: no existing PDS component is reached. The opt-in rules are scoped to .pds-agentic-split-button. No other proposal builds on it.
Reused vs net-new
- Reused: the Split Button markup and CSS (copied), the package's
ButtonLink, the local baseButton(_base/Button) andMenuButton. - Net-new:
.pds-agentic-split-buttonand--animated, theisAnimatedprop, and two custom variables. Seecustom.md(no raw values).
Accessibility
- Unchanged from the Split Button: two buttons (the primary action and "More actions"), the Menu Button's menu semantics and keyboard behavior.
- The gradient border is decorative.
- The a11y panel has not been run, and light and dark were not checked by eye in a session.
Decisions and open questions
- Should the divider between the halves also be a gradient?
- Should the primary action have a working state (the Button's
isWorking)? - Is a primary version needed later?
Port notes
- New component next to the Split Button (
src/components/buttons/), vianpm run generate:component. It uses the published PDS Button and Menu Button (the local base copies are inproposals/_base/). Swap the localmergeClassesfor the real one.
Preview
npm run storybook, then Component Proposals/Buttons/Agentic Split Button. Figma: none yet.