// Copyright (C) 2018 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. :root { --record-text-color: #333; } // The whole record page. .record-page { position: relative; overflow-y: scroll; background-color: #fefefe; padding: 40px 20px; } // The always-visible centered box that has menu and sections on the right. .record-container { position: relative; max-width: 900px; min-height: 500px; margin: auto; border-radius: 5px; box-shadow: 0 1px 2px 0#aaa, 0 1px 3px 1px #eee; background-color: #fff; display: grid; grid-template-columns: 2fr 5fr; grid-template-rows: auto 1fr; grid-template-areas: "header header" "sidebar section"; overflow: hidden; z-index: 6; } .hider { @include transition(0.2s); position: fixed; left: 0; top: 0; bottom: 0; right: 0; background: #000; opacity: 0.2; z-index: 5; } .record-header { grid-area: header; padding: 10px; display: flex; flex-direction: column; border-bottom: 1px solid #eee; .top-part { display: flex; justify-content: space-between; align-items: center; // Connect/start/stop tracing buttons. .button { display: flex; justify-content: flex-end; align-items: center; width: auto; height: 50px; margin: 0; >* { @include transition(0.2s); cursor: pointer; border-radius: 10px; margin: 10px; text-align: center; background-color: #eee; font-family: 'Raleway', sans-serif; font-size: 17px; @media (max-width: 1280px) { font-size: 1.6vw; } padding: 7px; &:hover { background-color: hsl(88, 50%, 84%); box-shadow: 0 0 4px 0px #999; } &.selected { background-color: hsl(88, 50%, 67%); box-shadow: 0 0 4px 0px #999; } &.disabled { background-color: hsl(0, 0%, 97%); } } } .target-and-status { display: flex; flex-direction: column; justify-content: space-evenly; .target { display: flex; flex-direction: row; align-items: center; } label, select, button { font-weight: 100; margin: 3px; color: #333; font-size: 17px; font-family: 'Roboto', sans-serif; align-items: center; &.error-label { max-width: 500px; color: rgb(255, 0, 0); font-size: 15px; } } .chip { @include transition(); display: flex; align-items: center; border: 1px solid #eee; outline: none; margin: 4px; border-radius: 20px; padding: 4px; height: 30px; &:hover, &:active { box-shadow: 0 0 4px 0px #ccc; background-color: #fafafa; } i { margin: 3px; align-items: center; } } } } .note { border-radius: 3px; margin-bottom: 5px; background: #f9eeba; padding: 10px; font-family: 'Roboto', sans-serif; font-size: 14px; line-height: 20px; } select { @include transition(); margin-left: 10px; border-radius: 0; border: 1px solid #eee; outline: none; &:hover, &:active { box-shadow: 0 0 6px #ccc; } } } // The left-hand-side menu with 'Cpu', 'Memory' etc. .record-menu { grid-area: sidebar; .rec { color: #ee3326; } background-color: #fcfcfc; border-right: 1px solid #eee; padding-bottom: 1em; header { font-family: 'Roboto', sans-serif; font-size: 14px; font-weight: 700; margin: 1em; } ul { list-style-type: none; margin: 0; padding: 0; } a, a:link, a:visited { text-decoration: none; } li { @include transition(); display: block; height: 55px; padding: 0 1em; font-size: 15px; letter-spacing: 0.5px; font-family: 'Raleway', sans-serif; font-weight: 600; color: #666; display: grid; grid-template-columns: 50px 1fr; grid-template-rows: 40px 1fr; grid-template-areas: "icon title" "icon subtext"; cursor: pointer; overflow: hidden; i { margin: auto; border-radius: 100%; font-size: 32px; width: 38px; height: 38px; padding: 3px; background: #eee; grid-area: icon; } .title { transition: line-height .25s ease; grid-area: title; line-height: 55px; display: block; } .sub { @include transition(0.5s); grid-area: subtext; font-size: 10px; line-height: 12.5px; margin-top: -5px; opacity: 0; } &:hover { background-color: hsl(214, 0%, 90%); .title { line-height: 50px; } .sub { opacity: 1; transition-duration: 0.25s; transition-delay: 0.0s; } } &.active { background-color: hsl(214, 80%, 70%); .title, .sub { color: white; } } } // li &.disabled { opacity: 0.50; pointer-events: none; } } // record-menu .record-section { grid-area: section; background: #fff; transition: opacity 0.25s ease; opacity: 0; display: none; &:not(.active) { max-height: 0; } &.active { display: block; opacity: 1; } .config { &:nth-of-type(2n) { background-color: #e7e7e7; } height: auto; width: 100%; padding: 0px; display: flex; align-items: center; } .title-config { display: inline-block; margin: var(--record-section-padding); flex-grow: 1; word-break: break-all; } .config-button { border-radius: 10px; margin-right: 10px; text-align: center; justify-items: center; font-family: 'Raleway', sans-serif; padding: 7px; width: 75px; &:hover { box-shadow: 0 0 4px 0px #999; } &.load { background-color: hsl(88, 50%, 67%); } &.delete { background-color: hsl(0, 50%, 67%); } &.save { width: 160px; background-color: hsl(197, 50%, 67%); } } .input-config { margin-top: 20px; margin-bottom: 20px; display: flex; align-items: center; padding: 0px; input { border-radius: 20px; border-color: #0000003d; line-height: 36px; padding: 0 10px; font-size: 18px; font-family: 'Roboto Condensed', sans-serif; font-weight: 300; color: #666; flex-grow: 1; margin-right: 10px; margin-left: 10px; background-color: transparent; &:focus { outline: none; } &::placeholder { color: #b4b7ba; font-family: 'Raleway', sans-serif; font-weight: 400; } } } // By default space all section elements by the same amount. --record-section-padding: 20px; >* { padding-left: var(--record-section-padding); padding-right: var(--record-section-padding); &:first-child { padding-top: 20px; } &:last-child { padding-bottom: 20px; } } >header { text-align: center; font-family: 'Raleway', sans-serif; font-size: 20px; padding: 15px 10px; color: #333; letter-spacing: 0.5px; } .hide { opacity: 0; visibility: hidden; } .probe { display: grid; grid-template-rows: 40px 1fr; grid-template-columns: 220px 1fr; grid-template-areas: "label label" "img descr"; transition: color 0.2s ease; padding-top: var(--record-section-padding); padding-bottom: var(--record-section-padding); &:nth-of-type(2n) { background-color: #f9f9f9; } >img { transition: filter 0.2s ease, opacity 0.2s ease; grid-area: img; width: 210px; box-sizing: content-box; cursor: pointer; opacity: 0.5; filter: saturate(0.15); } &:hover { >img { opacity: 1; } >label { color: #333; input[type=checkbox]::after { background: hsl(207, 60%, 60%); } } } // :hover >label { grid-area: label; cursor: pointer; font-family: 'Roboto' , sans-serif; font-size: 20px; font-weight: 400; color: #999; // The per-probe on-off switch. input[type=checkbox] { -moz-appearance: none; -webkit-appearance: none; cursor: pointer; margin: 0 10px 0 3px; position: relative; display: inline-block; height: 20px; width: 44px; background: #89898966; border-radius: 100px; transition: all 0.3s ease; overflow: visible; vertical-align: middle; &:focus { outline: none; } &::after { position: absolute; left: -2px; top: -3px; display: block; width: 26px; height: 26px; border-radius: 100px; background: #f5f5f5; box-shadow: 0px 3px 3px rgba(0,0,0,0.15); content: ''; transition: all 0.3s ease; } &:checked { background: #8398b7; } &:focus::after { background: hsl(207, 60%, 60%); } &:checked::after { left: 20px; background: #27303d; } } // checkbox } // label // The content of the probe section. >div { grid-area: descr; font-size: 14px; font-weight: 200; min-height: 50px; color: var(--record-text-color); line-height: 20px; } // .probe-config is showed only when the probe is enabled. .probe-config { @include transition(0.3s); opacity: 0; visibility: hidden; margin: 10px 10px 0 0; max-height: 0; } &.enabled { .probe-config { opacity: 1; visibility: visible; max-height: 100vh; } >label span { color: #4e80b7; } >img { filter: saturate(1); opacity: 1; } } } // probe .toggle { transition: color 0.2s ease; padding-top: var(--record-section-padding); &:hover { >img { opacity: 1; } >label { color: #333; input[type=checkbox]::after { background: hsl(207, 60%, 60%); } } } // :hover >label { cursor: pointer; font-size: 14px; color: var(--record-text-color); // The per-probe on-off switch. input[type=checkbox] { -moz-appearance: none; -webkit-appearance: none; cursor: pointer; margin: 0 12px 0 2px; position: relative; display: inline-block; height: 10px; width: 22px; background: #89898966; border-radius: 100px; transition: all 0.3s ease; overflow: visible; vertical-align: middle; &:focus { outline: none; } &::after { position: absolute; left: -5px; top: -5px; display: block; width: 20px; height: 20px; border-radius: 100px; background: #f5f5f5; box-shadow: 0px 3px 3px rgba(0,0,0,0.15); content: ''; transition: all 0.3s ease; } &:checked { background: #8398b7; } &:focus::after { background: hsl(207, 60%, 60%); } &:checked::after { left: 12px; background: #27303d; } } // checkbox } // label // The content of the toggle section. >div.descr { font-size: 12px; color: #666; } } // toggle // The three "Stop when full", "Ring buffer", "Long trace" buttons. .record-mode { display: grid; grid-template-columns: 1fr 1fr 1fr; grid-template-areas: ". . ."; grid-template-rows: 1fr; padding-top: 0; input[type=radio] { appearance: none; -webkit-appearance: none; display: none; } >* { @include transition(0.2s); cursor: pointer; border-radius: 15px; margin: 5px; text-align: center; background-color: #eee; font-family: 'Raleway', sans-serif; font-size: 20px; @media (max-width: 1280px) { font-size: 1.6vw; } padding-bottom: 10px; &:hover { background-color: hsl(88, 50%, 84%); box-shadow: 0 0 4px 0px #999; } &.selected { background-color: hsl(207, 90%, 74%); background-color: hsl(88, 50%, 67%); box-shadow: 0 0 4px 0px #999; } img { width: 100%; } } } // record-mode // There are two types of sliders: // 1) The full-width one (default), e.g. the one used in the main recording // page for the duration of the trace. This one has both an icon and a // label on the top. // 2) The smaller ones (.thin) used in the probes. This one has no icon. .slider { @include transition(0.3s); display: grid; grid-template-columns: 40px 1fr 130px 0; grid-template-rows: 30px min-content 1fr; grid-template-areas: "hdr hdr hdr hdr" "descr descr descr descr" "icon slider label unit"; margin-top: var(--record-section-padding); &.thin { grid-template-columns: 1fr 1fr 100px 0; grid-template-areas: "hdr hdr hdr hdr" "descr descr descr descr" "slider slider label unit"; } &.greyed-out { opacity: 0.5; } >* { height: 40px; line-height: 40px; } >header { @include transition(0.3s); opacity: 0.6; color: #333; grid-area: hdr; } &.thin >header { opacity: 1; color: var(--record-text-color); font-size: 14px; } &.thin >header.descr { grid-area: descr; font-size: 12px; color: #666; height: 20px; line-height: 20px; } &:hover > header { opacity: 1; transition-duration: 0.15s; } >i { grid-area: icon; font-size: 32px; color: #333; } input[type=range] { grid-area: slider; width: 100%; appearance: none; -webkit-appearance: none; scroll-snap-type: mandatory; background-color : transparent; outline: none; margin-left: -10px; margin-top: -5px; &::-webkit-slider-runnable-track { margin: 10px; border-radius: 1px; width: 100%; height: 10px; background-color : #ddd; border-radius: 4px; } &::-webkit-slider-thumb { @include transition(); appearance: none; -webkit-appearance: none; border: none; border-radius: 3px; height: 20px; width: 40px; background-color: rgb(33, 150, 243); margin-top: -5px; cursor: pointer; content: ""; } &:hover::-webkit-slider-thumb, &:focus::-webkit-slider-thumb { box-shadow: 0 0 4px rgb(16, 81, 134); transform: scale(1, 1.1); } } &.thin input[type=range]::-webkit-slider-runnable-track { height: 8px; } &.thin input[type=range]::-webkit-slider-thumb { width: 20px; border-radius: 100%; } .spinner { @include transition(); grid-area: label; border: 1px solid #fafafa; border-bottom: 2px solid #ddd; padding: 0 5px; border-radius: 2px; background-color: rgba(255, 255, 255, 60%); font-family: 'Roboto', sans-serif; font-size: 16px; font-weight: 100; height: 35px; outline: none; &::-webkit-inner-spin-button, &::-webkit-outer-spin-button, &::-webkit-clear-button { -webkit-appearance: none; margin: 0; } &:hover, &:focus { border-bottom-color: hsl(207, 90%, 54%); background-color: hsl(207, 50%, 97%);; } &:invalid { border-bottom-color: hsl(9, 90%, 54%); background-color: hsl(9, 50%, 97%);; } } &.thin .spinner { font-size: 14px; margin-top: -5px; } .unit { grid-area: unit; font-size: 12px; color: var(--record-text-color); position: relative; line-height: 37px; overflow: hidden; width: 35px; left: -45px; text-align: right; margin-top: -5px; } } .dropdown { border: 1px solid #eee; outline: none; -webkit-appearance: none; &:not(.multicolumn) { overflow: hidden; height: 25px; padding: 0 5px; &:focus, &:hover { height: 30vh; position: absolute; overflow: auto; box-shadow: 0 0 15px 0 #eee; } } option, optgroup { @include transition(); min-height: 25px; font-size: 12px; color: var(--record-text-color); cursor: pointer; padding: 5px 0; } option { padding: 2.5px 5px; border-bottom: 1px solid #eee; &:hover { background-color: hsl(214, 80%, 90%); } &::before { display: none; content: ''; } } &.multicolumn { padding: 0; max-width: 100%; width: 100%; overflow-y: auto; optgroup { display: grid; padding: 0; grid-template-columns: 1fr 1fr 1fr; } option { &:nth-of-type(3n + 1) { border-left: 1px solid #eee; border-right: 1px solid #eee; } margin: 0; } &.two-columns { height: 400px; margin: var(--record-section-padding); optgroup { display: grid; padding: 0; grid-template-columns: 1fr 1fr; } option { &:nth-of-type(2n + 1) { border-left: 1px solid #eee; border-right: 1px solid #eee; } margin: 0; } } } } .atrace-categories { height: 227px; } .ftrace-events { height: 152px; } textarea.extra-input { width: 100%; height: 60px; border: 1px solid #eee; resize: none; outline: none; font-family: var(--monospace-font); &::placeholder { color: #aaa; } } .code-snippet { display: grid; position: relative; padding: 0; margin: var(--record-section-padding); background-color: #111; border-radius: 4px; user-select: text; box-shadow: 0 0 12px #999; @keyframes ripple{ 0% { transform: scale(1.00); } 30% { transform: scale(1.20); } 60% { transform: scale(1.00); } 80% { transform: scale(1.30); } 100% { transform: scale(1.20); } } &::before { height: 20px; content: ""; display: block; background-color: #598eca; } &.no-top-bar { white-space: 'pre'; &::before { height: 0; } } >code { display: block; margin: 10px 5px 20px 20px; color: #ccc; font-family: var(--monospace-font); font-size: 12px; line-height: 20px; overflow-y: auto; white-space: pre-wrap; word-wrap: break-word; // 510px and not 500px, so the overflowing line gets truncated, giving // a clear indication that the code box scrolls. max-height: 510px; } >button { @include transition(); display: inline-block; position: absolute; top: 30px; right: 20px; color: white; border-radius: 100%; background-color: #333; box-shadow: 0 0 2px rgba(255, 255, 255, 200); padding: 5px; font-size: 16px; line-height: 13px; // Deliberately smaller to center the icon. user-select: none; &:hover { background-color: #444; transform: scale(1.1); } } &:active:hover >button:not(:hover) { animation: ripple linear 0.5s; background-color: #701d17; transform: scale(1.1); } >button:active:hover { transform: scale(0.9); } } // code-snippet &.instructions { label, select { font-weight: 100; color: #333; font-size: 16px; font-family: 'Roboto', sans-serif; } .note { border: 1px dashed #ddd; background: #f9eeba; margin: var(--record-section-padding); padding: 10px; font-family: 'Roboto', sans-serif; font-size: 14px; line-height: 20px; } select { @include transition(); margin-left: 10px; border-radius: 0; border: 1px solid #eee; outline: none; &:hover, &:active { box-shadow: 0 0 6px #ccc; } } // Stop/cancel buttons .buttons { display: flex; justify-content: center; align-items: center; width: auto; height: 70px; >* { @include transition(0.2s); cursor: pointer; border-radius: 10px; text-align: center; margin: 3px; background-color: #eee; font-family: 'Raleway', sans-serif; flex-grow: 1; font-size: 17px; @media (max-width: 1280px) { font-size: 1.6vw; } padding: 7px; &:hover { background-color: hsl(88, 50%, 84%); box-shadow: 0 0 4px 0px #999; } &.selected { background-color: hsl(88, 50%, 67%); box-shadow: 0 0 4px 0px #999; } } } .permalinkconfig { margin: var(--record-section-padding); height: 40px; max-width: 200px; border-radius: 10px; text-align: center; justify-items: center; font-family: 'Raleway', sans-serif; padding: 7px; background-color: hsl(88, 50%, 67%); &:hover { box-shadow: 0 0 4px 0px #999; } } progress { -webkit-appearance: none; appearance: none; width: 600px; height: 30px; margin: var(--record-section-padding); border-radius: 5px; } ::-webkit-progress-value { background-color: hsl(88, 50%, 67%); } ::-webkit-progress-bar { background-color: #eee; } } } // record-section .inline-chip { @include transition(); &:hover, &:active { box-shadow: 0 0 2px 0px #ccc; background-color: #fafafa; } >i.material-icons { color: rgb(60, 60, 60); font-size: 14px; } line-height: 25px; font-size: smaller; padding: 2px 4px; border: 1px solid #eee; margin: 2px; border-radius: 9px; } a.inline-chip, a.inline-chip:link, a.inline-chip:visited { text-decoration: none; color: var(--record-text-color); }