/* index.css - styles for index.html and generally main parts of the app
   For shared styles (such as color definitions) check out base.css. */

/* Main container layout */

body {
    width: 100vw;
    height: 100vh;

    font-size: 14px;
}

main {
    width: 100%;
    height: 100%;
    position: relative;

    & > .fullscreen {
        width: 100%;
        height: 100%;
        max-width: 100%;
        max-height: 100%;
        position: absolute;
        left: 0;
        top: 0;
    }

    & > .panels {
        --right-width: 384px; /* Overridden by JavaScript */

        box-sizing: border-box;
        padding: 16px;

        display: grid;
        grid-template-columns: [left] 1fr [right-resize] auto [right] minmax(
                0,
                var(--right-width)
            );

        /* Pass all events through. Children may receive events as normal. */
        pointer-events: none;

        & > * {
            pointer-events: all;
        }

        & > .right {
            grid-column: right / right;
            min-height: 0;

            display: grid;
            grid-template-rows: minmax(0, min-content);
            grid-template-columns: [floating] max-content [resize] min-content [docked] auto;

            padding-left: 16px;

            pointer-events: none;

            & > * {
                min-width: 0;
                min-height: 0;
            }

            & > rkgk-resize-handle {
                pointer-events: auto;
            }

            & > .docked > rkgk-brush-editor {
                max-height: 100%;
                pointer-events: auto;
            }

            & > .floating {
                display: flex;
                flex-direction: column;

                gap: 12px;

                & > rkgk-brush-preview {
                    width: 128px;
                    height: 128px;
                    pointer-events: auto;
                }

                & > rkgk-brush-cost-gauges {
                    width: 100%;
                    pointer-events: auto;
                }
            }
        }
    }

    & > rkgk-canvas-renderer {
        width: 100%;
        height: 100%;
        position: absolute;
        left: 0;
        top: 0;
    }

    & > rkgk-reticle-renderer {
        width: 100%;
        height: 100%;
        position: absolute;
        left: 0;
        top: 0;
        overflow: hidden;
    }

    & > #js-loading {
        background-color: var(--color-panel-background);

        display: flex;
        align-items: center;
        justify-content: center;
    }
}

/* Resize handle */

rkgk-resize-handle {
    &[data-direction="vertical"] {
        display: block;
        width: 16px;
        height: 100%;

        cursor: col-resize;

        & > .visual {
            width: 2px;
            height: 100%;
            background-color: var(--color-brand-blue);
            margin: 0 auto;
            opacity: 0%;
        }

        &:hover > .visual,
        &.dragging > .visual {
            opacity: 100%;
        }
    }
}

/* Canvas renderer */

rkgk-canvas-renderer {
    display: block;

    & > canvas {
        display: block;
    }
}

/* Reticle renderer */

rkgk-reticle-renderer {
    display: block;

    pointer-events: none;

    & > .reticles {
        position: relative;
    }
}

rkgk-reticle-cursor {
    --color: black; /* Overridden by JavaScript to set a per-user color. */

    position: absolute;
    display: block;

    & > .container {
        & > .arrow {
            width: 24px;
            height: 24px;
            background-color: var(--color);
            clip-path: path("M 0,0 L 13,13 L 6,13 L 0,19 Z");
        }

        & > .nickname {
            position: absolute;
            top: 20px;
            left: 8px;
            width: max-content;

            color: white;
            background-color: var(--color);
            padding: 1px 6px;
            border-radius: 9999px;
            text-align: center;
            font-weight: bold;
        }
    }
}

/* Code editor */

rkgk-code-editor {
    --gutter-width: 2.75em;

    display: block;
    position: relative;
    width: 100%;

    overflow: auto;

    & > .layer {
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        box-sizing: border-box;

        margin: 0;

        pointer-events: none;

        display: flex;
        flex-direction: column;

        & > .line {
            flex-shrink: 0;
            white-space: pre-wrap;

            min-height: var(--line-height-em);
        }
    }

    & > .layer-gutter {
        user-select: none;

        counter-reset: line;

        color: transparent;

        & > .line {
            display: flex;
            flex-direction: row;

            counter-increment: line;

            &::before {
                flex-shrink: 0;

                display: block;
                width: var(--gutter-width);
                padding-right: 0.75em;
                box-sizing: border-box;

                content: counter(line);
                text-align: right;

                color: var(--color-text);
                opacity: 40%;
            }
        }
    }

    & > .layer:not(.layer-gutter) {
        margin-left: var(--gutter-width);
        width: calc(100% - var(--gutter-width));
    }

    & > .layer-error-squiggles {
        color: transparent;

        & > .line {
            & > .squiggle {
                text-decoration: underline wavy black;
                text-decoration-skip-ink: none;
            }

            & > .squiggle-error {
                text-decoration-color: var(--color-error);
            }
        }
    }

    & > textarea {
        display: block;
        width: calc(100% - var(--gutter-width));
        margin: 0;
        margin-left: var(--gutter-width);
        padding: 0;
        box-sizing: border-box;
        overflow: hidden;
        resize: none;
        white-space: pre-wrap;
        border: none;

        &:focus {
            outline: none;
        }
    }

    &:has(textarea:focus) {
        outline: 1px solid var(--color-brand-blue);
        outline-offset: 4px;
    }
}

