/* fallback */
@font-face {
  font-family: 'Material Symbols Outlined';
  font-style: normal;
  font-weight: 400;
  src: url(/static/fonts/icons.woff2) format('woff2');
}

.material-symbols-outlined, .mso {
    font-family: 'Material Symbols Outlined';
    font-weight: normal;
    font-style: normal;
    font-size: 24px;
    line-height: 1;
    letter-spacing: normal;
    text-transform: none;
    display: inline-block;
    white-space: nowrap;
    word-wrap: normal;
    direction: ltr;
    -webkit-font-feature-settings: 'liga';
    -webkit-font-smoothing: antialiased;

    cursor: pointer;
}

.display-flex {
    display: flex;
}

[v-cloak] {
    display: none;
}


.form-check {
    width: 24px;
}

.alert {
    cursor: pointer;
}

.block-title-expanding {
    cursor: pointer;
    margin-left: -9px;
}

.toggler {
    font-size: 24px;
    margin-right: 5px;
    margin-bottom: 2px;
    transform: scaleY(1.5);
    transition: 0.3s;
}

.toggler.down {
    transform: rotate(90deg) scaleY(1.5);
}

.indicator {
    cursor: default;
    width: 24px;
    height: 24px;
    border-radius: 100%;
    background: gray;
}

.indicator.enabled {
    background: green;
}

input.time, input.date {
    width: 7ch;
}

.sticky-topbar {
    position: sticky;
    top: 0;
    z-index: 1000;
    background: var(--bs-body-bg);
    padding-top: 10px;
}

.time-label {
    min-width: 7ch;
}

.robot-status-item {
    background: var(--bs-gray-800);
    border-style: solid;
    border-width: var(--bs-border-width);
    border-color: var(--bs-border-color-translucent);
    border-radius: var(--bs-border-radius);
}

.rsi-indicator {
    width: 16px;
    height: 16px;
    border-radius: 100%;
    background: var(--bs-gray-600);
}

.rsi-indicator.enabled {
    background: var(--bs-success);
}

.rsi-indicator.disabled {
    background: var(--bs-danger)!important;
}

.rsi-indicator > .mso {
    font-size: 30px;
}

.rsi-value {

}

.switch-ts {

}

.alert-absolute {
    position: absolute;
    top: 10px;
    left: 50%;
    transform: translateX(-50%);
    width: 100%;
    padding: 0 10px;
}

#cartography-menu, .statuses, #cleaning {
    background: rgba(var(--bs-body-bg-rgb), 0.8);
}

#cartography-menu {
    border-end-end-radius: 10px;
    overflow-y: auto;
    max-height: 100vh;
}

.statuses {
    border-end-start-radius: 10px;
}

.executor-status-badge {
    font-size: 0.8rem;
    padding: 0.25em 0.6em;
    color: #fff;
    font-weight: 500;
    white-space: nowrap;
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}

#cleaning {
    border-start-end-radius: 10px;
}

#cleaning-info {
    transition: max-height 0.6s ease-out, margin 0.6s ease-out, transform 0.6s ease-out, opacity 0.4s ease-out;
    max-height: 300px;
}

.hide-button {
    background-color: rgba(var(--bs-body-bg-rgb), 0.8);
    border-start-end-radius: 10px;
    border-start-start-radius: 10px;
    height: 20px;
}

.hide-info {
    transform: translateY(100%);
    opacity: 0;
    pointer-events: none;
    margin-bottom: 0!important;
    max-height: 0 !important;
}

#cartography-menu-toggle > .mso {
    font-size: 30px;
}

#joystick-container {
    position: relative;
    width: 150px;
    height: 150px;
    background: #ddd;
    border: 2px solid #999;
    border-radius: 50%;
    touch-action: none; /* Prevent default touch behaviors */
}

#joystick-knob {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 60px;
    height: 60px;
    background: #555;
    border: 2px solid #333;
    border-radius: 50%;
    transform: translate(-50%, -50%);
    transition: background 0.2s;
}

#joystick-knob.active {
    background: #777;
}

#output {
    margin-top: 20px;
    font-size: 1.2em;
}

#output p {
    margin: 5px 0;
}

.circular-progress {
    /* Set the size of the circle */
    width: 560px;
    height: 560px;
    /* Make it circular */
    border-radius: 50%;
    /* Create the circular gradient based on a CSS variable --progress */
    /* Multiply progress (in percent) by 3.6 to get degrees (since 100% → 360deg) */
    background: conic-gradient(
            var(--bs-blue) 0deg calc(var(--progress, 0) * 3.6deg),
            var(--bs-dark) calc(var(--progress, 0) * 3.6deg) 360deg
    );
    /* Use flexbox to center the inner content */
    display: flex;
    align-items: center;
    justify-content: center;
    /* Position relative for inner absolute element */
    position: relative;
}

