blob: 5349a4fd4bdb949f16c9ef183cec6dad91010bd2 [file] [log] [blame]
/**
* @license
* Copyright 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {css} from 'lit';
export const grDiffStyles = css`
:host(.disable-context-control-buttons) gr-diff-section tbody.section {
border-right: none;
}
:host {
font-family: var(--monospace-font-family, ''), 'Roboto Mono';
font-size: var(--font-size, var(--font-size-code, 12px));
/* usually 16px = 12px + 4px */
line-height: calc(
var(--font-size, var(--font-size-code, 12px)) + var(--spacing-s, 4px)
);
}
gr-diff-row td.content div.thread-group {
display: block;
max-width: var(--content-width, 80ch);
white-space: normal;
background-color: var(--diff-blank-background-color);
}
gr-diff-element div.diffContainer {
max-width: var(--diff-max-width, none);
font-family: var(--monospace-font-family);
}
gr-diff-element table {
border-collapse: collapse;
table-layout: fixed;
}
gr-diff-row td.lineNum,
gr-diff-row td.blankLineNum {
/* Enforces background whenever lines wrap */
background-color: var(--diff-blank-background-color);
}
/* Provides the option to add side borders (left and right) to the line
number column. */
gr-diff-row td.lineNum,
gr-diff-row td.blankLineNum,
gr-diff-section tr.moveControls td.moveControlsLineNumCol,
gr-context-controls-section tr.contextBackground td.contextLineNum {
box-shadow: var(--line-number-box-shadow, unset);
}
/* Context controls break up the table visually, so we set the right
border on individual sections to leave a gap for the divider.
Also taken into account for max-width calculations in SHRINK_ONLY mode
(check GrDiff.updatePreferenceStyles). */
gr-diff-section tbody.section {
border-right: 1px solid var(--border-color);
}
gr-diff-section tbody.section.contextControl {
/* Divider inside this section must not have border; we set borders on
the padding rows below. */
border-right-width: 0;
}
/* Padding rows behind context controls. The diff is styled to be cut
into two halves by the negative space of the divider on which the
context control buttons are anchored. */
gr-context-controls-section tr.contextBackground {
border-right: 1px solid var(--border-color);
}
gr-context-controls-section tr.contextBackground.above {
border-bottom: 1px solid var(--border-color);
}
gr-context-controls-section tr.contextBackground.below {
border-top: 1px solid var(--border-color);
}
gr-diff-row td.lineNum button.lineNumButton {
display: block;
width: 100%;
height: 100%;
background-color: var(--diff-blank-background-color);
box-shadow: var(--line-number-box-shadow, unset);
}
gr-diff-row td.lineNum {
vertical-align: top;
}
/* The only way to focus this (clicking) will apply our own focus
styling, so this default styling is not needed and distracting. */
gr-diff-row td.lineNum button.lineNumButton:focus {
outline: none;
}
gr-image-viewer {
width: 100%;
height: 100%;
max-width: var(--image-viewer-max-width, 95vw);
max-height: var(--image-viewer-max-height, 90vh);
/* Defined by paper-styles default-theme and used in various
components. background-color-secondary is a compromise between
fairly light in light theme (where we ideally would want
background-color-primary) yet slightly offset against the app
background in dark mode, where drop shadows e.g. around paper-card
are almost invisible. */
--primary-background-color: var(--background-color-secondary);
}
tbody.image-diff .gr-diff {
text-align: center;
}
tbody.image-diff img {
box-shadow: var(--elevation-level-1);
max-width: 50em;
}
tbody.image-diff button.right.lineNumButton {
border-left: 1px solid var(--border-color);
}
tbody.image-diff label {
font-family: var(--font-family);
font-style: italic;
}
gr-diff-element tbody.binary-diff td {
font-family: var(--font-family);
font-style: italic;
text-align: center;
padding: var(--spacing-s) 0;
}
gr-diff-row tr.diff-row {
outline: none;
user-select: none;
}
gr-diff-row
tr.diff-row.target-row.target-side-left
td.lineNum
button.lineNumButton.left,
gr-diff-row
tr.diff-row.target-row.target-side-right
td.lineNum
button.lineNumButton.right,
gr-diff-row tr.diff-row.target-row.unified td.lineNum button.lineNumButton {
color: var(--primary-text-color);
}
/* Preparing selected line cells with position relative so it allows a
positioned overlay with 'position: absolute'. */
gr-diff-row tr.target-row td {
position: relative;
}
/* Defines an overlay to the selected line for drawing an outline without
blocking user interaction (e.g. text selection). */
gr-diff-row tr.target-row td::before {
border-width: 0;
border-style: solid;
border-color: var(--focused-line-outline-color);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
user-select: none;
content: ' ';
}
/* The outline for the selected content cell should be the same in all
cases. */
gr-diff-row tr.target-row.target-side-left td.left.content::before,
gr-diff-row tr.target-row.target-side-right td.right.content::before,
gr-diff-row tr.unified.target-row td.content::before {
border-width: 1px 1px 1px 0;
}
/* The outline for the sign cell should be always be contiguous
top/bottom. */
gr-diff-row tr.target-row.target-side-left td.left.sign::before,
gr-diff-row tr.target-row.target-side-right td.right.sign::before {
border-width: 1px 0;
}
/* For side-by-side we need to select the correct line number to
"visually close" the outline. */
gr-diff-row
tr.side-by-side.target-row.target-side-left
td.left.lineNum::before,
gr-diff-row
tr.side-by-side.target-row.target-side-right
td.right.lineNum::before {
border-width: 1px 0 1px 1px;
}
/* For unified diff we always start the overlay from the left cell. */
gr-diff-row tr.unified.target-row td.left:not(.content)::before {
border-width: 1px 0 1px 1px;
}
/* For unified diff we should continue the top/bottom border in right
line number column. */
gr-diff-row tr.unified.target-row td.right:not(.content)::before {
border-width: 1px 0;
}
gr-diff-row td.content {
background-color: var(--diff-blank-background-color);
}
/* Describes two states of semantic tokens: whenever a token has a
definition that can be navigated to (navigable) and whenever
the token is actually clickable to perform this navigation. */
gr-diff-text .semantic-token.navigable {
text-decoration-style: dotted;
text-decoration-line: underline;
}
gr-diff-text .semantic-token.navigable.clickable {
text-decoration-style: solid;
cursor: pointer;
}
/* The file line, which has no contentText, add some margin before the
first comment. We cannot add padding the container because we only
want it if there is at least one comment thread, and the slotting
makes :empty not work as expected. */
gr-diff-row td.content.file slot:first-child::slotted(.comment-thread) {
display: block;
margin-top: var(--spacing-xs);
}
gr-diff-row td.content div.contentText {
background-color: var(--view-background-color);
}
gr-diff-row td.blank {
background-color: var(--diff-blank-background-color);
}
.image-diff td.content {
background-color: var(--diff-blank-background-color);
}
gr-diff-element table.responsive {
width: 100%;
}
gr-diff-element table.responsive gr-diff-row td.content div.contentText {
white-space: break-spaces;
word-break: break-all;
}
gr-diff-row td.lineNum button.lineNumButton,
td.content {
vertical-align: top;
white-space: pre;
}
.contextLineNum,
gr-diff-row td.lineNum button.lineNumButton {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
color: var(--deemphasized-text-color);
padding: 0 var(--spacing-m);
text-align: right;
}
gr-diff-element div.canComment gr-diff-row td.lineNum button.lineNumButton {
cursor: pointer;
}
gr-diff-row td.sign {
min-width: 1ch;
width: 1ch;
background-color: var(--view-background-color);
}
gr-diff-row td.sign.blank {
background-color: var(--diff-blank-background-color);
}
gr-diff-row td.content {
/* Set min width since setting width on table cells still allows them
to shrink. Do not set max width because CJK
(Chinese-Japanese-Korean) glyphs have variable width. */
min-width: var(--content-width, 80ch);
width: var(--content-width, 80ch);
}
/* If there are no intraline info, consider everything changed */
gr-diff-row td.content.add div.contentText .intraline,
gr-diff-row td.content.add.no-intraline-info div.contentText,
gr-diff-row td.sign.add.no-intraline-info,
gr-diff-section tbody.delta.total gr-diff-row td.content.add div.contentText {
background-color: var(--dark-add-highlight-color);
}
gr-diff-row td.content.add div.contentText,
gr-diff-row td.sign.add {
background-color: var(--light-add-highlight-color);
}
/* If there are no intraline info, consider everything changed */
gr-diff-row td.content.remove div.contentText .intraline,
gr-diff-row td.content.remove.no-intraline-info div.contentText,
gr-diff-section
tbody.delta.total
gr-diff-row
td.content.remove
div.contentText,
gr-diff-row td.sign.remove.no-intraline-info {
background-color: var(--dark-remove-highlight-color);
}
gr-diff-row td.content.remove div.contentText,
gr-diff-row td.sign.remove {
background-color: var(--light-remove-highlight-color);
}
gr-diff-section
tbody.ignoredWhitespaceOnly
gr-diff-row
td.sign.no-intraline-info {
background-color: var(--view-background-color);
}
/* dueToRebase */
gr-diff-section tbody.dueToRebase td.content.add div.contentText .intraline,
gr-diff-section tbody.delta.total.dueToRebase td.content.add div.contentText {
background-color: var(--dark-rebased-add-highlight-color);
}
gr-diff-section tbody.dueToRebase td.content.add div.contentText {
background-color: var(--light-rebased-add-highlight-color);
}
gr-diff-section
tbody.dueToRebase
td.content.remove
div.contentText
.intraline,
gr-diff-section
tbody.delta.total.dueToRebase
td.content.remove
div.contentText {
background-color: var(--dark-rebased-remove-highlight-color);
}
gr-diff-section tbody.dueToRebase td.content.remove div.contentText {
background-color: var(--light-rebased-remove-highlight-color);
}
/* dueToMove */
gr-diff-section tbody.dueToMove .sign.add,
gr-diff-section tbody.dueToMove td.content.add div.contentText,
gr-diff-section tbody.dueToMove tr.moveControls.movedIn .sign.right,
gr-diff-section tbody.dueToMove tr.moveControls.movedIn td.moveHeader,
gr-diff-section tbody.delta.total.dueToMove td.content.add div.contentText {
background-color: var(--diff-moved-in-background);
}
gr-diff-section tbody.dueToMove.changed .sign.add,
gr-diff-section tbody.dueToMove.changed td.content.add div.contentText,
gr-diff-section tbody.dueToMove.changed tr.moveControls.movedIn .sign.right,
gr-diff-section tbody.dueToMove.changed tr.moveControls.movedIn td.moveHeader,
gr-diff-section
tbody.delta.total.dueToMove.changed
td.content.add
div.contentText {
background-color: var(--diff-moved-in-changed-background);
}
gr-diff-section tbody.dueToMove .sign.remove,
gr-diff-section tbody.dueToMove td.content.remove div.contentText,
gr-diff-section tbody.dueToMove tr.moveControls.movedOut td.moveHeader,
gr-diff-section tbody.dueToMove tr.moveControls.movedOut .sign.left,
gr-diff-section
tbody.delta.total.dueToMove
td.content.remove
div.contentText {
background-color: var(--diff-moved-out-background);
}
gr-diff-section tbody.delta.dueToMove tr.movedIn td.moveHeader {
--gr-range-header-color: var(--diff-moved-in-label-color);
}
gr-diff-section tbody.delta.dueToMove.changed tr.movedIn td.moveHeader {
--gr-range-header-color: var(--diff-moved-in-changed-label-color);
}
gr-diff-section tbody.delta.dueToMove tr.movedOut td.moveHeader {
--gr-range-header-color: var(--diff-moved-out-label-color);
}
gr-diff-section tr.moveControls td.moveHeader a {
color: inherit;
}
gr-diff-section
tbody.ignoredWhitespaceOnly
gr-diff-row
td.content.add
div.contentText
.intraline,
gr-diff-section
tbody.delta.total.ignoredWhitespaceOnly
gr-diff-row
td.content.add
div.contentText,
gr-diff-section
tbody.ignoredWhitespaceOnly
gr-diff-row
td.content.add
div.contentText,
gr-diff-section
tbody.ignoredWhitespaceOnly
gr-diff-row
td.content.remove
div.contentText
.intraline,
gr-diff-section
tbody.delta.total.ignoredWhitespaceOnly
gr-diff-row
td.content.remove
div.contentText,
gr-diff-section
tbody.ignoredWhitespaceOnly
gr-diff-row
td.content.remove
div.contentText {
background-color: var(--view-background-color);
}
gr-diff-row td.content div.contentText gr-diff-text:empty:after,
gr-diff-row td.content div.contentText gr-legacy-text:empty:after,
gr-diff-row td.content div.contentText:empty:after {
/* Newline, to ensure empty lines are one line-height tall. */
content: '\\A';
}
/* Context controls */
gr-diff-section tbody.contextControl {
display: table-row-group;
background-color: transparent;
border: none;
--divider-height: var(--spacing-s);
--divider-border: 1px;
}
/* TODO: Is this still used? */
gr-diff-section tbody.contextControl gr-button gr-icon {
/* should match line-height of gr-button */
font-size: var(--line-height-mono, 18px);
}
gr-diff-section tbody.contextControl td:not(.lineNumButton) {
text-align: center;
}
/* Padding rows behind context controls. Styled as a continuation of the
line gutters and code area. */
gr-context-controls-section tr.contextBackground > .contextLineNum {
background-color: var(--diff-blank-background-color);
}
gr-context-controls-section tr.contextBackground > td:not(.contextLineNum) {
background-color: var(--view-background-color);
}
gr-context-controls-section tr.contextBackground {
/* One line of background behind the context expanders which they can
render on top of, plus some padding. */
height: calc(var(--line-height-normal) + var(--spacing-s));
}
/* Hide the actual context control buttons */
:host(.disable-context-control-buttons)
gr-diff-section
tbody.contextControl
gr-context-controls-section
gr-context-controls {
display: none;
}
/* Maintain a small amount of padding at the edges of diff chunks */
:host(.disable-context-control-buttons)
gr-diff-section
tbody.contextControl
gr-context-controls-section
tr.contextBackground {
height: var(--spacing-s);
border-right: none;
}
gr-context-controls-section td.dividerCell {
vertical-align: top;
}
gr-context-controls-section tr.dividerRow.show-both td.dividerCell {
height: var(--divider-height);
}
gr-context-controls-section tr.dividerRow.show-above td.dividerCell {
height: 0;
}
gr-diff-text .br:after {
/* Line feed */
content: '\\A';
}
gr-diff-text .tab {
display: inline-block;
}
gr-diff-text .tab-indicator:before {
color: var(--diff-tab-indicator-color);
/* >> character */
content: '\\00BB';
position: absolute;
}
gr-diff-text .special-char-indicator {
/* spacing so elements don't collide */
padding-right: var(--spacing-m);
}
gr-diff-text .special-char-indicator:before {
color: var(--diff-tab-indicator-color);
content: '•';
position: absolute;
}
gr-diff-text .special-char-warning {
/* spacing so elements don't collide */
padding-right: var(--spacing-m);
}
gr-diff-text .special-char-warning:before {
color: var(--warning-foreground);
content: '!';
position: absolute;
}
/* Is defined after other background-colors, such that this
rule wins in case of same specificity. */
td.content div.contentText gr-diff-text .trailing-whitespace,
td.content div.contentText gr-diff-text .trailing-whitespace .intraline {
border-radius: var(--border-radius, 4px);
background-color: var(--diff-trailing-whitespace-indicator);
}
gr-diff-element div#diffHeader {
background-color: var(--table-header-background-color);
border-bottom: 1px solid var(--border-color);
color: var(--link-color);
padding: var(--spacing-m) 0 var(--spacing-m) 48px;
}
gr-diff-element {
/* for gr-selection-action-box positioning */
position: relative;
}
gr-diff-element table#diffTable:focus {
outline: none;
}
gr-diff-element div#loadingError,
gr-diff-element div#sizeWarning {
display: block;
margin: var(--spacing-l) auto;
max-width: 60em;
text-align: center;
}
gr-diff-element div#loadingError {
color: var(--error-text-color);
}
gr-diff-element div#sizeWarning gr-button {
margin: var(--spacing-l);
}
gr-diff-row tr.target-row td.blame {
background: var(--diff-selection-background-color);
}
gr-diff-row td.content.lost div {
background-color: var(--info-background);
}
gr-diff-row td.content.lost div.lost-message {
font-family: var(--font-family, 'Roboto');
font-size: var(--font-size-normal, 14px);
line-height: var(--line-height-normal);
padding: var(--spacing-s) 0;
}
gr-diff-row td.content.lost div.lost-message gr-icon {
padding: 0 var(--spacing-s) 0 var(--spacing-m);
color: var(--blue-700);
}
gr-diff-row td.blame {
padding: 0 var(--spacing-m);
white-space: pre;
}
gr-diff-row td.blame > span {
opacity: 0.6;
}
gr-diff-row td.blame > span.startOfRange {
opacity: 1;
}
gr-diff-row td.blame .blameDate {
font-family: var(--monospace-font-family);
color: var(--link-color);
text-decoration: none;
}
gr-diff-element table.responsive gr-diff-row td.blame {
overflow: hidden;
width: 200px;
}
/** Support the line length indicator **/
gr-diff-element table.responsive gr-diff-row td.content div.contentText {
/* Same strategy as in
https://stackoverflow.com/questions/1179928/how-can-i-put-a-vertical-line-down-the-center-of-a-div
*/
background-image: linear-gradient(
var(--line-length-indicator-color),
var(--line-length-indicator-color)
);
background-size: 1px 100%;
background-position: var(--line-limit-marker) 0;
background-repeat: no-repeat;
}
gr-diff-element div.newlineWarning {
color: var(--deemphasized-text-color);
text-align: center;
}
gr-diff-element div.newlineWarning.hidden {
display: none;
}
gr-diff-row td.lineNum.COVERED button.lineNumButton {
color: var(
--coverage-covered-line-num-color,
var(--deemphasized-text-color)
);
background-color: var(--coverage-covered, #e0f2f1);
}
gr-diff-row td.lineNum.NOT_COVERED button.lineNumButton {
color: var(
--coverage-covered-line-num-color,
var(--deemphasized-text-color)
);
background-color: var(--coverage-not-covered, #ffd1a4);
}
gr-diff-row td.lineNum.PARTIALLY_COVERED button.lineNumButton {
color: var(
--coverage-covered-line-num-color,
var(--deemphasized-text-color)
);
background: linear-gradient(
to right bottom,
var(--coverage-not-covered, #ffd1a4) 0%,
var(--coverage-not-covered, #ffd1a4) 50%,
var(--coverage-covered, #e0f2f1) 50%,
var(--coverage-covered, #e0f2f1) 100%
);
}
gr-diff-row td.content,
gr-diff-section tbody.contextControl,
gr-diff-row td.blame {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
gr-diff-element.selected-left:not(.selected-comment)
gr-diff-row
tr.side-by-side
td.left
+ td.content
div.contentText,
gr-diff-element.selected-right:not(.selected-comment)
gr-diff-row
tr.side-by-side
td.right
+ td.content
div.contentText,
gr-diff-element.selected-left:not(.selected-comment)
gr-diff-row
tr.unified
td.left.lineNum
~ td.content:not(.both)
div.contentText,
gr-diff-element.selected-right:not(.selected-comment)
gr-diff-row
tr.unified
td.right.lineNum
~ td.content
div.contentText,
gr-diff-element.selected-left.selected-comment
gr-diff-row
tr.side-by-side
td.left
+ td.content
div.thread-group
.message,
gr-diff-element.selected-right.selected-comment
gr-diff-row
tr.side-by-side
td.right
+ td.content
div.thread-group
.message
:not(.collapsedContent),
gr-diff-element.selected-comment
gr-diff-row
tr.unified
td.content
div.thread-group
.message
:not(.collapsedContent),
gr-diff-element.selected-blame gr-diff-row td.blame,
gr-diff-element.selected-left.selected-comment
::slotted(.comment-thread[diff-side='left']),
gr-diff-element.selected-right.selected-comment
::slotted(.comment-thread[diff-side='right']) {
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
gr-diff-element div.whitespace-change-only-message {
background-color: var(--diff-context-control-background-color);
border: 1px solid var(--diff-context-control-border-color);
text-align: center;
}
gr-diff-text .token-highlight {
background-color: var(--token-highlighting-color, #fffd54);
}
gr-diff-element gr-selection-action-box {
/* Needs z-index to appear above wrapped content, since it's inserted
into DOM before it. */
z-index: 120;
}
gr-diff-image-new,
gr-diff-image-old,
gr-diff-section,
gr-context-controls-section,
gr-diff-row {
display: contents;
}
`;