summaryrefslogtreecommitdiffstats
path: root/devtools/client/themes/webconsole.css
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/themes/webconsole.css')
-rw-r--r--devtools/client/themes/webconsole.css1022
1 files changed, 1022 insertions, 0 deletions
diff --git a/devtools/client/themes/webconsole.css b/devtools/client/themes/webconsole.css
new file mode 100644
index 0000000000..87a40226e5
--- /dev/null
+++ b/devtools/client/themes/webconsole.css
@@ -0,0 +1,1022 @@
+/* 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/. */
+
+/* Webconsole specific theme variables */
+:root {
+ /* Minimum height of a message (excluding borders) */
+ --console-row-height: 20px;
+ /* We need a unitless line-height to render formatted messages correctly.
+ * Target line-height computed value is 14px, for a 11px font-size. */
+ --console-output-line-height: calc(14 / 11);
+ --console-output-vertical-padding: 3px;
+ /* Additional vertical padding used on the JSTerm and EagerEvaluation
+ * containers. Set to 0 to make the messages and input seamless. */
+ --console-input-extra-padding: 2px;
+ /* Width of the left gutter where icons appear */
+ --console-inline-start-gutter: 32px;
+ /* Icons perfectly centered in the left gutter "feel" closer to the window
+ * edge than to message text. This value pushes them slightly to the right. */
+ --console-icon-horizontal-offset: 1px;
+ --console-warning-background: var(--theme-warning-background);
+ --console-warning-border: var(--theme-warning-border);
+ --console-warning-color: var(--theme-warning-color);
+}
+
+.theme-dark {
+ --console-input-background: var(--theme-tab-toolbar-background);
+ --console-message-background: var(--theme-body-background);
+ --console-message-border: var(--theme-splitter-color);
+ --console-message-color: var(--theme-text-color-strong);
+ --console-error-background: hsl(345, 23%, 24%);
+ --console-error-border: hsl(345, 30%, 35%);
+ --console-error-color: var(--red-20);
+ --console-navigation-color: var(--theme-highlight-blue);
+ --console-navigation-border: var(--blue-60);
+ --console-indent-border-color: var(--theme-highlight-blue);
+ --console-repeat-bubble-background: var(--blue-60);
+
+ /* TODO in bug 1549195: colors used in shared components (e.g. Reps) should
+ be renamed and/or moved to variables.css so they work everywhere */
+ --error-color: var(--red-20);
+ --console-output-color: white;
+}
+
+.theme-light {
+ --console-input-background: var(--theme-body-background);
+ --console-message-background: var(--theme-body-background);
+ --console-message-border: #f2f2f4; /* between Grey 10 and Grey 20 */
+ --console-message-color: var(--theme-text-color-strong);
+ --console-error-background: hsl(344, 73%, 97%);
+ --console-error-border: rgba(215, 0, 34, 0.12); /* Red 60 + opacity */
+ --console-error-color: var(--red-70);
+ --console-navigation-color: var(--theme-highlight-blue);
+ --console-navigation-border: var(--blue-30);
+ --console-indent-border-color: var(--theme-highlight-blue);
+ --console-repeat-bubble-background: var(--theme-highlight-blue);
+
+ /* TODO in bug 1549195: colors used in shared components (e.g. Reps) should
+ be renamed and/or moved to variables.css so they work everywhere */
+ --error-color: var(--red-70);
+ --console-output-color: var(--grey-90);
+}
+
+/* General output styles */
+
+* {
+ box-sizing: border-box;
+}
+
+/*
+ * Stack messages on the z axis so that we can make their borders overlap
+ * and show color borders on top:
+ *
+ * ----------------- <-- Red
+ * Error message
+ * ----------------- <-- Red
+ * Normal message
+ * ----------------- <-- Grey
+ *
+ * and:
+ *
+ * ----------------- <-- Grey
+ * Normal message
+ * ----------------- <-- Red
+ * Error message
+ * ----------------- <-- Red
+ *
+ * The exact stacking order is:
+ *
+ * - z-index: 3 = Navigation
+ * - z-index: 2 = Errors and warnings
+ * - z-index: 1 = Other (console.log, console.info, requests, etc.)
+ */
+.message {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ width: 100%;
+ /* Make the top border cover the previous message's bottom border */
+ margin-top: -1px;
+ /* Min height is the target row height plus borders */
+ min-height: calc(var(--console-row-height) + 2px);
+ border-top: 1px solid var(--console-message-border);
+ border-bottom: 1px solid var(--console-message-border);
+ /* Avoid vertical padding, so that we can draw full-height items (e.g. indent guides).
+ * Use vertical margins of --console-output-vertical-padding on children instead. */
+ padding-block: 0;
+ /* Layout of the 32px-wide left gutter:
+ * | 4px message padding | 24px icon container | 4px icon margin |
+ * Note: on hover we show a 3px pseudo-border on top of the left padding. */
+ padding-inline-start: 4px;
+ padding-inline-end: 8px;
+ font-size: var(--theme-code-font-size);
+ line-height: var(--console-output-line-height);
+ color: var(--console-message-color);
+ background-color: var(--console-message-background);
+}
+
+@media (min-width: 1000px) {
+ .message {
+ padding-inline-end: 12px;
+ }
+}
+
+/* Always hide the border of the first message, but keep its spacing */
+.message:first-child {
+ border-top-color: transparent !important;
+}
+
+/* We already paint a top border on jsterm-input-container (and we need to keep
+ * it when scrolling console content), so remove the last item's border. (NOTE:
+ * the last element is actually the second-to-last element when the output is
+ * scrolled all the way down, because we include an empty buffer div which
+ * grows to simulate the height of unrendered content.) */
+ .webconsole-app:not(.jsterm-editor) .message:nth-last-child(2) {
+ border-bottom-width: 0;
+ /* Adjust the min-height since we now only have a single border. */
+ min-height: calc(var(--console-row-height) + 1px);
+}
+
+/*
+ * By default, prevent any element in message to overflow.
+ * We exclude network messages as it may cause issues in the network detail panel.
+ * This makes console reflows faster (See Bug 1487457).
+ */
+.message:not(.network) * {
+ overflow: hidden;
+}
+
+.message.disabled {
+ z-index: 2;
+ opacity: 0.6;
+}
+
+.message.error {
+ z-index: 2;
+ color: var(--console-error-color);
+ border-color: var(--console-error-border);
+ background-color: var(--console-error-background);
+}
+
+.message.warn {
+ z-index: 2;
+ color: var(--console-warning-color);
+ border-color: var(--console-warning-border);
+ background-color: var(--console-warning-background);
+}
+
+.message.navigationMarker {
+ z-index: 3;
+ color: var(--console-navigation-color);
+ border-color: var(--console-navigation-border);
+}
+
+.message.startGroup,
+.message.startGroupCollapsed {
+ --console-indent-border-color: transparent;
+}
+
+/* Hide border between a command and its result */
+.message.command + .result.log {
+ border-top-width: 0;
+}
+
+.message > .prefix,
+.message > .timestamp {
+ flex: none;
+ color: var(--theme-comment);
+ margin: var(--console-output-vertical-padding) 4px;
+}
+
+/* Use a container query as the inline-size of the output might vary when the console is in editor mode */
+@container console-output (width < 500px) {
+ /*
+ * When we export messages, we mount the app as a sibling of the #app-wrapper element,
+ * in a 0-width section which would cause the timestamp to be hidden, so only hide
+ * the timestamp in the "visible" element.
+ */
+ #app-wrapper .message > .timestamp {
+ display: none;
+ }
+
+ /**
+ * This element might have:
+ * - the message body
+ * - the repeat bubble
+ * - the location
+ *
+ * What we want here is to display the location one its own line, at the bottom of the
+ * element:
+ * +----------------------------+
+ * | Message body | [repeat] |
+ * +----------------------------+
+ * | location |
+ * +----------------------------+
+ */
+ .message:not(.message-did-catch) .message-flex-body:not(.error-note) {
+ display: grid;
+ grid-template-columns: 1fr auto;
+ row-gap: 8px;
+ }
+
+ .message-flex-body .message-location {
+ max-width: 100%;
+ grid-column: 1 / -1;
+ grid-row: 2;
+ justify-self: end;
+ }
+}
+
+.message > .indent {
+ flex: none;
+ display: inline-block;
+ /* Display indent borders above the message's top and bottom border.
+ * This avoids interrupted indent lines (looking like dashes). */
+ margin-block: -1px;
+ margin-inline-start: 12px;
+ border-inline-end: solid 1px var(--console-indent-border-color);
+}
+
+.message > .indent.warning-indent {
+ border-inline-end-color: var(--console-warning-color);
+ /* Align the border of the message in warning groups with the toggle icon */
+ margin-inline-start: 15px;
+}
+
+/* Center first level indent within the left gutter */
+.message[data-indent="1"]:not(.startGroup, .startGroupCollapsed) > .indent,
+.warning-indent {
+ margin-inline-start: calc(1px + var(--console-icon-horizontal-offset));
+ margin-inline-end: calc(11px - var(--console-icon-horizontal-offset));
+}
+
+.message > .icon {
+ flex: none;
+ align-self: flex-start;
+ /* Width and height must be a multiples of 2px to avoid blurry images.
+ * Height should match the text's line-height for optimal vertical alignment */
+ width: 14px;
+ height: 14px;
+ margin: var(--console-output-vertical-padding) 4px;
+ background-image: none;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: 12px;
+ -moz-context-properties: fill;
+ fill: currentColor;
+}
+
+/* Icon on unindented row should be centered within the left gutter */
+.message[data-indent="0"] + .icon {
+ width: 24px;
+ margin-inline-start: var(--console-icon-horizontal-offset);
+ margin-inline-end: calc(4px - var(--console-icon-horizontal-offset));
+}
+
+.message.command > .icon {
+ color: var(--theme-icon-color);
+ background-image: url(chrome://devtools/skin/images/webconsole/input.svg);
+}
+
+.message.result > .icon {
+ color: var(--theme-icon-dimmed-color);
+ background-image: url(chrome://devtools/skin/images/webconsole/return.svg);
+}
+
+.message.info > .icon {
+ color: var(--theme-icon-color);
+ background-image: url(chrome://devtools/skin/images/info-small.svg);
+}
+
+.message.disabled > .icon {
+ color: var(--theme-icon-color);
+ background-image: url(chrome://devtools/skin/images/info-small.svg);
+}
+
+.message.error > .icon {
+ color: var(--theme-icon-error-color);
+ background-image: url(chrome://devtools/skin/images/error-small.svg);
+}
+
+.message.warn > .icon {
+ color: var(--theme-icon-warning-color);
+ background-image: url(chrome://devtools/skin/images/alert-small.svg);
+}
+
+.message.navigationMarker > .icon {
+ color: var(--console-navigation-color);
+ background-image: url(chrome://devtools/skin/images/webconsole/navigation.svg);
+}
+
+.message > .icon.logpoint {
+ background-image: url(chrome://devtools/content/debugger/images/webconsole-logpoint.svg);
+ -moz-context-properties: fill, stroke;
+ fill: var(--theme-graphs-purple);
+ stroke: var(--theme-graphs-purple);
+}
+
+.message > .icon.logtrace {
+ background-image: url(chrome://devtools/content/debugger/images/trace.svg);
+ -moz-context-properties: fill, stroke;
+ fill: var(--theme-icon-checked-color);
+}
+
+.message.network-message-blocked > .icon {
+ color: var(--theme-icon-error-color);
+ background-image: url(chrome://devtools/skin/images/blocked.svg);
+}
+
+.message > .message-body-wrapper {
+ flex: auto;
+ min-width: 0px;
+ margin: var(--console-output-vertical-padding) 0;
+}
+
+.message-body-wrapper .elements-label {
+ color: var(--location-color);
+ margin: calc(var(--console-output-vertical-padding) * 2) 0;
+}
+
+/* The bubble that shows the number of times a message is repeated */
+.message-repeats,
+.warning-group-badge {
+ display: inline-block;
+ flex-shrink: 0;
+ margin: 2px 5px 0 5px;
+ padding: 0 6px;
+ height: 1.25em;
+ border-radius: 40px;
+ font: message-box;
+ font-size: 0.8em;
+ font-weight: normal;
+}
+
+.message-repeats {
+ color: white;
+ background-color: var(--console-repeat-bubble-background);
+}
+
+.warning-group-badge {
+ color: var(--console-warning-background);
+ background-color: var(--console-warning-color);
+}
+
+.message-location {
+ max-width: 40%;
+ flex-shrink: 0;
+ color: var(--frame-link-source);
+ margin-left: 1ch;
+ /* Makes the file name truncated (and ellipsis shown) on the left side */
+ direction: rtl;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ text-align: end;
+}
+
+.message-location:empty {
+ display: none;
+}
+
+.message-location .frame-link-source {
+ font-style: normal !important;
+ /* Enforce LTR direction for the file name - fixes bug 1290056 */
+ direction: ltr;
+ unicode-bidi: embed;
+}
+
+.message-location .frame-link-source:visited {
+ color: currentColor;
+}
+
+.message-flex-body {
+ display: flex;
+}
+
+.message-body {
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+.message-flex-body > .message-body {
+ display: block;
+ flex: 1;
+}
+
+/* Network styles */
+.webconsole-app .message.network.network-message-blocked .method,
+.webconsole-app .message.network.network-message-blocked .message-flex-body .message-body .url,
+.webconsole-app .message.network.network-message-blocked .status {
+ color: var(--timing-blocked-color);
+}
+
+.webconsole-app .message.network .method {
+ flex: none;
+ margin-inline-end: 1ch;
+}
+
+.webconsole-app .message.network .xhr {
+ background-color: var(--theme-comment);
+ color: white;
+ border-radius: 2px;
+ font-size: 10px;
+ padding: 1px 2px;
+ margin-inline-start: 0;
+ margin-inline-end: 1ex;
+}
+
+.webconsole-app .message.network .message-flex-body .message-body .url {
+ color: var(--theme-comment);
+ font-style: inherit;
+}
+
+.webconsole-app .message.network .status {
+ color: var(--theme-highlight-blue);
+ font-style: inherit;
+}
+
+.webconsole-app .message.network .network-monitor .empty-notice {
+ font-size: 16px;
+}
+
+/* For 4XX and 5XX requests, display the text in the "error" color */
+.webconsole-app .message.network.error .message-flex-body .message-body .url,
+.webconsole-app .message.network.error .message-flex-body .message-body .status {
+ color: currentColor;
+}
+
+.network.message .network-info {
+ display: none;
+ margin-block: 6px 2px;
+ border: solid 1px var(--theme-splitter-color);
+}
+
+.network.message.open .network-info {
+ display: block;
+}
+
+:root:dir(rtl) .network.message.open .network-info {
+ direction: rtl;
+}
+
+.network.message .network-info .panels {
+ min-height: 250px;
+}
+/* Response panel needs an absolute height size as the
+ * sizing of its content depends on it, it also needs override
+ * the inline height set on the panels */
+.network.message .network-info #response-panel {
+ height: 250px !important;
+}
+
+.network.message .network-info .accordion-item:last-child .accordion-content {
+ position: static;
+}
+
+.network .message-flex-body > .message-body {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+}
+
+.message.network > .message-body {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.message.network .url {
+ flex: 1 1 auto;
+ /* Make sure the URL is very small initially, let flex change width as needed. */
+ width: 100px;
+ min-width: 5em;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ cursor: default;
+}
+
+.message.network .message-body .status {
+ flex: none;
+ margin-left: 1ch;
+ cursor: default;
+}
+
+.message.network.mixed-content .url {
+ color: var(--theme-highlight-red);
+ cursor: default;
+}
+
+.message .learn-more-link {
+ user-select: none;
+ color: var(--theme-highlight-blue);
+ margin: 0 1ch;
+}
+
+/* Hide the headers panel toolbar buttons in the console */
+.message.network .headers-panel-container :is(#block-button, #edit-resend-button, .devtools-separator) {
+ display: none;
+}
+
+/* Override the `postion:absolute` set on the `.panel-container`, this is only needed in the
+netmonitor to enable the use of top, right, bottom etc to support content scrolling.
+See https://searchfox.org/mozilla-central/rev/7bafa9b9c2156018ec1d410194f9bf4b5b23e77f
+/devtools/client/netmonitor/src/assets/styles/HeadersPanel.css#17-24.
+The webconsole does not need that as the `.webconsole-output` is already scrollable */
+.message.network .headers-panel-container .panel-container {
+ position: static;
+}
+
+/* JSTerm Styles */
+html #webconsole-notificationbox {
+ flex: 0;
+ width: 100%;
+}
+
+.webconsole-output:empty ~ .notificationbox .notification {
+ border-top-width: 0;
+ border-bottom-width: 1px;
+}
+
+.jsterm-input-container {
+ position: relative;
+ max-width: 100%;
+ background-color: var(--console-input-background);
+ font-family: var(--monospace-font-family);
+ font-size: var(--theme-code-font-size);
+ line-height: var(--console-output-line-height);
+}
+
+/* CodeMirror-powered JsTerm */
+.jsterm-input-container > .CodeMirror {
+ /* aim for a 32px left space (a descendent has 4px padding) */
+ padding-inline-start: calc(var(--console-inline-start-gutter) - 4px);
+ /* Create a new stacking context */
+ position: relative;
+ z-index: 0; /* Keep below column resizers */
+ /* input icon */
+ background-image: url(chrome://devtools/skin/images/webconsole/input.svg);
+ background-position-x: calc(10px + var(--console-icon-horizontal-offset));
+ background-position-y: 4px;
+ background-repeat: no-repeat;
+ background-size: 12px 12px;
+ -moz-context-properties: fill;
+ fill: var(--theme-icon-dimmed-color);
+}
+
+.jsterm-input-container > .CodeMirror-focused {
+ fill: var(--theme-icon-checked-color);
+}
+
+.jsterm-input-container .CodeMirror-lines {
+ padding-block: var(--console-output-vertical-padding);
+}
+
+.webconsole-app .cm-auto-complete-shadow-text::after {
+ content: attr(data-completion);
+ color: var(--theme-comment);
+ /* This is important for the completion text not to move while the user is typing */
+ /* See Bugs 1491776 & 1558248 */
+ position: absolute;
+}
+
+.jsterm-input-container .CodeMirror-hscrollbar {
+ /* We never want to see the horizontal scrollbar */
+ display: none !important;
+}
+
+.stacktrace {
+ display: none;
+ overflow-y: auto;
+ margin-block-start: 5px;
+ margin-block-end: var(--attachment-margin-block-end);
+ padding-inline-start: 16px;
+}
+
+.message.open .stacktrace:not(:empty) {
+ display: block;
+}
+
+.objectBox-stackTrace .frames {
+ padding-inline-start: 16px;
+}
+
+.cm-s-mozilla a[class] {
+ font-style: italic;
+ text-decoration: underline;
+ text-decoration-skip-ink: none;
+}
+
+a.learn-more-link.webconsole-learn-more-link {
+ font-style: normal;
+}
+
+/*
+ This element contains the different toolbars in the console
+ - primary, containing the clear messages button and the text search input, and a
+ checkbox (Persist logs or Show Content Messages).
+ It can expand as much as it needs.
+ - close button, close the split console panel. This button will always be displayed on
+ righ-top of the toolbar.
+ - secondary, containing the filter buttons (Error, Warning, …). It's placed inside the
+ primary toolbar if there's enought space.
+
+ We have 2 different layout:
+
+ Narrow:
+
+ --------------------------------------------------------------
+ | 🗑 - Filter Input | ✕ |
+ --------------------------------------------------------------
+ | Error - Warning - Log - Info - Debug - CSS - Network - XHR |
+ --------------------------------------------------------------
+
+ And wide:
+
+ --------------------------------------------------------------------------------------
+ | 🗑 - Filter Input | Error - Warning - Log - Info - Debug - CSS - Network - XHR | ✕ |
+ --------------------------------------------------------------------------------------
+*/
+.webconsole-filteringbar-wrapper {
+ display: grid;
+ grid-template-columns: 1fr auto;
+ --primary-toolbar-height: 29px;
+}
+
+.webconsole-filteringbar-wrapper .devtools-toolbar {
+ background-color: var(--theme-body-background);
+}
+
+.webconsole-filterbar-primary {
+ display: flex;
+ /* We want the toolbar (which contain the text search input) to fit
+ the content, we don't allow to shrink/overlap it */
+ flex: 100 0 -moz-fit-content;
+ align-items: center;
+ min-height: var(--primary-toolbar-height);
+}
+
+.devtools-toolbar.webconsole-filterbar-secondary {
+ display: flex;
+ align-items: center;
+ align-self: stretch;
+ user-select: none;
+ grid-column: 1 / -1;
+ min-height: var(--primary-toolbar-height);
+}
+
+.devtools-toolbar.webconsole-filterbar-secondary .devtools-separator {
+ margin-inline: 5px;
+}
+
+.webconsole-filterbar-primary .devtools-togglebutton {
+ font-variant-numeric: tabular-nums;
+}
+
+.split-console-close-button-wrapper {
+ min-height: var(--primary-toolbar-height);
+ /* We will need to display the close button in the right-top always. */
+ grid-column: -1 / -2;
+ grid-row: 1 / 2;
+ padding-inline-end: 0;
+}
+
+/* On OSX the cursor turns into a window-resizing cursor at the edges of the
+ * window, so bring the end of the close button in. */
+:root[platform="mac"] .split-console-close-button-wrapper,
+:root[platform="mac"] .webconsole-sidebar-toolbar {
+ padding-inline-end: 2px;
+}
+
+#split-console-close-button {
+ height: 100%;
+ margin: 0;
+}
+
+#split-console-close-button::before {
+ background-image: url(chrome://devtools/skin/images/close.svg);
+}
+
+.webconsole-filterbar-primary .devtools-searchbox {
+ align-self: stretch;
+ /* Prevent the filter height from devtools-searchbox */
+ height: unset;
+ flex: 1 1 100%;
+ margin-inline-start: 1px;
+ /* It's important to keep this in px as it's used in JS to control the display mode
+ * of the filter toolbar. */
+ min-width: 150px;
+}
+
+.webconsole-filterbar-primary .filter-checkbox {
+ flex-shrink: 0;
+ margin: 0 3px;
+ display: flex;
+ align-items: center;
+ user-select: none;
+}
+
+.webconsole-filterbar-filtered-messages {
+ /* Needed so the bar takes the whole horizontal space when it is wrapped */
+ flex-grow: 1;
+ justify-content: flex-end;
+ color: var(--theme-comment);
+ text-align: end;
+ align-items: center;
+ min-height: var(--primary-toolbar-height);
+ line-height: var(--primary-toolbar-height);
+}
+
+@media (max-width: 965px) {
+ /* This media query will make filtered message element to be displayed in new
+ line. This width is based on greek localized size since it is longer than
+ other localized strings. */
+ .webconsole-filterbar-filtered-messages {
+ grid-row: 2 / 3;
+ grid-column: 1 / -1;
+ justify-self: stretch;
+ }
+}
+
+.webconsole-filterbar-filtered-messages .filter-message-text {
+ font-style: italic;
+ user-select: none;
+}
+
+.webconsole-filterbar-filtered-messages .reset-filters-button {
+ margin-inline-start: 0.5em;
+}
+
+/* Special casing String reps, and warning/error string colors
+ * so they are legible */
+.message .message-body > .objectBox-string,
+.message.error .objectBox-string,
+.message.warn .objectBox-string {
+ color: inherit;
+}
+
+/* Special casing dark-theme error and warning ObjectInspector colors */
+.theme-dark .message.error .tree.object-inspector .object-label,
+.theme-dark .message.error .tree.object-inspector .object-label *,
+.theme-dark .message.warn .tree.object-inspector .object-label,
+.theme-dark .message.warn .tree.object-inspector .object-label *,
+.theme-dark .message.error .objectLeftBrace,
+.theme-dark .message.error .objectRightBrace,
+.theme-dark .message.error .arrayLeftBracket,
+.theme-dark .message.error .arrayRightBracket,
+.theme-dark .message.warn .objectLeftBrace,
+.theme-dark .message.warn .objectRightBrace,
+.theme-dark .message.warn .arrayLeftBracket,
+.theme-dark .message.warn .arrayRightBracket {
+ color: var(--theme-body-color);
+}
+.theme-dark .message.error .tree.object-inspector,
+.theme-dark .message.warn .tree.object-inspector {
+ --console-indent-border-color: var(--theme-body-color);
+}
+
+.webconsole-app .message-flex-body > .message-body {
+ overflow: hidden;
+}
+
+.webconsole-app .message-body > * {
+ flex-shrink: 0;
+ vertical-align: top;
+}
+
+.message.startGroup .message-body > .objectBox-string,
+.message.startGroupCollapsed .message-body > .objectBox-string {
+ color: var(--theme-body-color);
+ font-weight: bold;
+}
+
+/* Prefix text that can be set by ConsoleAPI option */
+.webconsole-app .console-message-prefix {
+ color: var(--theme-comment);
+}
+
+
+/* console.table() */
+.message .consoletable-wrapper {
+ --consoletable-border: var(--theme-splitter-color);
+
+ max-height: 250px;
+ overflow: auto;
+ position: relative;
+ border-width: 1px 0 0 1px;
+ padding: 0;
+ margin-block-end: var(--attachment-margin-block-end);
+ border: 1px solid var(--consoletable-border);
+}
+
+.message .consoletable {
+ width: 100%;
+ margin: 0;
+ color: var(--theme-body-color);
+ border-spacing: 0;
+}
+
+.consoletable :is(th, td) {
+ border: 0 solid var(--consoletable-border);
+ text-overflow: ellipsis;
+}
+
+.consoletable :is(th, td) + :is(th, td) {
+ border-inline-start-width: 1px;
+}
+
+.consoletable th {
+ position: sticky;
+ top: 0;
+ background-color: var(--theme-toolbar-background);
+ color: var(--theme-body-color);
+ border-block-end-width: 1px;
+ margin: 0;
+ padding: 5px 4px;
+ font-weight: inherit;
+}
+
+.consoletable td {
+ background-color: var(--theme-body-background);
+ color: var(--theme-body-color);
+ padding: 3px 4px;
+ font-variant-numeric: tabular-nums;
+}
+
+
+.consoletable tr:nth-child(even) td {
+ background-color: var(--table-zebra-background);
+}
+
+/* Simple Table */
+.message .simple-table {
+ width: 100%;
+ border-collapse: collapse;
+ --simpletable-border: var(--theme-splitter-color);
+ margin-block-end: var(--attachment-margin-block-end);
+ color: var(--theme-body-color);
+ text-align: left;
+ max-height: 250px;
+ overflow-y: auto;
+ border: 1px solid var(--simpletable-border);
+ table-layout: fixed;
+ margin-top: 3px;
+}
+
+.simple-table-header {
+ background-color: var(--theme-toolbar-background);
+ text-overflow: ellipsis;
+ border-bottom: 1px solid var(--simpletable-border);
+}
+
+.simple-table-header > th {
+ padding: 5px 4px;
+ font-weight: inherit;
+}
+
+.simple-table-header > th:nth-child(odd) {
+ width: 10%;
+}
+
+.simple-table td {
+ padding: 3px 4px;
+ text-overflow: ellipsis;
+ border-left: 1px solid var(--simpletable-border);
+}
+
+.simple-table td:nth-child(2n) span {
+ color: var(--theme-body-color);
+}
+
+.simple-table tr:nth-child(even) {
+ background-color: var(--table-zebra-background);
+}
+
+/* Object Inspector */
+.webconsole-app .object-inspector.tree {
+ display: inline-block;
+ max-width: 100%;
+}
+
+.webconsole-app .object-inspector.tree .tree-indent {
+ border-inline-start-color: var(--console-indent-border-color);
+}
+
+.webconsole-app .object-inspector.tree .tree-node:hover:not(.focused) {
+ background-color: var(--object-inspector-hover-background);
+}
+
+/*
+ * Make console.group, exception and XHR message's arrow look the same as the arrow
+ * used in the ObjectInspector (same background-image, width, transition).
+ * Properties were copied from devtools/client/shared/components/reps/reps.css.
+ */
+.collapse-button {
+ flex: none;
+ align-self: flex-start;
+ margin-block-start: calc(var(--console-output-vertical-padding) - 1px);
+ margin-inline-start: -4px;
+ padding: 3px;
+ border: none;
+ color: var(--theme-icon-dimmed-color);
+ background: transparent;
+}
+
+.collapse-button::before {
+ content: "";
+ display: block;
+ width: 10px;
+ height: 10px;
+ background: url("chrome://devtools/skin/images/arrow.svg") no-repeat center;
+ background-size: 10px;
+ transform: rotate(-90deg);
+ transition: transform 125ms ease;
+ -moz-context-properties: fill;
+ fill: currentColor;
+}
+
+/* Align console.group messages with the border they create for their "children" messages */
+.indent ~ .collapse-button {
+ margin-inline-start: 3px;
+}
+
+.collapse-button[aria-expanded="true"]::before {
+ transform: rotate(0);
+}
+
+.collapse-button::-moz-focus-inner {
+ border: none;
+}
+
+/* Hide the icon, so that we can use the collapse-button in its place */
+.message.network:not(:where(.network-message-blocked, .disabled)) > .icon,
+.message.startGroup > .icon,
+.message.startGroupCollapsed > .icon {
+ display: none;
+}
+
+/* Center the collapse button in the left gutter (first-level only) */
+.message.network > .collapse-button,
+.message:is(.startGroup,.startGroupCollapsed)[data-indent="0"] > .collapse-button {
+ width: 24px;
+ margin-inline-start: var(--console-icon-horizontal-offset);
+ margin-inline-end: calc(4px - var(--console-icon-horizontal-offset));
+}
+
+/* Use a bigger arrow that is visually similar to other icons (10px) */
+.message.network > .collapse-button::before,
+.message:is(.startGroup,.startGroupCollapsed)[data-indent="0"] > .collapse-button::before {
+ width: 100%;
+ background-image: url("chrome://devtools/skin/images/arrow-big.svg");
+ fill: var(--theme-icon-dimmed-color);
+}
+
+/* Apply a style similar to collapse-button for the object tree arrows */
+.webconsole-app .tree .arrow,
+.webconsole-app .object-inspector .tree-node .arrow {
+ width: 10px;
+ height: 10px;
+ background: url("chrome://devtools/skin/images/arrow.svg") no-repeat center;
+ background-size: 10px;
+ transform: rotate(-90deg);
+ /* Needed for alignment */
+ margin-top: -1px;
+ -moz-context-properties: fill;
+ fill: var(--theme-icon-dimmed-color);
+}
+
+/* In RTL the tree arrows should usually point to the left, but in
+ this context it should point to the right.
+ This overrides the rule from other stylesheets that does the opposite. */
+.webconsole-app .tree .arrow:dir(rtl),
+.webconsole-app .object-inspector .tree-node .arrow:dir(rtl) {
+ transform: rotate(-90deg);
+}
+
+.webconsole-app .tree .arrow.expanded,
+.webconsole-app .object-inspector .tree-node .arrow.expanded {
+ transform: rotate(0deg);
+}
+
+.webconsole-app .tree.focused .arrow,
+.webconsole-app .object-inspector .tree-node.focused .arrow {
+ fill: currentColor;
+}
+
+/** Utils **/
+.clipboard-only {
+ position: absolute;
+ left: -9999px;
+ width: 0;
+ height: 0;
+}
+
+.lazy-message-list-top,
+.lazy-message-list-bottom {
+ overflow-anchor: none;
+ pointer-events: none;
+ user-select: none;
+ padding: 0;
+ margin: 0;
+ border: none;
+}