/**
* Copyright 2013-2019 GenieACS Inc.
*
* This file is part of GenieACS.
*
* GenieACS is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* GenieACS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with GenieACS. If not, see .
*/
@import "normalize.css";
@import "codemirror/lib/codemirror.css";
:root {
--base-font-size: 13px;
--base-line-height: 16px;
--color1: #ebe0bf;
--color2: #b9b098;
--color3: #f2ebd5;
--color4: #046380;
--color5: #002f2f;
--fade: 0.2s;
--disabled: #666;
--status-red: hsl(0, 80%, 80%);
--status-green: hsl(125, 80%, 80%);
--status-gray: hsl(58, 3%, 80%);
--status-yellow: hsl(46, 79%, 80%);
}
body,
input,
button,
select,
option,
textarea {
outline-color: var(--color4);
font-family: sans-serif;
color: var(--color5);
}
a {
color: var(--color4);
cursor: pointer;
transition: background-color var(--fade), color var(--fade);
&:visited {
color: var(--color4);
}
&:hover {
color: white;
background-color: var(--color4);
}
/* text-decoration does not propagate to inline-block children */
& span {
text-decoration: inherit;
}
}
strong,
b {
font-weight: bold;
}
i {
font-style: italic;
}
@keyframes pending-blink {
from {
background-color: color-mod(var(--status-green) a(90%));
}
to {
background-color: transparent;
}
}
body {
height: 100%;
display: flex;
flex-direction: column;
}
#content-wrapper {
flex-grow: 1;
display: flex;
overflow-x: auto;
overflow-y: auto;
}
#header {
background-color: #f2eddf;
border-bottom: 1px solid var(--color1);
overflow: visible;
position: relative;
& > .drawer-wrapper {
position: fixed;
z-index: 10;
width: 720px;
margin-left: -360px;
top: 0;
left: 50%;
& > .drawer {
background-color: rgba(255, 255, 255, 0.9);
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
border-bottom: 1px solid var(--color1);
border-left: 1px solid var(--color1);
border-right: 1px solid var(--color1);
margin-top: -1px;
box-shadow: 0 0 10px #ccc;
overflow: hidden;
transition: height var(--fade), opacity var(--fade);
& > div {
padding: 0.3em;
}
& > .status {
display: flex;
& > span {
margin-right: 1em;
padding-left: 0.2em;
padding-right: 0.2em;
border-radius: 0.4em;
}
& > .pending.active {
&.active {
animation: 0.5s linear 0s infinite alternate pending-blink;
}
}
& > .stale.active {
background-color: color-mod(var(--status-gray) a(90%));
}
& > .fault.active {
background-color: color-mod(var(--status-red) a(90%));
}
& > .queued.active {
font-weight: bold;
}
& > .actions {
flex-grow: 1;
text-align: right;
}
}
& > .staging {
& .parameter {
font-style: italic;
max-width: 500px;
text-overflow: ellipsis;
display: inline-block;
overflow: hidden;
vertical-align: text-bottom;
}
& input {
width: 100%;
padding: 0.3em;
margin-top: 0.3em;
margin-bottom: 0.3em;
}
& .actions {
text-align: right;
}
}
& > .queue {
max-height: 400px;
overflow-y: auto;
& > .pending {
animation: 0.5s linear 0s infinite alternate pending-blink;
border-radius: 0.4em;
}
& > .stale {
background-color: color-mod(var(--status-gray) a(90%));
border-radius: 0.4em;
}
& > .fault {
background-color: color-mod(var(--status-red) a(90%));
border-radius: 0.4em;
}
& .parameter {
font-style: italic;
max-width: 400px;
text-overflow: ellipsis;
display: inline-block;
overflow: hidden;
vertical-align: text-bottom;
}
& .value {
max-width: 200px;
text-overflow: ellipsis;
display: inline-block;
overflow: hidden;
vertical-align: text-bottom;
white-space: nowrap;
}
& > div {
display: flex;
& > .actions {
flex-grow: 1;
text-align: right;
}
}
}
}
& > .notifications-wrapper {
& > .notification {
padding: 0.3em;
left: 0;
right: 0;
background-color: rgba(255, 255, 255, 0.9);
border: 1px solid var(--color1);
border-radius: 6px;
box-shadow: 0 0 10px #ccc;
transition: opacity var(--fade), top var(--fade);
&.error {
background-color: color-mod(var(--status-red) a(90%));
border: 1px solid var(--status-red);
}
&.success {
background-color: color-mod(var(--status-green) a(90%));
border: 1px solid var(--status-green);
}
&.warning {
background-color: color-mod(var(--status-yellow) a(90%));
border: 1px solid var(--status-yellow);
}
}
}
}
& > nav {
display: inline-block;
overflow: visible;
position: absolute;
bottom: -1px;
& > ul {
font-weight: bold;
display: inline-block;
margin: 0 10px;
padding: 0;
& > li {
margin: 0 2px;
background-color: var(--color1);
display: inline-block;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
border-top: 1px solid var(--color1);
border-left: 1px solid var(--color1);
border-right: 1px solid var(--color1);
transition: background-color var(--fade);
&.active,
&:hover {
background-color: white;
}
& > a,
& > a:visited,
& > a:hover {
display: inline-block;
min-width: 140px;
color: var(--color4);
text-decoration: none;
background: none;
padding: 8px;
}
}
}
}
& > .logo {
display: inline-block;
position: relative;
& > img {
margin: 10px;
height: 56px;
}
& > .version {
position: absolute;
bottom: 5px;
right: 10px;
font-family: monospace;
font-size: 10px;
color: #666;
}
}
& > .user-menu {
float: right;
margin: 5px;
}
}
#side-menu {
width: 200px;
min-width: 200px;
& > ul {
padding: 0;
list-style: none;
& > li {
& > a {
display: block;
text-decoration: none;
margin: 5px 0;
padding: 8px;
border-bottom-right-radius: 6px;
border-top-right-radius: 6px;
background-color: var(--color3);
&:hover {
background-color: var(--color4);
color: var(--color3);
}
}
&.active {
font-weight: bold;
}
}
}
}
#content {
flex-grow: 1;
margin: 10px;
min-height: 250px;
/* Workaround for Chrome ignoring bottom margin when flex container overflows */
&::after {
content: "";
display: block;
padding-bottom: 1px;
}
}
table.table {
border-spacing: 0;
text-align: left;
overflow-x: auto;
& table.table {
font-size: 90%;
}
& th {
white-space: nowrap;
color: var(--color4);
font-weight: bold;
border-bottom: 2px solid var(--color4);
margin: 0;
padding: 0.2em 0.5em;
}
& td {
margin: 0;
padding: 0.2em 0.5em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 400px;
}
& tfoot td > a {
margin-left: 1em;
}
&.highlight > tbody > tr {
& > td {
border-bottom: 1px dotted var(--color1);
}
transition: background-color var(--fade);
&:hover {
background-color: var(--color3);
}
}
& tbody > tr.empty {
text-align: center;
color: var(--disabled);
&:hover {
background-color: initial;
}
}
}
h1 {
color: var(--color4);
font-size: 130%;
font-weight: bold;
}
h2 {
color: var(--color5);
font-weight: bold;
font-size: 120%;
}
h3 {
color: var(--color5);
font-size: 110%;
}
p.error {
color: #a00;
}
/* Remove button padding in FF */
input::-moz-focus-inner {
border: 0;
padding: 0;
}
input[type="button"],
button {
background: transparent;
border: 0;
color: var(--color4);
border-radius: 4px;
transition: background-color var(--fade), color var(--fade);
display: inline-block;
vertical-align: middle;
&.primary {
border: 1px solid var(--color1);
background-color: var(--color3);
}
&.critical {
border: 1px solid var(--color1);
background-color: var(--color3);
color: #700;
}
&:hover:enabled {
background-color: var(--color4);
color: var(--color3);
}
&:disabled {
color: var(--disabled);
cursor: not-allowed;
}
}
.CodeMirror,
textarea,
select,
input {
display: block;
border: 1px solid var(--color1);
background-color: var(--color3);
border-radius: 4px;
transition: border-color var(--fade), background-color var(--fade);
&.error {
background-color: #efcbcf;
border-color: #e6b2b7;
}
&:focus,
&:hover {
border-color: var(--color4);
}
}
.filter {
margin-bottom: 0.5em;
& > input {
font-size: 90%;
width: 35em;
margin: 2px;
padding: 2px;
}
}
.page-overview {
& > h1 {
text-align: center;
}
}
.overview-chart-group {
display: flex;
justify-content: center;
& h2 {
text-align: center;
}
}
table.parameter-list {
border-spacing: 0;
text-align: left;
& th {
padding: 0;
padding-right: 1em;
}
}
.overview-dot {
& > svg {
margin-bottom: -0.125em;
margin-left: 0.2em;
margin-right: 0.2em;
& > circle {
stroke: var(--color5);
stroke-width: 0.08em;
}
}
}
span.inform {
& > * {
margin-right: 0.5em;
}
}
.pie-chart {
margin: 20px;
text-align: center;
& > svg {
& > path {
stroke: var(--color1);
stroke-width: 1px;
}
& > a {
transition: opacity var(--fade);
opacity: 0;
& > text {
font-weight: bold;
opacity: 0.4;
}
& > path {
stroke: var(--color4);
}
&:hover {
opacity: 1;
}
}
}
& > .legend {
text-align: left;
margin: 15px;
& > .legend-line {
& > .color {
height: 12px;
width: 12px;
margin-right: 5px;
border: 1px solid var(--color1);
display: inline-block;
}
}
}
}
span.na {
color: var(--disabled);
}
.all-parameters {
& > input {
font-family: monospace;
margin-bottom: 2px;
padding: 4px;
width: 700px;
}
& > .parameter-list {
font-family: monospace;
overflow-y: scroll;
height: 200px;
& > table {
width: 100%;
table-layout: fixed;
border-spacing: 0;
& > tbody {
& > tr {
& > td {
overflow: hidden;
white-space: nowrap;
border-bottom: 1px dotted var(--color1);
}
transition: background-color var(--fade);
&:hover {
background-color: var(--color3);
}
& > td.left {
& > * {
max-width: 100%;
}
}
& > td.right {
text-align: right;
padding-right: 0.5em;
}
}
}
}
}
}
.container-right {
float: right;
clear: right;
}
.container-full-width {
clear: both;
}
.actions-bar {
margin-top: 10px;
margin-bottom: 10px;
& > button {
margin-right: 10px;
}
}
span.tag {
display: inline-block;
background-image: url('data:image/svg+xml;utf-8,');
background-size: cover;
background-repeat: no-repeat;
border-radius: 0.2em;
padding-left: 1em;
padding-right: 0.2em;
}
.tags {
& > .tag {
margin-right: 0.5em;
}
}
.overlay-wrapper {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.2);
z-index: 100;
transition: opacity var(--fade), top var(--fade);
display: flex;
align-items: center;
justify-content: center;
& > .overlay {
max-width: 90vw;
max-height: 90vh;
background-color: white;
border: 1px solid var(--color1);
border-radius: 10px;
padding: 10px;
box-shadow: 0 0 15px #aaa;
overflow: auto;
}
}
.overlay > .put-form {
min-width: 700px;
}
.autocomplete {
box-shadow: 0 0 10px #ccc;
background-color: rgba(255, 255, 255, 0.9);
border: 1px solid var(--color1);
border-radius: 4px;
max-height: 300px;
overflow-y: auto;
transition: opacity var(--fade);
& > .suggestion {
padding: 5px;
&.selected,
&:hover {
background-color: var(--color3);
}
}
}
span.long-text {
display: inline-block;
overflow-x: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 400px;
/*
"overflow: hidden" changes the baseline as explained here:
https://stackoverflow.com/questions/9273016/why-is-this-inline-block-element-pushed-downward
*/
vertical-align: top;
}
span.long-text-overflowed {
cursor: pointer;
&:hover {
text-decoration: underline;
text-decoration-style: dotted;
}
}
textarea.long-text {
font-family: monospace;
min-width: 10vw;
min-height: 10vh;
}
span.parameter-value {
& > span:empty::before {
content: "blank";
color: #aaa;
}
}
.wizard-dialog {
max-width: 720px;
margin: 10px auto;
padding: 10px;
border-radius: 6px;
border: 1px solid var(--color1);
box-shadow: 0 0 10px #ccc;
}
.icon {
display: inline-block;
vertical-align: middle;
width: 1em;
height: 1em;
fill: none;
stroke: currentColor;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
&.icon-unsorted {
opacity: 0.3;
}
}
.loading {
opacity: 0.6;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.loading-overlay {
display: flex;
align-items: center;
justify-content: center;
&::after {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZD0iTTEwIDUwYTQwIDQwIDAgMDA4MCAwIDQwIDQyIDAgMDEtODAgMCIgZmlsbD0iI2IxMmQ1YyIgLz48L3N2Zz4=);
content: "";
width: 48px;
height: 48px;
animation: spin 1s linear infinite;
background-repeat: no-repeat;
background-size: 100% 100%;
}
}