Skip to content

feat(pickerbutton): migrate to s2 #4114

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Aug 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .changeset/few-candles-sniff.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
"@spectrum-css/pickerbutton": major
---

The picker button component has been migrated to Spectrum 2. The picker button uses the same design spec as infield button and in some cases may be able to be used interchangeably with it. Its updated features include:

- Corner rounding updates - corner rounding differs by the component's t-shirt size, but otherwise is a standard size. This means that the rounded variant of picker button with increased corner rounding and the position variants of picker button that helped the picker button fit snugly within either side of an input have been removed.
- Color and spacing updates to match S2 spec
- Added WHCM support
- Updated S2 down state
- Removed focus styles: there are no spec'd focus styles in S2, therefore these styles have been removed.
- The label variant of picker button has been removed.
- Removal of `.spectrum-PickerButton--uiicononly`, `.spectrum-PickerButton--icononly`, and `.spectrum-PickerButton--textuiicon` classes:
- The picker button featuring a UI icon is the default variant, so no additional `.spectrum-PickerButton--uiicononly` class needs to be applied.
- The `.spectrum-PickerButton--icononly` class has been renamed to `.spectrum-PickerButton--workflowicon` to clarify when it should be used. Applying `.spectrum-PickerButton--workflowicon` when using a workflow icon instead is recommended, but probably not required.
- Because the picker button no longer supports a label, there is no need for a `--textuiicon` variant which is why that class has been removed.
- The `.is-open` state can continue to be used as before.

Added mod custom properties:

- `--mod-picker-button-background-color-quiet-disabled`

Removed mod custom properties:

- `--mod-picker-button-background-color-key-focus`
- `--mod-picker-button-background-color-key-focus-quiet`
- `--mod-picker-button-border-color`
- `--mod-picker-button-border-color-disabled`
- `--mod-picker-button-border-color-quiet`
- `--mod-picker-button-border-radius-rounded`
- `--mod-picker-button-border-radius-rounded-sided`
- `--mod-picker-button-border-radius-sided`
- `--mod-picker-button-border-width`
- `--mod-picker-button-font-color`
- `--mod-picker-button-font-color-disabled`
- `--mod-picker-button-font-color-down`
- `--mod-picker-button-font-color-down-disabled`
- `--mod-picker-button-font-color-hover`
- `--mod-picker-button-font-color-hover-disabled`
- `--mod-picker-button-font-color-key-focus`
- `--mod-picker-button-font-family`
- `--mod-picker-button-font-size`
- `--mod-picker-button-font-style`
- `--mod-picker-button-font-weight`
- `--mod-picker-button-gap`
- `--mod-picker-button-icon-color-key-focus`
- `--mod-picker-button-label-padding`
9 changes: 9 additions & 0 deletions .changeset/green-falcons-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@spectrum-css/infieldbutton": patch
---

Remove unused key-focus and border mods. Note that border and key focus styles were previously removed in the migration to Spectrum 2, and the mod removals here do not have any visual impact to the infield button.

Also updates transition to use `background-color` instead of `border-color`.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it helpful to mention that mods were removed? is that a breaking change though? If it is, would this be a "major" bump instead of a patch?

Copy link
Collaborator Author

@rise-erpelding rise-erpelding Aug 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They were all unused, so technically they would have stopped working with the last major bump, even though they were still declared in the file. To me that's why it feels less relevant to name them, but I'm open to other arguments.

But I'm wondering if I need to be a little clearer that this isn't where key-focus and border have been removed, because upon first glance that does make it sound like a major change. I'll add something to the changeset here.

