// SPDX-License-Identifier: MIT
// Copyright (c) 2020-2023 The Pybricks Authors

// css files
@use 'normalize.css/normalize';
@use '@blueprintjs/core/lib/css/blueprint';

// sass files
@use 'sass:color';
@use 'sass:math';
@use 'variables' as pb;
@use '@blueprintjs/core/lib/scss/variables' as bp;

// use :focus-visible instead of :focus (so we don't need blueprint.js focus style manager)

:focus {
    outline: none;
}

.#{bp.$ns}-control input:focus ~ .#{bp.$ns}-control-indicator {
    outline: none;

    .#{bp.$ns}-dark & {
        outline: none;
    }
}

// show focus for tree nodes even if mouse click it
.#{bp.$ns}-tree-node:focus:not(.pb-focus-managed),
// react-aria managed focus visibility
.pb-focus-ring,
// broswer managed focus visibility
:focus-visible:not(.pb-focus-managed) {
    @include pb.focus-outline(0);
}

// these controls need extra separation for better visibility
.#{bp.$ns}-control input:focus-visible ~ .#{bp.$ns}-control-indicator {
    @include pb.focus-outline(2px);
}

body {
    // no scrolling of the page
    overflow: hidden;
    user-select: none;
    width: 100%;
    height: 100%;
    position: absolute;
}

#root {
    width: 100%;
    height: 100%;

    & [data-overlay-container] {
        width: 100%;
        height: 100%;
    }
}

// Utility classes - do not use these in new code!

.h-100 {
    height: 100%;
}

.no-wrap {
    white-space: nowrap;
}

// shared styles

.pb-dropzone-root {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: bp.$pt-grid-size * 2;
    border-width: 2;
    border-radius: 2;
    border-style: dashed;
    border-color: bp.$pt-divider-black;
    background-color: bp.$pt-app-background-color;
    color: bp.$pt-text-color-muted;
    outline: none;
    transition: border 0.24s ease-in-out;

    .#{bp.$ns}-dark & {
        border-color: bp.$pt-dark-divider-white;
        background-color: bp.$pt-dark-app-background-color;
        color: bp.$pt-dark-text-color-muted;
    }
}

.pb-spacer {
    height: bp.$pt-grid-size * 2;
}

// global style tweaks

.#{bp.$ns}-toast {
    user-select: text;
    max-width: 700px;

    &.#{bp.$ns}-intent-primary {
        background-color: pb.$pybricks-blue;

        & .#{bp.$ns}-button {
            background-color: pb.$pybricks-blue !important;

            &:hover {
                background: color.adjust(pb.$pybricks-blue, $lightness: -5%) !important;
            }
        }
    }
}

.#{bp.$ns}-button {
    user-select: none;

    &.#{bp.$ns}-intent-primary {
        background: pb.$pybricks-blue;

        &.#{bp.$ns}-minimal {
            background: none;
        }

        &:hover {
            background: color.adjust(pb.$pybricks-blue, $lightness: -5%);
        }

        &:disabled,
        &.#{bp.$ns}-disabled {
            background: rgba(pb.$pybricks-blue, 0.5);
        }
    }

    &-text > img {
        display: block;
    }

    &-group:not(.#{bp.$ns}-minimal) {
        & > .#{bp.$ns}-popover-wrapper:not(:last-child) .#{bp.$ns}-button,
        & > .#{bp.$ns}-button:not(:last-child) {
            margin-right: 0px;
        }
    }
}

a.#{bp.$ns}-button {
    text-align: left;
}

.#{bp.$ns}-dialog-footer-actions {
    flex-wrap: wrap;
    row-gap: 10px;
}

.#{bp.$ns}-control {
    & input:checked ~ .#{bp.$ns}-control-indicator,
    &.#{bp.$ns}-switch input:checked ~ .#{bp.$ns}-control-indicator {
        background-color: pb.$pybricks-blue;

        .#{bp.$ns}-dark & {
            background-color: pb.$pybricks-blue;
        }
    }

    // make disabled:checked radio buttons appear as not checked
    &.#{bp.$ns}-radio input:disabled:checked ~ .#{bp.$ns}-control-indicator {
        // color definition is same as $minimal-button-background-color-hover,
        // which is used to define $control-background-color-disabled and
        // $dark-control-background-color-disabled variables
        background: rgba(bp.$gray3, 0.15);

        &:before {
            background-image: unset;
        }
    }
}

.#{bp.$ns}-control-group {
    gap: bp.$pt-grid-size * 0.5;
}

.#{bp.$ns}-form-group > .#{bp.$ns}-label {
    font-weight: bolder;
}

.#{bp.$ns}-input-group {
    & .#{bp.$ns}-icon {
        margin: 7px;

        &.#{bp.$ns}-intent-danger {
            color: bp.$red4;
        }
    }

    & .#{bp.$ns}-input-action {
        bottom: 0;
        display: flex;
        align-items: center;
    }
}

// don't take up so much space when there is no caret
.#{bp.$ns}-tree-node-caret-none {
    // $pt-grid-size / 2 matches padding on .#{bp.$ns}-tree-node-conent
    min-width: math.div(bp.$pt-grid-size, 2);
}

.#{bp.$ns}-running-text {
    *:first-child {
        margin-top: 0;
    }

    *:last-child {
        margin-bottom: 0;
    }
}

// make scrollbars fit our style
::-webkit-scrollbar {
    width: 16px;

    &-track {
        background: bp.$pt-app-background-color;

        .#{bp.$ns}-dark & {
            background: bp.$pt-dark-app-background-color;
        }
    }

    &-thumb {
        border-width: 3px;
        border-style: solid;
        border-radius: 8px;
        border-color: bp.$pt-app-background-color;
        background: bp.$pt-icon-color;

        &:hover {
            background: bp.$pt-icon-color-hover;
        }

        .#{bp.$ns}-dark & {
            border-color: bp.$pt-dark-app-background-color;
            background: bp.$pt-dark-icon-color;

            &:hover {
                background: bp.$pt-dark-icon-color-hover;
            }
        }
    }
}
