Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* TODO: May break up into component local CSS. Pending future discussions by
* React component group on how to best handle CSS. */
/**
* CSS Variables specific to the responsive design mode
*/
:root {
--toolbar-row-height: 28px;
--rdm-box-shadow: 0 4px 4px 0 rgba(155, 155, 155, 0.26);
--viewport-active-color: #3b3b3b;
--input-invalid-border-color: var(--red-60);
--custom-device-button-hover: var(--grey-30);
--device-list-grid-template-columns: auto auto max-content 1fr;
}
:root.theme-dark {
--rdm-box-shadow: 0 4px 4px 0 rgba(105, 105, 105, 0.26);
--viewport-active-color: #fcfcfc;
--input-invalid-border-color: var(--red-50);
--custom-device-button-hover: var(--grey-70);
}
* {
box-sizing: border-box;
}
:root,
input,
button {
font-size: 12px;
}
input,
button {
color: var(--theme-toolbar-color);
background-color: var(--theme-tab-toolbar-background);
}
html,
body,
#root {
height: 100%;
overflow: hidden;
color: var(--theme-body-color);
}
.text-input {
border: 1px solid var(--theme-splitter-color);
margin: 0 1px;
padding: 2px;
font-size: 12px;
line-height: 16px;
}
.text-input.invalid {
outline-color: var(--input-invalid-border-color);
}
#app {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
/**
* Common styles for shared components
*/
.devtools-separator {
height: 100%;
margin: 0 1px;
}
/**
* Toolbar
*/
#toolbar {
background-color: var(--theme-tab-toolbar-background);
border-bottom: 1px solid var(--theme-splitter-color);
display: grid;
grid-template-columns: auto min-content;
width: 100%;
user-select: none;
}
#toolbar :is(select, button):focus-visible {
/* Adjust the outline otherwise it's clipped at the top */
outline-offset: -1px
}
#toolbar-center-controls,
#toolbar-end-controls {
display: grid;
grid-auto-flow: column;
grid-auto-rows: var(--toolbar-row-height);
grid-row-gap: 1px;
padding: 0 1px;
}
#toolbar-center-controls {
grid-gap: 2px;
grid-template-columns:
[device-selector]
minmax(auto, 120px)
[separator]
max-content
[size-selector]
max-content
[rotate-icon]
max-content
[separator]
max-content
[dpr]
minmax(auto, 60px)
[separator]
max-content
[throttling]
minmax(auto, max-content)
[separator]
max-content
[touch-simulation]
max-content;
}
#toolbar.user-agent #toolbar-center-controls {
grid-template-columns:
[device-selector]
minmax(auto, 120px)
[separator]
max-content
[size-selector]
max-content
[rotate-icon]
max-content
[separator]
max-content
[dpr]
minmax(auto, 60px)
[separator]
max-content
[throttling]
minmax(auto, max-content)
[separator]
max-content
[ua]
minmax(auto, 300px)
[separator]
max-content
[touch-simulation]
max-content;
}
#toolbar:not(.left-aligned) {
grid-template-columns: 1fr auto 1fr min-content;
justify-content: center;
}
#toolbar:not(.left-aligned) #toolbar-center-controls {
grid-column-start: 2;
}
#toolbar:not(.left-aligned) #toolbar-end-controls {
justify-content: end;
}
#user-agent-label {
display: flex;
align-items: center;
margin-inline-start: 3px;
margin-inline-end: 3px;
}
#user-agent-input {
margin-inline-start: 3px;
flex: 1;
}
@media (max-width: 520px) {
/* When room becomes scarce, no need to constrain the selectors with a minmax like we
do in larger viewports, here they can occupy 1fr */
#toolbar.user-agent #toolbar-center-controls {
grid-template-columns:
[device-selector]
.8fr
[separator]
max-content
[size-selector]
max-content
[rotate-icon]
max-content
[separator]
max-content
[dpr]
.6fr
[separator]
max-content
[throttling]
1fr
[separator]
max-content
[touch-simulation]
max-content;
}
/* Drop the user agent label to the next line if there isn't enough space */
#user-agent-label {
grid-column: 1 / -1;
grid-row: 2;
margin-inline-start: 9px;
}
/* Since the UA is hidden, no need for a separator after it */
#user-agent-label + .devtools-separator {
display: none;
}
/* When the UA label is here and it's on a second line, draw a separator between the
2 lines*/
#toolbar.user-agent {
background-image: linear-gradient(to bottom,
transparent var(--toolbar-row-height),
var(--theme-splitter-color) var(--toolbar-row-height),
var(--theme-splitter-color) calc(var(--toolbar-row-height) + 1px),
transparent 0);
}
}
#rotate-button::before {
}
#rotate-button.viewport-orientation-landscape::before {
transform: rotate(90deg) scaleX(-1);
}
#touch-simulation-button::before {
}
#screenshot-button::before {
}
#settings-button::before {
background-image: url("chrome://devtools/skin/images/settings.svg");
}
#exit-button::before {
background-image: url("chrome://devtools/skin/images/close.svg");
}
/* Briefly animate screenshot button when clicked */
#screenshot-button:disabled {
opacity: 1 !important;
}
#screenshot-button:disabled::before {
fill: var(--theme-icon-checked-color);
}
#device-selector {
justify-self: end;
max-width: 100%;
margin-inline-start: 4px;
}
#device-selector .title {
display: grid;
grid-template-columns: var(--device-list-grid-template-columns);
}
#device-selector .title .device-name,
#device-selector .title .device-os {
margin-inline-start: 6px;
}
#device-selector::before {
fill: var(--theme-icon-dimmed-color);
}
/* Override the style defined in tooltips.css */
.tooltip-container[type="doorhanger"] .menuitem > .command.iconic.device-selector-item > .label::before {
fill: var(--theme-icon-dimmed-color);
}
/**
* Viewport Dimension Input
*/
.viewport-dimension {
display: flex;
align-items: center;
margin: 1px;
}
.viewport-dimension-input {
text-align: center;
width: 3em;
appearance: textfield;
}
.viewport-dimension-separator {
user-select: none;
padding: 0 0.2em;
}
/**
* Device Modal
*/
@keyframes fade-in-and-up {
0% {
opacity: 0;
transform: translateY(5px);
}
100% {
opacity: 1;
transform: translateY(0px);
}
}
@keyframes fade-down-and-out {
0% {
opacity: 1;
transform: translateY(0px);
}
100% {
opacity: 0;
transform: translateY(5px);
visibility: hidden;
}
}
.device-modal {
display: grid;
grid-template-rows: minmax(80px, auto) auto;
background-color: var(--theme-toolbar-background);
border: 1px solid var(--theme-splitter-color);
border-radius: 2px;
box-shadow: var(--rdm-box-shadow);
position: absolute;
margin: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 90%;
height: 90%;
max-width: 750px;
max-height: 730px;
z-index: 1;
overflow: hidden;
}
/* Handles the opening/closing of the modal */
#device-modal-wrapper.opened .device-modal {
animation: fade-in-and-up 0.3s ease forwards;
}
#device-modal-wrapper.closed .device-modal {
animation: fade-down-and-out 0.3s ease forwards;
}
#device-modal-wrapper.opened .modal-overlay {
background-color: var(--theme-splitter-color);
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: 0;
opacity: 0.5;
}
.device-modal-content {
display: grid;
grid-row-gap: 30px;
overflow: auto;
height: 100%;
padding: 10px 32px 50px 32px;
}
/* On screens that are >750px*/
@media (min-width: 750px) {
#device-form {
grid-template-areas: "name size dpr"
"user-agent touch buttons";
}
#device-form-name input,
#device-form-user-agent input {
width: 350px;
}
.device-modal-content {
grid-template-columns: 1fr 1fr;
grid-template-areas: "phone phone"
"tablet laptop"
"tv custom";
}
.device-type-phones .device-list {
grid-template-columns: repeat(2, var(--device-list-grid-template-columns));
}
}
/* On screens that are between 450px and 749px */
@media (min-width: 450px) and (max-width: 749px) {
#device-form {
grid-template-areas: "name size"
"user-agent dpr"
"touch buttons";
grid-template-columns: 2fr 1fr;
}
#device-form-name {
grid-area: name;
}
#device-form-name input,
#device-form-user-agent input {
width: 100%;
}
}
/* On screens that are <450px */
@media (max-width: 449px) {
#device-form {
grid-template-areas: "name"
"size"
"dpr"
"user-agent"
"touch"
"buttons";
}
#device-form-name input,
#device-form-user-agent input {
width: 90%;
}
#device-form-size {
justify-self: unset;
}
}
@media (max-width: 749px) {
.device-modal-content {
grid-template-areas: "phone"
"phone"
"tablet"
"laptop"
"tv"
"custom";
}
.device-modal-header {
flex-direction: column;
}
}
#device-close-button {
position: absolute;
top: 5px;
right: 2px;
}
#device-close-button::before {
background-image: url("chrome://devtools/skin/images/close.svg");
}
.device-type {
display: flex;
flex-direction: column;
}
.device-header {
font-size: 17px;
margin-bottom: 7px;
height: 20px;
text-transform: capitalize;
}
.device-label {
color: var(--theme-body-color);
padding-bottom: 5px;
padding-top: 5px;
align-items: center;
display: grid;
grid-column: span 4;
grid-template-columns: subgrid;
}
.device-label > button {
visibility: hidden;
}
.device-label > span {
margin-right: 6px;
}
.device-label:focus-within > button,
.device-label:hover > button {
visibility: visible;
}
.device-label:focus-within,
.device-label:hover {
background-color: var(--toolbarbutton-hover-background);
}
.device-modal-header {
display: flex;
justify-content: space-between;
}
.device-modal-header > #device-add-button {
margin: 30px 75px 0 30px;
}
.device-list {
display: grid;
font-size: 13px;
grid-template-columns: var(--device-list-grid-template-columns);
}
.device-input-checkbox {
margin-right: 8px;
}
.device-modal-title {
font-size: 22px;
margin: 30px 0 0px 30px;
}
.device-browser {
width: 16px;
height: 16px;
background-size: cover;
-moz-context-properties: fill;
fill: var(--theme-icon-dimmed-color);
}
.device-browser.chrome {
}
.device-browser.edge {
}
.device-browser.firefox {
}
.device-browser.ie {
}
.device-browser.opera {
}
.device-browser.safari {
}
.device-remove-button:empty::before {
background-image: url("chrome://devtools/skin/images/close.svg");
}
/**
* Device Form
*/
#device-form {
display: grid;
width: 100%;
background-color: var(--theme-toolbar-background);
min-height: 150px;
padding: 15px 20px 10px;
border-bottom: 1px solid var(--theme-splitter-color);
overflow: auto;
z-index: 1;
}
#device-add-button,
#device-form button {
background-color: rgba(12, 12, 13, 0.1);
border: 1px solid var(--theme-splitter-color);
border-radius: 2px;
cursor: pointer;
width: 167px;
height: 32px;
}
#device-edit-button::before {
background: url("chrome://devtools/skin/images/pencil-icon.svg") no-repeat 0 0;
}
#device-edit-button,
#device-edit-remove {
cursor: pointer;
}
#device-edit-button:focus-within,
#device-edit-button:hover,
#device-edit-remove.device-remove-button:focus-within,
#device-edit-remove.device-remove-button:hover {
background-color: var(--custom-device-button-hover);
}
#device-form label {
display: flex;
flex-direction: column;
margin: 5px;
}
#device-form label > .viewport-dimension {
color: var(--theme-body-color);
display: flex;
align-items: center;
}
#device-form input {
background: transparent;
border: 1px solid var(--theme-toolbarbutton-active-background);
border-radius: 2px;
text-align: center;
color: var(--theme-body-color);
transition: all 0.25s ease;
}
#device-form #device-form-name input,
#device-form #device-form-user-agent input {
text-align: left;
padding-left: 12px;
padding-right: 12px;
}
#device-form input:focus {
color: var(--viewport-active-color);
}
#device-form-pixel-ratio {
grid-area: dpr;
}
#device-form-pixel-ratio input {
appearance: textfield;
}
#device-form-user-agent {
grid-area: user-agent;
}
#device-form-name input,
#device-form-pixel-ratio input,
#device-form-user-agent input,
#device-form-size input {
height: 35px;
}
#device-form #device-form-touch {
flex-direction: row;
grid-area: touch;
}
#device-form-touch .device-form-label {
align-self: center;
margin-left: 5px;
}
#device-form #device-form-save {
background-color: #0060DF;
color: #fff;
border: 1px solid #0060DF;
width: 60px;
&:focus-visible {
/* Adjust outline so it's separated from the background color */
outline-offset: 2px;
}
}
#device-form-size {
grid-area: size;
}
#device-form-size input,
#device-form #device-form-cancel {
width: 60px;
}
#device-form-save,
#device-form-cancel {
align-self: center;
}
.device-form-buttons {
display: flex;
grid-area: buttons;
justify-content: space-evenly;
width: 154px;
}
.device-form-label {
display: inline-block;
margin: 0 5px 5px 0;
min-width: 35px;
font-size: 13px;
}
/* Device Types */
.device-type-phones {
grid-area: phone;
}
.device-type-custom {
grid-area: custom;
align-self: start;
}
.device-type-custom .device-list {
grid-template-columns: var(--device-list-grid-template-columns) auto auto;
}
.device-type-custom .device-label {
grid-column: span 6;
}
.device-type-tablets {
grid-area: tablet;
}
.device-type-laptops {
grid-area: laptop;
}
.device-type-televisions {
grid-area: tv;
}