sp-action-button
NPM
1.1.2
Storybook
View Storybook
Try it on
webcomponents.dev
Description #
An <sp-action-button>
represents an action a user can take.
Usage #
yarn add @spectrum-web-components/action-button
Import the side effectful registration of <sp-action-button>
via:
import '@spectrum-web-components/action-button/sp-action-button.js';
When looking to leverage the ActionButton
base class as a type and/or for extension purposes, do so via:
import { ActionButton } from '@spectrum-web-components/action-button';
Sizes #
<sp-action-group size="m"> <sp-action-button>Edit</sp-action-button> <sp-action-button> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group>
Variants #
The <sp-action-button>
can be customized with either or both of the emphasized
and quiet
attributes. These will pair with either or both of the state attributes (selected
and disabled
) to decide the final visual delivery of the <sp-action-button>
. Content addressed to the icon
slot can also be provided and will be positioned just before the rest of the the supplied button content.
Standard #
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 2em;" > <div> <sp-field-label for="standard">Default</sp-field-label> <sp-action-group id="standard"> <sp-action-button>Edit</sp-action-button> <sp-action-button> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-selected">Selected</sp-field-label> <sp-action-group id="standard-selected"> <sp-action-button selected>Edit</sp-action-button> <sp-action-button selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button selected hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled">Disabled</sp-field-label> <sp-action-group id="standard-disabled"> <sp-action-button disabled>Edit</sp-action-button> <sp-action-button disabled> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button disabled> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button disabled hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled-selected"> Disabled + Selected </sp-field-label> <sp-action-group id="standard-disabled-selected"> <sp-action-button disabled selected>Edit</sp-action-button> <sp-action-button disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button disabled selected hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> </div>
Quiet #
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 2em;" > <div> <sp-field-label for="standard">Default</sp-field-label> <sp-action-group quiet id="standard"> <sp-action-button quiet>Edit</sp-action-button> <sp-action-button quiet> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button quiet> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button quiet hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-selected">Selected</sp-field-label> <sp-action-group quiet id="standard-selected"> <sp-action-button quiet selected>Edit</sp-action-button> <sp-action-button quiet selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button quiet selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button quiet selected hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled">Disabled</sp-field-label> <sp-action-group quiet id="standard-disabled"> <sp-action-button quiet disabled>Edit</sp-action-button> <sp-action-button quiet disabled> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button quiet disabled> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button quiet disabled hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled-selected"> Disabled + Selected </sp-field-label> <sp-action-group quiet id="standard-disabled-selected"> <sp-action-button quiet disabled selected>Edit</sp-action-button> <sp-action-button quiet disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button quiet disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button quiet disabled selected hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> </div>
Emphasized #
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 2em;" > <div> <sp-field-label for="standard">Default</sp-field-label> <sp-action-group emphasized id="standard"> <sp-action-button emphasized>Edit</sp-action-button> <sp-action-button emphasized> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-selected">Selected</sp-field-label> <sp-action-group emphasized id="standard-selected"> <sp-action-button emphasized selected>Edit</sp-action-button> <sp-action-button emphasized selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized selected hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled">Disabled</sp-field-label> <sp-action-group emphasized id="standard-disabled"> <sp-action-button emphasized disabled>Edit</sp-action-button> <sp-action-button emphasized disabled> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized disabled> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized disabled hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled-selected"> Disabled + Selected </sp-field-label> <sp-action-group emphasized id="standard-disabled-selected"> <sp-action-button emphasized disabled selected> Edit </sp-action-button> <sp-action-button emphasized disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized disabled selected hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> </div>
Emphasized + Quiet #
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 2em;" > <div> <sp-field-label for="standard">Default</sp-field-label> <sp-action-group emphasized quiet id="standard"> <sp-action-button emphasized quiet>Edit</sp-action-button> <sp-action-button emphasized quiet> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized quiet> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized quiet hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-selected">Selected</sp-field-label> <sp-action-group emphasized quiet id="standard-selected"> <sp-action-button emphasized quiet selected>Edit</sp-action-button> <sp-action-button emphasized quiet selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized quiet selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized quiet selected hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled">Disabled</sp-field-label> <sp-action-group emphasized quiet id="standard-disabled"> <sp-action-button emphasized quiet disabled>Edit</sp-action-button> <sp-action-button emphasized quiet disabled> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized quiet disabled> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized quiet disabled hold-affordance> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> <div> <sp-field-label for="standard-disabled-selected"> Disabled + Selected </sp-field-label> <sp-action-group emphasized quiet id="standard-disabled-selected"> <sp-action-button emphasized quiet disabled selected> Edit </sp-action-button> <sp-action-button emphasized quiet disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> Edit </sp-action-button> <sp-action-button emphasized quiet disabled selected> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-action-button emphasized quiet disabled selected hold-affordance > <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> </sp-action-group> </div> </div>
Action button with hold affordance #
The use of the hold-affordance
attribute signifies that the <sp-action-button>
in question will be delivered with a visual affordance outlining that special interaction with the button will dispatch a longpress
event. Via a pointer input, this even will be dispatched when 300ms has passed after a pointerdown
event without the presence of a pointerup
or pointercancel
event. Via the keyboard, an event with a code of Space
or or ArrowDown
while altKey === true
will dispatch the event.
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 2em;" > <overlay-trigger placement="bottom-start"> <sp-action-button label="Edit" hold-affordance slot="trigger"> <sp-icon-edit slot="icon"></sp-icon-edit> </sp-action-button> <sp-popover slot="longpress-content" dialog tip> <p style="color: var(--spectrum-neutral-content-color-default);"> This content is triggered by the "longpress" interaction. </p> </sp-popover> </overlay-trigger> <overlay-trigger placement="top"> <sp-action-button hold-affordance quiet slot="trigger"> Show Longpress Content </sp-action-button> <sp-popover slot="longpress-content" dialog tip> <p style="color: var(--spectrum-neutral-content-color-default);"> This content is triggered by the "longpress" interaction. </p> </sp-popover> </overlay-trigger> <overlay-trigger placement="top-end"> <sp-action-button hold-affordance selected slot="trigger"> <sp-icon-edit slot="icon"></sp-icon-edit> Extended Content with Longpress </sp-action-button> <sp-popover slot="longpress-content" dialog tip> <p style="color: var(--spectrum-neutral-content-color-default);"> This content is triggered by the "longpress" interaction. </p> </sp-popover> </overlay-trigger> </div>
Toggles #
With the application of the toggles
attribute, the button will self manage its selected
property on click
. When this value is updated, a cancellable change
event will be dispatched to inform the parent application.
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 2em;" > <div> <sp-field-label for="toggles-default">Standard</sp-field-label> <sp-action-button toggles id="toggles-default"> Toggle button </sp-action-button> </div> <div> <sp-field-label for="toggles-quiet">Quiet</sp-field-label> <sp-action-button toggles quiet id="toggles-quiet"> Toggle button </sp-action-button> </div> <div> <sp-field-label for="toggles-emphasized">Emphasized</sp-field-label> <sp-action-button toggles emphasized id="toggles-emphasized"> Toggle button </sp-action-button> </div> <div> <sp-field-label for="toggles-emphasized-quiet"> Emphasized + Quiet </sp-field-label> <sp-action-button toggles emphasized quiet id="toggles-emphasized-quiet" > Toggle button </sp-action-button> </div> </div>
Handling events #
Events handlers for clicks and other user actions can be registered on a <sp-action-button>
as on a standard HTML <button>
element.
<sp-button onclick="spAlert(this, '<sp-action-button> clicked!')"> Click me </sp-button>
In addition to handling events like a native <button>
HTML element, one can also use a <sp-action-button>
in place of the <a>
HTML element by using the href
and optional target
attribute.
<sp-action-button href="https://github.com/adobe/spectrum-web-components" target="_blank" > Click me </sp-action-button>