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-checkbox { 35*6dbdd20aSAndroid Build Coastguard Worker $tick-anim-time-width: 100ms; 36*6dbdd20aSAndroid Build Coastguard Worker $tick-anim-time-height: 150ms; 37*6dbdd20aSAndroid Build Coastguard Worker $tick-anim-time: $tick-anim-time-width + $tick-anim-time-height; 38*6dbdd20aSAndroid Build Coastguard Worker $tick-easing: linear; 39*6dbdd20aSAndroid Build Coastguard Worker 40*6dbdd20aSAndroid Build Coastguard Worker $box-size: 18px; 41*6dbdd20aSAndroid Build Coastguard Worker $tick-height: 9px; 42*6dbdd20aSAndroid Build Coastguard Worker $tick-width: 5px; 43*6dbdd20aSAndroid Build Coastguard Worker $box-label-padding: 6px; 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard Worker display: inline-block; 46*6dbdd20aSAndroid Build Coastguard Worker position: relative; // Turns this container into a positioned element 47*6dbdd20aSAndroid Build Coastguard Worker font-family: $pf-font; 48*6dbdd20aSAndroid Build Coastguard Worker font-size: inherit; 49*6dbdd20aSAndroid Build Coastguard Worker color: $pf-minimal-foreground; 50*6dbdd20aSAndroid Build Coastguard Worker user-select: none; 51*6dbdd20aSAndroid Build Coastguard Worker cursor: pointer; 52*6dbdd20aSAndroid Build Coastguard Worker padding-left: $box-size + $box-label-padding; 53*6dbdd20aSAndroid Build Coastguard Worker 54*6dbdd20aSAndroid Build Coastguard Worker // Hide the default checkbox 55*6dbdd20aSAndroid Build Coastguard Worker input { 56*6dbdd20aSAndroid Build Coastguard Worker position: absolute; 57*6dbdd20aSAndroid Build Coastguard Worker opacity: 0; 58*6dbdd20aSAndroid Build Coastguard Worker pointer-events: none; 59*6dbdd20aSAndroid Build Coastguard Worker } 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker // The span forms the "box" of the checkbox 62*6dbdd20aSAndroid Build Coastguard Worker span { 63*6dbdd20aSAndroid Build Coastguard Worker position: absolute; 64*6dbdd20aSAndroid Build Coastguard Worker left: 0; 65*6dbdd20aSAndroid Build Coastguard Worker top: 0; 66*6dbdd20aSAndroid Build Coastguard Worker bottom: 0; 67*6dbdd20aSAndroid Build Coastguard Worker margin-top: auto; 68*6dbdd20aSAndroid Build Coastguard Worker margin-bottom: auto; 69*6dbdd20aSAndroid Build Coastguard Worker height: $box-size; 70*6dbdd20aSAndroid Build Coastguard Worker width: $box-size; 71*6dbdd20aSAndroid Build Coastguard Worker border-radius: $pf-border-radius; 72*6dbdd20aSAndroid Build Coastguard Worker border: solid 2px $pf-minimal-foreground; 73*6dbdd20aSAndroid Build Coastguard Worker transition: background $pf-anim-timing; 74*6dbdd20aSAndroid Build Coastguard Worker background: none; 75*6dbdd20aSAndroid Build Coastguard Worker 76*6dbdd20aSAndroid Build Coastguard Worker // The :after element forms the "tick" of the checkbox 77*6dbdd20aSAndroid Build Coastguard Worker &:after { 78*6dbdd20aSAndroid Build Coastguard Worker content: ""; 79*6dbdd20aSAndroid Build Coastguard Worker display: block; 80*6dbdd20aSAndroid Build Coastguard Worker position: absolute; 81*6dbdd20aSAndroid Build Coastguard Worker bottom: 7.5px; 82*6dbdd20aSAndroid Build Coastguard Worker left: 1px; 83*6dbdd20aSAndroid Build Coastguard Worker width: 0px; 84*6dbdd20aSAndroid Build Coastguard Worker height: 0px; 85*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-primary-foreground; 86*6dbdd20aSAndroid Build Coastguard Worker border-style: solid; 87*6dbdd20aSAndroid Build Coastguard Worker border-width: 0; 88*6dbdd20aSAndroid Build Coastguard Worker transform-origin: 0% 100%; // Put the origin at the short edge of the tick 89*6dbdd20aSAndroid Build Coastguard Worker transform: rotate(45deg); 90*6dbdd20aSAndroid Build Coastguard Worker transition: 91*6dbdd20aSAndroid Build Coastguard Worker height $tick-anim-time-height $tick-easing, 92*6dbdd20aSAndroid Build Coastguard Worker width $tick-anim-time-width $tick-anim-time-height $tick-easing, 93*6dbdd20aSAndroid Build Coastguard Worker border-width 0ms $tick-anim-time; 94*6dbdd20aSAndroid Build Coastguard Worker } 95*6dbdd20aSAndroid Build Coastguard Worker } 96*6dbdd20aSAndroid Build Coastguard Worker 97*6dbdd20aSAndroid Build Coastguard Worker &:hover { 98*6dbdd20aSAndroid Build Coastguard Worker span { 99*6dbdd20aSAndroid Build Coastguard Worker background: $pf-minimal-background-hover; 100*6dbdd20aSAndroid Build Coastguard Worker } 101*6dbdd20aSAndroid Build Coastguard Worker } 102*6dbdd20aSAndroid Build Coastguard Worker 103*6dbdd20aSAndroid Build Coastguard Worker input:checked + span { 104*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-primary-background; 105*6dbdd20aSAndroid Build Coastguard Worker background: $pf-primary-background; 106*6dbdd20aSAndroid Build Coastguard Worker } 107*6dbdd20aSAndroid Build Coastguard Worker 108*6dbdd20aSAndroid Build Coastguard Worker input:focus-visible + span { 109*6dbdd20aSAndroid Build Coastguard Worker @include focus; 110*6dbdd20aSAndroid Build Coastguard Worker } 111*6dbdd20aSAndroid Build Coastguard Worker 112*6dbdd20aSAndroid Build Coastguard Worker input:checked + span:after { 113*6dbdd20aSAndroid Build Coastguard Worker width: $tick-width; 114*6dbdd20aSAndroid Build Coastguard Worker height: $tick-height; 115*6dbdd20aSAndroid Build Coastguard Worker border-width: 0 2px 2px 0; 116*6dbdd20aSAndroid Build Coastguard Worker transition: 117*6dbdd20aSAndroid Build Coastguard Worker width $tick-anim-time-height $tick-easing, 118*6dbdd20aSAndroid Build Coastguard Worker height $tick-anim-time-height $tick-anim-time-width $tick-easing, 119*6dbdd20aSAndroid Build Coastguard Worker border-width 0ms; 120*6dbdd20aSAndroid Build Coastguard Worker } 121*6dbdd20aSAndroid Build Coastguard Worker 122*6dbdd20aSAndroid Build Coastguard Worker &.pf-disabled { 123*6dbdd20aSAndroid Build Coastguard Worker cursor: not-allowed; 124*6dbdd20aSAndroid Build Coastguard Worker color: $pf-minimal-foreground-disabled; 125*6dbdd20aSAndroid Build Coastguard Worker 126*6dbdd20aSAndroid Build Coastguard Worker span { 127*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-minimal-foreground-disabled; 128*6dbdd20aSAndroid Build Coastguard Worker background: none; 129*6dbdd20aSAndroid Build Coastguard Worker &:after { 130*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-primary-foreground; 131*6dbdd20aSAndroid Build Coastguard Worker } 132*6dbdd20aSAndroid Build Coastguard Worker } 133*6dbdd20aSAndroid Build Coastguard Worker 134*6dbdd20aSAndroid Build Coastguard Worker input:checked ~ span { 135*6dbdd20aSAndroid Build Coastguard Worker border-color: $pf-primary-background-disabled; 136*6dbdd20aSAndroid Build Coastguard Worker background: $pf-primary-background-disabled; 137*6dbdd20aSAndroid Build Coastguard Worker } 138*6dbdd20aSAndroid Build Coastguard Worker } 139*6dbdd20aSAndroid Build Coastguard Worker} 140