sp-swatch-group
NPM 1.9.0
View Storybook
Overview
An <sp-swatch-group> group is a grouping of <sp-swatch> elements that are related to each other.
Usage
yarn add @spectrum-web-components/swatch
Import the side effectful registration of <sp-swatch-group> via:
import '@spectrum-web-components/swatch/sp-swatch-group.js';
When looking to leverage the SwatchGroup base class as a type and/or for extension purposes, do so via:
import { SwatchGroup } from '@spectrum-web-components/swatch';
Options
Sizes
Just like swatches, swatch groups come in four different sizes: extra-small, small, medium, and large. The medium size is the default option. This only affects the size of each individual swatch, not the spacing between them.
<sp-swatch-group size="xs"> <sp-swatch color="var(--spectrum-gray-500)"></sp-swatch> <sp-swatch color="var(--spectrum-red-500)"></sp-swatch> <sp-swatch color="var(--spectrum-orange-500)"></sp-swatch> <sp-swatch color="var(--spectrum-yellow-500)"></sp-swatch> <sp-swatch color="var(--spectrum-chartreuse-500)"></sp-swatch> <sp-swatch color="var(--spectrum-celery-500)"></sp-swatch> <sp-swatch color="var(--spectrum-green-500)"></sp-swatch> <sp-swatch color="var(--spectrum-seafoam-500)"></sp-swatch> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group size="s"> <sp-swatch color="var(--spectrum-gray-500)"></sp-swatch> <sp-swatch color="var(--spectrum-red-500)"></sp-swatch> <sp-swatch color="var(--spectrum-orange-500)"></sp-swatch> <sp-swatch color="var(--spectrum-yellow-500)"></sp-swatch> <sp-swatch color="var(--spectrum-chartreuse-500)"></sp-swatch> <sp-swatch color="var(--spectrum-celery-500)"></sp-swatch> <sp-swatch color="var(--spectrum-green-500)"></sp-swatch> <sp-swatch color="var(--spectrum-seafoam-500)"></sp-swatch> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group size="m"> <sp-swatch color="var(--spectrum-gray-500)"></sp-swatch> <sp-swatch color="var(--spectrum-red-500)"></sp-swatch> <sp-swatch color="var(--spectrum-orange-500)"></sp-swatch> <sp-swatch color="var(--spectrum-yellow-500)"></sp-swatch> <sp-swatch color="var(--spectrum-chartreuse-500)"></sp-swatch> <sp-swatch color="var(--spectrum-celery-500)"></sp-swatch> <sp-swatch color="var(--spectrum-green-500)"></sp-swatch> <sp-swatch color="var(--spectrum-seafoam-500)"></sp-swatch> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group size="l"> <sp-swatch color="var(--spectrum-gray-500)"></sp-swatch> <sp-swatch color="var(--spectrum-red-500)"></sp-swatch> <sp-swatch color="var(--spectrum-orange-500)"></sp-swatch> <sp-swatch color="var(--spectrum-yellow-500)"></sp-swatch> <sp-swatch color="var(--spectrum-chartreuse-500)"></sp-swatch> <sp-swatch color="var(--spectrum-celery-500)"></sp-swatch> <sp-swatch color="var(--spectrum-green-500)"></sp-swatch> <sp-swatch color="var(--spectrum-seafoam-500)"></sp-swatch> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group>
Density
Swatch groups come in 3 densities: regular (default), compact, and spacious. The density attribute/property is not required and when applied accepts the values of compact or spacious. When not applied or undefined, the density of the group is set to regular (default).
<sp-swatch-group> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group density="compact"> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group density="spacious"> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group>
Selection mode
An <sp-swatch-group> element has two selection modes. The selects property can be set to either single, indicating a user can choose up to one swatch, or multiple, indicating a user can choose more than one swatch.
When the selects property is set to one of these values, the selected property of <sp-swatch-group> will surface an array the represents the string values that have been selected in the UI. This selected property can be populated in two ways: through user input, or directly from <sp-swatch> children.
When the value of selected is updated via user input, the change event will be dispatched on the <sp-swatch-group> element to announce that interaction. Calling preventDefault() on the change event will prevent both the <sp-swatch-group> and the <sp-swatch> that initiated the change interaction from updating their selected values.
The value of the selected property also can be provided directly from the <sp-swatch> children. Child <sp-swatch> elements with their own selected attribute will be gathered and merged with any other selection data on the <sp-swatch-group> parent to populate selected.
The selected property is always an array, so applications can programmatically set multiple selections regardless of the value of selects. However, user interactions will respect the selects property and enforce either single or multiple selection behavior accordingly.
<sp-swatch-group selects="single" onchange="this.nextElementSibling.textContent = `Selected: ${JSON.stringify(this.selected, null, ' ')}`" > <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)" selected></sp-swatch> </sp-swatch-group> <div>Selected: [ "var(--spectrum-magenta-500)" ]</div>
<sp-swatch> children of an <sp-swatch-group selects="multiple"> parent will toggle their selection.
<sp-swatch-group selects="multiple" onchange="this.nextElementSibling.textContent = `Selected: ${JSON.stringify(this.selected, null, ' ')}`" > <sp-swatch color="var(--spectrum-blue-500)" selected></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)" selected></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)"></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)"></sp-swatch> </sp-swatch-group> <div> Selected: [ "var(--spectrum-blue-500)", "var(--spectrum-purple-500)" ] </div>
Value
When available, the selected property will be populated with the value attributes/properties of the child <sp-swatch> elements. This is useful when you need the swatch data to correlate to a hash or identifier rather than the raw color string.
<sp-swatch-group selects="multiple" selected='["color-2"]' onchange="this.nextElementSibling.textContent = `Selected: ${JSON.stringify(this.selected, null, ' ')}`" > <sp-swatch color="var(--spectrum-blue-500)" value="color-0"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)" value="color-1" selected ></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)" value="color-2"></sp-swatch> <sp-swatch color="var(--spectrum-fuchsia-500)" value="color-3" selected ></sp-swatch> <sp-swatch color="var(--spectrum-magenta-500)" value="color-4"></sp-swatch> </sp-swatch-group> <div>Selected: [ "color-2", "color-1", "color-3" ]</div>
Swatch modifying attributes
An <sp-swatch-group> element can be modified by the following attributes/properties to customize its delivery as desired for your use case: border, density, rounding, shape, and size. Use these in concert with each other for a variety of final visual deliveries. Applying a value for one of these attributes/properties to an <sp-swatch-group> element will have it forward the value to all of the <sp-swatch> elements that are a direct child of the group, overriding any value that may be applied directly to those children.
Once applied to an <sp-swatch-group> element, the value of the border, rounding, shape, and size attributes/properties cannot be overridden on the children <sp-swatch> elements.
<sp-swatch-group shape="rectangle"> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group rounding="full"> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group rounding="none"> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group border="light"> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> </sp-swatch-group>
<sp-swatch-group border="none"> <sp-swatch color="var(--spectrum-blue-500)"></sp-swatch> <sp-swatch color="var(--spectrum-indigo-500)"></sp-swatch> <sp-swatch color="var(--spectrum-purple-500)"></sp-swatch> </sp-swatch-group>
Accessibility
The swatch group implements several accessibility features:
tabindex="0"on the selected swatch and unselected swatches havetabindex="-1"- The swatch group role changes based on the
selectsproperty. Whenselects="single", the group hasrole="radiogroup"and each swatch gets arole="radio". Whenselects="multiple", the group hasrole="group"and each swatch gets arole="checkbox".
Best practices
- Ensure swatches have sufficient color contrast for visibility.
- Verify that swatch groups are appropriately labeled for screen readers by adding
aria-labeloraria-labelledbyattributes to describe the purpose of the group.
Keyboard navigation
Tab: Move focus to the next focusable elementArrow keys: Navigate between swatches in the group and move the focus indicatorEnterorSpace: Select the focused swatch
API
Attributes and Properties
border border SwatchBorder density density 'compact' | 'spacious' | undefined rounding rounding SwatchRounding selected selected string[] selects selects SwatchSelects shape shape SwatchShape Slots
default slot Events
change Event