From 2c5897f7e179b78d37c6b1b31dfd62b7ea0543ad Mon Sep 17 00:00:00 2001 From: Daniel Fiala Date: Wed, 9 Oct 2024 12:42:35 +0000 Subject: [PATCH 1/6] feat(slider): update slider component styles and types --- docs/components/slider.md | 64 ++++++++++++++++++++++++++++++ slider/internal/_slider.scss | 55 +++++++++++++++++++------ slider/internal/slider.ts | 16 +++++--- tokens/v0_192/_md-comp-slider.scss | 16 ++++---- 4 files changed, 125 insertions(+), 26 deletions(-) diff --git a/docs/components/slider.md b/docs/components/slider.md index 4f34d2e1ab..0ab99fc2ef 100644 --- a/docs/components/slider.md +++ b/docs/components/slider.md @@ -59,6 +59,70 @@ Sliders can use icons or labels to represent a numeric or relative scale. +## Types + + + +![The 5 types of common buttons](images/button/types.webp "Elevated, filled, filled tonal, outlined, and text buttons") + + + + + + + + ## Usage Sliders may be continuous or discrete, and may also represent a range. diff --git a/slider/internal/_slider.scss b/slider/internal/_slider.scss index e1f192b7d6..b5e8c12d86 100644 --- a/slider/internal/_slider.scss +++ b/slider/internal/_slider.scss @@ -129,13 +129,37 @@ $_md-sys-shape: tokens.md-sys-shape-values(); inset: 0; display: flex; align-items: center; + padding-inline: calc(var(--_state-layer-size) / 2); + } + + .track-start { + background: var(--_active-track-color); + block-size: var(--_active-track-height); + border-top-left-radius: var(--_active-track-shape); + border-bottom-left-radius: var(--_active-track-shape); + border-top-right-radius: if(var(--_start-fraction) == 1, var(--_active-track-shape), 5000px); + border-bottom-right-radius: if(var(--_start-fraction) == 1, var(--_active-track-shape), 5000px); + inline-size: calc(100%*var(--_start-fraction) - var(--_state-layer-size) / 2); + margin-inline-end: calc(var(--_state-layer-size) / 2); + } + + .track-middle { + background: var(--_active-track-color); + block-size: var(--_active-track-height); + border-radius: 0; + inline-size: calc(100% * (var(--_end-fraction) - var(--_start-fraction)) - 6px); + margin-inline-start: 6px; + } + + .track-end { + background: var(--_inactive-track-color); + block-size: var(--_inactive-track-height); + border-radius: var(--_inactive-track-shape); + inline-size: calc(100% * (1 - var(--_end-fraction)) - 6px); + margin-inline-start: auto; } - // inactive-track - .track::before, .tickmarks::before, - // active-track - .track::after, .tickmarks::after { position: absolute; content: ''; @@ -168,6 +192,8 @@ $_md-sys-shape: tokens.md-sys-shape-values(); background-image: _get-tick-image( var(--_with-tick-marks-inactive-container-color) ); + margin-left: 4px; + margin-right: 4px; } :host([disabled]) .track::before { @@ -196,6 +222,8 @@ $_md-sys-shape: tokens.md-sys-shape-values(); background-image: _get-tick-image( var(--_with-tick-marks-active-container-color) ); + margin-left: 4px; + margin-right: 4px; } // rtl for active track clipping @@ -309,7 +337,10 @@ $_md-sys-shape: tokens.md-sys-shape-values(); position: absolute; box-sizing: border-box; display: flex; - padding: 4px; + padding-top: 12px; + padding-bottom: 12px; + padding-left: 16px; + padding-right: 16px; place-content: center; place-items: center; border-radius: map.get($_md-sys-shape, 'corner-full'); @@ -347,14 +378,14 @@ $_md-sys-shape: tokens.md-sys-shape-values(); } // triangle below label - .label::before { + //.label::before { // Note, sizing carefully estimated to create an ice cream cone shape. - $_triangleSize: calc(var(--_label-container-height) / 2); - inline-size: $_triangleSize; - block-size: $_triangleSize; - bottom: calc(var(--_label-container-height) / -10); - transform: rotate(45deg); - } + // $_triangleSize: calc(var(--_label-container-height) / 2); + // inline-size: $_triangleSize; + // block-size: $_triangleSize; + // bottom: calc(var(--_label-container-height) / -10); + // transform: rotate(45deg); + //} // fits inside label and occludes top half of triangle. .label::after { diff --git a/slider/internal/slider.ts b/slider/internal/slider.ts index 997859c1a9..034dc703b0 100644 --- a/slider/internal/slider.ts +++ b/slider/internal/slider.ts @@ -338,7 +338,7 @@ export class Slider extends sliderBaseClass { const endFraction = ((this.renderValueEnd ?? this.min) - this.min) / range; const containerStyles = { // for clipping inputs and active track. - '--_start-fraction': String(startFraction), + '--_start-fraction': String(this.range ? startFraction : endFraction), '--_end-fraction': String(endFraction), // for generating tick marks '--_tick-count': String(range / step), @@ -403,11 +403,19 @@ export class Slider extends sliderBaseClass { private renderTrack() { return html` -
+
+ ${this.renderTrackPart('start')} + ${when(this.range, () => this.renderTrackPart('middle'))} + ${this.renderTrackPart('end')} +
${this.ticks ? html`
` : nothing} `; } + private renderTrackPart(part: string) { + return html`
`; + } + private renderLabel(value: string) { return html`