Also fixes a flash bug in WHCM: when hovered, the infield button was flashing/blinking before changing to the appropriate hover color.
4 changes: 2 additions & 2 deletions components/datepicker/stories/template.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,12 @@ export const DatePicker = ({
},
}, context))}
${PickerButton({
customClasses: [`${rootClass}-button`],
customClasses: [`${rootClass}-button`, "spectrum-PickerButton--workflowicon"],
size: "m",
iconName: "Calendar",
iconSet: "workflow",
isQuiet,
customStyles: isReadOnly ? { "display": "none" } : undefined,
customStyles: isReadOnly ? { "display": "none" } : { "--mod-icon-size": "var(--spectrum-workflow-icon-size-50)" },
// @todo this is not added to the button on the website; need to make sure it's not a bug
// isOpen,
isInvalid,
Expand Down
7 changes: 0 additions & 7 deletions components/infieldbutton/dist/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,8 @@
"--mod-infield-button-background-color-hover",
"--mod-infield-button-background-color-hover-disabled",
"--mod-infield-button-background-color-hover-quiet",
"--mod-infield-button-background-color-key-focus",
"--mod-infield-button-background-color-key-focus-quiet",
"--mod-infield-button-background-color-quiet",
"--mod-infield-button-background-color-quiet-disabled",
"--mod-infield-button-border-color",
"--mod-infield-button-border-color-disabled",
"--mod-infield-button-border-color-quiet-disabled",
"--mod-infield-button-border-radius",
"--mod-infield-button-edge-to-fill",
"--mod-infield-button-field-edge-to-icon",
Expand All @@ -53,8 +48,6 @@
"--mod-infield-button-icon-color-down-disabled",
"--mod-infield-button-icon-color-hover",
"--mod-infield-button-icon-color-hover-disabled",
"--mod-infield-button-icon-color-key-focus",
"--mod-infield-button-icon-color-key-focus-disabled",
"--mod-infield-button-side-edge-to-fill",
"--mod-infield-button-width"
],
Expand Down
8 changes: 2 additions & 6 deletions components/infieldbutton/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,9 @@
--mod-infield-button-background-color-hover: var(--mod-infield-button-background-color-hover-disabled, var(--spectrum-disabled-background-color));
--mod-infield-button-background-color-down: var(--mod-infield-button-background-color-down-disabled, var(--spectrum-disabled-background-color));

--mod-infield-button-border-color: var(--mod-infield-button-border-color-disabled, var(--spectrum-disabled-background-color));

--mod-infield-button-icon-color: var(--mod-infield-button-icon-color-disabled, var(--spectrum-disabled-content-color));
--mod-infield-button-icon-color-hover: var(--mod-infield-button-icon-color-hover-disabled, var(--spectrum-disabled-content-color));
--mod-infield-button-icon-color-down: var(--mod-infield-button-icon-color-down-disabled, var(--spectrum-disabled-content-color));
--mod-infield-button-icon-color-key-focus: var(--mod-infield-button-icon-color-key-focus-disabled, var(--spectrum-disabled-content-color));
}

&.spectrum-InfieldButton--sizeS {
Expand Down Expand Up @@ -87,11 +84,9 @@
--mod-infield-button-background-color: var(--mod-infield-button-background-color-quiet, transparent);
--mod-infield-button-background-color-hover: var(--mod-infield-button-background-color-hover-quiet, transparent);
--mod-infield-button-background-color-down: var(--mod-infield-button-background-color-down-quiet, transparent);
--mod-infield-button-background-color-key-focus: var(--mod-infield-button-background-color-key-focus-quiet, transparent);

&:disabled {
--mod-infield-button-background-color: var(--mod-infield-button-background-color-quiet-disabled, transparent);
--mod-infield-button-border-color: var(--mod-infield-button-border-color-quiet-disabled, transparent);
}
}

Expand Down Expand Up @@ -161,7 +156,7 @@
align-items: center;
justify-content: var(--mod-infield-button-fill-justify-content, var(--spectrum-infield-button-fill-justify-content));

transition: border-color var(--spectrum-animation-duration-100) ease-in-out;
transition: background-color var(--spectrum-animation-duration-100) ease-in-out;
}

