From 661e69c11ff4c92debee3e3dcd4db5d84942de8a Mon Sep 17 00:00:00 2001 From: Melissa Thompson Date: Mon, 15 Apr 2024 17:47:58 -0400 Subject: [PATCH 01/27] feat(actionbutton): s2 migration Migrates the action button component to spectrum 2, using updated and new design token specs. Includes down state transform, removal of medium class, changes to mod custom properties, and storybook updates. --- .changeset/chilled-peaches-enjoy.md | 27 + components/actionbutton/dist/metadata.json | 94 ++-- components/actionbutton/index.css | 506 ++++++++---------- .../stories/actionbutton.stories.js | 13 +- components/actionbutton/stories/template.js | 25 +- 5 files changed, 317 insertions(+), 348 deletions(-) create mode 100644 .changeset/chilled-peaches-enjoy.md diff --git a/.changeset/chilled-peaches-enjoy.md b/.changeset/chilled-peaches-enjoy.md new file mode 100644 index 00000000000..59416b1cfb7 --- /dev/null +++ b/.changeset/chilled-peaches-enjoy.md @@ -0,0 +1,27 @@ +--- +"@spectrum-css/actionbutton": major +--- + +feat(actionbutton): S2 migration + +Action button now uses Spectrum 2 tokens and design specifications. A few notable changes: + +- Medium is now the default size and `.spectrum-Switch--sizeM` has been removed. +- Includes the Spectrum 2 down state transform. +- The component border was not removed and its color was changed to `transparent` in order to continue support for Windows High Contrast / forced colors, which still shows a border. The mod custom properties for border were removed to avoid interference with Windows High Contrast / forced colors accessibility. +- Background and content colors were updated. +- Mod custom properties have been adjusted: + - Renamed: + - `--mod-line-height-100` renamed to `--mod-button-line-height`. + - `--mod-sans-font-family-stack` renamed to `--mod-button-font-family`. + - `--mod-animation-duration-100` renamed to `--mod-button-animation-duration`. + - Removed: + - `--mod-actionbutton-border-color-default` + - `--mod-actionbutton-border-color-disabled` + - `--mod-actionbutton-border-color-down` + - `--mod-actionbutton-border-color-focus` + - `--mod-actionbutton-border-color-hover` + - `--mod-actionbutton-border-width` + - `--mod-actionbutton-static-content-color` + - New: + - `--mod-actionbutton-font-weight` diff --git a/components/actionbutton/dist/metadata.json b/components/actionbutton/dist/metadata.json index 06487511be1..e2156b2e252 100644 --- a/components/actionbutton/dist/metadata.json +++ b/components/actionbutton/dist/metadata.json @@ -14,25 +14,17 @@ ".spectrum-ActionButton-label:empty", ".spectrum-ActionButton.is-disabled", ".spectrum-ActionButton.is-selected", - ".spectrum-ActionButton.is-selected .is-disabled.spectrum-ActionButton--staticBlack", - ".spectrum-ActionButton.is-selected .is-disabled.spectrum-ActionButton--staticWhite", ".spectrum-ActionButton.is-selected .spectrum-ActionButton-hold", ".spectrum-ActionButton.is-selected .spectrum-ActionButton-icon", ".spectrum-ActionButton.is-selected .spectrum-ActionButton-label", - ".spectrum-ActionButton.is-selected.spectrum-ActionButton--emphasized:not(.spectrum-ActionButton--staticBlack, .spectrum-ActionButton--staticWhite)", - ".spectrum-ActionButton.is-selected.spectrum-ActionButton--staticBlack:disabled", - ".spectrum-ActionButton.is-selected.spectrum-ActionButton--staticWhite:disabled", + ".spectrum-ActionButton.is-selected.spectrum-ActionButton--emphasized", + ".spectrum-ActionButton.is-selected.spectrum-ActionButton--staticBlack", + ".spectrum-ActionButton.is-selected.spectrum-ActionButton--staticWhite", ".spectrum-ActionButton.spectrum-ActionButton--quiet", - ".spectrum-ActionButton.spectrum-ActionButton--quiet.is-disabled:not(.is-selected)", - ".spectrum-ActionButton.spectrum-ActionButton--quiet:disabled:not(.is-selected)", ".spectrum-ActionButton.spectrum-ActionButton--staticBlack", - ".spectrum-ActionButton.spectrum-ActionButton--staticBlack .is-disabled", ".spectrum-ActionButton.spectrum-ActionButton--staticBlack.spectrum-ActionButton--quiet", - ".spectrum-ActionButton.spectrum-ActionButton--staticBlack:disabled", ".spectrum-ActionButton.spectrum-ActionButton--staticWhite", - ".spectrum-ActionButton.spectrum-ActionButton--staticWhite .is-disabled", ".spectrum-ActionButton.spectrum-ActionButton--staticWhite.spectrum-ActionButton--quiet", - ".spectrum-ActionButton.spectrum-ActionButton--staticWhite:disabled", ".spectrum-ActionButton::-moz-focus-inner", ".spectrum-ActionButton:active", ".spectrum-ActionButton:after", @@ -48,22 +40,32 @@ "modifiers": [ "--mod-actionbutton-animation-duration", "--mod-actionbutton-background-color-default", + "--mod-actionbutton-background-color-default-selected", + "--mod-actionbutton-background-color-default-selected-emphasized", "--mod-actionbutton-background-color-disabled", "--mod-actionbutton-background-color-down", + "--mod-actionbutton-background-color-down-selected", + "--mod-actionbutton-background-color-down-selected-emphasized", "--mod-actionbutton-background-color-focus", + "--mod-actionbutton-background-color-focus-selected", + "--mod-actionbutton-background-color-focus-selected-emphasized", "--mod-actionbutton-background-color-hover", - "--mod-actionbutton-border-color-default", - "--mod-actionbutton-border-color-disabled", - "--mod-actionbutton-border-color-down", - "--mod-actionbutton-border-color-focus", - "--mod-actionbutton-border-color-hover", + "--mod-actionbutton-background-color-hover-selected", + "--mod-actionbutton-background-color-hover-selected-emphasized", "--mod-actionbutton-border-radius", - "--mod-actionbutton-border-width", "--mod-actionbutton-content-color-default", + "--mod-actionbutton-content-color-default-selected", + "--mod-actionbutton-content-color-default-selected-emphasized", "--mod-actionbutton-content-color-disabled", "--mod-actionbutton-content-color-down", + "--mod-actionbutton-content-color-down-selected", + "--mod-actionbutton-content-color-down-selected-emphasized", "--mod-actionbutton-content-color-focus", + "--mod-actionbutton-content-color-focus-selected", + "--mod-actionbutton-content-color-focus-selected-emphasized", "--mod-actionbutton-content-color-hover", + "--mod-actionbutton-content-color-hover-selected", + "--mod-actionbutton-content-color-hover-selected-emphasized", "--mod-actionbutton-edge-to-hold-icon", "--mod-actionbutton-edge-to-text", "--mod-actionbutton-edge-to-visual", @@ -71,13 +73,14 @@ "--mod-actionbutton-focus-indicator-border-radius", "--mod-actionbutton-focus-indicator-color", "--mod-actionbutton-focus-indicator-gap", + "--mod-actionbutton-focus-indicator-thickness", + "--mod-actionbutton-font-size", + "--mod-actionbutton-font-weight", "--mod-actionbutton-height", "--mod-actionbutton-icon-size", "--mod-actionbutton-label-color", "--mod-actionbutton-min-width", - "--mod-actionbutton-text-to-visual", - "--mod-disabled-background-color", - "--mod-disabled-content-color" + "--mod-actionbutton-text-to-visual" ], "component": [ "--spectrum-action-button-edge-to-hold-icon-extra-large", @@ -91,16 +94,7 @@ "--spectrum-actionbutton-background-color-down", "--spectrum-actionbutton-background-color-focus", "--spectrum-actionbutton-background-color-hover", - "--spectrum-actionbutton-background-color-selected", - "--spectrum-actionbutton-background-color-selected-disabled", - "--spectrum-actionbutton-background-color-selected-down", - "--spectrum-actionbutton-background-color-selected-focus", - "--spectrum-actionbutton-background-color-selected-hover", - "--spectrum-actionbutton-border-color-default", - "--spectrum-actionbutton-border-color-disabled", - "--spectrum-actionbutton-border-color-down", - "--spectrum-actionbutton-border-color-focus", - "--spectrum-actionbutton-border-color-hover", + "--spectrum-actionbutton-border-color", "--spectrum-actionbutton-border-radius", "--spectrum-actionbutton-border-width", "--spectrum-actionbutton-content-color-default", @@ -108,7 +102,7 @@ "--spectrum-actionbutton-content-color-down", "--spectrum-actionbutton-content-color-focus", "--spectrum-actionbutton-content-color-hover", - "--spectrum-actionbutton-content-color-selected", + "--spectrum-actionbutton-downstate-perspective", "--spectrum-actionbutton-edge-to-hold-icon", "--spectrum-actionbutton-edge-to-text", "--spectrum-actionbutton-edge-to-visual", @@ -118,6 +112,7 @@ "--spectrum-actionbutton-focus-indicator-gap", "--spectrum-actionbutton-focus-indicator-thickness", "--spectrum-actionbutton-font-size", + "--spectrum-actionbutton-font-weight", "--spectrum-actionbutton-height", "--spectrum-actionbutton-icon-size", "--spectrum-actionbutton-min-width", @@ -129,6 +124,7 @@ "--spectrum-accent-background-color-hover", "--spectrum-accent-background-color-key-focus", "--spectrum-animation-duration-100", + "--spectrum-black", "--spectrum-border-width-100", "--spectrum-component-edge-to-text-100", "--spectrum-component-edge-to-text-200", @@ -150,14 +146,22 @@ "--spectrum-component-height-300", "--spectrum-component-height-50", "--spectrum-component-height-75", + "--spectrum-component-size-difference-down", + "--spectrum-component-size-minimum-perspective-down", + "--spectrum-component-size-width-ratio-down", "--spectrum-corner-radius-medium-size-extra-large", "--spectrum-corner-radius-medium-size-extra-small", "--spectrum-corner-radius-medium-size-large", "--spectrum-corner-radius-medium-size-medium", "--spectrum-corner-radius-medium-size-small", "--spectrum-disabled-background-color", - "--spectrum-disabled-border-color", "--spectrum-disabled-content-color", + "--spectrum-disabled-static-black-background-color", + "--spectrum-disabled-static-black-content-color", + "--spectrum-disabled-static-white-background-color", + "--spectrum-disabled-static-white-content-color", + "--spectrum-downstate-height", + "--spectrum-downstate-width", "--spectrum-focus-indicator-color", "--spectrum-focus-indicator-gap", "--spectrum-focus-indicator-thickness", @@ -169,12 +173,9 @@ "--spectrum-gray-100", "--spectrum-gray-200", "--spectrum-gray-25", - "--spectrum-gray-400", - "--spectrum-gray-50", - "--spectrum-gray-500", - "--spectrum-gray-600", "--spectrum-line-height-100", "--spectrum-logical-rotation", + "--spectrum-medium-font-weight", "--spectrum-neutral-background-color-selected-default", "--spectrum-neutral-background-color-selected-down", "--spectrum-neutral-background-color-selected-hover", @@ -193,14 +194,14 @@ "--spectrum-text-to-visual-75", "--spectrum-transparent-black-100", "--spectrum-transparent-black-200", - "--spectrum-transparent-black-500", - "--spectrum-transparent-black-600", - "--spectrum-transparent-black-700", + "--spectrum-transparent-black-25", + "--spectrum-transparent-black-800", + "--spectrum-transparent-black-900", "--spectrum-transparent-white-100", "--spectrum-transparent-white-200", - "--spectrum-transparent-white-500", - "--spectrum-transparent-white-600", - "--spectrum-transparent-white-700", + "--spectrum-transparent-white-25", + "--spectrum-transparent-white-800", + "--spectrum-transparent-white-900", "--spectrum-white", "--spectrum-workflow-icon-size-100", "--spectrum-workflow-icon-size-200", @@ -219,15 +220,12 @@ "--highcontrast-actionbutton-background-color-down", "--highcontrast-actionbutton-background-color-focus", "--highcontrast-actionbutton-background-color-hover", - "--highcontrast-actionbutton-border-color-default", - "--highcontrast-actionbutton-border-color-disabled", - "--highcontrast-actionbutton-border-color-down", - "--highcontrast-actionbutton-border-color-focus", - "--highcontrast-actionbutton-border-color-hover", + "--highcontrast-actionbutton-border-color", "--highcontrast-actionbutton-content-color-default", "--highcontrast-actionbutton-content-color-disabled", "--highcontrast-actionbutton-content-color-down", "--highcontrast-actionbutton-content-color-focus", - "--highcontrast-actionbutton-content-color-hover" + "--highcontrast-actionbutton-content-color-hover", + "--highcontrast-actionbutton-focus-indicator-color" ] } diff --git a/components/actionbutton/index.css b/components/actionbutton/index.css index bcf9af21804..0ac5f2cd041 100644 --- a/components/actionbutton/index.css +++ b/components/actionbutton/index.css @@ -1,426 +1,340 @@ /*! - * Copyright 2024 Adobe. All rights reserved. - * - * This file is licensed to you under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. You may obtain a copy - * of the License at - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS - * OF ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - */ +Copyright 2024 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ + +@import "@spectrum-css/commons/basebutton.css"; .spectrum-ActionButton { - --spectrum-actionbutton-background-color-default: var(--highcontrast-actionbutton-background-color-default, var(--mod-actionbutton-background-color-default, var(--spectrum-gray-50))); - --spectrum-actionbutton-background-color-hover: var(--highcontrast-actionbutton-background-color-hover, var(--mod-actionbutton-background-color-hover, var(--spectrum-gray-100))); - --spectrum-actionbutton-background-color-down: var(--highcontrast-actionbutton-background-color-down, var(--mod-actionbutton-background-color-down, var(--spectrum-gray-200))); - --spectrum-actionbutton-background-color-focus: var(--highcontrast-actionbutton-background-color-focus, var(--mod-actionbutton-background-color-focus, var(--spectrum-gray-100))); - --spectrum-actionbutton-background-color-selected-disabled: var(--spectrum-transparent-black-100); - - --spectrum-actionbutton-background-color-selected: var(--spectrum-neutral-background-color-selected-default); - --spectrum-actionbutton-background-color-selected-hover: var(--spectrum-neutral-background-color-selected-hover); - --spectrum-actionbutton-background-color-selected-down: var(--spectrum-neutral-background-color-selected-down); - --spectrum-actionbutton-background-color-selected-focus: var(--spectrum-neutral-background-color-selected-key-focus); - - --spectrum-actionbutton-border-color-default: var(--highcontrast-actionbutton-border-color-default, var(--mod-actionbutton-border-color-default, var(--spectrum-gray-400))); - --spectrum-actionbutton-border-color-hover: var(--highcontrast-actionbutton-border-color-hover, var(--mod-actionbutton-border-color-hover, var(--spectrum-gray-500))); - --spectrum-actionbutton-border-color-down: var(--highcontrast-actionbutton-border-color-down, var(--mod-actionbutton-border-color-down, var(--spectrum-gray-600))); - --spectrum-actionbutton-border-color-focus: var(--highcontrast-actionbutton-border-color-focus, var(--mod-actionbutton-border-color-focus, var(--spectrum-gray-500))); - --spectrum-actionbutton-border-color-disabled: var(--spectrum-disabled-border-color); - - --spectrum-actionbutton-content-color-selected: var(--spectrum-gray-25); - --spectrum-actionbutton-content-color-disabled: var(--mod-disabled-content-color, var(--spectrum-disabled-content-color)); - --spectrum-actionbutton-background-color-disabled: var(--mod-disabled-background-color, var(--spectrum-disabled-background-color)); - - --spectrum-actionbutton-animation-duration: var(--mod-actionbutton-animation-duration, var(--spectrum-animation-duration-100)); - --spectrum-actionbutton-border-radius: var(--mod-actionbutton-border-radius, var(--spectrum-corner-radius-medium-size-medium)); - --spectrum-actionbutton-border-width: var(--mod-actionbutton-border-width, var(--spectrum-border-width-100)); - - --spectrum-actionbutton-content-color-default: var(--highcontrast-actionbutton-content-color-default, var(--mod-actionbutton-content-color-default, var(--spectrum-neutral-content-color-default))); - --spectrum-actionbutton-content-color-hover: var(--highcontrast-actionbutton-content-color-hover, var(--mod-actionbutton-content-color-hover, var(--spectrum-neutral-content-color-hover))); - --spectrum-actionbutton-content-color-down: var(--highcontrast-actionbutton-content-color-down, var(--mod-actionbutton-content-color-down, var(--spectrum-neutral-content-color-down))); - --spectrum-actionbutton-content-color-focus: var(--highcontrast-actionbutton-content-color-focus, var(--mod-actionbutton-content-color-focus, var(--spectrum-neutral-content-color-key-focus))); - - --spectrum-actionbutton-focus-indicator-gap: var(--mod-actionbutton-focus-indicator-gap, var(--spectrum-focus-indicator-gap)); + --spectrum-actionbutton-animation-duration: var(--spectrum-animation-duration-100); + --spectrum-actionbutton-border-radius: var(--spectrum-corner-radius-medium-size-medium); + --spectrum-actionbutton-border-width: var(--spectrum-border-width-100); + --spectrum-actionbutton-border-color: transparent; + + --spectrum-actionbutton-content-color-default: var(--spectrum-neutral-content-color-default); + --spectrum-actionbutton-content-color-hover: var(--spectrum-neutral-content-color-hover); + --spectrum-actionbutton-content-color-down: var(--spectrum-neutral-content-color-down); + --spectrum-actionbutton-content-color-focus: var(--spectrum-neutral-content-color-key-focus); + --spectrum-actionbutton-content-color-disabled: var(--spectrum-disabled-content-color); + + --spectrum-actionbutton-background-color-default: var(--spectrum-gray-100); + --spectrum-actionbutton-background-color-hover: var(--spectrum-gray-200); + --spectrum-actionbutton-background-color-down: var(--spectrum-gray-200); + --spectrum-actionbutton-background-color-focus: var(--spectrum-gray-200); + --spectrum-actionbutton-background-color-disabled: var(--spectrum-disabled-background-color); + + --spectrum-actionbutton-focus-indicator-gap: var(--spectrum-focus-indicator-gap); --spectrum-actionbutton-focus-indicator-thickness: var(--spectrum-focus-indicator-thickness); --spectrum-actionbutton-focus-indicator-color: var(--spectrum-focus-indicator-color); + --spectrum-actionbutton-focus-indicator-border-radius: calc(var(--spectrum-actionbutton-border-radius) + var(--spectrum-actionbutton-focus-indicator-gap)); - --spectrum-actionbutton-min-width: var(--mod-actionbutton-min-width, calc((var(--spectrum-component-edge-to-visual-only-100) * 2) + var(--spectrum-workflow-icon-size-100))); + --spectrum-actionbutton-min-width: calc((var(--spectrum-component-edge-to-visual-only-100) * 2) + var(--spectrum-workflow-icon-size-100)); --spectrum-actionbutton-height: var(--spectrum-component-height-100); --spectrum-actionbutton-icon-size: var(--spectrum-workflow-icon-size-100); --spectrum-actionbutton-font-size: var(--spectrum-font-size-100); + --spectrum-actionbutton-font-weight: var(--spectrum-medium-font-weight); --spectrum-actionbutton-text-to-visual: var(--spectrum-text-to-visual-100); - --spectrum-actionbutton-edge-to-hold-icon: var(--mod-actionbutton-edge-to-hold-icon, var(--spectrum-action-button-edge-to-hold-icon-medium)); + --spectrum-actionbutton-edge-to-hold-icon: var(--spectrum-action-button-edge-to-hold-icon-medium); + --spectrum-actionbutton-edge-to-visual: var(--spectrum-component-edge-to-visual-100); + --spectrum-actionbutton-edge-to-text: var(--spectrum-component-edge-to-text-100); + --spectrum-actionbutton-edge-to-visual-only: var(--spectrum-component-edge-to-visual-only-100); - --spectrum-actionbutton-edge-to-visual: var(--mod-actionbutton-edge-to-visual, calc(var(--spectrum-component-edge-to-visual-100) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-text: var(--mod-actionbutton-edge-to-text, calc(var(--spectrum-component-edge-to-text-100) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-visual-only: var(--mod-actionbutton-edge-to-visual-only, calc(var(--spectrum-component-edge-to-visual-only-100) - var(--spectrum-actionbutton-border-width))); + --spectrum-actionbutton-downstate-perspective: max(var(--spectrum-downstate-height), var(--spectrum-downstate-width) * var(--spectrum-component-size-width-ratio-down)); &:dir(rtl) { --spectrum-logical-rotation: matrix(-1, 0, 0, 1, 0, 0); } &.spectrum-ActionButton--quiet { - --mod-actionbutton-border-color-default: transparent; - - --mod-actionbutton-background-color-default: transparent; - --mod-actionbutton-background-color-hover: var(--spectrum-gray-100); - --mod-actionbutton-background-color-down: var(--spectrum-gray-200); - --mod-actionbutton-background-color-focus: var(--spectrum-gray-100); - - &:disabled:not(.is-selected), - &.is-disabled:not(.is-selected) { - --mod-actionbutton-border-color-disabled: transparent; - --mod-actionbutton-background-color-disabled: transparent; - } + --spectrum-actionbutton-background-color-default: transparent; + --spectrum-actionbutton-background-color-hover: var(--spectrum-gray-200); + --spectrum-actionbutton-background-color-down: var(--spectrum-gray-200); + --spectrum-actionbutton-background-color-focus: var(--spectrum-gray-200); + --spectrum-actionbutton-background-color-disabled: transparent; } &.spectrum-ActionButton--staticBlack { - --mod-actionbutton-background-color-default: transparent; + --spectrum-actionbutton-background-color-default: var(--spectrum-transparent-black-100); + --spectrum-actionbutton-background-color-hover: var(--spectrum-transparent-black-200); + --spectrum-actionbutton-background-color-down: var(--spectrum-transparent-black-200); + --spectrum-actionbutton-background-color-focus: var(--spectrum-transparent-black-200); + --spectrum-actionbutton-background-color-disabled: var(--spectrum-disabled-static-black-background-color); - --mod-actionbutton-border-color-default: var(--spectrum-transparent-black-500); - --mod-actionbutton-border-color-hover: var(--spectrum-transparent-black-600); - --mod-actionbutton-border-color-down: var(--spectrum-transparent-black-700); - --mod-actionbutton-border-color-focus: var(--spectrum-transparent-black-600); + --spectrum-actionbutton-content-color-default: var(--spectrum-transparent-black-800); + --spectrum-actionbutton-content-color-hover: var(--spectrum-transparent-black-900); + --spectrum-actionbutton-content-color-down: var(--spectrum-transparent-black-900); + --spectrum-actionbutton-content-color-focus: var(--spectrum-transparent-black-900); + --spectrum-actionbutton-content-color-disabled: var(--spectrum-disabled-static-black-content-color); - --mod-actionbutton-focus-indicator-color: var(--spectrum-static-black-focus-indicator-color); - - --spectrum-actionbutton-background-color-disabled: transparent; - --spectrum-actionbutton-background-color-selected-disabled: var(--spectrum-transparent-black-200); - - &:disabled, - .is-disabled { - --mod-disabled-content-color: var(--spectrum-transparent-black-500); - --mod-actionbutton-border-color-disabled: var(--spectrum-transparent-black-500); - } + --spectrum-actionbutton-focus-indicator-color: var(--spectrum-static-black-focus-indicator-color); &.spectrum-ActionButton--quiet { - --mod-actionbutton-border-color-default: transparent; + --spectrum-actionbutton-background-color-default: transparent; + --spectrum-actionbutton-background-color-hover: var(--spectrum-transparent-black-200); + --spectrum-actionbutton-background-color-down: var(--spectrum-transparent-black-200); + --spectrum-actionbutton-background-color-focus: var(--spectrum-transparent-black-200); + --spectrum-actionbutton-background-color-disabled: var(--spectrum-transparent-black-25); } } &.spectrum-ActionButton--staticWhite { - --mod-actionbutton-background-color-default: transparent; + --spectrum-actionbutton-background-color-default: var(--spectrum-transparent-white-100); + --spectrum-actionbutton-background-color-hover: var(--spectrum-transparent-white-200); + --spectrum-actionbutton-background-color-down: var(--spectrum-transparent-white-200); + --spectrum-actionbutton-background-color-focus: var(--spectrum-transparent-white-200); + --spectrum-actionbutton-background-color-disabled: var(--spectrum-disabled-static-white-background-color); - --mod-actionbutton-border-color-default: var(--spectrum-transparent-white-500); - --mod-actionbutton-border-color-hover: var(--spectrum-transparent-white-600); - --mod-actionbutton-border-color-down: var(--spectrum-transparent-white-700); - --mod-actionbutton-border-color-focus: var(--spectrum-transparent-white-600); + --spectrum-actionbutton-content-color-default: var(--spectrum-transparent-white-800); + --spectrum-actionbutton-content-color-hover: var(--spectrum-transparent-white-900); + --spectrum-actionbutton-content-color-down: var(--spectrum-transparent-white-900); + --spectrum-actionbutton-content-color-focus: var(--spectrum-transparent-white-900); + --spectrum-actionbutton-content-color-disabled: var(--spectrum-disabled-static-white-content-color); - --mod-actionbutton-focus-indicator-color: var(--spectrum-static-white-focus-indicator-color); - - --spectrum-actionbutton-background-color-disabled: transparent; - --spectrum-actionbutton-background-color-selected-disabled: var(--spectrum-transparent-white-200); - - &:disabled, - .is-disabled { - --mod-disabled-content-color: var(--spectrum-transparent-white-500); - --mod-actionbutton-border-color-disabled: var(--spectrum-transparent-white-500); - } + --spectrum-actionbutton-focus-indicator-color: var(--spectrum-static-white-focus-indicator-color); &.spectrum-ActionButton--quiet { - --mod-actionbutton-border-color-default: transparent; + --spectrum-actionbutton-background-color-default: transparent; + --spectrum-actionbutton-background-color-hover: var(--spectrum-transparent-white-200); + --spectrum-actionbutton-background-color-down: var(--spectrum-transparent-white-200); + --spectrum-actionbutton-background-color-focus: var(--spectrum-transparent-white-200); + --spectrum-actionbutton-background-color-disabled: var(--spectrum-transparent-white-25); } } &.is-selected { - --mod-actionbutton-background-color-default: var(--spectrum-actionbutton-background-color-selected); - --mod-actionbutton-background-color-hover: var(--spectrum-actionbutton-background-color-selected-hover); - --mod-actionbutton-background-color-down: var(--spectrum-actionbutton-background-color-selected-down); - --mod-actionbutton-background-color-focus: var(--spectrum-actionbutton-background-color-selected-focus); - --mod-actionbutton-background-color-disabled: var(--spectrum-actionbutton-background-color-selected-disabled); - - --mod-actionbutton-border-color-default: transparent; - --mod-actionbutton-border-color-hover: transparent; - --mod-actionbutton-border-color-down: transparent; - --mod-actionbutton-border-color-focus: transparent; - --mod-actionbutton-border-color-disabled: transparent; - - --mod-actionbutton-content-color-default: var(--spectrum-actionbutton-content-color-selected); - --mod-actionbutton-content-color-hover: var(--spectrum-actionbutton-content-color-selected); - --mod-actionbutton-content-color-down: var(--spectrum-actionbutton-content-color-selected); - --mod-actionbutton-content-color-focus: var(--spectrum-actionbutton-content-color-selected); - - &.spectrum-ActionButton--emphasized:not(.spectrum-ActionButton--staticBlack, .spectrum-ActionButton--staticWhite) { - --mod-actionbutton-background-color-default: var(--spectrum-accent-background-color-default); - --mod-actionbutton-background-color-hover: var(--spectrum-accent-background-color-hover); - --mod-actionbutton-background-color-down: var(--spectrum-accent-background-color-down); - --mod-actionbutton-background-color-focus: var(--spectrum-accent-background-color-key-focus); - - --mod-actionbutton-content-color-default: var(--spectrum-white); - --mod-actionbutton-content-color-hover: var(--spectrum-white); - --mod-actionbutton-content-color-down: var(--spectrum-white); - --mod-actionbutton-content-color-focus: var(--spectrum-white); + --mod-actionbutton-background-color-default: var(--mod-actionbutton-background-color-default-selected, var(--spectrum-neutral-background-color-selected-default)); + --mod-actionbutton-background-color-hover: var(--mod-actionbutton-background-color-hover-selected, var(--spectrum-neutral-background-color-selected-hover)); + --mod-actionbutton-background-color-down: var(--mod-actionbutton-background-color-down-selected, var(--spectrum-neutral-background-color-selected-down)); + --mod-actionbutton-background-color-focus: var(--mod-actionbutton-background-color-focus-selected, var(--spectrum-neutral-background-color-selected-key-focus)); + + --mod-actionbutton-content-color-default: var(--mod-actionbutton-content-color-default-selected, var(--spectrum-gray-25)); + --mod-actionbutton-content-color-hover: var(--mod-actionbutton-content-color-hover-selected, var(--spectrum-gray-25)); + --mod-actionbutton-content-color-down: var(--mod-actionbutton-content-color-down-selected, var(--spectrum-gray-25)); + --mod-actionbutton-content-color-focus: var(--mod-actionbutton-content-color-focus-selected, var(--spectrum-gray-25)); + + &.spectrum-ActionButton--emphasized { + --mod-actionbutton-background-color-default: var(--mod-actionbutton-background-color-default-selected-emphasized, var(--spectrum-accent-background-color-default)); + --mod-actionbutton-background-color-hover: var(--mod-actionbutton-background-color-hover-selected-emphasized, var(--spectrum-accent-background-color-hover)); + --mod-actionbutton-background-color-down: var(--mod-actionbutton-background-color-down-selected-emphasized, var(--spectrum-accent-background-color-down)); + --mod-actionbutton-background-color-focus: var(--mod-actionbutton-background-color-focus-selected-emphasized, var(--spectrum-accent-background-color-key-focus)); + + --mod-actionbutton-content-color-default: var(--mod-actionbutton-content-color-default-selected-emphasized, var(--spectrum-white)); + --mod-actionbutton-content-color-hover: var(--mod-actionbutton-content-color-hover-selected-emphasized, var(--spectrum-white)); + --mod-actionbutton-content-color-down: var(--mod-actionbutton-content-color-down-selected-emphasized, var(--spectrum-white)); + --mod-actionbutton-content-color-focus: var(--mod-actionbutton-content-color-focus-selected-emphasized, var(--spectrum-white)); } - &:disabled, - .is-disabled { - &.spectrum-ActionButton--staticBlack { - --mod-disabled-content-color: var(--spectrum-transparent-black-500); - --mod-disabled-background-color: var(--spectrum-transparent-black-100); - } + &.spectrum-ActionButton--staticWhite { + --spectrum-actionbutton-background-color-default: var(--spectrum-transparent-white-800); + --spectrum-actionbutton-background-color-hover: var(--spectrum-transparent-white-900); + --spectrum-actionbutton-background-color-down: var(--spectrum-transparent-white-900); + --spectrum-actionbutton-background-color-focus: var(--spectrum-transparent-white-900); - &.spectrum-ActionButton--staticWhite { - --mod-disabled-content-color: var(--spectrum-transparent-white-500); - --mod-disabled-background-color: var(--spectrum-transparent-white-100); - } + --spectrum-actionbutton-content-color-default: var(--spectrum-black); + --spectrum-actionbutton-content-color-hover: var(--spectrum-black); + --spectrum-actionbutton-content-color-down: var(--spectrum-black); + --spectrum-actionbutton-content-color-focus: var(--spectrum-black); + } + + &.spectrum-ActionButton--staticBlack { + --spectrum-actionbutton-background-color-default: var(--spectrum-transparent-black-800); + --spectrum-actionbutton-background-color-hover: var(--spectrum-transparent-black-900); + --spectrum-actionbutton-background-color-down: var(--spectrum-transparent-black-900); + --spectrum-actionbutton-background-color-focus: var(--spectrum-transparent-black-900); + + --spectrum-actionbutton-content-color-default: var(--spectrum-white); + --spectrum-actionbutton-content-color-hover: var(--spectrum-white); + --spectrum-actionbutton-content-color-down: var(--spectrum-white); + --spectrum-actionbutton-content-color-focus: var(--spectrum-white); } } } .spectrum-ActionButton--sizeXS { - --spectrum-actionbutton-border-radius: var(--mod-actionbutton-border-radius, var(--spectrum-corner-radius-medium-size-extra-small)); + --spectrum-actionbutton-border-radius: var(--spectrum-corner-radius-medium-size-extra-small); - --spectrum-actionbutton-min-width: var(--mod-actionbutton-min-width, calc((var(--spectrum-component-edge-to-visual-only-50) * 2) + var(--spectrum-workflow-icon-size-50))); + --spectrum-actionbutton-min-width: calc((var(--spectrum-component-edge-to-visual-only-50) * 2) + var(--spectrum-workflow-icon-size-50)); --spectrum-actionbutton-height: var(--spectrum-component-height-50); --spectrum-actionbutton-icon-size: var(--spectrum-workflow-icon-size-50); --spectrum-actionbutton-font-size: var(--spectrum-font-size-50); --spectrum-actionbutton-text-to-visual: var(--spectrum-text-to-visual-50); - --spectrum-actionbutton-edge-to-hold-icon: var(--mod-actionbutton-edge-to-hold-icon, var(--spectrum-action-button-edge-to-hold-icon-extra-small)); - --spectrum-actionbutton-edge-to-visual: var(--mod-actionbutton-edge-to-visual, calc(var(--spectrum-component-edge-to-visual-50) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-text: var(--mod-actionbutton-edge-to-text, calc(var(--spectrum-component-edge-to-text-50) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-visual-only: var(--mod-actionbutton-edge-to-visual-only, calc(var(--spectrum-component-edge-to-visual-only-50) - var(--spectrum-actionbutton-border-width))); + --spectrum-actionbutton-edge-to-hold-icon: var(--spectrum-action-button-edge-to-hold-icon-extra-small); + --spectrum-actionbutton-edge-to-visual: var(--spectrum-component-edge-to-visual-50); + --spectrum-actionbutton-edge-to-text: var(--spectrum-component-edge-to-text-50); + --spectrum-actionbutton-edge-to-visual-only: var(--spectrum-component-edge-to-visual-only-50); + + --spectrum-actionbutton-downstate-perspective: var(--spectrum-component-size-minimum-perspective-down); } .spectrum-ActionButton--sizeS { - --spectrum-actionbutton-border-radius: var(--mod-actionbutton-border-radius, var(--spectrum-corner-radius-medium-size-small)); + --spectrum-actionbutton-border-radius: var(--spectrum-corner-radius-medium-size-small); - --spectrum-actionbutton-min-width: var(--mod-actionbutton-min-width, calc((var(--spectrum-component-edge-to-visual-only-75) * 2) + var(--spectrum-workflow-icon-size-75))); + --spectrum-actionbutton-min-width: calc((var(--spectrum-component-edge-to-visual-only-75) * 2) + var(--spectrum-workflow-icon-size-75)); --spectrum-actionbutton-height: var(--spectrum-component-height-75); --spectrum-actionbutton-icon-size: var(--spectrum-workflow-icon-size-75); --spectrum-actionbutton-font-size: var(--spectrum-font-size-75); --spectrum-actionbutton-text-to-visual: var(--spectrum-text-to-visual-75); - --spectrum-actionbutton-edge-to-hold-icon: var(--mod-actionbutton-edge-to-hold-icon, var(--spectrum-action-button-edge-to-hold-icon-small)); - --spectrum-actionbutton-edge-to-visual: var(--mod-actionbutton-edge-to-visual, calc(var(--spectrum-component-edge-to-visual-75) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-text: var(--mod-actionbutton-edge-to-text, calc(var(--spectrum-component-edge-to-text-75) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-visual-only: var(--mod-actionbutton-edge-to-visual-only, calc(var(--spectrum-component-edge-to-visual-only-75) - var(--spectrum-actionbutton-border-width))); + --spectrum-actionbutton-edge-to-hold-icon: var(--spectrum-action-button-edge-to-hold-icon-small); + --spectrum-actionbutton-edge-to-visual: var(--spectrum-component-edge-to-visual-75); + --spectrum-actionbutton-edge-to-text: var(--spectrum-component-edge-to-text-75); + --spectrum-actionbutton-edge-to-visual-only: var(--spectrum-component-edge-to-visual-only-75); + + --spectrum-actionbutton-downstate-perspective: var(--spectrum-component-size-minimum-perspective-down); } .spectrum-ActionButton--sizeL { - --spectrum-actionbutton-border-radius: var(--mod-actionbutton-border-radius, var(--spectrum-corner-radius-medium-size-large)); + --spectrum-actionbutton-border-radius: var(--spectrum-corner-radius-medium-size-large); - --spectrum-actionbutton-min-width: var(--mod-actionbutton-min-width, calc((var(--spectrum-component-edge-to-visual-only-200) * 2) + var(--spectrum-workflow-icon-size-200))); + --spectrum-actionbutton-min-width: calc((var(--spectrum-component-edge-to-visual-only-200) * 2) + var(--spectrum-workflow-icon-size-200)); --spectrum-actionbutton-height: var(--spectrum-component-height-200); --spectrum-actionbutton-icon-size: var(--spectrum-workflow-icon-size-200); --spectrum-actionbutton-font-size: var(--spectrum-font-size-200); --spectrum-actionbutton-text-to-visual: var(--spectrum-text-to-visual-200); - --spectrum-actionbutton-edge-to-hold-icon: var(--mod-actionbutton-edge-to-hold-icon, var(--spectrum-action-button-edge-to-hold-icon-large)); - --spectrum-actionbutton-edge-to-visual: var(--mod-actionbutton-edge-to-visual, calc(var(--spectrum-component-edge-to-visual-200) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-text: var(--mod-actionbutton-edge-to-text, calc(var(--spectrum-component-edge-to-text-200) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-visual-only: var(--mod-actionbutton-edge-to-visual-only, calc(var(--spectrum-component-edge-to-visual-only-200) - var(--spectrum-actionbutton-border-width))); + --spectrum-actionbutton-edge-to-hold-icon: var(--spectrum-action-button-edge-to-hold-icon-large); + --spectrum-actionbutton-edge-to-visual: var(--spectrum-component-edge-to-visual-200); + --spectrum-actionbutton-edge-to-text: var(--spectrum-component-edge-to-text-200); + --spectrum-actionbutton-edge-to-visual-only: var(--spectrum-component-edge-to-visual-only-200); } .spectrum-ActionButton--sizeXL { - --spectrum-actionbutton-border-radius: var(--mod-actionbutton-border-radius, var(--spectrum-corner-radius-medium-size-extra-large)); + --spectrum-actionbutton-border-radius: var(--spectrum-corner-radius-medium-size-extra-large); - --spectrum-actionbutton-min-width: var(--mod-actionbutton-min-width, calc((var(--spectrum-component-edge-to-visual-only-300) * 2) + var(--spectrum-workflow-icon-size-300))); + --spectrum-actionbutton-min-width: calc((var(--spectrum-component-edge-to-visual-only-300) * 2) + var(--spectrum-workflow-icon-size-300)); --spectrum-actionbutton-height: var(--spectrum-component-height-300); --spectrum-actionbutton-icon-size: var(--spectrum-workflow-icon-size-300); --spectrum-actionbutton-font-size: var(--spectrum-font-size-300); --spectrum-actionbutton-text-to-visual: var(--spectrum-text-to-visual-300); - --spectrum-actionbutton-edge-to-hold-icon: var(--mod-actionbutton-edge-to-hold-icon, var(--spectrum-action-button-edge-to-hold-icon-extra-large)); - --spectrum-actionbutton-edge-to-visual: var(--mod-actionbutton-edge-to-visual, calc(var(--spectrum-component-edge-to-visual-300) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-text: var(--mod-actionbutton-edge-to-text, calc(var(--spectrum-component-edge-to-text-300) - var(--spectrum-actionbutton-border-width))); - --spectrum-actionbutton-edge-to-visual-only: var(--mod-actionbutton-edge-to-visual-only, calc(var(--spectrum-component-edge-to-visual-only-300) - var(--spectrum-actionbutton-border-width))); + --spectrum-actionbutton-edge-to-hold-icon: var(--spectrum-action-button-edge-to-hold-icon-extra-large); + --spectrum-actionbutton-edge-to-visual: var(--spectrum-component-edge-to-visual-300); + --spectrum-actionbutton-edge-to-text: var(--spectrum-component-edge-to-text-300); + --spectrum-actionbutton-edge-to-visual-only: var(--spectrum-component-edge-to-visual-only-300); } .spectrum-ActionButton { - --spectrum-actionbutton-focus-indicator-border-radius: var(--mod-actionbutton-focus-indicator-border-radius, calc(var(--spectrum-actionbutton-border-radius) + var(--spectrum-actionbutton-focus-indicator-gap))); - - cursor: pointer; - user-select: none; - - /* Contain halo */ + @extend %spectrum-BaseButton; position: relative; - /* Show the button overflow in Edge. */ - overflow: visible; - display: inline-flex; - align-items: center; - justify-content: center; - - box-sizing: border-box; - - /* Remove button the margin in Firefox and Safari. */ - margin: 0; - - font-family: var(--mod-button-font-family, var(--spectrum-sans-font-family-stack)); - - /* Adjacent buttons should be aligned correctly */ - vertical-align: top; - - -webkit-font-smoothing: antialiased; - - /* Font smoothing for Firefox */ - -moz-osx-font-smoothing: grayscale; - - line-height: var(--mod-button-line-height, var(--spectrum-line-height-100)); - text-decoration: none; - - /* Remove the inheritance of text transform on button in Edge, Firefox, and IE. */ - text-transform: none; - - /* stylelint-disable-next-line property-no-vendor-prefix -- Correct the inability to style clickable types in iOS and Safari (normalize). */ - -webkit-appearance: button; - - border-style: solid; - - transition: - background var(--mod-button-animation-duration, var(--spectrum-animation-duration-100)) ease-out, - border-color var(--mod-actionbutton-animation-duration, var(--spectrum-animation-duration-100)) ease-in-out, - color var(--mod-button-animation-duration, var(--spectrum-animation-duration-100)) ease-out, - box-shadow var(--mod-button-animation-duration, var(--spectrum-animation-duration-100)) ease-out; - - min-inline-size: var(--spectrum-actionbutton-min-width); + min-inline-size: var(--mod-actionbutton-min-width, var(--spectrum-actionbutton-min-width)); block-size: var(--mod-actionbutton-height, var(--spectrum-actionbutton-height)); - border-radius: var(--spectrum-actionbutton-border-radius); + border-radius: var(--mod-actionbutton-border-radius, var(--spectrum-actionbutton-border-radius)); border-width: var(--spectrum-actionbutton-border-width); + border-color: var(--highcontrast-actionbutton-border-color, var(--spectrum-actionbutton-border-color)); - gap: calc(var(--mod-actionbutton-text-to-visual, var(--spectrum-actionbutton-text-to-visual)) + (var(--spectrum-actionbutton-edge-to-text) - var(--spectrum-actionbutton-edge-to-visual-only))); - - /* Start with text-only padding */ - padding-inline: var(--spectrum-actionbutton-edge-to-text); - - background: var(--spectrum-actionbutton-background-color-default); - border-color: var(--spectrum-actionbutton-border-color-default); - color: var(--spectrum-actionbutton-content-color-default); + gap: calc(var(--mod-actionbutton-text-to-visual, var(--spectrum-actionbutton-text-to-visual)) + (var(--mod-actionbutton-edge-to-text, var(--spectrum-actionbutton-edge-to-text)) - var(--mod-actionbutton-edge-to-visual-only, var(--spectrum-actionbutton-edge-to-visual-only)))); - &::after { - position: absolute; - inset: 0; - - margin: calc((var(--spectrum-actionbutton-focus-indicator-gap) + var(--spectrum-actionbutton-border-width)) * -1); - - border-radius: var(--spectrum-actionbutton-focus-indicator-border-radius); - - transition: box-shadow var(--spectrum-actionbutton-animation-duration) ease-in-out; + padding-inline: calc(var(--mod-actionbutton-edge-to-text, var(--spectrum-actionbutton-edge-to-text)) - var(--spectrum-actionbutton-border-width)); - pointer-events: none; - content: ""; - } + background-color: var(--highcontrast-actionbutton-background-color-default, var(--mod-actionbutton-background-color-default, var(--spectrum-actionbutton-background-color-default))); + color: var(--highcontrast-actionbutton-content-color-default, var(--mod-actionbutton-content-color-default, var(--spectrum-actionbutton-content-color-default))); &:hover { - background: var(--spectrum-actionbutton-background-color-hover); - border-color: var(--spectrum-actionbutton-border-color-hover); - color: var(--spectrum-actionbutton-content-color-hover); - } - - /* Fix Firefox */ - &::-moz-focus-inner { - margin-block-start: -2px; - margin-block-end: -2px; - padding: 0; - border: 0; - - /* Remove the inner border and padding for button in Firefox. */ - border-style: none; + background-color: var(--highcontrast-actionbutton-background-color-hover, var(--mod-actionbutton-background-color-hover, var(--spectrum-actionbutton-background-color-hover))); + color: var(--highcontrast-actionbutton-content-color-hover, var(--mod-actionbutton-content-color-hover, var(--spectrum-actionbutton-content-color-hover))); } - &:focus, &:focus-visible { - /* kill the default ring */ - box-shadow: none; - outline: none; - } - - &:focus-visible { - background: var(--spectrum-actionbutton-background-color-focus); - border-color: var(--spectrum-actionbutton-border-color-focus); - color: var(--spectrum-actionbutton-content-color-focus); - - &::after { - box-shadow: 0 0 0 var(--spectrum-actionbutton-focus-indicator-thickness) var(--spectrum-actionbutton-focus-indicator-color); - } + background-color: var(--highcontrast-actionbutton-background-color-focus, var(--mod-actionbutton-background-color-focus, var(--spectrum-actionbutton-background-color-focus))); + color: var(--highcontrast-actionbutton-content-color-focus, var(--mod-actionbutton-content-color-focus, var(--spectrum-actionbutton-content-color-focus))); } &:active { - background: var(--spectrum-actionbutton-background-color-down); - border-color: var(--spectrum-actionbutton-border-color-down); - color: var(--spectrum-actionbutton-content-color-down); + background-color: var(--highcontrast-actionbutton-background-color-down, var(--mod-actionbutton-background-color-down, var(--spectrum-actionbutton-background-color-down))); + color: var(--highcontrast-actionbutton-content-color-down, var(--mod-actionbutton-content-color-down, var(--spectrum-actionbutton-content-color-down))); + transform: perspective(var(--spectrum-actionbutton-downstate-perspective)) translateZ(var(--spectrum-component-size-difference-down)); } &:disabled, &.is-disabled { - cursor: default; - - background: var(--highcontrast-actionbutton-background-color-disabled, var(--mod-actionbutton-background-color-disabled, var(--spectrum-actionbutton-background-color-disabled))); - border-color: var(--highcontrast-actionbutton-border-color-disabled, var(--mod-actionbutton-border-color-disabled, var(--spectrum-actionbutton-border-color-disabled))); + background-color: var(--highcontrast-actionbutton-background-color-disabled, var(--mod-actionbutton-background-color-disabled, var(--spectrum-actionbutton-background-color-disabled))); color: var(--highcontrast-actionbutton-content-color-disabled, var(--mod-actionbutton-content-color-disabled, var(--spectrum-actionbutton-content-color-disabled))); } } a.spectrum-ActionButton { - /* Make link text not selectable */ - user-select: none; - - /* stylelint-disable-next-line property-no-vendor-prefix -- Remove appearance for clickable types in iOS and Safari. */ - -webkit-appearance: none; + @extend %spectrum-AnchorButton; } -/* Nested sub-component: Icon */ .spectrum-ActionButton-icon { - flex-shrink: 0; + @extend %spectrum-ButtonIcon; inline-size: var(--mod-actionbutton-icon-size, var(--spectrum-actionbutton-icon-size)); block-size: var(--mod-actionbutton-icon-size, var(--spectrum-actionbutton-icon-size)); - max-block-size: 100%; /* adjust icon positioning to match UI kit */ - margin-inline-start: calc(var(--spectrum-actionbutton-edge-to-visual) - var(--spectrum-actionbutton-edge-to-text)); - margin-inline-end: calc(var(--spectrum-actionbutton-edge-to-visual-only) - var(--spectrum-actionbutton-edge-to-text)); + margin-inline-start: calc(var(--mod-actionbutton-edge-to-visual, var(--spectrum-actionbutton-edge-to-visual)) - var(--mod-actionbutton-edge-to-text, var(--spectrum-actionbutton-edge-to-text))); + margin-inline-end: calc(var(--mod-actionbutton-edge-to-visual-only, var(--spectrum-actionbutton-edge-to-visual-only)) - var(--mod-actionbutton-edge-to-text, var(--spectrum-actionbutton-edge-to-text))); color: inherit; +} +.spectrum-ActionButton-hold + .spectrum-ActionButton-icon, +.spectrum-ActionButton-icon:only-child { /* Augment the margin correction for the icon only scenario */ - .spectrum-ActionButton-hold + &, - &:only-child { - margin-inline-start: calc(var(--spectrum-actionbutton-edge-to-visual-only) - var(--spectrum-actionbutton-edge-to-text)); - } + margin-inline-start: calc(var(--mod-actionbutton-edge-to-visual-only, var(--spectrum-actionbutton-edge-to-visual-only)) - var(--mod-actionbutton-edge-to-text, var(--spectrum-actionbutton-edge-to-text))); } .spectrum-ActionButton-label { - align-self: center; - justify-self: center; - - /* Fixes horizontal alignment of text in anchor buttons */ - text-align: center; - + @extend %spectrum-ButtonLabel; pointer-events: none; - line-height: var(--spectrum-actionbutton-height); - font-size: var(--spectrum-actionbutton-font-size); + font-size: var(--mod-actionbutton-font-size, var(--spectrum-actionbutton-font-size)); + font-weight: var(--mod-actionbutton-font-weight, var(--spectrum-actionbutton-font-weight)); white-space: nowrap; color: var(--mod-actionbutton-label-color, inherit); text-overflow: ellipsis; overflow: hidden; - - &:empty { - display: none; - } } .spectrum-ActionButton-hold { position: absolute; - inset-inline-end: calc(var(--spectrum-actionbutton-edge-to-hold-icon) - var(--spectrum-actionbutton-border-width)); - inset-block-end: calc(var(--spectrum-actionbutton-edge-to-hold-icon) - var(--spectrum-actionbutton-border-width)); + inset-inline-end: calc(var(--mod-actionbutton-edge-to-hold-icon, var(--spectrum-actionbutton-edge-to-hold-icon)) - var(--spectrum-actionbutton-border-width)); + inset-block-end: calc(var(--mod-actionbutton-edge-to-hold-icon, var(--spectrum-actionbutton-edge-to-hold-icon)) - var(--spectrum-actionbutton-border-width)); color: inherit; - transform: var(--spectrum-logical-rotation,); + transform: var(--spectrum-logical-rotation); } -.spectrum-ActionButton-hold + .spectrum-ActionButton-icon, -.spectrum-ActionButton-icon:only-child { - /* Augment the margin correction for the icon only scenario */ - margin-inline-start: calc(var(--spectrum-actionbutton-edge-to-visual-only) - var(--spectrum-actionbutton-edge-to-text)); +/* special cases for focus-ring */ +.spectrum-ActionButton { + transition: border-color var(--mod-actionbutton-animation-duration, var(--spectrum-actionbutton-animation-duration)) ease-in-out; + + &::after { + position: absolute; + inset: 0; + + margin: calc((var(--mod-actionbutton-focus-indicator-gap, var(--spectrum-actionbutton-focus-indicator-gap)) + var(--spectrum-actionbutton-border-width)) * -1); + + border-radius: var(--mod-actionbutton-focus-indicator-border-radius, var(--spectrum-actionbutton-focus-indicator-border-radius)); + + transition: box-shadow var(--mod-actionbutton-animation-duration, var(--spectrum-actionbutton-animation-duration)) ease-in-out; + + pointer-events: none; + content: ""; + } + + &:focus-visible { + box-shadow: none; + outline: none; + + &::after { + box-shadow: 0 0 0 var(--mod-actionbutton-focus-indicator-thickness, var(--spectrum-actionbutton-focus-indicator-thickness)) var(--highcontrast-actionbutton-focus-indicator-color, var(--mod-actionbutton-focus-indicator-color, var(--spectrum-actionbutton-focus-indicator-color))); + } + } } @media (forced-colors: active) { @@ -430,6 +344,14 @@ a.spectrum-ActionButton { forced-color-adjust: none; } + --highcontrast-actionbutton-focus-indicator-color: ButtonText; + + &:hover, + &:active, + &:focus-visible { + --highcontrast-actionbutton-border-color: Highlight; + } + &.is-selected { --highcontrast-actionbutton-background-color-default: Highlight; --highcontrast-actionbutton-background-color-hover: Highlight; @@ -437,18 +359,14 @@ a.spectrum-ActionButton { --highcontrast-actionbutton-background-color-down: Highlight; --highcontrast-actionbutton-background-color-disabled: ButtonFace; - --highcontrast-actionbutton-border-color-default: HighlightText; - --highcontrast-actionbutton-border-color-hover: HighlightText; - --highcontrast-actionbutton-border-color-focus: HighlightText; - --highcontrast-actionbutton-border-color-down: HighlightText; - --highcontrast-actionbutton-border-color-disabled: GrayText; - --highcontrast-actionbutton-content-color-default: HighlightText; --highcontrast-actionbutton-content-color-hover: HighlightText; --highcontrast-actionbutton-content-color-focus: HighlightText; --highcontrast-actionbutton-content-color-down: HighlightText; --highcontrast-actionbutton-content-color-disabled: GrayText; + --highcontrast-actionbutton-border-color: Highlight; + .spectrum-ActionButton-icon, .spectrum-ActionButton-hold, .spectrum-ActionButton-label { @@ -457,5 +375,9 @@ a.spectrum-ActionButton { forced-color-adjust: none; } } + + &:disabled { + --highcontrast-actionbutton-border-color: GrayText; + } } } diff --git a/components/actionbutton/stories/actionbutton.stories.js b/components/actionbutton/stories/actionbutton.stories.js index a08f0f7bbfc..64001b1f040 100644 --- a/components/actionbutton/stories/actionbutton.stories.js +++ b/components/actionbutton/stories/actionbutton.stories.js @@ -1,5 +1,5 @@ import { default as IconStories } from "@spectrum-css/icon/stories/icon.stories.js"; -import { Sizes } from "@spectrum-css/preview/decorators"; +import { Sizes, withDownStateDimensionCapture } from "@spectrum-css/preview/decorators"; import { disableDefaultModes } from "@spectrum-css/preview/modes"; import { isActive, isDisabled, isEmphasized, isFocused, isHovered, isQuiet, isSelected, size, staticColor } from "@spectrum-css/preview/types"; import metadata from "../dist/metadata.json"; @@ -37,7 +37,10 @@ export default { control: { type: "text" }, }, isQuiet, - isEmphasized, + isEmphasized: { + ...isEmphasized, + if: { arg: "staticColor", truthy: false}, + }, isDisabled, isSelected, isHovered, @@ -88,6 +91,9 @@ export default { type: "figma", url: "https://www.figma.com/design/Mngz9H7WZLbrCvGQf3GnsY/S2-%2F-Desktop?node-id=702-2877", }, + downState: { + selectors: [".spectrum-ActionButton:not(:disabled)"], + }, packageJson, metadata, docs: { @@ -96,6 +102,9 @@ export default { }, } }, + decorators: [ + withDownStateDimensionCapture, + ], }; export const Default = ActionButtonGroup.bind({}); diff --git a/components/actionbutton/stories/template.js b/components/actionbutton/stories/template.js index 3b3cb8930c2..2d2feaf3a47 100644 --- a/components/actionbutton/stories/template.js +++ b/components/actionbutton/stories/template.js @@ -95,15 +95,15 @@ export const Template = ({ style=${styleMap(customStyles)} ?disabled=${isDisabled} @click=${onclick ?? function() { - updateArgs({ + updateArgs?.({ isSelected: !isSelected }); }} @focusin=${function() { - updateArgs({ isFocused: true }); + updateArgs?.({ isFocused: true }); }} @focusout=${function() { - updateArgs({ isFocused: false }); + updateArgs?.({ isFocused: false }); }} > ${when(hasPopup && hasPopup !== "false", () => @@ -137,6 +137,10 @@ export const Template = ({ `; }; +/** + * Displays multiple action buttons in a row, with different combinations of + * label, icon, and hold button (has popup). + */ export const ActionButtonsWithIconOptions = (args, context) => Container({ withBorder: false, direction: "row", @@ -168,6 +172,11 @@ export const ActionButtonsWithIconOptions = (args, context) => Container({ ` }, context); +/** + * Displays two action buttons in a row: + * - icon only action button + * - icon only action button with hold button (has popup) + */ export const IconOnlyOption = (args, context) => Container({ withBorder: false, direction: "row", @@ -189,12 +198,13 @@ export const IconOnlyOption = (args, context) => Container({ ` }, context); +/** + * Displays multiple groups of action buttons for: + * default, selected, disabled, and selected + disabled + */ export const TreatmentTemplate = (args, context) => Container({ withBorder: false, direction: "row", - wrapperStyles: { - rowGap: "12px", - }, content: html`${[ { isSelected: false, isDisabled: false, heading: "Default" }, { isSelected: true, isDisabled: false, heading: "Selected" }, @@ -203,6 +213,9 @@ export const TreatmentTemplate = (args, context) => Container({ ].map(({ isSelected, isDisabled, heading }) => Container({ withBorder: false, heading: heading, + containerStyles: { + rowGap: "8px", + }, content: ActionButtonsWithIconOptions({ ...args, isSelected, From cbf1fee8f210163bcb5c0a6e917b4b1972371d73 Mon Sep 17 00:00:00 2001 From: Josh Winn <965114+jawinn@users.noreply.github.com> Date: Wed, 19 Feb 2025 11:33:06 -0500 Subject: [PATCH 02/27] docs(actionbutton): remove problematic click and focus events - The click event was treating all action buttons as toggles, not allowing testing of the active/down state on click on the default button. It also does not work well when multiple buttons are present. - The focus events were inaccurately showing the focus indicator on click; the styles for this work differently because they are for focus-visible. The focused control/arg is for the storybook only class used for testing, which applies in a different manner. --- components/actionbutton/stories/template.js | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/components/actionbutton/stories/template.js b/components/actionbutton/stories/template.js index 2d2feaf3a47..ef5d1ef8f49 100644 --- a/components/actionbutton/stories/template.js +++ b/components/actionbutton/stories/template.js @@ -66,8 +66,6 @@ export const Template = ({ testId, role = "button", } = {}, context = {}) => { - const { updateArgs } = context; - return html`