icingaweb2-module-businessp.../public/css/module.less
2025-05-07 10:28:54 +02:00

1018 lines
21 KiB
Text

a:focus {
outline: none;
text-decoration: underline;
&::before {
text-decoration: none;
}
}
.action-bar {
float: left;
display: flex;
align-items: center;
color: @icinga-blue;
margin-bottom: 0.5em;
margin-right: 0.5em;
& > *:not(:last-child) {
margin-right: 1em;
}
> a {
&:hover::before {
text-decoration: none;
}
&.button-link {
color: @text-color-on-icinga-blue;
background: @icinga-blue;
&:active, &:focus {
text-decoration: none;
}
}
}
> div.view-toggle {
span {
color: @gray;
margin-right: .5em;
}
a {
display: inline-block;
i {
padding: .25em .5em;
border: 1px solid @icinga-blue;
&:before {
margin-right: 0;
}
&.active {
color: @text-color-on-icinga-blue;
background-color: @icinga-blue;
}
&:first-of-type {
border-top-left-radius: .25em;
border-bottom-left-radius: .25em;
}
&:last-of-type {
border-top-right-radius: .25em;
border-bottom-right-radius: .25em;
}
}
}
}
span.disabled {
color: @gray;
}
}
.controls {
.sort-control,
&.want-fullscreen > a {
float: right;
}
}
form a {
color: @icinga-blue;
}
div.bp {
margin-bottom: 4px;
}
div.bp.sortable > .sortable-ghost {
opacity: 0.5;
}
/* TreeView */
@vertical-tree-item-gap: .5em;
ul.bp {
margin: 0;
padding: 0;
list-style-type: none;
.action-link {
font-size: 1.3em;
line-height: 1;
}
// cursors!!!1
&:not([data-sortable-disabled="true"]) {
.movable {
cursor: grab;
&.sortable-chosen {
cursor: grabbing;
}
}
&.progress .movable {
cursor: wait;
}
}
&[data-sortable-disabled="true"] {
li.process summary {
cursor: pointer;
}
}
li {
> .icon,
summary > .icon {
opacity: .75;
}
span.state-ball ~ i:last-of-type {
margin-right: 0;
}
}
// ghost style
&.sortable > li.sortable-ghost {
> details {
position: relative;
overflow: hidden;
max-height: 30em;
background-color: @gray-lighter;
border: .2em dotted @gray-light;
border-left-width: 0;
border-right-width: 0;
}
&.process > .details:after {
// TODO: Only apply if content overflows?
content: " ";
position: absolute;
right: 0;
bottom: 0;
left: 0;
height: 50%;
background: linear-gradient(transparent, @body-bg-color);
}
}
// header style
li.process summary {
padding: .291666667em 0;
border-bottom: 1px solid @gray-light;
user-select: none;
> .icon:nth-child(1),
> .icon:nth-child(2) {
min-width: 1.3em; // So that process icons align with their node's icons
color: @gray;
}
> span {
font-size: 1.25em;
&.op {
padding: .1em .5em;
border-radius: .5em;
background-color: @gray-semilight;
font-weight: bold;
font-size: 1em;
color: @text-color-on-icinga-blue;
}
}
}
li.process.sortable-ghost details:not([open]) > summary {
border-bottom: none;
}
// TODO: Remove once support for Icinga Web 2.10.x is dropped
li.process details:not(.collapsible) {
&[open] > summary .expand-icon {
display: none;
}
&:not([open]) > summary .collapse-icon {
display: none;
}
}
// subprocess style
li.process > details ul {
padding-left: 2em;
list-style-type: none;
&.sortable {
min-height: 1em; // Required to be able to move items back to an otherwise empty list
}
}
// vertical layout
> li {
padding: @vertical-tree-item-gap 0;
&:first-child {
margin-top: @vertical-tree-item-gap;
}
&.process {
padding-bottom: 0;
&:first-child {
margin-top: 0;
padding-top: 0;
}
}
}
// horizontal layout
li.process summary,
li:not(.process) {
display: flex;
align-items: center;
padding-left: .25em;
> * {
margin-right: .5em;
}
> :not(.overridden-state) + a.action-link {
margin-left: auto; // Let the first action link move everything to the right
& + a.action-link {
margin-left: 0; // But really only the first one
}
}
.overridden-state {
margin-left: auto;
margin-right: 1em;
i.icon {
font-size: 0.75em;
line-height: 0.08333em;
vertical-align: 0.125em;
&::before {
margin: 0 .3em;
}
}
}
}
// collapse handling
li.process details:not([open]) {
margin-bottom: (@vertical-tree-item-gap * 2);
> ul.bp {
display: none;
}
}
// hover style
li.process:hover summary {
background-color: @tr-active-color;
}
li:not(.process):hover {
background-color: @tr-active-color;
}
li.process summary > .state-ball,
li:not(.process) > .state-ball {
border: .15em solid @body-bg-color;
&.size-s {
width: 7em/6em;
height: 7em/6em;
line-height: 7em/6em;
}
}
}
// ** Node inspect broken files **/
ul.broken-files {
.rounded-corners();
padding: 1em;
margin: 1em 0;
border: 2px solid @state-warning;
font-size: 1.25em;
list-style: none;
li {
padding-left: 1em;
font-weight: bold;
}
}
// ** END Node inspect broken files **/
/** BEGIN Dashboard **/
.overview-dashboard {
.header {
font-weight: bold;
display: block;
font-size: 1.25em;
}
i {
float: left;
font-size: 2.5em;
margin-top: -0.1em;
margin-bottom: 2em;
color: inherit;
}
.bp-root-tiles {
margin-left: 3em;
}
.dashboard-tile {
cursor: pointer;
padding: 1em;
&:hover {
background-color: @tr-hover-color;
}
.bp-link {
> a {
text-decoration: none;
color: @gray;
vertical-align: middle;
word-wrap: break-word;
width: 100%;
overflow: hidden;
> span.header {
color: @text-color;
}
}
}
}
.dashboard-tile,
div.action {
width: 20em;
display: inline-block;
vertical-align: top;
}
.action {
> a {
text-decoration: none;
color: @gray;
vertical-align: middle;
display: block;
padding: 1em;
word-wrap: break-word;
width: 100%;
overflow: hidden;
box-sizing: border-box;
&.addnew:hover {
background-color: @tr-hover-color;
}
> span.header {
color: @text-color;
}
}
}
}
#layout.fullscreen-layout {
@noOfBadgesPerRow: 3;
.overview-dashboard {
display: flex;
flex-wrap: wrap;
.dashboard-tile {
flex: 1 1 auto;
.bp-root-tiles-fullscreen {
@columnGapWidth: 1px;
display: flex;
flex-wrap: wrap;
gap: @columnGapWidth;
.badge {
@minColumnWidth: 100%/@noOfBadgesPerRow;
flex: 1 1 ~"calc(@{minColumnWidth} - @{columnGapWidth})";
.text-ellipsis();
}
}
}
}
}
/** END Dashboard **/
// State summary badges
.state-badges {
.state-badges();
&.state-badges li > ul > li:last-child {
margin-left: 0;
}
li > ul > li:first-child:not(:last-child) .state-badge {
border-right: 0;
}
}
// Node children count
.item-count {
font-size: 1em;
text-align: center;
color: @text-color-inverted;
}
div.bp .state-badges {
display: inline-block;
padding-top: 0;
}
td > a > .state-badges {
background-color: transparent;
}
.state-badge {
font-size: .8em;
border: 1px solid @body-bg-color;
&.state-missing {
background: @gray-semilight;
color: @text-color-on-icinga-blue;
}
&.state-critical.handled, &.state-down.handled { background: @color-critical-handled; opacity: 1; }
&.state-unknown.handled { background-color: @color-unknown-handled; opacity: 1; }
&.state-warning.handled { background: @color-warning-handled; opacity: 1; }
}
/** END Badges **/
/** BEGIN Tiles **/
.tiles:after {
content:'';
display:block;
clear: both;
}
.tiles.sortable > .sortable-ghost {
opacity: 0.5;
border: .2em dashed @gray;
}
.tiles > div {
color: @text-color-on-icinga-blue;
width: 12em;
display: inline-block;
float: left;
vertical-align: top;
margin-right: 0.2em;
margin-bottom: 0.2em;
height: 6em;
cursor: pointer;
position: relative;
.item-count {
margin-right: .5em;
}
.state-badges {
position: absolute;
bottom: 0;
right: 0;
margin: 0.5em;
text-align: center;
font-size: 0.5em;
}
.overridden-state {
font-size: .75em;
position: absolute;
left: 0;
bottom: 0;
margin: .5em;
border: 1px solid @body-bg-color;
}
> a {
display: block;
text-decoration: none;
font-size: 0.7em;
text-align: center;
padding: 1em 1em 0;
font-weight: bold;
word-wrap: break-word;
}
&:hover {
box-shadow: 0 0 .2em @gray;
}
.actions {
opacity: 0.8;
margin: 0.5em 0.5em 0 0.5em;
font-size: 0.75em;
height: 1.8em;
i {
float: none;
display: block;
width: 100%;
font-size: 1em;
line-height: normal;
margin: 0;
padding: 0 0 0 0.25em;
&.handled-icon {
display: inline-block;
margin-top: 0.15em;
float: right;
width: 1.5em;
height: 1.5em;
}
}
a {
margin: 0;
padding: 0;
display: inline-block;
width: 1.5em;
height: 1.5em;
border-radius: 0.3em;
}
a:hover {
background-color: @body-bg-color;
color: @text-color;
}
> .node-info {
margin-right: 0.3em;
float: right;
}
}
}
.tiles.sortable:not([data-sortable-disabled="true"]) {
> div {
cursor: grab;
&.sortable-chosen {
cursor: grabbing;
}
}
&.progress > div {
cursor: wait;
}
}
.tiles > div.parent::before {
content: '&';
position: absolute;
font-size: 1.2em;
}
.tiles > div.parent {
width: 100%;
height: 2em;
}
.tiles {
> .critical { background-color: @color-critical; > a { text-shadow: 0 0 1px mix(#000, @color-critical, 40%); }}
> .critical.handled { background-color: @color-critical-handled; > a { text-shadow: 0 0 1px mix(#000, @color-critical-handled, 40%); }}
> .down { background-color: @color-critical; > a { text-shadow: 0 0 1px mix(#000, @color-critical, 40%); }}
> .down.handled { background-color: @color-critical-handled; > a { text-shadow: 0 0 1px mix(#000, @color-critical-handled, 40%); }}
> .unknown { background-color: @color-unknown; > a { text-shadow: 0 0 1px mix(#000, @color-unknown, 40%); }}
> .unknown.handled { background-color: @color-unknown-handled; > a { text-shadow: 0 0 1px mix(#000, @color-unknown-handled, 40%); }}
> .unreachable { background-color: @color-unknown; > a { text-shadow: 0 0 1px mix(#000, @color-unknown, 40%); }}
> .unreachable.handled { background-color: @color-unknown-handled; > a { text-shadow: 0 0 1px mix(#000, @color-unknown-handled, 40%); }}
> .warning { background-color: @color-warning; > a { text-shadow: 0 0 1px mix(#000, @color-warning, 40%); }}
> .warning.handled { background-color: @color-warning-handled; > a { text-shadow: 0 0 1px mix(#000, @color-warning-handled, 40%); }}
> .ok { background-color: @color-ok; > a { text-shadow: 0 0 1px mix(#000, @color-ok, 40%); }}
> .up { background-color: @color-ok; > a { text-shadow: 0 0 1px mix(#000, @color-ok, 40%); }}
> .pending { background-color: @color-pending; > a { text-shadow: 0 0 1px mix(#000, @color-pending, 40%); }}
> .missing { background-color: @gray-semilight; > a { color: @text-color-on-icinga-blue; }}
> .empty { background-color: @gray-semilight; > a { color: @text-color-on-icinga-blue; }}
}
.tiles.few { font-size: 2.5em; }
.tiles.normal { font-size: 2.1em; }
.tiles.many { font-size: 1.8em; }
#layout.twocols, #layout.layout-minimal, div.compact {
.tiles.few { font-size: 1.8em; }
.tiles.normal { font-size: 1.8em; }
.tiles.many { font-size: 1.8em; }
}
#layout.fullscreen-layout .controls {
padding: 0 1em;
}
/** END of tiles **/
.content.restricted {
h1 {
font-size: 2em;
}
p > a {
margin-left: 1em;
}
}
/** BEGIN breadcrumb **/
.breadcrumb {
list-style: none;
overflow: hidden;
padding: 0;
}
.breadcrumb:after {
content:'';
display:block;
clear: both;
}
.breadcrumb li {
float: left;
cursor: pointer;
user-select: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
}
.breadcrumb li a {
color: @icinga-blue;
margin: 0;
font-size: 1.2em;
text-decoration: none;
padding-left: 2em;
line-height: 2.5em;
position: relative;
display: block;
float: left;
&:focus {
outline: none;
}
> .state-ball {
margin-right: .5em;
border: .15em solid @body-bg-color;
&.size-s {
width: 7em/6em;
height: 7em/6em;
line-height: 7em/6em;
}
}
}
.breadcrumb li {
border: 1px solid @gray-lighter;
&:first-of-type {
border-radius: .25em;
}
&:last-of-type {
border-radius: .25em;
border: 1px solid transparent;
background: @icinga-blue;
color: @text-color-on-icinga-blue;
padding-right: 1.2em;
a {
color: @text-color-on-icinga-blue;
}
}
}
.breadcrumb li:not(:last-of-type) a:before, .breadcrumb li:not(:last-of-type) a:after {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 1.3em solid transparent;
border-bottom: 1.2em solid transparent;
position: absolute;
margin-top: -1.2em;
top: 50%;
left: 100%;
}
.breadcrumb li:not(:last-of-type) a:before {
border-left: 1.2em solid @gray-lighter;
margin-left: 1px;
z-index: 1;
}
.breadcrumb li:not(:last-of-type) a:after {
border-left: 1.2em solid @body-bg-color;
z-index: 2;
}
&.impact {
.breadcrumb li:not(:last-of-type) a:after {
.transition(border-left-color 2s 0.66s linear ~'!important');
border-left-color: @gray-lighter;
}
.breadcrumb li:not(:last-of-type) a:before {
.transition(border-left-color 2s 1s linear ~'!important');
border-left-color: @gray-light;
}
.breadcrumb li:not(:last-of-type) {
.transition(border-color 2s 1s linear ~'!important');
border-color: @gray-light;
}
.breadcrumb li:not(:last-of-type) a:hover {
background-color: transparent !important;
color: @icinga-blue;
}
}
.tabs > .dropdown-nav-item > ul {
z-index: 100;
}
.breadcrumb li:first-child a {
padding-left: 1em;
padding-right: 0.5em;
}
.breadcrumb li:not(:last-child) a:hover { background: @icinga-blue; color: @text-color-on-icinga-blue; }
.breadcrumb li:not(:last-child) a:hover:after { border-left-color: @icinga-blue; }
.breadcrumb li:last-child:hover, .breadcrumb li:last-child a:hover { background: @icinga-blue; border-color: @icinga-blue; }
.breadcrumb li a:focus {
text-decoration: underline;
}
#layout.twocols, #layout.layout-minimal, div.compact {
.breadcrumb {
font-size: 0.833em;
}
}
/** END of breadcrumb **/
ul.error, ul.warning {
padding: 0;
list-style-type: none;
background-color: @color-critical;
li {
font-weight: bold;
color: @text-color-on-icinga-blue;
padding: 0.3em 0.8em;
}
li a,
li .link-button {
color: inherit;
text-decoration: underline;
&:hover {
text-decoration: none;
}
}
}
ul.warning {
background-color: @color-warning;
}
table.sourcecode {
font-family: monospace;
white-space: pre-wrap;
th {
vertical-align: top;
padding-right: 0.5em;
user-select: none;
-moz-user-select: none;
-o-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
font-weight: bold;
}
td {
vertical-align: top;
}
}
/** Forms stolen from director **/
.content form {
margin-bottom: 2em;
}
.content form.inline {
margin: 0;
}
.invisible {
position: absolute;
left: -100%;
}
form.bp-form {
input[type=file] {
padding-right: 1em;
}
input[type=submit]:first-of-type {
border-width: 2px;
}
p.description {
padding: 1em 1em;
margin: 0;
font-style: italic;
width: 100%;
}
ul.form-errors {
margin-bottom: 0.5em;
ul.errors li {
background: @color-critical;
font-weight: bold;
padding: 0.5em 1em;
color: @text-color-on-icinga-blue;
}
}
input[type=text], input[type=password], input[type=file], textarea, select {
max-width: 36em;
min-width: 20em;
width: 100%;
}
label {
line-height: 2em;
}
dl {
margin: 0;
padding: 0;
}
select option {
padding-left: 0.5em;
}
dt label {
width: auto;
font-weight: normal;
font-size: inherit;
&.required {
&::after {
content: '*'
}
}
&:hover {
text-decoration: underline;
cursor: pointer;
}
}
fieldset {
min-width: 36em;
}
dd input.related-action[type='submit'] {
display: none;
}
dd.active li.active input.related-action[type='submit'] {
display: inline-block;
}
dd.active {
p.description {
color: inherit;
font-style: normal;
}
}
dd {
padding: 0.3em 0.5em;
margin: 0;
}
dt {
padding: 0.5em 0.5em;
margin: 0;
}
dt.active, dd.active {
background-color: @tr-active-color;
}
dt {
display: inline-block;
vertical-align: top;
min-width: 12em;
min-height: 2.5em;
width: 30%;
&.errors label {
color: @color-critical;
}
}
.errors label {
color: @color-critical;
}
dd {
display: inline-block;
width: 63%;
min-height: 2.5em;
vertical-align: top;
margin: 0;
&.errors {
input[type=text], select {
border-color: @color-critical;
}
}
&.full-width {
padding: 0.5em;
width: 100%;
}
}
dd:after {
display: block;
content: '';
}
textarea {
height: auto;
}
dd ul.errors {
list-style-type: none;
padding-left: 0.3em;
li {
color: @color-critical;
padding: 0.3em;
}
}
#_FAKE_SUBMIT {
position: absolute;
left: -100%;
}
}
/** END of forms **/
/* Form fallback styles, remove once <=2.9.5 support is dropped */
.icinga-controls {
input[type="file"] {
background-color: @low-sat-blue;
}
button[type="button"] {
background-color: @low-sat-blue;
}
}
form.icinga-form {
input[type="file"] {
flex: 1 1 auto;
width: 0;
}
button[type="button"] {
line-height: normal;
}
}
/* Form fallback styles end */
/** Custom font styling **/
textarea.smaller {
font-size: 0.833em;
max-width: 60em;
}
/** END of custom font styling **/