diff --git a/.changeset/shy-actors-behave.md b/.changeset/shy-actors-behave.md
new file mode 100644
index 00000000000..a93ea298e44
--- /dev/null
+++ b/.changeset/shy-actors-behave.md
@@ -0,0 +1,78 @@
+---
+@spectrum-css/slider: major
+---
+
+### S2 Slider Migration
+
+#### New features
+
+- Emphasized track fill color
+- Precision control handle
+- Large and thin track heights
+- Embedded editable text field component
+
+#### Visual changes
+
+- No longer a gap between slider handle and the track
+- Updated dimensions of slider handles for each size variant
+- Updated WHCM for all variants
+
+
+#### New tokens
+
+`--spectrum-slider-control-to-field-label-editable-extra-large`
+`--spectrum-slider-control-to-field-label-editable-large`
+`--spectrum-slider-control-to-field-label-editable-medium`
+`--spectrum-slider-control-to-field-label-editable-small`
+`--spectrum-slider-control-to-side-field-label-extra-large`
+`--spectrum-slider-control-to-side-field-label-large`
+`--spectrum-slider-control-to-side-field-label-medium`
+`--spectrum-slider-control-to-side-field-label-small`
+`--spectrum-slider-control-to-text-field-extra-large`
+`--spectrum-slider-control-to-text-field-large`
+`--spectrum-slider-control-to-text-field-medium`
+`--spectrum-slider-control-to-text-field-small`
+`--spectrum-slider-editable-control-to-field-label`
+`--spectrum-slider-editable-control-to-text-field`
+`--spectrum-slider-editable-field-inline-size-extra-large`
+`--spectrum-slider-editable-field-inline-size-large`
+`--spectrum-slider-editable-field-inline-size-medium`
+`--spectrum-slider-editable-field-inline-size-small`
+`--spectrum-slider-emphasized-track-fill-color`
+`--spectrum-slider-precision-handle-height`
+`--spectrum-slider-precision-handle-height-extra-large`
+`--spectrum-slider-precision-handle-height-large`
+`--spectrum-slider-precision-handle-height-medium`
+`--spectrum-slider-precision-handle-height-small`
+`--spectrum-slider-precision-handle-width`
+`--spectrum-slider-handle-extra-large`
+`--spectrum-slider-handle-large`
+`--spectrum-slider-handle-medium`
+`--spectrum-slider-handle-small`
+
+#### New mods
+
+`--mod-slider-editable-control-to-text-field`
+`--mod-slider-editable-field-inline-size`
+`--mod-slider-disabled-border-color`
+`--mod-slider-emphasized-tick-mark-color`
+`--mod-slider-emphasized-track-fill-color`
+`--mod-slider-inline-size`
+`--mod-slider-label-font-style`
+`--mod-slider-label-font-weight`
+`--mod-slider-ramp-track-fill-color`
+`--mod-slider-tick-mark-color-filled-track`
+`--mod-slider-track-height-medium`
+
+#### Removed mods
+
+`--mod-disabled-border-color`
+`--mod-sectrum-slider-ramp-handle-border-color-active`
+`--mod-slider-handle-border-width-down`
+`--mod-slider-handle-gap`
+`--mod-slider-ramp-handle-background-color`
+`--mod-slider-tick-handle-background-color`
+`--mod-slider-tick-mark-color-disabled`
+`--mod-slider-track-handleoffset`
+`--mod-slider-track-margin-offset`
+`--mod-slider-track-middle-handleoffset`
diff --git a/components/slider/dist/metadata.json b/components/slider/dist/metadata.json
index a7a72c00314..7eaea714d74 100644
--- a/components/slider/dist/metadata.json
+++ b/components/slider/dist/metadata.json
@@ -3,8 +3,18 @@
"selectors": [
".spectrum-Slider",
".spectrum-Slider .spectrum-Slider-handle.is-focused:before",
+ ".spectrum-Slider--emphasized .spectrum-Slider-fill:before",
+ ".spectrum-Slider--emphasized .spectrum-Slider-ramp .spectrum-Slider-ramp-track-fill",
+ ".spectrum-Slider--emphasized .spectrum-Slider-tick:nth-child(-n + 4):after",
+ ".spectrum-Slider--emphasized .spectrum-Slider-track:first-child:before",
+ ".spectrum-Slider--emphasized.spectrum-Slider--range .spectrum-Slider-track:not(:first-of-type, :last-of-type):before",
".spectrum-Slider--filled .spectrum-Slider-track:first-child:before",
- ".spectrum-Slider--ramp .spectrum-Slider-handle",
+ ".spectrum-Slider--filled:not(.spectrum-Slider--range, .is-disabled, .spectrum-Slider--emphasized) .spectrum-Slider-tick:nth-child(-n + 4):after",
+ ".spectrum-Slider--offset:not(.spectrum-Slider--range, .is-disabled, .spectrum-Slider--emphasized) .spectrum-Slider-tick:nth-child(-n + 4):after",
+ ".spectrum-Slider--precise .spectrum-Slider-handle",
+ ".spectrum-Slider--range .spectrum-Slider-tick:nth-child(3):after",
+ ".spectrum-Slider--range .spectrum-Slider-tick:nth-child(4):after",
+ ".spectrum-Slider--range .spectrum-Slider-tick:nth-child(5):after",
".spectrum-Slider--range .spectrum-Slider-track ~ .spectrum-Slider-track",
".spectrum-Slider--range .spectrum-Slider-track:first-of-type",
".spectrum-Slider--range .spectrum-Slider-track:first-of-type:before",
@@ -13,9 +23,8 @@
".spectrum-Slider--range .spectrum-Slider-track:not(:first-of-type, :last-of-type):before",
".spectrum-Slider--range .spectrum-Slider-value",
".spectrum-Slider--sideLabel",
- ".spectrum-Slider--sideLabel .spectrum-Slider-controls",
".spectrum-Slider--sideLabel .spectrum-Slider-labelContainer",
- ".spectrum-Slider--sideLabel .spectrum-Slider-labelContainer + .spectrum-Slider-controls",
+ ".spectrum-Slider--sideLabel .spectrum-Slider-labelContainer + .spectrum-Slider-content",
".spectrum-Slider--sideLabel .spectrum-Slider-labelContainer .spectrum-Slider-label",
".spectrum-Slider--sideLabel .spectrum-Slider-value",
".spectrum-Slider--sizeL",
@@ -23,8 +32,12 @@
".spectrum-Slider--sizeXL",
".spectrum-Slider--tick",
".spectrum-Slider--tick .spectrum-Slider-controls",
- ".spectrum-Slider--tick .spectrum-Slider-handle",
".spectrum-Slider--tick .spectrum-Slider-tickLabel",
+ ".spectrum-Slider--track-height-large .spectrum-Slider-fill",
+ ".spectrum-Slider--track-height-large .spectrum-Slider-track",
+ ".spectrum-Slider-content",
+ ".spectrum-Slider-content--editable",
+ ".spectrum-Slider-content--editable .spectrum-Slider-controls",
".spectrum-Slider-controls",
".spectrum-Slider-controls:not(:has(.spectrum-Slider-ticks))",
".spectrum-Slider-fill",
@@ -33,7 +46,6 @@
".spectrum-Slider-handle",
".spectrum-Slider-handle.is-dragged",
".spectrum-Slider-handle.is-focused",
- ".spectrum-Slider-handle.is-focused:before",
".spectrum-Slider-handle.is-tophandle",
".spectrum-Slider-handle:active",
".spectrum-Slider-handle:before",
@@ -43,20 +55,25 @@
".spectrum-Slider-input:focus",
".spectrum-Slider-label",
".spectrum-Slider-labelContainer",
- ".spectrum-Slider-labelContainer + .spectrum-Slider-controls",
+ ".spectrum-Slider-labelContainer + .spectrum-Slider-content",
+ ".spectrum-Slider-labelContainer + .spectrum-Slider-content--editable",
".spectrum-Slider-labelContainer:lang(ja)",
".spectrum-Slider-labelContainer:lang(ko)",
".spectrum-Slider-labelContainer:lang(zh)",
".spectrum-Slider-ramp",
- ".spectrum-Slider-ramp path",
+ ".spectrum-Slider-ramp .spectrum-Slider-ramp-track",
+ ".spectrum-Slider-ramp .spectrum-Slider-ramp-track-fill",
".spectrum-Slider-ramp svg",
".spectrum-Slider-tick",
".spectrum-Slider-tick .spectrum-Slider-tickLabel",
+ ".spectrum-Slider-tick.spectrum-Slider-tick--track-height-large:after",
".spectrum-Slider-tick:after",
".spectrum-Slider-tick:first-of-type",
".spectrum-Slider-tick:first-of-type .spectrum-Slider-tickLabel",
+ ".spectrum-Slider-tick:first-of-type:after",
".spectrum-Slider-tick:last-of-type",
".spectrum-Slider-tick:last-of-type .spectrum-Slider-tickLabel",
+ ".spectrum-Slider-tick:last-of-type:after",
".spectrum-Slider-ticks",
".spectrum-Slider-ticks ~ .spectrum-Slider-handleContainer .spectrum-Slider-handle",
".spectrum-Slider-track",
@@ -82,9 +99,18 @@
".spectrum-Slider.is-disabled .spectrum-Slider-track:before",
".spectrum-Slider.is-disabled.spectrum-Slider--filled .spectrum-Slider-track:first-child:before",
".spectrum-Slider.is-disabled.spectrum-Slider--range .spectrum-Slider-track:not(:first-of-type, :last-of-type):before",
+ ".spectrum-Slider.spectrum-Slider--precise:not(.is-disabled) .spectrum-Slider-handle.is-focused:before",
+ ".spectrum-Slider.spectrum-Slider--precise:not(.is-disabled) .spectrum-Slider-handle:focus-visible:before",
+ ".spectrum-Slider.spectrum-Slider--precise:not(.is-disabled) .spectrum-Slider-handle:focus:before",
".spectrum-Slider.spectrum-Slider--ramp .spectrum-Slider-handle",
".spectrum-Slider:dir(rtl)",
".spectrum-Slider:dir(rtl) .spectrum-Slider-handle:before",
+ ".spectrum-Slider:not(.is-disabled) .spectrum-Slider-handle.is-focused",
+ ".spectrum-Slider:not(.is-disabled) .spectrum-Slider-handle.is-focused:before",
+ ".spectrum-Slider:not(.is-disabled) .spectrum-Slider-handle:focus",
+ ".spectrum-Slider:not(.is-disabled) .spectrum-Slider-handle:focus-visible",
+ ".spectrum-Slider:not(.is-disabled) .spectrum-Slider-handle:focus-visible:before",
+ ".spectrum-Slider:not(.is-disabled) .spectrum-Slider-handle:focus:before",
".spectrum-Slider:not(.is-disabled, .spectrum-Slider--filled, .spectrum-Slider--range) .spectrum-Slider-controls.is-focused",
".spectrum-Slider:not(.is-disabled, .spectrum-Slider--filled, .spectrum-Slider--range) .spectrum-Slider-controls:active",
".spectrum-Slider:not(.is-disabled, .spectrum-Slider--filled, .spectrum-Slider--range) .spectrum-Slider-controls:focus-within",
@@ -93,14 +119,18 @@
],
"modifiers": [
"--mod-animation-duration-100",
- "--mod-disabled-border-color",
"--mod-focus-indicator-gap",
"--mod-font-size-75",
"--mod-line-height-100",
- "--mod-sectrum-slider-ramp-handle-border-color-active",
"--mod-slider-cjk-line-height",
"--mod-slider-control-height",
+ "--mod-slider-control-to-side-field-label",
+ "--mod-slider-control-to-text-field",
"--mod-slider-controls-margin",
+ "--mod-slider-disabled-border-color",
+ "--mod-slider-editable-field-inline-size",
+ "--mod-slider-emphasized-tick-mark-color",
+ "--mod-slider-emphasized-track-fill-color",
"--mod-slider-font-size",
"--mod-slider-handle-background-color",
"--mod-slider-handle-background-color-disabled",
@@ -111,28 +141,27 @@
"--mod-slider-handle-border-color-key-focus",
"--mod-slider-handle-border-radius",
"--mod-slider-handle-border-width",
- "--mod-slider-handle-border-width-down",
"--mod-slider-handle-disabled-background-color",
"--mod-slider-handle-focus-ring-color-key-focus",
- "--mod-slider-handle-gap",
"--mod-slider-handle-size",
+ "--mod-slider-inline-size",
"--mod-slider-input-left",
"--mod-slider-input-top-size",
+ "--mod-slider-label-font-family",
+ "--mod-slider-label-font-style",
+ "--mod-slider-label-font-weight",
"--mod-slider-label-margin-start",
"--mod-slider-label-text-color",
"--mod-slider-label-text-color-disabled",
- "--mod-slider-label-top-to-text",
- "--mod-slider-min-size",
- "--mod-slider-ramp-handle-background-color",
"--mod-slider-ramp-track-color",
"--mod-slider-ramp-track-color-disabled",
+ "--mod-slider-ramp-track-fill-color",
"--mod-slider-ramp-track-height",
"--mod-slider-range-track-reset",
- "--mod-slider-tick-handle-background-color",
"--mod-slider-tick-label-color",
"--mod-slider-tick-mark-border-radius",
"--mod-slider-tick-mark-color",
- "--mod-slider-tick-mark-color-disabled",
+ "--mod-slider-tick-mark-color-filled-track",
"--mod-slider-tick-mark-height",
"--mod-slider-tick-mark-width",
"--mod-slider-ticks-handle-background-color",
@@ -142,22 +171,42 @@
"--mod-slider-track-fill-color",
"--mod-slider-track-fill-color-disabled",
"--mod-slider-track-fill-thickness",
- "--mod-slider-track-handleoffset",
- "--mod-slider-track-margin-offset",
- "--mod-slider-track-middle-handleoffset",
+ "--mod-slider-track-height-medium",
"--mod-slider-track-thickness",
- "--mod-slider-value-inline-size",
- "--mod-slider-value-side-padding-inline"
+ "--mod-slider-value-inline-size"
],
"component": [
"--spectrum-slider-cjk-line-height",
"--spectrum-slider-control-height",
"--spectrum-slider-control-to-field-label",
+ "--spectrum-slider-control-to-field-label-editable-extra-large",
+ "--spectrum-slider-control-to-field-label-editable-large",
+ "--spectrum-slider-control-to-field-label-editable-medium",
+ "--spectrum-slider-control-to-field-label-editable-small",
"--spectrum-slider-control-to-field-label-extra-large",
"--spectrum-slider-control-to-field-label-large",
"--spectrum-slider-control-to-field-label-medium",
+ "--spectrum-slider-control-to-field-label-side-extra-large",
+ "--spectrum-slider-control-to-field-label-side-large",
+ "--spectrum-slider-control-to-field-label-side-medium",
+ "--spectrum-slider-control-to-field-label-side-small",
"--spectrum-slider-control-to-field-label-small",
+ "--spectrum-slider-control-to-side-field-label",
+ "--spectrum-slider-control-to-text-field",
+ "--spectrum-slider-control-to-text-field-extra-large",
+ "--spectrum-slider-control-to-text-field-large",
+ "--spectrum-slider-control-to-text-field-medium",
+ "--spectrum-slider-control-to-text-field-small",
"--spectrum-slider-controls-margin",
+ "--spectrum-slider-downstate-perspective",
+ "--spectrum-slider-editable-control-to-field-label",
+ "--spectrum-slider-editable-field-inline-size-extra-large",
+ "--spectrum-slider-editable-field-inline-size-large",
+ "--spectrum-slider-editable-field-inline-size-medium",
+ "--spectrum-slider-editable-field-inline-size-small",
+ "--spectrum-slider-emphasized-tick-mark-color",
+ "--spectrum-slider-emphasized-track-fill-color",
+ "--spectrum-slider-focus-indicator-gap",
"--spectrum-slider-font-size",
"--spectrum-slider-handle-background-color",
"--spectrum-slider-handle-background-color-disabled",
@@ -168,38 +217,36 @@
"--spectrum-slider-handle-border-color-key-focus",
"--spectrum-slider-handle-border-radius",
"--spectrum-slider-handle-border-width",
- "--spectrum-slider-handle-border-width-down",
- "--spectrum-slider-handle-border-width-down-extra-large",
- "--spectrum-slider-handle-border-width-down-large",
- "--spectrum-slider-handle-border-width-down-medium",
- "--spectrum-slider-handle-border-width-down-small",
- "--spectrum-slider-handle-disabled-background-color",
+ "--spectrum-slider-handle-extra-large",
"--spectrum-slider-handle-focus-ring-color-key-focus",
"--spectrum-slider-handle-gap",
+ "--spectrum-slider-handle-large",
"--spectrum-slider-handle-margin-left",
+ "--spectrum-slider-handle-medium",
"--spectrum-slider-handle-size",
- "--spectrum-slider-handle-size-extra-large",
- "--spectrum-slider-handle-size-large",
- "--spectrum-slider-handle-size-medium",
- "--spectrum-slider-handle-size-small",
+ "--spectrum-slider-handle-small",
+ "--spectrum-slider-inline-size",
"--spectrum-slider-input-left",
"--spectrum-slider-input-top-size",
+ "--spectrum-slider-label-font-family",
+ "--spectrum-slider-label-font-style",
+ "--spectrum-slider-label-font-weight",
"--spectrum-slider-label-margin-start",
"--spectrum-slider-label-text-color",
"--spectrum-slider-label-text-color-disabled",
- "--spectrum-slider-label-top-to-text",
- "--spectrum-slider-min-size",
- "--spectrum-slider-ramp-handle-background-color",
- "--spectrum-slider-ramp-handle-border-color-active",
- "--spectrum-slider-ramp-track-color",
+ "--spectrum-slider-precision-handle-height",
+ "--spectrum-slider-precision-handle-height-extra-large",
+ "--spectrum-slider-precision-handle-height-large",
+ "--spectrum-slider-precision-handle-height-medium",
+ "--spectrum-slider-precision-handle-height-small",
+ "--spectrum-slider-precision-handle-width",
"--spectrum-slider-ramp-track-color-disabled",
"--spectrum-slider-ramp-track-height",
"--spectrum-slider-range-track-reset",
- "--spectrum-slider-tick-handle-background-color",
"--spectrum-slider-tick-label-color",
"--spectrum-slider-tick-mark-border-radius",
"--spectrum-slider-tick-mark-color",
- "--spectrum-slider-tick-mark-color-disabled",
+ "--spectrum-slider-tick-mark-color-filled-track",
"--spectrum-slider-tick-mark-height",
"--spectrum-slider-tick-mark-width",
"--spectrum-slider-ticks-handle-background-color",
@@ -209,54 +256,70 @@
"--spectrum-slider-track-fill-color",
"--spectrum-slider-track-fill-color-disabled",
"--spectrum-slider-track-fill-thickness",
- "--spectrum-slider-track-handleoffset",
- "--spectrum-slider-track-margin-offset",
- "--spectrum-slider-track-middle-handleoffset",
- "--spectrum-slider-track-thickness",
- "--spectrum-slider-value-inline-size",
- "--spectrum-slider-value-side-padding-inline"
+ "--spectrum-slider-track-height-large",
+ "--spectrum-slider-track-height-medium",
+ "--spectrum-slider-value-inline-size"
],
"global": [
+ "--spectrum-accent-color-1000",
+ "--spectrum-accent-content-color-default",
"--spectrum-animation-duration-100",
"--spectrum-border-width-200",
"--spectrum-cjk-line-height-100",
+ "--spectrum-component-bottom-to-text-100",
+ "--spectrum-component-bottom-to-text-200",
+ "--spectrum-component-bottom-to-text-300",
+ "--spectrum-component-bottom-to-text-75",
"--spectrum-component-height-100",
"--spectrum-component-height-200",
"--spectrum-component-height-300",
"--spectrum-component-height-75",
+ "--spectrum-component-size-difference-down",
+ "--spectrum-component-size-minimum-perspective-down",
"--spectrum-component-top-to-text-100",
"--spectrum-component-top-to-text-200",
+ "--spectrum-component-top-to-text-300",
"--spectrum-component-top-to-text-75",
"--spectrum-corner-radius-500",
+ "--spectrum-default-font-style",
"--spectrum-disabled-background-color",
"--spectrum-disabled-border-color",
"--spectrum-disabled-content-color",
+ "--spectrum-field-default-width-extra-large",
+ "--spectrum-field-default-width-large",
+ "--spectrum-field-default-width-medium",
+ "--spectrum-field-default-width-small",
"--spectrum-focus-indicator-color",
"--spectrum-focus-indicator-gap",
"--spectrum-focus-indicator-thickness",
"--spectrum-font-size-100",
"--spectrum-font-size-200",
+ "--spectrum-font-size-300",
"--spectrum-font-size-75",
- "--spectrum-gray-100",
- "--spectrum-gray-200",
+ "--spectrum-gray-25",
"--spectrum-gray-400",
"--spectrum-gray-700",
"--spectrum-gray-75",
"--spectrum-gray-800",
+ "--spectrum-gray-900",
"--spectrum-line-height-100",
"--spectrum-logical-rotation",
"--spectrum-neutral-content-color-default",
- "--spectrum-spacing-100",
- "--spectrum-spacing-200",
+ "--spectrum-neutral-subdued-content-color-default",
+ "--spectrum-regular-font-weight",
+ "--spectrum-sans-font-family-stack",
"--spectrum-spacing-300",
- "--spectrum-spacing-900",
- "--spectrum-text-to-visual-75"
+ "--spectrum-text-to-visual-75",
+ "--spectrum-track-color"
+ ],
+ "passthroughs": [
+ "--mod-fieldlabel-bottom-to-text",
+ "--mod-fieldlabel-top-to-text",
+ "--mod-textfield-width"
],
- "passthroughs": [],
"high-contrast": [
"--highcontrast-slider-filled-track-fill-color",
"--highcontrast-slider-handle-background-color",
- "--highcontrast-slider-handle-background-color-disabled",
"--highcontrast-slider-handle-border-color",
"--highcontrast-slider-handle-border-color-disabled",
"--highcontrast-slider-handle-border-color-down",
@@ -266,12 +329,11 @@
"--highcontrast-slider-handle-focus-ring-color-key-focus",
"--highcontrast-slider-label-text-color",
"--highcontrast-slider-label-text-color-disabled",
- "--highcontrast-slider-ramp-handle-background-color",
- "--highcontrast-slider-ramp-handle-border-color-active",
"--highcontrast-slider-ramp-track-color",
"--highcontrast-slider-ramp-track-color-disabled",
"--highcontrast-slider-tick-mark-color",
"--highcontrast-slider-tick-mark-color-disabled",
+ "--highcontrast-slider-tick-mark-color-filled-track",
"--highcontrast-slider-track-color",
"--highcontrast-slider-track-color-disabled",
"--highcontrast-slider-track-color-static",
diff --git a/components/slider/index.css b/components/slider/index.css
index cfaf3582bdf..c6e42d1a069 100644
--- a/components/slider/index.css
+++ b/components/slider/index.css
@@ -12,101 +12,125 @@
*/
.spectrum-Slider {
- --spectrum-slider-font-size: var(--spectrum-font-size-75);
- --spectrum-slider-handle-size: var(--spectrum-slider-handle-size-medium);
+ --spectrum-slider-font-size: var(--spectrum-font-size-100);
+ --spectrum-slider-handle-size: var(--spectrum-slider-handle-medium);
--spectrum-slider-control-height: var(--spectrum-component-height-100);
- --spectrum-slider-handle-border-width-down: var(--spectrum-slider-handle-border-width-down-medium);
- --spectrum-slider-label-top-to-text: var(--spectrum-component-top-to-text-75);
--spectrum-slider-control-to-field-label: var(--spectrum-slider-control-to-field-label-medium);
- --spectrum-slider-value-side-padding-inline: var(--spectrum-spacing-200);
+ --spectrum-slider-control-to-side-field-label: var(--spectrum-slider-control-to-field-label-side-medium);
+ --spectrum-slider-inline-size: var(--spectrum-field-default-width-medium);
+ --spectrum-slider-label-font-weight: var(--spectrum-regular-font-weight);
+ --spectrum-slider-label-font-style: var(--spectrum-default-font-style);
+ --spectrum-slider-label-font-family: var(--spectrum-sans-font-family-stack);
/* TODO: placeholder value for sideLabel variant value width */
--spectrum-slider-value-inline-size: 18px;
--spectrum-slider-cjk-line-height: var(--spectrum-cjk-line-height-100);
- --spectrum-slider-min-size: var(--spectrum-spacing-900);
-
--spectrum-slider-label-margin-start: var(--spectrum-spacing-300);
--spectrum-slider-handle-border-width: var(--spectrum-border-width-200);
--spectrum-slider-handle-margin-left: calc(var(--spectrum-slider-handle-size) / -2);
--spectrum-slider-controls-margin: calc(var(--spectrum-slider-handle-size) / 2);
- --spectrum-slider-track-margin-offset: calc(var(--spectrum-slider-controls-margin) * -1);
- --spectrum-slider-track-middle-handleoffset: calc(var(--spectrum-slider-handle-gap) + calc(var(--spectrum-slider-handle-size) / 2));
--spectrum-slider-input-top-size: calc(var(--spectrum-slider-handle-size) / -2 / 4);
- --spectrum-slider-track-fill-thickness: var(--spectrum-slider-track-thickness);
+ --spectrum-slider-track-fill-thickness: var(--spectrum-slider-track-height-medium);
--spectrum-slider-tick-mark-width: var(--spectrum-border-width-200);
--spectrum-slider-tick-mark-border-radius: 2px;
- --spectrum-slider-tick-handle-background-color: var(--spectrum-gray-100);
+ --spectrum-slider-focus-indicator-gap: var(--spectrum-focus-indicator-gap);
+ --spectrum-slider-downstate-perspective: var(--spectrum-component-size-minimum-perspective-down);
/* colors */
- --spectrum-slider-track-color: var(--spectrum-gray-200);
+ --spectrum-slider-track-color: var(--spectrum-track-color);
--spectrum-slider-track-fill-color: var(--spectrum-gray-700);
- --spectrum-slider-ramp-track-color: var(--spectrum-gray-400);
- --spectrum-slider-ramp-track-color-disabled: var(--spectrum-gray-100);
--spectrum-slider-track-color-disabled: var(--spectrum-disabled-background-color);
+ --spectrum-slider-ramp-track-color-disabled: var(--spectrum-slider-track-color-disabled);
--spectrum-slider-track-fill-color-disabled: var(--spectrum-disabled-background-color);
--spectrum-slider-handle-border-color-disabled: var(--spectrum-disabled-border-color);
- --spectrum-slider-label-text-color: var(--spectrum-neutral-content-color-default);
+ --spectrum-slider-label-text-color: var(--spectrum-neutral-subdued-content-color-default);
--spectrum-slider-tick-label-color: var(--spectrum-neutral-content-color-default);
--spectrum-slider-label-text-color-disabled: var(--spectrum-disabled-content-color);
- --spectrum-slider-tick-mark-color-disabled: var(--spectrum-disabled-background-color);
- --spectrum-slider-ramp-handle-border-color-active: var(--spectrum-gray-100);
- --spectrum-slider-handle-background-color: transparent;
- --spectrum-slider-handle-background-color-disabled: transparent;
- --spectrum-slider-ramp-handle-background-color: var(--spectrum-gray-75);
+ --spectrum-slider-handle-background-color: var(--spectrum-gray-25);
+ --spectrum-slider-handle-background-color-disabled: var(--spectrum-slider-handle-background-color);
--spectrum-slider-ticks-handle-background-color: var(--spectrum-gray-75);
- --spectrum-slider-handle-border-color: var(--spectrum-gray-700);
- --spectrum-slider-handle-disabled-background-color: var(--spectrum-gray-75);
- --spectrum-slider-tick-mark-color: var(--spectrum-gray-200);
-
- --spectrum-slider-handle-border-color-hover: var(--spectrum-gray-800);
- --spectrum-slider-handle-border-color-down: var(--spectrum-gray-800);
- --spectrum-slider-handle-border-color-key-focus: var(--spectrum-gray-800);
+ --spectrum-slider-handle-border-color: var(--spectrum-gray-800);
+ --spectrum-slider-tick-mark-color: var(--spectrum-gray-400);
+ --spectrum-slider-tick-mark-color-filled-track: var(--spectrum-gray-800);
+ --spectrum-slider-emphasized-tick-mark-color: var(--spectrum-accent-color-1000);
+ --spectrum-slider-emphasized-track-fill-color: var(--spectrum-accent-content-color-default);
+
+ --spectrum-slider-handle-border-color-hover: var(--spectrum-gray-900);
+ --spectrum-slider-handle-border-color-down: var(--spectrum-gray-900);
+ --spectrum-slider-handle-border-color-key-focus: var(--spectrum-gray-900);
--spectrum-slider-handle-focus-ring-color-key-focus: var(--spectrum-focus-indicator-color);
+ --spectrum-slider-precision-handle-height: var(--spectrum-slider-precision-handle-height-medium);
+
+ --spectrum-slider-control-to-text-field: var(--spectrum-slider-control-to-text-field-medium);
+ --spectrum-slider-editable-control-to-field-label: var(--spectrum-slider-control-to-field-label-editable-medium);
+
/* values */
--spectrum-slider-input-left: calc(var(--spectrum-slider-handle-margin-left) / 4);
- --spectrum-slider-track-handleoffset: var(--spectrum-slider-handle-gap);
--spectrum-slider-range-track-reset: 0;
--spectrum-slider-track-corner-radius: 2px;
- --spectrum-slider-handle-border-radius: var(--spectrum-corner-radius-500);
+ --spectrum-slider-handle-border-radius: var(--spectrum-slider-handle-size);
+
+ /* Textfield passthrough */
+ --mod-textfield-width: var(--mod-slider-editable-field-inline-size, var(--spectrum-slider-editable-field-inline-size-medium));
+
+ /* Field label passthrough */
+ --mod-fieldlabel-top-to-text: var(--spectrum-component-top-to-text-100);
+ --mod-fieldlabel-bottom-to-text: var(--spectrum-component-bottom-to-text-100);
}
.spectrum-Slider--sizeS {
--spectrum-slider-font-size: var(--spectrum-font-size-75);
- --spectrum-slider-handle-size: var(--spectrum-slider-handle-size-small);
+ --spectrum-slider-handle-size: var(--spectrum-slider-handle-small);
--spectrum-slider-control-height: var(--spectrum-component-height-75);
- --spectrum-slider-handle-border-width-down: var(--spectrum-slider-handle-border-width-down-small);
- --spectrum-slider-label-top-to-text: var(--spectrum-component-top-to-text-75);
--spectrum-slider-control-to-field-label: var(--spectrum-slider-control-to-field-label-small);
- --spectrum-slider-value-side-padding-inline: var(--spectrum-spacing-100);
+ --spectrum-slider-control-to-side-field-label: var(--spectrum-slider-control-to-field-label-side-small);
--spectrum-slider-handle-border-radius: var(--spectrum-corner-radius-500);
+ --spectrum-slider-inline-size: var(--spectrum-field-default-width-small);
+ --spectrum-slider-precision-handle-height: var(--spectrum-slider-precision-handle-height-small);
+ --spectrum-slider-control-to-text-field: var(--spectrum-slider-control-to-text-field-small);
+ --spectrum-slider-editable-control-to-field-label: var(--spectrum-slider-control-to-field-label-editable-small);
+ --mod-textfield-width: var(--spectrum-slider-editable-field-inline-size-small);
+ --mod-fieldlabel-top-to-text: var(--spectrum-component-top-to-text-75);
+ --mod-fieldlabel-bottom-to-text: var(--spectrum-component-bottom-to-text-75);
}
.spectrum-Slider--sizeL {
- --spectrum-slider-font-size: var(--spectrum-font-size-100);
- --spectrum-slider-handle-size: var(--spectrum-slider-handle-size-large);
+ --spectrum-slider-font-size: var(--spectrum-font-size-200);
+ --spectrum-slider-handle-size: var(--spectrum-slider-handle-large);
--spectrum-slider-control-height: var(--spectrum-component-height-200);
- --spectrum-slider-handle-border-width-down: var(--spectrum-slider-handle-border-width-down-large);
- --spectrum-slider-label-top-to-text: var(--spectrum-component-top-to-text-100);
+
--spectrum-slider-control-to-field-label: var(--spectrum-slider-control-to-field-label-large);
- --spectrum-slider-value-side-padding-inline: var(--spectrum-spacing-200);
+ --spectrum-slider-control-to-side-field-label: var(--spectrum-slider-control-to-field-label-side-large);
--spectrum-slider-handle-border-radius: calc(var(--spectrum-corner-radius-500) * 4);
+ --spectrum-slider-inline-size: var(--spectrum-field-default-width-large);
+ --spectrum-slider-precision-handle-height: var(--spectrum-slider-precision-handle-height-large);
+ --spectrum-slider-control-to-text-field: var(--spectrum-slider-control-to-text-field-large);
+ --spectrum-slider-editable-control-to-field-label: var(--spectrum-slider-control-to-field-label-editable-large);
+ --mod-textfield-width: var(--spectrum-slider-editable-field-inline-size-large);
+ --mod-fieldlabel-top-to-text: var(--spectrum-component-top-to-text-200);
+ --mod-fieldlabel-bottom-to-text: var(--spectrum-component-bottom-to-text-200);
/* TODO: placeholder value for sideLabel variant value width */
--spectrum-slider-value-inline-size: 18px;
}
.spectrum-Slider--sizeXL {
- --spectrum-slider-font-size: var(--spectrum-font-size-200);
- --spectrum-slider-handle-size: var(--spectrum-slider-handle-size-extra-large);
+ --spectrum-slider-font-size: var(--spectrum-font-size-300);
+ --spectrum-slider-handle-size: var(--spectrum-slider-handle-extra-large);
--spectrum-slider-control-height: var(--spectrum-component-height-300);
- --spectrum-slider-handle-border-width-down: var(--spectrum-slider-handle-border-width-down-extra-large);
- --spectrum-slider-label-top-to-text: var(--spectrum-component-top-to-text-200);
--spectrum-slider-control-to-field-label: var(--spectrum-slider-control-to-field-label-extra-large);
- --spectrum-slider-value-side-padding-inline: var(--spectrum-spacing-200);
+ --spectrum-slider-control-to-side-field-label: var(--spectrum-slider-control-to-field-label-side-extra-large);
--spectrum-slider-handle-border-radius: calc(var(--spectrum-corner-radius-500) * 4);
+ --spectrum-slider-inline-size: var(--spectrum-field-default-width-extra-large);
+ --spectrum-slider-precision-handle-height: var(--spectrum-slider-precision-handle-height-extra-large);
+ --spectrum-slider-control-to-text-field: var(--spectrum-slider-control-to-text-field-extra-large);
+ --spectrum-slider-editable-control-to-field-label: var(--spectrum-slider-control-to-field-label-editable-extra-large);
+ --mod-textfield-width: var(--spectrum-slider-editable-field-inline-size-extra-large);
+ --mod-fieldlabel-top-to-text: var(--spectrum-component-top-to-text-300);
+ --mod-fieldlabel-bottom-to-text: var(--spectrum-component-bottom-to-text-300);
/* TODO: placeholder value for sideLabel variant value width */
--spectrum-slider-value-inline-size: 22px;
@@ -118,7 +142,7 @@
/* Don't let z-index'd child elements float above other things on the page */
z-index: 0;
display: block;
- min-inline-size: var(--mod-slider-min-size, var(--spectrum-slider-min-size));
+ inline-size: var(--mod-slider-inline-size, var(--spectrum-slider-inline-size));
user-select: none;
@@ -132,6 +156,25 @@
}
}
+.spectrum-Slider--track-height-large {
+ .spectrum-Slider-track,
+ .spectrum-Slider-fill {
+ --spectrum-slider-track-fill-thickness: var(--spectrum-slider-track-height-large);
+ }
+}
+
+.spectrum-Slider--precise {
+ .spectrum-Slider-handle {
+ inline-size: var(--spectrum-slider-precision-handle-width);
+ block-size: var(--spectrum-slider-precision-handle-height);
+ margin-inline: 0;
+ inset-block-start: calc(var(--mod-slider-control-height, var(--spectrum-slider-control-height)) / 2 - var(--spectrum-slider-precision-handle-height) / 2);
+ margin-inline-start: calc((var(--spectrum-slider-precision-handle-width) + var(--spectrum-slider-handle-border-width)) * -0.5);
+
+
+ }
+}
+
.spectrum-Slider--sideLabel {
display: flex;
align-items: center;
@@ -139,48 +182,63 @@
.spectrum-Slider-labelContainer {
margin-block-start: 0;
+ /* This helps prevent the slider from shrinking when the label is long */
+ flex: 1;
+
.spectrum-Slider-label {
- margin-inline-end: var(--mod-slider-value-side-padding-inline, var(--spectrum-slider-value-side-padding-inline));
+ margin-inline-end: var(--mod-slider-control-to-side-field-label, var(--spectrum-slider-control-to-side-field-label));
}
}
- .spectrum-Slider-labelContainer + .spectrum-Slider-controls {
+ .spectrum-Slider-labelContainer + .spectrum-Slider-content {
margin-block-start: 0;
}
- .spectrum-Slider-controls {
- margin-inline-end: var(--mod-slider-controls-margin, var(--spectrum-slider-controls-margin));
- }
-
.spectrum-Slider-value {
- margin-inline-start: var(--mod-slider-value-side-padding-inline, var(--spectrum-slider-value-side-padding-inline));
+ margin-inline-start: var(--mod-slider-control-to-text-field, var(--spectrum-slider-control-to-text-field));
inline-size: var(--mod-slider-value-inline-size, var(--spectrum-slider-value-inline-size));
text-align: start;
}
}
+.spectrum-Slider-content {
+ inline-size: 100%;
+}
+
+.spectrum-Slider-content--editable {
+ display: flex;
+ align-items: center;
+ gap: var(--mod-slider-control-to-text-field, var(--spectrum-slider-control-to-text-field));
+
+ .spectrum-Slider-controls {
+ /* This allows the text field to grow to design spec inline size */
+ flex: 1;
+ }
+}
+
.spectrum-Slider-controls {
display: inline-block;
box-sizing: border-box;
cursor: pointer;
position: relative;
z-index: auto;
+ inline-size: 100%;
&:not(:has(.spectrum-Slider-ticks)) {
display: flex;
align-items: center;
}
- /* These calculations prevent the track from spilling outside of the control */
- inline-size: calc(100% - calc(var(--mod-slider-controls-margin, var(--spectrum-slider-controls-margin))) * 2);
- margin-inline-start: var(--mod-slider-controls-margin, var(--spectrum-slider-controls-margin));
-
block-size: var(--mod-slider-control-height, var(--spectrum-slider-control-height));
vertical-align: top;
}
-.spectrum-Slider-labelContainer + .spectrum-Slider-controls {
- margin-block-start: calc(-1 * var(--spectrum-slider-control-to-field-label));
+.spectrum-Slider-labelContainer + .spectrum-Slider-content {
+ margin-block-start: var(--spectrum-slider-control-to-field-label);
+}
+
+.spectrum-Slider-labelContainer + .spectrum-Slider-content--editable {
+ margin-block-start: var(--spectrum-slider-editable-control-to-field-label);
}
/* TODO: Sliders with ticks + tick mark labels require more margin-block-end.
@@ -204,8 +262,6 @@
padding-block: 0;
padding-inline-start: 0;
- padding-inline-end: var(--mod-slider-handle-gap, var(--spectrum-slider-handle-gap));
- margin-inline-start: var(--mod-slider-track-margin-offset, var(--spectrum-slider-track-margin-offset));
touch-action: none; /* Disable touch scrolling on touch devices to allow dragging slider */
user-select: none;
@@ -243,10 +299,8 @@
inset-inline-start: auto;
inset-inline-end: var(--mod-slider-range-track-reset, var(--spectrum-slider-range-track-reset));
padding-block: 0;
- padding-inline-start: var(--mod-slider-track-handleoffset, var(--spectrum-slider-track-handleoffset));
padding-inline-end: 0;
margin-inline-start: var(--mod-slider-range-track-reset, var(--spectrum-slider-range-track-reset));
- margin-inline-end: var(--mod-slider-track-margin-offset, var(--spectrum-slider-track-margin-offset));
user-select: none;
touch-action: none; /* Disable touch scrolling on touch devices to allow dragging slider handle */
}
@@ -254,7 +308,6 @@
/* over-write for Range, without the LTR RTL post-css hack */
.spectrum-Slider--range {
.spectrum-Slider-track ~ .spectrum-Slider-track {
- padding-inline: var(--mod-slider-track-middle-handleoffset, var(--spectrum-slider-track-middle-handleoffset)) var(--mod-slider-track-middle-handleoffset, var(--spectrum-slider-track-middle-handleoffset));
inset-inline: auto;
margin-inline: var(--mod-slider-range-track-reset, var(--spectrum-slider-range-track-reset));
}
@@ -263,7 +316,6 @@
.spectrum-Slider-fill {
margin-inline-start: 0;
padding-block: 0;
- padding-inline-start: calc(var(--mod-slider-controls-margin, var(--spectrum-slider-controls-margin)) + var(--spectrum-slider-handle-gap, var(--spectrum-slider-handle-gap)));
padding-inline-end: 0;
}
@@ -281,10 +333,8 @@
.spectrum-Slider-track {
&:first-of-type {
padding-inline-start: 0;
- padding-inline-end: var(--mod-slider-track-handleoffset, var(--spectrum-slider-track-handleoffset));
inset-inline-start: var(--mod-slider-range-track-reset, var(--spectrum-slider-range-track-reset));
inset-inline-end: auto;
- margin-inline-start: var(--mod-slider-track-margin-offset, var(--spectrum-slider-track-margin-offset));
}
&:first-of-type::before {
@@ -293,11 +343,9 @@
}
&:last-of-type {
- padding-inline-start: var(--spectrum-slider-track-handleoffset);
padding-inline-end: 0;
inset-inline-start: auto;
inset-inline-end: var(--mod-slider-range-track-reset, var(--spectrum-slider-range-track-reset));
- margin-inline-end: var(--mod-slider-track-margin-offset, var(--spectrum-slider-track-margin-offset));
}
&:last-of-type::before {
@@ -309,10 +357,8 @@
.spectrum-Slider-ramp {
block-size: var(--mod-slider-ramp-track-height, var(--spectrum-slider-ramp-track-height));
-
position: absolute;
- inset-inline-start: var(--spectrum-slider-track-margin-offset, var(--spectrum-slider-track-margin-offset));
- inset-inline-end: var(--spectrum-slider-track-margin-offset, var(--spectrum-slider-track-margin-offset));
+ inline-size: 100%;
svg {
inline-size: 100%;
@@ -324,6 +370,8 @@
}
.spectrum-Slider-handle {
+ border-color: var(--highcontrast-slider-handle-border-color, var(--mod-slider-handle-border-color, var(--spectrum-slider-handle-border-color)));
+ background: var(--highcontrast-slider-handle-background-color, var(--mod-slider-handle-background-color, var(--spectrum-slider-handle-background-color)));
position: absolute;
inset-inline-start: 0;
z-index: 2;
@@ -339,15 +387,20 @@
border-width: var(--mod-slider-handle-border-width, var(--spectrum-slider-handle-border-width));
border-style: solid;
- border-radius: var(--mod-slider-handle-border-radius, var(--spectrum-slider-handle-border-radius));
+ border-radius: var(--mod-slider-handle-border-radius, var(--spectrum-slider-handle-size));
transition: border-width var(--mod-animation-duration-100, var(--spectrum-animation-duration-100)) ease-in-out;
outline: none;
+ &:hover {
+ border-color: var(--highcontrast-slider-handle-border-color-hover, var(--mod-slider-handle-border-color-hover, var(--spectrum-slider-handle-border-color-hover)));
+ }
+
&:active,
&.is-dragged {
- border-width: var(--mod-slider-handle-border-width-down, var(--spectrum-slider-handle-border-width-down));
+ border-color: var(--highcontrast-slider-handle-border-color-down, var(--mod-slider-handle-border-color-down, var(--spectrum-slider-handle-border-color-down)));
+ transform: perspective(var(--spectrum-slider-downstate-perspective)) translateZ(var(--spectrum-component-size-difference-down));
}
&:active,
@@ -382,10 +435,14 @@
}
/* Keyboard focused */
- &.is-focused {
+ .spectrum-Slider:not(.is-disabled) &.is-focused, .spectrum-Slider:not(.is-disabled) &:focus, .spectrum-Slider:not(.is-disabled) &:focus-visible {
+ border-color: var(--highcontrast-slider-handle-border-color-key-focus, var(--mod-slider-handle-border-color-key-focus, var(--spectrum-slider-handle-border-color-key-focus)));
+ outline: 0;
+
&::before {
- inline-size: calc(var(--mod-slider-handle-size, var(--spectrum-slider-handle-size)) + var(--mod-focus-indicator-gap, var(--spectrum-focus-indicator-gap)) * 2);
- block-size: calc(var(--mod-slider-handle-size, var(--spectrum-slider-handle-size)) + var(--mod-focus-indicator-gap, var(--spectrum-focus-indicator-gap)) * 2);
+ box-shadow: 0 0 0 var(--spectrum-focus-indicator-thickness) var(--highcontrast-slider-handle-focus-ring-color-key-focus, var(--mod-slider-handle-focus-ring-color-key-focus, var(--spectrum-slider-handle-focus-ring-color-key-focus)));
+ inline-size: calc(var(--mod-slider-handle-size, var(--spectrum-slider-handle-size)) + var(--mod-focus-indicator-gap, var(--spectrum-slider-focus-indicator-gap)) * 2);
+ block-size: calc(var(--mod-slider-handle-size, var(--spectrum-slider-handle-size)) + var(--mod-focus-indicator-gap, var(--spectrum-slider-focus-indicator-gap)) * 2);
}
}
}
@@ -427,8 +484,9 @@
font-size: var(--mod-slider-font-size, var(--spectrum-slider-font-size));
line-height: var(--mod-line-height-100, var(--spectrum-line-height-100));
-
- margin-block-start: var(--mod-slider-label-top-to-text, var(--spectrum-slider-label-top-to-text));
+ font-weight: var(--mod-slider-label-font-weight, var(--spectrum-slider-label-font-weight));
+ font-style: var(--mod-slider-label-font-style, var(--spectrum-slider-label-font-style));
+ font-family: var(--mod-slider-label-font-family, var(--spectrum-slider-label-font-family));
/* international support */
&:lang(ja),
@@ -457,12 +515,8 @@
/* setting tick marks in relation to label */
.spectrum-Slider--tick {
- .spectrum-Slider-handle {
- background-color: var(--mod-slider-tick-handle-background-color, var(--spectrum-slider-tick-handle-background-color));
- }
-
.spectrum-Slider-controls {
- margin-block-start: calc(var(--spectrum-text-to-visual-75) - var(--mod-slider-tick-mark-height, var(--spectrum-slider-tick-mark-height)) / 2 - var(--mod-slider-track-thickness, var(--spectrum-slider-track-thickness)) / 2);
+ margin-block-start: calc(var(--spectrum-text-to-visual-75) - var(--mod-slider-tick-mark-height, var(--spectrum-slider-tick-mark-height)) / 2 - var(--mod-slider-track-height-medium, var(--spectrum-slider-track-height-medium)) / 2);
}
.spectrum-Slider-tickLabel {
@@ -474,8 +528,8 @@
.spectrum-Slider-ticks {
display: flex;
justify-content: space-between;
- z-index: 0;
- margin-inline: var(--mod-slider-track-margin-offset, var(--spectrum-slider-track-margin-offset));
+ z-index: 2;
+ position: relative;
/* TODO: missing core-token for handle fill-color */
& ~ .spectrum-Slider-handleContainer {
@@ -503,6 +557,13 @@
border-radius: var(--mod-slider-tick-mark-border-radius, var(--spectrum-slider-tick-mark-border-radius));
}
+ &.spectrum-Slider-tick--track-height-large {
+ &::after {
+ block-size: calc(var(--spectrum-slider-track-height-large) + 2px);
+ inset-block-start: -4px;
+ }
+ }
+
.spectrum-Slider-tickLabel {
display: flex;
align-items: center;
@@ -521,6 +582,13 @@
}
}
+ &:first-of-type,
+ &:last-of-type {
+ &::after {
+ opacity: 0;
+ }
+ }
+
&:first-of-type {
/* fix off-by-one alignment */
inset-inline-start: calc(var(--mod-slider-tick-mark-width, var(--spectrum-slider-tick-mark-width)) / -2);
@@ -591,42 +659,32 @@
.spectrum-Slider-fill {
&::before {
background: var(--highcontrast-slider-filled-track-fill-color, var(--mod-slider-track-fill-color, var(--spectrum-slider-track-fill-color)));
+ border-start-start-radius: var(--mod-slider-track-corner-radius, var(--spectrum-slider-track-corner-radius));
+ border-end-start-radius: var(--mod-slider-track-corner-radius, var(--spectrum-slider-track-corner-radius));
}
}
-.spectrum-Slider-ramp {
- path {
- fill: var(--highcontrast-slider-ramp-track-color, var(--mod-slider-ramp-track-color, var(--spectrum-slider-ramp-track-color)));
- }
-}
-
-.spectrum-Slider-handle {
- border-color: var(--highcontrast-slider-handle-border-color, var(--mod-slider-handle-border-color, var(--spectrum-slider-handle-border-color)));
- background: var(--highcontrast-slider-handle-background-color, var(--mod-slider-handle-background-color, var(--spectrum-slider-handle-background-color)));
-
- &:hover {
- border-color: var(--highcontrast-slider-handle-border-color-hover, var(--mod-slider-handle-border-color-hover, var(--spectrum-slider-handle-border-color-hover)));
- }
-
- /* Keyboard focused with focus indicator. */
- &.is-focused {
- border-color: var(--highcontrast-slider-handle-border-color-key-focus, var(--mod-slider-handle-border-color-key-focus, var(--spectrum-slider-handle-border-color-key-focus)));
-
+.spectrum-Slider--emphasized {
+ .spectrum-Slider-track:first-child,
+ &.spectrum-Slider--range .spectrum-Slider-track:not(:first-of-type, :last-of-type),
+ .spectrum-Slider-fill {
&::before {
- box-shadow: 0 0 0 var(--spectrum-focus-indicator-thickness) var(--highcontrast-slider-handle-focus-ring-color-key-focus, var(--mod-slider-handle-focus-ring-color-key-focus, var(--spectrum-slider-handle-focus-ring-color-key-focus)));
+ background: var(--highcontrast-slider-filled-track-fill-color, var(--mod-slider-emphasized-track-fill-color, var(--spectrum-slider-emphasized-track-fill-color)));
}
}
- &:active,
- &.is-dragged {
- border-color: var(--highcontrast-slider-handle-border-color-down, var(--mod-slider-handle-border-color-down, var(--spectrum-slider-handle-border-color-down)));
+ .spectrum-Slider-ramp .spectrum-Slider-ramp-track-fill {
+ fill: var(--spectrum-slider-emphasized-track-fill-color);
}
}
-.spectrum-Slider--ramp {
- .spectrum-Slider-handle {
- box-shadow: 0 0 0 var(--spectrum-slider-handle-gap) var(--highcontrast-slider-ramp-handle-border-color-active, var(--mod-sectrum-slider-ramp-handle-border-color-active, var(--spectrum-slider-ramp-handle-border-color-active)));
- background: var(--mod-slider-ramp-handle-background-color, var(--highcontrast-slider-ramp-handle-background-color, var(--spectrum-slider-ramp-handle-background-color)));
+.spectrum-Slider-ramp {
+ .spectrum-Slider-ramp-track {
+ fill: var(--highcontrast-slider-ramp-track-color, var(--mod-slider-ramp-track-color, var(--spectrum-slider-track-color)));
+ }
+
+ .spectrum-Slider-ramp-track-fill {
+ fill: var(--highcontrast-slider-filled-track-fill-color, var(--mod-slider-ramp-track-fill-color, var(--spectrum-slider-track-fill-color)));
}
}
@@ -634,16 +692,30 @@
background: transparent;
}
-.spectrum-Slider-tick {
- &::after {
- background-color: var(--highcontrast-slider-tick-mark-color, var(--mod-slider-tick-mark-color, var(--spectrum-slider-tick-mark-color)));
+.spectrum-Slider--emphasized {
+ .spectrum-Slider-tick:nth-child(-n + 4) {
+ &::after {
+ background-color: var(--highcontrast-slider-tick-mark-color-filled-track, var(--mod-slider-emphasized-tick-mark-color, var(--spectrum-slider-emphasized-tick-mark-color)));
+ }
}
}
-.spectrum-Slider-handle {
- &.is-dragged {
- border-color: var(--highcontrast-slider-handle-border-color-down, var(--mod-slider-handle-border-color-down, var(--spectrum-slider-handle-border-color-down)));
- background: var(--highcontrast-slider-handle-background-color, var(--mod-slider-handle-background-color, var(--spectrum-slider-handle-background-color)));
+.spectrum-Slider--filled,
+.spectrum-Slider--offset {
+ &:not(.spectrum-Slider--range, .is-disabled, .spectrum-Slider--emphasized) .spectrum-Slider-tick:nth-child(-n + 4) {
+ &::after {
+ background-color: var(--highcontrast-slider-tick-mark-color-filled-track, var(--mod-slider-tick-mark-color-filled-track, var(--spectrum-slider-tick-mark-color-filled-track)));
+ }
+ }
+}
+
+.spectrum-Slider--range {
+ .spectrum-Slider-tick:nth-child(3),
+ .spectrum-Slider-tick:nth-child(4),
+ .spectrum-Slider-tick:nth-child(5) {
+ &::after {
+ background-color: var(--highcontrast-slider-tick-mark-color-filled-track, var(--mod-slider-tick-mark-color-filled-track, var(--spectrum-slider-tick-mark-color-filled-track)));
+ }
}
}
@@ -654,6 +726,17 @@
border-start-end-radius: 0;
border-end-end-radius: 0;
}
+
+ &:first-of-type::before {
+ background: var(--highcontrast-slider-track-color, var(--mod-slider-track-fill-color, var(--spectrum-slider-track-color)));
+ }
+ }
+}
+
+.spectrum-Slider-tick,
+.spectrum-Slider.is-disabled .spectrum-Slider-tick {
+ &::after {
+ background-color: var(--highcontrast-slider-tick-mark-color, var(--mod-slider-tick-mark-color, var(--spectrum-slider-tick-mark-color)));
}
}
@@ -674,15 +757,14 @@
.spectrum-Slider-handle {
border-color: var(--highcontrast-slider-handle-border-color-disabled, var(--mod-slider-handle-border-color-disabled, var(--spectrum-slider-handle-border-color-disabled)));
- background: var(--highcontrast-slider-handle-disabled-background-color, var(--mod-slider-handle-disabled-background-color, var(--spectrum-slider-handle-disabled-background-color)));
+ background: var(--highcontrast-slider-handle-disabled-background-color, var(--mod-slider-handle-disabled-background-color, var(--spectrum-slider-handle-background-color-disabled)));
cursor: default;
pointer-events: none;
&:hover,
&:active {
- /* @todo need to update --mod with a component-specific prefix */
- border-color: var(--mod-disabled-border-color, var(--spectrum-disabled-border-color));
- background: var(--highcontrast-slider-handle-background-color-disabled, var(--mod-slider-handle-background-color-disabled, var(--spectrum-slider-handle-background-color-disabled)));
+ border-color: var(--highcontrast-slider-handle-border-color-disabled, var(--mod-slider-disabled-border-color, var(--spectrum-slider-handle-border-color-disabled)));
+ background: var(--highcontrast-slider-handle-disabled-background-color, var(--mod-slider-handle-background-color-disabled, var(--spectrum-slider-handle-background-color-disabled)));
}
}
@@ -712,7 +794,7 @@
.spectrum-Slider-tick {
&::after {
- background-color: var(--highcontrast-slider-tick-mark-color-disabled, var(--mod-slider-tick-mark-color-disabled, var(--spectrum-slider-tick-mark-color-disabled)));
+ background-color: var(--highcontrast-slider-tick-mark-color-disabled, var(--mod-slider-tick-mark-color, var(--spectrum-slider-tick-mark-color)));
}
}
@@ -723,6 +805,16 @@
}
}
+/* Highly specific override: ensure precise handle focus ring matches the thin handle shape for enabled sliders */
+.spectrum-Slider.spectrum-Slider--precise:not(.is-disabled) .spectrum-Slider-handle.is-focused::before,
+.spectrum-Slider.spectrum-Slider--precise:not(.is-disabled) .spectrum-Slider-handle:focus::before,
+.spectrum-Slider.spectrum-Slider--precise:not(.is-disabled) .spectrum-Slider-handle:focus-visible::before {
+ border-radius: var(--spectrum-slider-handle-border-radius);
+ block-size: calc(var(--spectrum-slider-precision-handle-height) + var(--spectrum-slider-focus-indicator-gap) * 2);
+ inline-size: calc(var(--spectrum-slider-precision-handle-width) + var(--spectrum-slider-focus-indicator-gap) * 2);
+ transition: none;
+}
+
@media (forced-colors: active) {
.spectrum-Slider {
--highcontrast-slider-track-color: ButtonText;
@@ -735,6 +827,7 @@
--highcontrast-slider-ramp-track-color-disabled: GrayText;
--highcontrast-slider-tick-mark-color: ButtonText;
--highcontrast-slider-tick-mark-color-disabled: GrayText;
+ --highcontrast-slider-tick-mark-color-filled-track: Highlight;
--highcontrast-slider-handle-border-color: ButtonText;
--highcontrast-slider-handle-border-color-hover: Highlight;
@@ -743,12 +836,7 @@
--highcontrast-slider-handle-border-color-disabled: GrayText;
--highcontrast-slider-handle-focus-ring-color-key-focus: CanvasText;
--highcontrast-slider-handle-background-color: ButtonFace;
- --highcontrast-slider-handle-background-color-disabled: GrayText;
- --highcontrast-slider-handle-disabled-background-color: GrayText;
-
- --highcontrast-slider-ramp-handle-border-color-active: ButtonFace;
- --highcontrast-slider-ramp-handle-background-color: ButtonFace;
-
+ --highcontrast-slider-handle-disabled-background-color: Canvas;
--highcontrast-slider-label-text-color: CanvasText;
--highcontrast-slider-label-text-color-disabled: GrayText;
@@ -770,8 +858,6 @@
.spectrum-Slider-controls.is-focused {
--highcontrast-slider-track-color: Highlight;
--highcontrast-slider-handle-border-color: Highlight;
- --highcontrast-slider-ramp-track-color: Highlight;
- --highcontrast-slider-tick-mark-color: Highlight;
}
}
diff --git a/components/slider/stories/slider.stories.js b/components/slider/stories/slider.stories.js
index 1d6f5b9d479..3b69d70d1f5 100644
--- a/components/slider/stories/slider.stories.js
+++ b/components/slider/stories/slider.stories.js
@@ -1,9 +1,9 @@
import { Sizes } from "@spectrum-css/preview/decorators";
import { disableDefaultModes } from "@spectrum-css/preview/modes";
-import { isDisabled, isFocused, size } from "@spectrum-css/preview/types";
+import { isActive, isDisabled, isEmphasized, isFocused, isHovered, size } from "@spectrum-css/preview/types";
import metadata from "../dist/metadata.json";
import packageJson from "../package.json";
-import { SliderGroup } from "./slider.test.js";
+import { SliderGroup, VariantGroup } from "./slider.test.js";
import { Template } from "./template.js";
/**
@@ -71,8 +71,19 @@ export default {
control: "select",
options: ["ramp", "offset", "filled"],
},
+ trackHeight: {
+ name: "Track height",
+ type: { name: "string" },
+ table: {
+ type: { summary: "string" },
+ category: "Component",
+ },
+ control: "select",
+ options: ["medium", "large"],
+ if: { arg: "variant", neq: "ramp" },
+ },
labelPosition: {
- name: "Label Position",
+ name: "Label position",
type: { name: "string" },
table: {
type: { summary: "string" },
@@ -81,8 +92,9 @@ export default {
control: "select",
options: ["top", "side"],
},
- fillColor: {
- name: "Fill color",
+ trackColor: {
+ name: "Track color",
+ description: "Supports standard color input or any valid input for the background property such as, linear-gradient(red, blue) or transparent. Not available for ramp variant.",
type: { name: "string" },
table: {
type: { summary: "string" },
@@ -112,26 +124,58 @@ export default {
control: "boolean",
if: { arg: "showTicks", truthy: true },
},
+ isPrecise: {
+ name: "Precise handle control",
+ description: "Provides precise control for accurate values.",
+ type: { name: "boolean" },
+ table: {
+ type: { summary: "boolean" },
+ category: "Component",
+ },
+ control: "boolean",
+ },
+ isEditable: {
+ name: "Editable text input",
+ description: "Enables text input to also control the slider value.",
+ type: { name: "boolean" },
+ table: {
+ type: { summary: "boolean" },
+ category: "Component",
+ },
+ control: "boolean",
+ },
+ isEmphasized,
+ isActive,
+ isHovered,
isDisabled,
isFocused: {
...isFocused,
if: { arg: "isDisabled", truthy: false },
},
- values: { table: { disable: true } },
+ values: {
+ table: { disable: true }
+ },
},
args: {
rootClass: "spectrum-Slider",
+ isEmphasized: false,
+ isActive: false,
+ isHovered: false,
isDisabled: false,
isFocused: false,
showTicks: false,
showTickLabels: false,
labelPosition: "top",
- label: "Slider label",
+ label: "Label",
size: "m",
- min: 10,
- max: 20,
- values: [14],
- step: 2,
+ min: 0,
+ max: 30,
+ values: [15],
+ step: 5,
+ trackHeight: "medium",
+ isPrecise: false,
+ isEditable: false,
+ variant: "filled",
},
parameters: {
actions: {
@@ -146,22 +190,30 @@ export default {
},
packageJson,
metadata,
+ status: {
+ type: "migrated",
+ },
},
+ tags: ["migrated"],
};
/**
* Sliders should always have a label. In rare cases where context is sufficient and an accessibility expert has reviewed the design, the label could be undefined. Top labels are the default and are recommended because they work better with long copy, localization, and responsive layouts.
+ * The track of the slider can have a fill. By default, the fill originates from the left side of the track when the global direction is LTR and from the right side of the track when the global direction is RTL.
*/
export const Default = SliderGroup.bind({});
-Default.args = {};
+Default.args = {
+ variant: "filled",
+};
// ********* DOCS ONLY ********* //
/**
- * If a slider's label is undefined, it should still include an aria-label in HTML (depending on the context, “aria-label” or “aria-labelledby”).
+ * If a slider's label is undefined, it should still include an aria-label in HTML (depending on the context, "aria-label" or "aria-labelledby").
*/
export const WithoutLabel = Template.bind({});
WithoutLabel.args = {
label: "",
+ variant: "filled",
};
WithoutLabel.tags = ["!dev"];
WithoutLabel.storyName = "Without label";
@@ -171,6 +223,18 @@ WithoutLabel.parameters = {
},
};
+export const Editable = Template.bind({});
+Editable.args = {
+ ...Default.args,
+ isEditable: true,
+};
+Editable.tags = ["!dev"];
+Editable.parameters = {
+ chromatic: {
+ disableSnapshot: true,
+ },
+};
+
export const Sizing = (args, context) => Sizes({
Template,
withBorder: false,
@@ -186,31 +250,28 @@ Sizing.parameters = {
};
/**
- * The track of the slider can have a fill. By default, the fill originates from the left side of the track.
+ * If the value represents an offset, the fill start or end can be set to represent the point of origin. This allows the slider fill to extend from the origin toward the handle, in either direction along the track.
*/
-export const Filled = Template.bind({});
-Filled.args = {
+export const Offset = Template.bind({});
+Offset.args = {
...Default.args,
- variant: "filled",
+ variant: "offset",
+ values: [-15],
};
-Filled.tags = ["!dev"];
-Filled.parameters = {
+Offset.tags = ["!dev"];
+Offset.parameters = {
chromatic: {
disableSnapshot: true,
},
};
-/**
- * With fill and offset. If the value represents an offset, the fill start can be set to represent the point of origin. This allows the slider fill to start from inside the track.
- */
-export const FilledOffset = Template.bind({});
-FilledOffset.args = {
+export const Precise = Template.bind({});
+Precise.args = {
...Default.args,
- min: 0,
- variant: "offset",
+ isPrecise: true,
};
-FilledOffset.tags = ["!dev"];
-FilledOffset.parameters = {
+Precise.tags = ["!dev"];
+Precise.parameters = {
chromatic: {
disableSnapshot: true,
},
@@ -234,7 +295,7 @@ Ramp.parameters = {
export const Range = Template.bind({});
Range.args = {
...Default.args,
- values: [14, 16],
+ values: [10, 20],
};
Range.tags = ["!dev"];
Range.parameters = {
@@ -275,6 +336,24 @@ TickWithLabels.parameters = {
};
TickWithLabels.storyName = "Tick with labels";
+/**
+ * Large track height.
+ */
+export const TrackHeight = Template.bind({});
+TrackHeight.args = {
+ ...Default.args,
+ trackHeight: "large",
+};
+TrackHeight.tags = ["!dev"];
+TrackHeight.parameters = {
+ chromatic: {
+ disableSnapshot: true,
+ },
+};
+TrackHeight.storyName = "Large track height";
+
+
+
export const Disabled = Template.bind({});
Disabled.args = {
...Default.args,
@@ -287,34 +366,25 @@ Disabled.parameters = {
},
};
-export const Focused = Template.bind({});
-Focused.args = {
+export const Emphasized = Template.bind({});
+Emphasized.args = {
...Default.args,
- isFocused: true,
+ isEmphasized: true,
};
-Focused.tags = ["!dev"];
-Focused.parameters = {
+Emphasized.tags = ["!dev"];
+Emphasized.parameters = {
chromatic: {
disableSnapshot: true,
},
};
-/**
- * A gradient can be added to the track of any slider to give more meaning to the range of values. Tracks with a gradient can also have a fill. A gradient track should not be used for choosing a precise color; use a [color slider](/docs/components-color-slider--docs), [color area](/docs/components-color-area--docs), or [color wheel](/docs/components-color-wheel--docs) instead.
- */
-export const Gradient = Template.bind({});
-Gradient.args = {
+export const Focused = Template.bind({});
+Focused.args = {
...Default.args,
- customStyles: {
- "--spectrum-slider-track-color":
- "linear-gradient(to right, red, green 100%)",
- "--spectrum-slider-track-color-rtl":
- "linear-gradient(to left, red, green 100%)",
- },
- label: "Slider label that is long and wraps to the next line",
+ isFocused: true,
};
-Gradient.tags = ["!dev"];
-Gradient.parameters = {
+Focused.tags = ["!dev"];
+Focused.parameters = {
chromatic: {
disableSnapshot: true,
},
@@ -345,3 +415,7 @@ WithForcedColors.parameters = {
modes: disableDefaultModes,
},
};
+
+// test with /?path=/story/components-slider--variant-tests&globals=testingPreview:!true
+export const VariantTests = VariantGroup.bind({});
+VariantTests.tags = ["!autodocs", "!dev"];
diff --git a/components/slider/stories/slider.test.js b/components/slider/stories/slider.test.js
index 22777744fd4..c36e23fc5fd 100644
--- a/components/slider/stories/slider.test.js
+++ b/components/slider/stories/slider.test.js
@@ -1,69 +1,442 @@
-import { Variants } from "@spectrum-css/preview/decorators";
+import { Sizes, Variants } from "@spectrum-css/preview/decorators";
import { Template } from "./template.js";
-export const SliderGroup = Variants({
+export const testData = [
+ // Default variants
+ {
+ testHeading: "Default filled",
+ variant: "filled"
+ },
+ {
+ testHeading: "Precise",
+ variant: "filled",
+ isPrecise: true
+ },
+ {
+ testHeading: "Large track",
+ variant: "filled",
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Precise large track",
+ variant: "filled",
+ isPrecise: true,
+ trackHeight: "large"
+ },
+ // Ticks variants
+ {
+ testHeading: "With ticks",
+ variant: "filled",
+ showTicks: true,
+ showTickLabels: true
+ },
+ {
+ testHeading: "Precise with ticks",
+ variant: "filled",
+ showTicks: true,
+ showTickLabels: true,
+ isPrecise: true
+ },
+ {
+ testHeading: "Large track with ticks",
+ variant: "filled",
+ showTicks: true,
+ showTickLabels: true,
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Large track with ticks and precise",
+ variant: "filled",
+ showTicks: true,
+ showTickLabels: true,
+ isPrecise: true,
+ trackHeight: "large"
+ },
+ // Side label variants
+ {
+ testHeading: "Side label",
+ variant: "filled",
+ labelPosition: "side"
+ },
+ {
+ testHeading: "Side label with precise",
+ variant: "filled",
+ labelPosition: "side",
+ isPrecise: true
+ },
+ {
+ testHeading: "Large track with side label",
+ variant: "filled",
+ labelPosition: "side",
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Side label with ticks",
+ variant: "filled",
+ labelPosition: "side",
+ showTicks: true,
+ showTickLabels: true
+ },
+ // Editable variants
+ {
+ testHeading: "Editable",
+ variant: "filled",
+ isEditable: true
+ },
+ {
+ testHeading: "Editable with precise",
+ variant: "filled",
+ isEditable: true,
+ isPrecise: true
+ },
+ {
+ testHeading: "Editable with large track",
+ variant: "filled",
+ isEditable: true,
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Editable with side label",
+ variant: "filled",
+ isEditable: true,
+ labelPosition: "side"
+ },
+ // No label variants
+ {
+ testHeading: "No label",
+ variant: "filled",
+ label: ""
+ },
+ {
+ testHeading: "No label with precise",
+ variant: "filled",
+ label: "",
+ isPrecise: true
+ },
+ {
+ testHeading: "No label with large track",
+ variant: "filled",
+ label: "",
+ trackHeight: "large"
+ },
+ {
+ testHeading: "No label with ticks",
+ variant: "filled",
+ label: "",
+ showTicks: true,
+ showTickLabels: true
+ },
+ {
+ testHeading: "No label editable",
+ variant: "filled",
+ label: "",
+ isEditable: true
+ },
+ {
+ testHeading: "No label editable with precise",
+ variant: "filled",
+ label: "",
+ isEditable: true,
+ isPrecise: true
+ },
+ {
+ testHeading: "No label editable with large track",
+ variant: "filled",
+ label: "",
+ isEditable: true,
+ trackHeight: "large"
+ },
+ // Disabled variants
+ {
+ testHeading: "Disabled",
+ variant: "filled",
+ isDisabled: true
+ },
+ {
+ testHeading: "Disabled with precise",
+ variant: "filled",
+ isDisabled: true,
+ isPrecise: true
+ },
+ {
+ testHeading: "Disabled with precise and large track",
+ variant: "filled",
+ isDisabled: true,
+ isPrecise: true,
+ trackHeight: "large"
+ },
+ // Emphasized variants
+ {
+ testHeading: "Emphasized",
+ variant: "filled",
+ isEmphasized: true
+ },
+ {
+ testHeading: "Emphasized with precise",
+ variant: "filled",
+ isEmphasized: true,
+ isPrecise: true
+ },
+ {
+ testHeading: "Emphasized with large track",
+ variant: "filled",
+ isEmphasized: true,
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Emphasized with ticks",
+ variant: "filled",
+ isEmphasized: true,
+ showTicks: true,
+ showTickLabels: true
+ },
+ {
+ testHeading: "Emphasized with ticks and large track",
+ variant: "filled",
+ isEmphasized: true,
+ showTicks: true,
+ showTickLabels: true,
+ trackHeight: "large"
+ },
+ // Sizes variants
+ {
+ testHeading: "Large track height sizes",
+ variant: "filled",
+ Template: (args, context) => { return Sizes({Template: Template, ...args}, context); },
+ trackHeight: "large",
+ withStates: false,
+ },
+ {
+ testHeading: "Large track height sizes with precise",
+ variant: "filled",
+ isPrecise: true,
+ Template: (args, context) => { return Sizes({Template: Template, ...args}, context); },
+ trackHeight: "large",
+ withStates: false,
+ },
+ {
+ testHeading: "Sizes with precise",
+ variant: "filled",
+ isPrecise: true,
+ Template: (args, context) => { return Sizes({Template: Template, ...args}, context); },
+ withStates: false,
+ },
+];
+
+const rangeTestData = [
+ // Default variants
+ {
+ testHeading: "Range",
+ variant: "filled",
+ values: [10, 20]
+ },
+ {
+ testHeading: "Range with precise",
+ variant: "filled",
+ values: [10, 20],
+ isPrecise: true
+ },
+ {
+ testHeading: "Range with large track",
+ variant: "filled",
+ values: [10, 20],
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Range with precise and large track",
+ variant: "filled",
+ values: [10, 20],
+ isPrecise: true,
+ trackHeight: "large"
+ },
+ // Ticks variants
+ {
+ testHeading: "Range with ticks and large track",
+ variant: "filled",
+ showTicks: true,
+ showTickLabels: true,
+ values: [10, 20],
+ trackHeight: "large"
+ },
+ // Side label variants
+ {
+ testHeading: "Range with side label",
+ variant: "filled",
+ labelPosition: "side",
+ values: [10, 20]
+ },
+ // No label variants
+ {
+ testHeading: "Range with no label",
+ variant: "filled",
+ label: "",
+ values: [10, 20]
+ },
+ // Emphasized variants
+ {
+ testHeading: "Emphasized range",
+ variant: "filled",
+ isEmphasized: true,
+ values: [10, 20]
+ },
+ {
+ testHeading: "Emphasized range with precise",
+ variant: "filled",
+ isEmphasized: true,
+ values: [10, 20],
+ isPrecise: true
+ },
+ {
+ testHeading: "Emphasized range with large track",
+ variant: "filled",
+ isEmphasized: true,
+ values: [10, 20],
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Emphasized range with precise and large track",
+ variant: "filled",
+ isEmphasized: true,
+ values: [10, 20],
+ isPrecise: true,
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Emphasized range with side label",
+ variant: "filled",
+ isEmphasized: true,
+ values: [10, 20],
+ labelPosition: "side"
+ },
+ {
+ testHeading: "Emphasized range with editable",
+ variant: "filled",
+ isEmphasized: true,
+ values: [10, 20],
+ isEditable: true
+ },
+ {
+ testHeading: "Emphasized range with no label",
+ variant: "filled",
+ isEmphasized: true,
+ values: [10, 20],
+ label: ""
+ },
+];
+
+const rampTestData = [
+ // Default variants
+ {
+ testHeading: "Ramp",
+ variant: "ramp"
+ },
+ {
+ testHeading: "Ramp with precise",
+ variant: "ramp",
+ isPrecise: true
+ },
+];
+
+const offsetTestData = [
+ // Default variants
+ {
+ testHeading: "Offset",
+ variant: "offset",
+ values: [-15]
+ },
+ {
+ testHeading: "Offset with precise",
+ variant: "offset",
+ values: [-15],
+ isPrecise: true
+ },
+ {
+ testHeading: "Offset with large track",
+ variant: "offset",
+ values: [-15],
+ trackHeight: "large"
+ },
+ {
+ testHeading: "Offset with precise and large track",
+ variant: "offset",
+ values: [-15],
+ isPrecise: true,
+ trackHeight: "large"
+ },
+ // Ticks variants
+ {
+ testHeading: "Offset with ticks and large track",
+ variant: "offset",
+ showTicks: true,
+ showTickLabels: true,
+ values: [-15],
+ trackHeight: "large"
+ },
+ // Side label variants
+ {
+ testHeading: "Offset with side label",
+ variant: "offset",
+ labelPosition: "side",
+ values: [-15]
+ },
+ // Editable variants
+ {
+ testHeading: "Offset with editable",
+ variant: "offset",
+ isEditable: true,
+ values: [-15]
+ },
+ // No label variants
+ {
+ testHeading: "Offset with no label",
+ variant: "offset",
+ label: "",
+ values: [-15]
+ },
+ {
+ testHeading: "Offset with no label and editable",
+ variant: "offset",
+ label: "",
+ isEditable: true,
+ values: [-15]
+ },
+ // Emphasized variants
+ {
+ testHeading: "Emphasized offset",
+ variant: "offset",
+ isEmphasized: true,
+ values: [-15]
+ },
+];
+
+// Helper function to create a group with specific test data
+const createGroup = (testData) => Variants({
Template,
- testData: [
- {
- testHeading: "Default",
- },
- {
- testHeading: "Without label",
- label: undefined,
- },
- {
- testHeading: "Filled",
- variant: "filled",
- },
- {
- testHeading: "Filled offset",
- variant: "offset",
- min: 0,
- },
- {
- testHeading: "Ramp",
- variant: "ramp",
- },
- {
- testHeading: "Range",
- values: [14, 16],
- },
+ testData,
+ stateData: [
{
- testHeading: "Tick",
- showTicks: true,
+ testHeading: "Hovered",
+ isHovered: true
},
{
- testHeading: "Tick with labels",
- showTicks: true,
- showTickLabels: true,
+ testHeading: "Active",
+ isActive: true
},
{
- testHeading: "Side label",
- labelPosition: "side",
+ testHeading: "Focused",
+ isFocused: true
},
{
- testHeading: "Gradient",
- customStyles: {
- "--spectrum-slider-track-color":
- "linear-gradient(to right, red, green 100%)",
- "--spectrum-slider-track-color-rtl":
- "linear-gradient(to left, red, green 100%)",
- },
+ testHeading: "Focused + Hovered",
+ isFocused: true,
+ isHovered: true
},
- {
- testHeading: "Truncation",
- withStates: false,
- label: "Slider label that is long and wraps to the next line",
- }
- ],
- stateData: [
{
testHeading: "Disabled",
- isDisabled: true,
- },
- {
- testHeading: "Focused",
- isFocused: true,
- },
+ isDisabled: true
+ }
]
});
+
+export const SliderGroup = createGroup(testData);
+export const VariantGroup = createGroup([...rangeTestData, ...rampTestData, ...offsetTestData]);
diff --git a/components/slider/stories/template.js b/components/slider/stories/template.js
index 905fe770b40..e70fde57663 100644
--- a/components/slider/stories/template.js
+++ b/components/slider/stories/template.js
@@ -1,5 +1,6 @@
import { Template as FieldLabel } from "@spectrum-css/fieldlabel/stories/template.js";
import { getRandomId } from "@spectrum-css/preview/decorators";
+import { Template as TextField } from "@spectrum-css/textfield/stories/template.js";
import { html } from "lit";
import { classMap } from "lit/directives/class-map.js";
import { ifDefined } from "lit/directives/if-defined.js";
@@ -13,26 +14,47 @@ export const Template = ({
size,
label,
min = 0,
- max = 10,
+ max = 15,
step = 2,
values = [],
variant,
+ trackHeight,
labelPosition,
- fillColor,
+ trackColor,
showTicks = false,
showTickLabels = false,
isDisabled = false,
+ isHovered = false,
+ isActive = false,
isFocused = false,
+ isPrecise = false,
+ isEditable = false,
+ isEmphasized = false,
customClasses = [],
customStyles = {},
id = getRandomId("slider"),
} = {}, context = {}) => {
- const { globals = {}, updateArgs } = context;
+ // Auto-set values and range for offset variant
+ let finalValues = values;
+ let finalMin = min;
+ let finalMax = max;
+ if (variant === "offset") {
+ // Only set default value if no values are provided
+ if (values.length === 0) {
+ finalValues = [0]; // Default to center (0)
+ }
+ finalMin = -15; // Left edge = negative
+ finalMax = 15; // Right edge = positive
+ }
+
+ const { globals = {}, updateArgs } = context;
+ let fillPercentage = 50;
const isRTL = globals.textDirection !== "rtl";
- const rangeLength = max - min;
- const centerPoint = rangeLength / 2 + min;
+ const rangeLength = finalMax - finalMin;
+ const centerPoint = rangeLength / 2 + finalMin;
const isRamp = variant === "ramp";
+ const maskWidth = (fillPercentage / 100) * 240;
const rampSVG = html`
`;
- const getPosition = (v) => ((v - min) / rangeLength) * 100;
+ const getPosition = (v) => ((v - finalMin) / rangeLength) * 100;
const getWidth = (start, end) => {
const distance = end > start ? end - start : start - end;
@@ -68,7 +96,10 @@ export const Template = ({
const ticks = [];
for (let i = from; i <= to; i += step) {
ticks.push(html`
-