Jacob Schmidt 1ca2499af7 Add dispatcher mode to CAD UI
- Add a dispatcher web view and layout switching
- Route group role updates and dispatcher hydration through the UI bridge
- Refresh top bar and hide map/side panel outside operations mode
2026-03-30 20:22:48 -05:00

240 lines
4.5 KiB
CSS

body {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 60px;
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto auto;
align-items: center;
column-gap: 16px;
padding: 0 16px;
background: transparent;
overflow: visible;
}
body::before {
content: "";
position: absolute;
inset: 0 0 auto 0;
height: 60px;
background: linear-gradient(
90deg,
rgba(16, 22, 31, 0.96),
rgba(19, 26, 36, 0.94) 55%,
rgba(15, 20, 28, 0.96)
);
border-bottom: none;
box-shadow: none;
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
z-index: 0;
pointer-events: none;
}
body > * {
position: relative;
z-index: 1;
}
.logo {
color: var(--accent);
font-size: 15px;
font-weight: 650;
text-transform: uppercase;
letter-spacing: 0.08em;
text-shadow: 0 1px 12px rgba(0, 0, 0, 0.35);
}
.header-main {
min-width: 0;
display: flex;
align-items: center;
gap: 12px;
}
.title-block {
display: flex;
flex-direction: column;
gap: 1px;
min-width: 0;
flex: 0 0 auto;
}
.title-kicker {
color: rgba(218, 227, 236, 0.56);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.12em;
}
.title-main {
color: rgba(245, 248, 255, 0.92);
font-size: 15px;
font-weight: 600;
}
.operator-strip {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
flex: 1 1 auto;
}
.operator-strip.is-hidden,
.operator-controls.is-hidden {
display: none;
}
.operator-info {
display: flex;
flex-direction: column;
min-width: 88px;
gap: 0;
}
.operator-label {
color: rgba(218, 227, 236, 0.5);
font-size: 9px;
text-transform: uppercase;
letter-spacing: 0.12em;
}
.operator-info strong {
color: rgba(245, 248, 255, 0.9);
font-size: 12px;
font-weight: 550;
}
.operator-controls {
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
}
.operator-select {
min-width: 92px;
max-width: 112px;
padding: 5px 8px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(14, 20, 28, 0.96);
color: var(--text);
font-size: 11px;
}
.btn-operator {
min-width: 84px;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.mode-controls {
display: flex;
gap: 8px;
align-items: center;
justify-self: end;
}
.mode-controls.is-hidden {
display: none;
}
.controls {
display: flex;
gap: 8px;
align-items: center;
justify-self: end;
}
.mode-text {
color: rgba(233, 241, 248, 0.72);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.1em;
}
.mode-switch {
position: relative;
width: 54px;
height: 28px;
display: inline-flex;
align-items: center;
}
.mode-switch input {
position: absolute;
opacity: 0;
pointer-events: none;
}
.mode-slider {
position: relative;
width: 54px;
height: 28px;
border: 1px solid rgba(255, 255, 255, 0.14);
border-radius: 999px;
background: rgba(22, 29, 39, 0.92);
box-shadow: inset 0 1px 10px rgba(0, 0, 0, 0.22);
transition:
border-color 0.16s ease,
background 0.16s ease;
}
.mode-slider::after {
content: "";
position: absolute;
top: 3px;
left: 3px;
width: 20px;
height: 20px;
border-radius: 50%;
background: linear-gradient(
180deg,
rgba(237, 244, 251, 0.98),
rgba(189, 205, 221, 0.92)
);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.26);
transition:
transform 0.16s ease,
background 0.16s ease;
}
.mode-switch input:checked + .mode-slider {
border-color: rgba(91, 187, 255, 0.42);
background: rgba(14, 37, 56, 0.95);
}
.mode-switch input:checked + .mode-slider::after {
transform: translateX(26px);
background: linear-gradient(
180deg,
rgba(131, 212, 255, 0.98),
rgba(72, 170, 231, 0.94)
);
}
.btn-close {
min-width: 42px;
}
body[data-mode="operations"] {
pointer-events: none;
}
body[data-mode="operations"] .logo,
body[data-mode="operations"] .title-block,
body[data-mode="operations"] .operator-strip,
body[data-mode="operations"] .operator-controls,
body[data-mode="operations"] .mode-controls,
body[data-mode="operations"] .controls,
body[data-mode="operations"] .mode-switch,
body[data-mode="operations"] .mode-switch *,
body[data-mode="operations"] button,
body[data-mode="operations"] select,
body[data-mode="operations"] label {
pointer-events: auto;
}