.circular-progress.pause {
    color: var(--bs-gray-500);
    background: conic-gradient(
            var(--bs-yellow) 0deg calc(var(--progress, 0) * 3.6deg),
            var(--bs-dark) calc(var(--progress, 0) * 3.6deg) 360deg
    );
}

/* Inner circle to create a “donut” effect */
.circular-progress .progress-inner {
    width: 500px;
    height: 500px;
    border-radius: 50%;
    background: #4b5764; /* or whatever background color fits your design */
    display: flex;
    align-items: center;
    justify-content: center;
    position: absolute;
    /* Optional: add a box shadow or border */
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1);
}

.progress-inner span {
    font-size: 100px;
}
:root {
    --eye-size: 300px;
    --pupil-size: 120px;
    --animation-duration: 5s;
}

#backdrop {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    overflow: hidden;
    z-index: 1050;
    background-color: #1a1d20;
    display: flex;
    align-items: center;
    justify-content: center;
}

.eyes {
    display: flex;
    gap: calc(var(--eye-size) / 2);
}

.eye {
    width: var(--eye-size);
    height: calc(var(--eye-size) * 1.4);
    background-color: white;
    position: relative;
    overflow: hidden;
    image-rendering: pixelated;
    border-radius: 20%;
}

.eye::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: black;
    transform-origin: top;
    animation: blink var(--animation-duration) infinite;
}

@keyframes blink {
    0%, 7%, 90%, 97%, 100% {
        transform: scaleY(0);
    }
    3%, 93% {
        transform: scaleY(1);
    }
}

.pupil {
    width: var(--pupil-size);
    height: var(--pupil-size);
    background-color: black;
    position: absolute;
    top: calc(50% - var(--pupil-size) / 2);
    left: calc(50% - var(--pupil-size) / 2);
    animation: look-around var(--animation-duration) infinite;
    border-radius: 20%;
}

@keyframes look-around {
    0%, 15%, 50%, 55%, 85%, 100% {
        top: calc(50% - var(--pupil-size) / 2);
        left: calc(50% - var(--pupil-size) / 2);
    }
    25%, 40% {
        top: calc(50% - var(--pupil-size) / 2);
        left: calc(30% - var(--pupil-size) / 2);
    }
    65%, 75% {
        top: calc(50% - var(--pupil-size) / 2);
        left: calc(70% - var(--pupil-size) / 2);
    }
}

.no-select {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

/* Dashboard */
.dash-card {
    display: flex;
    border-radius: var(--bs-border-radius);
    overflow: hidden;
    background: var(--bs-gray-800);
    border: 1px solid var(--bs-border-color-translucent);
    transition: opacity 0.3s;
}

.dash-card__strip {
    width: 5px;
    flex-shrink: 0;
    background: var(--bs-gray-600);
}

.dash-card__content {
    flex: 1;
    min-width: 0;
    padding: 0.75rem 1rem;
}

/* Online: bright card, green strip + glow */
.dash-card--online .dash-card__strip {
    background: var(--bs-success);
    box-shadow: 0 0 8px var(--bs-success);
}

/* Stale: amber strip */
.dash-card--stale .dash-card__strip {
    background: var(--bs-warning);
}
.dash-card--stale {
    opacity: 0.75;
}

/* Offline: dim card, red strip */
.dash-card--offline .dash-card__strip {
    background: var(--bs-danger);
}
.dash-card--offline {
    opacity: 0.45;
}
.dash-card--offline:hover {
    opacity: 0.7;
}

/* Emergency: red border */
.dash-card--emergency {
    border-color: var(--bs-danger) !important;
    box-shadow: 0 0 10px rgba(var(--bs-danger-rgb), 0.3);
}

/* Pulsing dot for online status */
.dash-pulse {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
    background: var(--bs-gray-600);
}

.dash-pulse--online {
    background: var(--bs-success);
    animation: dash-blink 2s ease-in-out infinite;
}

.dash-pulse--stale {
    background: var(--bs-warning);
}

.dash-pulse--offline {
    background: var(--bs-danger);
    opacity: 0.6;
}

@keyframes dash-blink {
    0%, 100% { box-shadow: 0 0 0 0 rgba(var(--bs-success-rgb), 0.5); }
    50% { box-shadow: 0 0 0 4px rgba(var(--bs-success-rgb), 0); }
}

.dash-card__footer {
    border-top: 1px solid var(--bs-border-color-translucent);
    padding-top: 0.5rem;
    margin-top: 0.5rem;
}

/* Progress bars inside dashboard cards — visible track */
.dash-card .progress {
    background: var(--bs-gray-700);
    border: 1px solid var(--bs-gray-600);
    border-radius: 3px;
}

/* Camera picture-in-picture overlay */
#camera-pip {
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 4px 20px rgba(0,0,0,0.5);
    border: 1px solid rgba(255,255,255,0.1);
    background: #1a1a2e;
    cursor: grab;
    resize: both;
    max-width: 50vw;
    min-width: 160px;
    transition: box-shadow 0.2s;
}
#camera-pip:hover { box-shadow: 0 6px 28px rgba(0,0,0,0.7); }
#camera-pip:active { cursor: grabbing; }
.camera-pip-header {
    background: rgba(26,26,46,0.95);
    cursor: grab;
    user-select: none;
}

