1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2023 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Worker@import "theme"; 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker// This checkbox element is expected to contain a checkbox type input followed 18*6dbdd20aSAndroid Build Coastguard Worker// by an empty span element. 19*6dbdd20aSAndroid Build Coastguard Worker// The input is completely hidden and an entirely new checkbox is drawn inside 20*6dbdd20aSAndroid Build Coastguard Worker// the span element. This allows us to style it how we like, and also add some 21*6dbdd20aSAndroid Build Coastguard Worker// fancy transitions. 22*6dbdd20aSAndroid Build Coastguard Worker// The box of the checkbox is a fixed sized span element. The tick is also a 23*6dbdd20aSAndroid Build Coastguard Worker// fixed sized rectange rotated 45 degrees with only the bottom and right 24*6dbdd20aSAndroid Build Coastguard Worker// borders visible. 25*6dbdd20aSAndroid Build Coastguard Worker// When unchecked, the tick size and border width is 0, so the tick is 26*6dbdd20aSAndroid Build Coastguard Worker// completely invsible. When we transition to checked, the border size on the 27*6dbdd20aSAndroid Build Coastguard Worker// bottom and right sides is immmdiately set to full width, and the tick morphs 28*6dbdd20aSAndroid Build Coastguard Worker// into view first by expanding along the x axis first, then expanding up the 29*6dbdd20aSAndroid Build Coastguard Worker// y-axis. This has the effect of making the tick look like it's being drawn 30*6dbdd20aSAndroid Build Coastguard Worker// onto the page with a pen. 31*6dbdd20aSAndroid Build Coastguard Worker// When transitioning from checked to unchecked, the animation plays in reverse, 32*6dbdd20aSAndroid Build Coastguard Worker// and the border width is set to 0 right at the end in order to make the tick 33*6dbdd20aSAndroid Build Coastguard Worker// completely invisible again. 34*6dbdd20aSAndroid Build Coastguard Worker.pf-switch { 35*6dbdd20aSAndroid Build Coastguard Worker display: inline-block; 36*6dbdd20aSAndroid Build Coastguard Worker position: relative; // Turns this container into a positioned element 37*6dbdd20aSAndroid Build Coastguard Worker font-family: $pf-font; 38*6dbdd20aSAndroid Build Coastguard Worker font-size: inherit; 39*6dbdd20aSAndroid Build Coastguard Worker color: $pf-minimal-foreground; 40*6dbdd20aSAndroid Build Coastguard Worker user-select: none; 41*6dbdd20aSAndroid Build Coastguard Worker cursor: pointer; 42*6dbdd20aSAndroid Build Coastguard Worker padding-left: 32px + 6px; 43*6dbdd20aSAndroid Build Coastguard Worker 44*6dbdd20aSAndroid Build Coastguard Worker // Hide the default checkbox 45*6dbdd20aSAndroid Build Coastguard Worker input { 46*6dbdd20aSAndroid Build Coastguard Worker position: absolute; 47*6dbdd20aSAndroid Build Coastguard Worker opacity: 0; 48*6dbdd20aSAndroid Build Coastguard Worker pointer-events: none; 49*6dbdd20aSAndroid Build Coastguard Worker } 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Worker // The span forms the "box" of the checkbox 52*6dbdd20aSAndroid Build Coastguard Worker span { 53*6dbdd20aSAndroid Build Coastguard Worker position: absolute; 54*6dbdd20aSAndroid Build Coastguard Worker left: 0; 55*6dbdd20aSAndroid Build Coastguard Worker top: 0; 56*6dbdd20aSAndroid Build Coastguard Worker bottom: 0; 57*6dbdd20aSAndroid Build Coastguard Worker margin-top: auto; 58*6dbdd20aSAndroid Build Coastguard Worker margin-bottom: auto; 59*6dbdd20aSAndroid Build Coastguard Worker height: 16px; 60*6dbdd20aSAndroid Build Coastguard Worker width: 32px; 61*6dbdd20aSAndroid Build Coastguard Worker border-radius: 8px; 62*6dbdd20aSAndroid Build Coastguard Worker transition: background $pf-anim-timing; 63*6dbdd20aSAndroid Build Coastguard Worker background: grey; 64*6dbdd20aSAndroid Build Coastguard Worker vertical-align: middle; 65*6dbdd20aSAndroid Build Coastguard Worker 66*6dbdd20aSAndroid Build Coastguard Worker // The :after element forms the "tick" of the checkbox 67*6dbdd20aSAndroid Build Coastguard Worker &:after { 68*6dbdd20aSAndroid Build Coastguard Worker content: ""; 69*6dbdd20aSAndroid Build Coastguard Worker display: block; 70*6dbdd20aSAndroid Build Coastguard Worker position: absolute; 71*6dbdd20aSAndroid Build Coastguard Worker left: 2px; 72*6dbdd20aSAndroid Build Coastguard Worker top: 0; 73*6dbdd20aSAndroid Build Coastguard Worker bottom: 0; 74*6dbdd20aSAndroid Build Coastguard Worker margin-top: auto; 75*6dbdd20aSAndroid Build Coastguard Worker margin-bottom: auto; 76*6dbdd20aSAndroid Build Coastguard Worker width: 12px; 77*6dbdd20aSAndroid Build Coastguard Worker height: 12px; 78*6dbdd20aSAndroid Build Coastguard Worker background: $pf-primary-foreground; 79*6dbdd20aSAndroid Build Coastguard Worker box-sizing: border-box; 80*6dbdd20aSAndroid Build Coastguard Worker border-radius: 50%; 81*6dbdd20aSAndroid Build Coastguard Worker transition: left $pf-anim-timing; 82*6dbdd20aSAndroid Build Coastguard Worker } 83*6dbdd20aSAndroid Build Coastguard Worker } 84*6dbdd20aSAndroid Build Coastguard Worker 85*6dbdd20aSAndroid Build Coastguard Worker input:checked + span { 86*6dbdd20aSAndroid Build Coastguard Worker background: $pf-primary-background; 87*6dbdd20aSAndroid Build Coastguard Worker } 88*6dbdd20aSAndroid Build Coastguard Worker 89*6dbdd20aSAndroid Build Coastguard Worker input:checked + span:after { 90*6dbdd20aSAndroid Build Coastguard Worker left: 18px; 91*6dbdd20aSAndroid Build Coastguard Worker } 92*6dbdd20aSAndroid Build Coastguard Worker 93*6dbdd20aSAndroid Build Coastguard Worker input:focus-visible + span { 94*6dbdd20aSAndroid Build Coastguard Worker @include focus; 95*6dbdd20aSAndroid Build Coastguard Worker } 96*6dbdd20aSAndroid Build Coastguard Worker 97*6dbdd20aSAndroid Build Coastguard Worker &.pf-disabled { 98*6dbdd20aSAndroid Build Coastguard Worker cursor: not-allowed; 99*6dbdd20aSAndroid Build Coastguard Worker color: $pf-minimal-foreground-disabled; 100*6dbdd20aSAndroid Build Coastguard Worker 101*6dbdd20aSAndroid Build Coastguard Worker span { 102*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-minimal-foreground-disabled; 103*6dbdd20aSAndroid Build Coastguard Worker background: $pf-minimal-foreground-disabled; 104*6dbdd20aSAndroid Build Coastguard Worker &:after { 105*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-minimal-foreground-disabled; 106*6dbdd20aSAndroid Build Coastguard Worker } 107*6dbdd20aSAndroid Build Coastguard Worker } 108*6dbdd20aSAndroid Build Coastguard Worker 109*6dbdd20aSAndroid Build Coastguard Worker input:checked ~ span { 110*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-primary-background-disabled; 111*6dbdd20aSAndroid Build Coastguard Worker background: $pf-primary-background-disabled; 112*6dbdd20aSAndroid Build Coastguard Worker } 113*6dbdd20aSAndroid Build Coastguard Worker } 114*6dbdd20aSAndroid Build Coastguard Worker} 115