mirror of
https://github.com/ohwgiles/laminar.git
synced 2024-10-27 20:34:20 +00:00
when the displayed frontend state changes, any progress bar should begin in the initial correct state before smoothly transitioning with time.
294 lines
6.9 KiB
CSS
294 lines
6.9 KiB
CSS
/* colour scheme */
|
|
:root {
|
|
--main-bg: #fff;
|
|
--main-fg: #333;
|
|
--nav-bg: #2F3340;
|
|
--nav-bg-darker: #292b33;
|
|
--nav-fg: #d0d0d0;
|
|
--nav-fg-light: #fafafa;
|
|
--icon-enabled: #d8cb83;
|
|
--success: #74af77;
|
|
--failure: #883d3d;
|
|
--running: #4786ab;
|
|
--warning: #de9a34;
|
|
--link-fg: #2f4579;
|
|
--console-bg: #313235;
|
|
--console-fg: #fff;
|
|
--alt-row-bg: #fafafa;
|
|
--border-grey: #d0d0d0;
|
|
}
|
|
|
|
/* basic resets */
|
|
html { box-sizing: border-box; }
|
|
*, *:before, *:after { box-sizing: inherit; }
|
|
body, h1, h2, h3, h4, h5, h6, p, ol, ul {
|
|
margin: 0;
|
|
padding: 0;
|
|
font-weight: normal;
|
|
}
|
|
ol, ul { list-style: none; }
|
|
body, html { height: 100%; }
|
|
body {
|
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
font-size: 16px;
|
|
color: var(--main-fg);
|
|
}
|
|
|
|
/* main header bar */
|
|
#nav-top { background-color: var(--nav-bg); }
|
|
#nav-top-links { background-color: var(--nav-bg-darker); }
|
|
#nav-top a { color: var(--nav-fg); }
|
|
#nav-top a:hover { color: white; text-decoration: none; }
|
|
|
|
.version {
|
|
align-self: center;
|
|
font-size: x-small;
|
|
color: rgba(255,255,255,0.3);
|
|
}
|
|
|
|
/* navbar svg icons (enable notifications) */
|
|
.nav-icon { display: inherit; }
|
|
.nav-icon svg { fill: var(--nav-fg); stroke: #000; }
|
|
.nav-icon:hover { cursor: pointer; }
|
|
.nav-icon:hover svg { fill: var(--nav-fg-light); }
|
|
.nav-icon.active svg { fill: var(--icon-enabled); }
|
|
|
|
/* anchors */
|
|
a { color: var(--link-fg); text-decoration: none; }
|
|
a:visited { color: var(--link-fg); }
|
|
a:active { color: var(--link-fg); }
|
|
a:hover { text-decoration: underline; }
|
|
|
|
/* charts */
|
|
canvas {
|
|
width: 100% !important;
|
|
max-width: 800px;
|
|
height: auto !important;
|
|
}
|
|
|
|
#popup-connecting {
|
|
position: fixed;
|
|
background: white;
|
|
border: 1px solid #ddd;
|
|
bottom: 10px;
|
|
right: 10px;
|
|
padding: 20px;
|
|
}
|
|
|
|
/* status icons */
|
|
.status {
|
|
display: inline-block;
|
|
width: 1em;
|
|
vertical-align: middle;
|
|
margin-top: -2px; /* pixel-pushing */
|
|
}
|
|
svg.success path { fill: var(--success); }
|
|
svg.failed path { fill: var(--failure); }
|
|
svg.running circle { stroke: var(--running); }
|
|
svg.queued circle { fill: var(--nav-fg); }
|
|
svg.queued path { stroke: white; }
|
|
|
|
/* sort indicators */
|
|
a.sort {
|
|
position: relative;
|
|
margin-left: 7px;
|
|
}
|
|
a.sort:before, a.sort:after {
|
|
border: 4px solid transparent;
|
|
content: "";
|
|
position: absolute;
|
|
display: block;
|
|
height: 0;
|
|
width: 0;
|
|
right: 0;
|
|
top: 50%;
|
|
}
|
|
a.sort:before {
|
|
border-bottom-color: var(--border-grey);
|
|
margin-top: -9px;
|
|
}
|
|
a.sort:after {
|
|
border-top-color: var(--border-grey);
|
|
margin-top: 1px;
|
|
}
|
|
a.sort.dsc:after { border-top-color: var(--main-fg); }
|
|
a.sort.asc:before { border-bottom-color: var(--main-fg); }
|
|
a.sort:hover { text-decoration: none; cursor:pointer; }
|
|
a.sort:not(.asc):hover:before { border-bottom-color: var(--main-fg); }
|
|
a.sort:not(.dsc):hover:after { border-top-color: var(--main-fg); }
|
|
|
|
/* job group tabs */
|
|
a.active { color: var(--main-fg); }
|
|
a.active:hover { text-decoration: none; }
|
|
|
|
/* run console output */
|
|
.console-log { padding: 15px; background-color: var(--console-bg); }
|
|
.console-log code { white-space: pre-wrap; color: var(--console-fg); }
|
|
.console-log a { color: var(--console-fg); }
|
|
|
|
/* text input (job filtering) */
|
|
input { padding: 5px 8px; }
|
|
|
|
/* description list (run detail) */
|
|
dl { display: grid; grid-template-columns: auto 1fr; }
|
|
dt { text-align: right; font-weight: bold; min-width: 85px; }
|
|
dt,dd { line-height: 2; }
|
|
|
|
/* tables */
|
|
table { border-spacing: 0; width: 100%; }
|
|
th { text-align: left; border-bottom: 1px solid var(--border-grey); }
|
|
td, th { padding: 8px; }
|
|
table.striped td { border-top: 1px solid var(--border-grey); }
|
|
table.striped tr:nth-child(even) { background-color: var(--alt-row-bg); }
|
|
td:first-child, th:first-child { padding-left: 15px; }
|
|
td:last-child, th:last-child { padding-right: 15px; }
|
|
|
|
/* next/prev navigation buttons */
|
|
button {
|
|
border: 1px solid var(--border-grey);
|
|
background-color: var(--alt-row-bg);
|
|
padding: 6px;
|
|
min-width: 29px;
|
|
}
|
|
button[disabled] { cursor: not-allowed; color: var(--border-grey); }
|
|
button:not([disabled]) { cursor: pointer; color: var(--main-fg); }
|
|
|
|
/* progress bar */
|
|
.progress {
|
|
width: 100%;
|
|
height: 8px;
|
|
border: 1px solid;
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
border-color: var(--border-grey);
|
|
background-color: var(--alt-row-bg);
|
|
}
|
|
.progress-bar {
|
|
height: 100%;
|
|
background-color: var(--running);
|
|
background-image: linear-gradient(45deg, transparent 35%, rgba(255,255,255,0.18) 35% 65%, transparent 65%);
|
|
background-size: 1rem;
|
|
transition: width .6s linear;
|
|
}
|
|
.progress-bar.overtime { background-color: var(--warning); }
|
|
.progress-bar.indeterminate {
|
|
animation: animate-stripes 1s linear infinite;
|
|
}
|
|
@keyframes animate-stripes {
|
|
from { background-position: 1rem 0; } to { background-position: 0 0; }
|
|
}
|
|
|
|
/* wallboard */
|
|
.wallboard {
|
|
display: flex;
|
|
flex-wrap: wrap-reverse;
|
|
flex-direction: row-reverse;
|
|
gap: 20px;
|
|
padding: 20px;
|
|
position: fixed;
|
|
height: 100%;
|
|
width: 100%;
|
|
overflow: auto;
|
|
background-color: #000
|
|
}
|
|
.wallboard > div {
|
|
padding: 30px;
|
|
flex-grow: 1;
|
|
background-color: var(--failure);
|
|
color: var(--nav-fg-light);
|
|
}
|
|
.wallboard > div:hover {
|
|
cursor: pointer;
|
|
}
|
|
.wallboard > div[data-result="running"] {
|
|
animation: wallboard-bg-fade 2s ease infinite;
|
|
}
|
|
@keyframes wallboard-bg-fade {
|
|
from { background-color: #4786ab; }
|
|
50% { background-color: #446597; }
|
|
to { background-color: #4786ab; }
|
|
}
|
|
.wallboard > div[data-result="success"] {
|
|
background-color: var(--success);
|
|
color: var(--main-fg);
|
|
}
|
|
|
|
/* connecting overlay */
|
|
#connecting-overlay {
|
|
position: fixed;
|
|
top: 0; right: 0; bottom: 0; left: 0;
|
|
display: grid;
|
|
align-content: end; justify-content: end;
|
|
color: var(--nav-fg-light);
|
|
font-size: 18px;
|
|
padding: 30px;
|
|
visibility: hidden;
|
|
background-color: rgba(0,0,0,0.75);
|
|
opacity: 0;
|
|
transition: opacity 0.5s ease, visibility 0s 0.5s;
|
|
}
|
|
#connecting-overlay.shown {
|
|
visibility: visible;
|
|
opacity: 1;
|
|
transition: opacity 0.5s ease 2s;
|
|
}
|
|
#connecting-overlay > div { opacity: 1; }
|
|
|
|
/* responsive layout */
|
|
#page-home-main {
|
|
display: grid;
|
|
grid-template-columns: auto 1fr;
|
|
}
|
|
@media (max-width: 865px) {
|
|
#page-home-main {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
.vp-sm-hide { display: none; }
|
|
}
|
|
#page-home-stats {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr 1fr;
|
|
padding: 15px;
|
|
gap: 15px;
|
|
max-width: 1600px;
|
|
margin: auto;
|
|
text-align: center;
|
|
}
|
|
@media (max-width: 650px) {
|
|
#page-home-stats {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|
|
#page-home-plots {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
padding: 5px;
|
|
gap: 5px;
|
|
max-width: 1600px;
|
|
margin: auto;
|
|
}
|
|
@media (max-width: 1095px) {
|
|
#page-home-plots {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|
|
#page-job-main {
|
|
display: grid;
|
|
grid-template: auto 1fr / minmax(550px, 1fr) 1fr;
|
|
}
|
|
@media (max-width: 965px) {
|
|
#page-job-main {
|
|
grid-template: auto auto 1fr / 1fr;
|
|
}
|
|
}
|
|
#page-run-detail {
|
|
display: grid;
|
|
grid-template-columns: minmax(400px, auto) 1fr;
|
|
gap: 5px;
|
|
}
|
|
@media (max-width: 780px) {
|
|
#page-run-detail {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|