// Foundation for Sites by ZURB
// foundation.zurb.com
// Licensed under MIT Open Source
////
/// @group switch
////
/// Background color of a switch.
/// @type Color
$switch-background: $medium-gray !default;
/// Background active color of a switch.
/// @type Color
$switch-background-active: $primary-color !default;
/// Height of a switch, with no class applied.
/// @type Number
$switch-height: 2rem !default;
/// Height of a switch with .tiny class.
/// @type Number
$switch-height-tiny: 1.5rem !default;
/// Height of a switch with .small class.
/// @type Number
$switch-height-small: 1.75rem !default;
/// Height of a switch with .large class.
/// @type Number
$switch-height-large: 2.5rem !default;
/// Border radius of the switch
/// @type Number
$switch-radius: $global-radius !default;
/// border around a modal.
/// @type Number
$switch-margin: $global-margin !default;
/// Background color for the switch container and paddle.
/// @type Color
$switch-paddle-background: $white !default;
/// Spacing between a switch paddle and the edge of the body.
/// @type Number
$switch-paddle-offset: 0.25rem !default;
/// border radius of the switch paddle
/// @type Number
$switch-paddle-radius: $global-radius !default;
/// switch transition.
/// @type Number
$switch-paddle-transition: all 0.25s ease-out !default;
// make them variables
// ask about accessibility on label
// change class name for text
/// Adds styles for a switch container. Apply this to a container class.
@mixin switch-container {
position: relative;
margin-bottom: $switch-margin;
outline: 0;
// These properties cascade down to the switch text
font-size: rem-calc(14);
font-weight: bold;
color: $white;
user-select: none;
}
/// Adds styles for a switch input. Apply this to an `<input>` within a switch.
@mixin switch-input {
position: absolute;
margin-bottom: 0;
opacity: 0;
}
/// Adds styles for the background and paddle of a switch. Apply this to a `<label>` within a switch.
@mixin switch-paddle {
$switch-width: $switch-height * 2;
$paddle-height: $switch-height - ($switch-paddle-offset * 2);
$paddle-width: $switch-height - ($switch-paddle-offset * 2);
$paddle-active-offest: $switch-width - $paddle-width - $switch-paddle-offset;
position: relative;
display: block;
width: $switch-width;
height: $switch-height;
border-radius: $switch-radius;
background: $switch-background;
transition: $switch-paddle-transition;
// Resetting these <label> presets so type styles cascade down
font-weight: inherit;
color: inherit;
cursor: pointer;
// Needed to override specificity
input + & {
margin: 0;
}
// The paddle itself
&::after {
position: absolute;
top: $switch-paddle-offset;
#{$global-left}: $switch-paddle-offset;
display: block;
width: $paddle-width;
height: $paddle-height;
transform: translate3d(0, 0, 0);
border-radius: $switch-paddle-radius;
background: $switch-paddle-background;
transition: $switch-paddle-transition;
content: '';
}
// Change the visual style when the switch is active
input:checked ~ & {
background: $switch-background-active;
&::after {
#{$global-left}: $paddle-active-offest;
}
}
input:focus ~ & {
@include disable-mouse-outline;
}
}
/// Adds base styles for active/inactive text inside a switch. Apply this to text elements inside the switch `<label>`.
@mixin switch-text {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
/// Adds styles for the active state text within a switch.
@mixin switch-text-active {
#{$global-left}: 8%;
display: none;
input:checked + label > & {
display: block;
}
}
/// Adds styles for the inactive state text within a switch.
@mixin switch-text-inactive {
#{$global-right}: 15%;
input:checked + label > & {
display: none;
}
}
/// Changes the size of a switch by modifying the size of the body and paddle. Apply this to a switch container.
/// @param {Number} $font-size [1rem] - Font size of label text within the switch.
/// @param {Number} $switch-height [2rem] - Height of the switch body.
/// @param {Number} $paddle-offset [0.25rem] - Spacing between the switch paddle and the edge of the switch body.
@mixin switch-size(
$font-size: 1rem,
$switch-height: 2rem,
$paddle-offset: 0.25rem
) {
$switch-width: $switch-height * 2;
$paddle-width: $switch-height - ($paddle-offset * 2);
$paddle-height: $switch-height - ($paddle-offset * 2);
$paddle-active-offest: $switch-width - $paddle-width - $paddle-offset;
height: $switch-height;
.switch-paddle {
width: $switch-width;
height: $switch-height;
font-size: $font-size;
}
.switch-paddle::after {
top: $paddle-offset;
#{$global-left}: $paddle-offset;
width: $paddle-width;
height: $paddle-height;
}
input:checked ~ .switch-paddle::after {
#{$global-left}: $paddle-active-offest;
}
}
@mixin foundation-switch {
// Container class
.switch {
height: $switch-height;
@include switch-container;
}
// <input> element
.switch-input {
@include switch-input;
}
// <label> element
.switch-paddle {
@include switch-paddle;
}
// Base label text styles
%switch-text {
@include switch-text;
}
// Active label text styles
.switch-active {
@extend %switch-text;
@include switch-text-active;
}
// Inactive label text styles
.switch-inactive {
@extend %switch-text;
@include switch-text-inactive;
}
// Switch sizes
.switch.tiny {
@include switch-size(rem-calc(10), $switch-height-tiny, $switch-paddle-offset);
}
.switch.small {
@include switch-size(rem-calc(12), $switch-height-small, $switch-paddle-offset);
}
.switch.large {
@include switch-size(rem-calc(16), $switch-height-large, $switch-paddle-offset);
}
}
|