| // 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. | |
| .pf-flamegraph { | |
| height: 100%; | |
| overflow-y: hidden; | |
| .loading-container { | |
| font-size: larger; | |
| display: flex; | |
| align-items: baseline; | |
| justify-content: center; | |
| height: 100%; | |
| } | |
| .filter-bar { | |
| margin: 6px 8px; | |
| display: flex; | |
| column-gap: 6px; | |
| row-gap: 6px; | |
| align-items: center; | |
| flex-wrap: wrap; | |
| > .pf-tag-input { | |
| flex-grow: 1; | |
| } | |
| .pf-select { | |
| flex-shrink: 0; | |
| } | |
| .pf-radio-group__button { | |
| padding-block: 1px; | |
| } | |
| } | |
| .pf-tag-input { | |
| flex: 1 1 0; | |
| min-width: 0; | |
| max-height: 60px; | |
| overflow-y: auto; | |
| flex-wrap: wrap; | |
| gap: 6px; | |
| // Override the inner Stack to allow wrapping and add gaps. | |
| .pf-stack { | |
| flex-wrap: wrap; | |
| gap: 6px; | |
| } | |
| .pf-chip { | |
| max-width: 200px; | |
| min-width: auto; | |
| } | |
| input { | |
| min-width: 80px; | |
| } | |
| } | |
| .pf-flamegraph-secondary-row { | |
| flex: 1 0 100%; | |
| min-width: 0; | |
| display: flex; | |
| align-items: center; | |
| justify-content: flex-end; | |
| gap: 6px; | |
| } | |
| .pf-flamegraph-control-label { | |
| font-weight: 500; | |
| flex-shrink: 0; | |
| } | |
| .pf-flamegraph-highlight-search { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| flex: 0 1 416px; | |
| min-width: 280px; | |
| .pf-text-input { | |
| min-width: 180px; | |
| width: 100%; | |
| } | |
| } | |
| .pf-flamegraph-highlight-search__count { | |
| flex-shrink: 0; | |
| color: var(--pf-color-text-muted); | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .popup-anchor { | |
| width: 0px; | |
| height: 0px; | |
| position: absolute; | |
| } | |
| canvas { | |
| user-select: none; | |
| } | |
| .canvas-container { | |
| height: 100%; | |
| position: relative; | |
| overflow-y: auto; | |
| } | |
| .pf-virtual-canvas { | |
| height: 100%; | |
| } | |
| } | |
| .pf-flamegraph-tooltip-popup { | |
| width: max-content; | |
| font-size: 15px; | |
| display: flex; | |
| flex-direction: column; | |
| padding: 4px; | |
| .tooltip-text-line { | |
| display: flex; | |
| cursor: text; | |
| padding-top: 4px; | |
| gap: 4px; | |
| } | |
| .tooltip-text { | |
| cursor: text; | |
| } | |
| .tooltip-bold-text { | |
| font-weight: 600; | |
| cursor: text; | |
| } | |
| .pf-button-bar { | |
| padding-top: 16px; | |
| } | |
| .tooltip-marker-text { | |
| font-size: var(--pf-font-size-s); | |
| font-style: italic; | |
| color: var(--pf-color-text-muted); | |
| padding-bottom: 4px; // Extra gap between marker and function name | |
| } | |
| } | |
| .pf-filter-builder { | |
| &.pf-popup { | |
| min-width: 300px; | |
| > .pf-popup-content { | |
| padding: 12px; | |
| } | |
| } | |
| &__separator { | |
| height: 1px; | |
| background: var(--pf-color-border); | |
| margin: 12px 0 8px 0; | |
| } | |
| &__tip { | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| font-size: smaller; | |
| color: var(--pf-color-text-muted); | |
| padding-bottom: 8px; | |
| } | |
| &__help { | |
| font-size: 13px; | |
| } | |
| &__help-title { | |
| font-weight: 500; | |
| margin-bottom: 4px; | |
| } | |
| &__help-row { | |
| margin: 4px 0; | |
| } | |
| &__desc, | |
| &__warn, | |
| &__hint { | |
| font-size: smaller; | |
| margin-bottom: 8px; | |
| } | |
| &__desc, | |
| &__hint { | |
| color: var(--pf-color-text-muted); | |
| } | |
| &__hint { | |
| margin-top: 4px; | |
| } | |
| code { | |
| font-family: var(--pf-font-monospace, monospace); | |
| background: var(--pf-color-background-secondary, rgba(0, 0, 0, 0.06)); | |
| border-radius: 3px; | |
| padding: 0 3px; | |
| } | |
| &__warn { | |
| color: var(--pf-color-warning); | |
| } | |
| } | |
| // All category buttons share the width of the widest one: equal 1fr columns in | |
| // a grid sized to its content (width: max-content), so the bar shrink-wraps | |
| // instead of stretching the buttons to fill a wider tooltip. | |
| .pf-button-bar.pf-flamegraph-action-bar { | |
| display: grid; | |
| grid-auto-flow: column; | |
| grid-auto-columns: 1fr; | |
| width: max-content; | |
| gap: 8px; | |
| margin-top: 6px; | |
| > .pf-button { | |
| justify-content: center; | |
| } | |
| } | |
| // Compound selector overrides .pf-popup's own max-width. | |
| .pf-flamegraph-action-menu.pf-popup { | |
| max-width: 460px; | |
| } | |
| .pf-flamegraph-action-menu { | |
| .pf-menu { | |
| // Drop the default vertical margin so item hover reaches the popup edges. | |
| margin: 0; | |
| max-height: min(60vh, 480px); | |
| overflow-y: auto; | |
| // overflow-y:auto also implies overflow-x:auto; pin it off to avoid a | |
| // spurious horizontal scrollbar. | |
| overflow-x: hidden; | |
| } | |
| // Let items shrink so descriptions wrap instead of widening the popup. | |
| .pf-menu-item { | |
| min-width: 0; | |
| } | |
| } | |
| // Rendered in a popup portal outside .pf-flamegraph, hence a top-level selector. | |
| .pf-flamegraph-action { | |
| display: flex; | |
| flex-direction: column; | |
| min-width: 0; | |
| &__title { | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| line-height: 1.3; | |
| } | |
| &__desc { | |
| font-size: smaller; | |
| color: var(--pf-color-text-muted); | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| line-height: 1.25; | |
| } | |
| &__aka { | |
| font-style: italic; | |
| } | |
| } |