.spectrum-InfieldButton-icon {
Expand All @@ -181,6 +176,7 @@
.spectrum-InfieldButton {
--highcontrast-infield-button-background-color: ButtonText;
--highcontrast-infield-button-icon-color: ButtonFace;
forced-color-adjust: none; /* keeps button from flashing when hovered */

&:disabled {
--highcontrast-infield-button-background-color: GrayText;
Expand Down
4 changes: 0 additions & 4 deletions components/infieldbutton/stories/template.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ export const Template = (
iconName = "ChevronDown",
iconSet = "ui",
isDisabled,
isInvalid,
isHovered,
isActive,
isInline,
Expand All @@ -38,7 +37,6 @@ export const Template = (
[`${rootClass}--size${size?.toUpperCase()}`]:
typeof size !== "undefined",
[`${rootClass}--quiet`]: isQuiet,
"is-invalid": isInvalid,
"is-hover": isHovered,
"is-active": isActive,
...customClasses.reduce((a, c) => ({ ...a, [c]: true }), {}),
Expand Down Expand Up @@ -68,7 +66,6 @@ export const Template = (
[`${rootClass}--size${size?.toUpperCase()}`]:
typeof size !== "undefined",
[`${rootClass}--quiet`]: isQuiet,
"is-invalid": isInvalid,
"is-hover": isHovered,
"is-active": isActive,
...customClasses.reduce((a, c) => ({ ...a, [c]: true }), {}),
Expand Down Expand Up @@ -101,7 +98,6 @@ export const Template = (
[`${rootClass}--size${size?.toUpperCase()}`]:
typeof size !== "undefined",
[`${rootClass}--quiet`]: isQuiet,
"is-invalid": isInvalid,
"is-hover": isHovered,
"is-active": isActive,
...customClasses.reduce((a, c) => ({ ...a, [c]: true }), {}),
Expand Down
102 changes: 30 additions & 72 deletions components/pickerbutton/dist/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,27 @@
"sourceFile": "index.css",
"selectors": [
".spectrum-PickerButton",
".spectrum-PickerButton--left .spectrum-PickerButton-fill",
".spectrum-PickerButton--left.spectrum-PickerButton--rounded .spectrum-PickerButton-fill",
".spectrum-PickerButton--right .spectrum-PickerButton-fill",
".spectrum-PickerButton--right.spectrum-PickerButton--rounded .spectrum-PickerButton-fill",
".spectrum-PickerButton--rounded .spectrum-PickerButton-fill",
".spectrum-PickerButton--textuiicon .spectrum-PickerButton-fill",
".spectrum-PickerButton--uiicononly .spectrum-PickerButton-fill",
".spectrum-PickerButton--uiicononly .spectrum-PickerButton-label",
".spectrum-PickerButton--quiet",
".spectrum-PickerButton--quiet:disabled",
".spectrum-PickerButton--quiet:not(:disabled):active",
".spectrum-PickerButton--quiet:not(:disabled):focus-visible",
".spectrum-PickerButton--quiet:not(:disabled):hover",
".spectrum-PickerButton--workflowicon .spectrum-PickerButton-fill",
".spectrum-PickerButton-fill",
".spectrum-PickerButton-icon",
".spectrum-PickerButton-label",
".spectrum-PickerButton.is-focused",
".spectrum-PickerButton.is-keyboardFocused",
".spectrum-PickerButton.is-open",
".spectrum-PickerButton.spectrum-PickerButton--quiet",
".spectrum-PickerButton.spectrum-PickerButton--quiet:disabled",
".spectrum-PickerButton.spectrum-PickerButton--sizeL",
".spectrum-PickerButton.spectrum-PickerButton--sizeS",
".spectrum-PickerButton.spectrum-PickerButton--sizeXL",
".spectrum-PickerButton.spectrum-PickerButton--uiicononly",
".spectrum-PickerButton:active",
".spectrum-PickerButton:disabled",
".spectrum-PickerButton:focus",
".spectrum-PickerButton:focus-visible",
".spectrum-PickerButton:hover"
".spectrum-PickerButton:hover",
".spectrum-PickerButton:not(:disabled):active",
".spectrum-PickerButton:not(:disabled):focus-visible",
".spectrum-PickerButton:not(:disabled):hover"
],
"modifiers": [
"--mod-picker-button-background-animation-duration",
Expand All @@ -37,39 +34,17 @@
"--mod-picker-button-background-color-hover",
"--mod-picker-button-background-color-hover-disabled",
"--mod-picker-button-background-color-hover-quiet",
"--mod-picker-button-background-color-key-focus",
"--mod-picker-button-background-color-key-focus-quiet",
"--mod-picker-button-background-color-quiet",
"--mod-picker-button-border-color",
"--mod-picker-button-border-color-disabled",
"--mod-picker-button-border-color-quiet",
"--mod-picker-button-background-color-quiet-disabled",
"--mod-picker-button-border-radius",
"--mod-picker-button-border-radius-rounded",
"--mod-picker-button-border-radius-rounded-sided",
"--mod-picker-button-border-radius-sided",
"--mod-picker-button-border-width",
"--mod-picker-button-fill-padding",
"--mod-picker-button-font-color",
"--mod-picker-button-font-color-disabled",
"--mod-picker-button-font-color-down",
"--mod-picker-button-font-color-down-disabled",
"--mod-picker-button-font-color-hover",
"--mod-picker-button-font-color-hover-disabled",
"--mod-picker-button-font-color-key-focus",
"--mod-picker-button-font-family",
"--mod-picker-button-font-size",
"--mod-picker-button-font-style",
"--mod-picker-button-font-weight",
"--mod-picker-button-gap",
"--mod-picker-button-height",
"--mod-picker-button-icon-color",
"--mod-picker-button-icon-color-disabled",
"--mod-picker-button-icon-color-down",
"--mod-picker-button-icon-color-down-disabled",
"--mod-picker-button-icon-color-hover",
"--mod-picker-button-icon-color-hover-disabled",
"--mod-picker-button-icon-color-key-focus",
"--mod-picker-button-label-padding",
"--mod-picker-button-padding",
"--mod-picker-button-width"
],
Expand All @@ -78,66 +53,49 @@
"--spectrum-picker-button-background-color",
"--spectrum-picker-button-background-color-down",
"--spectrum-picker-button-background-color-hover",
"--spectrum-picker-button-background-color-key-focus",
"--spectrum-picker-button-border-color",
"--spectrum-picker-button-border-radius",
"--spectrum-picker-button-border-radius-rounded",
"--spectrum-picker-button-border-radius-rounded-sided",
"--spectrum-picker-button-border-radius-sided",
"--spectrum-picker-button-border-width",
"--spectrum-picker-button-downstate-perspective",
"--spectrum-picker-button-fill-padding",
"--spectrum-picker-button-font-color",
"--spectrum-picker-button-font-color-down",
"--spectrum-picker-button-font-color-hover",
"--spectrum-picker-button-font-color-key-focus",
"--spectrum-picker-button-font-family",
"--spectrum-picker-button-font-size",
"--spectrum-picker-button-font-style",
"--spectrum-picker-button-font-weight",
"--spectrum-picker-button-gap",
"--spectrum-picker-button-height",
"--spectrum-picker-button-icon-color",
"--spectrum-picker-button-icon-color-down",
"--spectrum-picker-button-icon-color-hover",
"--spectrum-picker-button-icon-color-key-focus",
"--spectrum-picker-button-label-padding",
"--spectrum-picker-button-padding",
"--spectrum-picker-button-width"
],
"global": [
"--spectrum-animation-duration-100",
"--spectrum-body-sans-serif-font-weight",
"--spectrum-border-width-100",
"--spectrum-component-height-100",
"--spectrum-component-height-200",
"--spectrum-component-height-300",
"--spectrum-component-height-75",
"--spectrum-corner-radius-100",
"--spectrum-corner-radius-200",
"--spectrum-default-font-style",
"--spectrum-component-size-difference-down",
"--spectrum-component-size-width-ratio-down",
"--spectrum-corner-radius-small-size-extra-large",
"--spectrum-corner-radius-small-size-large",
"--spectrum-corner-radius-small-size-medium",
"--spectrum-corner-radius-small-size-small",
"--spectrum-disabled-background-color",
"--spectrum-disabled-content-color",
"--spectrum-downstate-height",
"--spectrum-downstate-width",
"--spectrum-field-edge-to-disclosure-icon-100",
"--spectrum-field-edge-to-disclosure-icon-200",
"--spectrum-field-edge-to-disclosure-icon-300",
"--spectrum-field-edge-to-disclosure-icon-75",
"--spectrum-font-size-100",
"--spectrum-font-size-200",
"--spectrum-font-size-300",
"--spectrum-font-size-75",
"--spectrum-gray-100",
"--spectrum-gray-200",
"--spectrum-gray-50",
"--spectrum-in-field-button-edge-to-fill-extra-large",
"--spectrum-in-field-button-edge-to-fill-large",
"--spectrum-in-field-button-edge-to-fill-medium",
"--spectrum-in-field-button-edge-to-fill-small",
"--spectrum-neutral-content-color-default",
"--spectrum-neutral-content-color-down",
"--spectrum-neutral-content-color-hover",
"--spectrum-neutral-content-color-key-focus",
"--spectrum-sans-font-family-stack",
"--spectrum-spacing-75",
"--spectrum-text-to-visual-200",
"--spectrum-text-to-visual-300",
"--spectrum-text-to-visual-50"
"--spectrum-neutral-content-color-hover"
],
"passthroughs": [],
"high-contrast": []
"high-contrast": [
"--highcontrast-picker-button-background-color",
"--highcontrast-picker-button-icon-color"
]
}
Loading
Loading