xref: /aosp_15_r20/external/perfetto/ui/src/assets/details.scss (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1// Copyright (C) 2019 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15.handle {
16  background-color: hsl(215, 1%, 95%);
17  border: 1px solid rgba(0, 0, 0, 0.1);
18  border-bottom: none;
19  cursor: row-resize;
20  // Disable user selection since this handle is draggable to resize the
21  // bottom panels.
22  user-select: none;
23  display: flex;
24
25  .tabs {
26    display: flex;
27    overflow: hidden;
28    flex: 1;
29
30    .tab {
31      font-family: "Roboto Condensed", sans-serif;
32      color: #3c4b5d;
33      padding: 4px;
34      margin-top: 3px;
35      align-items: center;
36      cursor: pointer;
37      font-size: 13px;
38      border-radius: 3px 3px 0 0;
39      background-color: #0000000f;
40      border-right: solid 1px hsla(0, 0%, 75%, 1);
41      overflow: hidden;
42      white-space: nowrap;
43      text-overflow: ellipsis;
44      z-index: 5;
45      box-shadow: #0000003b 0px 0px 3px 1px;
46      display: flex;
47      align-items: baseline;
48      gap: 2px;
49
50      &:hover {
51        background-color: hsla(0, 0%, 85%, 1);
52      }
53
54      &[active] {
55        background-color: white;
56        cursor: default;
57      }
58
59      &:nth-child(1) {
60        margin-left: 3px;
61      }
62
63      .pf-tab-title {
64        margin: 0px 4px;
65        overflow: hidden;
66
67        .pf-nocontent {
68          font-weight: lighter;
69        }
70      }
71    }
72  }
73
74  .buttons {
75    font-size: 24px;
76    grid-area: buttons;
77    display: flex;
78    align-items: baseline;
79    margin: 1px;
80  }
81
82  .handle-title {
83    font-family: "Roboto Condensed", sans-serif;
84    font-weight: 300;
85    color: #3c4b5d;
86    margin-left: 5px;
87    padding: 5px;
88    font-size: 13px;
89  }
90}
91
92.details-panel {
93  @include bottom-panel-font;
94
95  // This is required to position locally-scoped (i.e. non-full-screen) modal
96  // dialogs within the panel, as they use position: absolute.
97  position: relative;
98
99  .material-icons {
100    @include transition(0.3s);
101    font-size: 16px;
102    margin-left: 5px;
103    &:hover {
104      cursor: pointer;
105    }
106    &.grey {
107      border-radius: 3px;
108      border: 1px solid transparent;
109      background-color: #e8e8e8;
110      &:hover {
111        border: #475566 solid 1px;
112      }
113    }
114  }
115
116  .details-panel-heading {
117    padding: 10px 0 5px 0;
118    position: sticky;
119    top: 0;
120
121    // Relative/absolute/etc.. (non static) elements stack on top of this sticky
122    // header, so setting the z-index here to 1 forces this header to render
123    // over the top of other elements in the underlying panels.
124    z-index: 1;
125
126    display: flex;
127    background: white;
128    &.aggregation {
129      padding-top: 5px;
130      display: grid;
131      grid-template-areas:
132        "description range"
133        "heading heading";
134      grid-template-columns: 1fr auto;
135      .states {
136        font-size: 11px;
137        margin: 0 10px 2px 10px;
138        display: flex;
139        overflow: hidden;
140        .state {
141          height: 20px;
142          line-height: 20px;
143          padding-left: 3px;
144          padding-right: 3px;
145          border-left: white 1px solid;
146          &:hover {
147            min-width: fit-content;
148          }
149        }
150      }
151      .time-range {
152        text-align: right;
153        font-size: 11px;
154        font-weight: 400;
155        margin-right: 5px;
156      }
157      table {
158        grid-area: heading;
159      }
160      th {
161        cursor: pointer;
162        .material-icons {
163          margin-left: 2px;
164          font-size: 18px;
165        }
166      }
167    }
168    h2 {
169      font-size: 16px;
170      font-weight: 400;
171      padding: 0 10px;
172      &.split {
173        width: 50%;
174      }
175    }
176  }
177
178  table {
179    @include transition(0.1s);
180    @include table-font-size;
181    width: 100%;
182    // Aggregation panel uses multiple table elements that need to be aligned,
183    // which is done by using fixed table layout.
184    table-layout: fixed;
185    word-wrap: break-word;
186    padding: 0 10px;
187    tr:hover {
188      td,
189      th {
190        background-color: $table-hover-color;
191
192        &.no-highlight {
193          background-color: white;
194        }
195      }
196    }
197    th {
198      text-align: left;
199      width: 30%;
200      font-weight: normal;
201      vertical-align: top;
202    }
203    td.value {
204      white-space: pre-wrap;
205    }
206    td.padding {
207      min-width: 10px;
208    }
209    .array-index {
210      text-align: right;
211    }
212  }
213
214  .auto-layout {
215    table-layout: auto;
216  }
217}
218
219.slice-details-latency-panel {
220  // This panel is set to relative to make this panel a positioned element
221  // This is to allow the absolute text panels below to be positioned relative
222  // to this panel and not our parent.
223  position: relative;
224  user-select: text;
225
226  .text-detail {
227    font-size: smaller;
228  }
229
230  .slice-details-wakeup-text {
231    position: absolute;
232    left: 40px;
233    top: 20px;
234  }
235
236  .slice-details-latency-text {
237    position: absolute;
238    left: 106px;
239    top: 90px;
240  }
241
242  .slice-details-image {
243    user-select: none;
244    width: 180px;
245    height: 150px;
246  }
247}
248
249.details-table-multicolumn {
250  display: flex;
251  user-select: "text";
252}
253
254.flow-link:hover {
255  cursor: pointer;
256  text-decoration: underline;
257}
258
259.flow-info i.material-icons {
260  color: rgb(60, 86, 136);
261}
262
263.warning {
264  position: relative;
265  font-size: 13px;
266  color: hsl(45, 100%, 48%);
267}
268
269.warning i.material-icons {
270  font-size: 13px;
271}
272
273.warning .tooltip {
274  visibility: hidden;
275
276  background-color: white;
277  color: #3f4040;
278  box-shadow: 1px 3px 15px rgba(23, 32, 44, 0.3);
279
280  padding: 4px;
281  border-radius: 4px;
282
283  text-align: center;
284  white-space: nowrap;
285
286  position: absolute;
287  z-index: 1;
288  top: -5px;
289  left: 105%;
290}
291
292.warning:hover .tooltip {
293  visibility: visible;
294}
295
296.flow-button {
297  color: rgb(60, 86, 136);
298}
299
300.half-width-panel {
301  max-width: 50%;
302  flex-grow: 1;
303  height: fit-content;
304}
305
306.notes-editor-panel {
307  padding: 10px;
308  display: flex;
309  flex-direction: column;
310  height: 100%;
311  font-family: "Roboto Condensed", sans-serif;
312  font-weight: 300;
313  color: #3c4b5d;
314
315  .notes-editor-panel-heading-bar {
316    display: flex;
317    padding-bottom: 8px;
318    font-size: 14px;
319    .notes-editor-panel-heading {
320      padding-top: 3px;
321    }
322    input {
323      vertical-align: middle;
324    }
325  }
326
327  input[type="text"] {
328    flex-grow: 1;
329    border-radius: 4px;
330    border: 1px solid #dcdcdc;
331    padding: 3px;
332    margin: 0 10px;
333    &:focus {
334      outline: none;
335      box-shadow: 1px 1px 1px rgba(23, 32, 44, 0.3);
336    }
337  }
338}
339
340.sum {
341  font-weight: bolder;
342  font-size: 12px;
343  .sum-data {
344    border-bottom: 1px solid $table-border-color;
345  }
346}
347
348.log-panel {
349  display: contents;
350
351  header {
352    position: sticky;
353    top: 0;
354    left: 0;
355    z-index: 1;
356    background-color: white;
357    color: #3c4b5d;
358    padding: 5px;
359    display: grid;
360    grid-template-columns: auto auto;
361    justify-content: space-between;
362  }
363
364  .log-rows-label {
365    display: flex;
366    align-items: center;
367  }
368
369  .log-filters {
370    display: flex;
371    margin-right: 5px;
372    align-items: center;
373
374    .log-label {
375      padding-right: 0.35rem;
376    }
377
378    .tag-container {
379      height: auto;
380      min-height: 34px;
381      padding: 2px;
382      margin: 2px;
383      cursor: text;
384      border-radius: 3px;
385      display: flex;
386      align-items: center;
387
388      .chips .chip {
389        display: inline-block;
390        width: auto;
391        float: left;
392
393        background-color: #0878b2;
394        color: #fff;
395        border-radius: 3px;
396        margin: 2px;
397        overflow: hidden;
398
399        .chip-button {
400          padding: 4px;
401          cursor: pointer;
402          background-color: #054570;
403          display: inline-block;
404        }
405
406        .chip-text {
407          padding: 4px;
408          display: inline-block;
409          pointer-events: none;
410        }
411      }
412
413      .chip-input {
414        margin-left: 5px;
415      }
416    }
417
418    .filter-widget {
419      user-select: none;
420      cursor: pointer;
421      position: relative;
422      display: inline-block;
423    }
424
425    .filter-widget .tooltip {
426      visibility: hidden;
427      width: 120px;
428      background-color: black;
429      color: #fff;
430      text-align: center;
431      border-radius: 6px;
432      padding: 5px 0;
433
434      /* Position the tooltip */
435      position: absolute;
436      z-index: 1;
437      top: 130%;
438      right: 50%;
439    }
440
441    .filter-widget:hover .tooltip {
442      visibility: visible;
443    }
444  }
445
446  header.stale {
447    color: grey;
448  }
449}
450
451.pf-ftrace-explorer {
452  height: 100%;
453  font-size: 11px;
454  font-family: var(--monospace-font);
455
456  .pf-ftrace-namebox {
457    display: flex;
458    align-items: center;
459
460    .pf-ftrace-colorbox {
461      display: inline-block;
462      height: 10px;
463      width: 10px;
464      margin-right: 4px;
465    }
466  }
467}
468
469.pf-android-logs-table {
470  height: 100%;
471  font-size: 11px;
472  font-family: var(--monospace-font);
473
474  .D {
475    color: hsl(122, 20%, 40%);
476  }
477  .V {
478    color: hsl(122, 20%, 30%);
479  }
480  .I {
481    color: hsl(0, 0%, 20%);
482  }
483  .W {
484    color: hsl(45, 60%, 45%);
485  }
486  .E {
487    color: hsl(4, 90%, 58%);
488  }
489  .F {
490    color: hsl(291, 64%, 42%);
491  }
492  .pf-highlighted {
493    background: #d2efe0;
494  }
495}
496
497.pf-details-table {
498  margin: 10px;
499}
500
501.screenshot-panel {
502  height: 100%;
503  img {
504    max-height: 100%;
505  }
506}
507
508.pf-noselection {
509  height: 100%;
510}
511
512.flamegraph-profile {
513  height: 100%;
514  // This is required to position locally-scoped (i.e. non-full-screen) modal
515  // dialogs within the panel, as they use position: absolute.
516  position: relative;
517
518  .time {
519    justify-self: end;
520    margin-right: 10px;
521  }
522  .selected {
523    justify-self: end;
524    margin-right: 10px;
525    white-space: nowrap;
526    overflow: hidden;
527    text-overflow: ellipsis;
528    width: 200px;
529  }
530}
531