xref: /aosp_15_r20/external/perfetto/ui/src/assets/widgets/switch.scss (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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