| // 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. | |
| @use "../assets/theme" as *; | |
| @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; | |
| } | |
| } |