/* Brush editor */

rkgk-brush-editor.rkgk-panel {
    padding: 12px;

    display: flex;
    flex-direction: column;
    gap: 4px;

    position: relative;

    & > .text-area {
        display: block;
        width: 100%;
        margin: 0;
        resize: none;
        white-space: pre-wrap;
        border: none;
        overflow: hidden;
        box-sizing: border-box;
    }

    & > .errors:empty,
    & > .error-header:empty {
        display: none;
    }

    & > .error-header {
        margin: 0;
        margin-top: 0.5em;
        font-size: 1rem;
        color: var(--color-error);
    }

    & > .errors {
        margin: 0;
        color: var(--color-error);
        white-space: pre-wrap;
    }
}

/* Brush preview */

rkgk-brush-preview {
    --checkerboard-light: #f2f2f2;
    --checkerboard-dark: #e1e1e1;
    --checkerboard-size: 64px;

    display: block;
    position: relative;

    background: repeating-conic-gradient(
            var(--checkerboard-light) 0% 25%,
            var(--checkerboard-dark) 0% 50%
        )
        50% 50% / var(--checkerboard-size) var(--checkerboard-size);
    border-radius: 4px;

    & > canvas {
        border-radius: 4px;
    }

    &.error {
        & > canvas {
            display: none;
        }

        &::before {
            content: "(error)";
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
        }
    }
}

/* Brush cost gauges */

rkgk-brush-cost-gauges,
rkgk-brush-cost-gauges.rkgk-panel {
    --gauge-size: 20px;

    height: var(--gauge-size);
    border-radius: 4px;

    display: flex;
    flex-direction: row;

    overflow: clip; /* clip corners */

    & > rkgk-brush-cost-gauge {
        display: block;
        height: var(--gauge-size);
        flex-grow: 1;

        & > .full {
            width: 100%;
            height: 100%;

            clip-path: xywh(0 0 var(--progress) 100%);

            background-color: var(--gauge-color);
        }

        &.code-size {
            --gauge-color: var(--color-brand-blue);
        }
        &.fuel {
            --gauge-color: #f44096;
        }
        &.objects {
            --gauge-color: #fd9916;
        }
        &.memory {
            --gauge-color: #5aca40;
        }
    }
}

/* Welcome screen */

rkgk-welcome {
    & > dialog {
        h3 {
            margin: 0.5rem 0;
            font-size: 2rem;
            font-weight: bold;
        }
    }
}

/* Connection status dialogs */

rkgk-connection-status {
    & > dialog[name="logging-in-dialog"][open],
    & > dialog[name="disconnected-dialog"][open] {
        border: none;
        outline: none;
        background: none;

        display: flex;
        gap: 8px;
        align-items: center;
    }

    & > dialog[name="error-dialog"][open] {
        & textarea[name="error-text"] {
            box-sizing: border-box;
            width: 100%;
            resize: none;
            border: 1px solid var(--color-panel-border);
            padding: 4px;
        }
    }
}

/* Menu bar */

.menu-bar {
    --border-radius: 4px;

    display: flex;
    align-items: center;
    box-sizing: border-box;

    width: fit-content;
    height: 24px;
    border-radius: var(--border-radius);

    & > a {
        display: block;

        color: var(--color-text);
        padding: 4px 8px;
        text-decoration: none;

        line-height: 1;

        &:hover {
            background-color: var(--color-shaded-background);
        }

        &.icon {
            width: 24px;
            height: 24px;
        }

        &:first-child {
            border-top-left-radius: var(--border-radius);
            border-bottom-left-radius: var(--border-radius);
        }

        &:last-child {
            border-top-right-radius: var(--border-radius);
            border-bottom-right-radius: var(--border-radius);
        }
    }

    & > hr {
        height: 100%;
        margin: 0;
        border: none;
        border-right: 1px solid var(--color-panel-border);
    }
}
