// SPDX-FileCopyrightText: 2018 Icinga GmbH <https://icinga.com>
// SPDX-License-Identifier: GPL-3.0-or-later

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 **/
