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