chore: publish from main

This commit is contained in:
github-actions[bot]
2026-08-06 12:30:14 +00:00
parent ca17038502
commit e321e4a9c7
775 changed files with 72454 additions and 1180 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,762 @@
.ap-default-term-ff {
--term-font-family: "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace, "Symbols Nerd Font";
}
div.ap-wrapper {
outline: none;
height: 100%;
display: flex;
justify-content: center;
}
div.ap-wrapper .title-bar {
display: none;
top: -78px;
transition: top 0.15s linear;
position: absolute;
left: 0;
right: 0;
box-sizing: content-box;
font-size: 20px;
line-height: 1em;
padding: 15px;
font-family: sans-serif;
color: white;
background-color: rgba(0, 0, 0, 0.8);
}
div.ap-wrapper .title-bar img {
vertical-align: middle;
height: 48px;
margin-right: 16px;
}
div.ap-wrapper .title-bar a {
color: white;
text-decoration: underline;
}
div.ap-wrapper .title-bar a:hover {
text-decoration: none;
}
div.ap-wrapper:fullscreen {
background-color: #000;
width: 100%;
align-items: center;
}
div.ap-wrapper:fullscreen .title-bar {
display: initial;
}
div.ap-wrapper:fullscreen.hud .title-bar {
top: 0;
}
div.ap-wrapper div.ap-player {
text-align: left;
display: inline-block;
padding: 0px;
position: relative;
box-sizing: content-box;
overflow: hidden;
max-width: 100%;
border-radius: 4px;
font-size: 15px;
background-color: var(--term-color-background);
}
.ap-player {
--term-color-foreground: #ffffff;
--term-color-background: #000000;
--term-color-0: var(--term-color-foreground);
--term-color-1: var(--term-color-foreground);
--term-color-2: var(--term-color-foreground);
--term-color-3: var(--term-color-foreground);
--term-color-4: var(--term-color-foreground);
--term-color-5: var(--term-color-foreground);
--term-color-6: var(--term-color-foreground);
--term-color-7: var(--term-color-foreground);
--term-color-8: var(--term-color-0);
--term-color-9: var(--term-color-1);
--term-color-10: var(--term-color-2);
--term-color-11: var(--term-color-3);
--term-color-12: var(--term-color-4);
--term-color-13: var(--term-color-5);
--term-color-14: var(--term-color-6);
--term-color-15: var(--term-color-7);
}
div.ap-term {
position: relative;
font-family: var(--term-font-family);
border-width: 0.75em;
border-radius: 0;
border-style: solid;
border-color: var(--term-color-background);
box-sizing: content-box;
}
div.ap-term canvas {
position: absolute;
inset: 0;
display: block;
width: 100%;
height: 100%;
}
div.ap-term svg.ap-term-symbols {
position: absolute;
inset: 0;
display: block;
width: 100%;
height: 100%;
overflow: hidden;
pointer-events: none;
}
div.ap-term svg.ap-term-symbols use {
color: var(--term-color-foreground);
}
div.ap-term svg.ap-term-symbols:not(.ap-blink) .ap-blink {
opacity: 0;
}
div.ap-term pre.ap-term-text {
position: absolute;
inset: 0;
box-sizing: content-box;
overflow: hidden;
padding: 0;
margin: 0px;
display: block;
white-space: pre;
word-wrap: normal;
word-break: normal;
cursor: text;
color: var(--term-color-foreground);
outline: none;
line-height: var(--term-line-height);
font-family: inherit;
font-size: inherit;
font-variant-ligatures: none;
border: 0;
border-radius: 0;
background-color: transparent !important;
}
pre.ap-term-text .ap-line {
display: block;
width: 100%;
height: var(--term-line-height);
position: absolute;
top: calc(100% * var(--row) / var(--term-rows));
letter-spacing: normal;
overflow: hidden;
}
pre.ap-term-text .ap-line span {
position: absolute;
left: calc(100% * var(--offset) / var(--term-cols));
padding: 0;
display: inline-block;
height: 100%;
}
pre.ap-term-text:not(.ap-blink) .ap-line .ap-blink {
color: transparent;
border-color: transparent;
}
pre.ap-term-text .ap-bold {
font-weight: bold;
}
pre.ap-term-text .ap-faint {
opacity: 0.5;
}
pre.ap-term-text .ap-underline {
text-decoration: underline;
}
pre.ap-term-text .ap-italic {
font-style: italic;
}
pre.ap-term-text .ap-strike {
text-decoration: line-through;
}
.ap-line span {
color: var(--term-color-foreground);
}
div.ap-player div.ap-control-bar {
width: 100%;
height: 32px;
display: flex;
justify-content: space-between;
align-items: stretch;
color: var(--term-color-foreground);
box-sizing: content-box;
line-height: 1;
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
transition: opacity 0.15s linear;
user-select: none;
border-top: 2px solid color-mix(in oklab, var(--term-color-background) 80%, var(--term-color-foreground));
z-index: 30;
}
div.ap-player div.ap-control-bar * {
box-sizing: inherit;
}
div.ap-control-bar svg.ap-icon path {
fill: var(--term-color-foreground);
}
div.ap-control-bar button.ap-button {
display: flex;
flex: 0 0 auto;
cursor: pointer;
appearance: none;
-webkit-appearance: none;
background: transparent;
border: 0;
margin: 0;
padding: 0;
color: inherit;
font: inherit;
line-height: inherit;
}
div.ap-control-bar button.ap-playback-button {
width: 12px;
height: 12px;
padding: 10px;
margin: 0 0 0 2px;
}
div.ap-control-bar button.ap-playback-button svg {
height: 12px;
width: 12px;
}
div.ap-control-bar span.ap-timer {
display: flex;
flex: 0 0 auto;
min-width: 50px;
margin: 0 10px;
height: 100%;
text-align: center;
font-size: 13px;
line-height: 100%;
cursor: default;
}
div.ap-control-bar span.ap-timer span {
font-family: var(--term-font-family);
font-size: inherit;
font-weight: 600;
margin: auto;
}
div.ap-control-bar span.ap-timer .ap-time-remaining {
display: none;
}
div.ap-control-bar span.ap-timer:hover .ap-time-elapsed {
display: none;
}
div.ap-control-bar span.ap-timer:hover .ap-time-remaining {
display: flex;
}
div.ap-control-bar .ap-progressbar {
display: block;
flex: 1 1 auto;
height: 100%;
padding: 0 10px;
}
div.ap-control-bar .ap-progressbar .ap-bar {
display: block;
position: relative;
cursor: default;
height: 100%;
font-size: 0;
}
div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter {
display: block;
position: absolute;
top: 15px;
left: 0;
right: 0;
height: 3px;
}
div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter-empty {
background-color: color-mix(in oklab, var(--term-color-foreground) 20%, var(--term-color-background));
}
div.ap-control-bar .ap-progressbar .ap-bar .ap-gutter-full {
width: 100%;
transform-origin: left center;
background-color: var(--term-color-foreground);
border-radius: 3px;
}
div.ap-control-bar.ap-seekable .ap-progressbar .ap-bar {
cursor: pointer;
}
div.ap-control-bar button.ap-fullscreen-button {
width: 14px;
height: 14px;
padding: 9px;
margin: 0 2px 0 4px;
}
div.ap-control-bar button.ap-fullscreen-button svg {
width: 14px;
height: 14px;
}
div.ap-control-bar button.ap-fullscreen-button svg.ap-icon-fullscreen-on {
display: inline;
}
div.ap-control-bar button.ap-fullscreen-button svg.ap-icon-fullscreen-off {
display: none;
}
div.ap-control-bar button.ap-fullscreen-button .ap-tooltip {
right: 5px;
left: initial;
transform: none;
}
div.ap-control-bar button.ap-kbd-button {
height: 14px;
padding: 9px;
margin: 0 0 0 4px;
}
div.ap-control-bar button.ap-kbd-button svg {
width: 26px;
height: 14px;
}
div.ap-control-bar button.ap-kbd-button .ap-tooltip {
right: 5px;
left: initial;
transform: none;
}
div.ap-control-bar button.ap-speaker-button {
width: 19px;
padding: 6px 9px;
margin: 0 0 0 4px;
position: relative;
}
div.ap-control-bar button.ap-speaker-button svg {
width: 19px;
}
div.ap-control-bar button.ap-speaker-button .ap-tooltip {
left: -50%;
transform: none;
}
div.ap-wrapper.ap-hud .ap-control-bar {
opacity: 1;
}
div.ap-wrapper:fullscreen button.ap-fullscreen-button svg.ap-icon-fullscreen-on {
display: none;
}
div.ap-wrapper:fullscreen button.ap-fullscreen-button svg.ap-icon-fullscreen-off {
display: inline;
}
span.ap-progressbar span.ap-marker-container {
display: block;
top: 0;
bottom: 0;
width: 21px;
position: absolute;
margin-left: -10px;
}
span.ap-marker-container span.ap-marker {
display: block;
top: 13px;
bottom: 12px;
left: 7px;
right: 7px;
background-color: color-mix(in oklab, var(--term-color-foreground) 33%, var(--term-color-background));
position: absolute;
transition: top 0.1s, bottom 0.1s, left 0.1s, right 0.1s, background-color 0.1s;
border-radius: 50%;
}
span.ap-marker-container span.ap-marker.ap-marker-past {
background-color: var(--term-color-foreground);
}
span.ap-marker-container span.ap-marker:hover,
span.ap-marker-container:hover span.ap-marker {
background-color: var(--term-color-foreground);
top: 11px;
bottom: 10px;
left: 5px;
right: 5px;
}
.ap-tooltip-container span.ap-tooltip {
visibility: hidden;
background-color: var(--term-color-foreground);
color: var(--term-color-background);
font-family: var(--term-font-family);
font-weight: bold;
text-align: center;
padding: 0 0.5em;
border-radius: 4px;
position: absolute;
z-index: 1;
white-space: nowrap;
/* Prevents the text from wrapping and makes sure the tooltip width adapts to the text length */
font-size: 13px;
line-height: 2em;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
}
.ap-tooltip-container:hover span.ap-tooltip {
visibility: visible;
}
.ap-player .ap-overlay {
z-index: 10;
background-repeat: no-repeat;
background-position: center;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
justify-content: center;
align-items: center;
}
.ap-player .ap-overlay-start {
cursor: pointer;
}
.ap-player .ap-overlay-start .ap-play-button {
font-size: 0px;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
text-align: center;
color: white;
height: 80px;
max-height: 66%;
margin: auto;
}
.ap-player .ap-overlay-start .ap-play-button div {
height: 100%;
}
.ap-player .ap-overlay-start .ap-play-button div span {
height: 100%;
display: block;
}
.ap-player .ap-overlay-start .ap-play-button div span svg {
height: 100%;
display: inline-block;
}
.ap-player .ap-overlay-start .ap-play-button svg {
filter: drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.4));
}
.ap-player .ap-overlay-loading .ap-loader {
width: 48px;
height: 48px;
border-radius: 50%;
display: inline-block;
position: relative;
border: 10px solid;
border-color: rgba(255, 255, 255, 0.3) rgba(255, 255, 255, 0.5) rgba(255, 255, 255, 0.7) #ffffff;
border-color: color-mix(in srgb, var(--term-color-foreground) 30%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 50%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 70%, var(--term-color-background)) color-mix(in srgb, var(--term-color-foreground) 100%, var(--term-color-background));
box-sizing: border-box;
animation: ap-loader-rotation 1s linear infinite;
}
.ap-player .ap-overlay-info {
background-color: var(--term-color-background);
}
.ap-player .ap-overlay-info span {
font-family: var(--term-font-family);
font-size: 2em;
font-weight: bold;
color: var(--term-color-background);
background-color: var(--term-color-foreground);
padding: 0.5em 0.75em;
text-transform: uppercase;
}
.ap-player .ap-overlay-keystrokes {
position: absolute;
top: auto;
left: auto;
right: 20px;
bottom: var(--ap-keystrokes-bottom);
z-index: 20;
width: auto;
height: auto;
font-size: 18px;
text-align: right;
padding: 0;
display: flex;
justify-content: flex-end;
align-items: center;
gap: 0.35em;
pointer-events: none;
}
.ap-player .ap-overlay-keystrokes .ap-keystroke-pill {
font-family: var(--term-font-family);
font-size: inherit;
opacity: 1;
transition: opacity 80ms ease;
}
.ap-player .ap-overlay-keystrokes .ap-keystroke-pill kbd {
display: inline-flex;
justify-content: center;
min-width: 1.2em;
color: var(--term-color-background);
background-color: var(--term-color-foreground);
padding: 0.3em 0.5em;
border-radius: 0.2em;
font-family: inherit;
font-size: 0.85em;
font-weight: 600;
border: none;
margin: 0;
}
.ap-player .ap-overlay-keystrokes .ap-keystroke-pill.fading {
opacity: 0;
transition: opacity 700ms ease;
}
.ap-player .ap-overlay-help {
background-color: rgba(0, 0, 0, 0.8);
container-type: inline-size;
}
.ap-player .ap-overlay-help > div {
font-family: var(--term-font-family);
max-width: 85%;
max-height: 85%;
font-size: 18px;
color: var(--term-color-foreground);
box-sizing: border-box;
margin-bottom: 32px;
}
.ap-player .ap-overlay-help > div div {
padding: calc(min(4cqw, 40px));
font-size: calc(min(1.9cqw, 18px));
background-color: var(--term-color-background);
border: 1px solid color-mix(in oklab, var(--term-color-background) 90%, var(--term-color-foreground));
border-radius: 6px;
}
.ap-player .ap-overlay-help > div div p {
font-weight: bold;
margin: 0 0 2em 0;
}
.ap-player .ap-overlay-help > div div ul {
list-style: none;
padding: 0;
}
.ap-player .ap-overlay-help > div div ul li {
margin: 0 0 0.75em 0;
}
.ap-player .ap-overlay-help > div div kbd {
color: var(--term-color-background);
background-color: var(--term-color-foreground);
padding: 0.2em 0.5em;
border-radius: 0.2em;
font-family: inherit;
font-size: 0.85em;
border: none;
margin: 0;
}
.ap-player .ap-overlay-error span {
font-size: 8em;
}
.ap-player .slide-enter-active {
transition: opacity 0.2s;
}
.ap-player .slide-enter-active.ap-was-playing {
transition: top 0.2s ease-out, opacity 0.2s;
}
.ap-player .slide-exit-active {
transition: top 0.2s ease-in, opacity 0.2s;
}
.ap-player .slide-enter {
top: -50%;
opacity: 0;
}
.ap-player .slide-enter-to {
top: 0%;
}
.ap-player .slide-enter,
.ap-player .slide-enter-to,
.ap-player .slide-exit,
.ap-player .slide-exit-to {
bottom: auto;
height: 100%;
}
.ap-player .slide-exit {
top: 0%;
}
.ap-player .slide-exit-to {
top: -50%;
opacity: 0;
}
@keyframes ap-loader-rotation {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.asciinema-player-theme-asciinema {
--term-color-foreground: #cccccc;
--term-color-background: #121314;
--term-color-0: #000000;
--term-color-1: #dd3c69;
--term-color-2: #4ebf22;
--term-color-3: #ddaf3c;
--term-color-4: #26b0d7;
--term-color-5: #b954e1;
--term-color-6: #54e1b9;
--term-color-7: #d9d9d9;
--term-color-8: #4d4d4d;
--term-color-9: #dd3c69;
--term-color-10: #4ebf22;
--term-color-11: #ddaf3c;
--term-color-12: #26b0d7;
--term-color-13: #b954e1;
--term-color-14: #54e1b9;
--term-color-15: #ffffff;
}
/*
Based on Dracula: https://draculatheme.com
*/
.asciinema-player-theme-dracula {
--term-color-foreground: #f8f8f2;
--term-color-background: #282a36;
--term-color-0: #21222c;
--term-color-1: #ff5555;
--term-color-2: #50fa7b;
--term-color-3: #f1fa8c;
--term-color-4: #bd93f9;
--term-color-5: #ff79c6;
--term-color-6: #8be9fd;
--term-color-7: #f8f8f2;
--term-color-8: #6272a4;
--term-color-9: #ff6e6e;
--term-color-10: #69ff94;
--term-color-11: #ffffa5;
--term-color-12: #d6acff;
--term-color-13: #ff92df;
--term-color-14: #a4ffff;
--term-color-15: #ffffff;
}
/* Based on Monokai from base16 collection - https://github.com/chriskempson/base16 */
.asciinema-player-theme-monokai {
--term-color-foreground: #f8f8f2;
--term-color-background: #272822;
--term-color-0: #272822;
--term-color-1: #f92672;
--term-color-2: #a6e22e;
--term-color-3: #f4bf75;
--term-color-4: #66d9ef;
--term-color-5: #ae81ff;
--term-color-6: #a1efe4;
--term-color-7: #f8f8f2;
--term-color-8: #75715e;
--term-color-15: #f9f8f5;
}
/*
Based on Nord: https://github.com/arcticicestudio/nord
Via: https://github.com/neilotoole/asciinema-theme-nord
*/
.asciinema-player-theme-nord {
--term-color-foreground: #eceff4;
--term-color-background: #2e3440;
--term-color-0: #3b4252;
--term-color-1: #bf616a;
--term-color-2: #a3be8c;
--term-color-3: #ebcb8b;
--term-color-4: #81a1c1;
--term-color-5: #b48ead;
--term-color-6: #88c0d0;
--term-color-7: #eceff4;
}
.asciinema-player-theme-seti {
--term-color-foreground: #cacecd;
--term-color-background: #111213;
--term-color-0: #323232;
--term-color-1: #c22832;
--term-color-2: #8ec43d;
--term-color-3: #e0c64f;
--term-color-4: #43a5d5;
--term-color-5: #8b57b5;
--term-color-6: #8ec43d;
--term-color-7: #eeeeee;
--term-color-15: #ffffff;
}
/*
Based on Solarized Dark: https://ethanschoonover.com/solarized/
*/
.asciinema-player-theme-solarized-dark {
--term-color-foreground: #839496;
--term-color-background: #002b36;
--term-color-0: #073642;
--term-color-1: #dc322f;
--term-color-2: #859900;
--term-color-3: #b58900;
--term-color-4: #268bd2;
--term-color-5: #d33682;
--term-color-6: #2aa198;
--term-color-7: #eee8d5;
--term-color-8: #002b36;
--term-color-9: #cb4b16;
--term-color-10: #586e75;
--term-color-11: #657b83;
--term-color-12: #839496;
--term-color-13: #6c71c4;
--term-color-14: #93a1a1;
--term-color-15: #fdf6e3;
}
/*
Based on Solarized Light: https://ethanschoonover.com/solarized/
*/
.asciinema-player-theme-solarized-light {
--term-color-foreground: #657b83;
--term-color-background: #fdf6e3;
--term-color-0: #073642;
--term-color-1: #dc322f;
--term-color-2: #859900;
--term-color-3: #b58900;
--term-color-4: #268bd2;
--term-color-5: #d33682;
--term-color-6: #2aa198;
--term-color-7: #eee8d5;
--term-color-8: #002b36;
--term-color-9: #cb4b16;
--term-color-10: #586e75;
--term-color-11: #657c83;
--term-color-12: #839496;
--term-color-13: #6c71c4;
--term-color-14: #93a1a1;
--term-color-15: #fdf6e3;
}
.asciinema-player-theme-solarized-light .ap-overlay-start .ap-play-button svg .ap-play-btn-fill {
fill: var(--term-color-1);
}
.asciinema-player-theme-solarized-light .ap-overlay-start .ap-play-button svg .ap-play-btn-stroke {
stroke: var(--term-color-1);
}
/*
Based on Tango: https://en.wikipedia.org/wiki/Tango_Desktop_Project
*/
.asciinema-player-theme-tango {
--term-color-foreground: #cccccc;
--term-color-background: #121314;
--term-color-0: #000000;
--term-color-1: #cc0000;
--term-color-2: #4e9a06;
--term-color-3: #c4a000;
--term-color-4: #3465a4;
--term-color-5: #75507b;
--term-color-6: #06989a;
--term-color-7: #d3d7cf;
--term-color-8: #555753;
--term-color-9: #ef2929;
--term-color-10: #8ae234;
--term-color-11: #fce94f;
--term-color-12: #729fcf;
--term-color-13: #ad7fa8;
--term-color-14: #34e2e2;
--term-color-15: #eeeeec;
}
/*
Based on gruvbox: https://github.com/morhetz/gruvbox
*/
.asciinema-player-theme-gruvbox-dark {
--term-color-foreground: #fbf1c7;
--term-color-background: #282828;
--term-color-0: #282828;
--term-color-1: #cc241d;
--term-color-2: #98971a;
--term-color-3: #d79921;
--term-color-4: #458588;
--term-color-5: #b16286;
--term-color-6: #689d6a;
--term-color-7: #a89984;
--term-color-8: #7c6f65;
--term-color-9: #fb4934;
--term-color-10: #b8bb26;
--term-color-11: #fabd2f;
--term-color-12: #83a598;
--term-color-13: #d3869b;
--term-color-14: #8ec07c;
--term-color-15: #fbf1c7;
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v1.5A1.75 1.75 0 0 1 14.25 6H1.75A1.75 1.75 0 0 1 0 4.25ZM1.75 7a.75.75 0 0 1 .75.75v5.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-5.5a.75.75 0 0 1 1.5 0v5.5A1.75 1.75 0 0 1 13.25 15H2.75A1.75 1.75 0 0 1 1 13.25v-5.5A.75.75 0 0 1 1.75 7Zm0-4.5a.25.25 0 0 0-.25.25v1.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-1.5a.25.25 0 0 0-.25-.25ZM6.25 8h3.5a.75.75 0 0 1 0 1.5h-3.5a.75.75 0 0 1 0-1.5Z"/></svg>

After

Width:  |  Height:  |  Size: 560 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25ZM14.5 6h-13v7.25c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm-6-3.5v2h6V2.75a.25.25 0 0 0-.25-.25ZM5 2.5v2h2v-2Zm-3.25 0a.25.25 0 0 0-.25.25V4.5h2v-2Z"/></svg>

After

Width:  |  Height:  |  Size: 373 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm1.5 0a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm10.28-1.72-4.5 4.5a.75.75 0 0 1-1.06 0l-2-2a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l1.47 1.47 3.97-3.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"/></svg>

After

Width:  |  Height:  |  Size: 346 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"/></svg>

After

Width:  |  Height:  |  Size: 264 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"/></svg>

After

Width:  |  Height:  |  Size: 244 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M9.78 12.78a.75.75 0 0 1-1.06 0L4.47 8.53a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L6.06 8l3.72 3.72a.75.75 0 0 1 0 1.06Z"/></svg>

After

Width:  |  Height:  |  Size: 260 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"/></svg>

After

Width:  |  Height:  |  Size: 261 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7-3.25v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5a.75.75 0 0 1 1.5 0Z"/></svg>

After

Width:  |  Height:  |  Size: 281 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"/></svg>

After

Width:  |  Height:  |  Size: 427 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"/></svg>

After

Width:  |  Height:  |  Size: 435 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"/><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"/></svg>

After

Width:  |  Height:  |  Size: 427 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"/></svg>

After

Width:  |  Height:  |  Size: 749 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2a.75.75 0 0 1-1.5 0Zm-4 6C0 6.784.784 6 1.75 6h1.5C4.216 6 5 6.784 5 7.75v2.5A1.75 1.75 0 0 1 3.25 12h-1.5A1.75 1.75 0 0 1 0 10.25ZM6.75 6h1.5a.75.75 0 0 1 .75.75v3.75h.75a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5h.75v-3h-.75a.75.75 0 0 1 0-1.5Zm-5 1.5a.25.25 0 0 0-.25.25v2.5c0 .138.112.25.25.25h1.5a.25.25 0 0 0 .25-.25v-2.5a.25.25 0 0 0-.25-.25Zm9.75-5.938V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"/></svg>

After

Width:  |  Height:  |  Size: 763 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"/></svg>

After

Width:  |  Height:  |  Size: 748 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 2.75C0 1.784.784 1 1.75 1H5c.55 0 1.07.26 1.4.7l.9 1.2a.25.25 0 0 0 .2.1h6.75c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25Zm1.75-.25a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H7.5c-.55 0-1.07-.26-1.4-.7l-.9-1.2a.25.25 0 0 0-.2-.1Z"/></svg>

After

Width:  |  Height:  |  Size: 427 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M16 13.25A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25V2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75ZM1.75 2.5a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h.94l.03-.03 6.077-6.078a1.75 1.75 0 0 1 2.412-.06L14.5 10.31V2.75a.25.25 0 0 0-.25-.25Zm12.5 11a.25.25 0 0 0 .25-.25v-.917l-4.298-3.889a.25.25 0 0 0-.344.009L4.81 13.5ZM7 6a2 2 0 1 1-3.999.001A2 2 0 0 1 7 6ZM5.5 6a.5.5 0 1 0-1 0 .5.5 0 0 0 1 0Z"/></svg>

After

Width:  |  Height:  |  Size: 521 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M3.5 1.75v11.5c0 .09.048.173.126.217a.75.75 0 0 1-.752 1.298A1.748 1.748 0 0 1 2 13.25V1.75C2 .784 2.784 0 3.75 0h5.586c.464 0 .909.185 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 12.25 15h-.5a.75.75 0 0 1 0-1.5h.5a.25.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177L9.513 1.573a.25.25 0 0 0-.177-.073H7.25a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5h-3a.25.25 0 0 0-.25.25Zm3.75 8.75h.5c.966 0 1.75.784 1.75 1.75v3a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1-.75-.75v-3c0-.966.784-1.75 1.75-1.75ZM6 5.25a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 6 5.25Zm.75 2.25h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM8 6.75A.75.75 0 0 1 8.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 8 6.75ZM8.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM8 9.75A.75.75 0 0 1 8.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 8 9.75Zm-1 2.5v2.25h1v-2.25a.25.25 0 0 0-.25-.25h-.5a.25.25 0 0 0-.25.25Z"/></svg>

After

Width:  |  Height:  |  Size: 1012 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"/></svg>

After

Width:  |  Height:  |  Size: 451 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M.75 3h14.5a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1 0-1.5ZM3 7.75A.75.75 0 0 1 3.75 7h8.5a.75.75 0 0 1 0 1.5h-8.5A.75.75 0 0 1 3 7.75Zm3 4a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"/></svg>

After

Width:  |  Height:  |  Size: 307 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 0a8.2 8.2 0 0 1 .701.031C9.444.095 9.99.645 10.16 1.29l.288 1.107c.018.066.079.158.212.224.231.114.454.243.668.386.123.082.233.09.299.071l1.103-.303c.644-.176 1.392.021 1.82.63.27.385.506.792.704 1.218.315.675.111 1.422-.364 1.891l-.814.806c-.049.048-.098.147-.088.294.016.257.016.515 0 .772-.01.147.038.246.088.294l.814.806c.475.469.679 1.216.364 1.891a7.977 7.977 0 0 1-.704 1.217c-.428.61-1.176.807-1.82.63l-1.102-.302c-.067-.019-.177-.011-.3.071a5.909 5.909 0 0 1-.668.386c-.133.066-.194.158-.211.224l-.29 1.106c-.168.646-.715 1.196-1.458 1.26a8.006 8.006 0 0 1-1.402 0c-.743-.064-1.289-.614-1.458-1.26l-.289-1.106c-.018-.066-.079-.158-.212-.224a5.738 5.738 0 0 1-.668-.386c-.123-.082-.233-.09-.299-.071l-1.103.303c-.644.176-1.392-.021-1.82-.63a8.12 8.12 0 0 1-.704-1.218c-.315-.675-.111-1.422.363-1.891l.815-.806c.05-.048.098-.147.088-.294a6.214 6.214 0 0 1 0-.772c.01-.147-.038-.246-.088-.294l-.815-.806C.635 6.045.431 5.298.746 4.623a7.92 7.92 0 0 1 .704-1.217c.428-.61 1.176-.807 1.82-.63l1.102.302c.067.019.177.011.3-.071.214-.143.437-.272.668-.386.133-.066.194-.158.211-.224l.29-1.106C6.009.645 6.556.095 7.299.03 7.53.01 7.764 0 8 0Zm-.571 1.525c-.036.003-.108.036-.137.146l-.289 1.105c-.147.561-.549.967-.998 1.189-.173.086-.34.183-.5.29-.417.278-.97.423-1.529.27l-1.103-.303c-.109-.03-.175.016-.195.045-.22.312-.412.644-.573.99-.014.031-.021.11.059.19l.815.806c.411.406.562.957.53 1.456a4.709 4.709 0 0 0 0 .582c.032.499-.119 1.05-.53 1.456l-.815.806c-.081.08-.073.159-.059.19.162.346.353.677.573.989.02.03.085.076.195.046l1.102-.303c.56-.153 1.113-.008 1.53.27.161.107.328.204.501.29.447.222.85.629.997 1.189l.289 1.105c.029.109.101.143.137.146a6.6 6.6 0 0 0 1.142 0c.036-.003.108-.036.137-.146l.289-1.105c.147-.561.549-.967.998-1.189.173-.086.34-.183.5-.29.417-.278.97-.423 1.529-.27l1.103.303c.109.029.175-.016.195-.045.22-.313.411-.644.573-.99.014-.031.021-.11-.059-.19l-.815-.806c-.411-.406-.562-.957-.53-1.456a4.709 4.709 0 0 0 0-.582c-.032-.499.119-1.05.53-1.456l.815-.806c.081-.08.073-.159.059-.19a6.464 6.464 0 0 0-.573-.989c-.02-.03-.085-.076-.195-.046l-1.102.303c-.56.153-1.113.008-1.53-.27a4.44 4.44 0 0 0-.501-.29c-.447-.222-.85-.629-.997-1.189l-.289-1.105c-.029-.11-.101-.143-.137-.146a6.6 6.6 0 0 0-1.142 0ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM9.5 8a1.5 1.5 0 1 0-3.001.001A1.5 1.5 0 0 0 9.5 8Z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"/></svg>

After

Width:  |  Height:  |  Size: 513 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"/></svg>

After

Width:  |  Height:  |  Size: 227 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"/></svg>

After

Width:  |  Height:  |  Size: 495 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M6.766 11.328c-2.063-.25-3.516-1.734-3.516-3.656 0-.781.281-1.625.75-2.188-.203-.515-.172-1.609.063-2.062.625-.078 1.468.25 1.968.703.594-.187 1.219-.281 1.985-.281.765 0 1.39.094 1.953.265.484-.437 1.344-.765 1.969-.687.218.422.25 1.515.046 2.047.5.593.766 1.39.766 2.203 0 1.922-1.453 3.375-3.547 3.64.531.344.89 1.094.89 1.954v1.625c0 .468.391.734.86.547C13.781 14.359 16 11.53 16 8.03 16 3.61 12.406 0 7.984 0 3.563 0 0 3.61 0 8.031a7.88 7.88 0 0 0 5.172 7.422c.422.156.828-.125.828-.547v-1.25c-.219.094-.5.156-.75.156-1.031 0-1.64-.562-2.078-1.609-.172-.422-.36-.672-.719-.719-.187-.015-.25-.093-.25-.187 0-.188.313-.328.625-.328.453 0 .844.281 1.25.86.313.452.64.655 1.031.655s.641-.14 1-.5c.266-.265.47-.5.657-.656"/></svg>

After

Width:  |  Height:  |  Size: 822 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M14.85 3c.63 0 1.15.52 1.14 1.15v7.7c0 .63-.51 1.15-1.15 1.15H1.15C.52 13 0 12.48 0 11.84V4.15C0 3.52.52 3 1.15 3ZM9 11V5H7L5.5 7 4 5H2v6h2V8l1.5 1.92L7 8v3Zm2.99.5L14.5 8H13V5h-2v3H9.5Z"/></svg>

After

Width:  |  Height:  |  Size: 287 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"/></svg>

After

Width:  |  Height:  |  Size: 518 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M10.561 8.073a6.005 6.005 0 0 1 3.432 5.142.75.75 0 1 1-1.498.07 4.5 4.5 0 0 0-8.99 0 .75.75 0 0 1-1.498-.07 6.004 6.004 0 0 1 3.431-5.142 3.999 3.999 0 1 1 5.123 0ZM10.5 5a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z"/></svg>

After

Width:  |  Height:  |  Size: 310 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="m1.655.595 13.75 13.75q.22.219.22.53 0 .311-.22.53-.219.22-.53.22-.311 0-.53-.22L.595 1.655q-.22-.219-.22-.53 0-.311.22-.53.219-.22.53-.22.311 0 .53.22ZM.72 14.22l4.5-4.5q.219-.22.53-.22.311 0 .53.22.22.219.22.53 0 .311-.22.53l-4.5 4.5q-.219.22-.53.22-.311 0-.53-.22-.22-.219-.22-.53 0-.311.22-.53Z"/><path d="m5.424 6.146-1.759.419q-.143.034-.183.175-.04.141.064.245l5.469 5.469q.104.104.245.064.141-.04.175-.183l.359-1.509q.072-.302.337-.465.264-.163.567-.091.302.072.465.337.162.264.09.567l-.359 1.509q-.238.999-1.226 1.278-.988.28-1.714-.446L2.485 8.046q-.726-.726-.446-1.714.279-.988 1.278-1.226l1.759-.419q.303-.072.567.091.265.163.337.465.072.302-.091.567-.163.264-.465.336ZM7.47 3.47q.155-.156.247-.355l.751-1.627Q8.851.659 9.75.498q.899-.16 1.544.486l3.722 3.722q.646.645.486 1.544-.161.899-.99 1.282l-1.627.751q-.199.092-.355.247-.219.22-.53.22-.311 0-.53-.22-.22-.219-.22-.53 0-.311.22-.53.344-.345.787-.549l1.627-.751q.118-.055.141-.183.023-.128-.069-.221l-3.722-3.722q-.092-.092-.221-.069-.128.023-.183.141l-.751 1.627q-.204.443-.549.787-.219.22-.53.22-.311 0-.53-.22-.22-.219-.22-.53 0-.311.22-.53Z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="m11.294.984 3.722 3.722a1.75 1.75 0 0 1-.504 2.826l-1.327.613a3.089 3.089 0 0 0-1.707 2.084l-.584 2.454c-.317 1.332-1.972 1.8-2.94.832L5.75 11.311 1.78 15.28a.749.749 0 1 1-1.06-1.06l3.969-3.97-2.204-2.204c-.968-.968-.5-2.623.832-2.94l2.454-.584a3.08 3.08 0 0 0 2.084-1.707l.613-1.327a1.75 1.75 0 0 1 2.826-.504ZM6.283 9.723l2.732 2.731a.25.25 0 0 0 .42-.119l.584-2.454a4.586 4.586 0 0 1 2.537-3.098l1.328-.613a.25.25 0 0 0 .072-.404l-3.722-3.722a.25.25 0 0 0-.404.072l-.613 1.328a4.584 4.584 0 0 1-3.098 2.537l-2.454.584a.25.25 0 0 0-.119.42l2.731 2.732Z"/></svg>

After

Width:  |  Height:  |  Size: 657 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"/></svg>

After

Width:  |  Height:  |  Size: 289 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"/></svg>

After

Width:  |  Height:  |  Size: 474 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"/></svg>

After

Width:  |  Height:  |  Size: 277 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"/><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"/></svg>

After

Width:  |  Height:  |  Size: 465 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="m4.177 7.823 2.396-2.396A.25.25 0 0 1 7 5.604v4.792a.25.25 0 0 1-.427.177L4.177 8.177a.25.25 0 0 1 0-.354Z"/><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25H9.5v-13Zm12.5 13a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11v13Z"/></svg>

After

Width:  |  Height:  |  Size: 462 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Z"/></svg>

After

Width:  |  Height:  |  Size: 350 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"/></svg>

After

Width:  |  Height:  |  Size: 572 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M1.705 8.005a.75.75 0 0 1 .834.656 5.5 5.5 0 0 0 9.592 2.97l-1.204-1.204a.25.25 0 0 1 .177-.427h3.646a.25.25 0 0 1 .25.25v3.646a.25.25 0 0 1-.427.177l-1.38-1.38A7.002 7.002 0 0 1 1.05 8.84a.75.75 0 0 1 .656-.834ZM8 2.5a5.487 5.487 0 0 0-4.131 1.869l1.204 1.204A.25.25 0 0 1 4.896 6H1.25A.25.25 0 0 1 1 5.75V2.104a.25.25 0 0 1 .427-.177l1.38 1.38A7.002 7.002 0 0 1 14.95 7.16a.75.75 0 0 1-1.49.178A5.5 5.5 0 0 0 8 2.5Z"/></svg>

After

Width:  |  Height:  |  Size: 518 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25Zm1.75-.25a.25.25 0 0 0-.25.25v10.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V2.75a.25.25 0 0 0-.25-.25ZM7.25 8a.749.749 0 0 1-.22.53l-2.25 2.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L5.44 8 3.72 6.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.25 2.25c.141.14.22.331.22.53Zm1.5 1.5h3a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5Z"/></svg>

After

Width:  |  Height:  |  Size: 567 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"/></svg>

After

Width:  |  Height:  |  Size: 488 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"/></svg>

After

Width:  |  Height:  |  Size: 583 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M2.344 2.343h-.001a8 8 0 0 1 11.314 11.314A8.002 8.002 0 0 1 .234 10.089a8 8 0 0 1 2.11-7.746Zm1.06 10.253a6.5 6.5 0 1 0 9.108-9.275 6.5 6.5 0 0 0-9.108 9.275ZM6.03 4.97 8 6.94l1.97-1.97a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l1.97 1.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-1.97 1.97a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L6.94 8 4.97 6.03a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018Z"/></svg>

After

Width:  |  Height:  |  Size: 539 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"/></svg>

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,768 @@
(() => {
"use strict";
const MAX_RENDERED_RESULTS = 2_000;
const MAX_DETAIL_CHARS = 24_000;
const MAX_HIGHLIGHTED_RAW_CHARS = 4 * 1024 * 1024;
const rawSources = new WeakMap();
function escapeHtml(value) {
return String(value ?? "")
.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll('"', "&quot;")
.replaceAll("'", "&#39;");
}
function icon(name) {
const safeName = /^[a-z-]+$/.test(name) ? name : "file";
return `<span class="octicon icon-${safeName}" aria-hidden="true"></span>`;
}
function formatDate(value) {
const date = new Date(value);
return Number.isNaN(date.getTime())
? ""
: new Intl.DateTimeFormat(undefined, {
dateStyle: "medium",
timeStyle: "short",
}).format(date);
}
function elements(parent, localName) {
if (!parent?.getElementsByTagName) return [];
return [...parent.getElementsByTagName("*")].filter(
(element) => element.localName === localName,
);
}
function firstElement(parent, localName) {
return elements(parent, localName)[0] ?? null;
}
function directChild(parent, localName) {
return (
[...(parent?.children ?? [])].find(
(element) => element.localName === localName,
) ?? null
);
}
function elementText(element) {
return String(element?.textContent ?? "").trim();
}
function attribute(element, name) {
return String(element?.getAttribute(name) ?? "").trim();
}
function outcomeCategory(outcome) {
const normalized = String(outcome ?? "")
.toLocaleLowerCase()
.replace(/[^a-z]/g, "");
if (normalized === "passed") return "passed";
if (
[
"failed",
"error",
"timeout",
"aborted",
"passedbutrunaborted",
"disconnected",
].includes(normalized)
) {
return "failed";
}
if (
["notexecuted", "notrunnable", "inconclusive", "pending"].includes(
normalized,
)
) {
return "skipped";
}
return "other";
}
function outcomeIcon(category) {
if (category === "passed") return "check-circle";
if (category === "failed") return "x-circle";
if (category === "skipped") return "clock";
return "workflow";
}
const KNOWN_TRX_OUTCOMES = new Set([
"passed", "failed", "completed", "error", "warning",
"inconclusive", "aborted", "timeout", "inprogress", "notexecuted",
]);
function summarizedRunOutcome(report) {
const normalized = String(report.outcome ?? "").toLowerCase();
if (!KNOWN_TRX_OUTCOMES.has(normalized) || normalized === "completed") {
if (report.summaryCounts.failed > 0) return "Failed";
if (report.summaryCounts.passed > 0) return "Passed";
if (report.summaryCounts.skipped > 0) return "Skipped";
}
return report.outcome;
}
function parseDuration(value) {
const duration = String(value ?? "").trim();
if (!duration) return null;
const clock = duration.match(
/^(?:(\d+)\.)?(\d{1,2}):(\d{2}):(\d{2}(?:\.\d+)?)$/,
);
if (clock) {
const [, days = "0", hours, minutes, seconds] = clock;
return (
Number(days) * 86_400_000 +
Number(hours) * 3_600_000 +
Number(minutes) * 60_000 +
Number(seconds) * 1_000
);
}
const iso = duration.match(
/^P(?:(\d+(?:\.\d+)?)D)?(?:T(?:(\d+(?:\.\d+)?)H)?(?:(\d+(?:\.\d+)?)M)?(?:(\d+(?:\.\d+)?)S)?)?$/i,
);
if (!iso) return null;
const [, days = "0", hours = "0", minutes = "0", seconds = "0"] = iso;
return (
Number(days) * 86_400_000 +
Number(hours) * 3_600_000 +
Number(minutes) * 60_000 +
Number(seconds) * 1_000
);
}
function formatDuration(durationMs) {
if (!Number.isFinite(durationMs)) return "";
if (durationMs < 1_000) {
return `${Math.max(0, Math.round(durationMs))} ms`;
}
if (durationMs < 60_000) {
const seconds = durationMs / 1_000;
return `${seconds
.toFixed(seconds < 10 ? 2 : 1)
.replace(/\.0+$|(\.\d*[1-9])0+$/, "$1")} s`;
}
if (durationMs < 3_600_000) {
const minutes = Math.floor(durationMs / 60_000);
const seconds = Math.floor((durationMs % 60_000) / 1_000);
return `${minutes}m ${seconds}s`;
}
const hours = Math.floor(durationMs / 3_600_000);
const minutes = Math.floor((durationMs % 3_600_000) / 60_000);
return `${hours}h ${minutes}m`;
}
function parseReport(value) {
const source = String(value ?? "");
if (/<!DOCTYPE|<!ENTITY/i.test(source)) {
throw new Error(
"DTD and entity declarations are not supported in test result previews.",
);
}
const documentNode = new DOMParser().parseFromString(
source,
"application/xml",
);
const parserError = [...documentNode.getElementsByTagName("*")].find(
(element) => element.localName?.toLocaleLowerCase() === "parsererror",
);
if (parserError) {
const detail = elementText(parserError).replace(/\s+/g, " ").slice(0, 240);
throw new Error(detail || "The XML document is malformed.");
}
const root = documentNode.documentElement;
if (root?.localName !== "TestRun") {
throw new Error(
"The XML document does not contain a TRX TestRun root element.",
);
}
const definitions = new Map();
for (const unitTest of elements(root, "UnitTest")) {
const testId = attribute(unitTest, "id").toLocaleLowerCase();
if (!testId) continue;
const method = firstElement(unitTest, "TestMethod");
definitions.set(testId, {
name: attribute(unitTest, "name"),
className: attribute(method, "className"),
methodName: attribute(method, "name"),
codeBase: attribute(method, "codeBase"),
adapterTypeName: attribute(method, "adapterTypeName"),
});
}
const testLists = new Map();
for (const testList of elements(root, "TestList")) {
const id = attribute(testList, "id").toLocaleLowerCase();
if (id) testLists.set(id, attribute(testList, "name"));
}
const results = [];
const resultsElement = directChild(root, "Results");
const isResultElement = (element) =>
element.localName?.endsWith("TestResult") ||
element.localName === "TestResultAggregation";
const readResult = (element, depth) => {
const testId = attribute(element, "testId").toLocaleLowerCase();
const definition = definitions.get(testId) ?? {};
const output = directChild(element, "Output");
const errorInfo = firstElement(output, "ErrorInfo");
const outcome = attribute(element, "outcome") || "Unknown";
const testListId = attribute(element, "testListId").toLocaleLowerCase();
const durationValue = attribute(element, "duration");
const resultFiles = elements(output, "ResultFile")
.map((file) => attribute(file, "path"))
.filter(Boolean);
const properties = elements(output, "Property")
.map((property) => {
const key =
elementText(directChild(property, "Key")) ||
attribute(property, "name");
const propertyValue =
elementText(directChild(property, "Value")) ||
attribute(property, "value");
return key ? { key, value: propertyValue } : null;
})
.filter(Boolean);
return {
depth,
outcome,
category: outcomeCategory(outcome),
testName:
attribute(element, "testName") ||
definition.name ||
definition.methodName ||
"Unnamed test",
className: definition.className || attribute(element, "className"),
methodName: definition.methodName,
codeBase: definition.codeBase,
adapterTypeName: definition.adapterTypeName,
computerName: attribute(element, "computerName"),
startTime: attribute(element, "startTime"),
endTime: attribute(element, "endTime"),
durationMs: parseDuration(durationValue),
executionId: attribute(element, "executionId"),
testId: attribute(element, "testId"),
testListName: testLists.get(testListId) ?? "",
dataRowInfo: attribute(element, "dataRowInfo"),
message: elementText(firstElement(errorInfo, "Message")),
stackTrace: elementText(firstElement(errorInfo, "StackTrace")),
stdout: elementText(firstElement(output, "StdOut")),
stderr: elementText(firstElement(output, "StdErr")),
debugTrace: elementText(firstElement(output, "DebugTrace")),
resultFiles,
properties,
};
};
const visitResults = (parent, depth = 0) => {
for (const element of parent?.children ?? []) {
if (!isResultElement(element)) continue;
results.push(readResult(element, depth));
const innerResults = directChild(element, "InnerResults");
if (innerResults) visitResults(innerResults, depth + 1);
}
};
visitResults(resultsElement);
const countersElement = firstElement(root, "Counters");
const counters = {};
for (const counterAttribute of countersElement?.attributes ?? []) {
const number = Number(counterAttribute.value);
if (Number.isFinite(number) && number >= 0) {
counters[counterAttribute.name] = number;
}
}
const resultCounts = results.reduce(
(counts, result) => {
counts[result.category] += 1;
return counts;
},
{ passed: 0, failed: 0, skipped: 0, other: 0 },
);
const sumCounters = (names, fallback) => {
const values = names
.filter((name) => Number.isFinite(counters[name]))
.map((name) => counters[name]);
return values.length > 0
? values.reduce((total, number) => total + number, 0)
: fallback;
};
const times = firstElement(root, "Times");
const startTime = attribute(times, "start");
const finishTime = attribute(times, "finish");
const startTimestamp = new Date(startTime).getTime();
const finishTimestamp = new Date(finishTime).getTime();
const durationMs =
Number.isFinite(startTimestamp) &&
Number.isFinite(finishTimestamp) &&
finishTimestamp >= startTimestamp
? finishTimestamp - startTimestamp
: null;
const summaryElement = firstElement(root, "ResultSummary");
return {
name: attribute(root, "name") || "Test run",
runId: attribute(root, "id"),
user: attribute(root, "runUser"),
computerName: attribute(root, "computerName"),
outcome: attribute(summaryElement, "outcome") || "Unknown",
startTime,
finishTime,
durationMs,
resultCounts,
summaryCounts: {
total: Number.isFinite(counters.total) ? counters.total : results.length,
passed: sumCounters(["passed"], resultCounts.passed),
failed: sumCounters(
[
"failed",
"error",
"timeout",
"aborted",
"passedButRunAborted",
"disconnected",
],
resultCounts.failed,
),
skipped: sumCounters(
["notExecuted", "notRunnable", "inconclusive", "pending"],
resultCounts.skipped,
),
},
results,
};
}
function renderMetadataItem(label, value, { mono = false } = {}) {
if (!value) return "";
return `
<div class="trx-meta-item">
<dt>${escapeHtml(label)}</dt>
<dd${mono ? ' class="mono"' : ""}>${escapeHtml(value)}</dd>
</div>
`;
}
function truncateDetail(value) {
const text = String(value ?? "");
if (text.length <= MAX_DETAIL_CHARS) {
return { text, truncated: false };
}
return {
text: text.slice(0, MAX_DETAIL_CHARS),
truncated: true,
};
}
function renderDetailBlock(label, value) {
if (!value) return "";
const detail = truncateDetail(value);
return `
<section class="trx-output-block">
<h4>${escapeHtml(label)}</h4>
<pre>${escapeHtml(detail.text)}</pre>
${
detail.truncated
? `<p class="trx-truncation-note">Output truncated after ${MAX_DETAIL_CHARS.toLocaleString()} characters. View the raw XML for the full value.</p>`
: ""
}
</section>
`;
}
function renderResult(result, open = false) {
const secondaryParts = [];
if (result.className) secondaryParts.push(result.className);
if (result.dataRowInfo) secondaryParts.push(`Data row ${result.dataRowInfo}`);
if (result.category === "failed" && result.message) {
secondaryParts.push(
result.message.length > 180
? `${result.message.slice(0, 179)}...`
: result.message,
);
}
const searchValue = [
result.testName,
result.className,
result.methodName,
result.outcome,
result.message,
]
.filter(Boolean)
.join(" ")
.toLocaleLowerCase()
.slice(0, 2_000);
const resultDuration = formatDuration(result.durationMs);
const metadata = [
renderMetadataItem("Class", result.className, { mono: true }),
renderMetadataItem("Method", result.methodName, { mono: true }),
renderMetadataItem("Duration", resultDuration),
renderMetadataItem("Computer", result.computerName),
renderMetadataItem(
"Started",
result.startTime ? formatDate(result.startTime) : "",
),
renderMetadataItem(
"Finished",
result.endTime ? formatDate(result.endTime) : "",
),
renderMetadataItem("Test list", result.testListName),
renderMetadataItem("Adapter", result.adapterTypeName, { mono: true }),
renderMetadataItem("Code base", result.codeBase, { mono: true }),
renderMetadataItem("Test ID", result.testId, { mono: true }),
renderMetadataItem("Execution ID", result.executionId, { mono: true }),
].join("");
const resultFiles =
result.resultFiles.length > 0
? `
<section class="trx-result-files">
<h4>Result files</h4>
<ul>${result.resultFiles
.map((path) => `<li class="mono">${escapeHtml(path)}</li>`)
.join("")}</ul>
</section>
`
: "";
const properties =
result.properties.length > 0
? `
<section class="trx-properties">
<h4>Properties</h4>
<dl>${result.properties
.map(
({ key, value }) => `
<div>
<dt>${escapeHtml(key)}</dt>
<dd>${escapeHtml(value)}</dd>
</div>
`,
)
.join("")}</dl>
</section>
`
: "";
const details = [
metadata ? `<dl class="trx-result-metadata">${metadata}</dl>` : "",
renderDetailBlock("Error message", result.message),
renderDetailBlock("Stack trace", result.stackTrace),
renderDetailBlock("Standard output", result.stdout),
renderDetailBlock("Standard error", result.stderr),
renderDetailBlock("Debug trace", result.debugTrace),
resultFiles,
properties,
].join("");
return `
<details
class="trx-result trx-outcome-${result.category}"
data-trx-result
data-trx-category="${result.category}"
data-trx-search="${escapeHtml(searchValue)}"
style="--trx-depth: ${Math.min(result.depth, 4)}"
${open ? "open" : ""}
>
<summary>
<span class="trx-result-chevron">${icon("chevron-right")}</span>
<span class="trx-result-status">${icon(outcomeIcon(result.category))}</span>
<span class="trx-result-copy">
<span class="trx-result-name">${escapeHtml(result.testName)}</span>
${
secondaryParts.length > 0
? `<span class="trx-result-secondary">${escapeHtml(secondaryParts.join(" | "))}</span>`
: ""
}
</span>
<span class="trx-result-duration">${escapeHtml(resultDuration)}</span>
<span class="trx-outcome-badge trx-outcome-${result.category}">${escapeHtml(result.outcome)}</span>
</summary>
<div class="trx-result-details">
${details || '<p class="trx-detail-empty">No additional details were recorded for this result.</p>'}
</div>
</details>
`;
}
function renderMetric(label, value, category, iconName) {
return `
<div class="trx-metric trx-metric-${category}">
<span class="trx-metric-icon">${icon(iconName)}</span>
<span class="trx-metric-value">${Number(value).toLocaleString()}</span>
<span class="trx-metric-label">${escapeHtml(label)}</span>
</div>
`;
}
function renderFilter(label, category, count, pressed = false) {
return `
<button
class="trx-filter"
type="button"
data-trx-filter="${category}"
aria-pressed="${pressed}"
>
${escapeHtml(label)}
<span class="Counter Counter--secondary">${Number(count).toLocaleString()}</span>
</button>
`;
}
function renderParseError(source, message, highlightXml) {
const highlighted =
source.length <= MAX_HIGHLIGHTED_RAW_CHARS
? highlightXml(source)
: escapeHtml(source);
return `
<div class="trx-preview">
<section class="trx-error" role="alert">
<span class="trx-error-icon">${icon("x-circle")}</span>
<div>
<h2>Unable to parse test results</h2>
<p>${escapeHtml(message)}</p>
</div>
</section>
<section class="trx-raw-panel">
<div class="trx-section-heading">
<div>
<span class="trx-eyebrow">Fallback</span>
<h3>Raw XML</h3>
</div>
</div>
<pre class="text-preview syntax-code syntax-xml trx-raw-source"><code>${highlighted}</code></pre>
</section>
</div>
`;
}
function render(value, preview, helpers = {}) {
const source = String(value ?? "");
const highlightXml =
typeof helpers.highlightXml === "function"
? helpers.highlightXml
: escapeHtml;
let report;
try {
report = parseReport(source);
} catch (error) {
preview.innerHTML = renderParseError(
source,
error instanceof Error ? error.message : "The TRX document is invalid.",
highlightXml,
);
return;
}
const categoryOrder = { failed: 0, other: 1, skipped: 2, passed: 3 };
const renderedResults = [...report.results]
.map((result, index) => ({ result, index }))
.sort(
(left, right) =>
categoryOrder[left.result.category] -
categoryOrder[right.result.category] || left.index - right.index,
)
.slice(0, MAX_RENDERED_RESULTS)
.map(({ result }) => result);
const runOutcome = summarizedRunOutcome(report);
const outcome = outcomeCategory(runOutcome);
const limited = renderedResults.length < report.results.length;
const runDuration = formatDuration(report.durationMs);
const runMetadata = [
renderMetadataItem(
"Started",
report.startTime ? formatDate(report.startTime) : "",
),
renderMetadataItem(
"Finished",
report.finishTime ? formatDate(report.finishTime) : "",
),
renderMetadataItem("Duration", runDuration),
renderMetadataItem("Run by", report.user),
renderMetadataItem("Computer", report.computerName),
renderMetadataItem("Run ID", report.runId, { mono: true }),
].join("");
preview.innerHTML = `
<div
class="trx-preview"
data-trx-total="${report.results.length}"
data-trx-rendered="${renderedResults.length}"
>
<div data-trx-panel="structured">
<section class="trx-overview">
<div class="trx-run-heading">
<div>
<span class="trx-eyebrow">Test run</span>
<h2>${escapeHtml(report.name)}</h2>
</div>
<span class="trx-run-outcome trx-outcome-${outcome}">
${icon(outcomeIcon(outcome))}
${escapeHtml(runOutcome)}
</span>
</div>
<div class="trx-metrics">
${renderMetric("Total", report.summaryCounts.total, "all", "workflow")}
${renderMetric("Passed", report.summaryCounts.passed, "passed", "check-circle")}
${renderMetric("Failed", report.summaryCounts.failed, "failed", "x-circle")}
${renderMetric("Skipped", report.summaryCounts.skipped, "skipped", "clock")}
</div>
${runMetadata ? `<dl class="trx-run-metadata">${runMetadata}</dl>` : ""}
</section>
<section class="trx-results-panel">
<div class="trx-section-heading">
<div>
<span class="trx-eyebrow">Details</span>
<h3>Test results</h3>
<p data-trx-result-count aria-live="polite"></p>
</div>
<button class="app-button app-button-small" type="button" data-trx-view="raw">
${icon("code")}
View raw XML
</button>
</div>
<div class="trx-controls">
<label class="trx-search">
${icon("search")}
<span class="sr-only">Search test results</span>
<input
class="form-control"
type="search"
placeholder="Search tests..."
autocomplete="off"
data-trx-search-input
/>
</label>
<div class="trx-filters" role="group" aria-label="Filter test outcomes">
${renderFilter("All", "all", report.results.length, true)}
${renderFilter("Passed", "passed", report.resultCounts.passed)}
${renderFilter("Failed", "failed", report.resultCounts.failed)}
${renderFilter("Skipped", "skipped", report.resultCounts.skipped)}
${renderFilter("Other", "other", report.resultCounts.other)}
</div>
</div>
${
limited
? `
<div class="trx-limit-note">
${icon("eye")}
Showing the first ${renderedResults.length.toLocaleString()} of ${report.results.length.toLocaleString()} result records to keep the preview responsive. Raw XML contains the complete report.
</div>
`
: ""
}
<div class="trx-result-list">
${renderedResults
.map((result, index) =>
renderResult(
result,
index === 0 && result.category === "failed",
),
)
.join("")}
</div>
<div class="trx-no-results" data-trx-no-results hidden>
${icon("search")}
<h4>No matching tests</h4>
<p>Try another search or outcome filter.</p>
</div>
</section>
</div>
<section class="trx-raw-panel" data-trx-panel="raw" hidden>
<div class="trx-section-heading">
<div>
<span class="trx-eyebrow">Source</span>
<h3>Raw XML</h3>
</div>
<button class="app-button app-button-small" type="button" data-trx-view="structured">
${icon("chevron-left")}
Back to results
</button>
</div>
<div class="trx-limit-note" data-trx-raw-note hidden>
${icon("eye")}
Syntax highlighting is disabled for large reports to keep the source view responsive.
</div>
<pre class="text-preview syntax-code syntax-xml trx-raw-source"><code data-trx-raw-code></code></pre>
</section>
</div>
`;
const trxPreview = preview.querySelector(".trx-preview");
rawSources.set(trxPreview, { source, highlightXml });
applyFilters(trxPreview);
}
function showView(preview, viewName) {
if (!preview) return;
if (viewName === "raw") {
const rawSource = rawSources.get(preview);
const code = preview.querySelector("[data-trx-raw-code]");
if (rawSource && code && code.dataset.trxLoaded !== "true") {
if (rawSource.source.length > MAX_HIGHLIGHTED_RAW_CHARS) {
code.textContent = rawSource.source;
const note = preview.querySelector("[data-trx-raw-note]");
if (note) note.hidden = false;
} else {
code.innerHTML = rawSource.highlightXml(rawSource.source);
}
code.dataset.trxLoaded = "true";
}
}
for (const panel of preview.querySelectorAll("[data-trx-panel]")) {
panel.hidden = panel.dataset.trxPanel !== viewName;
}
}
function applyFilters(preview) {
if (!preview) return;
const query = String(
preview.querySelector("[data-trx-search-input]")?.value ?? "",
)
.trim()
.toLocaleLowerCase();
const terms = query.split(/\s+/).filter(Boolean);
const category =
preview.querySelector('[data-trx-filter][aria-pressed="true"]')?.dataset
.trxFilter ?? "all";
const results = [...preview.querySelectorAll("[data-trx-result]")];
let visible = 0;
for (const result of results) {
const matchesCategory =
category === "all" || result.dataset.trxCategory === category;
const searchValue = result.dataset.trxSearch ?? "";
const matchesQuery = terms.every((term) => searchValue.includes(term));
result.hidden = !(matchesCategory && matchesQuery);
if (!result.hidden) visible += 1;
}
const total = Number(preview.dataset.trxTotal) || results.length;
const rendered = Number(preview.dataset.trxRendered) || results.length;
const count = preview.querySelector("[data-trx-result-count]");
if (count) {
count.textContent =
total > rendered
? `${visible.toLocaleString()} matching in the first ${rendered.toLocaleString()} of ${total.toLocaleString()} results`
: `${visible.toLocaleString()} of ${total.toLocaleString()} results`;
}
const noResults = preview.querySelector("[data-trx-no-results]");
if (noResults) noResults.hidden = visible > 0;
}
globalThis.TrxPreview = Object.freeze({
applyFilters,
parse: parseReport,
render,
showView,
});
})();