/* Video download progress overlay */
.video-dl-overlay {
    position: fixed;
    inset: 0;
    z-index: 9999;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(0,0,0,0);
    backdrop-filter: blur(0px);
    transition: background 0.3s, backdrop-filter 0.3s;
}
.video-dl-overlay.active {
    background: rgba(0,0,0,0.6);
    backdrop-filter: blur(6px);
}
.video-dl-card {
    background: #16162a;
    border: 1px solid rgba(74,158,255,0.15);
    border-radius: 12px;
    padding: 28px 32px;
    width: 400px;
    max-width: 90vw;
    box-shadow: 0 16px 48px rgba(0,0,0,0.5);
    transform: scale(0.95);
    opacity: 0;
    transition: transform 0.3s, opacity 0.3s;
}
.video-dl-overlay.active .video-dl-card {
    transform: scale(1);
    opacity: 1;
}
.video-dl-header {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: 17px;
    font-weight: 500;
    color: #e8e8f0;
    margin-bottom: 24px;
}
.video-dl-bar-track {
    height: 6px;
    background: rgba(255,255,255,0.06);
    border-radius: 3px;
    overflow: hidden;
}
.video-dl-bar-fill {
    height: 100%;
    width: 0%;
    background: linear-gradient(90deg, #3b82f6, #60a5fa);
    border-radius: 3px;
    transition: width 0.4s ease;
    box-shadow: 0 0 12px rgba(96,165,250,0.3);
}
.video-dl-info {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-top: 14px;
}
.video-dl-percent {
    font-family: 'SF Mono', Menlo, 'Cascadia Code', monospace;
    font-size: 22px;
    font-weight: 700;
    color: #60a5fa;
    letter-spacing: -0.5px;
}
.video-dl-frames {
    font-family: 'SF Mono', Menlo, 'Cascadia Code', monospace;
    font-size: 13px;
    color: #666;
}
.video-dl-status {
    font-size: 13px;
    color: #888;
    margin-top: 4px;
}
.video-dl-footer {
    display: flex;
    justify-content: flex-end;
    margin-top: 24px;
}

/* === Toolbox === */

:root {
    --tb-wheels: #3AAAD1;
    --tb-brushes: #F0B15D;
    --tb-bms: #4CAF50;
}

.tb-badge-wheels { background-color: var(--tb-wheels) !important; }
.tb-badge-brushes { background-color: var(--tb-brushes) !important; }
.tb-highlight-bms { border-left: 3px solid var(--tb-bms); }
.tb-highlight-new { border-left: 3px solid var(--tb-bms); }
.tb-highlight-removed {
    background-color: rgba(220, 53, 69, 0.15);
    border-left: 3px solid #dc3545;
}

.tb-odrive-context {
    background: var(--bs-gray-800);
    border: 1px solid var(--bs-border-color-translucent);
    border-radius: var(--bs-border-radius);
    padding: 0.5rem 0.75rem;
}

/* Chip-style tab group (VK-like capsule) */
.tb-chip-group {
    display: inline-flex;
    background: var(--bs-gray-800);
    border: 1px solid var(--bs-border-color-translucent);
    border-radius: 999px;
    padding: 3px;
    gap: 2px;
    list-style: none;
    flex-wrap: wrap;
}

.tb-chip-group .nav-item { margin: 0; }

.tb-chip-group .nav-link {
    border-radius: 999px;
    padding: 0.3rem 0.85rem;
    font-size: 0.875rem;
    color: var(--bs-body-color);
    background: transparent;
    border: none;
    transition: background 0.2s, color 0.2s;
    white-space: nowrap;
}

.tb-chip-group .nav-link:hover:not(.active) {
    background: var(--bs-gray-700);
}

.tb-chip-group .nav-link.active {
    background: var(--bs-primary);
    color: #fff;
}

/* Sub-tab variant: slightly smaller */
.tb-chip-group--sub .nav-link {
    padding: 0.25rem 0.65rem;
    font-size: 0.8125rem;
}

/* Override global form-check width constraint */
.tb-form-check-auto { width: auto; }

.tb-icon { font-size: 16px; }
.tb-icon-lg { font-size: 20px; }

/* === ODrive Preparation Wizard === */

.tb-prep-steps {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0;
    margin-bottom: 1.5rem;
    padding: 0 1rem;
}

.tb-prep-step {
    display: flex;
    flex-direction: column;
    align-items: center;
    position: relative;
    flex: 1;
    min-width: 0;
}

.tb-prep-step-dot {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 2px solid var(--bs-border-color);
    background: var(--bs-body-bg);
    color: var(--bs-secondary);
    font-size: 16px;
    z-index: 1;
    transition: all 0.3s ease;
}

.tb-prep-step-label {
    font-size: 0.75rem;
    margin-top: 0.35rem;
    color: var(--bs-secondary);
    text-align: center;
    white-space: nowrap;
    transition: color 0.3s ease;
}

.tb-prep-step-line {
    position: absolute;
    top: 18px;
    left: calc(50% + 18px);
    right: calc(-50% + 18px);
    height: 2px;
    background: var(--bs-border-color);
    z-index: 0;
    transition: background 0.3s ease;
}

.tb-prep-step:last-child .tb-prep-step-line { display: none; }

/* Step states */
.tb-prep-step--success .tb-prep-step-dot {
    border-color: var(--bs-success);
    background: var(--bs-success);
    color: #fff;
}
.tb-prep-step--success .tb-prep-step-label { color: var(--bs-success); }
.tb-prep-step--success .tb-prep-step-line { background: var(--bs-success); }

.tb-prep-step--running .tb-prep-step-dot {
    border-color: var(--bs-primary);
    background: var(--bs-primary);
    color: #fff;
    animation: tb-prep-pulse 1.5s ease-in-out infinite;
}
.tb-prep-step--running .tb-prep-step-label { color: var(--bs-primary); font-weight: 600; }

.tb-prep-step--error .tb-prep-step-dot {
    border-color: var(--bs-danger);
    background: var(--bs-danger);
    color: #fff;
}
.tb-prep-step--error .tb-prep-step-label { color: var(--bs-danger); }

.tb-prep-step--pending .tb-prep-step-dot { opacity: 0.5; }
.tb-prep-step--pending .tb-prep-step-label { opacity: 0.5; }

@keyframes tb-prep-pulse {
    0%, 100% { box-shadow: 0 0 0 0 rgba(58, 170, 209, 0.4); }
    50% { box-shadow: 0 0 0 8px rgba(58, 170, 209, 0); }
}

/* Phase detail card */
.tb-prep-card {
    border: 1px solid var(--bs-border-color-translucent);
    border-radius: var(--bs-border-radius-lg);
    padding: 1.25rem;
    background: var(--bs-gray-800);
    transition: border-color 0.3s ease;
}
.tb-prep-card--running { border-color: var(--bs-primary); }
.tb-prep-card--success { border-color: var(--bs-success); }
.tb-prep-card--error { border-color: var(--bs-danger); }

/* Mini progress bar inside card */
.tb-prep-minibar {
    height: 6px;
    border-radius: 3px;
    background: var(--bs-gray-700);
    overflow: hidden;
    margin-top: 0.75rem;
}
.tb-prep-minibar-fill {
    height: 100%;
    border-radius: 3px;
    background: var(--bs-primary);
    transition: width 0.4s ease;
}

/* Overall progress bar */
.tb-prep-overall {
    height: 8px;
    border-radius: 4px;
    background: var(--bs-gray-700);
    overflow: hidden;
    margin-top: 1rem;
}
.tb-prep-overall-fill {
    height: 100%;
    border-radius: 4px;
    background: linear-gradient(90deg, var(--bs-primary), var(--bs-success));
    transition: width 0.5s ease;
}

/* Complete summary */
.tb-prep-summary-phase {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.5rem 0;
    border-bottom: 1px solid var(--bs-border-color-translucent);
}
.tb-prep-summary-phase:last-child { border-bottom: none; }

/* Elapsed time display */
.tb-prep-elapsed {
    font-variant-numeric: tabular-nums;
    font-size: 0.875rem;
    color: var(--bs-secondary);
}