// // Copyright 2021 Google LLC // SPDX-License-Identifier: Apache-2.0 // // go/keep-sorted start @use 'sass:list'; @use 'sass:map'; // go/keep-sorted end // go/keep-sorted start @use '../../focus/focus-ring'; @use '../../tokens'; @use './handle'; @use './icon'; @use './track'; // go/keep-sorted end @mixin theme($tokens) { $supported-tokens: list.join( tokens.$md-comp-switch-supported-tokens, ( 'handle-shape-start-start', 'handle-shape-start-end', 'handle-shape-end-end', 'handle-shape-end-start', 'track-shape-start-start', 'track-shape-start-end', 'track-shape-end-end', 'track-shape-end-start' ) ); @each $token, $value in $tokens { @if list.index($supported-tokens, $token) == null { @error 'Token `#{$token}` is not a supported token.'; } @if $value { --md-switch-#{$token}: #{$value}; } } } @mixin styles() { $tokens: tokens.md-comp-switch-values(); @layer styles, hcm; @layer styles { :host { @each $token, $value in $tokens { --_#{$token}: var(--md-switch-#{$token}, #{$value}); } // Support logical shape properties --_handle-shape-start-start: var( --md-switch-handle-shape-start-start, var(--_handle-shape) ); --_handle-shape-start-end: var( --md-switch-handle-shape-start-end, var(--_handle-shape) ); --_handle-shape-end-end: var( --md-switch-handle-shape-end-end, var(--_handle-shape) ); --_handle-shape-end-start: var( --md-switch-handle-shape-end-start, var(--_handle-shape) ); --_track-shape-start-start: var( --md-switch-track-shape-start-start, var(--_track-shape) ); --_track-shape-start-end: var( --md-switch-track-shape-start-end, var(--_track-shape) ); --_track-shape-end-end: var( --md-switch-track-shape-end-end, var(--_track-shape) ); --_track-shape-end-start: var( --md-switch-track-shape-end-start, var(--_track-shape) ); display: inline-flex; outline: none; vertical-align: top; -webkit-tap-highlight-color: transparent; cursor: pointer; } :host([disabled]) { cursor: default; } :host([touch-target='wrapper']) { margin: max(0px, (48px - var(--_track-height)) / 2) 0px; } md-focus-ring { @include focus-ring.theme( ( 'shape-start-start': var(--_track-shape-start-start), 'shape-start-end': var(--_track-shape-start-end), 'shape-end-end': var(--_track-shape-end-end), 'shape-end-start': var(--_track-shape-end-start), ) ); } .switch { align-items: center; display: inline-flex; flex-shrink: 0; // Stop from collapsing in flex containers position: relative; width: var(--_track-width); height: var(--_track-height); // Track shape border-start-start-radius: var(--_track-shape-start-start); border-start-end-radius: var(--_track-shape-start-end); border-end-end-radius: var(--_track-shape-end-end); border-end-start-radius: var(--_track-shape-end-start); } // Input is also touch target input { appearance: none; height: 48px; outline: none; margin: 0; position: absolute; width: 100%; z-index: 1; cursor: inherit; } :host([touch-target='none']) input { display: none; } } @include track.styles(); @include handle.styles(); @include icon.styles(); }