UNPKG

e2ed

Version:

E2E testing framework over Playwright

1,462 lines (1,433 loc) 38.7 kB
: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; } }