blob: 56c49ce13c85fd986f5d1c2c13bd8f73331abdb1 [file] [edit]
// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
@import "../theme";
@mixin filled-color-scheme($intent-color, $text-color) {
color: $text-color;
background: $intent-color;
&:hover {
background: color_hover($intent-color);
}
&:active,
&.pf-active {
background: color_active($intent-color);
}
&[disabled] {
&:hover {
background: $intent-color;
}
&.pf-active {
background: color_active($intent-color);
}
}
}
@keyframes pf-spinner-rotation {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.pf-button {
font-family: var(--pf-font-compact);
line-height: 1;
user-select: none;
border-radius: $border-radius;
padding: 4px 8px;
white-space: nowrap;
min-width: max-content;
position: relative;
&--loading {
// The button is unclickable when loading
pointer-events: none;
.pf-button__label,
.pf-left-icon,
.pf-right-icon {
visibility: hidden;
}
&::after {
content: "";
height: 0.9em;
width: 0.9em;
border-radius: 100px;
border-style: solid;
border-width: 0.15em;
border-color: var(--pf-color-border);
border-top-color: var(--pf-color-primary);
position: absolute;
inset: 50%;
translate: -50% -50%;
animation: pf-spinner-rotation 1s infinite linear;
}
}
&--shrink {
min-width: 0;
text-overflow: ellipsis;
overflow: hidden;
}
&--rounded {
border-radius: 100px;
}
& > .pf-left-icon {
margin-right: 6px; // Make some room between the icon and label
}
& > .pf-right-icon {
margin-left: 6px; // Make some room between the icon and label
}
&__tooltip {
font-size: var(--pf-font-size-s);
}
&:focus-visible {
@include focus;
}
// Reduce padding when compact
&.pf-compact {
padding: 2px 4px;
& > .pf-left-icon {
margin-right: 2px;
}
& > .pf-right-icon {
margin-left: 2px;
}
}
// Reduce padding when we are icon-only
&.pf-icon-only {
& > .pf-left-icon {
margin: 0;
}
padding: 4px;
&.pf-compact {
padding: 0;
}
&::before {
// Inserting a zero-width space to keep the button in flow. This allows it
// to stay aligned with the baseline of other text around it.
content: "\200B"; /* Zero-width space */
}
}
&[disabled] {
filter: opacity(50%);
cursor: not-allowed;
}
// From here on in we just describe the colors
&--filled {
background: color-mix(
in srgb,
transparent,
var(--pf-color-interactive-base) 10%
);
&:hover {
background: color-mix(
in srgb,
transparent,
var(--pf-color-interactive-base) 15%
);
}
&.pf-active,
&:active {
background: color-mix(
in srgb,
transparent,
var(--pf-color-interactive-base) 20%
);
}
&[disabled] {
&:hover {
background: color-mix(
in srgb,
transparent,
var(--pf-color-interactive-base) 10%
); // Reset to the default background
}
&.pf-active {
background: color-mix(
in srgb,
transparent,
var(--pf-color-interactive-base) 40%
);
}
}
&.pf-intent-primary {
@include filled-color-scheme(
var(--pf-color-primary),
var(--pf-color-text-on-primary)
);
}
&.pf-intent-success {
@include filled-color-scheme(
var(--pf-color-success),
var(--pf-color-text-on-success)
);
}
&.pf-intent-danger {
@include filled-color-scheme(
var(--pf-color-danger),
var(--pf-color-text-on-danger)
);
}
&.pf-intent-warning {
@include filled-color-scheme(
var(--pf-color-warning),
var(--pf-color-text-on-warning)
);
}
}
&--outlined {
border: solid 1px var(--pf-color-border);
}
&--minimal,
&--outlined {
&:hover {
background: color_hover(transparent);
}
&:active,
&.pf-active {
background: color_active(transparent);
}
&.pf-intent-primary {
color: var(--pf-color-primary);
}
&.pf-intent-success {
color: var(--pf-color-success);
}
&.pf-intent-danger {
color: var(--pf-color-danger);
}
&.pf-intent-warning {
color: var(--pf-color-warning);
}
&[disabled] {
&:hover {
background: unset;
}
&.pf-active {
background: color_active(transparent);
}
}
}
}
.pf-button-bar {
display: flex;
flex-direction: row;
gap: 2px;
align-items: baseline;
}
.pf-button-group {
display: flex;
flex-direction: row;
align-items: baseline;
.pf-button:not(:last-child) {
border-top-right-radius: unset;
border-bottom-right-radius: unset;
border-right: unset;
}
.pf-button:not(:first-child) {
border-top-left-radius: unset;
border-bottom-left-radius: unset;
}
}