xref: /aosp_15_r20/external/perfetto/ui/src/assets/widgets/checkbox.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-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