summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/components/App.css
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/webconsole/components/App.css')
-rw-r--r--devtools/client/webconsole/components/App.css523
1 files changed, 523 insertions, 0 deletions
diff --git a/devtools/client/webconsole/components/App.css b/devtools/client/webconsole/components/App.css
new file mode 100644
index 0000000000..15dfa06f5e
--- /dev/null
+++ b/devtools/client/webconsole/components/App.css
@@ -0,0 +1,523 @@
+/* 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/. */
+
+html,
+body {
+ height: 100vh;
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+}
+
+#app-wrapper {
+ height: 100vh;
+ max-height: 100vh;
+}
+
+.webconsole-output {
+ direction: ltr;
+ overflow: auto;
+ overflow-anchor: none;
+ user-select: text;
+ position: relative;
+ container-name: console-output;
+ container-type: inline-size;
+}
+
+.webconsole-app {
+ --object-inspector-hover-background: transparent;
+ --attachment-margin-block-end: 3px;
+ --primary-toolbar-height: 29px;
+ display: grid;
+ /*
+ * Here's the design we want in in-line mode
+ * +----------------------------------------------+
+ * | [ChromeDebugToolbar] |
+ * +----------------------------------------------+
+ * | Filter bar primary ↔ |
+ * +----------------------------↔ |
+ * | [Filter bar secondary] ↔ |
+ * +----------------------------↔ |
+ * | ↔ |
+ * + +----------------------+ ↔ |
+ * | | | ↔ |
+ * | | Output | ↔ [sidebar] |
+ * | | | ↔ |
+ * | +----------------------+ ↔ |
+ * | | [NotificationBox] | ↔ |
+ * | +----------------------+ ↔ |
+ * | | | ↔ |
+ * | | JSTerm | ↔ |
+ * | | | ↔ |
+ * | +----------------------+ ↔ |
+ * | | [EagerEvaluation] | ↔ |
+ * | +----------------------+ ↔ |
+ * | | [EvalNotification] | ↔ |
+ * | +----------------------+ ↔ |
+ * +----------------------------↔ |
+ * | [Reverse search input] ↔ |
+ * +----------------------------------------------+
+ *
+ * - ↔ are width resizers
+ * - Elements inside brackets may not be visible, so we set
+ * rows/columns to "auto" to make them collapse when the element
+ * they contain is hidden.
+ */
+ grid-template-areas: "chrome-debug-toolbar chrome-debug-toolbar"
+ "filter-toolbar sidebar"
+ "filter-toolbar-secondary sidebar"
+ "output-input sidebar"
+ "eval-notification sidebar"
+ "reverse-search sidebar";
+ grid-template-rows: auto var(--primary-toolbar-height) auto 1fr auto auto;
+ grid-template-columns: minmax(200px, 1fr) minmax(0, auto);
+ max-height: 100vh !important;
+ height: 100vh !important;
+ width: 100vw;
+ overflow: hidden;
+ color: var(--console-output-color);
+ -moz-user-focus: normal;
+}
+
+.chrome-debug-toolbar {
+ grid-column: chrome-debug-toolbar;
+ grid-row: chrome-debug-toolbar;
+}
+
+.webconsole-filteringbar-wrapper {
+ grid-column: filter-toolbar;
+ grid-row: filter-toolbar / filter-toolbar-secondary;
+ grid-template-rows: subgrid;
+}
+
+.webconsole-filterbar-primary {
+ grid-row: filter-toolbar;
+}
+
+/* Only put the filter buttons toolbar on its own row in narrow filterbar layout */
+.narrow .devtools-toolbar.webconsole-filterbar-secondary {
+ grid-row: filter-toolbar-secondary;
+}
+
+.flexible-output-input {
+ display: flex;
+ flex-direction: column;
+ grid-area: output-input;
+ /* Don't take more height than the grid allows to */
+ max-height: 100%;
+ overflow: hidden;
+}
+
+.flexible-output-input .webconsole-output {
+ flex-shrink: 100000;
+ overflow-x: hidden;
+}
+
+.flexible-output-input > .webconsole-output:not(:empty) {
+ min-height: var(--console-row-height);
+}
+
+/* webconsole.css | chrome://devtools/skin/webconsole.css */
+.webconsole-filteringbar-wrapper .devtools-toolbar {
+ padding-inline-end: 0;
+}
+
+.devtools-button.webconsole-console-settings-menu-button {
+ /* adjust outline offset so it's not clipped */
+ --theme-outline-offset: -2px;
+ height: 100%;
+ margin: 0;
+}
+
+.webconsole-console-settings-menu-button::before {
+ background-image: url("chrome://devtools/skin/images/settings.svg");
+}
+
+.webconsole-app .jsterm-input-container {
+ overflow-y: auto;
+ overflow-x: hidden;
+ /* We display the open editor button at the end of the input */
+ display: grid;
+ grid-template-columns: 1fr auto;
+ /* This allows us to not define a column for the CodeMirror container */
+ grid-auto-flow: column;
+ /* This element has tabindex="-1" and can briefly show a focus outline when
+ * clicked, before we move the focus to CodeMirror. */
+ outline: none;
+}
+
+.webconsole-app:not(.jsterm-editor) .jsterm-input-container {
+ direction: ltr;
+ /* Define the border width and padding as variables so that we can keep
+ * border-top-width, padding and min-height in sync. */
+ --jsterm-border-width: 0;
+ --jsterm-padding-top: 0;
+ --jsterm-padding-bottom: 0;
+ min-height: calc(
+ var(--console-row-height) +
+ var(--jsterm-border-width) +
+ var(--jsterm-padding-top) +
+ var(--jsterm-padding-bottom)
+ );
+ padding-top: var(--jsterm-padding-top);
+ padding-bottom: var(--jsterm-padding-bottom);
+ border-top-color: var(--theme-splitter-color);
+ border-top-width: var(--jsterm-border-width);
+ border-top-style: solid;
+}
+
+.webconsole-app .webconsole-output:not(:empty) ~ .jsterm-input-container {
+ --jsterm-border-width: 1px;
+}
+
+.webconsole-app:not(.jsterm-editor, .eager-evaluation) .jsterm-input-container {
+ /* The input should be full-height when eager evaluation is disabled. */
+ flex-grow: 1;
+ --jsterm-padding-top: var(--console-input-extra-padding);
+ --jsterm-padding-bottom: var(--console-input-extra-padding);
+}
+
+.webconsole-app:not(.jsterm-editor).eager-evaluation .jsterm-input-container {
+ --jsterm-padding-top: var(--console-input-extra-padding);
+}
+
+.webconsole-input-openEditorButton {
+ /* adjust outline offset so it's not clipped */
+ --theme-outline-offset: -2px;
+ height: var(--console-row-height);
+ margin: 0;
+ padding-block: 0;
+}
+
+.webconsole-input-buttons {
+ grid-column: -1 / -2;
+ display: flex;
+ align-items: flex-start;
+}
+
+:root:dir(rtl) .webconsole-input-openEditorButton {
+ transform: scaleX(-1);
+}
+
+.webconsole-input-openEditorButton::before {
+ background-image: url("chrome://devtools/skin/images/webconsole/editor.svg");
+}
+
+.webconsole-app .reverse-search {
+ grid-area: reverse-search;
+ /* Those 2 next lines make it so the element isn't impacting the grid column size, but
+ will still take the whole available space. */
+ width: 0;
+ min-width: 100%;
+ /* Let the reverse search buttons wrap to the next line */
+ flex-wrap: wrap;
+ justify-content: end;
+}
+
+.sidebar {
+ display: grid;
+ grid-area: sidebar;
+ grid-template-rows: subgrid;
+ border-inline-start: 1px solid var(--theme-splitter-color);
+ background-color: var(--theme-sidebar-background);
+ width: 200px;
+ min-width: 150px;
+ max-width: 100%;
+}
+
+.sidebar-resizer {
+ grid-row: 1 / -1;
+ grid-column: -1 / -2;
+}
+
+.webconsole-sidebar-toolbar {
+ grid-row: 1 / 2;
+ min-height: 100%;
+ display: flex;
+ justify-content: end;
+ margin: 0;
+ padding: 0;
+}
+
+.sidebar-contents {
+ grid-row: 2 / -1;
+ overflow: auto;
+ direction: ltr;
+}
+
+.webconsole-sidebar-toolbar .sidebar-close-button {
+ margin: 0;
+}
+
+.sidebar-close-button::before {
+ background-image: url("chrome://devtools/skin/images/close.svg");
+}
+
+.sidebar-contents .object-inspector {
+ min-width: 100%;
+}
+
+/** EDITOR MODE */
+.webconsole-app.jsterm-editor {
+ display: grid;
+ /*
+ * Here's the design we want in editor mode
+ * +-----------------------------------------------------------------------+
+ * | [ChromeDebugToolbar] |
+ * +-----------------------------------------------------------------------+
+ * | [Notification Box (self XSS warning)] |
+ * +--------------------------+--------------------------+-----------------+
+ * | Editor Toolbar ↔ Filter bar primary ↔ |
+ * +--------------------------↔--------------------------↔ |
+ * | ↔ [Filter bar secondary] ↔ |
+ * | ↔--------------------------↔ |
+ * | ↔ ↔ |
+ * | Editor ↔ output ↔ [sidebar] |
+ * | ↔ ↔ |
+ * | ↔ ↔ |
+ * | ↔ ↔ |
+ * | ↔ ↔ |
+ * +--------------------------↔ ↔ |
+ * | [Eager evaluation] ↔ ↔ |
+ * +--------------------------↔ ↔ |
+ * | [Eval Notification] ↔ ↔ |
+ * +--------------------------↔ ↔ |
+ * | [Reverse search input] ↔ ↔ |
+ * +-----------------------------------------------------+-----------------+
+ *
+ * - ↔ are width resizers
+ * - Elements inside brackets may not be visible, so we set
+ * rows/columns to "auto" to make them collapse when the element
+ * they contain is hidden.
+ */
+ grid-template-areas: "chrome-debug-toolbar chrome-debug-toolbar chrome-debug-toolbar"
+ "notification notification notification"
+ "editor-toolbar filter-toolbar sidebar"
+ "editor filter-toolbar-secondary sidebar"
+ "editor output sidebar"
+ "eager-evaluation output sidebar"
+ "eval-notification output sidebar"
+ "reverse-search output sidebar";
+ grid-template-rows:
+ auto
+ auto
+ var(--primary-toolbar-height)
+ auto
+ 1fr
+ auto
+ auto
+ auto;
+ grid-template-columns: minmax(150px, auto) minmax(200px, 1fr) minmax(0, auto);
+}
+
+.jsterm-editor .flexible-output-input {
+ /* This allow us to place the div children (jsterm, output, notification) on the grid */
+ display: contents;
+}
+
+.jsterm-editor .webconsole-editor-toolbar {
+ grid-area: editor-toolbar;
+ border-inline-end: 1px solid var(--theme-splitter-color);
+ display: grid;
+ align-items: center;
+ /*
+ * The following elements are going to be present in the toolbar:
+ * - The run button
+ * - The evaluation selector button
+ * - The pretty print button
+ * - A separator
+ * - The history nav
+ * - A separator
+ * - The close button
+ *
+ * +-------------------------------------------+
+ * | ▶︎ Run Top↕ {} | ˄ ˅ 🔍 | ✕ |
+ * +-------------------------------------------+
+ *
+ */
+ grid-template-columns: auto auto 1fr auto auto auto auto auto auto auto;
+ height: unset;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-executeButton {
+ padding-inline: 4px 8px;
+ height: 20px;
+ margin-inline-start: 5px;
+ display: flex;
+ align-items: center;
+}
+
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-executeButton::before {
+ content: url("chrome://devtools/skin/images/webconsole/run.svg");
+ height: 16px;
+ width: 16px;
+ -moz-context-properties: fill;
+ fill: currentColor;
+ margin-inline-end: 2px;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-prettyPrintButton {
+ grid-column: -7 / -8;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-prettyPrintSeparator {
+ grid-column: -6 / -7;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-history-prevExpressionButton {
+ grid-column: -5 / -6;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-history-nextExpressionButton {
+ grid-column: -4 / -5;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-reverseSearchButton {
+ grid-column: -3 / -4;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-historyNavSeparator {
+ grid-column: -2 / -3;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-closeButton {
+ grid-column: -1 / -2;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-prettyPrintButton::before {
+ mask-image: url("chrome://devtools/content/debugger/images/prettyPrint.svg");
+ background-size: 16px;
+ background-color: var(--theme-icon-color);
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-history-prevExpressionButton::before {
+ background-image: url("chrome://devtools/skin/images/arrowhead-up.svg");
+ background-size: 16px;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-history-nextExpressionButton::before {
+ background-image: url("chrome://devtools/skin/images/arrowhead-down.svg");
+ background-size: 16px;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-reverseSearchButton::before {
+ background-image: url("chrome://devtools/skin/images/webconsole/reverse-search.svg");
+ background-size: 14px;
+}
+
+.jsterm-editor .webconsole-editor-toolbar .webconsole-editor-toolbar-closeButton::before {
+ background-image: url("chrome://devtools/skin/images/close.svg");
+}
+
+.jsterm-editor .webconsole-input-openEditorButton {
+ display: none;
+}
+
+.jsterm-editor .webconsole-output {
+ grid-area: output;
+}
+
+.jsterm-editor .jsterm-input-container {
+ grid-area: editor;
+ width: 30vw;
+ /* Don't allow the input to be narrower than the grid-column it's in */
+ min-width: 100%;
+ border-top: none;
+ border-inline-end: 1px solid var(--theme-splitter-color);
+ padding: 0;
+ /* Needed as we might have the onboarding UI displayed */
+ display: flex;
+ flex-direction: column;
+ background-color: var(--theme-sidebar-background);
+}
+
+.jsterm-editor #webconsole-notificationbox {
+ grid-area: notification;
+}
+
+.jsterm-editor .jsterm-input-container > .CodeMirror {
+ flex: 1;
+ padding-inline-start: 0;
+ font-size: var(--theme-code-font-size);
+ line-height: var(--theme-code-line-height);
+ background-image: none;
+}
+
+.jsterm-editor .eager-evaluation-result {
+ grid-area: eager-evaluation;
+ /* The next 2 lines make it so the element isn't impacting the grid column size, but
+ will still take the whole available space. */
+ min-width: 100%;
+ width: 0;
+}
+
+.evaluation-notification {
+ grid-area: eval-notification;
+ /* The next 2 lines make it so the element isn't impacting the grid column size, but
+ will still take the whole available space. */
+ min-width: 100%;
+ width: 0;
+ border: 1px solid;
+ display: flex;
+ padding: 0.5em;
+}
+
+.jsterm-editor .editor-resizer {
+ grid-column: editor;
+ /* We want the splitter to cover the whole column (minus self-xss message) */
+ grid-row: editor / reverse-search;
+}
+
+.editor-onboarding {
+ display: none;
+}
+
+.jsterm-editor .editor-onboarding {
+ display: grid;
+ /**
+ * Here's the design we want:
+ * ┌──────┬────────────────────────┐
+ * │ Icon │ Onboarding text │
+ * ├──────┼────────────────────────┤
+ * │ │ Got it!│
+ * └──────┴────────────────────────┘
+ **/
+ grid-template-columns: 22px 1fr;
+ border-bottom: 1px solid var(--theme-splitter-color);
+ padding: 8px 16px;
+ background-color: var(--theme-body-alternate-emphasized-background);
+ grid-gap: 0 14px;
+ font-family: system-ui, -apple-system, sans-serif;
+ font-size: 12px;
+ line-height: 1.5;
+}
+
+.editor-onboarding-fox {
+ width: 22px;
+ height: 22px;
+ align-self: center;
+}
+
+.jsterm-editor .editor-onboarding p {
+ padding: 0;
+ margin: 0;
+}
+
+.jsterm-editor .editor-onboarding .editor-onboarding-shortcut {
+ font-weight: bold;
+}
+
+.editor-onboarding-dismiss-button {
+ grid-row: 2 / 3;
+ grid-column: 2 / 3;
+ justify-self: end;
+ padding: 2px;
+ background: transparent;
+ border: none;
+ color: var(--theme-link-color);
+ font-family: inherit;
+ cursor: pointer;
+ font-size: inherit;
+}