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