e2ed
Version:
E2E testing framework over Playwright
1,462 lines (1,433 loc) • 38.7 kB
CSS
:root {
--font-size: 14px;
--line-height: 1.4;
--half-line-height: calc(var(--line-height) * var(--font-size) / 2);
--half-line-height: round(calc(var(--line-height) * var(--font-size) / 2), 1px);
--primary-bg-color: hsl(0 0% 98.8%);
--secondary-bg-color: hsl(0 0% 99.6%);
--font-color: hsl(0 0% 7%);
--subtitle-color: hsl(0 1% 32%);
--accent-color: hsl(221 93% 47%);
--link-visited-color: hsl(271 68% 32%);
--passed-color: hsl(120 100% 16%);
--failed-color: hsl(0 100% 31%);
--unknown-color: hsl(300 100% 27%);
--skipped-color: hsl(0 0% 30%);
--broken-color: hsl(39 100% 21%);
--manual-color: hsl(80 100% 17%);
--transparent-color: hsl(0 0% 0% / 0%);
--color-cell-color: hsl(0 0% 95%);
--button-disabled-color: hsl(0 0% 5% / 0.3);
--header-height: 70px;
--retry-padding: 10px;
--test-details-padding: 10px;
--main-radius: 3px;
--item-bg-color: hsl(0 0% 63% / 0.07);
--failed-status-bg-color: hsl(0 100% 63% / 0.07);
--step-panel-bg-color: hsl(0 0% 89%);
--item-hover-bg-color: hsl(215 98% 61% /0.15);
--drag-container-width: 8px;
--drag-container-color: hsl(0 0% 60%);
--drag-container-bg-color: hsl(0 0% 83%);
--main-params-color: hsl(0 0% 30%);
--tests-counters-by-status-cell-bg-color: var(--primary-bg-color);
--failed-line-color: hsl(0 100% 35%);
--failed-text-color: hsl(4, 64%, 23%);
}
@media (prefers-color-scheme: dark) {
:root {
--primary-bg-color: hsl(240 8.77% 11.18%);
--secondary-bg-color: hsl(240 5.56% 14.12%);
--font-color: hsl(0 0% 100% / 0.75);
--subtitle-color: hsl(0 0% 66%);
--accent-color: hsl(221 91% 75%);
--drag-container-color: hsl(0 0% 75%);
--drag-container-bg-color: hsl(0 0% 32%);
--step-panel-bg-color: hsl(210 12% 16%);
--button-disabled-color: hsl(0 0% 60% / 0.3);
--link-visited-color: hsl(271 69% 76%);
--passed-color: hsl(120 100% 41%);
--failed-color: hsl(0 100% 76%);
--unknown-color: hsl(300 100% 80%);
--skipped-color: hsl(0 0% 70%);
--broken-color: hsl(39 100% 50%);
--manual-color: hsl(80 100% 36%);
--main-params-color: hsl(0 0% 65%);
--failed-line-color: hsl(0 100% 74%);
--failed-text-color: var(--font-color);
--color-cell-color: hsl(0 0% 7%);
}
.logo > svg *[fill='#084EE8'] {
fill: hsl(220 93% 56%);
}
.logo > svg *[fill='#000'] {
fill: hsl(0 0% 65%);
}
}
body {
display: grid;
grid-template-areas: 'header' 'column-1' 'main';
grid-template-rows: auto auto 1fr;
grid-template-columns: 1fr;
margin: 0;
padding: 0;
width: 100%;
min-height: 100vh;
font-family: system-ui;
font-size: var(--font-size);
line-height: var(--line-height);
color: var(--font-color);
background-color: var(--primary-bg-color);
}
body:has(dialog[open]) {
overflow: hidden;
}
button,
button:focus,
button:active,
button:hover {
box-sizing: border-box;
border: none;
font-family: system-ui;
cursor: pointer;
background-color: transparent;
background: none;
user-select: text;
}
button:disabled {
color: var(--button-disabled-color);
cursor: not-allowed;
}
a,
a:hover,
a:active,
a:focus {
color: var(--accent-color);
}
a:visited {
color: var(--link-visited-color);
}
.errors,
.warnings {
padding: 2px var(--retry-padding);
overflow-wrap: break-word;
}
.errors__error {
margin: 4px 0;
color: var(--failed-color);
}
.warnings__error {
margin: 4px 0;
color: var(--broken-color);
}
.header {
grid-area: header;
display: flex;
justify-content: flex-start;
margin: 0;
padding: 4px 14px;
box-sizing: border-box;
}
.logo {
display: block;
width: 100px;
height: auto;
}
.column-1 {
grid-area: column-1;
width: 100vw;
}
.header,
.column-1 {
border-bottom: 1px solid var(--drag-container-bg-color);
}
.retry-links {
display: flex;
flex-direction: row;
max-width: 100vw;
overflow-x: scroll;
}
.retry-link {
padding: 14px;
box-sizing: border-box;
flex-shrink: 0;
font-size: 16px;
color: var(--font-color);
text-align: left;
transition: all 0.3s ease;
white-space: nowrap;
text-decoration: none;
border: none;
}
.retry-link[aria-current='true'] {
box-shadow: 0 -3px 0 0 var(--accent-color) inset;
border-radius: inherit;
background: var(--item-bg-color);
}
.main {
overflow: hidden;
contain: layout;
container-type: inline-size;
grid-area: main;
min-width: 0;
display: flex;
flex-direction: column;
}
.column-1 {
width: 100%;
}
.column-2 {
flex-basis: auto;
}
.column-2,
.column-3 {
min-width: 180px;
padding-bottom: 25px;
}
.column-1,
.column-2 {
contain: layout paint;
}
.column-1,
.column-2,
.column-3 {
height: auto;
box-sizing: border-box;
}
.retry__title {
margin: 0;
padding: 14px var(--retry-padding) 10px;
font-size: 22px;
font-weight: normal;
}
.retry__date {
margin: 0 0 15px 0;
padding: 0 var(--retry-padding);
color: var(--subtitle-color);
}
.color-cell {
padding: 2px 4px;
border-radius: var(--main-radius);
white-space: nowrap;
font-size: 14px;
color: var(--color-cell-color);
}
.color-cell_type_tag {
background-color: var(--accent-color);
}
.tests-counters-by-status {
display: flex;
gap: 2px;
flex-grow: 1;
flex-shrink: 0;
justify-content: flex-end;
align-items: flex-start;
}
.tests-counters-by-status__cell {
padding: 2px;
display: flex;
gap: 2px;
border-radius: 20px;
white-space: nowrap;
align-items: center;
transition: transform 0.15s ease-in;
font-size: 11px;
line-height: 11px;
color: var(--font-color);
}
.step__head::before,
.tests-directory__title::before,
.test-link::before,
.tests-counters-by-status__cell::before {
--offset: 0px;
--icon-size-without-offset: calc(var(--icon-size) - 2 * var(--offset) - 2 * var(--border-width));
content: '';
width: var(--icon-size-without-offset);
height: var(--icon-size-without-offset);
margin: 0 calc(var(--offset) + var(--border-width));
flex-shrink: 0;
display: block;
box-sizing: border-box;
border-radius: 50%;
outline: var(--border-width) solid;
outline-offset: var(--offset);
background-clip: content-box;
background-position: 50% 50%;
background-repeat: no-repeat;
overflow: hidden;
}
.step__head::before,
.test-link::before {
--border-width: 0px;
--icon-size: 12px;
--icon-line-width: 2px;
font-weight: bold;
transition: transform 0.15s ease-in;
}
.tests-counters-by-status__cell::before {
--icon-size: 12px;
--offset: 2px;
--border-width: 1px;
--icon-line-width: 1px;
margin: calc(var(--offset) + var(--border-width));
opacity: 0.7;
}
.tests-counters-by-status__cell:hover {
position: relative;
background-color: var(--tests-counters-by-status-cell-bg-color);
transform: translate(-25%, 0px) scale(1.75);
z-index: 12;
}
.retry-link,
.test-link,
.tests-directory__title,
.step__head {
border-radius: var(--main-radius);
}
.test-link[data-status='passed']::before,
.tests-counters-by-status__cell[data-status='passed']::before,
.step[data-status='passed'] > .step__details > .step__head::before,
.step[data-status='passed'] > .step__head::before {
color: var(--passed-color);
background-image:
linear-gradient(var(--transparent-color) calc(100% - var(--icon-line-width)), currentColor 0),
linear-gradient(
90deg,
var(--transparent-color) calc(100% - var(--icon-line-width)),
currentColor 0
);
background-size: 37% 70%;
rotate: 45deg;
}
.test-link[data-status='passed']::before,
.step[data-status='passed'] > .step__details > .step__head::before,
.step[data-status='passed'] > .step__head::before {
border-bottom-right-radius: 0px;
background-size: 56% 100%;
translate: 0 -15%;
}
.test-link[data-status='failed']::before,
.tests-counters-by-status__cell[data-status='failed']::before,
.step[data-status='failed'] > .step__details > .step__head::before,
.step[data-status='failed'] > .step__head::before {
color: var(--failed-color);
background-image:
linear-gradient(
45deg,
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
),
linear-gradient(
135deg,
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
);
}
.test-link[data-status='broken']::before,
.tests-counters-by-status__cell[data-status='broken']::before {
--border-width: 1px;
--offset: 0px;
border-radius: 50%;
color: var(--broken-color);
background-image: linear-gradient(
135deg,
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
);
}
.test-link[data-status='skipped']::before,
.tests-counters-by-status__cell[data-status='skipped']::before {
color: var(--skipped-color);
}
.test-link[data-status='skipped']::before,
.tests-counters-by-status__cell[data-status='skipped']::before,
.tests-directory[open] > .tests-directory__title::before {
background-image: linear-gradient(
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
);
}
.test-link[data-status='unknown']::before,
.tests-counters-by-status__cell[data-status='unknown']::before {
content: '?';
display: flex;
justify-content: center;
align-items: center;
color: var(--unknown-color);
}
.test-link[data-status='manual']::before {
--offset: 0px;
}
.tests-counters-by-status__cell[data-status='passed']::before,
.tests-counters-by-status__cell[data-status='unknown']::before,
.tests-counters-by-status__cell[data-status='manual']::before {
--offset: 1px;
}
.test-link[data-status='manual']::before,
.tests-counters-by-status__cell[data-status='manual']::before {
color: var(--manual-color);
background:
linear-gradient(
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
),
linear-gradient(
90deg,
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
),
linear-gradient(
90deg,
currentColor calc(var(--icon-line-width) + 8%),
var(--transparent-color) 0
)
0px 60% / 100% 46%,
linear-gradient(currentColor calc(var(--icon-line-width) + 8%), var(--transparent-color) 0) 60%
0px / 46% 100%;
background-repeat: no-repeat;
rotate: 45deg;
}
.tests-counters-by-status__cell:hover::before {
opacity: 1;
}
.color-cell[data-status='passed'] {
background-color: var(--passed-color);
}
.color-cell[data-status='manual'] {
background-color: var(--manual-color);
}
.color-cell[data-status='skipped'] {
background-color: var(--skipped-color);
}
.color-cell[data-status='failed'] {
background-color: var(--failed-color);
}
.color-cell[data-status='broken'] {
background-color: var(--broken-color);
}
.color-cell[data-status='unknown'] {
background-color: var(--unknown-color);
}
.retry-link,
.test-link,
.test-tabs__button {
min-height: 42px;
}
.test-details__path {
margin: 0;
padding: var(--test-details-padding);
font-size: 18px;
color: var(--subtitle-color);
overflow-wrap: break-word;
}
.test-details__title {
margin: 0;
padding: var(--test-details-padding);
font-size: 18px;
line-height: 24px;
font-weight: 400;
overflow-wrap: break-word;
}
.test-details__title .color-cell {
margin-right: 10px;
position: relative;
font-size: 16px;
}
.test-tabs {
position: relative;
display: flex;
background-color: var(--secondary-bg-color);
white-space: nowrap;
scroll-snap-type: x mandatory;
overflow-x: auto;
}
.test-tabs__button {
position: relative;
padding: 11px calc(var(--test-details-padding) + 4px) 14px;
width: 100px;
border: none;
font-size: 16px;
color: var(--font-color);
transition: all 0.3s ease;
text-transform: uppercase;
scroll-snap-align: start;
}
.test-tabs__button[aria-selected='true']::after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: 0;
width: 100px;
height: 3px;
background-color: var(--accent-color);
transition: transform 0.2s ease 0s;
transform-origin: 0px 0px;
}
.test-tabs__button,
.test-tabs__button:focus,
.test-tabs__button:active,
.test-tabs__button:hover {
background-color: var(--secondary-bg-color);
}
.test-tabs__button:not(:disabled):hover::before,
.test-tabs__button:not(:disabled):focus::before,
.test-tabs__button:not(:disabled):active::before {
content: '';
position: absolute;
top: 7px;
left: var(--test-details-padding);
right: var(--test-details-padding);
bottom: 10px;
border: 2px solid var(--accent-color);
border-radius: var(--main-radius);
}
.test-tabs__button[aria-selected='true'],
.test-tabs__button[aria-selected='true']:hover,
.test-tabs__button[aria-selected='true']:active,
.test-tabs__button[aria-selected='true']:focus {
position: relative;
color: var(--accent-color);
cursor: default;
}
.drag-container {
display: none;
}
.test-error {
box-sizing: border-box;
margin: 0 var(--test-details-padding);
padding: var(--test-details-padding);
border: 1px solid hsl(0 100% 35% / 0.3);
border-left: 4px solid var(--failed-line-color);
border-radius: var(--main-radius);
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
color: var(--failed-text-color);
background-color: var(--failed-status-bg-color);
}
.test-error__content {
overflow: auto;
scrollbar-gutter: stable;
white-space: pre;
max-width: 100%;
max-height: 800px;
}
.empty-state {
padding: var(--test-details-padding);
}
.test-details__retry-title + .empty-state {
padding-top: 0;
}
.test-details__retry-title {
margin: 0 0 10px 0;
padding: 15px var(--test-details-padding) 0;
font-size: 20px;
font-weight: normal;
}
.test-details__retry-title + .test-description {
padding-top: 0;
}
.test-description {
margin: 0 0 15px 0;
padding: 15px var(--test-details-padding) 0;
}
.test-description__term {
display: inline-block;
color: var(--subtitle-color);
}
.test-description__term::after {
content: ':';
}
.test-description__definition {
margin: 0;
display: inline;
overflow-wrap: break-word;
}
.test-description__definition::after {
margin: 0 0 7px 0;
display: block;
content: '';
}
.test-description__definition .color-cell {
font-size: 12px;
font-weight: normal;
}
.test-description__definition .color-cell:not(:last-child) {
margin: 0 5px 0 0;
}
.steps-group {
--horizontal-level-offset: clamp(14px, 2.5cqw, 25px);
--vertical-level-offset: 10px;
--popover-button-width: 30px;
--timeline-width: 3px;
--timeline-point-diameter: 9px;
--timeline-border-radius: 7px;
--timeline-top-offset: calc(var(--step-head-padding-top-bottom) + var(--half-line-height));
--timeline-left-offset: 15px;
--timeline-color: hsl(0 0% 45%);
--focus-line-color: hsl(0 0% 64%);
--icon-size: 13px;
--step-head-margin-right: var(--test-link-margin-left-right, 3px);
--step-head-padding-top-bottom: var(--test-link-padding-top-bottom, 8px);
--step-head-padding-left-right: var(--test-link-padding-left-right, 10px);
--timeline-horizontal-line-width: 20px;
--details-open-summary-margin-bottom: 15px;
--timeline-border-bottom-left-radius: var(--timeline-border-radius);
--timeline-bend-top-left-border-width: 0 0 var(--timeline-width) var(--timeline-width);
--timeline-bend-top-right-border-width: var(--timeline-width) var(--timeline-width) 0 0;
--timeline-before-box-shadow: 0 calc(-1 * var(--timeline-border-radius)) 0 0
var(--primary-bg-color);
position: relative;
padding-left: 0;
contain: layout paint;
overflow: hidden;
background: var(--primary-bg-color);
}
.steps-group:not(.steps-group .steps-group) {
container-type: inline-size;
}
.step {
--level: 0;
--icon-margin-right: 7px;
--arrow-color: hsl(0 0% 32%);
position: relative;
box-sizing: border-box;
min-height: 38px;
padding-left: var(--popover-button-width);
padding-bottom: 1px;
list-style-type: none;
}
.step__head {
display: grid;
grid-template-columns: auto 1fr auto;
gap: 5px;
box-sizing: border-box;
min-width: 0;
min-height: 38px;
margin: 0 var(--step-head-margin-right) 0 0;
padding: var(--step-head-padding-top-bottom) var(--step-head-padding-left-right);
font-size: var(--font-size);
line-height: var(--line-height);
}
.step__head,
.test-link,
.test-link:focus,
.test-link:active,
.test-link:hover,
.tests-directory__title {
background-color: var(--item-bg-color);
}
.step__details > .step__head > .step__name::before {
content: '';
position: absolute;
border-width: 6px 0 6px var(--arrow-width);
border-style: solid;
border-color: transparent;
border-left-color: var(--arrow-color);
background: none;
transform: translate(
calc(-1 * calc(var(--arrow-width) + 5px)),
calc(var(--half-line-height) - 50%)
);
transition: transform 0.3s ease;
left: 0;
top: var(--half-line-height);
transform: translate(50%, -50%);
}
.step__details[open] > .step__head > .step__name::before {
transform: rotate(90deg) translate(-75%, -25%);
}
.tests-directory__title::-webkit-details-marker,
.step__details > .step__head::-webkit-details-marker,
.step-attachment__title::-webkit-details-marker {
display: none;
}
.step-attachment {
translate: 0px -10px;
}
.step-attachment[open]:not(:last-child) {
margin-bottom: 10px;
}
.step-attachment[open]:has(+ .steps-group) {
margin-bottom: 0;
}
.step-attachment__title {
padding: 3px 7px;
display: inline-flex;
gap: 5px;
align-items: center;
border-radius: var(--main-radius);
font-size: 12px;
cursor: pointer;
}
.step-attachment__title::before {
content: '';
display: block;
width: 7px;
height: 7px;
flex-shrink: 0;
border-right: 1px solid var(--font-color);
border-top: 1px solid var(--font-color);
background: none;
scale: 0.8;
transform: rotate(45deg);
transition: transform 0.3s ease;
}
.step-attachment[open] > .step-attachment__title::before {
transform: rotate(135deg) translateX(-50%);
}
.step__code {
margin: 0 var(--step-head-margin-right) 0 0;
padding: 10px var(--test-details-padding);
box-sizing: border-box;
border-radius: var(--main-radius);
background-color: var(--step-panel-bg-color);
overflow: auto;
}
.tests-directory__name,
.step__name {
overflow-wrap: break-word;
overflow: hidden;
}
.step__name {
--arrow-width: 7px;
position: relative;
margin: 0;
grid-column: 1/-1;
grid-row: 2;
font-weight: normal;
text-align: left;
}
.step__details > .step__head > .step__name {
padding-left: calc(var(--arrow-width) + 8px);
}
.step__duration {
text-align: right;
color: var(--subtitle-color);
}
.steps-group .steps-group {
box-sizing: border-box;
margin-left: calc(-1 * var(--popover-button-width));
padding: calc(var(--vertical-level-offset) + var(--timeline-border-radius)) 0
calc(
var(--timeline-top-offset) + var(--vertical-level-offset) +
var(--details-open-summary-margin-bottom) + var(--timeline-border-radius)
)
calc(var(--horizontal-level-offset));
}
.step:last-child {
--level: 1;
}
.step:last-child > .step__details > .steps-group > .step:last-child {
--level: 2;
}
.step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child {
--level: 3;
}
.step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child {
--level: 4;
}
.step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child {
--level: 5;
}
.step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child {
--level: 6;
}
.step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child {
--level: 7;
}
.step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group
> .step:last-child
> .step__details
> .steps-group {
--timeline-bend-top-left-border-width: 0 var(--timeline-width) 0 0;
--timeline-bend-top-right-border-width: 0 var(--timeline-width) 0 0;
--timeline-border-bottom-left-radius: 0;
--timeline-before-box-shadow: none;
margin-left: calc(
-1 * var(--horizontal-level-offset) * (var(--level) + 1) - var(--popover-button-width)
);
}
.steps-group > .step:last-child > .step__details > .steps-group {
margin-left: calc(
-1 * var(--horizontal-level-offset) * var(--level) - var(--popover-button-width)
);
padding-left: calc(
var(--horizontal-level-offset) * (var(--level) + 1) + 0 * var(--popover-button-width)
);
}
.step:last-child {
padding-bottom: 0;
}
.steps-group .steps-group > .step:last-child > .step__details > .step__head::after,
.steps-group .steps-group > .step:last-child > .step__head::after,
.steps-group .steps-group > .step:first-child::before {
box-sizing: content-box;
width: var(--timeline-border-radius);
margin-left: calc(-1 * var(--timeline-border-radius));
}
.step__head::after {
bottom: calc(-1 * var(--vertical-level-offset));
z-index: 2;
height: var(--timeline-border-radius);
border-width: 0 var(--timeline-width) var(--timeline-width) 0;
border-bottom-right-radius: var(--timeline-border-radius);
box-shadow: 0 var(--timeline-border-radius) 0 0 var(--primary-bg-color);
}
.steps-group .steps-group > .step:first-child::before {
top: calc(-1 * var(--vertical-level-offset));
height: calc(var(--timeline-top-offset) + var(--vertical-level-offset) - var(--timeline-width));
border-width: var(--timeline-bend-top-right-border-width);
border-top-right-radius: var(--timeline-border-bottom-left-radius);
box-shadow: var(--timeline-before-box-shadow);
}
.steps-group:has(> .step:last-child > .step__details[open] > .steps-group) {
padding-bottom: 0;
}
.steps-group .steps-group::before,
.steps-group .steps-group::after,
.step::after,
.steps-group .steps-group > .step:last-child > .step__details > .step__head::after,
.steps-group .steps-group > .step:last-child > .step__head::after,
.steps-group .steps-group > .step:first-child::before,
.step__popover-button::after {
content: '';
position: absolute;
border-style: solid;
}
.steps-group::before,
.steps-group::after,
.step::before,
.step::after,
.step__head::after,
.step__popover-button::after {
border-color: var(--timeline-color);
}
.steps-group .steps-group::before {
top: 0;
left: calc(var(--timeline-left-offset) + var(--horizontal-level-offset) * var(--level));
width: var(--horizontal-level-offset);
height: var(--timeline-border-radius);
border-width: var(--timeline-bend-top-left-border-width);
border-bottom-left-radius: var(--timeline-border-bottom-left-radius);
}
.steps-group .steps-group::after {
width: calc(var(--horizontal-level-offset) * (var(--level) + 1));
height: calc(
var(--details-open-summary-margin-bottom) + var(--timeline-top-offset) +
var(--timeline-border-radius)
);
border-width: var(--timeline-width) 0 0 var(--timeline-width);
border-top-left-radius: var(--timeline-border-radius);
left: var(--timeline-left-offset);
bottom: 0;
}
.step__details[open] > .step__head {
margin-bottom: var(--details-open-summary-margin-bottom);
}
.step__popover-button::after {
top: var(--timeline-top-offset);
display: flex;
box-sizing: border-box;
aspect-ratio: 1;
width: var(--timeline-point-diameter);
border-width: 1px;
border-radius: 50%;
background-color: var(--primary-bg-color);
transform: translate(calc(var(--timeline-left-offset) + (var(--timeline-width) / 2) - 50%), -50%);
}
.step::after,
.step::before,
.step__head::after {
left: var(--timeline-left-offset);
}
.step::after {
top: var(--timeline-top-offset);
bottom: calc(-1 * var(--timeline-top-offset));
z-index: -1;
box-sizing: border-box;
width: calc(var(--timeline-horizontal-line-width) + var(--timeline-width));
margin-top: 0;
margin-right: 0;
border-width: 1px 0 0 var(--timeline-width);
}
.steps-group .steps-group > .step:last-child::after {
bottom: calc(-1 * var(--vertical-level-offset) + var(--timeline-border-radius));
}
.step:last-child:not(.steps-group .steps-group > .step)::after,
.steps-group:has(> .step:last-child > .step__details[open] > .steps-group)::after {
display: none;
}
.tests-directory[data-status='failed']::before,
.test-link[data-status='failed']::after,
.test-link[data-status='unknown']::after,
.step[data-status='failed']::after,
.step[data-status='failed'] > .step__details > .step__head::after,
.step[data-status='failed'] + .step::before,
.step[data-status='failed'] > .step__popover-button::after,
.steps-group:has(> .step:last-child[data-status='failed'])::after,
.step[data-status='failed'] > .step__details > .steps-group > .step:first-child::before,
.step[data-status='failed'] > .step__details > .steps-group::before {
border-color: var(--failed-line-color);
}
.step__popover-button:hover,
.step:has(> .step__popover-button:hover)::after,
.step:has(> .step__popover-button:hover) .steps-group,
.step:has(> .step__popover-button:hover) > .step__details,
.steps-group:has(> .step:last-child > .step__popover-button:hover)::after {
--timeline-color: hsl(120 100% 30%);
--failed-line-color: hsl(0 100% 46%);
}
.tests-group {
--test-link-margin-left-right: 3px;
--test-link-padding-top-bottom: 8px;
--test-link-padding-left-right: var(--retry-padding, 10px);
--icon-margin-right: 7px;
--icon-size: 15px;
--line-width: 1px;
--test-link-half-icon-width: calc((var(--icon-size) - var(--line-width)) / 2);
--test-link-half-icon-width: round(calc((var(--icon-size) - var(--line-width)) / 2), 1px);
--tests-group-line-color: hsl(0 0% 64%);
--horizontal-line-to-icon-width: calc(
var(--test-link-padding-left-right) + var(--test-link-margin-left-right) + var(--line-width)
);
--tests-group-open-margin-bottom: 5px;
position: relative;
overflow: hidden;
container-type: inline-size;
display: flex;
flex-direction: column;
margin-left: calc(var(--horizontal-line-to-icon-width) + var(--test-link-half-icon-width));
}
.tests-group:not(.tests-group .tests-group) {
margin-left: var(--retry-padding);
}
.tests-directory[open] {
margin-bottom: var(--tests-group-open-margin-bottom);
}
.tests-group::after,
.tests-directory::before,
.tests-group > .test-link::after {
content: '';
display: block;
position: absolute;
left: 0;
width: var(--horizontal-line-to-icon-width);
}
.tests-group::after {
top: 0;
bottom: 0;
z-index: 100;
}
.tests-directory::before {
--translate-y: calc(100% - var(--test-link-padding-top-bottom) - var(--half-line-height) - 1px);
}
.tests-group > .test-link::after {
--translate-y: calc(100% - var(--half-line-height));
width: calc(var(--horizontal-line-to-icon-width) - 2px);
}
.tests-directory::before,
.test-link::after {
height: 100%;
box-sizing: border-box;
border-width: 1px var(--line-width) 0 0;
border-style: solid;
border-color: var(--tests-group-line-color);
transform: rotate(180deg) translate(0, var(--translate-y));
z-index: 3;
}
.tests-directory:last-child::before,
.test-link:last-child::after {
border-top-right-radius: var(--main-radius);
}
.tests-directory[data-status='failed']::before,
.test-link[data-status='failed']::after,
.test-link[data-status='unknown']::after {
z-index: 50;
}
.test-link,
.tests-directory__title {
margin: 0 var(--test-link-margin-left-right) 0
calc(var(--test-link-margin-left-right) + var(--line-width));
padding: var(--test-link-padding-top-bottom, 8px) var(--test-link-padding-left-right, 10px);
display: grid;
grid-template-columns: auto 1fr auto;
gap: 5px;
font-size: var(--font-size);
line-height: var(--line-height);
align-items: flex-start;
color: var(--font-color);
box-sizing: border-box;
text-decoration: none;
}
.test-link {
margin-bottom: 1px;
text-align: left;
}
.test-link:visited {
color: currentColor;
}
.test-link[aria-current='true'] {
--box-shadow-width: 1px;
--box-shadow-color: var(--passed-color);
box-shadow: 0 0 0 var(--box-shadow-width) var(--box-shadow-color) inset;
cursor: default;
}
.test-link[aria-current='true'][data-status='failed'] {
--box-shadow-color: var(--failed-color);
}
.test-link[data-status='failed'],
.test-link[data-status='unknown'],
.step[data-status='failed'] > .step__head,
.step[data-status='failed'] > .step__details > .step__head {
background-color: var(--failed-status-bg-color);
}
.step > .step__details > .step__head:hover,
.step-attachment__title:hover,
.test-link:hover:not([aria-current='true']),
.tests-directory > .tests-directory__title:hover {
background-color: var(--item-hover-bg-color);
}
.tests-directory__title,
.step__details > .step__head {
cursor: pointer;
}
.tests-directory__title {
margin-bottom: 1px;
position: relative;
}
.step__screenshot-button,
.screenshot-dialog__close {
--transition-outline-offset: outline-offset 0.05s linear, box-shadow 0.15s ease-in;
}
.step__screenshot-button {
all: unset;
display: inline-block;
max-width: 100%;
margin: 0 2px;
padding: 2px;
overflow: hidden;
border-radius: var(--main-radius);
line-height: 0;
color: var(--font-color);
outline: 2px solid transparent;
cursor: pointer;
}
.step__screenshot-button > img {
display: block;
max-width: 100%;
}
.step__screenshot-button:hover,
.screenshot-dialog__close:hover {
box-shadow: 0 0 0 1px currentColor;
}
.tests-directory[open] > .tests-directory__title,
.step-attachment[open] > .step-attachment__title {
margin-bottom: var(--margin-bottom);
}
.step__head::before,
.tests-directory__title::before,
.test-link::before {
margin-right: var(--icon-margin-right);
position: relative;
top: calc(var(--half-line-height) - var(--icon-size-without-offset) / 2);
}
.tests-directory__title::before {
--border-width: 1px;
--offset: 3px;
--icon-line-width: 1px;
color: var(--tests-group-line-color);
border-radius: 1px;
background-image:
linear-gradient(
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
),
linear-gradient(
90deg,
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
);
}
.tests-directory[open] > .tests-directory__title::after {
content: '';
position: absolute;
top: calc(var(--half-line-height) + var(--test-link-padding-top-bottom) + var(--icon-size) / 2);
left: calc(var(--test-link-padding-left-right) + var(--test-link-half-icon-width));
bottom: calc(-1 * var(--margin-bottom));
display: block;
width: 0;
border-left: var(--line-width) solid var(--tests-group-line-color);
z-index: 10;
}
.test-link:hover::before,
.step__details > .step__head:hover::before,
.screenshot-dialog__close:hover::before {
transform: scale(1.25);
}
.test-link__duration {
text-align: right;
color: var(--subtitle-color);
overflow: hidden;
overflow-wrap: break-word;
}
.test-link__name {
grid-row: 2;
grid-column: 1/-1;
overflow-wrap: break-word;
overflow: hidden;
text-align: left;
}
.tests-directory[data-status='failed'] > .tests-directory__title::before,
.tests-directory[data-status='failed'] > .tests-directory__title::after {
color: var(--failed-line-color);
border-color: currentColor;
}
.test-link__main-params {
font-family: monospace;
overflow-wrap: initial;
color: var(--main-params-color);
}
.test-link__main-params::after {
content: ' ';
white-space: pre;
}
.screenshot-dialog {
--padding: 10px;
--close-button-width: 38px;
max-width: 90vw;
max-height: 90vh;
padding: 0;
border: none;
overflow: hidden;
border-radius: var(--main-radius);
background: var(--secondary-bg-color);
box-shadow: 0 0 10px rgb(0, 0, 0, 0.3);
}
.screenshot-dialog[open] {
display: flex;
flex-direction: column;
}
.screenshot-dialog > h2 {
min-height: var(--close-button-width);
margin: 0;
padding: var(--padding) calc(var(--close-button-width) + 2 * var(--padding)) var(--padding)
var(--padding);
border-bottom: 1px solid var(--drag-container-bg-color);
white-space: nowrap;
overflow: hidden;
color: var(--font-color);
font-weight: normal;
line-height: var(--close-button-width);
text-overflow: ellipsis;
}
.screenshot-dialog::backdrop {
background: rgb(0, 0, 0, 0.5);
}
.screenshot-dialog__main {
padding: var(--padding);
overflow-y: auto;
text-align: center;
}
.screenshot-dialog__close {
position: absolute;
top: var(--padding);
right: var(--padding);
border: none;
width: var(--close-button-width);
aspect-ratio: 1;
border-radius: 3px;
color: var(--font-color);
}
.screenshot-dialog__close::before {
transition: transform 0.15s ease-in;
}
.step__screenshot-button:hover,
.screenshot-dialog__close:hover {
box-shadow: 0 0 0 1px currentColor;
}
.screenshot-dialog__close::before {
--icon-line-width: 2px;
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 18px;
aspect-ratio: 1;
background-image:
linear-gradient(
45deg,
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
),
linear-gradient(
135deg,
var(--transparent-color) calc(50% - var(--icon-line-width) / 2),
currentColor 0 calc(50% + var(--icon-line-width) / 2),
var(--transparent-color) 0
);
translate: -50% -50%;
}
dialog > img {
width: auto;
height: auto;
display: block;
}
[popover] {
border: none;
margin-inline: auto;
inset-inline: 0;
inset-block-start: 50%;
transform: translateY(-200%);
padding: 10px 40px;
background-color: #ffffff;
color: #000000;
}
.step__popover-button {
position: absolute;
top: 0;
bottom: 0;
z-index: 5;
width: var(--popover-button-width);
padding: 0;
border: none;
border-radius: var(--main-radius);
background: none;
translate: -100% 0;
}
.steps-group > .step:not(:last-child):has(> .step__details[open] > .steps-group) {
margin-bottom: calc(-1 * var(--timeline-top-offset));
padding-bottom: 0;
}
.steps-group > .step:not(:last-child):has(> .step__details[open] > .steps-group)::after {
bottom: 0;
}
.step__popover-button:focus,
.step__popover-button:active,
.step__popover-button:hover {
box-sizing: border-box;
cursor: pointer;
background-color: transparent;
background: none;
outline: none;
}
button,
.retry-link,
.test-link,
.tests-directory__title,
.step__details > .step__head,
.step-attachment__title,
.step__popover-button:focus-visible {
--transition-outline-offset: outline-offset 0.05s linear;
outline: 2px solid transparent;
transition: var(--transition-outline-offset);
}
.tests-directory__title,
.step__details > .step__head,
.step-attachment__title {
--margin-bottom: 5px;
transition:
margin-bottom 0.1s ease-in,
var(--transition-outline-offset);
}
button:focus-visible,
.retry-link:focus-visible,
.test-link:focus-visible,
.tests-directory__title:focus-visible,
.step__details > .step__head:focus-visible,
.step-attachment__title:focus-visible,
.step__popover-button:focus-visible {
outline-color: var(--accent-color);
outline-offset: -2px;
}
@container (min-width: 350px) {
.test-link__name,
.step__name {
grid-column: 2;
grid-row: 1;
}
}
@media (min-width: 390px) {
body {
height: 100vh;
}
.main {
flex-direction: row;
}
.column-2 {
overflow-y: auto;
width: calc(40% - var(--drag-container-width));
}
.column-3 {
overflow-y: auto;
will-change: transform;
flex: 1 0 180px;
}
.drag-container {
position: relative;
display: block;
width: var(--drag-container-width);
height: 100%;
cursor: ew-resize;
background-color: var(--drag-container-bg-color);
border-radius: var(--main-radius);
flex-shrink: 0;
}
.drag-container::after {
content: '';
width: 2px;
position: absolute;
top: 0;
bottom: 0;
left: 50%;
translate: -50% 0;
}
.drag-container:hover::after {
background-color: var(--font-color);
}
.test-details__title {
font-size: 24px;
line-height: 32px;
}
.test-details__title .color-cell {
font-size: 21px;
}
.test-link[aria-current='true'] {
--offset: calc(-1 * (var(--box-shadow-width) + 1px));
margin-right: var(--offset);
padding-right: calc(
var(--test-link-padding-left-right) + var(--test-link-margin-left-right) - var(--offset)
);
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
}
@media (min-width: 769px) {
body {
grid-template-areas: 'header header' 'column-1 main';
grid-template-columns: auto 1fr;
grid-template-rows: auto 1fr;
}
.header {
padding: 15px;
grid-column-start: 1;
grid-column-end: 3;
height: var(--header-height);
}
.column-1 {
position: sticky;
top: 0px;
padding-bottom: 25px;
width: 120px;
max-height: 100vh;
overflow-y: scroll;
}
.retry-links,
.test-details {
margin-bottom: var(--header-height);
}
.retry-links {
max-width: 100%;
flex-direction: column;
overflow-x: hidden;
}
.retry-link[aria-current] {
box-shadow: 3px 0 0 0 var(--accent-color) inset;
}
}
@media (min-width: 1367px) {
.retry-link,
.test-link,
.tests-directory__title,
.test-tabs__button {
min-height: auto;
}
}