|
|
@@ -2,7 +2,7 @@
|
|
|
驾驶舱外壳:唯一 /cockpit 路由的全部内容。
|
|
|
|
|
|
骨架与视觉参考《驾驶舱原型图-美化版》(切角面板 / 青色辉光 / 深空蓝底 / 全息地图壳),
|
|
|
- 但**不锁死 16:9**:页面铺满视口,中央一张图吃掉全部剩余宽高(大屏、超宽屏自动拉伸)。
|
|
|
+ 但不锁 16:9:页面铺满视口,**中央一张图作为整个主体的背景铺满**,左右两栏浮在图上。
|
|
|
|
|
|
语义按 ADR 0003 / 0007:四个一级模式、模式内 4 个二级面板同屏展示、无子视图切换。
|
|
|
一级模式只通过 uiStore.mode 切换,不新增路由、不重建外壳与地图节点。
|
|
|
@@ -106,7 +106,15 @@
|
|
|
</div>
|
|
|
|
|
|
<main class="cockpit-shell__main">
|
|
|
- <aside class="cockpit-shell__column" aria-label="左栏">
|
|
|
+ <!--
|
|
|
+ 中央一张图:铺满整个主体背景。常驻——不放在 v-for 内,也不加 v-if/key,
|
|
|
+ 一级模式切换只重渲染左右两栏,本节点保持原实例。
|
|
|
+ -->
|
|
|
+ <section class="cockpit-shell__map" aria-label="中央一张图">
|
|
|
+ <MapPlaceholder :mode-label="modeLabel(mode)" />
|
|
|
+ </section>
|
|
|
+
|
|
|
+ <aside class="cockpit-shell__column is-left" aria-label="左栏">
|
|
|
<CockpitPanel
|
|
|
v-for="panelId in columns.left"
|
|
|
:key="panelId"
|
|
|
@@ -119,15 +127,7 @@
|
|
|
</CockpitPanel>
|
|
|
</aside>
|
|
|
|
|
|
- <!--
|
|
|
- 中央一张图常驻:不放在 v-for 内,也不加 v-if/key。
|
|
|
- 一级模式切换只重渲染左右两栏,本节点保持原实例;尺寸随视口拉伸。
|
|
|
- -->
|
|
|
- <section class="cockpit-shell__map" aria-label="中央一张图">
|
|
|
- <MapPlaceholder :mode-label="modeLabel(mode)" />
|
|
|
- </section>
|
|
|
-
|
|
|
- <aside class="cockpit-shell__column" aria-label="右栏">
|
|
|
+ <aside class="cockpit-shell__column is-right" aria-label="右栏">
|
|
|
<CockpitPanel
|
|
|
v-for="panelId in columns.right"
|
|
|
:key="panelId"
|
|
|
@@ -197,7 +197,7 @@ onBeforeUnmount(() => {
|
|
|
/* ============================================================
|
|
|
主题令牌(原型图同名变量;子组件通过继承取用)
|
|
|
--u 是「设计像素」:1920 宽时为 1px,随视口线性放大、封顶 2px(4K 时正好一倍),
|
|
|
- 小于 1920 时不再缩小。这样 4K 大屏不会显得空旷,同时页面仍是铺满而非等比留边。
|
|
|
+ 小于 1920 时不再缩小。这样 4K 大屏不显空旷,同时页面仍是铺满而非等比留边。
|
|
|
============================================================ */
|
|
|
.cockpit-shell {
|
|
|
--u: clamp(1px, 0.0521vw, 2px);
|
|
|
@@ -221,12 +221,13 @@ onBeforeUnmount(() => {
|
|
|
|
|
|
position: relative;
|
|
|
display: grid;
|
|
|
- grid-template-rows: calc(74 * var(--u)) calc(46 * var(--u)) minmax(0, 1fr);
|
|
|
- gap: calc(8 * var(--u));
|
|
|
+ /* 顶栏 / 筛选条 / 主体:两条横栏压矮,把高度让给真正展示信息的主体 */
|
|
|
+ grid-template-rows: calc(52 * var(--u)) calc(34 * var(--u)) minmax(0, 1fr);
|
|
|
+ gap: calc(4 * var(--u));
|
|
|
width: 100%;
|
|
|
height: 100vh;
|
|
|
overflow: hidden;
|
|
|
- padding: calc(10 * var(--u)) calc(14 * var(--u)) calc(14 * var(--u));
|
|
|
+ padding: calc(8 * var(--u)) calc(12 * var(--u)) calc(12 * var(--u));
|
|
|
color: var(--text);
|
|
|
font: calc(13 * var(--u)) / 1.45 var(--font);
|
|
|
}
|
|
|
@@ -257,7 +258,7 @@ onBeforeUnmount(() => {
|
|
|
mask-image: radial-gradient(120% 90% at 50% 30%, #000 30%, transparent 88%);
|
|
|
}
|
|
|
|
|
|
-/* 只给真正的三行网格项加定位;不要用 `.cockpit-shell > *`,
|
|
|
+/* 只给真正的网格项加定位;不要用 `.cockpit-shell > *`,
|
|
|
否则会以同权重覆盖 .cockpit-shell__atmosphere 的 position: fixed。 */
|
|
|
.cockpit-shell__topbar,
|
|
|
.cockpit-shell__scope,
|
|
|
@@ -268,16 +269,14 @@ onBeforeUnmount(() => {
|
|
|
}
|
|
|
|
|
|
/* ============================================================
|
|
|
- 顶栏
|
|
|
+ 顶栏(压矮:56 设计像素)
|
|
|
============================================================ */
|
|
|
.cockpit-shell__topbar {
|
|
|
- position: relative;
|
|
|
display: grid;
|
|
|
- grid-template-columns: minmax(280px, 1fr) auto minmax(280px, 1fr);
|
|
|
+ grid-template-columns: minmax(240px, 1fr) auto minmax(240px, 1fr);
|
|
|
align-items: center;
|
|
|
- gap: calc(16 * var(--u));
|
|
|
- height: calc(74 * var(--u));
|
|
|
- padding: 0 calc(4 * var(--u));
|
|
|
+ gap: calc(12 * var(--u));
|
|
|
+ height: calc(56 * var(--u));
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__topbar-bg {
|
|
|
@@ -294,7 +293,7 @@ onBeforeUnmount(() => {
|
|
|
.cockpit-shell__wing {
|
|
|
position: absolute;
|
|
|
top: 50%;
|
|
|
- width: calc(210 * var(--u));
|
|
|
+ width: calc(170 * var(--u));
|
|
|
height: 2px;
|
|
|
pointer-events: none;
|
|
|
background: linear-gradient(90deg, transparent, rgba(79, 216, 255, 0.75));
|
|
|
@@ -313,28 +312,27 @@ onBeforeUnmount(() => {
|
|
|
box-shadow: 0 0 12px var(--cyan);
|
|
|
}
|
|
|
|
|
|
-.cockpit-shell__wing.is-left { left: calc(50% - 460px); }
|
|
|
+.cockpit-shell__wing.is-left { left: calc(50% - 400px); }
|
|
|
|
|
|
.cockpit-shell__wing.is-right {
|
|
|
- right: calc(50% - 460px);
|
|
|
+ right: calc(50% - 400px);
|
|
|
transform: scaleX(-1);
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__brand {
|
|
|
- position: relative;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- gap: calc(12 * var(--u));
|
|
|
+ gap: calc(10 * var(--u));
|
|
|
min-width: 0;
|
|
|
- padding-left: calc(8 * var(--u));
|
|
|
+ padding-left: calc(6 * var(--u));
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__mark {
|
|
|
display: grid;
|
|
|
place-items: center;
|
|
|
flex: none;
|
|
|
- width: calc(42 * var(--u));
|
|
|
- height: calc(42 * var(--u));
|
|
|
+ width: calc(32 * var(--u));
|
|
|
+ height: calc(32 * var(--u));
|
|
|
filter: drop-shadow(0 0 10px rgba(79, 216, 255, 0.6));
|
|
|
}
|
|
|
|
|
|
@@ -349,9 +347,9 @@ onBeforeUnmount(() => {
|
|
|
|
|
|
.cockpit-shell__brand-text strong {
|
|
|
display: block;
|
|
|
- font-size: calc(25 * var(--u));
|
|
|
+ font-size: calc(21 * var(--u));
|
|
|
font-weight: 700;
|
|
|
- letter-spacing: 0.13em;
|
|
|
+ letter-spacing: 0.12em;
|
|
|
white-space: nowrap;
|
|
|
background: linear-gradient(180deg, #ffffff 8%, #bfeaff 52%, #4fb6e8 100%);
|
|
|
-webkit-background-clip: text;
|
|
|
@@ -362,15 +360,14 @@ onBeforeUnmount(() => {
|
|
|
|
|
|
.cockpit-shell__brand-text em {
|
|
|
display: block;
|
|
|
- margin-top: 2px;
|
|
|
+ margin-top: 1px;
|
|
|
color: var(--muted);
|
|
|
- font-size: calc(10.5 * var(--u));
|
|
|
+ font-size: calc(9.5 * var(--u));
|
|
|
font-style: normal;
|
|
|
- letter-spacing: 0.24em;
|
|
|
+ letter-spacing: 0.2em;
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__modes {
|
|
|
- position: relative;
|
|
|
display: flex;
|
|
|
gap: calc(4 * var(--u));
|
|
|
justify-content: center;
|
|
|
@@ -378,16 +375,16 @@ onBeforeUnmount(() => {
|
|
|
|
|
|
.cockpit-shell__mode {
|
|
|
position: relative;
|
|
|
- min-height: calc(38 * var(--u));
|
|
|
- padding: calc(9 * var(--u)) calc(26 * var(--u));
|
|
|
+ min-height: calc(30 * var(--u));
|
|
|
+ padding: calc(6 * var(--u)) calc(20 * var(--u));
|
|
|
border: 0;
|
|
|
color: #a9cde4;
|
|
|
font: inherit;
|
|
|
- font-size: calc(15 * var(--u));
|
|
|
- letter-spacing: 0.12em;
|
|
|
+ font-size: calc(13.5 * var(--u));
|
|
|
+ letter-spacing: 0.1em;
|
|
|
text-shadow: 0 1px 3px rgba(0, 12, 24, 0.9);
|
|
|
background: linear-gradient(180deg, rgba(20, 66, 108, 0.6), rgba(8, 30, 54, 0.2));
|
|
|
- clip-path: polygon(11px 0, calc(100% - 11px) 0, 100% 100%, 0 100%);
|
|
|
+ clip-path: polygon(9px 0, calc(100% - 9px) 0, 100% 100%, 0 100%);
|
|
|
cursor: pointer;
|
|
|
transition: color 0.18s, background 0.18s, filter 0.18s;
|
|
|
}
|
|
|
@@ -415,27 +412,26 @@ onBeforeUnmount(() => {
|
|
|
position: absolute;
|
|
|
left: 26%;
|
|
|
right: 26%;
|
|
|
- bottom: 3px;
|
|
|
+ bottom: 2px;
|
|
|
height: 2px;
|
|
|
background: #cdf3ff;
|
|
|
box-shadow: 0 0 10px #7fe0ff, 0 0 20px #4fd8ff;
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__top-meta {
|
|
|
- position: relative;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: flex-end;
|
|
|
- gap: calc(14 * var(--u));
|
|
|
- padding-right: calc(10 * var(--u));
|
|
|
+ gap: calc(10 * var(--u));
|
|
|
+ padding-right: calc(8 * var(--u));
|
|
|
color: var(--text-2);
|
|
|
- font-size: calc(12 * var(--u));
|
|
|
+ font-size: calc(11 * var(--u));
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__clock {
|
|
|
font-family: var(--num);
|
|
|
- font-size: calc(15 * var(--u));
|
|
|
+ font-size: calc(13 * var(--u));
|
|
|
letter-spacing: 0.06em;
|
|
|
color: #d7f1ff;
|
|
|
text-shadow: 0 0 12px rgba(79, 216, 255, 0.55);
|
|
|
@@ -444,20 +440,20 @@ onBeforeUnmount(() => {
|
|
|
.cockpit-shell__meta {
|
|
|
margin: 0;
|
|
|
color: var(--muted);
|
|
|
- font-size: calc(11.5 * var(--u));
|
|
|
+ font-size: calc(10.5 * var(--u));
|
|
|
letter-spacing: 0.06em;
|
|
|
}
|
|
|
|
|
|
/* ============================================================
|
|
|
- 全局筛选条
|
|
|
+ 全局筛选条(压矮:38 设计像素)
|
|
|
============================================================ */
|
|
|
.cockpit-shell__scope {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
|
- gap: calc(12 * var(--u));
|
|
|
+ gap: calc(10 * var(--u));
|
|
|
overflow: hidden;
|
|
|
- padding: 0 calc(12 * var(--u));
|
|
|
+ padding: 0 calc(10 * var(--u));
|
|
|
border: 1px solid rgba(58, 170, 226, 0.24);
|
|
|
background: linear-gradient(180deg, rgba(7, 30, 54, 0.72), rgba(4, 15, 28, 0.88));
|
|
|
box-shadow: inset 0 1px 0 rgba(120, 220, 255, 0.1), var(--shadow);
|
|
|
@@ -467,14 +463,14 @@ onBeforeUnmount(() => {
|
|
|
.cockpit-shell__scope-right {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- gap: calc(8 * var(--u));
|
|
|
+ gap: calc(6 * var(--u));
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__scope-label {
|
|
|
color: var(--muted);
|
|
|
- font-size: calc(11 * var(--u));
|
|
|
- letter-spacing: 0.1em;
|
|
|
+ font-size: calc(10 * var(--u));
|
|
|
+ letter-spacing: 0.08em;
|
|
|
}
|
|
|
|
|
|
.cockpit-shell__chips {
|
|
|
@@ -484,8 +480,8 @@ onBeforeUnmount(() => {
|
|
|
|
|
|
.cockpit-shell__divider {
|
|
|
width: 1px;
|
|
|
- height: calc(18 * var(--u));
|
|
|
- margin: 0 calc(4 * var(--u));
|
|
|
+ height: calc(16 * var(--u));
|
|
|
+ margin: 0 calc(3 * var(--u));
|
|
|
background: linear-gradient(180deg, transparent, rgba(79, 216, 255, 0.5), transparent);
|
|
|
}
|
|
|
|
|
|
@@ -493,14 +489,15 @@ onBeforeUnmount(() => {
|
|
|
.cockpit-shell__chip {
|
|
|
display: inline-flex;
|
|
|
align-items: center;
|
|
|
- padding: calc(3 * var(--u)) calc(11 * var(--u));
|
|
|
+ padding: calc(2 * var(--u)) calc(9 * var(--u));
|
|
|
border: 1px solid rgba(58, 170, 226, 0.32);
|
|
|
background: rgba(8, 34, 60, 0.6);
|
|
|
color: #9dc2d9;
|
|
|
font: inherit;
|
|
|
- font-size: calc(11.5 * var(--u));
|
|
|
- letter-spacing: 0.05em;
|
|
|
- clip-path: polygon(5px 0, 100% 0, 100% calc(100% - 5px), calc(100% - 5px) 100%, 0 100%, 0 5px);
|
|
|
+ font-size: calc(10.5 * var(--u));
|
|
|
+ letter-spacing: 0.04em;
|
|
|
+ white-space: nowrap;
|
|
|
+ clip-path: polygon(4px 0, 100% 0, 100% calc(100% - 4px), calc(100% - 4px) 100%, 0 100%, 0 4px);
|
|
|
cursor: pointer;
|
|
|
transition: all 0.16s;
|
|
|
}
|
|
|
@@ -526,32 +523,45 @@ onBeforeUnmount(() => {
|
|
|
|
|
|
.cockpit-shell__scope-note {
|
|
|
color: var(--muted);
|
|
|
- font-size: calc(11 * var(--u));
|
|
|
+ font-size: calc(10 * var(--u));
|
|
|
letter-spacing: 0.04em;
|
|
|
}
|
|
|
|
|
|
/* ============================================================
|
|
|
- 主体:左右侧栏 + 中央一张图(铺满,地图吃掉剩余宽高)
|
|
|
+ 主体:一张图铺满背景,左右两栏浮在图上
|
|
|
============================================================ */
|
|
|
.cockpit-shell__main {
|
|
|
- display: grid;
|
|
|
- grid-template-columns: clamp(300px, calc(322 * var(--u)), 560px) minmax(0, 1fr) clamp(300px, calc(322 * var(--u)), 560px);
|
|
|
- gap: calc(8 * var(--u));
|
|
|
+ position: relative;
|
|
|
min-height: 0;
|
|
|
}
|
|
|
|
|
|
+.cockpit-shell__map {
|
|
|
+ position: absolute;
|
|
|
+ inset: 0;
|
|
|
+ z-index: 0;
|
|
|
+}
|
|
|
+
|
|
|
.cockpit-shell__column {
|
|
|
- display: grid;
|
|
|
- grid-template-rows: 1fr 1fr;
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ z-index: 2;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
gap: calc(8 * var(--u));
|
|
|
+ width: clamp(280px, calc(300 * var(--u)), 460px);
|
|
|
min-height: 0;
|
|
|
+ pointer-events: none;
|
|
|
}
|
|
|
|
|
|
-.cockpit-shell__map {
|
|
|
- min-height: 0;
|
|
|
- height: 100%;
|
|
|
+.cockpit-shell__column > * {
|
|
|
+ pointer-events: auto;
|
|
|
}
|
|
|
|
|
|
+.cockpit-shell__column.is-left { left: 0; }
|
|
|
+
|
|
|
+.cockpit-shell__column.is-right { right: 0; }
|
|
|
+
|
|
|
.cockpit-shell__placeholder {
|
|
|
margin: 0;
|
|
|
color: var(--muted);
|