嘉谷
低空智控平台
@@ -227,15 +227,8 @@ async function logout() {
.brandMark {
width: 28px;
height: 28px;
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 3px;
-
- span {
- display: block;
- border-radius: 2px;
- background: #7db5f5;
- }
+ object-fit: contain;
+ flex-shrink: 0;
}
.menu {
@@ -291,17 +284,34 @@ async function logout() {
background: rgba(255, 255, 255, 0.06);
}
- > span {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- background: #2d6fba;
- color: #fff;
- display: inline-flex;
+ :global(.t-button__text) {
+ width: 100%;
+ display: flex;
align-items: center;
- justify-content: center;
- font-size: 13px;
- flex-shrink: 0;
+ gap: 10px;
+ color: inherit;
+
+ > span {
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ background: #2d6fba;
+ color: #fff;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 13px;
+ flex-shrink: 0;
+ }
+
+ > div {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 2px;
+ }
}
strong {
@@ -315,11 +325,6 @@ async function logout() {
color: #8fa0ad;
font-size: 10px;
}
-
- div {
- flex: 1;
- min-width: 0;
- }
}
.chevron {
diff --git a/src/main.js b/src/main.js
index 43f304d..eda4929 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,8 +1,9 @@
+import './styles/prototype.css'
+import 'tdesign-vue-next/es/style/css.mjs'
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { setupStore } from './stores'
-import './styles/prototype.css'
import 'tdesign-vue-next/es/message/style/css.mjs'
import 'tdesign-vue-next/es/dialog/style/css.mjs'
import 'tdesign-vue-next/es/button/style/css.mjs'
diff --git a/src/styles/prototype.css b/src/styles/prototype.css
index c622f2c..cc5d5a4 100644
--- a/src/styles/prototype.css
+++ b/src/styles/prototype.css
@@ -1,4 +1,4 @@
-:root {
+:root{
color-scheme: light;
--ink: #17202b;
--muted: #697586;
@@ -13,960 +13,1047 @@
--red: #cc3d43;
--shadow: 0 10px 30px rgba(19, 33, 46, .12);
}
-
-#appShell[hidden], #loginPage[hidden] { display: none !important; }
-body:has(.login-page:not([hidden])) { background: #edf2f5; }
-.login-page { min-height: 100vh; display: grid; grid-template-columns: minmax(430px, .82fr) minmax(0, 1.18fr); background: #fff; }.login-form-side { grid-column: 1; grid-row: 1; }.login-visual { grid-column: 2; grid-row: 1; }
-.login-visual { position: relative; min-height: 100vh; overflow: hidden; color: #fff; background: #1b323c; }.login-visual-map, .login-visual-shade { position: absolute; inset: 0; }.login-visual-map { background-image: url("/assets/login-hero-dock-drone.png"); background-size: cover; background-position: center; filter: saturate(.82) contrast(1.04); }.login-visual-shade { background: linear-gradient(90deg, rgba(10,31,40,.78), rgba(12,38,48,.18) 62%, rgba(9,26,34,.34)), linear-gradient(0deg, rgba(9,26,34,.56), transparent 40%); }.login-brand, .login-visual-copy, .login-visual-footer { position: absolute; z-index: 1; }.login-brand { top: 38px; left: 48px; display: flex; align-items: center; gap: 10px; }.login-brand .brand-mark { width: 28px; height: 28px; }.login-brand .brand-mark span { width: 14px; height: 8px; }.login-brand strong { display: block; font-size: 19px; }.login-brand small { display: block; margin-top: 3px; color: #9db1bc; font-size: 11px; }.login-visual-copy { left: 48px; bottom: 112px; }.login-visual-copy > span { color: #b5d9e7; font-size: 11px; letter-spacing: 1.5px; }.login-visual-copy h1 { margin: 14px 0 13px; color: #fff; font-size: clamp(27px, 3vw, 42px); font-weight: 500; line-height: 1.25; letter-spacing: 0; text-shadow: 0 2px 18px rgba(0,0,0,.25); }.login-visual-copy p { margin: 0; color: #d0e0e5; font-size: 13px; }.login-visual-footer { right: 38px; bottom: 28px; left: 48px; display: flex; justify-content: space-between; color: #b5c7ce; font-size: 10px; }
-.login-device-scene { position: absolute; z-index: 1; inset: 0; }.login-scene-line { position: absolute; height: 1px; background: linear-gradient(90deg, transparent, rgba(128,194,224,.8), transparent); transform-origin: left center; }.line-one { width: 34%; top: 38%; left: 38%; transform: rotate(-22deg); }.line-two { width: 30%; top: 54%; left: 49%; transform: rotate(20deg); }.login-scene-card { position: absolute; min-width: 174px; padding: 9px 11px; display: flex; align-items: center; gap: 9px; border: 1px solid rgba(170,220,238,.32); border-radius: 5px; color: #e8f5fa; background: rgba(13,35,45,.68); box-shadow: 0 10px 22px rgba(5,20,28,.2); backdrop-filter: blur(8px); }.login-scene-card > span { width: 25px; height: 25px; display: grid; place-items: center; border-radius: 4px; }.login-scene-card svg { width: 14px; }.login-scene-card strong, .login-scene-card small { display: block; }.login-scene-card strong { font-size: 11px; }.login-scene-card small { margin-top: 3px; color: #8fb4c3; font-size: 8px; }.login-scene-card.dock { top: 35%; left: 30%; }.login-scene-card.dock > span { color: #78d1aa; background: rgba(45,137,103,.25); }.login-scene-card.drone { top: 51%; left: 57%; }.login-scene-card.drone > span { color: #83bdf1; background: rgba(46,111,181,.28); }.login-scene-status { position: absolute; top: 19%; right: 8%; padding: 8px 10px; display: flex; align-items: center; gap: 7px; border: 1px solid rgba(170,220,238,.2); border-radius: 4px; color: #b4d3de; background: rgba(13,35,45,.55); font-size: 10px; }.login-scene-status i { width: 6px; height: 6px; border-radius: 50%; background: #50c995; box-shadow: 0 0 0 4px rgba(80,201,149,.12); }.login-scene-status b { color: #e4f4f7; font-size: 11px; font-weight: 500; }
-.login-form-side { display: flex; align-items: center; justify-content: center; padding: 40px 48px; background: #f3f6f9; }.login-form-wrap { width: min(360px, 100%); padding: 42px 40px 36px; border: 1px solid #e1e7ec; border-radius: 8px; background: #fff; box-shadow: 0 16px 40px rgba(28,53,70,.08); }.login-form-heading > span { color: var(--blue); font-size: 12px; }.login-form-heading h2 { margin: 10px 0 7px; color: #263945; font-size: 30px; font-weight: 600; }.login-form-heading p { margin: 0 0 33px; color: var(--muted); font-size: 12px; }.login-form-wrap form > label { display: block; margin-bottom: 18px; }.login-form-wrap form > label > span { display: block; margin-bottom: 7px; color: #495b67; font-size: 12px; }.login-input { height: 44px; padding: 0 12px; display: flex; align-items: center; gap: 9px; border: 1px solid #d7e0e5; border-radius: 4px; background: #fff; transition: border-color .15s ease, box-shadow .15s ease; }.login-input:focus-within { border-color: #6f9ec8; box-shadow: 0 0 0 3px rgba(47,116,189,.1); }.login-input > svg { width: 15px; color: #8a99a3; }.login-input input { width: 100%; min-width: 0; border: 0; outline: 0; color: var(--ink); background: transparent; font-size: 13px; }.login-input button { width: 24px; height: 24px; display: grid; place-items: center; color: #8a99a3; background: transparent; }.login-input button svg { width: 15px; }.login-options { margin: -1px 0 20px; display: flex; align-items: center; justify-content: space-between; }.login-options label { display: flex; align-items: center; gap: 7px; color: #74838d; font-size: 11px; }.login-options label input { position: absolute; opacity: 0; }.login-options label > span { width: 14px; height: 14px; display: block; border: 1px solid #c4d0d7; border-radius: 3px; background: #fff; }.login-options label input:checked + span { border-color: var(--blue); background: var(--blue); box-shadow: inset 0 0 0 3px #fff; }.login-options button { color: var(--blue); background: transparent; font-size: 11px; }.login-error { min-height: 17px; color: var(--red); font-size: 11px; }.login-submit { width: 100%; height: 44px; display: flex; align-items: center; justify-content: center; gap: 8px; border-radius: 4px; color: #fff; background: var(--blue); font-size: 13px; box-shadow: 0 5px 12px rgba(47,116,189,.2); }.login-submit:hover { background: #2766a5; }.login-submit svg { width: 13px; }.login-help { display: block; margin-top: 20px; color: #9aa7ae; font-size: 10px; text-align: center; }
-.login-device-scene { display: none; }
-.login-panel#loginPanel > .login-form-heading { display: none; }.login-panel#loginPanel .login-method-tabs { margin-top: 0; }
-.login-panel { display: none; }.login-panel.active { display: block; }.login-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }.login-form-row > label { min-width: 0; }.login-form-row > label > span { display: block; margin-bottom: 7px; color: #495b67; font-size: 12px; }.login-form-row > label > input { width: 100%; height: 44px; padding: 0 12px; border: 1px solid #d7e0e5; border-radius: 4px; outline: 0; color: var(--ink); background: #fff; font-size: 13px; }.login-form-row > label > input:focus { border-color: #6f9ec8; box-shadow: 0 0 0 3px rgba(47,116,189,.1); }.register-agreement { margin: 0 0 17px; display: flex; align-items: flex-start; gap: 7px; color: #74838d; font-size: 10px; line-height: 1.5; }.register-agreement input { position: absolute; opacity: 0; }.register-agreement > span { width: 14px; height: 14px; min-width: 14px; display: block; border: 1px solid #c4d0d7; border-radius: 3px; background: #fff; }.register-agreement input:checked + span { border-color: var(--blue); background: var(--blue); box-shadow: inset 0 0 0 3px #fff; }.login-switch { color: var(--blue); background: transparent; font-size: inherit; }
-.login-method-tabs { height: 38px; margin: -4px 0 21px; display: grid; grid-template-columns: 1fr 1fr; border-bottom: 1px solid #dce4e9; }.login-method-tabs button { position: relative; color: #7d8b94; background: transparent; font-size: 12px; }.login-method-tabs button.active { color: var(--blue); font-weight: 600; }.login-method-tabs button.active::after { content: ""; position: absolute; right: 0; bottom: -1px; left: 0; height: 2px; background: var(--blue); }.login-method-fields[hidden] { display: none; }.captcha-input { padding-right: 4px; }.captcha-image { width: 72px !important; height: 34px !important; margin-left: auto; border-left: 1px solid #dce4e9; color: #2f4553; background: #f1f4f5 !important; font-family: Georgia, serif; font-size: 18px !important; font-style: italic; letter-spacing: 3px; }.send-code-button { width: auto !important; min-width: 76px; height: 30px !important; margin-left: auto; padding: 0 8px; border-left: 1px solid #dce4e9; color: var(--blue) !important; background: transparent !important; font-size: 10px !important; white-space: nowrap; }
-.login-page { position: relative; display: block; overflow: hidden; background: #102a35; }.login-visual { position: absolute; z-index: 0; inset: 0; width: 100%; min-height: 100vh; }.login-form-side { position: relative; z-index: 2; width: 100%; min-height: 100vh; padding: 40px 24px; display: flex; align-items: center; justify-content: center; background: transparent; }.login-form-wrap { padding-top: 32px; padding-bottom: 30px; box-shadow: 0 20px 55px rgba(10,31,43,.25); background: rgba(255,255,255,.96); backdrop-filter: blur(8px); }
-
-* { box-sizing: border-box; }
-html, body { margin: 0; height: 100%; overflow: hidden; font-family: Inter, "PingFang SC", "Microsoft YaHei", Arial, sans-serif; color: var(--ink); background: #edf1f4; }
-button, input { font: inherit; }
-button { border: 0; cursor: pointer; }
-svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
-.icon-library { position: absolute; width: 0; height: 0; overflow: hidden; }
-.app-shell { min-height: 100vh; display: flex; overflow: hidden; }
-
-.sidebar { width: 208px; min-width: 208px; height: 100vh; background: var(--sidebar); color: #d7e0e8; display: flex; flex-direction: column; z-index: 30; }
-.brand { height: 64px; padding: 0 20px; display: flex; align-items: center; gap: 11px; color: #fff; border-bottom: 1px solid rgba(255,255,255,.08); }
-.brand > div:last-child { display: flex; flex-direction: column; min-width: 0; }
-.brand strong { font-size: 19px; line-height: 20px; letter-spacing: 0; }
-.brand small { color: #9fb0be; font-size: 13px; }
-.brand-mark { position: relative; width: 28px; height: 28px; transform: rotate(45deg); }
-.brand-mark span { position: absolute; width: 12px; height: 12px; border-radius: 8px 2px 8px 2px; }
-.brand-mark span:nth-child(1) { left: 1px; top: 1px; background: #3f86ed; }
-.brand-mark span:nth-child(2) { right: 1px; bottom: 1px; background: #42b883; }
-.brand-mark span:nth-child(3) { right: 1px; top: 1px; background: #f0b44d; }
-.main-nav { flex: 1; padding: 18px 10px; }
-.nav-item { width: 100%; min-height: 42px; padding: 0 12px; display: flex; align-items: center; gap: 12px; border-radius: 5px; background: transparent; color: #aebbc6; text-align: left; margin-bottom: 5px; transition: .18s ease; }
-.nav-item:hover { background: var(--sidebar-hover); color: #fff; }
-.nav-item.active { background: #2d6fba; color: #fff; box-shadow: inset 3px 0 #7db5f5; }
-.nav-item span { flex: 1; font-size: 17px; }
-.nav-item svg { width: 17px; }
-.nav-arrow { width: 14px !important; transform: rotate(0); opacity: .6; transition: transform .18s ease; }
-.nav-item.expanded .nav-arrow { transform: rotate(90deg); }
-.nav-group { margin-bottom: 5px; }.nav-group > .nav-item { margin-bottom: 0; }
-.subnav { max-height: 0; margin: 0 0 0 21px; padding-left: 18px; overflow: hidden; border-left: 1px solid rgba(255,255,255,.11); transition: max-height .22s ease, padding .22s ease, margin .22s ease; }
-.nav-group.open .subnav { max-height: 128px; margin-top: 5px; padding-top: 3px; padding-bottom: 3px; }
-.subnav-item { position: relative; width: 100%; height: 34px; padding: 0 8px 0 3px; display: flex; align-items: center; gap: 9px; border-radius: 4px; color: #8fa0ad; background: transparent; text-align: left; font-size: 14px; }
-.subnav-item:hover { color: #e8eef3; background: rgba(255,255,255,.045); }.subnav-item.active { color: #fff; }.subnav-item > span { width: 5px; height: 5px; border: 1px solid #708390; border-radius: 50%; }.subnav-item.active > span { border-color: #71acf0; background: #71acf0; box-shadow: 0 0 0 3px rgba(113,172,240,.12); }.subnav-item b { margin-left: auto; font-size: 11px; font-weight: 500; color: #6f8392; }.subnav-item .pending-count { min-width: 16px; padding: 1px 5px; border-radius: 8px; color: #f4cf98; background: rgba(205,129,34,.2); text-align: center; }
-.nav-count { padding: 1px 6px; border-radius: 8px; background: #c8454b; color: #fff; font-size: 13px; font-weight: 600; }
-.sidebar-bottom { padding: 0 10px 14px; }.sidebar-bottom .profile-wrap { width: 100%; }.sidebar-profile { width: 100%; min-height: 44px; padding: 0 10px; border-radius: 5px; color: #dbe4eb; text-align: left; }.sidebar-profile:hover { color: #fff; background: var(--sidebar-hover); }.sidebar-profile > span { width: 30px; height: 30px; font-size: 13px; }.sidebar-profile strong { font-size: 12px; }.sidebar-profile small { color: #8fa0ad; font-size: 10px; }.sidebar-profile svg { margin-left: auto; width: 12px; transform: rotate(-90deg); color: #8fa0ad; }.sidebar-bottom .profile-menu { top: auto; right: 0; bottom: calc(100% + 8px); }
-
-.workspace { position: relative; flex: 1; min-width: 0; height: 100vh; display: flex; flex-direction: column; }
-.topbar { height: 64px; min-height: 64px; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 0 20px; background: #fff; border-bottom: 1px solid var(--line); z-index: 20; }
-.breadcrumb { display: flex; align-items: center; gap: 7px; font-size: 16px; white-space: nowrap; }
-.breadcrumb span { color: var(--muted); }
-.breadcrumb svg { width: 13px; color: #9aa5af; }
-.breadcrumb strong { font-weight: 600; }
-.profile-wrap { position: relative; }
-.profile-menu { position: absolute; z-index: 30; top: calc(100% + 9px); right: 0; width: 190px; padding: 6px; border: 1px solid var(--line); border-radius: 5px; background: #fff; box-shadow: 0 12px 28px rgba(25,42,54,.16); }
-.profile-menu-heading { padding: 8px 9px 10px; display: flex; flex-direction: column; gap: 4px; border-bottom: 1px solid var(--line); }.profile-menu-heading strong { color: var(--ink); font-size: 12px; }.profile-menu-heading small { color: var(--muted); font-size: 10px; }
-.profile-menu button { width: 100%; height: 30px; padding: 0 9px; border-radius: 3px; color: #53626e; background: transparent; font-size: 11px; text-align: left; }.profile-menu button:hover { color: var(--blue); background: #f1f6fb; }.profile-menu .logout-action { color: #b04b4f; }.profile-menu .logout-action:hover { color: #a53a40; background: #fff3f3; }
-.device-search { display: flex; align-items: center; gap: 8px; border: 1px solid var(--line); background: var(--soft); border-radius: 5px; color: #7f8b97; }
-.device-search input { width: 100%; min-width: 0; outline: 0; border: 0; background: transparent; font-size: 14px; color: var(--ink); }
-.icon-button { width: 34px; height: 34px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center; background: transparent; color: #607080; }
-.icon-button:hover { background: #eef2f5; color: var(--ink); }
-.profile { display: flex; align-items: center; gap: 8px; padding: 0; background: transparent; color: var(--ink); }
-.profile > span { width: 32px; height: 32px; display: grid; place-items: center; background: #dfeaf7; color: #225d99; border-radius: 4px; font-size: 14px; font-weight: 700; }
-.profile div { display: flex; flex-direction: column; align-items: flex-start; }
-.profile strong { font-size: 14px; }
-.profile small { color: var(--muted); font-size: 12px; }
-.profile svg { width: 13px; transform: rotate(90deg); color: #8a96a1; }
-.sidebar-bottom .sidebar-profile { color: #dbe4eb; }
-.sidebar-bottom .sidebar-profile strong { color: #f2f6f9; }
-.sidebar-bottom .sidebar-profile small { color: #8fa0ad; }
-.sidebar-bottom .sidebar-profile > svg { transform: rotate(-90deg); color: #8fa0ad; }
-.mobile-menu { display: none; }
-
-.monitor-layout { position: relative; height: 100%; flex: 1; min-height: 0; display: grid; grid-template-columns: 0 minmax(0, 1fr) 0; overflow: hidden; background: transparent; pointer-events: none; transition: grid-template-columns .38s cubic-bezier(.22,.8,.25,1); }
-.monitor-layout.focused { grid-template-columns: 276px minmax(360px, 1fr) 348px; }
-.monitor-layout.focused.control-expanded { grid-template-columns: 276px minmax(360px, 1fr) 560px; }
-.device-panel, .detail-panel { background: #fff; min-width: 0; min-height: 0; overflow: auto; opacity: 0; visibility: hidden; z-index: 8; pointer-events: none; transition: transform .38s cubic-bezier(.22,.8,.25,1), opacity .2s ease, visibility 0s linear .38s; }
-.device-panel { width: 276px; border-right: 1px solid var(--line); padding: 18px 14px; transform: translateX(-100%); }
-.detail-panel { width: 348px; transform: translateX(100%); }
-.monitor-layout.control-expanded .detail-panel { width: 560px; }
-.monitor-layout.focused .device-panel, .monitor-layout.focused .detail-panel { opacity: 1; visibility: visible; transform: translateX(0); pointer-events: auto; transition-delay: 0s; }
-.panel-heading { display: flex; justify-content: space-between; align-items: center; }
-.panel-heading > div { display: flex; align-items: baseline; gap: 8px; }
-.panel-heading h1 { margin: 0; font-size: 20px; }
-.panel-heading span { color: var(--muted); font-size: 13px; }
-.device-search { height: 36px; margin-top: 16px; padding: 0 10px; background: #fff; }
-.device-search svg { width: 15px; }
-.filter-row { display: flex; border-bottom: 1px solid var(--line); margin-top: 14px; }
-.filter { position: relative; flex: 1; height: 36px; background: transparent; color: var(--muted); font-size: 14px; }
-.filter b { font-weight: 500; }
-.filter.active { color: var(--blue); font-weight: 600; }
-.filter.active::after { content: ""; position: absolute; left: 20%; right: 20%; bottom: -1px; height: 2px; background: var(--blue); }
-.multi-select-actions { display: flex; align-items: center; gap: 5px; padding: 0 2px 0 7px; white-space: nowrap; }
-.multi-select-actions button { padding: 0; color: #627481; background: transparent; font-size: 10px; }
-.multi-select-actions button:hover { color: var(--blue); }
-.panel-heading .multi-select-actions { margin-left: auto; padding: 0 4px 0 0; }
-.device-list { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
-.multi-dock-bar { min-height: 34px; margin-top: 10px; padding: 0 9px; display: flex; align-items: center; justify-content: space-between; border: 1px solid #c9dff2; border-radius: 4px; color: #486575; background: #f3f8fc; font-size: 11px; }
-.multi-dock-bar strong { color: var(--blue); font-size: 12px; }
-.multi-dock-bar select { height: 25px; max-width: 90px; padding: 0 4px; border: 1px solid #cbd9e4; border-radius: 3px; color: #526574; background: #fff; font-size: 10px; }
-
-.multi-select-bar { min-height: 34px; margin-top: 10px; padding: 0 9px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 4px; color: var(--muted); background: #fafcfd; font-size: 10px; }
-.multi-select-bar span { margin-right: auto; color: #607481; }
-.multi-select-bar button { min-height: 24px; padding: 0 8px; border: 1px solid #d7e2e9; border-radius: 3px; color: #526875; background: #fff; font-size: 10px; }
-.multi-select-bar button:hover, .multi-select-bar.has-selection button { color: var(--blue); border-color: #a6c5df; background: #f3f8fc; }
-.device-card { position: relative; width: 100%; min-height: 70px; text-align: left; border: 1px solid var(--line); border-radius: 6px; background: #fff; color: var(--ink); overflow: hidden; transition: .16s ease; }
-.device-card:hover { border-color: #aab9c8; transform: translateY(-1px); }
-.device-card.active { border-color: #5a93d4; background: #f4f8fd; box-shadow: inset 3px 0 var(--blue); }
-.device-card.multi-selected { border-color: var(--blue); box-shadow: inset 3px 0 var(--blue); background: #f4f8fd; }
-.device-select-checkbox { position: absolute; z-index: 2; top: 10px; left: 8px; width: auto; height: auto; display: flex; align-items: center; cursor: pointer; }
-.device-select-checkbox .t-checkbox { margin: 0; }
-.device-select-checkbox .t-checkbox__label { display: none; }
-.device-card-main { width: 100%; min-height: 68px; padding: 11px 11px 11px 34px; display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 9px; color: inherit; background: transparent; text-align: left; }
-.device-copy { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
-.device-copy strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; }
-.device-copy small { color: var(--muted); font-size: 12px; }
-.dock-glyph { width: 34px; height: 34px; display: grid; place-items: center; border-radius: 5px; color: #1e7658; background: #e3f3ec; }
-.dock-glyph.alarm { color: #a54526; background: #fff0e9; }
-.dock-glyph.offline { color: #7c8791; background: #edf0f2; }
-.status { font-style: normal; font-size: 12px; border-radius: 3px; padding: 3px 6px; white-space: nowrap; }
-.status.online { background: #e6f5ee; color: #167955; }
-.status.mission { background: #e7f0fc; color: #2568b5; }
-.status.alarm { background: #fff0e7; color: #b75225; }
-.status.offline { background: #edf0f2; color: #737e88; }
-.status.pending { background: #fff1dc; color: #95631d; }
-.bound-drone { position: relative; width: calc(100% - 18px); min-height: 45px; margin: 0 9px 9px; padding: 7px 7px 7px 28px; display: grid; grid-template-columns: 18px 1fr auto; align-items: center; gap: 6px; border-radius: 4px; background: #f1f4f6; color: #42515e; text-align: left; }
-.bound-drone:hover, .bound-drone.active { background: #e7eff9; color: #1f5f9f; }
-.bound-drone > svg { width: 15px; }.bound-drone > span:nth-of-type(2) { min-width: 0; display: flex; flex-direction: column; gap: 2px; }.bound-drone strong { font-size: 12px; }.bound-drone small { color: var(--muted); font-size: 10px; }.bound-drone > i { font-style: normal; color: var(--green); font-size: 10px; }
-.bound-drone.flying > i { color: var(--blue); }.bound-drone.offline > i { color: #8b969f; }.tree-line { position: absolute; left: 13px; top: -9px; width: 10px; height: 29px; border-left: 1px solid #c4ced6; border-bottom: 1px solid #c4ced6; border-radius: 0 0 0 5px; }
-.device-alert { margin: 0 10px 10px; padding-top: 8px; border-top: 1px solid var(--line); display: flex; align-items: center; gap: 5px; color: var(--red); font-size: 11px; }.device-alert svg { width: 12px; }.device-alert span { margin-left: auto; color: var(--muted); }.device-alert.muted { color: var(--muted); }
-
-.map-panel { position: relative; min-width: 0; overflow: visible; background: transparent; isolation: isolate; pointer-events: none; }
-.map-toolbar, .map-legend { pointer-events: auto; }
-.map-panel::after { display: none; }
-.map-toolbar { position: absolute; z-index: 4; top: 14px; left: 14px; height: 34px; display: flex; background: #fff; border-radius: 5px; box-shadow: 0 4px 14px rgba(19,31,39,.17); overflow: hidden; }
-.map-type { padding: 0 13px; background: #fff; color: var(--muted); border-right: 1px solid var(--line); font-size: 13px; }
-.map-type.active { background: #263846; color: #fff; }
-.map-toolbar .icon-button { border-radius: 0; }
-.map-legend { position: absolute; z-index: 4; left: 14px; bottom: 14px; height: 32px; padding: 0 11px; display: flex; align-items: center; gap: 12px; border-radius: 4px; background: rgba(255,255,255,.94); box-shadow: 0 4px 14px rgba(19,31,39,.13); font-size: 12px; color: #52616e; }
-.map-legend span { display: flex; align-items: center; gap: 4px; white-space: nowrap; }
-.map-legend i { width: 7px; height: 7px; border-radius: 50%; }
-.green { background: var(--green); } .blue { background: var(--blue); } .red { background: var(--red); } .gray { background: #84909b; }
-.map-marker { position: absolute; z-index: 5; display: flex; flex-direction: column; align-items: center; transform: translate(-50%, -50%); color: var(--green); background: transparent; transition: opacity .25s ease, filter .25s ease; }
-.monitor-layout.focused .map-marker { transform: translate(-50%, -50%) scale(.746); }
-.map-marker > span { width: 36px; height: 36px; display: grid; place-items: center; border: 3px solid #fff; border-radius: 50% 50% 50% 6px; background: currentColor; box-shadow: 0 5px 14px rgba(15,28,35,.28); transform: rotate(-45deg); transition: .18s ease; }
-.map-marker svg { width: 16px; color: #fff; transform: rotate(45deg); }
-.map-marker b { margin-top: 5px; padding: 3px 7px; border-radius: 3px; background: rgba(24,35,45,.86); color: #fff; font-size: 12px; font-weight: 500; white-space: nowrap; }
-.map-marker > small { margin-top: 3px; padding: 2px 6px; border-radius: 3px; color: #dcecff; background: rgba(27,69,109,.9); font-size: 10px; white-space: nowrap; }
-.map-marker em { position: absolute; right: -8px; top: -7px; width: 17px; height: 17px; display: grid; place-items: center; border: 2px solid #fff; border-radius: 50%; background: #246ebc; transform: rotate(45deg); }.map-marker em svg { width: 9px; transform: none; }
-.map-marker:hover > span, .map-marker.selected > span { transform: rotate(-45deg) scale(1.15); }
-.map-marker.selected > span { box-shadow: 0 0 0 6px rgba(33,130,91,.2), 0 5px 14px rgba(15,28,35,.3); }
-.map-marker.mission { color: var(--blue); }
-.map-marker.alarm { color: var(--red); animation: marker-pulse 1.8s infinite; }
-.map-marker.offline { color: #78838c; }
-.monitor-layout.focused .map-marker:not(.selected):not(.related) { opacity: .38; filter: grayscale(.55); }
-.map-marker.selected > span { box-shadow: 0 0 0 7px rgba(31,111,235,.22), 0 6px 18px rgba(15,28,35,.34); }
-.binding-line { position: absolute; inset: 0; z-index: 4; width: 100%; height: 100%; overflow: visible; pointer-events: none; opacity: 1; }
-.binding-line line { stroke: rgba(117,191,246,.95); stroke-width: .35; stroke-dasharray: 1.5 1; }
-.binding-line text { fill: #fff; font-size: 2.4px; text-anchor: middle; paint-order: stroke; stroke: rgba(34,77,111,.88); stroke-width: .8px; }
-.map-view-all { height: 34px; padding: 0 10px; border-left: 1px solid var(--line); color: var(--blue); background: #fff; font-size: 11px; }
-.map-view-all:hover { background: #f3f8fc; }
-.map-scale { position: absolute; z-index: 4; right: 12px; bottom: 14px; color: #fff; font-size: 10px; border-bottom: 2px solid #fff; padding: 0 16px 2px; text-shadow: 0 1px 3px #000; pointer-events: none; }
-@keyframes marker-pulse { 50% { filter: drop-shadow(0 0 6px rgba(204,61,67,.7)); } }
-
-.video-unavailable { color: var(--muted); font-size: 10px; }
-.detail-header { min-height: 90px; padding: 17px 18px 14px; display: flex; align-items: center; justify-content: space-between; gap: 10px; border-bottom: 1px solid var(--line); }
-.detail-header > div { min-width: 0; }
-.eyebrow { color: #73808d; font-size: 12px; }
-.detail-header h2 { margin: 4px 0 5px; font-size: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-.detail-header p { margin: 0; display: flex; align-items: center; gap: 4px; color: var(--muted); font-size: 12px; }
-.detail-header p svg { width: 12px; height: 12px; }
-.detail-head-actions { display: flex; align-items: center; gap: 4px; }.detail-head-actions .icon-button { width: 28px; height: 28px; }
-.asset-relation { min-height: 44px; padding: 0 18px; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); background: #f6f8fa; }.asset-relation span { display: flex; align-items: center; gap: 5px; color: var(--muted); font-size: 11px; }.asset-relation svg { width: 13px; }.asset-relation button { display: flex; align-items: center; gap: 3px; color: var(--blue); background: transparent; font-size: 12px; }.asset-relation button svg { width: 12px; }
-.drone-only { display: none; }.detail-panel.drone-selected .dock-only { display: none; }.detail-panel.drone-selected .drone-only { display: block; }.detail-panel.drone-selected .asset-relation { display: flex; }
-.detail-panel section { padding: 14px 18px; border-bottom: 1px solid var(--line); }
-.section-title { min-height: 22px; display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
-.section-title h3 { margin: 0; font-size: 14px; }
-.section-title > span, .section-title > div > b { font-size: 11px; color: var(--muted); font-weight: 500; }
-.section-title > div { display: flex; align-items: center; gap: 5px; }
-.section-title .icon-button { width: 26px; height: 26px; }
-.live-dot { width: 6px; height: 6px; border-radius: 50%; background: #929ca4; }
-.live-dot.active { background: var(--red); box-shadow: 0 0 0 3px rgba(204,61,67,.14); }
-.video-frame { position: relative; width: 100%; aspect-ratio: 16 / 8.6; overflow: hidden; border-radius: 5px; background: #1e2d34; }
-.camera-scene { position: absolute; inset: 0; overflow: hidden; background: linear-gradient(#718fa0 0 45%, #687765 45% 66%, #40514c 66%); filter: saturate(.75); }
-.camera-scene::after { content: ""; position: absolute; inset: 0; background: linear-gradient(115deg, rgba(255,255,255,.22), transparent 35%, rgba(4,18,26,.2)); }
-.horizon { position: absolute; left: -10%; right: -10%; bottom: 31%; height: 16%; background: #49655c; clip-path: polygon(0 70%, 12% 25%, 22% 60%, 36% 5%, 48% 55%, 62% 20%, 73% 58%, 88% 7%, 100% 58%, 100% 100%, 0 100%); }
-.dock-model { position: absolute; z-index: 2; width: 80px; height: 38px; left: 50%; bottom: 19%; transform: translateX(-50%); background: #d8dde0; border: 3px solid #87949b; box-shadow: 0 12px 18px rgba(0,0,0,.24); }
-.dock-model::before, .dock-model::after { content: ""; position: absolute; bottom: 31px; width: 54px; height: 13px; background: #c2cbd0; border: 3px solid #7b898f; }
-.dock-model::before { right: 50%; transform: skewY(14deg); transform-origin: right bottom; }.dock-model::after { left: 50%; transform: skewY(-14deg); transform-origin: left bottom; }
-.dock-model span { position: absolute; top: 7px; width: 9px; height: 22px; background: #263a42; }.dock-model span:first-child { left: 13px; }.dock-model span:nth-child(2) { right: 13px; }
-.dock-model i { position: absolute; width: 34px; height: 3px; left: 21px; top: -10px; background: #222; box-shadow: 0 -6px #222; }
-.video-overlay { position: absolute; z-index: 3; left: 9px; right: 9px; top: 8px; display: flex; justify-content: space-between; color: #fff; font-size: 11px; text-shadow: 0 1px 3px #000; }
-.video-overlay small { font-size: 10px; }
-.play-control { position: absolute; z-index: 4; left: 50%; top: 50%; width: 42px; height: 42px; display: grid; place-items: center; transform: translate(-50%, -50%); border: 1px solid rgba(255,255,255,.55); border-radius: 50%; color: #fff; background: rgba(13,28,35,.64); backdrop-filter: blur(4px); }
-.play-control:hover { transform: translate(-50%, -50%) scale(1.06); }
-.play-control svg { width: 17px; }
-.video-frame.streaming .camera-scene { animation: camera-live 4s ease-in-out infinite alternate; }
-.video-frame > video { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; object-fit: cover; background: #000; border: 0; }
-.video-frame.playing .camera-scene { display: none; }
-.video-frame.playing .play-control { opacity: 0; pointer-events: none; transition: opacity .15s ease; }
-.video-frame.playing:hover .play-control { opacity: 1; pointer-events: auto; }
-.video-status { position: absolute; z-index: 5; left: 50%; bottom: 12px; max-width: calc(100% - 24px); padding: 5px 9px; border-radius: 4px; color: #fff; background: rgba(13,28,35,.72); font-size: 11px; text-align: center; transform: translateX(-50%); pointer-events: none; }
-.section-title .icon-button:disabled { opacity: .35; cursor: not-allowed; }
-@keyframes camera-live { to { transform: scale(1.035) translateX(-2px); } }
-.text-button { color: var(--blue); background: transparent; font-size: 12px; padding: 0; }
-.metric-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 7px; }
-.metric-grid > div { position: relative; min-height: 61px; padding: 9px 9px 8px 31px; border-radius: 5px; background: var(--soft); display: flex; flex-direction: column; gap: 3px; }
-.metric-grid svg { position: absolute; left: 9px; top: 10px; width: 15px; color: #607b92; }
-.metric-grid span { color: var(--muted); font-size: 11px; }
-.metric-grid strong { font-size: 18px; font-weight: 650; }
-.metric-grid strong small { font-size: 11px; margin-left: 2px; color: var(--muted); }
-.metric-grid .success { color: var(--green); font-size: 14px; }
-.mission-state { padding: 3px 6px; border-radius: 3px; background: #e7f0fc; color: #2568b5 !important; }
-.mission-progress .table-empty { min-height: 42px; display: grid; place-items: center; color: var(--muted); font-size: 11px; }
-
-.mission-name { display: flex; align-items: center; justify-content: space-between; }.mission-name > span { display: flex; flex-direction: column; gap: 3px; }.mission-name strong { font-size: 13px; }.mission-name small { color: var(--muted); font-size: 10px; }.mission-name > b { color: var(--blue); font-size: 16px; }
-.progress-track { height: 5px; margin-top: 10px; overflow: hidden; border-radius: 3px; background: #e7ebef; }.progress-track i { display: block; width: 50%; height: 100%; background: var(--blue); }.progress-meta { margin-top: 8px; display: flex; justify-content: space-between; color: var(--muted); font-size: 10px; }
-.return-action { background: #176b61; }.return-action:hover { background: #10584f; }
-.environment-row { display: grid; grid-template-columns: repeat(3, 1fr); }
-.environment-row > div { min-width: 0; padding: 0 8px; border-right: 1px solid var(--line); display: grid; grid-template-columns: 18px 1fr; gap: 2px 3px; }
-.environment-row > div:first-child { padding-left: 0; }.environment-row > div:last-child { border-right: 0; padding-right: 0; }
-.environment-row svg { grid-row: 1 / 3; width: 15px; color: #607b92; }
-.environment-row span { font-size: 10px; color: var(--muted); white-space: nowrap; }
-.environment-row strong { font-size: 12px; white-space: nowrap; }
-.quick-actions { border-bottom: 0 !important; }
-.workflow-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; }
-.workflow-action { min-width: 0; min-height: 54px; padding: 0 10px; display: grid; grid-template-columns: 23px 1fr; align-items: center; gap: 7px; border-radius: 5px; color: #fff; text-align: left; }
-.workflow-action.takeoff { background: var(--blue); }.workflow-action.takeoff:hover { background: var(--blue-dark); }
-.workflow-action.landing { background: #176b61; }.workflow-action.landing:hover { background: #10584f; }
-.workflow-action > svg { width: 19px; }.workflow-action > span { min-width: 0; display: flex; flex-direction: column; gap: 2px; }.workflow-action strong { font-size: 12px; }.workflow-action small { overflow: hidden; color: rgba(255,255,255,.76); font-size: 8px; white-space: nowrap; text-overflow: ellipsis; }
-.stage-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; margin-top: 8px; }
-.stage-actions button { min-width: 0; min-height: 48px; padding: 6px 7px; display: grid; grid-template-columns: 22px 1fr; align-items: center; gap: 5px; border: 1px solid var(--line); border-radius: 5px; color: #42515e; background: #fff; text-align: left; }
-.stage-actions button:hover { border-color: #8fa7bc; background: #f7f9fb; }.stage-actions button > b { width: 21px; height: 21px; display: grid; place-items: center; border-radius: 3px; color: #376b98; background: #e8f0f7; font-size: 10px; }.stage-actions button > span { min-width: 0; display: flex; flex-direction: column; gap: 2px; font-size: 11px; }.stage-actions small { overflow: hidden; color: var(--muted); font-size: 8px; white-space: nowrap; text-overflow: ellipsis; }.stage-actions svg { width: 11px; color: #8b98a3; }
-.reset-action { width: 100%; height: 38px; margin-top: 8px; padding: 0 10px; display: grid; grid-template-columns: 16px 1fr; align-items: center; gap: 6px; border: 1px solid var(--line); border-radius: 5px; color: #566574; background: #f7f8fa; text-align: left; font-size: 11px; }.reset-action:hover { color: var(--ink); border-color: #aebbc6; }.reset-action svg { width: 13px; }.reset-action span { display: flex; flex-direction: column; gap: 2px; }.reset-action small { color: var(--muted); font-size: 8px; }
-.primary-action { width: 100%; min-height: 51px; padding: 0 11px; display: grid; grid-template-columns: 26px 1fr; align-items: center; gap: 9px; border-radius: 5px; background: var(--blue); color: #fff; text-align: left; }
-.primary-action:hover { background: var(--blue-dark); }
-.primary-action > span { display: flex; flex-direction: column; gap: 2px; }
-.primary-action strong { font-size: 13px; }.primary-action small { font-size: 10px; color: #d9eaff; }
-.secondary-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; margin-top: 7px; }
-.secondary-actions button { height: 36px; display: flex; align-items: center; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 5px; background: #fff; color: #526271; font-size: 12px; }
-.secondary-actions button:hover { border-color: #92a5b6; color: var(--ink); }
-.secondary-actions svg { width: 14px; }
-
-.page-view[hidden] { display: none !important; }
-.monitor-layout[hidden] { display: none !important; }
-.device-page { position: relative; height: 100%; flex: 1; min-height: 0; padding: 22px 24px 24px; display: flex; flex-direction: column; gap: 16px; overflow: auto; background: #f2f5f7; pointer-events: auto; }
-.device-page-header { min-height: 42px; display: flex; align-items: center; justify-content: space-between; gap: 16px; }
-.device-page-header > div:first-child { display: flex; align-items: baseline; gap: 12px; }.device-page-header h1 { margin: 0; font-size: 24px; }.device-page-header span { color: var(--muted); font-size: 12px; }
-.page-actions { display: flex; align-items: center; gap: 8px; }
-.page-actions svg { width: 14px; }
-.asset-overview { min-height: 74px; padding: 0 4px; display: grid; grid-template-columns: repeat(5, 1fr); align-items: center; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
-.asset-overview > div { min-width: 0; height: 42px; padding: 0 20px; display: grid; grid-template-columns: auto 1fr; grid-template-rows: 18px 24px; align-items: end; border-right: 1px solid var(--line); }.asset-overview > div:last-child { border-right: 0; }.asset-overview span { grid-column: 1 / 3; color: var(--muted); font-size: 11px; }.asset-overview strong { font-size: 26px; line-height: 24px; font-weight: 650; }.asset-overview small { align-self: end; padding: 0 0 2px 4px; color: var(--muted); font-size: 11px; }.green-text { color: var(--green); }.blue-text { color: var(--blue); }.red-text { color: var(--red); }.orange-text { color: var(--orange); }
-.asset-workspace { min-height: 500px; flex: 1; display: flex; flex-direction: column; border: 1px solid var(--line); border-radius: 6px; background: #fff; overflow: hidden; }
-.asset-tabs { height: 50px; min-height: 50px; padding: 0 18px; display: flex; align-items: end; gap: 24px; border-bottom: 1px solid var(--line); }
-.asset-tab { position: relative; height: 49px; padding: 0 2px; color: var(--muted); background: transparent; font-size: 14px; }.asset-tab b { margin-left: 3px; font-size: 11px; font-weight: 500; }.asset-tab.active { color: var(--blue); font-weight: 600; }.asset-tab.active::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; background: var(--blue); }
-.asset-toolbar { min-height: 58px; padding: 11px 18px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); }
-.asset-search { width: min(320px, 34%); height: 34px; padding: 0 10px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 5px; color: #7c8995; }.asset-search svg { width: 14px; }.asset-search input { width: 100%; min-width: 0; border: 0; outline: 0; color: var(--ink); background: transparent; font-size: 12px; }
-.toolbar-group { display: flex; align-items: center; gap: 7px; }.toolbar-group select { width: 126px; height: 34px; padding: 0 26px 0 10px; border: 1px solid var(--line); border-radius: 5px; outline: 0; color: #536270; background: #fff; font-size: 12px; }
-.asset-table-wrap { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: auto; }.asset-name-cell { display: flex; align-items: center; gap: 9px; }.table-asset-icon { width: 30px; height: 30px; min-width: 30px; display: grid; place-items: center; border-radius: 4px; color: #256e56; background: #e6f3ee; }.table-asset-icon.drone { color: #286aa9; background: #e7f0fa; }.table-asset-icon.pending { color: #93611d; background: #fff2dc; }.table-asset-icon svg { width: 15px; }.asset-name-cell > span { min-width: 0; display: flex; flex-direction: column; gap: 3px; }.asset-name-cell strong { overflow: hidden; color: var(--ink); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }.asset-name-cell small { color: var(--muted); font-size: 10px; }.table-status { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }.table-status i { width: 6px; height: 6px; border-radius: 50%; }.table-status.online i { background: var(--green); }.table-status.mission i { background: var(--blue); }.table-status.alarm i { background: var(--red); }.table-status.offline i { background: #8b969f; }.table-status.pending i { background: var(--orange); }.binding-cell { display: flex; align-items: center; gap: 5px; }.binding-cell svg { width: 12px; color: #72808d; }.binding-cell.unbound { color: #8a959f; }.row-actions { display: flex; align-items: center; gap: 2px; }.row-actions button { height: 28px; padding: 0 7px; border-radius: 4px; color: var(--blue); background: transparent; font-size: 11px; }.row-actions button:hover { background: #eaf2fc; }.row-actions .more-action { width: 28px; padding: 0; color: #687684; }.row-actions svg { width: 14px; }
-.table-empty { height: 240px !important; color: var(--muted) !important; text-align: center; }.table-footer { min-height: 48px; margin-top: auto; padding: 0 16px; display: flex; align-items: center; justify-content: space-between; color: var(--muted); font-size: 11px; }.table-footer > div { display: flex; align-items: center; gap: 6px; }.table-footer button, .table-footer b { width: 26px; height: 26px; display: grid; place-items: center; border: 1px solid var(--line); border-radius: 4px; color: #84909b; background: #fff; }.table-footer button:first-child svg { transform: rotate(180deg); }.table-footer button svg { width: 12px; }.table-footer b { border-color: var(--blue); color: #fff; background: var(--blue); font-size: 11px; font-weight: 500; }
-.drawer-scrim { position: absolute; z-index: 39; inset: 0; background: rgba(22,34,43,.18); opacity: 0; visibility: hidden; transition: opacity .2s ease, visibility 0s linear .25s; }.drawer-scrim.open { opacity: 1; visibility: visible; transition-delay: 0s; }
-.device-drawer { position: absolute; z-index: 40; top: 0; right: 0; bottom: 0; width: 408px; display: flex; flex-direction: column; overflow: auto; color: var(--ink); background: #fff; border-left: 1px solid var(--line); box-shadow: -12px 0 32px rgba(19,33,45,.14); transform: translateX(102%); visibility: hidden; transition: transform .3s cubic-bezier(.22,.8,.25,1), visibility 0s linear .3s; }.device-drawer.open { transform: translateX(0); visibility: visible; transition-delay: 0s; }
-.device-drawer > header { min-height: 84px; padding: 16px 18px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); }.drawer-identity { min-width: 0; display: flex; align-items: center; gap: 11px; }.drawer-identity > span { width: 38px; height: 38px; min-width: 38px; display: grid; place-items: center; border-radius: 5px; color: #226e55; background: #e5f3ed; }.drawer-identity > span.drone { color: #246aa9; background: #e6eff9; }.drawer-identity > span.pending { color: #94631d; background: #fff2dc; }.drawer-identity > div { min-width: 0; }.drawer-identity small { color: var(--muted); font-size: 10px; }.drawer-identity h2 { margin: 3px 0; overflow: hidden; font-size: 17px; white-space: nowrap; text-overflow: ellipsis; }.drawer-identity p { margin: 0; color: var(--muted); font-size: 11px; }
-.drawer-status { min-height: 42px; padding: 0 18px; display: flex; align-items: center; gap: 8px; background: #f7f9fa; border-bottom: 1px solid var(--line); }.drawer-status > span { color: var(--muted); font-size: 11px; }
-.drawer-section { padding: 17px 18px; border-bottom: 1px solid var(--line); }.drawer-section[hidden] { display: none; }.drawer-section h3 { margin: 0 0 13px; font-size: 13px; }.drawer-section-title { display: flex; align-items: center; justify-content: space-between; }.drawer-section-title button { color: var(--blue); background: transparent; font-size: 11px; }.property-list { margin: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 15px 12px; }.property-list div { min-width: 0; }.property-list dt { margin-bottom: 4px; color: var(--muted); font-size: 10px; }.property-list dd { margin: 0; overflow: hidden; color: #34434f; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
-.binding-device { width: 100%; min-height: 50px; padding: 8px 10px; display: grid; grid-template-columns: 30px 1fr 14px; align-items: center; gap: 8px; border: 1px solid var(--line); border-radius: 5px; color: #43525f; background: #fff; text-align: left; }.binding-device:hover { border-color: #9eb2c3; }.binding-device > span { width: 28px; height: 28px; display: grid; place-items: center; border-radius: 4px; color: #286aa9; background: #e7f0fa; }.binding-device > span svg { width: 14px; }.binding-device div { display: flex; flex-direction: column; gap: 3px; }.binding-device strong { font-size: 12px; }.binding-device small { color: var(--muted); font-size: 10px; }.binding-device > svg { width: 12px; color: #8a96a0; }
-.device-drawer > footer { position: sticky; bottom: 0; min-height: 62px; margin-top: auto; padding: 12px 18px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); background: #fff; }
-.firmware-current { color: var(--muted); font-size: 11px; }.firmware-upgrade { display: flex; align-items: center; gap: 8px; }.firmware-upgrade select { flex: 1; min-width: 0; height: 34px; padding: 0 26px 0 10px; border: 1px solid var(--line); border-radius: 5px; outline: 0; color: #536270; background: #fff; font-size: 12px; }
-
-.operation-page { height: 100%; flex: 1; min-height: 0; padding: 22px 24px 24px; display: flex; flex-direction: column; gap: 16px; overflow: auto; background: #f2f5f7; pointer-events: auto; }
-.operation-page-header { min-height: 45px; display: flex; align-items: center; justify-content: space-between; gap: 18px; }
-.operation-page-header > div { min-width: 0; }
-.operation-page-header h1 { margin: 0 0 5px; font-size: 23px; }
-.operation-page-header span { color: var(--muted); font-size: 11px; }
-
-.business-metric-band { min-height: 82px; display: grid; grid-template-columns: repeat(5, 1fr); border: 1px solid var(--line); border-radius: 6px; background: #fff; }
-.task-metrics { grid-template-columns: repeat(4, 1fr); }
-.business-metric-band > div { min-width: 0; padding: 15px 18px; display: grid; grid-template-columns: 1fr auto; align-content: center; gap: 5px 8px; border-right: 1px solid var(--line); }
-.business-metric-band > div:last-child { border-right: 0; }
-.business-metric-band span { color: var(--muted); font-size: 11px; }
-.business-metric-band strong { grid-row: 1 / 3; grid-column: 2; align-self: center; color: #30414e; font-size: 25px; }
-.business-metric-band small { overflow: hidden; color: #83909a; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
-.business-workspace { flex: 1; min-height: 440px; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
-
-.business-panel { display: none; flex: 1; min-height: 0; overflow: auto; }
-.business-panel.active { display: block; }
-.business-toolbar { min-height: 58px; padding: 11px 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); }
-.business-toolbar > div { display: flex; align-items: center; gap: 8px; }
-.business-toolbar select, .task-dialog select { height: 34px; padding: 0 28px 0 9px; border: 1px solid var(--line); border-radius: 4px; color: #536270; background: #fff; font-size: 11px; outline: 0; }
-.business-search { width: 290px; height: 34px; padding: 0 10px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 4px; background: #f8fafb; color: #81909b; }
-.business-search svg { width: 14px; }
-.business-search input { width: 100%; min-width: 0; border: 0; outline: 0; color: var(--ink); background: transparent; font-size: 11px; }
-.business-table-wrap { min-width: 900px; overflow: auto; }
-.business-table { width: 100%; border-collapse: collapse; table-layout: fixed; }
-.business-table th { height: 40px; padding: 0 14px; color: #788691; background: #f7f9fa; font-size: 10px; font-weight: 500; text-align: left; }
-.business-table th:first-child { width: 23%; }
-.business-table th:last-child { width: 10%; }
-.business-table td { height: 62px; padding: 8px 14px; border-bottom: 1px solid #edf0f2; color: #465561; font-size: 11px; }
-.business-table tbody tr { transition: background .14s ease; }
-.business-table tbody tr:hover { background: #f8faff; }
-.task-plan-table { min-width: 1120px; }.task-plan-table th:first-child { width: 20%; }.task-plan-table th:last-child { width: 16%; }
-.media-policy { display: inline-flex; align-items: center; white-space: nowrap; font-size: 10px; }.media-policy::before { content: ""; width: 6px; height: 6px; margin-right: 5px; border-radius: 50%; background: #8b969f; }.media-policy.live::before { background: #cc3d43; }.media-policy.record::before { background: #2b72bd; }.media-policy.live-record::before { background: linear-gradient(90deg, #cc3d43 0 50%, #2b72bd 50%); }.media-policy.none { color: #8a959e; }
-.primary-table-cell { min-width: 0; display: flex; align-items: center; gap: 9px; }
-.primary-table-cell > span:last-child { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
-.primary-table-cell strong, .media-card-copy strong { overflow: hidden; color: #283946; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
-.primary-table-cell small, .media-card-copy small { overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
-.task-table-icon { width: 29px; height: 29px; min-width: 29px; display: grid; place-items: center; border-radius: 4px; color: #286aa9; background: #e8f0f9; }
-.task-table-icon.muted { color: #788691; background: #eef1f3; }
-.task-table-icon svg { width: 14px; }
-.table-footer { height: 48px; padding: 0 16px; display: flex; align-items: center; justify-content: space-between; color: var(--muted); font-size: 10px; }
-.execution-record-table { min-width: 1050px; }.execution-record-table th:first-child { width: 15%; }.execution-record-table th:last-child { width: 8%; }
-.table-text-action { height: 27px; padding: 0 6px; border-radius: 3px; color: var(--blue); background: transparent; font-size: 11px; }.table-text-action:hover { background: #eaf2fc; }.table-text-action:disabled { color: #9aa4ac; background: transparent; cursor: not-allowed; }
-
-.route-library .business-toolbar svg { width: 13px; }
-.route-grid { padding: 16px; display: grid; grid-template-columns: repeat(3, minmax(220px, 1fr)); gap: 12px; }
-.route-grid article { overflow: hidden; border: 1px solid var(--line); border-radius: 5px; background: #fff; }
-.route-map { position: relative; height: 130px; display: grid; place-items: center; overflow: hidden; color: #fff; background-image: linear-gradient(rgba(24,48,56,.1), rgba(24,48,56,.35)), url("/assets/map-base-clean.png"); background-size: cover; }
-.route-b { background-position: 65% 45%; }.route-c { background-position: 28% 68%; }
-.route-map::after { content: ""; position: absolute; width: 58%; height: 46%; border: 2px dashed rgba(108,188,255,.95); border-radius: 48% 35% 52% 30%; transform: rotate(-8deg); }
-.route-map svg { z-index: 1; width: 25px; filter: drop-shadow(0 2px 5px rgba(0,0,0,.4)); }
-.route-map span { position: absolute; z-index: 2; right: 8px; bottom: 8px; padding: 4px 7px; border-radius: 3px; background: rgba(29,45,57,.82); font-size: 10px; }
+*{ box-sizing: border-box; }
+html, body{ margin: 0; height: 100%; overflow: hidden; font-family: Inter, "PingFang SC", "Microsoft YaHei", Arial, sans-serif; color: var(--ink); background: #edf1f4; }
+button:not([class*="t-"]), input:not([class*="t-"]){ font: inherit; }
+button:not([class*="t-"]){ border: 0; cursor: pointer; }
+svg:not(.t-icon){ width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
+.icon-library{ position: absolute; width: 0; height: 0; overflow: hidden; }
+.device-search{ display: flex; align-items: center; gap: 8px; border: 1px solid var(--line); background: var(--soft); border-radius: 5px; color: #7f8b97; }
+.device-search input{ width: 100%; min-width: 0; outline: 0; border: 0; background: transparent; font-size: 14px; color: var(--ink); }
+.icon-button{ width: 34px; height: 34px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center; background: transparent; color: #607080; }
+.icon-button:hover{ background: #eef2f5; color: var(--ink); }
+.monitor-layout{ position: relative; height: 100%; flex: 1; min-height: 0; display: grid; grid-template-columns: 0 minmax(0, 1fr) 0; overflow: hidden; background: transparent; pointer-events: none; transition: grid-template-columns .38s cubic-bezier(.22,.8,.25,1); }
+.monitor-layout.focused{ grid-template-columns: 276px minmax(360px, 1fr) 348px; }
+.monitor-layout.focused.control-expanded{ grid-template-columns: 276px minmax(360px, 1fr) 560px; }
+.device-panel, .detail-panel{ background: #fff; min-width: 0; min-height: 0; overflow: auto; opacity: 0; visibility: hidden; z-index: 8; pointer-events: none; transition: transform .38s cubic-bezier(.22,.8,.25,1), opacity .2s ease, visibility 0s linear .38s; }
+.device-panel{ width: 276px; border-right: 1px solid var(--line); padding: 18px 14px; transform: translateX(-100%); }
+.detail-panel{ width: 348px; transform: translateX(100%); }
+.monitor-layout.control-expanded .detail-panel{ width: 560px; }
+.monitor-layout.focused .device-panel, .monitor-layout.focused .detail-panel{ opacity: 1; visibility: visible; transform: translateX(0); pointer-events: auto; transition-delay: 0s; }
+.panel-heading{ display: flex; justify-content: space-between; align-items: center; }
+.panel-heading > div{ display: flex; align-items: baseline; gap: 8px; }
+.panel-heading h1{ margin: 0; font-size: 20px; }
+.panel-heading span{ color: var(--muted); font-size: 13px; }
+.device-search{ height: 36px; margin-top: 16px; padding: 0 10px; background: #fff; }
+.device-search svg{ width: 15px; }
+.filter-row{ display: flex; border-bottom: 1px solid var(--line); margin-top: 14px; }
+.filter{ position: relative; flex: 1; height: 36px; background: transparent; color: var(--muted); font-size: 14px; }
+.filter b{ font-weight: 500; }
+.filter.active{ color: var(--blue); font-weight: 600; }
+.filter.active::after{ content: ""; position: absolute; left: 20%; right: 20%; bottom: -1px; height: 2px; background: var(--blue); }
+.device-list{ display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
+.multi-select-bar{ min-height: 34px; margin-top: 10px; padding: 0 9px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 4px; color: var(--muted); background: #fafcfd; font-size: 10px; }
+.multi-select-bar span{ margin-right: auto; color: #607481; }
+.multi-select-bar button{ min-height: 24px; padding: 0 8px; border: 1px solid #d7e2e9; border-radius: 3px; color: #526875; background: #fff; font-size: 10px; }
+.multi-select-bar button:hover, .multi-select-bar.has-selection button{ color: var(--blue); border-color: #a6c5df; background: #f3f8fc; }
+.device-card{ position: relative; width: 100%; min-height: 70px; text-align: left; border: 1px solid var(--line); border-radius: 6px; background: #fff; color: var(--ink); overflow: hidden; transition: .16s ease; }
+.device-card:hover{ border-color: #aab9c8; transform: translateY(-1px); }
+.device-card.active{ border-color: #5a93d4; background: #f4f8fd; box-shadow: inset 3px 0 var(--blue); }
+.device-card.multi-selected{ border-color: var(--blue); box-shadow: inset 3px 0 var(--blue); background: #f4f8fd; }
+.device-select-checkbox{ position: absolute; z-index: 2; top: 10px; left: 8px; width: auto; height: auto; display: flex; align-items: center; cursor: pointer; }
+.device-select-checkbox .t-checkbox{ margin: 0; }
+.device-select-checkbox .t-checkbox__label{ display: none; }
+.device-card-main{ width: 100%; min-height: 68px; padding: 11px 11px 11px 34px; display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 9px; color: inherit; background: transparent; text-align: left; }
+.device-copy{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.device-copy strong{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; }
+.device-copy small{ color: var(--muted); font-size: 12px; }
+.dock-glyph{ width: 34px; height: 34px; display: grid; place-items: center; border-radius: 5px; color: #1e7658; background: #e3f3ec; }
+.dock-glyph.alarm{ color: #a54526; background: #fff0e9; }
+.dock-glyph.offline{ color: #7c8791; background: #edf0f2; }
+.status{ font-style: normal; font-size: 12px; border-radius: 3px; padding: 3px 6px; white-space: nowrap; }
+.status.online{ background: #e6f5ee; color: #167955; }
+.status.mission{ background: #e7f0fc; color: #2568b5; }
+.status.alarm{ background: #fff0e7; color: #b75225; }
+.status.offline{ background: #edf0f2; color: #737e88; }
+.status.pending{ background: #fff1dc; color: #95631d; }
+.bound-drone{ position: relative; width: calc(100% - 18px); min-height: 45px; margin: 0 9px 9px; padding: 7px 7px 7px 28px; display: grid; grid-template-columns: 18px 1fr auto; align-items: center; gap: 6px; border-radius: 4px; background: #f1f4f6; color: #42515e; text-align: left; }
+.bound-drone:hover, .bound-drone.active{ background: #e7eff9; color: #1f5f9f; }
+.bound-drone > svg{ width: 15px; }
+.bound-drone > span:nth-of-type(2){ min-width: 0; display: flex; flex-direction: column; gap: 2px; }
+.bound-drone strong{ font-size: 12px; }
+.bound-drone small{ color: var(--muted); font-size: 10px; }
+.bound-drone > i{ font-style: normal; color: var(--green); font-size: 10px; }
+.bound-drone.flying > i{ color: var(--blue); }
+.bound-drone.offline > i{ color: #8b969f; }
+.tree-line{ position: absolute; left: 13px; top: -9px; width: 10px; height: 29px; border-left: 1px solid #c4ced6; border-bottom: 1px solid #c4ced6; border-radius: 0 0 0 5px; }
+.device-alert{ margin: 0 10px 10px; padding-top: 8px; border-top: 1px solid var(--line); display: flex; align-items: center; gap: 5px; color: var(--red); font-size: 11px; }
+.device-alert svg{ width: 12px; }
+.device-alert span{ margin-left: auto; color: var(--muted); }
+.device-alert.muted{ color: var(--muted); }
+.map-panel{ position: relative; min-width: 0; overflow: visible; background: transparent; isolation: isolate; pointer-events: none; }
+.map-toolbar, .map-legend{ pointer-events: auto; }
+.map-panel::after{ display: none; }
+.map-toolbar{ position: absolute; z-index: 4; top: 14px; left: 14px; height: 34px; display: flex; background: #fff; border-radius: 5px; box-shadow: 0 4px 14px rgba(19,31,39,.17); overflow: hidden; }
+.map-type{ padding: 0 13px; background: #fff; color: var(--muted); border-right: 1px solid var(--line); font-size: 13px; }
+.map-type.active{ background: #263846; color: #fff; }
+.map-toolbar .icon-button{ border-radius: 0; }
+.map-legend{ position: absolute; z-index: 4; left: 14px; bottom: 14px; height: 32px; padding: 0 11px; display: flex; align-items: center; gap: 12px; border-radius: 4px; background: rgba(255,255,255,.94); box-shadow: 0 4px 14px rgba(19,31,39,.13); font-size: 12px; color: #52616e; }
+.map-legend span{ display: flex; align-items: center; gap: 4px; white-space: nowrap; }
+.map-legend i{ width: 7px; height: 7px; border-radius: 50%; }
+.green{ background: var(--green); }
+.blue{ background: var(--blue); }
+.red{ background: var(--red); }
+.gray{ background: #84909b; }
+.map-scale{ position: absolute; z-index: 4; right: 12px; bottom: 14px; color: #fff; font-size: 10px; border-bottom: 2px solid #fff; padding: 0 16px 2px; text-shadow: 0 1px 3px #000; pointer-events: none; }
+@keyframes marker-pulse{ 50% { filter: drop-shadow(0 0 6px rgba(204,61,67,.7)); } }
+.detail-header{ min-height: 90px; padding: 17px 18px 14px; display: flex; align-items: center; justify-content: space-between; gap: 10px; border-bottom: 1px solid var(--line); }
+.detail-header > div{ min-width: 0; }
+.eyebrow{ color: #73808d; font-size: 12px; }
+.detail-header h2{ margin: 4px 0 5px; font-size: 18px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.detail-header p{ margin: 0; display: flex; align-items: center; gap: 4px; color: var(--muted); font-size: 12px; }
+.detail-header p svg{ width: 12px; height: 12px; }
+.detail-head-actions{ display: flex; align-items: center; gap: 4px; }
+.detail-head-actions .icon-button{ width: 28px; height: 28px; }
+.asset-relation{ min-height: 44px; padding: 0 18px; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); background: #f6f8fa; }
+.asset-relation span{ display: flex; align-items: center; gap: 5px; color: var(--muted); font-size: 11px; }
+.asset-relation svg{ width: 13px; }
+.asset-relation button{ display: flex; align-items: center; gap: 3px; color: var(--blue); background: transparent; font-size: 12px; }
+.asset-relation button svg{ width: 12px; }
+.detail-panel section{ padding: 14px 18px; border-bottom: 1px solid var(--line); }
+.section-title{ min-height: 22px; display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
+.section-title h3{ margin: 0; font-size: 14px; }
+.section-title > span, .section-title > div > b{ font-size: 11px; color: var(--muted); font-weight: 500; }
+.section-title > div{ display: flex; align-items: center; gap: 5px; }
+.section-title .icon-button{ width: 26px; height: 26px; }
+.live-dot{ width: 6px; height: 6px; border-radius: 50%; background: #929ca4; }
+.live-dot.active{ background: var(--red); box-shadow: 0 0 0 3px rgba(204,61,67,.14); }
+.video-frame{ position: relative; width: 100%; aspect-ratio: 16 / 8.6; overflow: hidden; border-radius: 5px; background: #1e2d34; }
+.camera-scene{ position: absolute; inset: 0; overflow: hidden; background: linear-gradient(#718fa0 0 45%, #687765 45% 66%, #40514c 66%); filter: saturate(.75); }
+.camera-scene::after{ content: ""; position: absolute; inset: 0; background: linear-gradient(115deg, rgba(255,255,255,.22), transparent 35%, rgba(4,18,26,.2)); }
+.horizon{ position: absolute; left: -10%; right: -10%; bottom: 31%; height: 16%; background: #49655c; clip-path: polygon(0 70%, 12% 25%, 22% 60%, 36% 5%, 48% 55%, 62% 20%, 73% 58%, 88% 7%, 100% 58%, 100% 100%, 0 100%); }
+.dock-model{ position: absolute; z-index: 2; width: 80px; height: 38px; left: 50%; bottom: 19%; transform: translateX(-50%); background: #d8dde0; border: 3px solid #87949b; box-shadow: 0 12px 18px rgba(0,0,0,.24); }
+.dock-model::before, .dock-model::after{ content: ""; position: absolute; bottom: 31px; width: 54px; height: 13px; background: #c2cbd0; border: 3px solid #7b898f; }
+.dock-model::before{ right: 50%; transform: skewY(14deg); transform-origin: right bottom; }
+.dock-model::after{ left: 50%; transform: skewY(-14deg); transform-origin: left bottom; }
+.dock-model span{ position: absolute; top: 7px; width: 9px; height: 22px; background: #263a42; }
+.dock-model span:first-child{ left: 13px; }
+.dock-model span:nth-child(2){ right: 13px; }
+.dock-model i{ position: absolute; width: 34px; height: 3px; left: 21px; top: -10px; background: #222; box-shadow: 0 -6px #222; }
+.video-overlay{ position: absolute; z-index: 3; left: 9px; right: 9px; top: 8px; display: flex; justify-content: space-between; color: #fff; font-size: 11px; text-shadow: 0 1px 3px #000; }
+.video-overlay small{ font-size: 10px; }
+.play-control{ position: absolute; z-index: 4; left: 50%; top: 50%; width: 42px; height: 42px; display: grid; place-items: center; transform: translate(-50%, -50%); border: 1px solid rgba(255,255,255,.55); border-radius: 50%; color: #fff; background: rgba(13,28,35,.64); backdrop-filter: blur(4px); }
+.play-control:hover{ transform: translate(-50%, -50%) scale(1.06); }
+.play-control svg{ width: 17px; }
+.video-frame.streaming .camera-scene{ animation: camera-live 4s ease-in-out infinite alternate; }
+.video-frame > video{ position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; object-fit: cover; background: #000; border: 0; }
+.video-frame.playing .camera-scene{ display: none; }
+.video-frame.playing .play-control{ opacity: 0; pointer-events: none; transition: opacity .15s ease; }
+.video-frame.playing:hover .play-control{ opacity: 1; pointer-events: auto; }
+.video-status{ position: absolute; z-index: 5; left: 50%; bottom: 12px; max-width: calc(100% - 24px); padding: 5px 9px; border-radius: 4px; color: #fff; background: rgba(13,28,35,.72); font-size: 11px; text-align: center; transform: translateX(-50%); pointer-events: none; }
+.section-title .icon-button:disabled{ opacity: .35; cursor: not-allowed; }
+@keyframes camera-live{ to { transform: scale(1.035) translateX(-2px); } }
+.text-button{ color: var(--blue); background: transparent; font-size: 12px; padding: 0; }
+.metric-grid{ display: grid; grid-template-columns: repeat(2, 1fr); gap: 7px; }
+.metric-grid > div{ position: relative; min-height: 61px; padding: 9px 9px 8px 31px; border-radius: 5px; background: var(--soft); display: flex; flex-direction: column; gap: 3px; }
+.metric-grid svg{ position: absolute; left: 9px; top: 10px; width: 15px; color: #607b92; }
+.metric-grid span{ color: var(--muted); font-size: 11px; }
+.metric-grid strong{ font-size: 18px; font-weight: 650; }
+.metric-grid strong small{ font-size: 11px; margin-left: 2px; color: var(--muted); }
+.metric-grid .success{ color: var(--green); font-size: 14px; }
+.mission-state{ padding: 3px 6px; border-radius: 3px; background: #e7f0fc; color: #2568b5 !important; }
+.mission-progress .table-empty{ min-height: 42px; display: grid; place-items: center; color: var(--muted); font-size: 11px; }
+.mission-name{ display: flex; align-items: center; justify-content: space-between; }
+.mission-name > span{ display: flex; flex-direction: column; gap: 3px; }
+.mission-name strong{ font-size: 13px; }
+.mission-name small{ color: var(--muted); font-size: 10px; }
+.mission-name > b{ color: var(--blue); font-size: 16px; }
+.progress-track{ height: 5px; margin-top: 10px; overflow: hidden; border-radius: 3px; background: #e7ebef; }
+.progress-track i{ display: block; width: 50%; height: 100%; background: var(--blue); }
+.progress-meta{ margin-top: 8px; display: flex; justify-content: space-between; color: var(--muted); font-size: 10px; }
+.return-action{ background: #176b61; }
+.return-action:hover{ background: #10584f; }
+.environment-row{ display: grid; grid-template-columns: repeat(3, 1fr); }
+.environment-row > div{ min-width: 0; padding: 0 8px; border-right: 1px solid var(--line); display: grid; grid-template-columns: 18px 1fr; gap: 2px 3px; }
+.environment-row > div:first-child{ padding-left: 0; }
+.environment-row > div:last-child{ border-right: 0; padding-right: 0; }
+.environment-row svg{ grid-row: 1 / 3; width: 15px; color: #607b92; }
+.environment-row span{ font-size: 10px; color: var(--muted); white-space: nowrap; }
+.environment-row strong{ font-size: 12px; white-space: nowrap; }
+.quick-actions{ border-bottom: 0 !important; }
+.workflow-actions{ display: grid; grid-template-columns: 1fr 1fr; gap: 7px; }
+.workflow-action{ min-width: 0; min-height: 54px; padding: 0 10px; display: grid; grid-template-columns: 23px 1fr; align-items: center; gap: 7px; border-radius: 5px; color: #fff; text-align: left; }
+.workflow-action.takeoff{ background: var(--blue); }
+.workflow-action.takeoff:hover{ background: var(--blue-dark); }
+.workflow-action.landing{ background: #176b61; }
+.workflow-action.landing:hover{ background: #10584f; }
+.workflow-action > svg{ width: 19px; }
+.workflow-action > span{ min-width: 0; display: flex; flex-direction: column; gap: 2px; }
+.workflow-action strong{ font-size: 12px; }
+.workflow-action small{ overflow: hidden; color: rgba(255,255,255,.76); font-size: 8px; white-space: nowrap; text-overflow: ellipsis; }
+.stage-actions{ display: grid; grid-template-columns: 1fr 1fr; gap: 7px; margin-top: 8px; }
+.stage-actions button{ min-width: 0; min-height: 48px; padding: 6px 7px; display: grid; grid-template-columns: 22px 1fr; align-items: center; gap: 5px; border: 1px solid var(--line); border-radius: 5px; color: #42515e; background: #fff; text-align: left; }
+.stage-actions button:hover{ border-color: #8fa7bc; background: #f7f9fb; }
+.stage-actions button > b{ width: 21px; height: 21px; display: grid; place-items: center; border-radius: 3px; color: #376b98; background: #e8f0f7; font-size: 10px; }
+.stage-actions button > span{ min-width: 0; display: flex; flex-direction: column; gap: 2px; font-size: 11px; }
+.stage-actions small{ overflow: hidden; color: var(--muted); font-size: 8px; white-space: nowrap; text-overflow: ellipsis; }
+.stage-actions svg{ width: 11px; color: #8b98a3; }
+.reset-action{ width: 100%; height: 38px; margin-top: 8px; padding: 0 10px; display: grid; grid-template-columns: 16px 1fr; align-items: center; gap: 6px; border: 1px solid var(--line); border-radius: 5px; color: #566574; background: #f7f8fa; text-align: left; font-size: 11px; }
+.reset-action:hover{ color: var(--ink); border-color: #aebbc6; }
+.reset-action svg{ width: 13px; }
+.reset-action span{ display: flex; flex-direction: column; gap: 2px; }
+.reset-action small{ color: var(--muted); font-size: 8px; }
+.primary-action{ width: 100%; min-height: 51px; padding: 0 11px; display: grid; grid-template-columns: 26px 1fr; align-items: center; gap: 9px; border-radius: 5px; background: var(--blue); color: #fff; text-align: left; }
+.primary-action:hover{ background: var(--blue-dark); }
+.primary-action > span{ display: flex; flex-direction: column; gap: 2px; }
+.primary-action strong{ font-size: 13px; }
+.primary-action small{ font-size: 10px; color: #d9eaff; }
+.secondary-actions{ display: grid; grid-template-columns: 1fr 1fr; gap: 7px; margin-top: 7px; }
+.secondary-actions button{ height: 36px; display: flex; align-items: center; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 5px; background: #fff; color: #526271; font-size: 12px; }
+.secondary-actions button:hover{ border-color: #92a5b6; color: var(--ink); }
+.secondary-actions svg{ width: 14px; }
+.monitor-layout[hidden]{ display: none !important; }
+.device-page{ position: relative; height: 100%; flex: 1; min-height: 0; padding: 22px 24px 24px; display: flex; flex-direction: column; gap: 16px; overflow: auto; background: #f2f5f7; pointer-events: auto; }
+.device-page-header{ min-height: 42px; display: flex; align-items: center; justify-content: space-between; gap: 16px; }
+.device-page-header > div:first-child{ display: flex; align-items: baseline; gap: 12px; }
+.device-page-header h1{ margin: 0; font-size: 24px; }
+.device-page-header > div:first-child > span{ color: var(--muted); font-size: 12px; }
+.page-actions{ display: flex; align-items: center; gap: 8px; }
+.page-actions svg{ width: 14px; }
+.t-button .t-button__text{ display: inline-flex; align-items: center; gap: 6px; }
+.t-button .t-button__text > svg{ display: block; flex-shrink: 0; }
+.asset-overview{ min-height: 74px; padding: 0 4px; display: grid; grid-template-columns: repeat(5, 1fr); align-items: center; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
+.asset-overview > div{ min-width: 0; height: 42px; padding: 0 20px; display: grid; grid-template-columns: auto 1fr; grid-template-rows: 18px 24px; align-items: end; border-right: 1px solid var(--line); }
+.asset-overview > div:last-child{ border-right: 0; }
+.asset-overview span{ grid-column: 1 / 3; color: var(--muted); font-size: 11px; }
+.asset-overview strong{ font-size: 26px; line-height: 24px; font-weight: 650; }
+.asset-overview small{ align-self: end; padding: 0 0 2px 4px; color: var(--muted); font-size: 11px; }
+.green-text{ color: var(--green); }
+.blue-text{ color: var(--blue); }
+.red-text{ color: var(--red); }
+.orange-text{ color: var(--orange); }
+.asset-workspace{ min-height: 500px; flex: 1; display: flex; flex-direction: column; border: 1px solid var(--line); border-radius: 6px; background: #fff; overflow: hidden; }
+.asset-toolbar{ min-height: 58px; padding: 11px 18px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); }
+.asset-search{ width: min(320px, 34%); height: 34px; padding: 0 10px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 5px; color: #7c8995; }
+.asset-search svg{ width: 14px; }
+.asset-search input{ width: 100%; min-width: 0; border: 0; outline: 0; color: var(--ink); background: transparent; font-size: 12px; }
+.toolbar-group{ display: flex; align-items: center; gap: 7px; }
+.toolbar-group select{ width: 126px; height: 34px; padding: 0 26px 0 10px; border: 1px solid var(--line); border-radius: 5px; outline: 0; color: #536270; background: #fff; font-size: 12px; }
+.asset-table-wrap{ flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: auto; }
+.asset-name-cell{ display: flex; align-items: center; gap: 9px; }
+.table-asset-icon{ width: 30px; height: 30px; min-width: 30px; display: grid; place-items: center; border-radius: 4px; color: #256e56; background: #e6f3ee; }
+.table-asset-icon.drone{ color: #286aa9; background: #e7f0fa; }
+.table-asset-icon.pending{ color: #93611d; background: #fff2dc; }
+.table-asset-icon svg{ width: 15px; }
+.asset-name-cell > span{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.asset-name-cell strong{ overflow: hidden; color: var(--ink); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
+.asset-name-cell small{ color: var(--muted); font-size: 10px; }
+.table-status{ display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
+.table-status i{ width: 6px; height: 6px; border-radius: 50%; }
+.table-status.online i{ background: var(--green); }
+.table-status.mission i{ background: var(--blue); }
+.table-status.alarm i{ background: var(--red); }
+.table-status.offline i{ background: #8b969f; }
+.table-status.pending i{ background: var(--orange); }
+.binding-cell{ display: flex; align-items: center; gap: 5px; }
+.binding-cell svg{ width: 12px; color: #72808d; }
+.binding-cell.unbound{ color: #8a959f; }
+.row-actions{ display: flex; align-items: center; gap: 2px; }
+.row-actions button{ height: 28px; padding: 0 7px; border-radius: 4px; color: var(--blue); background: transparent; font-size: 11px; }
+.row-actions button:hover{ background: #eaf2fc; }
+.row-actions .row-actions svg{ width: 14px; }
+.table-empty{ height: 240px !important; color: var(--muted) !important; text-align: center; }
+.table-footer{ min-height: 48px; margin-top: auto; padding: 0 16px; display: flex; align-items: center; justify-content: space-between; color: var(--muted); font-size: 11px; }
+.table-footer > div{ display: flex; align-items: center; gap: 6px; }
+.table-footer button, .table-footer b{ width: 26px; height: 26px; display: grid; place-items: center; border: 1px solid var(--line); border-radius: 4px; color: #84909b; background: #fff; }
+.table-footer button:first-child svg{ transform: rotate(180deg); }
+.table-footer button svg{ width: 12px; }
+.table-footer b{ border-color: var(--blue); color: #fff; background: var(--blue); font-size: 11px; font-weight: 500; }
+.drawer-scrim{ position: absolute; z-index: 39; inset: 0; background: rgba(22,34,43,.18); opacity: 0; visibility: hidden; transition: opacity .2s ease, visibility 0s linear .25s; }
+.drawer-scrim.open{ opacity: 1; visibility: visible; transition-delay: 0s; }
+.device-drawer{ position: absolute; z-index: 40; top: 0; right: 0; bottom: 0; width: 408px; display: flex; flex-direction: column; overflow: auto; color: var(--ink); background: #fff; border-left: 1px solid var(--line); box-shadow: -12px 0 32px rgba(19,33,45,.14); transform: translateX(102%); visibility: hidden; transition: transform .3s cubic-bezier(.22,.8,.25,1), visibility 0s linear .3s; }
+.device-drawer.open{ transform: translateX(0); visibility: visible; transition-delay: 0s; }
+.device-drawer > header{ min-height: 84px; padding: 16px 18px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); }
+.drawer-identity{ min-width: 0; display: flex; align-items: center; gap: 11px; }
+.drawer-identity > span{ width: 38px; height: 38px; min-width: 38px; display: grid; place-items: center; border-radius: 5px; color: #226e55; background: #e5f3ed; }
+.drawer-identity > span.drone{ color: #246aa9; background: #e6eff9; }
+.drawer-identity > span.pending{ color: #94631d; background: #fff2dc; }
+.drawer-identity > div{ min-width: 0; }
+.drawer-identity small{ color: var(--muted); font-size: 10px; }
+.drawer-identity h2{ margin: 3px 0; overflow: hidden; font-size: 17px; white-space: nowrap; text-overflow: ellipsis; }
+.drawer-identity p{ margin: 0; color: var(--muted); font-size: 11px; }
+.drawer-status{ min-height: 42px; padding: 0 18px; display: flex; align-items: center; gap: 8px; background: #f7f9fa; border-bottom: 1px solid var(--line); }
+.drawer-status > span{ color: var(--muted); font-size: 11px; }
+.drawer-section{ padding: 17px 18px; border-bottom: 1px solid var(--line); }
+.drawer-section[hidden]{ display: none; }
+.drawer-section h3{ margin: 0 0 13px; font-size: 13px; }
+.drawer-section-title{ display: flex; align-items: center; justify-content: space-between; }
+.drawer-section-title button{ color: var(--blue); background: transparent; font-size: 11px; }
+.property-list{ margin: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 15px 12px; }
+.property-list div{ min-width: 0; }
+.property-list dt{ margin-bottom: 4px; color: var(--muted); font-size: 10px; }
+.property-list dd{ margin: 0; overflow: hidden; color: #34434f; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
+.binding-device{ width: 100%; min-height: 50px; padding: 8px 10px; display: grid; grid-template-columns: 30px 1fr 14px; align-items: center; gap: 8px; border: 1px solid var(--line); border-radius: 5px; color: #43525f; background: #fff; text-align: left; }
+.binding-device:hover{ border-color: #9eb2c3; }
+.binding-device > span{ width: 28px; height: 28px; display: grid; place-items: center; border-radius: 4px; color: #286aa9; background: #e7f0fa; }
+.binding-device > span svg{ width: 14px; }
+.binding-device div{ display: flex; flex-direction: column; gap: 3px; }
+.binding-device strong{ font-size: 12px; }
+.binding-device small{ color: var(--muted); font-size: 10px; }
+.binding-device > svg{ width: 12px; color: #8a96a0; }
+.device-drawer > footer{ position: sticky; bottom: 0; min-height: 62px; margin-top: auto; padding: 12px 18px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); background: #fff; }
+.operation-page{ height: 100%; flex: 1; min-height: 0; padding: 22px 24px 24px; display: flex; flex-direction: column; gap: 16px; overflow: auto; background: #f2f5f7; pointer-events: auto; }
+.operation-page-header{ min-height: 45px; display: flex; align-items: center; justify-content: space-between; gap: 18px; }
+.operation-page-header > div{ min-width: 0; }
+.operation-page-header h1{ margin: 0 0 5px; font-size: 23px; }
+.operation-page-header > div > span{ color: var(--muted); font-size: 11px; }
+.business-metric-band{ min-height: 82px; display: grid; grid-template-columns: repeat(5, 1fr); border: 1px solid var(--line); border-radius: 6px; background: #fff; }
+.task-metrics{ grid-template-columns: repeat(4, 1fr); }
+.business-metric-band > div{ min-width: 0; padding: 15px 18px; display: grid; grid-template-columns: 1fr auto; align-content: center; gap: 5px 8px; border-right: 1px solid var(--line); }
+.business-metric-band > div:last-child{ border-right: 0; }
+.business-metric-band span{ color: var(--muted); font-size: 11px; }
+.business-metric-band strong{ grid-row: 1 / 3; grid-column: 2; align-self: center; color: #30414e; font-size: 25px; }
+.business-metric-band small{ overflow: hidden; color: #83909a; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
+.business-workspace{ flex: 1; min-height: 440px; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
+.business-panel{ display: none; flex: 1; min-height: 0; overflow: auto; }
+.business-panel.active{ display: block; }
+.business-toolbar{ min-height: 58px; padding: 11px 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); }
+.business-toolbar > div{ display: flex; align-items: center; gap: 8px; }
+.business-toolbar select, .task-dialog select{ height: 34px; padding: 0 28px 0 9px; border: 1px solid var(--line); border-radius: 4px; color: #536270; background: #fff; font-size: 11px; outline: 0; }
+.business-search{ width: 290px; height: 34px; padding: 0 10px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 4px; background: #f8fafb; color: #81909b; }
+.business-search svg{ width: 14px; }
+.business-search input{ width: 100%; min-width: 0; border: 0; outline: 0; color: var(--ink); background: transparent; font-size: 11px; }
+.business-table-wrap{ min-width: 900px; overflow: auto; }
+.business-table{ width: 100%; border-collapse: collapse; table-layout: fixed; }
+.business-table th{ height: 40px; padding: 0 14px; color: #788691; background: #f7f9fa; font-size: 10px; font-weight: 500; text-align: left; }
+.business-table th:first-child{ width: 23%; }
+.business-table th:last-child{ width: 10%; }
+.business-table td{ height: 62px; padding: 8px 14px; border-bottom: 1px solid #edf0f2; color: #465561; font-size: 11px; }
+.business-table tbody tr{ transition: background .14s ease; }
+.business-table tbody tr:hover{ background: #f8faff; }
+.media-policy{ display: inline-flex; align-items: center; white-space: nowrap; font-size: 10px; }
+.media-policy::before{ content: ""; width: 6px; height: 6px; margin-right: 5px; border-radius: 50%; background: #8b969f; }
+.media-policy.live::before{ background: #cc3d43; }
+.media-policy.record::before{ background: #2b72bd; }
+.media-policy.live-record::before{ background: linear-gradient(90deg, #cc3d43 0 50%, #2b72bd 50%); }
+.media-policy.none{ color: #8a959e; }
+.primary-table-cell{ min-width: 0; display: flex; align-items: center; gap: 9px; }
+.primary-table-cell > span:last-child{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.primary-table-cell strong, .media-card-copy strong{ overflow: hidden; color: #283946; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
+.primary-table-cell small, .media-card-copy small{ overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
+.task-table-icon{ width: 29px; height: 29px; min-width: 29px; display: grid; place-items: center; border-radius: 4px; color: #286aa9; background: #e8f0f9; }
+.task-table-icon.muted{ color: #788691; background: #eef1f3; }
+.task-table-icon svg{ width: 14px; }
+.table-footer{ height: 48px; padding: 0 16px; display: flex; align-items: center; justify-content: space-between; color: var(--muted); font-size: 10px; }
+.route-library .business-toolbar svg{ width: 13px; }
+.route-grid{ padding: 16px; display: grid; grid-template-columns: repeat(3, minmax(220px, 1fr)); gap: 12px; }
+.route-grid article{ overflow: hidden; border: 1px solid var(--line); border-radius: 5px; background: #fff; }
+.route-map{ position: relative; height: 130px; display: grid; place-items: center; overflow: hidden; color: #fff; background-image: linear-gradient(rgba(24,48,56,.1), rgba(24,48,56,.35)), url("/assets/map-base-clean.png"); background-size: cover; }
+.route-c{ background-position: 28% 68%; }
+.route-map::after{ content: ""; position: absolute; width: 58%; height: 46%; border: 2px dashed rgba(108,188,255,.95); border-radius: 48% 35% 52% 30%; transform: rotate(-8deg); }
+.route-map svg{ z-index: 1; width: 25px; filter: drop-shadow(0 2px 5px rgba(0,0,0,.4)); }
+.route-map span{ position: absolute; z-index: 2; right: 8px; bottom: 8px; padding: 4px 7px; border-radius: 3px; background: rgba(29,45,57,.82); font-size: 10px; }
.route-grid article > .route-card-body,
.route-grid article > div:last-child{ padding: 11px 12px; display: flex; flex-direction: column; gap: 4px; }
.route-grid strong{ font-size: 12px; }
.route-grid small{ color: var(--muted); font-size: 10px; }
.route-card-actions{ margin-top: 8px; display: flex; align-items: center; gap: 2px; }
.route-card-actions .t-button{ height: 28px; }
-.route-library-view[hidden], .route-editor[hidden] { display: none !important; }
-.route-editor { height: 100%; min-height: 520px; display: flex; flex-direction: column; background: #fff; }
-.route-editor-header { height: 58px; min-height: 58px; padding: 0 14px; display: grid; grid-template-columns: 150px 1fr auto; align-items: center; gap: 12px; border-bottom: 1px solid var(--line); }
-.route-editor-header .back-command { grid-column: auto; }
-.route-editor-header > div:nth-child(2) { min-width: 0; display: flex; align-items: baseline; gap: 9px; }
-.route-editor-header > div:nth-child(2) strong { font-size: 14px; }.route-editor-header > div:nth-child(2) span { color: var(--muted); font-size: 10px; }
-.route-editor-header > div:last-child { display: flex; align-items: center; gap: 7px; }
-.route-editor-header button { display: inline-flex; align-items: center; gap: 5px; }.route-editor-header button svg { width: 12px; }
-.route-editor-header button:disabled { color: #a6afb6; background: #f1f3f4; cursor: not-allowed; }
-.route-editor-body { flex: 1; min-height: 0; display: grid; grid-template-columns: 290px minmax(480px, 1fr); }
-.route-config-panel { min-height: 0; padding: 15px; display: flex; flex-direction: column; border-right: 1px solid var(--line); background: #fff; }
-.route-config-panel label { margin-bottom: 13px; display: flex; flex-direction: column; gap: 6px; }
-.route-config-panel label > span { color: #4d5d69; font-size: 11px; }.route-config-panel label > span b { color: var(--red); }
-.route-config-panel input, .route-config-panel select { width: 100%; height: 35px; padding: 0 9px; border: 1px solid var(--line); border-radius: 4px; outline: 0; color: #354550; background: #fff; font-size: 11px; }
-.route-config-panel input:focus, .route-config-panel select:focus { border-color: #6799d1; box-shadow: 0 0 0 3px rgba(31,111,235,.07); }
-.number-input { position: relative; }.number-input input { padding-right: 30px; }.number-input em { position: absolute; top: 50%; right: 10px; color: var(--muted); font-size: 11px; font-style: normal; transform: translateY(-50%); }
-.route-default-title { min-height: 31px; padding-top: 3px; display: flex; align-items: center; border-top: 1px solid var(--line); }.route-default-title strong { font-size: 11px; }
-.route-default-row { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }.route-default-row label { min-width: 0; }.route-default-row .number-input input { padding-right: 34px; }
-.route-turn-segment { height: 34px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
-.apply-all-waypoints { height: 33px; margin: -3px 0 12px; display: flex; align-items: center; justify-content: center; gap: 6px; border: 1px solid #b8c7d4; border-radius: 4px; color: #2d669f; background: #f6f9fc; font-size: 11px; }.apply-all-waypoints:hover { border-color: #78a1c9; background: #edf4fb; }.apply-all-waypoints svg { width: 12px; }
-.waypoint-heading { height: 34px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--line); }
-.waypoint-heading strong { font-size: 12px; }.waypoint-heading span { min-width: 20px; padding: 2px 6px; border-radius: 8px; color: #346caa; background: #e8f1fb; font-size: 10px; text-align: center; }
-.waypoint-list { flex: 1; min-height: 110px; overflow: auto; border-top: 1px solid var(--line); }
-.waypoint-empty { height: 70px; display: grid; place-items: center; color: #929da6; font-size: 11px; }
-.waypoint-item { min-height: 55px; padding: 7px 2px; display: grid; grid-template-columns: 24px 1fr 50px; align-items: center; gap: 7px; border-bottom: 1px solid #edf0f2; cursor: pointer; }.waypoint-item:hover { background: #f7faff; }
-.waypoint-item > b { width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; color: #fff; background: var(--blue); font-size: 10px; }
-.waypoint-item:first-child > b { background: var(--green); }.waypoint-item:last-child > b { background: #c56c28; }.waypoint-item:only-child > b { background: var(--green); }
-.waypoint-item > span { min-width: 0; display: flex; flex-direction: column; gap: 3px; }.waypoint-item strong { font-size: 11px; }.waypoint-item small { overflow: hidden; color: var(--muted); font-size: 8px; text-overflow: ellipsis; white-space: nowrap; }.waypoint-item small:last-child { color: #536a7c; }
-.waypoint-item-actions { display: flex; align-items: center; }.waypoint-item-actions button { width: 23px; height: 23px; display: grid; place-items: center; border-radius: 3px; color: #788792; background: transparent; }.waypoint-item-actions button:hover { color: var(--blue); background: #eaf2fc; }.waypoint-item-actions button:last-child:hover { color: var(--red); background: #fff0f0; }.waypoint-item-actions button svg { width: 11px; }
-.route-form-error { min-height: 25px; padding-top: 8px; color: var(--red); font-size: 10px; }
-.route-planner-map { position: relative; min-width: 0; min-height: 430px; overflow: hidden; background: #75887a; cursor: crosshair; isolation: isolate; }
-.route-planner-map > #map,
-.route-planner-map > .mapboxgl-map {
- position: absolute !important;
- inset: 0;
- width: 100% !important;
- height: 100% !important;
- z-index: 0;
-}
-.route-map-status, .route-map-legend { position: absolute; z-index: 5; display: flex; align-items: center; border-radius: 4px; background: rgba(255,255,255,.94); box-shadow: 0 3px 12px rgba(20,36,45,.13); color: #52616d; font-size: 10px; pointer-events: none; }
-.route-map-status { top: 12px; right: 12px; height: 30px; padding: 0 9px; gap: 13px; }.route-map-status span { display: flex; align-items: center; gap: 5px; }.route-map-status i { width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
-.route-map-legend { right: 12px; bottom: 12px; height: 31px; padding: 0 10px; gap: 11px; }.route-map-legend span { display: flex; align-items: center; gap: 4px; }.route-map-legend i { width: 7px; height: 7px; border: 2px solid #fff; border-radius: 50%; background: var(--blue); box-shadow: 0 0 0 1px #7e8c97; }.route-map-legend i.start { background: var(--green); }.route-map-legend i.end { background: #c56c28; }
-.waypoint-dialog { width: min(540px, 100%); }.waypoint-id-row { min-height: 42px; margin-bottom: 14px; padding: 0 12px; display: flex; align-items: center; justify-content: space-between; border-radius: 4px; background: #f4f6f8; }.waypoint-id-row span { color: var(--muted); font-size: 11px; }.waypoint-id-row strong { font-size: 14px; }.waypoint-dialog .number-input input { padding-right: 38px; }.waypoint-turn-segment { height: 38px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
-
-.task-replay-page { position: relative; height: 100%; flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; background: transparent; pointer-events: none; }
-.replay-header { min-height: 88px; padding: 10px 20px 13px; display: grid; grid-template-columns: 155px minmax(260px, 1fr) auto; align-items: end; gap: 8px 15px; border-bottom: 1px solid var(--line); background: #fff; }
-.replay-header .back-command { grid-column: 1 / 4; }
-.replay-header > div:nth-child(2) { grid-column: 1 / 3; min-width: 0; }.replay-header small { color: var(--muted); font-size: 10px; }.replay-header h1 { margin: 3px 0; overflow: hidden; font-size: 19px; text-overflow: ellipsis; white-space: nowrap; }.replay-header > div:nth-child(2) > span { color: var(--muted); font-size: 10px; }.replay-header > div:nth-child(2) b { color: #5c6a75; font-weight: 500; }
-.replay-header-summary { display: flex; align-items: center; }.replay-header-summary > span { min-width: 86px; padding: 0 14px; display: flex; flex-direction: column; gap: 4px; border-left: 1px solid var(--line); color: var(--muted); font-size: 10px; }.replay-header-summary strong { color: #344550; font-size: 12px; }
-.replay-map { position: relative; flex: 1; min-height: 0; overflow: hidden; isolation: isolate; background: transparent; pointer-events: none; }
-.replay-empty { position: absolute; inset: 0; display: grid; place-items: center; color: var(--muted); font-size: 12px; pointer-events: none; background: rgba(238,242,244,.72); }
-.replay-route-layer { position: absolute; z-index: 2; inset: 0; width: 100%; height: 100%; overflow: visible; }
-.replay-route-shadow, .replay-route-line { fill: none; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; }.replay-route-shadow { stroke: rgba(255,255,255,.9); stroke-width: 7; }.replay-route-line { stroke: #2b79c8; stroke-width: 3; stroke-dasharray: 7 5; }
-.replay-waypoints circle { fill: #fff; stroke: #2b79c8; stroke-width: 4; vector-effect: non-scaling-stroke; }.replay-waypoints circle:first-child { stroke: var(--green); }.replay-waypoints circle:last-child { stroke: #c56c28; }
-.replay-drone-marker { color: #fff; filter: drop-shadow(0 4px 6px rgba(13,33,45,.4)); }.replay-drone-marker circle { fill: #216fbd; stroke: #fff; stroke-width: 3; vector-effect: non-scaling-stroke; }.replay-drone-marker use { color: #fff; }
-.replay-map-legend { position: absolute; z-index: 4; height: 31px; padding: 0 10px; display: flex; align-items: center; gap: 12px; border-radius: 4px; color: #53626e; background: rgba(255,255,255,.94); box-shadow: 0 3px 12px rgba(19,36,46,.13); font-size: 10px; }
-.replay-map-back { position: absolute; z-index: 5; top: 13px; left: 13px; height: 32px; padding: 0 11px; display: flex; align-items: center; gap: 5px; border-radius: 4px; color: #40525f; background: rgba(255,255,255,.96); box-shadow: 0 3px 12px rgba(19,36,46,.15); font-size: 11px; }.replay-map-back:hover { color: var(--blue); }.replay-map-back svg { width: 12px; transform: rotate(180deg); }
-.replay-map-legend { right: 13px; bottom: 78px; }.replay-map-legend span { display: flex; align-items: center; gap: 5px; }.replay-map-legend i { width: 18px; border-top: 2px dashed #2b79c8; }.replay-map-legend i.route-start, .replay-map-legend i.route-end { width: 7px; height: 7px; border: 2px solid #fff; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 1px #72818c; }.replay-map-legend i.route-end { background: #c56c28; }
-.replay-telemetry { position: absolute; z-index: 4; top: 13px; right: 13px; width: 248px; overflow: hidden; border: 1px solid rgba(210,218,223,.9); border-radius: 5px; background: rgba(255,255,255,.96); box-shadow: 0 5px 18px rgba(18,34,43,.14); }
-.replay-telemetry header { height: 39px; padding: 0 12px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }.replay-telemetry header span { font-size: 12px; font-weight: 600; }.replay-telemetry header b { color: var(--muted); font-size: 10px; font-weight: 500; }
-.telemetry-grid { display: grid; grid-template-columns: 1fr 1fr; }.telemetry-grid > div { min-height: 50px; padding: 9px 11px; display: flex; flex-direction: column; gap: 5px; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }.telemetry-grid > div:nth-child(even) { border-right: 0; }.telemetry-grid span { color: var(--muted); font-size: 10px; }.telemetry-grid strong { color: #354651; font-size: 12px; }
-.replay-telemetry dl { margin: 0; padding: 7px 11px 9px; }.replay-telemetry dl > div { min-height: 26px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #edf0f2; }.replay-telemetry dl > div:last-child { border-bottom: 0; }.replay-telemetry dt { color: var(--muted); font-size: 10px; }.replay-telemetry dd { margin: 0; color: #455560; font-size: 10px; }
-.replay-controller { position: absolute; z-index: 5; right: 13px; bottom: 13px; left: 13px; height: 52px; padding: 0 13px; display: grid; grid-template-columns: 34px 42px minmax(160px, 1fr) 42px 60px; align-items: center; gap: 9px; border-radius: 5px; background: rgba(255,255,255,.97); box-shadow: 0 5px 20px rgba(17,34,44,.18); }
-.replay-play { width: 32px; height: 32px; display: grid; place-items: center; border-radius: 50%; color: #fff; background: var(--blue); }.replay-play svg { width: 13px; }.replay-controller > span { color: #53626e; font-size: 10px; text-align: center; }.replay-controller input { width: 100%; accent-color: var(--blue); }.replay-controller select { width: 58px; height: 30px; padding: 0 6px; border: 1px solid var(--line); border-radius: 4px; color: #455560; background: #fff; font-size: 10px; }
-
-.media-panel-heading { min-height: 63px; padding: 12px 17px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
-.media-panel-heading > div { display: flex; flex-direction: column; gap: 4px; }.media-panel-heading h2 { margin: 0; font-size: 14px; }.media-panel-heading span { color: var(--muted); font-size: 10px; }
-.media-live-count { display: flex; align-items: center; gap: 6px; }.media-live-count i, .live-corner i { width: 6px; height: 6px; border-radius: 50%; background: var(--red); }
-.live-media-grid, .media-grid { padding: 16px; display: grid; grid-template-columns: repeat(2, minmax(260px, 1fr)); gap: 13px; }
-.live-media-grid article, .media-grid article { overflow: hidden; border: 1px solid var(--line); border-radius: 5px; background: #fff; }
-.media-card-actions { display: flex; align-items: center; gap: 8px; }
-.media-visual { position: relative; aspect-ratio: 16 / 8.5; overflow: hidden; background-image: linear-gradient(rgba(15,30,38,.06), rgba(15,30,38,.3)), url("/assets/reference-map-source.png"); background-size: cover; background-position: center; }
-.media-visual::after { content: ""; position: absolute; inset: 0; box-shadow: inset 0 0 35px rgba(12,25,32,.2); pointer-events: none; }
-.dock-camera, .dock-record { background-image: linear-gradient(rgba(18,35,40,.1), rgba(18,35,40,.32)), url("/assets/map-base-clean.png"); background-position: 45% 58%; }
-.aerial-camera, .aerial-1 { background-position: 68% 35%; }.aerial-2 { background-position: 34% 48%; }.aerial-3 { background-position: 78% 67%; }
-.media-visual > button { position: absolute; z-index: 2; top: 50%; left: 50%; width: 40px; height: 40px; display: grid; place-items: center; border: 1px solid rgba(255,255,255,.7); border-radius: 50%; color: #fff; background: rgba(23,42,54,.72); transform: translate(-50%, -50%); transition: .15s ease; }
-.media-visual > button:hover { background: rgba(31,111,235,.9); transform: translate(-50%, -50%) scale(1.06); }
-.media-visual > button svg { width: 16px; margin-left: 2px; }
-.media-visual > small, .media-duration, .live-corner { position: absolute; z-index: 2; padding: 4px 7px; border-radius: 3px; color: #fff; background: rgba(23,38,48,.78); font-size: 10px; }
-.media-visual > small { right: 8px; bottom: 8px; }.media-duration { right: 8px; bottom: 8px; }.live-corner { top: 8px; left: 8px; display: flex; align-items: center; gap: 5px; }
-.media-card-copy { min-height: 57px; padding: 9px 11px; display: flex; align-items: center; justify-content: space-between; gap: 10px; }
-.media-card-copy > span { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
-.media-card-copy .icon-button { width: 28px; height: 28px; min-width: 28px; }.media-card-copy .icon-button svg { width: 13px; }
-.original-video-toolbar { gap: 10px; }.original-video-toolbar > div:last-child { flex-shrink: 0; }
-.download-quota { min-width: 190px; height: 34px; padding: 0 8px 0 10px; display: grid !important; grid-template-columns: 1fr auto; grid-template-rows: 1fr 1fr; align-items: center; column-gap: 8px !important; border-left: 1px solid var(--line); border-right: 1px solid var(--line); }
-.download-quota span { align-self: end; color: #53626e; font-size: 10px; }.download-quota span b { color: #344651; font-weight: 600; }.download-quota small { align-self: start; color: #a05e24; font-size: 8px; }.download-quota button { grid-row: 1 / 3; grid-column: 2; height: 26px; padding: 0 7px; border-radius: 3px; color: var(--blue); background: #eaf2fc; font-size: 10px; }
-.task-dialog select { width: 100%; height: 38px; }
-
-.task-schedule-fields[hidden] { display: none; }.task-schedule-fields { margin-top: 2px; }
-.weekday-picker { height: 38px; padding: 3px; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 3px; border-radius: 4px; background: #edf1f4; }
-.weekday-picker button { min-width: 0; border-radius: 3px; color: #65737f; background: transparent; font-size: 11px; }.weekday-picker button:hover { color: #2869aa; }.weekday-picker button.active { color: #fff; background: #2c72bd; box-shadow: 0 1px 4px rgba(23,66,108,.18); }
-
-.task-dialog .task-schedule-settings { margin-bottom: 3px; }
-.task-dialog .task-schedule-settings > label:last-child { margin-bottom: 12px; }
-.task-dialog .task-schedule-settings label small { color: var(--muted); font-size: 10px; line-height: 1.4; }
-.task-dialog .task-schedule-settings input[type='text'] { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
-.task-video-settings { margin: 3px 0 12px; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
-.task-video-title { height: 35px; display: flex; align-items: center; justify-content: space-between; }.task-video-title strong { font-size: 12px; }.task-video-title span { color: var(--muted); font-size: 10px; }
-.add-dock-dialog .task-video-option { min-height: 48px; margin: 0; padding: 7px 2px; display: grid; grid-template-columns: 1fr 34px; align-items: center; gap: 10px; border-top: 1px solid #edf0f2; cursor: pointer; }
-.task-video-option > span { min-width: 0; display: flex; flex-direction: column; gap: 3px; }.task-video-option strong { color: #3c4d59; font-size: 11px; }.add-dock-dialog .task-video-option small { color: var(--muted); font-size: 10px; }
-.task-video-option input { position: absolute; opacity: 0; pointer-events: none; }.task-video-option > i { position: relative; width: 32px; height: 18px; border-radius: 9px; background: #c9d0d5; transition: background .16s ease; }.task-video-option > i::after { content: ""; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(20,36,45,.25); transition: transform .16s ease; }.task-video-option input:checked + i { background: #2d76c2; }.task-video-option input:checked + i::after { transform: translateX(14px); }
-.task-video-option.disabled { cursor: not-allowed; opacity: .55; }.task-video-option.disabled > i { background: #d8dde1; }
-.add-dock-dialog .task-video-note { margin: 7px 2px 10px; color: #a87527; font-size: 10px; line-height: 1.5; }
-.raw-download-dialog { width: min(500px, 100%); }.raw-download-content { padding: 18px 20px 4px; }.raw-download-file { min-height: 58px; padding: 9px 11px; display: flex; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: 4px; }.raw-download-file > span { width: 32px; height: 32px; display: grid; place-items: center; border-radius: 4px; color: #286aa9; background: #e7f0fa; }.raw-download-file svg { width: 15px; }.raw-download-file > div { min-width: 0; display: flex; flex-direction: column; gap: 4px; }.raw-download-file strong { overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }.raw-download-file small { color: var(--muted); font-size: 10px; }
-.raw-download-quota { margin-top: 14px; display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--line); border-radius: 4px; }.raw-download-quota > div { min-height: 55px; padding: 9px 11px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border-right: 1px solid var(--line); }.raw-download-quota > div:last-child { border-right: 0; }.raw-download-quota span { color: var(--muted); font-size: 10px; }.raw-download-quota strong { font-size: 12px; }.raw-download-content p { margin: 12px 0 0; color: #9a5d25; font-size: 10px; line-height: 1.6; }
-.raw-download-dialog > footer { height: 62px; margin-top: 14px; padding: 0 20px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); }.raw-download-dialog > footer button { min-width: 88px; }.raw-download-dialog > footer svg { width: 13px; }
-
-.device-detail-page { height: 100%; flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; background: #f1f4f6; pointer-events: auto; }
-.full-detail-header { min-height: 108px; padding: 12px 24px 16px; display: grid; grid-template-columns: 1fr auto; align-items: end; gap: 7px 16px; background: #fff; border-bottom: 1px solid var(--line); }.back-command { grid-column: 1 / 3; width: fit-content; height: 24px; padding: 0; display: flex; align-items: center; gap: 4px; color: var(--muted); background: transparent; font-size: 11px; }.back-command:hover { color: var(--blue); }.back-command svg { width: 12px; transform: rotate(180deg); }.full-detail-identity { min-width: 0; display: flex; align-items: center; gap: 11px; }.full-detail-identity > span { width: 40px; height: 40px; min-width: 40px; display: grid; place-items: center; border-radius: 5px; color: #226e55; background: #e5f3ed; }.full-detail-identity > span.drone { color: #246aa9; background: #e6eff9; }.full-detail-identity > span svg { width: 19px; }.full-detail-identity > div { min-width: 0; }.full-detail-identity small { color: var(--muted); font-size: 10px; }.full-detail-identity h1 { margin: 2px 0; overflow: hidden; font-size: 20px; text-overflow: ellipsis; white-space: nowrap; }.full-detail-identity p { margin: 0; color: var(--muted); font-size: 11px; }.full-detail-identity > i { margin-left: 4px; }.full-detail-actions { display: flex; align-items: center; gap: 8px; }.full-detail-actions svg { width: 14px; }
-.full-detail-actions [hidden] { display: none; }
-.full-detail-tabs { height: 48px; min-height: 48px; padding: 0 24px; display: flex; align-items: end; gap: 28px; background: #fff; border-bottom: 1px solid var(--line); }.full-detail-tabs button { position: relative; height: 47px; padding: 0 2px; color: var(--muted); background: transparent; font-size: 13px; }.full-detail-tabs button b { margin-left: 3px; color: var(--red); font-size: 10px; font-weight: 500; }.full-detail-tabs button.active { color: var(--blue); font-weight: 600; }.full-detail-tabs button.active::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; background: var(--blue); }
-.full-detail-content { flex: 1; min-height: 0; margin: 16px 24px 24px; overflow: auto; border: 1px solid var(--line); border-radius: 6px; background: #fff; }.full-tab-panel { display: none; min-height: 100%; }.full-tab-panel.active { display: block; }.device-detail-page:not(.drone-detail) .drone-full-only { display: none !important; }.device-detail-page.drone-detail .dock-full-only { display: none !important; }
-.detail-metric-band { min-height: 76px; padding: 0 8px; display: grid; grid-template-columns: repeat(6, 1fr); align-items: center; border-bottom: 1px solid var(--line); background: #fafbfc; }.detail-metric-band > div { height: 40px; padding: 0 16px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border-right: 1px solid var(--line); }.detail-metric-band > div:last-child { border-right: 0; }.detail-metric-band span { color: var(--muted); font-size: 10px; }.detail-metric-band strong { color: #34434f; font-size: 16px; font-weight: 600; }
-.detail-columns { display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(270px, .8fr); }.detail-main-column, .detail-side-column { min-width: 0; }.detail-side-column { border-left: 1px solid var(--line); }.data-section { padding: 18px 20px; border-bottom: 1px solid var(--line); }.data-section:last-child { border-bottom: 0; }.data-section h2 { margin: 0 0 14px; font-size: 13px; }.data-section-title { display: flex; align-items: center; justify-content: space-between; gap: 10px; }.data-section-title button { color: var(--blue); background: transparent; font-size: 11px; }
-.status-matrix { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }.status-matrix > div { position: relative; min-height: 54px; padding: 9px 24px 9px 32px; display: flex; flex-direction: column; justify-content: center; gap: 4px; border-radius: 4px; background: #f5f7f9; }.status-matrix svg { position: absolute; left: 9px; top: 10px; width: 15px; color: #657b8e; }.status-matrix span { color: var(--muted); font-size: 10px; }.status-matrix strong { color: #354550; font-size: 12px; }.status-matrix > div > i { position: absolute; right: 9px; top: 11px; width: 6px; height: 6px; border-radius: 50%; }.ok { background: var(--green); }
-.value-table { display: grid; grid-template-columns: repeat(3, 1fr); border-top: 1px solid var(--line); border-left: 1px solid var(--line); }.value-table > div { min-height: 54px; padding: 9px 12px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }.value-table span { color: var(--muted); font-size: 10px; }.value-table strong { color: #34434f; font-size: 12px; font-weight: 600; }
-.environment-values { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }.environment-values > div { min-height: 52px; padding: 9px 10px 9px 34px; position: relative; display: flex; flex-direction: column; justify-content: center; gap: 4px; border-radius: 4px; background: #f5f7f9; }.environment-values svg { position: absolute; left: 10px; width: 15px; color: #657b8e; }.environment-values span { color: var(--muted); font-size: 10px; }.environment-values strong { font-size: 12px; }
-.bound-asset-large { min-height: 52px; padding: 8px 9px; display: grid; grid-template-columns: 32px 1fr auto; align-items: center; gap: 8px; border: 1px solid var(--line); border-radius: 5px; }.bound-asset-large > span { width: 30px; height: 30px; display: grid; place-items: center; border-radius: 4px; color: #286aa9; background: #e7f0fa; }.bound-asset-large.dock > span { color: #226e55; background: #e5f3ed; }.bound-asset-large svg { width: 15px; }.bound-asset-large > div { min-width: 0; display: flex; flex-direction: column; gap: 3px; }.bound-asset-large strong { overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }.bound-asset-large small { color: var(--muted); font-size: 10px; }.detail-side-column dl { margin: 13px 0 0; }.detail-side-column dl > div, .compact-properties > div { min-height: 29px; display: grid; grid-template-columns: 88px 1fr; align-items: center; border-bottom: 1px solid #edf0f2; }.detail-side-column dt, .compact-properties dt { color: var(--muted); font-size: 10px; }.detail-side-column dd, .compact-properties dd { margin: 0; overflow: hidden; color: #3c4b57; font-size: 11px; text-align: right; text-overflow: ellipsis; white-space: nowrap; }
-.workflow-summary { display: grid; grid-template-columns: 30px 1fr auto; align-items: center; gap: 8px; }.workflow-icon { width: 30px; height: 30px; display: grid; place-items: center; border-radius: 4px; color: #226e55; background: #e5f3ed; }.workflow-icon svg { width: 14px; }.workflow-summary > div { display: flex; flex-direction: column; gap: 3px; }.workflow-summary strong { font-size: 12px; }.workflow-summary small { color: var(--muted); font-size: 10px; }.workflow-summary > i { color: var(--green); font-size: 10px; font-style: normal; }.workflow-steps { margin: 13px 0 0 10px; padding: 0 0 0 15px; border-left: 1px solid var(--line); list-style: none; }.workflow-steps li { position: relative; min-height: 25px; color: var(--muted); font-size: 10px; }.workflow-steps li::before { content: ""; position: absolute; left: -19px; top: 1px; width: 6px; height: 6px; border: 2px solid #fff; border-radius: 50%; background: #a1abb3; }.workflow-steps li.done::before { background: var(--green); }
-.mission-detail-row { display: flex; align-items: center; justify-content: space-between; }.mission-detail-row > div { display: flex; flex-direction: column; gap: 4px; }.mission-detail-row strong { font-size: 13px; }.mission-detail-row small { color: var(--muted); font-size: 10px; }.mission-detail-row > b { color: var(--blue); font-size: 12px; }.progress-track.wide { margin-top: 14px; }
-.state-groups, .diagnostics-layout { display: grid; grid-template-columns: 1fr 1fr; }.state-groups .data-section:nth-child(odd), .diagnostics-layout .data-section:nth-child(odd) { border-right: 1px solid var(--line); }.state-detail-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }.state-detail-grid > div { min-height: 68px; padding: 11px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 4px; }.state-detail-grid span { color: var(--muted); font-size: 10px; }.state-detail-grid strong { font-size: 12px; }.state-detail-grid small { color: #8a96a0; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 8px; }
-.record-header { height: 62px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }.record-header > div { display: flex; align-items: baseline; gap: 9px; }.record-header h2 { margin: 0; font-size: 14px; }.record-header span { color: var(--muted); font-size: 10px; }.record-header select { width: 132px; height: 32px; padding: 0 8px; border: 1px solid var(--line); border-radius: 4px; color: #536270; background: #fff; font-size: 11px; }.record-table { width: 100%; border-collapse: collapse; table-layout: fixed; }.record-table th { height: 40px; padding: 0 14px; color: var(--muted); background: #f7f8fa; font-size: 10px; font-weight: 500; text-align: left; }.record-table td { height: 54px; padding: 8px 14px; border-bottom: 1px solid var(--line); color: #455461; font-size: 11px; }.severity { padding: 3px 6px; border-radius: 3px; font-size: 10px; font-style: normal; }.severity.medium { color: #a0591e; background: #fff0e3; }.severity.low { color: #426785; background: #eaf1f6; }.result-success { color: var(--green); }
-.diagnostic-list { display: flex; flex-direction: column; border-top: 1px solid var(--line); }.diagnostic-list > div { min-height: 46px; display: grid; grid-template-columns: 1fr 70px 90px; align-items: center; gap: 8px; border-bottom: 1px solid var(--line); }.diagnostic-list span { display: flex; align-items: center; gap: 7px; color: #455461; font-size: 11px; }.diagnostic-list span i { width: 6px; height: 6px; border-radius: 50%; }.diagnostic-list span i.standby { background: #8d98a1; }.diagnostic-list strong { color: var(--green); font-size: 11px; font-weight: 500; }.diagnostic-list small { color: var(--muted); font-size: 10px; text-align: right; }
-.alarm-metrics { grid-template-columns: repeat(4, 1fr); }.alarm-workspace, .system-workspace { min-height: 0; overflow: hidden; }.alarm-layout { min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) 285px; }.alarm-list { min-width: 0; padding: 12px 16px; }.alarm-item { min-height: 76px; padding: 12px 10px; display: grid; grid-template-columns: 42px minmax(0, 1fr) 66px 48px; align-items: center; gap: 10px; border-bottom: 1px solid var(--line); }.alarm-item > div { min-width: 0; display: flex; flex-direction: column; gap: 5px; }.alarm-item strong { overflow: hidden; color: #344550; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }.alarm-item small { overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }.alarm-severity { width: fit-content; padding: 4px 6px; border-radius: 3px; font-size: 10px; }.alarm-item.critical .alarm-severity { color: #b33f43; background: #fdebec; }.alarm-item.medium .alarm-severity { color: #a25f21; background: #fff0df; }.alarm-item.low .alarm-severity { color: #496d88; background: #eaf1f6; }.alarm-handle { height: 26px; border: 1px solid #c6d9eb; border-radius: 3px; color: var(--blue); background: #f4f8fc; font-size: 10px; }.alarm-side-panel { border-left: 1px solid var(--line); background: #fafbfc; }.alarm-side-panel section { padding: 17px 16px; border-bottom: 1px solid var(--line); }.alarm-side-panel h2 { margin: 0 0 15px; font-size: 13px; }.alarm-bars { display: flex; flex-direction: column; gap: 13px; }.alarm-bars > div { display: grid; grid-template-columns: 62px 1fr 16px; align-items: center; gap: 8px; }.alarm-bars span, .alarm-bars strong { color: var(--muted); font-size: 10px; }.alarm-bars strong { color: #41515d; text-align: right; }.alarm-bars b { height: 6px; overflow: hidden; border-radius: 5px; background: #e8edf0; }.alarm-bars b i { display: block; width: var(--value); height: 100%; border-radius: inherit; background: #d46a6d; }.alarm-tip { margin: 0 0 14px; display: flex; align-items: flex-start; gap: 7px; color: #8b6329; font-size: 10px; line-height: 1.6; }.alarm-tip svg { width: 14px; min-width: 14px; color: #b17b2e; }.system-panel { display: none; min-height: 0; overflow: auto; }.system-panel.active { display: block; }.system-grid { display: grid; grid-template-columns: 1fr 1fr; }.settings-section { padding: 19px 20px; border-bottom: 1px solid var(--line); }.system-grid .settings-section:nth-child(odd) { border-right: 1px solid var(--line); }.settings-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; margin-bottom: 16px; }.settings-heading h2 { margin: 0 0 5px; font-size: 14px; }.settings-heading span { color: var(--muted); font-size: 10px; }.account-profile { min-height: 59px; padding: 10px; display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 9px; border: 1px solid var(--line); border-radius: 4px; }.account-profile > span, .member-avatar { width: 30px; height: 30px; display: grid; place-items: center; border-radius: 4px; color: #fff; background: #347fc0; font-size: 13px; }.account-profile > div, .member-list > div > div { min-width: 0; display: flex; flex-direction: column; gap: 4px; }.account-profile strong, .member-list strong { font-size: 12px; }.account-profile small, .member-list small { color: var(--muted); font-size: 10px; }.settings-list { margin-top: 12px; border-top: 1px solid var(--line); }.settings-list > div { min-height: 42px; display: grid; grid-template-columns: 82px 1fr auto; align-items: center; gap: 8px; border-bottom: 1px solid var(--line); }.settings-list span, .settings-list em { color: var(--muted); font-size: 10px; font-style: normal; }.settings-list strong { color: #40505c; font-size: 11px; font-weight: 500; }.settings-list button { color: var(--blue); background: transparent; font-size: 10px; }.member-list { display: flex; flex-direction: column; border-top: 1px solid var(--line); }.member-list > div { min-height: 54px; display: grid; grid-template-columns: 30px 1fr auto; align-items: center; gap: 9px; border-bottom: 1px solid var(--line); }.member-avatar.blue { background: #6d7dba; }.member-list > div > i { color: var(--muted); font-size: 10px; font-style: normal; }.notification-options { border-top: 1px solid var(--line); }.notification-options label { min-height: 65px; display: grid; grid-template-columns: 1fr 32px 100px; align-items: center; gap: 10px; border-bottom: 1px solid var(--line); }.notification-options label > span { display: flex; flex-direction: column; gap: 4px; }.notification-options strong { font-size: 12px; }.notification-options small, .notification-options em { color: var(--muted); font-size: 10px; font-style: normal; }.check-toggle { width: 30px; height: 17px; position: relative; border-radius: 9px; background: #c9d0d5; }.check-toggle::after { content: ""; position: absolute; top: 2px; left: 2px; width: 13px; height: 13px; border-radius: 50%; background: #fff; }.check-toggle.active { background: #347fc0; }.check-toggle.active::after { transform: translateX(13px); }.service-status-list { border-top: 1px solid var(--line); }.service-status-list > div { min-height: 46px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }.service-status-list span { display: flex; align-items: center; gap: 7px; color: #465762; font-size: 11px; }.service-status-list span i { width: 6px; height: 6px; border-radius: 50%; background: var(--green); }.service-status-list strong, .audit-table i { color: var(--green); font-size: 11px; font-weight: 500; }.audit-table { border-top: 1px solid var(--line); }.audit-table > div { min-height: 48px; display: grid; grid-template-columns: 130px 120px 1fr 45px; align-items: center; gap: 8px; border-bottom: 1px solid var(--line); }.audit-table span, .audit-table strong, .audit-table em, .audit-table i { font-size: 10px; font-style: normal; }.audit-table span, .audit-table em { color: var(--muted); }
-.account-metrics { grid-template-columns: repeat(5, 1fr); }.account-metrics > div:first-child strong { font-size: 16px; }.account-workspace { min-height: 0; overflow: auto; }.account-panel { display: none; }.account-panel.active { display: block; }.account-overview-grid { display: grid; grid-template-columns: 1fr 1fr; }.account-info-block { min-width: 0; padding: 20px; border-bottom: 1px solid var(--line); }.account-overview-grid .account-info-block:first-child { border-right: 1px solid var(--line); }.account-section-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 17px; }.account-section-heading h2 { margin: 0 0 5px; font-size: 14px; }.account-section-heading span { color: var(--muted); font-size: 10px; }.tenant-identity { min-height: 66px; padding: 11px; display: grid; grid-template-columns: 36px 1fr auto; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: 4px; }.tenant-identity > span { width: 32px; height: 32px; display: grid; place-items: center; border-radius: 4px; color: #fff; background: #2f78bb; font-size: 16px; font-weight: 600; }.tenant-identity > div { min-width: 0; display: flex; flex-direction: column; gap: 4px; }.tenant-identity strong { font-size: 12px; }.tenant-identity small { color: var(--muted); font-size: 10px; }.account-details { margin: 14px 0 0; border-top: 1px solid var(--line); }.account-details > div { min-height: 38px; display: grid; grid-template-columns: 82px 1fr; align-items: center; border-bottom: 1px solid var(--line); }.account-details dt { color: var(--muted); font-size: 10px; }.account-details dd { margin: 0; color: #3f505b; font-size: 11px; }.resource-progress { display: flex; flex-direction: column; gap: 17px; }.resource-progress > div > span { display: flex; justify-content: space-between; color: #52616d; font-size: 11px; }.resource-progress b { color: #344651; font-weight: 500; }.resource-progress i { display: block; height: 6px; margin-top: 7px; overflow: hidden; border-radius: 4px; background: #e7edf1; }.resource-progress em { display: block; height: 100%; border-radius: inherit; background: #3d82bd; }.account-buy-button { margin-top: 22px; }.resource-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }.resource-cards button { min-height: 88px; padding: 12px; display: flex; flex-direction: column; align-items: flex-start; gap: 6px; border: 1px solid var(--line); border-radius: 4px; color: #334651; background: #fff; text-align: left; }.resource-cards button:hover { border-color: #91b5d6; background: #f7fbff; }.resource-cards strong { font-size: 11px; }.resource-cards small { color: var(--muted); font-size: 10px; line-height: 1.4; }.resource-cards b { margin-top: auto; color: var(--blue); font-size: 10px; font-weight: 500; }.usage-table { border-top: 1px solid var(--line); }.usage-table > div { min-height: 48px; display: grid; grid-template-columns: 1fr 1.3fr 100px; align-items: center; gap: 10px; border-bottom: 1px solid var(--line); }.usage-table span, .usage-table em { color: var(--muted); font-size: 10px; font-style: normal; }.usage-table strong { color: #3f505b; font-size: 11px; font-weight: 500; }.usage-table em { text-align: right; }.billing-total { margin-top: 17px; padding: 13px 15px; display: flex; align-items: center; gap: 15px; border-radius: 4px; background: #f5f8fa; }.billing-total span, .billing-total small { color: var(--muted); font-size: 10px; }.billing-total strong { color: #2f6fa8; font-size: 20px; }.security-list { border-top: 1px solid var(--line); }.security-list button { width: 100%; min-height: 58px; padding: 0 4px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); text-align: left; }.security-list button span { display: flex; flex-direction: column; gap: 4px; }.security-list strong { font-size: 12px; }.security-list small { color: var(--muted); font-size: 10px; }.security-list b { color: var(--blue); font-size: 10px; font-weight: 500; }
-
-.modal-backdrop { position: fixed; z-index: 80; inset: 0; display: grid; place-items: center; padding: 20px; background: rgba(13,23,31,.48); opacity: 0; pointer-events: none; transition: opacity .18s ease; }
-.modal-backdrop.open { opacity: 1; pointer-events: auto; }
-.modal { width: min(390px, 100%); padding: 24px; border-radius: 7px; background: #fff; box-shadow: 0 22px 60px rgba(0,0,0,.23); transform: translateY(8px); transition: transform .18s ease; text-align: center; }
-.modal-backdrop.open .modal { transform: translateY(0); }
-.modal-icon { margin: 0 auto 12px; width: 42px; height: 42px; display: grid; place-items: center; border-radius: 50%; background: #fff2e3; color: #b6631b; }
-.modal h3 { margin: 0 0 8px; font-size: 19px; }.modal p { margin: 0; color: var(--muted); font-size: 13px; line-height: 1.7; }
-.safety-checks { margin-top: 16px; padding: 11px; display: flex; justify-content: space-between; gap: 6px; border-radius: 5px; background: var(--soft); }
-.safety-checks span { display: flex; align-items: center; gap: 4px; color: #52616e; font-size: 11px; }.safety-checks i { width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
-.modal-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; margin-top: 18px; }
-.modal-actions button { height: 38px; border-radius: 5px; font-size: 13px; }.modal-actions .cancel { background: #fff; border: 1px solid var(--line); }.modal-actions .confirm { color: #fff; background: var(--blue); }
-.dock-status-dialog { width: min(700px, calc(100vw - 32px)); padding: 0; overflow: hidden; text-align: left; }
-.dock-status-dialog .t-dialog__header { min-height: 58px; padding: 0 18px; border-bottom: 1px solid var(--line); }
-.dock-status-dialog .t-dialog__body { padding: 0; }
-.dock-status-header { min-height: 58px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); cursor: grab; }
-.dock-status-header:active { cursor: grabbing; }
-.dock-status-header > div { display: flex; flex-direction: column; gap: 4px; }.dock-status-header span { color: var(--muted); font-size: 10px; }.dock-status-header h3 { margin: 0; font-size: 18px; }
-.dock-status-body { padding: 13px 18px 15px; max-height: none; overflow: visible; }
-.dock-status-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }.dock-status-grid > div { min-height: 58px; padding: 8px 9px; display: flex; flex-direction: column; gap: 4px; border: 1px solid var(--line); border-radius: 4px; background: #f7f9fb; }.dock-status-grid span, .dock-status-grid small, .dock-status-list span { color: var(--muted); font-size: 10px; }.dock-status-grid strong { color: #344651; font-size: 12px; }.dock-status-grid small { margin-top: auto; }.dock-status-section { margin-top: 11px; padding-top: 10px; border-top: 1px solid var(--line); }.dock-status-section h4 { margin: 0 0 8px; font-size: 12px; }.dock-status-environment { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }.dock-status-environment span { color: var(--muted); font-size: 10px; }.dock-status-environment b { display: block; margin-top: 3px; color: #3f505b; font-size: 11px; font-weight: 500; }.dock-status-list { border-top: 1px solid var(--line); }.dock-status-list > div { min-height: 34px; display: grid; grid-template-columns: 100px 1fr; align-items: center; border-bottom: 1px solid var(--line); }.dock-status-list b { color: #3f505b; font-size: 11px; font-weight: 500; }
-.dock-process-track { display: grid; grid-template-columns: repeat(8, 1fr); gap: 0; padding: 4px 0 1px; }.dock-process-track > div { position: relative; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 3px; color: var(--muted); text-align: center; }.dock-process-track > div:not(:last-child)::after { content: ""; position: absolute; top: 5px; left: 50%; width: 100%; height: 1px; background: #d7e0e6; }.dock-process-track i { position: relative; z-index: 1; width: 9px; height: 9px; border: 2px solid #c4d0d8; border-radius: 50%; background: #fff; }.dock-process-track span { font-size: 8px; line-height: 1.2; white-space: nowrap; }.dock-process-track small { font-size: 7px; }.dock-process-track .active { color: var(--blue); }.dock-process-track .active i { border-color: var(--blue); background: var(--blue); box-shadow: 0 0 0 2px #e8f1fb; }.dock-process-track .active::after { background: #a9c7e3; }
-.dock-status-grid.compact > div { min-height: 50px; }
-.dock-state-section { margin: 0; }.dock-state-heading { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }.dock-state-heading h4 { margin: 0; font-size: 12px; }.dock-state-heading span { color: var(--muted); font-size: 8px; }.dock-state-board { display: grid; grid-template-columns: repeat(4, 1fr); gap: 9px; }.dock-state-board article { min-height: 112px; padding: 10px 11px; border: 1px solid #e4eaf0; border-radius: 8px; background: #f7f9fb; }.dock-state-board h5 { margin: 0 0 8px; color: #2f7fb9; font-size: 12px; font-weight: 600; }.dock-state-board ul { margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; list-style: none; }.dock-state-board li { display: flex; align-items: center; gap: 6px; color: #82909b; font-size: 10px; line-height: 1.2; }.dock-state-board li i { width: 7px; height: 7px; flex: 0 0 7px; border-radius: 50%; background: #cbd5dd; }.dock-state-board li.active { color: #486271; }.dock-state-board li.active i { background: #36a477; box-shadow: 0 0 0 2px #e3f3ed; }.dock-state-board li i.warning { background: #dda44a; box-shadow: 0 0 0 2px #fff1dc; }.dock-status-summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }.dock-status-summary span { display: flex; flex-direction: column; gap: 4px; color: var(--muted); font-size: 10px; }.dock-status-summary b { color: #405460; font-size: 11px; font-weight: 500; }
-.dock-state-board .flow-status-list { display: grid; grid-template-columns: 1fr 1fr; column-gap: 10px; row-gap: 6px; }.dock-state-board .flow-status-list li { white-space: nowrap; }
-.device-detail-state-board { margin-top: 12px; }.device-detail-state-board article { background: #f5f7f9; }.detail-status-note { color: var(--muted); font-size: 10px; }
-@media (max-width: 560px) {
- .dock-state-board { grid-template-columns: repeat(2, 1fr); }
- .dock-status-summary { grid-template-columns: repeat(2, 1fr); row-gap: 9px; }
- .dock-status-dialog { width: min(520px, calc(100vw - 20px)); }
- .dock-status-body { max-height: calc(100vh - 96px); overflow: auto; }
- .dock-process-track { grid-template-columns: repeat(2, 1fr); row-gap: 12px; }
- .dock-process-track > div:nth-child(2n)::after { display: none; }
- .dock-status-grid { grid-template-columns: repeat(2, 1fr); }
- .dock-status-environment { grid-template-columns: repeat(2, 1fr); }
-}
-.add-dock-dialog { width: min(520px, 100%); padding: 0; overflow: hidden; text-align: left; }.add-dock-dialog > header { height: 68px; padding: 0 20px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }.add-dock-dialog > header > div { display: flex; flex-direction: column; gap: 3px; }.add-dock-dialog > header span { color: var(--muted); font-size: 10px; }.add-dock-dialog > header h3 { margin: 0; font-size: 18px; }.add-dock-dialog form { padding: 18px 20px 0; }.add-dock-dialog label { display: flex; flex-direction: column; gap: 6px; margin-bottom: 15px; }.add-dock-dialog label > span { color: #485764; font-size: 12px; }.add-dock-dialog label b { color: var(--red); font-weight: 500; }.add-dock-dialog label em { margin-left: 4px; color: #8a96a0; font-size: 10px; font-style: normal; }.add-dock-dialog input { width: 100%; height: 38px; padding: 0 10px; border: 1px solid var(--line); border-radius: 5px; outline: 0; color: var(--ink); background: #fff; font-size: 12px; }.add-dock-dialog input:focus { border-color: #6799d1; box-shadow: 0 0 0 3px rgba(31,111,235,.08); }.add-dock-dialog input[readonly] { color: #77838d; background: #f2f4f6; cursor: not-allowed; }.add-dock-dialog input.invalid { border-color: var(--red); }.add-dock-dialog label small { min-height: 0; color: var(--red); font-size: 10px; }.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }.form-error { min-height: 28px; padding-top: 7px; color: var(--red); font-size: 11px; }.add-dock-dialog form > footer { height: 62px; margin: 0 -20px; padding: 0 20px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); }.add-dock-dialog form > footer button { min-width: 82px; }
-.t-dialog.add-dock-dialog { padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl); overflow: visible; transform: none; box-shadow: none; }
-.t-dialog.add-dock-dialog form { padding: 0; }
-.t-dialog.add-dock-dialog .t-dialog__footer button + button { margin-left: 8px; }
-.t-dialog.firmware-dialog { padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl); overflow: visible; transform: none; box-shadow: none; }
-.t-dialog.firmware-dialog .firmware-content { padding: 0; }
-.t-dialog.firmware-dialog .firmware-footer { height: auto; margin: 0; padding: 0; border-top: 0; }
-.t-dialog.firmware-dialog .t-dialog__footer button + button { margin-left: 8px; }
-
-.route-upload-dialog select { width: 100%; height: 38px; padding: 0 10px; border: 1px solid var(--line); border-radius: 5px; outline: 0; color: var(--ink); background: #fff; font-size: 12px; }.add-dock-dialog .route-upload-note { margin: -4px 0 0; color: #778590; font-size: 10px; line-height: 1.6; }
-.firmware-dialog { width: min(500px, calc(100vw - 32px)); padding: 0; overflow: hidden; text-align: left; }.firmware-content { padding: 18px 20px 8px; }.firmware-device { min-height: 54px; padding: 9px 10px; display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 9px; border: 1px solid var(--line); border-radius: 5px; background: #f7f9fb; }.firmware-device > div { min-width: 0; display: flex; flex-direction: column; gap: 4px; }.firmware-device strong { font-size: 12px; }.firmware-device small { color: var(--muted); font-size: 10px; }.firmware-content label { display: flex; flex-direction: column; gap: 6px; margin-top: 16px; }.firmware-content label > span { color: #485764; font-size: 12px; }.firmware-content select { width: 100%; height: 38px; padding: 0 10px; border: 1px solid var(--line); border-radius: 5px; color: var(--ink); background: #fff; font-size: 12px; }.firmware-checks { margin-top: 15px; padding: 10px; display: flex; justify-content: space-between; gap: 8px; border-radius: 4px; background: #f5f8fa; }.firmware-checks span { display: flex; align-items: center; gap: 5px; color: #52616e; font-size: 10px; }.firmware-checks i { width: 6px; height: 6px; border-radius: 50%; background: var(--green); }.firmware-note { margin: 13px 0 0; color: #7b8791; font-size: 10px; line-height: 1.6; }.firmware-footer { height: 62px; padding: 0 20px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); }.firmware-footer button { min-width: 82px; }
-.toast { position: fixed; z-index: 100; top: 78px; left: 50%; min-width: 180px; height: 42px; padding: 0 18px; display: flex; align-items: center; justify-content: center; gap: 9px; border-radius: 5px; background: #fff; box-shadow: var(--shadow); transform: translate(-50%, -18px); opacity: 0; pointer-events: none; transition: .22s ease; }
-.toast.show { transform: translate(-50%, 0); opacity: 1; }.toast span { width: 8px; height: 8px; border-radius: 50%; background: var(--green); }.toast strong { font-size: 13px; }
-
-@media (max-width: 1260px) {
- .monitor-layout { grid-template-columns: 0 minmax(0, 1fr) 0; }
- .monitor-layout.focused { grid-template-columns: 248px minmax(330px, 1fr) 320px; }
- .device-panel { width: 248px; }
- .detail-panel { width: 320px; }
- .asset-overview { grid-template-columns: repeat(5, 1fr); min-height: 74px; }
-}
-@media (max-width: 820px) {
- .login-page { display: block; }.login-visual { display: none; }.login-form-side { width: 100%; min-height: 100vh; padding: 28px 22px; background: #f3f6f9; }.login-form-wrap { width: min(360px, 100%); padding: 32px 24px 28px; }
-}
-@media (max-width: 1020px) {
- .sidebar { position: fixed; left: -208px; transition: left .2s ease; box-shadow: var(--shadow); }
- .sidebar.open { left: 0; }
- .mobile-menu { position: fixed; z-index: 25; top: 12px; left: 12px; display: inline-flex; color: #fff; background: rgba(26,43,54,.76); }
- .monitor-layout.focused { grid-template-columns: 225px minmax(280px, 1fr) 300px; }
- .device-panel { width: 225px; }
- .detail-panel { width: 300px; }
- .device-page { padding: 18px; }
- .asset-toolbar { align-items: stretch; flex-direction: column; }
- .asset-search { width: 100%; }
- .toolbar-group { justify-content: flex-end; }
-
- .operation-page { padding: 18px; }
- .business-metric-band { min-width: 760px; }
- .task-metrics { overflow-x: auto; }
- .route-grid { grid-template-columns: repeat(2, minmax(220px, 1fr)); }
- .media-workspace { min-width: 680px; }
- .operation-page { overflow-x: auto; }
- .detail-metric-band { grid-template-columns: repeat(3, 1fr); padding: 8px; }
- .detail-metric-band > div:nth-child(3) { border-right: 0; }
- .detail-columns { grid-template-columns: 1fr; }
- .detail-side-column { border-top: 1px solid var(--line); border-left: 0; }
- .record-table { min-width: 760px; }
-}
-@media (max-width: 760px) {
- .topbar { height: 56px; min-height: 56px; padding: 0 10px; }
- .breadcrumb span, .breadcrumb svg, .profile div, .profile > svg { display: none; }
- .sidebar-profile div { display: flex; }
- .sidebar-profile > svg { display: block; }
- .monitor-layout, .monitor-layout.focused { display: grid; grid-template-columns: 0 minmax(0, 1fr) 0; overflow: hidden; }
- .device-panel { display: none; }
- .map-panel { min-height: 390px; }
- .detail-panel { position: absolute; right: 0; top: 0; bottom: 0; width: min(360px, 94vw); box-shadow: -8px 0 24px rgba(21,33,43,.16); }
- .detail-header { min-height: 78px; }
- .map-legend { max-width: calc(100% - 28px); overflow-x: auto; }
- .device-page { padding: 12px; gap: 12px; }
- .device-page-header h1 { font-size: 20px; }
- .device-page-header > div:first-child span { display: none; }
- .asset-overview { min-width: 620px; }
- .device-page { overflow-x: auto; }
- .asset-workspace { min-width: 680px; }
- .device-drawer { position: fixed; top: 56px; width: min(408px, 94vw); }
- .drawer-scrim { position: fixed; top: 56px; }
- .form-row { grid-template-columns: 1fr; gap: 0; }
- .operation-page { padding: 12px; gap: 12px; }
- .operation-page-header h1 { font-size: 20px; }
- .operation-page-header > div span { display: none; }
- .business-workspace { min-width: 680px; }
-
- .route-grid { grid-template-columns: repeat(2, minmax(240px, 1fr)); }
- .live-media-grid, .media-grid { grid-template-columns: repeat(2, minmax(260px, 1fr)); }
- .full-detail-header { padding: 10px 14px 14px; grid-template-columns: minmax(0, 1fr) auto; }
-
- .full-detail-tabs { padding: 0 14px; gap: 22px; overflow-x: auto; align-items: end; }
- .full-detail-tabs button { flex: 0 0 auto; }
- .full-detail-content { margin: 10px; }
- .detail-metric-band > div { padding: 0 10px; }
- .state-groups, .diagnostics-layout { grid-template-columns: 1fr; }
- .state-groups .data-section:nth-child(odd), .diagnostics-layout .data-section:nth-child(odd) { border-right: 0; }
- .status-matrix, .environment-values { grid-template-columns: repeat(2, 1fr); }
- .record-header { min-width: 680px; }
-}
-
-/* Keep login field labels readable against the compact form controls. */
-.login-form-wrap form > label > span,
-.login-form-row > label > span {
- margin-bottom: 10px;
- color: #3f515d;
- font-size: 13px;
- font-weight: 500;
- line-height: 1.35;
+.route-library-view[hidden], .route-editor[hidden]{ display: none !important; }
+.route-editor{ height: 100%; min-height: 520px; display: flex; flex-direction: column; background: #fff; }
+.route-editor-header{ height: 58px; min-height: 58px; padding: 0 14px; display: grid; grid-template-columns: 150px 1fr auto; align-items: center; gap: 12px; border-bottom: 1px solid var(--line); }
+.route-editor-header .back-command{ grid-column: auto; }
+.route-editor-header > div:nth-child(2){ min-width: 0; display: flex; align-items: baseline; gap: 9px; }
+.route-editor-header > div:nth-child(2) strong{ font-size: 14px; }
+.route-editor-header > div:nth-child(2) span{ color: var(--muted); font-size: 10px; }
+.route-editor-header > div:last-child{ display: flex; align-items: center; gap: 7px; }
+.route-editor-header button{ display: inline-flex; align-items: center; gap: 5px; }
+.route-editor-header button svg{ width: 12px; }
+.route-editor-header button:disabled{ color: #a6afb6; background: #f1f3f4; cursor: not-allowed; }
+.route-editor-body{ flex: 1; min-height: 0; display: grid; grid-template-columns: 290px minmax(480px, 1fr); }
+.route-config-panel{ min-height: 0; padding: 15px; display: flex; flex-direction: column; border-right: 1px solid var(--line); background: #fff; }
+.route-config-panel label{ margin-bottom: 13px; display: flex; flex-direction: column; gap: 6px; }
+.route-config-panel label > span{ color: #4d5d69; font-size: 11px; }
+.route-config-panel label > span b{ color: var(--red); }
+.route-config-panel input:not(.t-input__inner),
+.route-config-panel select{ width: 100%; height: 35px; padding: 0 9px; border: 1px solid var(--line); border-radius: 4px; outline: 0; color: #354550; background: #fff; font-size: 11px; }
+.route-config-panel input:not(.t-input__inner):focus,
+.route-config-panel select:focus{ border-color: #6799d1; box-shadow: 0 0 0 3px rgba(31,111,235,.07); }
+.route-config-panel .t-input,
+.route-config-panel .t-input-number .t-input{
+ width: 100%;
+ height: 35px;
+ min-height: 35px;
+ padding: 0 9px;
+ border: 1px solid var(--line);
+ border-radius: 4px;
+ color: #354550;
+ background: #fff;
+ font-size: 11px;
+ line-height: 33px;
+ box-shadow: none;
}
-
-#loginForm .login-method-fields > label,
-#loginForm > label {
- margin-bottom: 26px;
+.route-config-panel .t-input:hover,
+.route-config-panel .t-input.t-input--focused,
+.route-config-panel .t-input:focus,
+.route-config-panel .t-input-number .t-input:hover,
+.route-config-panel .t-input-number .t-input.t-input--focused{
+ border-color: #6799d1;
+ box-shadow: 0 0 0 3px rgba(31,111,235,.07);
}
-
-#loginForm > label {
- margin-bottom: 10px;
+.route-config-panel .t-input__inner{
+ height: auto;
+ min-height: 0;
+ padding: 0;
+ border: 0;
+ border-radius: 0;
+ color: inherit;
+ background: transparent;
+ font-size: 11px;
+ line-height: inherit;
+ box-shadow: none;
}
-
-#loginForm .login-method-fields {
- display: flex;
- flex-direction: column;
- gap: 16px;
- margin-bottom: 14px;
+.route-config-panel .t-input-number{
+ width: 100%;
+ vertical-align: top;
}
-
-#loginForm .login-method-fields[hidden] {
- display: none;
-}
-
-#loginForm .login-method-fields > label {
- margin-bottom: 0;
+.number-input{ position: relative; }
+.number-input input:not(.t-input__inner){ padding-right: 30px; }
+.number-input .t-input{ padding-right: 30px; }
+.number-input em{ position: absolute; top: 50%; right: 10px; z-index: 2; color: var(--muted); font-size: 11px; font-style: normal; pointer-events: none; transform: translateY(-50%); }
+.route-default-title{ min-height: 31px; padding-top: 3px; display: flex; align-items: center; border-top: 1px solid var(--line); }
+.route-default-title strong{ font-size: 11px; }
+.route-default-row{ display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
+.route-default-row label{ min-width: 0; }
+.route-default-row .number-input input:not(.t-input__inner),
+.route-default-row .number-input .t-input{ padding-right: 34px; }
+.route-config-panel .apply-all-waypoints.t-button,
+.apply-all-waypoints{
+ width: 100%;
+ height: 33px;
+ min-height: 33px;
+ margin: -3px 0 12px;
+ padding: 0 12px;
+ display: inline-flex;
+ flex-shrink: 0;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+ overflow: visible;
+ border: 1px solid #b8c7d4;
+ border-radius: 4px;
+ color: #2d669f;
+ background: #f6f9fc;
+ font-size: 11px;
+ line-height: 1;
+ font-weight: 400;
}
-
-/* Registration keeps the form focused and aligns the agreement control inline. */
-#registerPanel .login-form-heading > span,
-#registerPanel .login-form-heading > p {
- display: none;
+.route-config-panel .apply-all-waypoints.t-button:hover,
+.apply-all-waypoints:hover{
+ border-color: #78a1c9;
+ color: #2d669f;
+ background: #edf4fb;
}
-
-#registerPanel .login-form-heading h2 {
- margin: 0 0 24px;
+.route-config-panel .apply-all-waypoints.t-button.t-is-disabled,
+.apply-all-waypoints:disabled,
+.apply-all-waypoints.t-is-disabled{
+ border-color: #d0d7de;
+ color: #8a9aab;
+ background: #f1f3f4;
+ cursor: not-allowed;
}
-
-#registerPanel #registerForm .register-agreement {
- display: flex;
+.route-config-panel .apply-all-waypoints .t-button__text{
+ display: inline-flex;
align-items: center;
- gap: 7px;
- margin-bottom: 17px;
+ gap: 6px;
font-size: 11px;
- line-height: 1.5;
}
-
-#registerPanel #registerForm .register-agreement > span {
- width: 14px;
- height: 14px;
- min-width: 14px;
- margin: 0;
- font-size: 0;
- line-height: 1;
-}
-
-#registerPanel #registerForm .login-form-row {
- margin-bottom: 17px;
+.apply-all-waypoints svg{ width: 12px; height: 12px; flex-shrink: 0; }
+.waypoint-heading{ height: 34px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--line); }
+.waypoint-heading strong{ font-size: 12px; }
+.waypoint-heading span{ min-width: 20px; padding: 2px 6px; border-radius: 8px; color: #346caa; background: #e8f1fb; font-size: 10px; text-align: center; }
+.waypoint-list{ flex: 1; min-height: 110px; overflow: auto; border-top: 1px solid var(--line); }
+.waypoint-empty{ height: 70px; display: grid; place-items: center; color: #929da6; font-size: 11px; }
+.waypoint-item{ min-height: 55px; padding: 7px 2px; display: grid; grid-template-columns: 24px 1fr 50px; align-items: center; gap: 7px; border-bottom: 1px solid #edf0f2; cursor: pointer; }
+.waypoint-item:hover{ background: #f7faff; }
+.waypoint-item > b{ width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; color: #fff; background: var(--blue); font-size: 10px; }
+.waypoint-item:first-child > b{ background: var(--green); }
+.waypoint-item:last-child > b{ background: #c56c28; }
+.waypoint-item:only-child > b{ background: var(--green); }
+.waypoint-item > span{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.waypoint-item strong{ font-size: 11px; }
+.waypoint-item small{ overflow: hidden; color: var(--muted); font-size: 8px; text-overflow: ellipsis; white-space: nowrap; }
+.waypoint-item small:last-child{ color: #536a7c; }
+.waypoint-item-actions{ display: flex; align-items: center; }
+.waypoint-item-actions button{ width: 23px; height: 23px; display: grid; place-items: center; border-radius: 3px; color: #788792; background: transparent; }
+.waypoint-item-actions button:hover{ color: var(--blue); background: #eaf2fc; }
+.waypoint-item-actions button:last-child:hover{ color: var(--red); background: #fff0f0; }
+.waypoint-item-actions button svg{ width: 11px; }
+.route-form-error{ min-height: 25px; padding-top: 8px; color: var(--red); font-size: 10px; }
+.route-planner-map{ position: relative; min-width: 0; min-height: 430px; overflow: hidden; background: #75887a; cursor: crosshair; isolation: isolate; }
+.route-planner-map > #map, .route-planner-map > .mapboxgl-map{
+ position: absolute !important;
+ inset: 0;
+ width: 100% !important;
+ height: 100% !important;
+ z-index: 0;
}
-
-.control-page { height: 100%; min-height: 0; overflow: auto; background: #f3f6f8; pointer-events: auto; }
-.control-page-header { padding: 18px 24px; background: #fff; border-bottom: 1px solid var(--line); }
-.control-page-header h1 { margin: 0 0 5px; font-size: 22px; }
-.control-workspace { min-height: calc(100vh - 76px); display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 14px; padding: 14px; }
-.control-device-list, .control-main { min-width: 0; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
-.control-list-heading { min-height: 62px; padding: 0 15px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
-.control-list-heading h2, .control-selected-header h2 { margin: 0 0 4px; font-size: 17px; }
-.control-list-heading span, .control-selected-header p { color: var(--muted); font-size: 11px; }
-.control-device-items { padding: 8px; }
-.control-device-item { width: 100%; min-height: 70px; padding: 10px 8px; display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; align-items: center; gap: 8px; border-bottom: 1px solid #edf0f2; color: var(--ink); background: transparent; text-align: left; }
-.control-device-item:last-child { border-bottom: 0; }
-.control-device-item:hover, .control-device-item.active { background: #f2f7fc; }
-.control-device-item.active { box-shadow: inset 3px 0 0 var(--blue); }
-.control-device-icon { width: 28px; height: 28px; display: grid; place-items: center; border-radius: 4px; color: #3478b8; background: #e8f1f8; }
-.control-device-icon svg { width: 15px; }
-.control-device-item strong, .control-device-item small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-.control-device-item strong { font-size: 12px; }
-.control-device-item small { margin-top: 4px; color: var(--muted); font-size: 10px; }
-.control-device-item .status { font-size: 10px; }
-.control-main { overflow: hidden; }
-.control-selected-header { min-height: 86px; padding: 17px 20px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
-.control-status-band { min-height: 70px; display: grid; grid-template-columns: repeat(5, 1fr); border-bottom: 1px solid var(--line); background: #f7f9fa; }
-.control-status-band > div { padding: 14px 16px; border-right: 1px solid var(--line); }
-.control-status-band > div:last-child { border-right: 0; }
-.control-status-band span, .control-status-band strong { display: block; }
-.control-status-band span { color: var(--muted); font-size: 10px; }
-.control-status-band strong { margin-top: 6px; color: #344651; font-size: 12px; font-weight: 500; }
-.control-alert-section { padding: 15px 20px; border-bottom: 1px solid var(--line); }
-.control-alert-content { min-height: 52px; padding: 10px 12px; display: flex; align-items: center; gap: 10px; border: 1px solid #d9ebe3; border-radius: 5px; background: #f5fbf8; }
-.control-alert-content.alarm { border-color: #f0d6d7; background: #fff7f7; }
-.control-alert-content.offline { border-color: #e2e5e7; background: #f7f8f9; }
-.control-alert-icon { width: 25px; height: 25px; min-width: 25px; display: grid; place-items: center; border-radius: 50%; color: var(--red); background: #fbe3e4; }
-.control-alert-icon.ok { color: var(--green); background: #dff3e9; }
-.control-alert-icon svg { width: 13px; }
-.control-alert-content > div { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
-.control-alert-content strong { color: #49545d; font-size: 12px; }
-.control-alert-content small { color: var(--muted); font-size: 10px; }
-.control-alert-content.alarm strong { color: #a53e45; }
-
-.control-section { padding: 18px 20px; border-bottom: 1px solid var(--line); }
-.control-section .data-section-title { margin-bottom: 14px; }
-.control-section .data-section-title span { color: var(--muted); font-size: 10px; }
-.control-command-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px; }
-.control-command { min-height: 58px; padding: 10px 12px; display: flex; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: 5px; color: #344651; background: #fff; text-align: left; }
-.control-command:hover { border-color: #8fb7d6; background: #f5faff; }
-.control-command.primary, .control-command.landing { color: #fff; border-color: transparent; background: var(--blue); }
-.control-command.landing { background: #1d7468; }
-.control-command.danger { color: #a53e45; }
-.control-command > svg { width: 18px; }
-.control-command > b { width: 23px; height: 23px; display: grid; place-items: center; border-radius: 3px; color: #3478b8; background: #eaf2f8; font-size: 10px; font-weight: 500; }
-.control-command span { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
-.control-command strong { font-size: 12px; }
-.control-command small { color: #7b8992; font-size: 10px; }
-.control-command.primary small, .control-command.landing small { color: rgba(255,255,255,.78); }
-.control-command-grid.compact { grid-template-columns: repeat(3, minmax(0, 1fr)); }
-.control-note { display: flex; align-items: flex-start; gap: 10px; border-bottom: 0; background: #fbfcfd; }
-.control-note > svg { width: 17px; color: #5e88ab; }
-.control-note span { display: flex; flex-direction: column; gap: 4px; }
-.control-note strong { font-size: 11px; }
-.control-note small { color: var(--muted); font-size: 10px; line-height: 1.5; }
-.more-control-action { width: 100%; min-height: 36px; margin-top: 8px; padding: 0 10px; display: flex; align-items: center; gap: 7px; border: 1px solid #dbe4ea; border-radius: 4px; color: #4f6471; background: #fff; font-size: 11px; }
-.more-control-action:hover { color: var(--blue); border-color: #9ebed8; background: #f7fbff; }
-.more-control-action.expanded { color: var(--blue); border-color: #9ebed8; background: #f7fbff; }
-.more-control-action.expanded svg:last-child { transform: rotate(90deg); }
-.control-mode-toggle { display: inline-flex; align-items: center; gap: 3px; padding: 0; color: var(--blue); background: transparent; font-size: 10px; }
-.control-mode-toggle:hover { color: var(--blue-dark); }
-.control-mode-toggle svg { width: 12px; }
-.control-mode-toggle.expanded svg { transform: rotate(180deg); }
-.more-control-action svg:last-child { margin-left: auto; width: 13px; }
-.drone-advanced-actions { display: grid; grid-template-columns: repeat(2, 1fr); gap: 7px; margin-top: 7px; }
-.drone-advanced-actions button { min-height: 34px; padding: 0 9px; display: flex; align-items: center; gap: 6px; border: 1px solid var(--line); border-radius: 4px; color: #50616d; background: #fff; font-size: 11px; text-align: left; }
-.drone-advanced-actions button:hover { color: var(--blue); border-color: #9ebed8; background: #f7fbff; }
-.drone-advanced-actions svg { width: 13px; }
-.dock-control-extra { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--line); }
-.dock-control-info { display: grid; grid-template-columns: repeat(4, 1fr); margin-bottom: 10px; border: 1px solid var(--line); border-radius: 5px; background: #f7f9fa; }
-.dock-control-info > div { min-width: 0; padding: 10px; border-right: 1px solid var(--line); }
-.dock-control-info > div:last-child { border-right: 0; }
-.dock-control-info span, .dock-control-info strong { display: block; }
-.dock-control-info span { color: var(--muted); font-size: 10px; }
-.dock-control-info strong { margin-top: 5px; overflow: hidden; color: #40515d; font-size: 11px; font-weight: 500; text-overflow: ellipsis; white-space: nowrap; }
-.dock-control-extra-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
-.quick-actions.all-controls .workflow-actions,
-.quick-actions.all-controls .stage-actions,
-.quick-actions.all-controls .reset-action { display: none; }
-.quick-actions.all-controls .dock-control-extra-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
-.quick-actions.all-controls .dock-control-extra-grid button { min-height: 42px; padding: 6px 8px; }
-.drone-quick-actions .secondary-actions { grid-template-columns: repeat(3, 1fr); }
-.drone-quick-actions.all-controls .primary-action,
-.drone-quick-actions.all-controls .secondary-actions { display: none; }
-.drone-control-all button.danger { color: #a53e45; border-color: #e3b4b7; }
-.drone-control-all button.danger:hover { color: #8f2f36; border-color: #d18a8e; background: #fff5f5; }
-.drone-control-all { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 7px; margin-top: 8px; }
-.drone-control-all[hidden] { display: none !important; }
-.drone-control-all button { min-height: 42px; padding: 6px 8px; display: flex; align-items: center; gap: 6px; border: 1px solid var(--line); border-radius: 4px; color: #4c5f6b; background: #fff; font-size: 10px; }
-.drone-control-all button:hover { color: var(--blue); border-color: #91b5d6; background: #f7fbff; }
-.drone-control-all button > span { display: flex; flex-direction: column; gap: 3px; }
-.drone-control-all button strong { font-size: 11px; font-weight: 500; }
-.drone-control-all button small { color: var(--muted); font-size: 8px; }
-.dock-control-extra-grid button { min-height: 45px; padding: 7px 10px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 4px; color: #4c5f6b; background: #fff; font-size: 11px; }
-.dock-control-extra-grid button:hover { color: var(--blue); border-color: #91b5d6; background: #f7fbff; }
-.dock-control-extra-grid svg { width: 14px; }
-.dock-control-extra-grid button > span { display: flex; flex-direction: column; gap: 3px; }
-.dock-control-extra-grid button strong { font-size: 11px; font-weight: 500; }
-.dock-control-extra-grid button small { color: var(--muted); font-size: 8px; }
+.route-map-status, .route-map-legend{ position: absolute; z-index: 5; display: flex; align-items: center; border-radius: 4px; background: rgba(255,255,255,.94); box-shadow: 0 3px 12px rgba(20,36,45,.13); color: #52616d; font-size: 10px; pointer-events: none; }
+.route-map-status{ top: 12px; right: 12px; height: 30px; padding: 0 9px; gap: 13px; }
+.route-map-status span{ display: flex; align-items: center; gap: 5px; }
+.route-map-status i{ width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
+.route-map-legend{ right: 12px; bottom: 12px; height: 31px; padding: 0 10px; gap: 11px; }
+.route-map-legend span{ display: flex; align-items: center; gap: 4px; }
+.route-map-legend i{ width: 7px; height: 7px; border: 2px solid #fff; border-radius: 50%; background: var(--blue); box-shadow: 0 0 0 1px #7e8c97; }
+.route-map-legend i.start{ background: var(--green); }
+.route-map-legend i.end{ background: #c56c28; }
+.waypoint-dialog{ width: min(540px, 100%); }
+.waypoint-id-row{ min-height: 42px; margin-bottom: 14px; padding: 0 12px; display: flex; align-items: center; justify-content: space-between; border-radius: 4px; background: #f4f6f8; }
+.waypoint-id-row span{ color: var(--muted); font-size: 11px; }
+.waypoint-id-row strong{ font-size: 14px; }
+.waypoint-dialog .number-input input{ padding-right: 38px; }
+.task-replay-page{ position: relative; height: 100%; flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; background: transparent; pointer-events: none; }
+.replay-header{ min-height: 88px; padding: 10px 20px 13px; display: grid; grid-template-columns: 155px minmax(260px, 1fr) auto; align-items: end; gap: 8px 15px; border-bottom: 1px solid var(--line); background: #fff; }
+.replay-header .back-command{ grid-column: 1 / 4; }
+.replay-header > div:nth-child(2){ grid-column: 1 / 3; min-width: 0; }
+.replay-header small{ color: var(--muted); font-size: 10px; }
+.replay-header h1{ margin: 3px 0; overflow: hidden; font-size: 19px; text-overflow: ellipsis; white-space: nowrap; }
+.replay-header > div:nth-child(2) > span{ color: var(--muted); font-size: 10px; }
+.replay-header > div:nth-child(2) b{ color: #5c6a75; font-weight: 500; }
+.replay-header-summary{ display: flex; align-items: center; }
+.replay-header-summary > span{ min-width: 86px; padding: 0 14px; display: flex; flex-direction: column; gap: 4px; border-left: 1px solid var(--line); color: var(--muted); font-size: 10px; }
+.replay-header-summary strong{ color: #344550; font-size: 12px; }
+.replay-map{ position: relative; flex: 1; min-height: 0; overflow: hidden; isolation: isolate; background: transparent; pointer-events: none; }
+.replay-empty{ position: absolute; inset: 0; display: grid; place-items: center; color: var(--muted); font-size: 12px; pointer-events: none; background: rgba(238,242,244,.72); }
+.replay-map-legend{ position: absolute; z-index: 4; height: 31px; padding: 0 10px; display: flex; align-items: center; gap: 12px; border-radius: 4px; color: #53626e; background: rgba(255,255,255,.94); box-shadow: 0 3px 12px rgba(19,36,46,.13); font-size: 10px; }
+.replay-map-back{ position: absolute; z-index: 5; top: 13px; left: 13px; height: 32px; padding: 0 11px; display: flex; align-items: center; gap: 5px; border-radius: 4px; color: #40525f; background: rgba(255,255,255,.96); box-shadow: 0 3px 12px rgba(19,36,46,.15); font-size: 11px; }
+.replay-map-back:hover{ color: var(--blue); }
+.replay-map-back svg{ width: 12px; transform: rotate(180deg); }
+.replay-map-legend{ right: 13px; bottom: 78px; }
+.replay-map-legend span{ display: flex; align-items: center; gap: 5px; }
+.replay-map-legend i{ width: 18px; border-top: 2px dashed #2b79c8; }
+.replay-map-legend i.route-start, .replay-map-legend i.route-end{ width: 7px; height: 7px; border: 2px solid #fff; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 1px #72818c; }
+.replay-map-legend i.route-end{ background: #c56c28; }
+.replay-telemetry{ position: absolute; z-index: 4; top: 13px; right: 13px; width: 248px; overflow: hidden; border: 1px solid rgba(210,218,223,.9); border-radius: 5px; background: rgba(255,255,255,.96); box-shadow: 0 5px 18px rgba(18,34,43,.14); }
+.replay-telemetry header{ height: 39px; padding: 0 12px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
+.replay-telemetry header span{ font-size: 12px; font-weight: 600; }
+.replay-telemetry header b{ color: var(--muted); font-size: 10px; font-weight: 500; }
+.telemetry-grid{ display: grid; grid-template-columns: 1fr 1fr; }
+.telemetry-grid > div{ min-height: 50px; padding: 9px 11px; display: flex; flex-direction: column; gap: 5px; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }
+.telemetry-grid > div:nth-child(even){ border-right: 0; }
+.telemetry-grid span{ color: var(--muted); font-size: 10px; }
+.telemetry-grid strong{ color: #354651; font-size: 12px; }
+.replay-telemetry dl{ margin: 0; padding: 7px 11px 9px; }
+.replay-telemetry dl > div{ min-height: 26px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid #edf0f2; }
+.replay-telemetry dl > div:last-child{ border-bottom: 0; }
+.replay-telemetry dt{ color: var(--muted); font-size: 10px; }
+.replay-telemetry dd{ margin: 0; color: #455560; font-size: 10px; }
+.media-panel-heading{ min-height: 63px; padding: 12px 17px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
+.media-panel-heading > div{ display: flex; flex-direction: column; gap: 4px; }
+.media-panel-heading h2{ margin: 0; font-size: 14px; }
+.media-panel-heading span{ color: var(--muted); font-size: 10px; }
+.media-live-count{ display: flex; align-items: center; gap: 6px; }
+.media-live-count i, .live-corner i{ width: 6px; height: 6px; border-radius: 50%; background: var(--red); }
+.live-media-grid, .media-grid{ padding: 16px; display: grid; grid-template-columns: repeat(2, minmax(260px, 1fr)); gap: 13px; }
+.live-media-grid article, .media-grid article{ overflow: hidden; border: 1px solid var(--line); border-radius: 5px; background: #fff; }
+.media-visual{ position: relative; aspect-ratio: 16 / 8.5; overflow: hidden; background-image: linear-gradient(rgba(15,30,38,.06), rgba(15,30,38,.3)), url("/assets/reference-map-source.png"); background-size: cover; background-position: center; }
+.media-visual::after{ content: ""; position: absolute; inset: 0; box-shadow: inset 0 0 35px rgba(12,25,32,.2); pointer-events: none; }
+.dock-camera{ background-image: linear-gradient(rgba(18,35,40,.1), rgba(18,35,40,.32)), url("/assets/map-base-clean.png"); background-position: 45% 58%; }
+.aerial-1{ background-position: 68% 35%; }
+.aerial-2{ background-position: 34% 48%; }
+.media-visual > button{ position: absolute; z-index: 2; top: 50%; left: 50%; width: 40px; height: 40px; display: grid; place-items: center; border: 1px solid rgba(255,255,255,.7); border-radius: 50%; color: #fff; background: rgba(23,42,54,.72); transform: translate(-50%, -50%); transition: .15s ease; }
+.media-visual > button:hover{ background: rgba(31,111,235,.9); transform: translate(-50%, -50%) scale(1.06); }
+.media-visual > button svg{ width: 16px; margin-left: 2px; }
+.media-visual > small, .media-duration, .live-corner{ position: absolute; z-index: 2; padding: 4px 7px; border-radius: 3px; color: #fff; background: rgba(23,38,48,.78); font-size: 10px; }
+.media-visual > small{ right: 8px; bottom: 8px; }
+.media-duration{ right: 8px; bottom: 8px; }
+.live-corner{ top: 8px; left: 8px; display: flex; align-items: center; gap: 5px; }
+.media-card-copy{ min-height: 57px; padding: 9px 11px; display: flex; align-items: center; justify-content: space-between; gap: 10px; }
+.media-card-copy > span{ min-width: 0; display: flex; flex-direction: column; gap: 4px; }
+.media-card-copy .icon-button{ width: 28px; height: 28px; min-width: 28px; }
+.media-card-copy .icon-button svg{ width: 13px; }
+.original-video-toolbar{ gap: 10px; }
+.original-video-toolbar > div:last-child{ flex-shrink: 0; }
+.download-quota{ min-width: 190px; height: 34px; padding: 0 8px 0 10px; display: grid !important; grid-template-columns: 1fr auto; grid-template-rows: 1fr 1fr; align-items: center; column-gap: 8px !important; border-left: 1px solid var(--line); border-right: 1px solid var(--line); }
+.download-quota span{ align-self: end; color: #53626e; font-size: 10px; }
+.download-quota span b{ color: #344651; font-weight: 600; }
+.download-quota small{ align-self: start; color: #a05e24; font-size: 8px; }
+.download-quota button{ grid-row: 1 / 3; grid-column: 2; height: 26px; padding: 0 7px; border-radius: 3px; color: var(--blue); background: #eaf2fc; font-size: 10px; }
+.task-dialog select{ width: 100%; height: 38px; }
+.task-dialog .task-schedule-settings{ margin-bottom: 3px; }
+.task-dialog .task-schedule-settings > label:last-child{ margin-bottom: 12px; }
+.task-dialog .task-schedule-settings label small{ color: var(--muted); font-size: 10px; line-height: 1.4; }
+.task-dialog .task-schedule-settings input[type='text']{ font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
+.task-video-settings{ margin: 3px 0 12px; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
+.task-video-title{ height: 35px; display: flex; align-items: center; justify-content: space-between; }
+.task-video-title strong{ font-size: 12px; }
+.task-video-title span{ color: var(--muted); font-size: 10px; }
+.add-dock-dialog .task-video-option{ min-height: 48px; margin: 0; padding: 7px 2px; display: grid; grid-template-columns: 1fr 34px; align-items: center; gap: 10px; border-top: 1px solid #edf0f2; cursor: pointer; }
+.task-video-option > span{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.task-video-option strong{ color: #3c4d59; font-size: 11px; }
+.add-dock-dialog .task-video-option small{ color: var(--muted); font-size: 10px; }
+.task-video-option input{ position: absolute; opacity: 0; pointer-events: none; }
+.task-video-option > i{ position: relative; width: 32px; height: 18px; border-radius: 9px; background: #c9d0d5; transition: background .16s ease; }
+.task-video-option > i::after{ content: ""; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(20,36,45,.25); transition: transform .16s ease; }
+.task-video-option input:checked + i{ background: #2d76c2; }
+.task-video-option input:checked + i::after{ transform: translateX(14px); }
+.task-video-option.disabled{ cursor: not-allowed; opacity: .55; }
+.task-video-option.disabled > i{ background: #d8dde1; }
+.device-detail-page{ height: 100%; flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; background: #f1f4f6; pointer-events: auto; }
+.full-detail-header{ min-height: 108px; padding: 12px 24px 16px; display: grid; grid-template-columns: 1fr auto; align-items: end; gap: 7px 16px; background: #fff; border-bottom: 1px solid var(--line); }
+.back-command{ grid-column: 1 / 3; width: fit-content; height: 24px; padding: 0; display: flex; align-items: center; gap: 4px; color: var(--muted); background: transparent; font-size: 11px; }
+.back-command:hover{ color: var(--blue); }
+.back-command svg{ width: 12px; transform: rotate(180deg); }
+.full-detail-identity{ min-width: 0; display: flex; align-items: center; gap: 11px; }
+.full-detail-identity > span{ width: 40px; height: 40px; min-width: 40px; display: grid; place-items: center; border-radius: 5px; color: #226e55; background: #e5f3ed; }
+.full-detail-identity > span.drone{ color: #246aa9; background: #e6eff9; }
+.full-detail-identity > span svg{ width: 19px; }
+.full-detail-identity > div{ min-width: 0; }
+.full-detail-identity small{ color: var(--muted); font-size: 10px; }
+.full-detail-identity h1{ margin: 2px 0; overflow: hidden; font-size: 20px; text-overflow: ellipsis; white-space: nowrap; }
+.full-detail-identity p{ margin: 0; color: var(--muted); font-size: 11px; }
+.full-detail-identity > i{ margin-left: 4px; }
+.full-detail-actions{ display: flex; align-items: center; gap: 8px; }
+.full-detail-actions svg{ width: 14px; }
+.full-detail-actions [hidden]{ display: none; }
+.full-detail-content{ flex: 1; min-height: 0; margin: 16px 24px 24px; overflow: auto; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
+.detail-metric-band{ min-height: 76px; padding: 0 8px; display: grid; grid-template-columns: repeat(6, 1fr); align-items: center; border-bottom: 1px solid var(--line); background: #fafbfc; }
+.detail-metric-band > div{ height: 40px; padding: 0 16px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border-right: 1px solid var(--line); }
+.detail-metric-band > div:last-child{ border-right: 0; }
+.detail-metric-band span{ color: var(--muted); font-size: 10px; }
+.detail-metric-band strong{ color: #34434f; font-size: 16px; font-weight: 600; }
+.detail-columns{ display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(270px, .8fr); }
+.detail-main-column, .detail-side-column{ min-width: 0; }
+.detail-side-column{ border-left: 1px solid var(--line); }
+.data-section{ padding: 18px 20px; border-bottom: 1px solid var(--line); }
+.data-section:last-child{ border-bottom: 0; }
+.data-section h2{ margin: 0 0 14px; font-size: 13px; }
+.data-section-title{ display: flex; align-items: center; justify-content: space-between; gap: 10px; }
+.data-section-title button{ color: var(--blue); background: transparent; font-size: 11px; }
+.status-matrix{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
+.status-matrix > div{ position: relative; min-height: 54px; padding: 9px 24px 9px 32px; display: flex; flex-direction: column; justify-content: center; gap: 4px; border-radius: 4px; background: #f5f7f9; }
+.status-matrix svg{ position: absolute; left: 9px; top: 10px; width: 15px; color: #657b8e; }
+.status-matrix span{ color: var(--muted); font-size: 10px; }
+.status-matrix strong{ color: #354550; font-size: 12px; }
+.status-matrix > div > i{ position: absolute; right: 9px; top: 11px; width: 6px; height: 6px; border-radius: 50%; }
+.ok{ background: var(--green); }
+.value-table{ display: grid; grid-template-columns: repeat(3, 1fr); border-top: 1px solid var(--line); border-left: 1px solid var(--line); }
+.value-table > div{ min-height: 54px; padding: 9px 12px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }
+.value-table span{ color: var(--muted); font-size: 10px; }
+.value-table strong{ color: #34434f; font-size: 12px; font-weight: 600; }
+.environment-values{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
+.environment-values > div{ min-height: 52px; padding: 9px 10px 9px 34px; position: relative; display: flex; flex-direction: column; justify-content: center; gap: 4px; border-radius: 4px; background: #f5f7f9; }
+.environment-values svg{ position: absolute; left: 10px; width: 15px; color: #657b8e; }
+.environment-values span{ color: var(--muted); font-size: 10px; }
+.environment-values strong{ font-size: 12px; }
+.bound-asset-large{ min-height: 52px; padding: 8px 9px; display: grid; grid-template-columns: 32px 1fr auto; align-items: center; gap: 8px; border: 1px solid var(--line); border-radius: 5px; }
+.bound-asset-large > span{ width: 30px; height: 30px; display: grid; place-items: center; border-radius: 4px; color: #286aa9; background: #e7f0fa; }
+.bound-asset-large.dock > span{ color: #226e55; background: #e5f3ed; }
+.bound-asset-large svg{ width: 15px; }
+.bound-asset-large > div{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.bound-asset-large strong{ overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
+.bound-asset-large small{ color: var(--muted); font-size: 10px; }
+.detail-side-column dl{ margin: 13px 0 0; }
+.detail-side-column dl > div, .compact-properties > div{ min-height: 29px; display: grid; grid-template-columns: 88px 1fr; align-items: center; border-bottom: 1px solid #edf0f2; }
+.detail-side-column dt, .compact-properties dt{ color: var(--muted); font-size: 10px; }
+.detail-side-column dd, .compact-properties dd{ margin: 0; overflow: hidden; color: #3c4b57; font-size: 11px; text-align: right; text-overflow: ellipsis; white-space: nowrap; }
+.workflow-summary{ display: grid; grid-template-columns: 30px 1fr auto; align-items: center; gap: 8px; }
+.workflow-icon{ width: 30px; height: 30px; display: grid; place-items: center; border-radius: 4px; color: #226e55; background: #e5f3ed; }
+.workflow-icon svg{ width: 14px; }
+.workflow-summary > div{ display: flex; flex-direction: column; gap: 3px; }
+.workflow-summary strong{ font-size: 12px; }
+.workflow-summary small{ color: var(--muted); font-size: 10px; }
+.workflow-summary > i{ color: var(--green); font-size: 10px; font-style: normal; }
+.mission-detail-row{ display: flex; align-items: center; justify-content: space-between; }
+.mission-detail-row > div{ display: flex; flex-direction: column; gap: 4px; }
+.mission-detail-row strong{ font-size: 13px; }
+.mission-detail-row small{ color: var(--muted); font-size: 10px; }
+.mission-detail-row > b{ color: var(--blue); font-size: 12px; }
+.progress-track.state-groups, .diagnostics-layout{ display: grid; grid-template-columns: 1fr 1fr; }
+.state-groups .data-section:nth-child(odd), .diagnostics-layout .data-section:nth-child(odd){ border-right: 1px solid var(--line); }
+.state-detail-grid{ display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
+.state-detail-grid > div{ min-height: 68px; padding: 11px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 4px; }
+.state-detail-grid span{ color: var(--muted); font-size: 10px; }
+.state-detail-grid strong{ font-size: 12px; }
+.state-detail-grid small{ color: #8a96a0; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 8px; }
+.record-header{ height: 62px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
+.record-header > div{ display: flex; align-items: baseline; gap: 9px; }
+.record-header h2{ margin: 0; font-size: 14px; }
+.record-header span{ color: var(--muted); font-size: 10px; }
+.record-header select{ width: 132px; height: 32px; padding: 0 8px; border: 1px solid var(--line); border-radius: 4px; color: #536270; background: #fff; font-size: 11px; }
+.severity{ padding: 3px 6px; border-radius: 3px; font-size: 10px; font-style: normal; }
+.severity.medium{ color: #a0591e; background: #fff0e3; }
+.severity.low{ color: #426785; background: #eaf1f6; }
+.diagnostic-list{ display: flex; flex-direction: column; border-top: 1px solid var(--line); }
+.diagnostic-list > div{ min-height: 46px; display: grid; grid-template-columns: 1fr 70px 90px; align-items: center; gap: 8px; border-bottom: 1px solid var(--line); }
+.diagnostic-list span{ display: flex; align-items: center; gap: 7px; color: #455461; font-size: 11px; }
+.diagnostic-list span i{ width: 6px; height: 6px; border-radius: 50%; }
+.diagnostic-list span i.standby{ background: #8d98a1; }
+.diagnostic-list strong{ color: var(--green); font-size: 11px; font-weight: 500; }
+.diagnostic-list small{ color: var(--muted); font-size: 10px; text-align: right; }
+.dock-status-dialog{ width: min(700px, calc(100vw - 32px)); padding: 0; overflow: hidden; text-align: left; }
+.dock-status-dialog .t-dialog__header{ min-height: 58px; padding: 0 18px; border-bottom: 1px solid var(--line); }
+.dock-status-dialog .t-dialog__body{ padding: 0; }
+.dock-status-body{ padding: 13px 18px 15px; max-height: none; overflow: visible; }
+.dock-status-grid{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
+.dock-status-grid > div{ min-height: 58px; padding: 8px 9px; display: flex; flex-direction: column; gap: 4px; border: 1px solid var(--line); border-radius: 4px; background: #f7f9fb; }
+.dock-status-grid span, .dock-status-grid small{ color: var(--muted); font-size: 10px; }
+.dock-status-grid strong{ color: #344651; font-size: 12px; }
+.dock-status-grid small{ margin-top: auto; }
+.dock-status-grid.compact > div{ min-height: 50px; }
+.dock-state-section{ margin: 0; }
+.dock-state-heading{ display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
+.dock-state-heading h4{ margin: 0; font-size: 12px; }
+.dock-state-heading span{ color: var(--muted); font-size: 8px; }
+.dock-state-board{ display: grid; grid-template-columns: repeat(4, 1fr); gap: 9px; }
+.dock-state-board article{ min-height: 112px; padding: 10px 11px; border: 1px solid #e4eaf0; border-radius: 8px; background: #f7f9fb; }
+.dock-state-board h5{ margin: 0 0 8px; color: #2f7fb9; font-size: 12px; font-weight: 600; }
+.dock-state-board ul{ margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; list-style: none; }
+.dock-state-board li{ display: flex; align-items: center; gap: 6px; color: #82909b; font-size: 10px; line-height: 1.2; }
+.dock-state-board li i{ width: 7px; height: 7px; flex: 0 0 7px; border-radius: 50%; background: #cbd5dd; }
+.dock-state-board li.active{ color: #486271; }
+.dock-state-board li.active i{ background: #36a477; box-shadow: 0 0 0 2px #e3f3ed; }
+.dock-state-board li i.warning{ background: #dda44a; box-shadow: 0 0 0 2px #fff1dc; }
+@media (max-width: 560px){.dock-state-board{ grid-template-columns: repeat(2, 1fr); }.dock-status-dialog{ width: min(520px, calc(100vw - 20px)); }.dock-status-body{ max-height: calc(100vh - 96px); overflow: auto; }.dock-status-grid{ grid-template-columns: repeat(2, 1fr); }}
+.add-dock-dialog{ width: min(520px, 100%); padding: 0; overflow: hidden; text-align: left; }
+.add-dock-dialog > header{ height: 68px; padding: 0 20px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
+.add-dock-dialog > header > div{ display: flex; flex-direction: column; gap: 3px; }
+.add-dock-dialog > header span{ color: var(--muted); font-size: 10px; }
+.add-dock-dialog > header h3{ margin: 0; font-size: 18px; }
+.add-dock-dialog form{ padding: 18px 20px 0; }
+.add-dock-dialog label{ display: flex; flex-direction: column; gap: 6px; margin-bottom: 15px; }
+.add-dock-dialog label > span{ color: #485764; font-size: 12px; }
+.add-dock-dialog label b{ color: var(--red); font-weight: 500; }
+.add-dock-dialog label em{ margin-left: 4px; color: #8a96a0; font-size: 10px; font-style: normal; }
+.add-dock-dialog .t-input{ width: 100%; height: 38px; padding: 0 10px; border: 1px solid var(--line); border-radius: 5px; color: var(--ink); background: #fff; font-size: 12px; box-shadow: none; }
+.add-dock-dialog .t-input .t-input__inner{ height: 100%; padding: 0; border: 0; border-radius: 0; color: inherit; background: transparent; font-size: inherit; box-shadow: none; }
+.add-dock-dialog .t-input:hover{ border-color: var(--line); }
+.add-dock-dialog .t-input--focused{ border-color: #6799d1; box-shadow: 0 0 0 3px rgba(31,111,235,.08); }
+.add-dock-dialog .t-input.t-is-readonly, .add-dock-dialog .t-input.t-is-readonly .t-input__inner{ color: #77838d; background: #f2f4f6; cursor: not-allowed; }
+.add-dock-dialog .t-input.invalid, .add-dock-dialog .t-input.t-is-error{ border-color: var(--red); }
+.add-dock-dialog label small{ min-height: 0; color: var(--red); font-size: 10px; }
+.form-row{ display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
+.form-error{ min-height: 28px; padding-top: 7px; color: var(--red); font-size: 11px; }
+.add-dock-dialog form > footer{ height: 62px; margin: 0 -20px; padding: 0 20px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); }
+.add-dock-dialog form > footer button{ min-width: 82px; }
+.t-dialog.add-dock-dialog{ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl); overflow: visible; transform: none; box-shadow: none; }
+.t-dialog.add-dock-dialog form{ padding: 0; }
+.t-dialog.add-dock-dialog .t-dialog__footer button + button{ margin-left: 8px; }
+.t-dialog.firmware-dialog{ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl); overflow: visible; transform: none; box-shadow: none; }
+.t-dialog.firmware-dialog .firmware-content{ padding: 0; }
+.t-dialog.firmware-dialog .t-dialog__footer button + button{ margin-left: 8px; }
+.firmware-dialog{ width: min(500px, calc(100vw - 32px)); padding: 0; overflow: hidden; text-align: left; }
+.firmware-content{ padding: 18px 20px 8px; }
+.firmware-device{ min-height: 54px; padding: 9px 10px; display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 9px; border: 1px solid var(--line); border-radius: 5px; background: #f7f9fb; }
+.firmware-device > div{ min-width: 0; display: flex; flex-direction: column; gap: 4px; }
+.firmware-device strong{ font-size: 12px; }
+.firmware-device small{ color: var(--muted); font-size: 10px; }
+.firmware-content label{ display: flex; flex-direction: column; gap: 6px; margin-top: 16px; }
+.firmware-content label > span{ color: #485764; font-size: 12px; }
+.firmware-checks{ margin-top: 15px; padding: 10px; display: flex; justify-content: space-between; gap: 8px; border-radius: 4px; background: #f5f8fa; }
+.firmware-checks span{ display: flex; align-items: center; gap: 5px; color: #52616e; font-size: 10px; }
+.firmware-checks i{ width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
+.firmware-note{ margin: 13px 0 0; color: #7b8791; font-size: 10px; line-height: 1.6; }
+@media (max-width: 1260px){.monitor-layout{ grid-template-columns: 0 minmax(0, 1fr) 0; }.monitor-layout.focused{ grid-template-columns: 248px minmax(330px, 1fr) 320px; }.device-panel{ width: 248px; }.detail-panel{ width: 320px; }.asset-overview{ grid-template-columns: repeat(5, 1fr); min-height: 74px; }}
+@media (max-width: 1020px){.monitor-layout.focused{ grid-template-columns: 225px minmax(280px, 1fr) 300px; }.device-panel{ width: 225px; }.detail-panel{ width: 300px; }.device-page{ padding: 18px; }.asset-toolbar{ align-items: stretch; flex-direction: column; }.asset-search{ width: 100%; }.toolbar-group{ justify-content: flex-end; }.operation-page{ padding: 18px; }.business-metric-band{ min-width: 760px; }.task-metrics{ overflow-x: auto; }.route-grid{ grid-template-columns: repeat(2, minmax(220px, 1fr)); }.operation-page{ overflow-x: auto; }.detail-metric-band{ grid-template-columns: repeat(3, 1fr); padding: 8px; }.detail-metric-band > div:nth-child(3){ border-right: 0; }.detail-columns{ grid-template-columns: 1fr; }.detail-side-column{ border-top: 1px solid var(--line); border-left: 0; }}
+@media (max-width: 760px){.monitor-layout, .monitor-layout.focused{ display: grid; grid-template-columns: 0 minmax(0, 1fr) 0; overflow: hidden; }.device-panel{ display: none; }.map-panel{ min-height: 390px; }.detail-panel{ position: absolute; right: 0; top: 0; bottom: 0; width: min(360px, 94vw); box-shadow: -8px 0 24px rgba(21,33,43,.16); }.detail-header{ min-height: 78px; }.map-legend{ max-width: calc(100% - 28px); overflow-x: auto; }.device-page{ padding: 12px; gap: 12px; }.device-page-header h1{ font-size: 20px; }.device-page-header > div:first-child span{ display: none; }.asset-overview{ min-width: 620px; }.device-page{ overflow-x: auto; }.asset-workspace{ min-width: 680px; }.device-drawer{ position: fixed; top: 56px; width: min(408px, 94vw); }.drawer-scrim{ position: fixed; top: 56px; }.form-row{ grid-template-columns: 1fr; gap: 0; }.operation-page{ padding: 12px; gap: 12px; }.operation-page-header h1{ font-size: 20px; }.operation-page-header > div span{ display: none; }.business-workspace{ min-width: 680px; }.route-grid{ grid-template-columns: repeat(2, minmax(240px, 1fr)); }.live-media-grid, .media-grid{ grid-template-columns: repeat(2, minmax(260px, 1fr)); }.full-detail-header{ padding: 10px 14px 14px; grid-template-columns: minmax(0, 1fr) auto; }.full-detail-content{ margin: 10px; }.detail-metric-band > div{ padding: 0 10px; }.state-groups, .diagnostics-layout{ grid-template-columns: 1fr; }.state-groups .data-section:nth-child(odd), .diagnostics-layout .data-section:nth-child(odd){ border-right: 0; }.status-matrix, .environment-values{ grid-template-columns: repeat(2, 1fr); }.record-header{ min-width: 680px; }}
+.control-page{ height: 100%; min-height: 0; overflow: auto; background: #f3f6f8; pointer-events: auto; }
+.control-page-header{ padding: 18px 24px; background: #fff; border-bottom: 1px solid var(--line); }
+.control-page-header h1{ margin: 0 0 5px; font-size: 22px; }
+.control-workspace{ min-height: calc(100vh - 76px); display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 14px; padding: 14px; }
+.control-device-list, .control-main{ min-width: 0; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
+.control-list-heading{ min-height: 62px; padding: 0 15px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
+.control-list-heading h2, .control-selected-header h2{ margin: 0 0 4px; font-size: 17px; }
+.control-list-heading span, .control-selected-header p{ color: var(--muted); font-size: 11px; }
+.control-device-items{ padding: 8px; }
+.control-device-item{ width: 100%; min-height: 70px; padding: 10px 8px; display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; align-items: center; gap: 8px; border-bottom: 1px solid #edf0f2; color: var(--ink); background: transparent; text-align: left; }
+.control-device-item:last-child{ border-bottom: 0; }
+.control-device-item:hover, .control-device-item.active{ background: #f2f7fc; }
+.control-device-item.active{ box-shadow: inset 3px 0 0 var(--blue); }
+.control-device-icon{ width: 28px; height: 28px; display: grid; place-items: center; border-radius: 4px; color: #3478b8; background: #e8f1f8; }
+.control-device-icon svg{ width: 15px; }
+.control-device-item strong, .control-device-item small{ display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.control-device-item strong{ font-size: 12px; }
+.control-device-item small{ margin-top: 4px; color: var(--muted); font-size: 10px; }
+.control-device-item .status{ font-size: 10px; }
+.control-main{ overflow: hidden; }
+.control-selected-header{ min-height: 86px; padding: 17px 20px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
+.control-status-band{ min-height: 70px; display: grid; grid-template-columns: repeat(5, 1fr); border-bottom: 1px solid var(--line); background: #f7f9fa; }
+.control-status-band > div{ padding: 14px 16px; border-right: 1px solid var(--line); }
+.control-status-band > div:last-child{ border-right: 0; }
+.control-status-band span, .control-status-band strong{ display: block; }
+.control-status-band span{ color: var(--muted); font-size: 10px; }
+.control-status-band strong{ margin-top: 6px; color: #344651; font-size: 12px; font-weight: 500; }
+.control-alert-section{ padding: 15px 20px; border-bottom: 1px solid var(--line); }
+.control-alert-content{ min-height: 52px; padding: 10px 12px; display: flex; align-items: center; gap: 10px; border: 1px solid #d9ebe3; border-radius: 5px; background: #f5fbf8; }
+.control-alert-content.alarm{ border-color: #f0d6d7; background: #fff7f7; }
+.control-alert-content.offline{ border-color: #e2e5e7; background: #f7f8f9; }
+.control-alert-icon{ width: 25px; height: 25px; min-width: 25px; display: grid; place-items: center; border-radius: 50%; color: var(--red); background: #fbe3e4; }
+.control-alert-icon.ok{ color: var(--green); background: #dff3e9; }
+.control-alert-icon svg{ width: 13px; }
+.control-alert-content > div{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.control-alert-content strong{ color: #49545d; font-size: 12px; }
+.control-alert-content small{ color: var(--muted); font-size: 10px; }
+.control-alert-content.alarm strong{ color: #a53e45; }
+.control-section{ padding: 18px 20px; border-bottom: 1px solid var(--line); }
+.control-section .data-section-title{ margin-bottom: 14px; }
+.control-section .data-section-title span{ color: var(--muted); font-size: 10px; }
+.control-command-grid{ display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px; }
+.control-command{ min-height: 58px; padding: 10px 12px; display: flex; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: 5px; color: #344651; background: #fff; text-align: left; }
+.control-command:hover{ border-color: #8fb7d6; background: #f5faff; }
+.control-command.primary, .control-command.landing{ color: #fff; border-color: transparent; background: var(--blue); }
+.control-command.landing{ background: #1d7468; }
+.control-command.danger{ color: #a53e45; }
+.control-command > svg{ width: 18px; }
+.control-command > b{ width: 23px; height: 23px; display: grid; place-items: center; border-radius: 3px; color: #3478b8; background: #eaf2f8; font-size: 10px; font-weight: 500; }
+.control-command span{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.control-command strong{ font-size: 12px; }
+.control-command small{ color: #7b8992; font-size: 10px; }
+.control-command.primary small, .control-command.landing small{ color: rgba(255,255,255,.78); }
+.control-command-grid.compact{ grid-template-columns: repeat(3, minmax(0, 1fr)); }
+.control-note{ display: flex; align-items: flex-start; gap: 10px; border-bottom: 0; background: #fbfcfd; }
+.control-note > svg{ width: 17px; color: #5e88ab; }
+.control-note span{ display: flex; flex-direction: column; gap: 4px; }
+.control-note strong{ font-size: 11px; }
+.control-note small{ color: var(--muted); font-size: 10px; line-height: 1.5; }
+.control-mode-toggle{ display: inline-flex; align-items: center; gap: 3px; padding: 0; color: var(--blue); background: transparent; font-size: 10px; }
+.control-mode-toggle:hover{ color: var(--blue-dark); }
+.control-mode-toggle svg{ width: 12px; }
+.control-mode-toggle.expanded svg{ transform: rotate(180deg); }
+.dock-control-extra{ margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--line); }
+.dock-control-extra-grid{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
+.quick-actions.all-controls .workflow-actions, .quick-actions.all-controls .stage-actions, .quick-actions.all-controls .reset-action{ display: none; }
+.quick-actions.all-controls .dock-control-extra-grid{ grid-template-columns: repeat(4, minmax(0, 1fr)); }
+.quick-actions.all-controls .dock-control-extra-grid button{ min-height: 42px; padding: 6px 8px; }
+.drone-control-all button.danger{ color: #a53e45; border-color: #e3b4b7; }
+.drone-control-all button.danger:hover{ color: #8f2f36; border-color: #d18a8e; background: #fff5f5; }
+.drone-control-all{ display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 7px; margin-top: 8px; }
+.drone-control-all[hidden]{ display: none !important; }
+.drone-control-all button{ min-height: 42px; padding: 6px 8px; display: flex; align-items: center; gap: 6px; border: 1px solid var(--line); border-radius: 4px; color: #4c5f6b; background: #fff; font-size: 10px; }
+.drone-control-all button:hover{ color: var(--blue); border-color: #91b5d6; background: #f7fbff; }
+.drone-control-all button > span{ display: flex; flex-direction: column; gap: 3px; }
+.drone-control-all button strong{ font-size: 11px; font-weight: 500; }
+.drone-control-all button small{ color: var(--muted); font-size: 8px; }
+.dock-control-extra-grid button{ min-height: 45px; padding: 7px 10px; display: flex; align-items: center; gap: 7px; border: 1px solid var(--line); border-radius: 4px; color: #4c5f6b; background: #fff; font-size: 11px; }
+.dock-control-extra-grid button:hover{ color: var(--blue); border-color: #91b5d6; background: #f7fbff; }
+.dock-control-extra-grid svg{ width: 14px; }
+.dock-control-extra-grid button > span{ display: flex; flex-direction: column; gap: 3px; }
+.dock-control-extra-grid button strong{ font-size: 11px; font-weight: 500; }
+.dock-control-extra-grid button small{ color: var(--muted); font-size: 8px; }
/* 1920×1080:监控右侧详情栏尽量一屏 */
-@media (min-height: 900px) and (max-height: 1100px) {
- .detail-header { min-height: 72px; padding: 12px 14px 10px; }
- .detail-header h2 { margin: 2px 0 3px; font-size: 16px; }
- .detail-panel section { padding: 10px 14px; }
- .section-title { min-height: 20px; margin-bottom: 7px; }
- .section-title h3 { font-size: 13px; }
- .video-frame { aspect-ratio: 16 / 7.2; }
- .metric-grid { gap: 6px; }
- .metric-grid > div { min-height: 50px; padding: 7px 8px 6px 28px; gap: 2px; }
- .metric-grid svg { left: 8px; top: 8px; width: 14px; }
- .metric-grid span { font-size: 10px; }
- .metric-grid strong { font-size: 15px; }
- .metric-grid .success { font-size: 13px; }
- .environment-row strong { font-size: 11px; }
- .mission-name strong { font-size: 12px; }
- .mission-name small { font-size: 9px; }
- .mission-name > b { font-size: 14px; }
- .progress-track { margin-top: 8px; }
- .progress-meta { margin-top: 6px; font-size: 9px; }
- .mission-progress .table-empty { min-height: 36px; font-size: 10px; }
- .workflow-actions { gap: 6px; }
- .workflow-action { min-height: 44px; padding: 0 8px; gap: 6px; }
- .workflow-action > svg { width: 17px; }
- .stage-actions { gap: 6px; margin-top: 6px; }
- .stage-actions button { min-height: 40px; padding: 5px 6px; }
- .reset-action { height: 34px; margin-top: 6px; }
- .primary-action { min-height: 44px; }
- .secondary-actions { gap: 6px; margin-top: 6px; }
- .secondary-actions button { height: 32px; font-size: 11px; }
- .dock-control-extra { margin-top: 10px; padding-top: 10px; }
- .dock-control-extra-grid { gap: 6px; }
- .dock-control-extra-grid button { min-height: 38px; padding: 5px 8px; }
- .quick-actions.all-controls .dock-control-extra-grid button { min-height: 36px; padding: 5px 6px; }
- .drone-control-all { gap: 6px; margin-top: 6px; }
- .drone-control-all button { min-height: 36px; padding: 5px 6px; }
-}
-
-@media (max-width: 1180px) {
- .monitor-layout.focused.control-expanded { grid-template-columns: 225px minmax(280px, 1fr) 460px; }
- .monitor-layout.control-expanded .detail-panel { width: 460px; }
-}
-@media (max-width: 760px) {
- .monitor-layout.focused.control-expanded { grid-template-columns: 0 minmax(0, 1fr) 0; }
- .monitor-layout.control-expanded .detail-panel { width: min(560px, 94vw); }
- .dock-control-info { grid-template-columns: repeat(2, 1fr); }
- .dock-control-info > div:nth-child(2) { border-right: 0; }
- .dock-control-extra-grid { grid-template-columns: repeat(2, 1fr); }
- .quick-actions.all-controls .dock-control-extra-grid { grid-template-columns: repeat(2, 1fr); }
- .drone-control-all { grid-template-columns: repeat(2, 1fr); }
- .drone-control-all { grid-template-columns: repeat(2, 1fr); }
+@media (min-height: 900px) and (max-height: 1100px){.detail-header{ min-height: 72px; padding: 12px 14px 10px; }.detail-header h2{ margin: 2px 0 3px; font-size: 16px; }.detail-panel section{ padding: 10px 14px; }.section-title{ min-height: 20px; margin-bottom: 7px; }.section-title h3{ font-size: 13px; }.video-frame{ aspect-ratio: 16 / 7.2; }.metric-grid{ gap: 6px; }.metric-grid > div{ min-height: 50px; padding: 7px 8px 6px 28px; gap: 2px; }.metric-grid svg{ left: 8px; top: 8px; width: 14px; }.metric-grid span{ font-size: 10px; }.metric-grid strong{ font-size: 15px; }.metric-grid .success{ font-size: 13px; }.environment-row strong{ font-size: 11px; }.mission-name strong{ font-size: 12px; }.mission-name small{ font-size: 9px; }.mission-name > b{ font-size: 14px; }.progress-track{ margin-top: 8px; }.progress-meta{ margin-top: 6px; font-size: 9px; }.mission-progress .table-empty{ min-height: 36px; font-size: 10px; }.workflow-actions{ gap: 6px; }.workflow-action{ min-height: 44px; padding: 0 8px; gap: 6px; }.workflow-action > svg{ width: 17px; }.stage-actions{ gap: 6px; margin-top: 6px; }.stage-actions button{ min-height: 40px; padding: 5px 6px; }.reset-action{ height: 34px; margin-top: 6px; }.primary-action{ min-height: 44px; }.secondary-actions{ gap: 6px; margin-top: 6px; }.secondary-actions button{ height: 32px; font-size: 11px; }.dock-control-extra{ margin-top: 10px; padding-top: 10px; }.dock-control-extra-grid{ gap: 6px; }.dock-control-extra-grid button{ min-height: 38px; padding: 5px 8px; }.quick-actions.all-controls .dock-control-extra-grid button{ min-height: 36px; padding: 5px 6px; }.drone-control-all{ gap: 6px; margin-top: 6px; }.drone-control-all button{ min-height: 36px; padding: 5px 6px; }}
+@media (max-width: 1180px){.monitor-layout.focused.control-expanded{ grid-template-columns: 225px minmax(280px, 1fr) 460px; }.monitor-layout.control-expanded .detail-panel{ width: 460px; }}
+@media (max-width: 760px){.monitor-layout.focused.control-expanded{ grid-template-columns: 0 minmax(0, 1fr) 0; }.monitor-layout.control-expanded .detail-panel{ width: min(560px, 94vw); }.dock-control-extra-grid{ grid-template-columns: repeat(2, 1fr); }.quick-actions.all-controls .dock-control-extra-grid{ grid-template-columns: repeat(2, 1fr); }.drone-control-all{ grid-template-columns: repeat(2, 1fr); }.drone-control-all{ grid-template-columns: repeat(2, 1fr); }}
+[data-detail-jump="state"]{ display: none !important; }
+.traffic-balance-card{ min-height: 112px; padding: 17px; border: 1px solid #d7e4ee; border-radius: 5px; background: #f5f9fc; }
+.traffic-balance-card > span{ color: var(--muted); font-size: 10px; }
+.traffic-balance-card > strong{ display: block; margin-top: 8px; color: #246fae; font-size: 32px; font-weight: 600; }
+.traffic-balance-card > strong small{ font-size: 12px; font-weight: 500; }
+.traffic-balance-card p{ margin: 7px 0 0; color: #74838d; font-size: 10px; }
+.traffic-purchase-layout{ display: grid; grid-template-columns: minmax(0, 1fr) 250px; gap: 18px; }
+.traffic-amount-block{ padding: 18px; border: 1px solid var(--line); border-radius: 5px; }
+.traffic-amount-block label > span{ display: block; margin-bottom: 8px; color: #4e5f6b; font-size: 11px; }
+.traffic-amount-block label > div{ height: 46px; display: flex; align-items: center; border: 1px solid #cfdae2; border-radius: 4px; overflow: hidden; }
+.traffic-amount-block input:not(.t-input__inner){ width: 100%; height: 100%; padding: 0 12px; border: 0; outline: 0; color: #304552; background: #fff; font-size: 19px; }
+.traffic-amount-block label b{ padding: 0 13px; color: #6c7d88; font-size: 12px; font-weight: 500; }
+.traffic-order-summary{ padding: 18px; display: flex; flex-direction: column; border: 1px solid #d7e4ee; border-radius: 5px; background: #f5f9fc; }
+.traffic-order-summary > span{ color: var(--muted); font-size: 10px; }
+.traffic-order-summary > strong{ margin: 5px 0 14px; font-size: 13px; }
+.traffic-order-summary > b{ margin: 6px 0; color: #246fae; font-size: 29px; }
+.traffic-order-summary > small{ color: var(--muted); font-size: 10px; }
+@media (max-width: 760px){.traffic-purchase-layout{ grid-template-columns: 1fr; }}
+@media (max-width: 900px){.control-workspace{ grid-template-columns: 240px minmax(0, 1fr); }.control-status-band{ grid-template-columns: repeat(3, 1fr); }.control-status-band > div:nth-child(3){ border-right: 0; }.control-command-grid.compact{ grid-template-columns: repeat(2, minmax(0, 1fr)); }}
+@media (max-width: 700px){.control-workspace{ grid-template-columns: 1fr; }.control-device-list{ max-height: 270px; overflow: auto; }.control-status-band{ grid-template-columns: repeat(2, 1fr); }.control-status-band > div:nth-child(2n){ border-right: 0; }.control-page-header{ padding: 14px; }}
+.account-metrics > div:first-child strong{ font-size: 25px; }
+.account-card-actions{ margin-top: 10px; display: flex; align-items: center; gap: 8px; }
+.communication-status-grid{ margin: 2px 0 14px; display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--line); border-radius: 5px; }
+.communication-status-grid > div{ min-height: 66px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; border-right: 1px solid var(--line); }
+.communication-status-grid > div:last-child{ border-right: 0; }
+.communication-status-grid strong{ font-size: 22px; }
+.communication-status-grid span{ color: var(--muted); font-size: 10px; }
+.account-subsection-title{ padding: 15px 0 10px; display: flex; align-items: flex-end; justify-content: space-between; border-top: 1px solid var(--line); }
+.account-subsection-title h3{ margin: 0 0 4px; font-size: 13px; }
+.account-subsection-title span{ color: var(--muted); font-size: 10px; }
+.carrier-status{ display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
+.carrier-status i{ width: 6px; height: 6px; border-radius: 50%; }
+.carrier-status.normal i{ background: var(--green); }
+.carrier-status.warning i{ background: var(--orange); }
+.carrier-status.danger i{ background: var(--red); }
+.carrier-status.owned i{ background: #88959e; }
+.recharge-modal{ width: min(440px, 100%); padding: 20px; border-radius: 7px; background: #fff; box-shadow: 0 22px 60px rgba(0,0,0,.23); text-align: left; transform: translateY(8px); transition: transform .18s ease; }
+.t-dialog.recharge-modal{ padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl); transform: none; box-shadow: none; }
+.t-dialog.recharge-modal .t-dialog__footer button + button{ margin-left: 8px; }
+.recharge-modal h3{ margin: 0 0 5px; font-size: 16px; }
+@media (max-width: 620px){.communication-status-grid{ grid-template-columns: repeat(3, 1fr); }}
+/* 非 monitor 页盖住全局地图;可点击子页根节点 */
+.replay-header, .replay-map-back, .replay-map-legend, .replay-telemetry{
+ pointer-events: auto;
}
-.forgot-password-dialog { width: min(400px, 100%); padding: 0; overflow: hidden; text-align: left; }
-.forgot-password-dialog > header { min-height: 68px; padding: 0 20px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
-.forgot-password-dialog > header > div { display: flex; flex-direction: column; gap: 4px; }
-.forgot-password-dialog > header span { color: var(--muted); font-size: 10px; }
-.forgot-password-dialog > header h3 { margin: 0; font-size: 18px; }
-.forgot-password-dialog form { padding: 18px 20px 0; }
-.forgot-password-dialog label { display: flex; flex-direction: column; gap: 6px; margin-bottom: 15px; }
-.forgot-password-dialog label > span { color: #485764; font-size: 12px; }
-.forgot-password-dialog input { width: 100%; height: 38px; padding: 0 10px; border: 1px solid var(--line); border-radius: 5px; outline: 0; color: var(--ink); background: #fff; font-size: 12px; }
-.forgot-password-dialog input:focus { border-color: #6799d1; box-shadow: 0 0 0 3px rgba(31,111,235,.08); }
-.forgot-password-dialog .login-input { height: 38px; }
-.forgot-password-dialog form > footer { height: 62px; margin: 3px -20px 0; padding: 0 20px; display: flex; align-items: center; justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); }
-.full-detail-tabs button[data-detail-tab="state"],
-.full-detail-tabs button[data-detail-tab="alarms"],
-.full-detail-tabs button[data-detail-tab="diagnostics"],
-.full-tab-panel[data-detail-panel="state"],
-.full-tab-panel[data-detail-panel="alarms"],
-.full-tab-panel[data-detail-panel="diagnostics"],
-[data-detail-jump="state"] { display: none !important; }
-.traffic-balance-card { min-height: 112px; padding: 17px; border: 1px solid #d7e4ee; border-radius: 5px; background: #f5f9fc; }
-.traffic-balance-card > span { color: var(--muted); font-size: 10px; }
-.traffic-balance-card > strong { display: block; margin-top: 8px; color: #246fae; font-size: 32px; font-weight: 600; }
-.traffic-balance-card > strong small { font-size: 12px; font-weight: 500; }
-.traffic-balance-card p { margin: 7px 0 0; color: #74838d; font-size: 10px; }
-.traffic-unit-price { color: var(--blue); font-size: 17px; }
-.traffic-purchase-panel { min-height: 390px; }
-.traffic-purchase-layout { display: grid; grid-template-columns: minmax(0, 1fr) 250px; gap: 18px; }
-.traffic-amount-block { padding: 18px; border: 1px solid var(--line); border-radius: 5px; }
-.traffic-amount-block label > span { display: block; margin-bottom: 8px; color: #4e5f6b; font-size: 11px; }
-.traffic-amount-block label > div { height: 46px; display: flex; align-items: center; border: 1px solid #cfdae2; border-radius: 4px; overflow: hidden; }
-.traffic-amount-block input { width: 100%; height: 100%; padding: 0 12px; border: 0; outline: 0; color: #304552; background: #fff; font-size: 19px; }
-.traffic-amount-block label b { padding: 0 13px; color: #6c7d88; font-size: 12px; font-weight: 500; }
-.traffic-quick-amounts { margin-top: 13px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 7px; }
-.traffic-quick-amounts button { min-height: 34px; border: 1px solid var(--line); border-radius: 4px; color: #526570; background: #fff; font-size: 11px; }
-.traffic-quick-amounts button:hover, .traffic-quick-amounts button.active { color: var(--blue); border-color: #8fb8da; background: #f3f8fc; }
-.traffic-order-summary { padding: 18px; display: flex; flex-direction: column; border: 1px solid #d7e4ee; border-radius: 5px; background: #f5f9fc; }
-.traffic-order-summary > span { color: var(--muted); font-size: 10px; }
-.traffic-order-summary > strong { margin: 5px 0 14px; font-size: 13px; }
-.traffic-order-summary > b { margin: 6px 0; color: #246fae; font-size: 29px; }
-.traffic-order-summary > small { color: var(--muted); font-size: 10px; }
-
-.traffic-scope { margin-top: 14px; display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--line); border-radius: 5px; }
-.traffic-scope span { min-height: 48px; display: flex; align-items: center; justify-content: center; gap: 7px; color: #526570; border-right: 1px solid var(--line); font-size: 11px; }
-.traffic-scope span:last-child { border-right: 0; }
-.traffic-scope svg { width: 14px; color: #347cb9; }
+.alarm-metrics{ grid-template-columns: repeat(4, 1fr); }
+.alarm-workspace, .system-workspace{ min-height: 0; overflow: hidden; }
+.alarm-layout{ min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) 285px; }
+.alarm-list{ min-width: 0; padding: 12px 16px; }
+.alarm-item{ min-height: 76px; padding: 12px 10px; display: grid; grid-template-columns: 42px minmax(0, 1fr) 66px 48px; align-items: center; gap: 10px; border-bottom: 1px solid var(--line); }
+.alarm-item > div{ min-width: 0; display: flex; flex-direction: column; gap: 5px; }
+.alarm-item strong{ overflow: hidden; color: #344550; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
+.alarm-item small{ overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
+.alarm-severity{ width: fit-content; padding: 4px 6px; border-radius: 3px; font-size: 10px; }
+.alarm-item.critical .alarm-severity{ color: #b33f43; background: #fdebec; }
+.alarm-item.medium .alarm-severity{ color: #a25f21; background: #fff0df; }
+.alarm-item.low .alarm-severity{ color: #496d88; background: #eaf1f6; }
+.alarm-handle{ height: 26px; border: 1px solid #c6d9eb; border-radius: 3px; color: var(--blue); background: #f4f8fc; font-size: 10px; }
+.alarm-side-panel{ border-left: 1px solid var(--line); background: #fafbfc; }
+.alarm-side-panel section{ padding: 17px 16px; border-bottom: 1px solid var(--line); }
+.alarm-side-panel h2{ margin: 0 0 15px; font-size: 13px; }
+.alarm-bars{ display: flex; flex-direction: column; gap: 13px; }
+.alarm-bars > div{ display: grid; grid-template-columns: 62px 1fr 16px; align-items: center; gap: 8px; }
+.alarm-bars span, .alarm-bars strong{ color: var(--muted); font-size: 10px; }
+.alarm-bars strong{ color: #41515d; text-align: right; }
+.alarm-bars b{ height: 6px; overflow: hidden; border-radius: 5px; background: #e8edf0; }
+.alarm-bars b i{ display: block; width: var(--value); height: 100%; border-radius: inherit; background: #d46a6d; }
+.alarm-tip{ margin: 0 0 14px; display: flex; align-items: flex-start; gap: 7px; color: #8b6329; font-size: 10px; line-height: 1.6; }
+.alarm-tip svg{ width: 14px; min-width: 14px; color: #b17b2e; }
+.system-panel{ display: none; min-height: 0; overflow: auto; }
+.system-panel.active{ display: block; }
+.system-grid{ display: grid; grid-template-columns: 1fr 1fr; }
+.settings-section{ padding: 19px 20px; border-bottom: 1px solid var(--line); }
+.system-grid .settings-section:nth-child(odd){ border-right: 1px solid var(--line); }
+.settings-heading{ display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; margin-bottom: 16px; }
+.settings-heading h2{ margin: 0 0 5px; font-size: 14px; }
+.settings-heading span{ color: var(--muted); font-size: 10px; }
+.account-profile{ min-height: 59px; padding: 10px; display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 9px; border: 1px solid var(--line); border-radius: 4px; }
+.account-profile > span, .member-avatar{ width: 30px; height: 30px; display: grid; place-items: center; border-radius: 4px; color: #fff; background: #347fc0; font-size: 13px; }
+.account-profile > div, .member-list > div > div{ min-width: 0; display: flex; flex-direction: column; gap: 4px; }
+.account-profile strong, .member-list strong{ font-size: 12px; }
+.account-profile small, .member-list small{ color: var(--muted); font-size: 10px; }
+.member-avatar.blue{ background: #6d7dba; }
+.service-status-list{ border-top: 1px solid var(--line); }
+.service-status-list > div{ min-height: 46px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--line); }
+.service-status-list span{ display: flex; align-items: center; gap: 7px; color: #465762; font-size: 11px; }
+.service-status-list span i{ width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
+.service-status-list strong, .audit-table i{ color: var(--green); font-size: 11px; font-weight: 500; }
+.audit-table{ border-top: 1px solid var(--line); }
+.audit-table > div{ min-height: 48px; display: grid; grid-template-columns: 130px 120px 1fr 45px; align-items: center; gap: 8px; border-bottom: 1px solid var(--line); }
+.audit-table span, .audit-table strong, .audit-table em, .audit-table i{ font-size: 10px; font-style: normal; }
+.audit-table span, .audit-table em{ color: var(--muted); }
+.account-workspace{ min-height: 0; overflow: auto; }
+.account-panel{ display: none; }
+.account-panel.active{ display: block; }
+.account-overview-grid{ display: grid; grid-template-columns: 1fr 1fr; }
+.account-info-block{ min-width: 0; padding: 20px; border-bottom: 1px solid var(--line); }
+.account-overview-grid .account-info-block:first-child{ border-right: 1px solid var(--line); }
+.account-section-heading{ display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 17px; }
+.account-section-heading h2{ margin: 0 0 5px; font-size: 14px; }
+.account-section-heading span{ color: var(--muted); font-size: 10px; }
+.tenant-identity{ min-height: 66px; padding: 11px; display: grid; grid-template-columns: 36px 1fr auto; align-items: center; gap: 10px; border: 1px solid var(--line); border-radius: 4px; }
+.tenant-identity > span{ width: 32px; height: 32px; display: grid; place-items: center; border-radius: 4px; color: #fff; background: #2f78bb; font-size: 16px; font-weight: 600; }
+.tenant-identity > div{ min-width: 0; display: flex; flex-direction: column; gap: 4px; }
+.tenant-identity strong{ font-size: 12px; }
+.tenant-identity small{ color: var(--muted); font-size: 10px; }
+.account-details{ margin: 14px 0 0; border-top: 1px solid var(--line); }
+.account-details > div{ min-height: 38px; display: grid; grid-template-columns: 82px 1fr; align-items: center; border-bottom: 1px solid var(--line); }
+.account-details dt{ color: var(--muted); font-size: 10px; }
+.account-details dd{ margin: 0; color: #3f505b; font-size: 11px; }
+.resource-progress{ display: flex; flex-direction: column; gap: 17px; }
+.resource-progress > div > span{ display: flex; justify-content: space-between; color: #52616d; font-size: 11px; }
+.resource-progress b{ color: #344651; font-weight: 500; }
+.resource-progress i{ display: block; height: 6px; margin-top: 7px; overflow: hidden; border-radius: 4px; background: #e7edf1; }
+.resource-progress em{ display: block; height: 100%; border-radius: inherit; background: #3d82bd; }
+.traffic-unit-price{ color: var(--blue); font-size: 17px; }
+.traffic-purchase-panel{ min-height: 390px; }
+.traffic-quick-amounts{ margin-top: 13px; display: grid; grid-template-columns: repeat(4, 1fr); gap: 7px; }
+.traffic-quick-amounts button{ min-height: 34px; border: 1px solid var(--line); border-radius: 4px; color: #526570; background: #fff; font-size: 11px; }
+.traffic-quick-amounts button:hover, .traffic-quick-amounts button.active{ color: var(--blue); border-color: #8fb8da; background: #f3f8fc; }
+.traffic-scope{ margin-top: 14px; display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--line); border-radius: 5px; }
+.traffic-scope span{ min-height: 48px; display: flex; align-items: center; justify-content: center; gap: 7px; color: #526570; border-right: 1px solid var(--line); font-size: 11px; }
+.traffic-scope span:last-child{ border-right: 0; }
+.traffic-scope svg{ width: 14px; color: #347cb9; }
@media (max-width: 760px) { .traffic-purchase-layout { grid-template-columns: 1fr; }.traffic-quick-amounts { grid-template-columns: repeat(2, 1fr); }.traffic-scope { grid-template-columns: 1fr; }.traffic-scope span { border-right: 0; border-bottom: 1px solid var(--line); }.traffic-scope span:last-child { border-bottom: 0; } }
-@media (max-width: 900px) { .control-workspace { grid-template-columns: 240px minmax(0, 1fr); }.control-status-band { grid-template-columns: repeat(3, 1fr); }.control-status-band > div:nth-child(3) { border-right: 0; }.control-command-grid.compact { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
-@media (max-width: 700px) { .control-workspace { grid-template-columns: 1fr; }.control-device-list { max-height: 270px; overflow: auto; }.control-status-band { grid-template-columns: repeat(2, 1fr); }.control-status-band > div:nth-child(2n) { border-right: 0; }.control-page-header { padding: 14px; } }
-
-.account-metrics > div:first-child strong { font-size: 25px; }
-.communication-warning-metric strong { color: #a96621; }
-.communication-danger-metric strong { color: #bd4046; }
-.account-identity-strip { min-height: 78px; padding: 10px 20px; display: grid; grid-template-columns: minmax(260px, 1.5fr) repeat(2, 1fr); align-items: center; gap: 18px; border-bottom: 1px solid var(--line); background: #fafbfc; }
-.account-identity-strip .tenant-identity { min-height: 54px; padding: 0; border: 0; background: transparent; }
-.account-identity-strip > div:not(.tenant-identity) { min-width: 0; display: flex; flex-direction: column; gap: 5px; }
-.account-identity-strip > div:not(.tenant-identity) span { color: var(--muted); font-size: 10px; }
-.account-identity-strip > div:not(.tenant-identity) strong { overflow: hidden; color: #3d4f5b; font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
-.account-resource-grid { padding: 18px; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
-.account-resource-card { min-width: 0; min-height: 300px; padding: 18px; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
-.resource-type-tag { padding: 4px 7px; border-radius: 3px; color: #276da9; background: #edf5fb; font-size: 10px; font-style: normal; white-space: nowrap; }
-.resource-type-tag.carrier { color: #55705f; background: #edf4ef; }
-.account-resource-value { padding: 16px 0 14px; border-bottom: 1px solid var(--line); }
-.account-resource-value > span { display: block; color: var(--muted); font-size: 10px; }
-.account-resource-value > strong { display: block; margin-top: 7px; color: #276da9; font-size: 34px; }
-.account-resource-value small { font-size: 12px; font-weight: 500; }
-.account-resource-meta { min-height: 57px; display: flex; align-items: center; gap: 30px; }
-.account-resource-meta span { color: var(--muted); font-size: 10px; }
-.account-resource-meta b { margin-left: 5px; color: #3c4e5a; font-size: 11px; font-weight: 500; }
-.account-card-actions { margin-top: 10px; display: flex; align-items: center; gap: 8px; }
-.communication-status-grid { margin: 2px 0 14px; display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--line); border-radius: 5px; }
-.communication-status-grid > div { min-height: 66px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; border-right: 1px solid var(--line); }
-.communication-status-grid > div:last-child { border-right: 0; }
-.communication-status-grid strong { font-size: 22px; }
-.communication-status-grid span { color: var(--muted); font-size: 10px; }
-.communication-alert { min-height: 48px; padding: 0 11px; display: flex; align-items: center; justify-content: space-between; gap: 10px; border: 1px solid #eccacc; border-radius: 4px; background: #fff7f7; }
-.communication-alert > span { display: flex; align-items: center; gap: 6px; color: #7f5154; font-size: 10px; }
-.communication-alert > span i { width: 6px; height: 6px; border-radius: 50%; background: #c4474c; }
-.communication-alert > span strong { color: #a43d42; font-size: 11px; }
-.communication-alert button { color: #b23e43; background: transparent; font-size: 10px; white-space: nowrap; }
-.cloud-media-panel { padding: 18px 20px 22px; }
-.cloud-media-stats { margin-bottom: 16px; display: grid; grid-template-columns: repeat(4, 1fr); border: 1px solid var(--line); border-radius: 5px; }
-.cloud-media-stats > div { min-height: 72px; padding: 12px 14px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border-right: 1px solid var(--line); }
-.cloud-media-stats > div:last-child { border-right: 0; }
-.cloud-media-stats span, .cloud-media-stats small { color: var(--muted); font-size: 10px; }
-.cloud-media-stats strong { color: #344955; font-size: 18px; }
-.cloud-purchase-layout { margin-bottom: 20px; }
-.account-subsection-title { padding: 15px 0 10px; display: flex; align-items: flex-end; justify-content: space-between; border-top: 1px solid var(--line); }
-.account-subsection-title h3 { margin: 0 0 4px; font-size: 13px; }
-.account-subsection-title span { color: var(--muted); font-size: 10px; }
-.communication-panel { min-width: 820px; }
-.communication-panel-head { min-height: 70px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; gap: 18px; border-bottom: 1px solid var(--line); }
-.communication-panel-head h2 { margin: 0 0 5px; font-size: 14px; }
-.communication-panel-head > div > span { color: var(--muted); font-size: 10px; }
-.communication-head-stats { display: flex; align-items: center; gap: 7px; }
-.communication-head-stats span { padding: 5px 8px; border-radius: 3px; color: #61717c; background: #f1f4f6; font-size: 10px; }
-.communication-head-stats span.normal { color: #34705b; background: #edf5f0; }
-.communication-head-stats span.warning { color: #996020; background: #fff4e5; }
-.communication-head-stats span.danger { color: #ad3d42; background: #fff0f0; }
-.communication-head-stats b { margin-left: 3px; font-size: 11px; }
-.communication-toolbar { min-height: 58px; }
-.communication-table-wrap { overflow: auto; }
-.communication-table { width: 100%; min-width: 1050px; border-collapse: collapse; table-layout: fixed; }
-.communication-table th { height: 39px; padding: 0 12px; color: var(--muted); background: #f7f8fa; font-size: 10px; font-weight: 500; text-align: left; }
-.communication-table th:first-child { width: 15%; }.communication-table th:nth-child(2) { width: 14%; }.communication-table th:nth-child(5) { width: 16%; }.communication-table th:last-child { width: 9%; }
-.communication-table td { height: 62px; padding: 9px 12px; border-bottom: 1px solid var(--line); color: #475965; font-size: 11px; vertical-align: middle; }
-.communication-table td > strong, .communication-table td > small { display: block; }
-.communication-table td > strong { color: #344752; font-size: 11px; }.communication-table td > small { margin-top: 4px; color: var(--muted); font-size: 10px; }
-.communication-table td:last-child button { color: var(--blue); background: transparent; font-size: 10px; white-space: nowrap; }
-.communication-table td:last-child button.urgent-action { color: #ba3f44; }
-.communication-usage { display: flex; flex-direction: column; gap: 6px; }
-.communication-usage span { color: #4b5d68; font-size: 10px; }
-.communication-usage i { height: 5px; overflow: hidden; border-radius: 4px; background: #e7ecef; }
-.communication-usage em { display: block; height: 100%; border-radius: inherit; background: #4384ba; }
-.communication-usage.warning em { background: #d58a31; }.communication-usage.danger em { background: #c4484d; }
-.carrier-status { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
-.carrier-status i { width: 6px; height: 6px; border-radius: 50%; }.carrier-status.normal i { background: var(--green); }.carrier-status.warning i { background: var(--orange); }.carrier-status.danger i { background: var(--red); }.carrier-status.owned i { background: #88959e; }
-.muted-cell { color: var(--muted); font-size: 10px; }
-.account-order-table { border-top: 1px solid var(--line); }
-.account-order-table > div { min-height: 52px; display: grid; grid-template-columns: 140px 125px minmax(210px, 1fr) 75px 80px 105px; align-items: center; gap: 10px; border-bottom: 1px solid var(--line); }
-.account-order-table .order-head { min-height: 38px; color: var(--muted); background: #f7f8fa; }
-.account-order-table span, .account-order-table strong, .account-order-table em { padding: 0 8px; color: #4a5b66; font-size: 10px; font-style: normal; font-weight: 500; }
-.account-order-table em { color: var(--green); }.account-order-table em.processing { color: #a46924; }
-.carrier-current-plan { min-height: 51px; margin-bottom: 15px; padding: 9px 11px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 5px; background: #f7f9fa; }
-.carrier-current-plan span { color: var(--muted); font-size: 10px; }.carrier-current-plan strong { color: #3b4d58; font-size: 12px; }
-.carrier-package-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 7px; }
-.carrier-package-grid button { min-height: 54px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 4px; color: #435560; background: #fff; }
-.carrier-package-grid button.active { color: #276ea9; border-color: #79a9d2; background: #f2f8fc; box-shadow: inset 0 0 0 1px #c4dced; }
-.carrier-package-grid strong { font-size: 12px; }.carrier-package-grid small { color: var(--muted); font-size: 10px; }
-.carrier-effective-row { min-height: 47px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--line); }
-.carrier-effective-row > span { color: #485a65; font-size: 11px; }.carrier-effective-row > div { display: flex; gap: 18px; }
-.carrier-effective-row label { margin: 0; display: flex; flex-direction: row; align-items: center; gap: 6px; color: #52636e; font-size: 10px; cursor: pointer; }
-.carrier-effective-row input { position: absolute; opacity: 0; }.carrier-effective-row i { width: 13px; height: 13px; border: 1px solid #b8c4cc; border-radius: 50%; background: #fff; }.carrier-effective-row input:checked + i { border-color: var(--blue); box-shadow: inset 0 0 0 3px #fff; background: var(--blue); }
-.carrier-recharge-total { min-height: 54px; padding: 0 2px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--line); }
-.carrier-recharge-total span { color: var(--muted); font-size: 11px; }.carrier-recharge-total strong { color: #276ea9; font-size: 24px; }
-.recharge-modal { width: min(440px, 100%); padding: 20px; border-radius: 7px; background: #fff; box-shadow: 0 22px 60px rgba(0,0,0,.23); text-align: left; transform: translateY(8px); transition: transform .18s ease; }
-.t-dialog.recharge-modal { padding: var(--td-comp-paddingTB-xxl) var(--td-comp-paddingLR-xxl); transform: none; box-shadow: none; }
-.t-dialog.recharge-modal .t-dialog__footer button + button { margin-left: 8px; }
-
-.modal-backdrop.open .recharge-modal { transform: translateY(0); }
-.recharge-modal h3 { margin: 0 0 5px; font-size: 16px; }
-.recharge-sub { margin: 0 0 16px; color: var(--muted); font-size: 11px; }
-.recharge-modal-footer { margin-top: 14px; display: flex; justify-content: flex-end; gap: 8px; }
-.recharge-modal-footer button { height: 36px; padding: 0 16px; border-radius: 5px; font-size: 12px; }
-.recharge-modal-footer .cancel { background: #fff; border: 1px solid var(--line); }
-.recharge-modal-footer .confirm { color: #fff; background: var(--blue); }
-.recharge-modal-footer .confirm:disabled { opacity: .6; cursor: not-allowed; }
+.communication-warning-metric strong{ color: #a96621; }
+.communication-danger-metric strong{ color: #bd4046; }
+.account-identity-strip{ min-height: 78px; padding: 10px 20px; display: grid; grid-template-columns: minmax(260px, 1.5fr) repeat(2, 1fr); align-items: center; gap: 18px; border-bottom: 1px solid var(--line); background: #fafbfc; }
+.account-identity-strip .tenant-identity{ min-height: 54px; padding: 0; border: 0; background: transparent; }
+.account-identity-strip > div:not(.tenant-identity){ min-width: 0; display: flex; flex-direction: column; gap: 5px; }
+.account-identity-strip > div:not(.tenant-identity) span{ color: var(--muted); font-size: 10px; }
+.account-identity-strip > div:not(.tenant-identity) strong{ overflow: hidden; color: #3d4f5b; font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
+.account-resource-grid{ padding: 18px; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
+.account-resource-card{ min-width: 0; min-height: 300px; padding: 18px; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
+.account-resource-value{ padding: 16px 0 14px; border-bottom: 1px solid var(--line); }
+.account-resource-value > span{ display: block; color: var(--muted); font-size: 10px; }
+.account-resource-value > strong{ display: block; margin-top: 7px; color: #276da9; font-size: 34px; }
+.account-resource-value small{ font-size: 12px; font-weight: 500; }
+.account-resource-meta{ min-height: 57px; display: flex; align-items: center; gap: 30px; }
+.account-resource-meta span{ color: var(--muted); font-size: 10px; }
+.account-resource-meta b{ margin-left: 5px; color: #3c4e5a; font-size: 11px; font-weight: 500; }
+.communication-alert{ min-height: 48px; padding: 0 11px; display: flex; align-items: center; justify-content: space-between; gap: 10px; border: 1px solid #eccacc; border-radius: 4px; background: #fff7f7; }
+.communication-alert > span{ display: flex; align-items: center; gap: 6px; color: #7f5154; font-size: 10px; }
+.communication-alert > span i{ width: 6px; height: 6px; border-radius: 50%; background: #c4474c; }
+.communication-alert > span strong{ color: #a43d42; font-size: 11px; }
+.communication-alert button{ color: #b23e43; background: transparent; font-size: 10px; white-space: nowrap; }
+.communication-panel{ min-width: 820px; }
+.communication-panel-head{ min-height: 70px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; gap: 18px; border-bottom: 1px solid var(--line); }
+.communication-panel-head h2{ margin: 0 0 5px; font-size: 14px; }
+.communication-panel-head > div > span{ color: var(--muted); font-size: 10px; }
+.communication-head-stats{ display: flex; align-items: center; gap: 7px; }
+.communication-head-stats span{ padding: 5px 8px; border-radius: 3px; color: #61717c; background: #f1f4f6; font-size: 10px; }
+.communication-head-stats span.normal{ color: #34705b; background: #edf5f0; }
+.communication-head-stats span.warning{ color: #996020; background: #fff4e5; }
+.communication-head-stats span.danger{ color: #ad3d42; background: #fff0f0; }
+.communication-head-stats b{ margin-left: 3px; font-size: 11px; }
+.communication-toolbar{ min-height: 58px; }
+.communication-table-wrap{ overflow: auto; }
+.communication-table{ width: 100%; min-width: 1050px; border-collapse: collapse; table-layout: fixed; }
+.communication-table th{ height: 39px; padding: 0 12px; color: var(--muted); background: #f7f8fa; font-size: 10px; font-weight: 500; text-align: left; }
+.communication-table th:first-child{ width: 15%; }
+.communication-table th:nth-child(2){ width: 14%; }
+.communication-table th:nth-child(5){ width: 16%; }
+.communication-table th:last-child{ width: 9%; }
+.communication-table td{ height: 62px; padding: 9px 12px; border-bottom: 1px solid var(--line); color: #475965; font-size: 11px; vertical-align: middle; }
+.communication-table td > strong, .communication-table td > small{ display: block; }
+.communication-table td > strong{ color: #344752; font-size: 11px; }
+.communication-table td > small{ margin-top: 4px; color: var(--muted); font-size: 10px; }
+.communication-table td:last-child button{ color: var(--blue); background: transparent; font-size: 10px; white-space: nowrap; }
+.communication-table td:last-child button.urgent-action{ color: #ba3f44; }
+.communication-usage{ display: flex; flex-direction: column; gap: 6px; }
+.communication-usage span{ color: #4b5d68; font-size: 10px; }
+.communication-usage i{ height: 5px; overflow: hidden; border-radius: 4px; background: #e7ecef; }
+.communication-usage em{ display: block; height: 100%; border-radius: inherit; background: #4384ba; }
+.communication-usage.warning em{ background: #d58a31; }
+.communication-usage.danger em{ background: #c4484d; }
+.account-order-table{ border-top: 1px solid var(--line); }
+.account-order-table > div{ min-height: 52px; display: grid; grid-template-columns: 140px 125px minmax(210px, 1fr) 75px 80px 105px; align-items: center; gap: 10px; border-bottom: 1px solid var(--line); }
+.account-order-table .order-head{ min-height: 38px; color: var(--muted); background: #f7f8fa; }
+.account-order-table span, .account-order-table strong, .account-order-table em{ padding: 0 8px; color: #4a5b66; font-size: 10px; font-style: normal; font-weight: 500; }
+.account-order-table em{ color: var(--green); }
+.account-order-table em.processing{ color: #a46924; }
+.carrier-current-plan{ min-height: 51px; margin-bottom: 15px; padding: 9px 11px; display: flex; flex-direction: column; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 5px; background: #f7f9fa; }
+.carrier-current-plan span{ color: var(--muted); font-size: 10px; }
+.carrier-current-plan strong{ color: #3b4d58; font-size: 12px; }
+.carrier-package-grid{ display: grid; grid-template-columns: repeat(4, 1fr); gap: 7px; }
+.carrier-package-grid button{ min-height: 54px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px; border: 1px solid var(--line); border-radius: 4px; color: #435560; background: #fff; }
+.carrier-package-grid button.active{ color: #276ea9; border-color: #79a9d2; background: #f2f8fc; box-shadow: inset 0 0 0 1px #c4dced; }
+.carrier-package-grid strong{ font-size: 12px; }
+.carrier-package-grid small{ color: var(--muted); font-size: 10px; }
+.carrier-effective-row{ min-height: 47px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--line); }
+.carrier-effective-row > span{ color: #485a65; font-size: 11px; }
+.carrier-effective-row > div{ display: flex; gap: 18px; }
+.carrier-effective-row label{ margin: 0; display: flex; flex-direction: row; align-items: center; gap: 6px; color: #52636e; font-size: 10px; cursor: pointer; }
+.carrier-effective-row input{ position: absolute; opacity: 0; }
+.carrier-effective-row i{ width: 13px; height: 13px; border: 1px solid #b8c4cc; border-radius: 50%; background: #fff; }
+.carrier-effective-row input:checked + i{ border-color: var(--blue); box-shadow: inset 0 0 0 3px #fff; background: var(--blue); }
+.carrier-recharge-total{ min-height: 54px; padding: 0 2px; display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--line); }
+.carrier-recharge-total span{ color: var(--muted); font-size: 11px; }
+.carrier-recharge-total strong{ color: #276ea9; font-size: 24px; }
@media (max-width: 900px) { .account-identity-strip { grid-template-columns: 1fr 1fr; }.account-resource-grid { grid-template-columns: 1fr; }.cloud-media-stats { grid-template-columns: repeat(2, 1fr); }.cloud-media-stats > div:nth-child(2) { border-right: 0; }.cloud-media-stats > div:nth-child(-n+2) { border-bottom: 1px solid var(--line); } }
@media (max-width: 620px) { .account-identity-strip { grid-template-columns: 1fr; }.communication-status-grid { grid-template-columns: repeat(3, 1fr); }.carrier-package-grid { grid-template-columns: repeat(2, 1fr); } }
-
-/* 非 monitor 页盖住全局地图;可点击子页根节点 */
-.replay-header,
-.replay-map-back,
-.replay-map-legend,
-.replay-telemetry,
-.replay-controller {
- pointer-events: auto;
-}
-
-.command-progress-float {
+.account-metrics{ grid-template-columns: repeat(4, 1fr); }
+.alarm-handle.t-button, .alarm-item .alarm-handle{ height: 26px; min-height: 26px; padding: 0 8px; border: 1px solid #c6d9eb; border-radius: 3px; color: var(--blue); background: #f4f8fc; font-size: 10px; line-height: 1; }
+.alarm-handle.t-button:hover, .alarm-item .alarm-handle:hover{ border-color: #8fb7d6; color: var(--blue); background: #edf4fb; }
+.security-list{ border-top: 1px solid var(--line); }
+.security-list > div{ width: 100%; min-height: 58px; padding: 0 4px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--line); }
+.security-list > div > span{ min-width: 0; display: flex; flex-direction: column; gap: 4px; }
+.security-list strong{ font-size: 12px; }
+.security-list small{ color: var(--muted); font-size: 10px; }
+.asset-table-wrap .command-cell, .command-cell{ min-width: 0; display: flex; flex-direction: column; gap: 3px; }
+.command-cell strong{ overflow: hidden; color: #283946; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; }
+.command-cell small{ overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }
+.table-status.processing i{ background: var(--blue); }
+.settings-list{ margin-top: 12px; border-top: 1px solid var(--line); }
+.settings-list > div{ min-height: 42px; display: grid; grid-template-columns: 82px 1fr auto; align-items: center; gap: 8px; border-bottom: 1px solid var(--line); }
+.settings-list span, .settings-list em{ color: var(--muted); font-size: 10px; font-style: normal; }
+.settings-list strong{ color: #40505c; font-size: 11px; font-weight: 500; }
+.settings-list button{ color: var(--blue); background: transparent; font-size: 10px; }
+.command-progress-float{
position: absolute;
right: 18px;
bottom: 56px;
@@ -980,17 +1067,17 @@ svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width:
color: #334553;
pointer-events: auto;
}
-.command-progress-float > header {
+.command-progress-float > header{
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
margin-bottom: 10px;
}
-.command-progress-float > header strong { display: block; font-size: 13px; }
-.command-progress-float > header small { color: var(--muted); font-size: 11px; }
-.command-progress-float ol { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
-.command-progress-float li {
+.command-progress-float > header strong{ display: block; font-size: 13px; }
+.command-progress-float > header small{ color: var(--muted); font-size: 11px; }
+.command-progress-float ol{ margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
+.command-progress-float li{
display: grid;
grid-template-columns: 14px 1fr auto;
align-items: center;
@@ -999,15 +1086,49 @@ svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width:
color: #7b8792;
font-size: 12px;
}
-.command-progress-float li i {
+.command-progress-float li i{
width: 10px; height: 10px; border-radius: 50%;
border: 1.5px solid #c0CAD3; background: #fff;
}
-.command-progress-float li.active { color: #1f5f9f; font-weight: 600; }
-.command-progress-float li.active i { border-color: #2d82da; background: #2d82da; }
-.command-progress-float li.done { color: #2f6b4f; }
-.command-progress-float li.done i { border-color: #2f9d6a; background: #2f9d6a; }
-.command-progress-float li.fail { color: #a53e45; }
-.command-progress-float li.fail i { border-color: #c8454b; background: #c8454b; }
-.command-progress-float li em { font-style: normal; color: var(--muted); font-size: 11px; }
+.command-progress-float li.active{ color: #1f5f9f; font-weight: 600; }
+.command-progress-float li.active i{ border-color: #2d82da; background: #2d82da; }
+.command-progress-float li.done{ color: #2f6b4f; }
+.command-progress-float li.done i{ border-color: #2f9d6a; background: #2f9d6a; }
+.command-progress-float li.fail{ color: #a53e45; }
+.command-progress-float li.fail i{ border-color: #c8454b; background: #c8454b; }
+.command-progress-float li em{ font-style: normal; color: var(--muted); font-size: 11px; }
+/* DialogPlugin confirm body (logout / danger confirms) */
+.ui-confirm-body{
+ color: var(--muted);
+ font-size: 12px;
+ line-height: 1.7;
+}
+.ui-confirm-body > p{
+ margin: 0;
+}
+.ui-confirm-checks{
+ margin-top: 16px;
+ padding: 11px;
+ display: flex;
+ justify-content: space-between;
+ gap: 6px;
+ border-radius: 5px;
+ background: var(--soft, #f4f7f9);
+}
+.ui-confirm-check{
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ color: #52616e;
+ font-size: 11px;
+ line-height: 1.4;
+}
+.ui-confirm-check::before{
+ content: '';
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--green, #2f9d6a);
+ flex-shrink: 0;
+}
diff --git a/src/utils/commonRefs.js b/src/utils/commonRefs.js
index 2c13b71..3e5bbab 100644
--- a/src/utils/commonRefs.js
+++ b/src/utils/commonRefs.js
@@ -57,4 +57,8 @@ class CommonRefs {
}
}
-export default new CommonRefs()
+const g = typeof globalThis !== 'undefined' ? globalThis : undefined
+const singleton = (g && g.__LAIC_COMMON_REFS__) || new CommonRefs()
+if (g) g.__LAIC_COMMON_REFS__ = singleton
+
+export default singleton
diff --git a/src/views/OperationLogsView/OperationLogsView.vue b/src/views/OperationLogsView/OperationLogsView.vue
index 535e0f8..132d0a6 100644
--- a/src/views/OperationLogsView/OperationLogsView.vue
+++ b/src/views/OperationLogsView/OperationLogsView.vue
@@ -34,7 +34,7 @@
empty="暂无设备操作记录"
>
- {{ row.commandName }}{{ row.commandType }}
+ {{ row.commandName }}{{ row.commandType }}
{{ row.statusName }}
diff --git a/vite.config.js b/vite.config.js
index 652cb2d..d347af1 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -30,12 +30,11 @@ export default defineConfig({
host: '0.0.0.0',
port: 5173,
proxy: {
- // 浏览器请求 /api/* → 后端 /*(去掉 /api 前缀)
+ // 浏览器请求 /api/* → http://119.3.111.201/api/*(远程网关保留 /api 前缀)
'/api': {
- target: 'http://192.168.10.29:8080',
+ target: 'http://119.3.111.201',
changeOrigin: true,
agent: proxyAgent,
- rewrite: (path) => path.replace(/^\/api/, ''),
},
},
},