release: bump version to 0.25.3

This commit is contained in:
rayd1o
2026-04-11 03:42:35 +08:00
parent 60ed88b609
commit 10e2bae8c2
21 changed files with 410 additions and 179 deletions

View File

@@ -1 +1 @@
0.25.2 0.25.3

View File

@@ -7,6 +7,28 @@ This project follows the repository versioning rule:
- `feature` -> `+0.1.0` - `feature` -> `+0.1.0`
- `bugfix` -> `+0.0.1` - `bugfix` -> `+0.0.1`
## 0.25.3
Released: 2026-04-11
### Highlights
- Refined the Earth HUD visual system into a calmer operator-facing style, turned the top-left Earth brand into a real reusable component with language-driven rendering, and cleaned up duplicated brand assets so the page now has a single source of truth for HUD branding.
### Added
- Added [frontend/public/earth/js/brand.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/brand.js) as a reusable Earth `brand` component that renders the top-left logo/title/subtitle block from a shared config instead of hardcoding the structure in HTML.
- Added [frontend/public/earth/assets/brand/earth-logo.svg](/home/ray/dev/linkong/planet/frontend/public/earth/assets/brand/earth-logo.svg), [frontend/public/earth/assets/brand/title-zh.svg](/home/ray/dev/linkong/planet/frontend/public/earth/assets/brand/title-zh.svg), and [frontend/public/earth/assets/brand/title-en.svg](/home/ray/dev/linkong/planet/frontend/public/earth/assets/brand/title-en.svg) as the canonical Earth brand asset set.
### Improved
- Improved [frontend/public/earth/css/base.css](/home/ray/dev/linkong/planet/frontend/public/earth/css/base.css), [frontend/public/earth/css/hud.css](/home/ray/dev/linkong/planet/frontend/public/earth/css/hud.css), [frontend/public/earth/css/coordinates-display.css](/home/ray/dev/linkong/planet/frontend/public/earth/css/coordinates-display.css), [frontend/public/earth/css/legend.css](/home/ray/dev/linkong/planet/frontend/public/earth/css/legend.css), [frontend/public/earth/css/earth-stats.css](/home/ray/dev/linkong/planet/frontend/public/earth/css/earth-stats.css), and [frontend/public/earth/css/toolbar.css](/home/ray/dev/linkong/planet/frontend/public/earth/css/toolbar.css) by rebalancing the Earth HUD into a more restrained deep-blue control-room look instead of the earlier over-layered glass-and-neon mix.
- Improved [frontend/public/earth/index.html](/home/ray/dev/linkong/planet/frontend/public/earth/index.html), [frontend/public/earth/js/main.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/main.js), and [frontend/public/earth/js/constants.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/constants.js) by moving the Earth brand mount to a dedicated root and letting `HUD_CONFIG.brandLanguage` choose between `zh` and `en` without embedding the language decision in the DOM.
### Fixed
- Fixed [frontend/public/earth/css/info-panel.css](/home/ray/dev/linkong/planet/frontend/public/earth/css/info-panel.css) so the Earth brand area now uses consistent `earth-brand` component selectors and English-specific typography hooks, avoiding the earlier one-off `brand-banner` naming drift and duplicated title styles.
## 0.25.2 ## 0.25.2
Released: 2026-04-10 Released: 2026-04-10

View File

@@ -16,7 +16,7 @@
## Current Version ## Current Version
- `main` 当前主线历史推导到:`0.16.5` - `main` 当前主线历史推导到:`0.16.5`
- `dev` 当前开发分支历史推导到:`0.25.2` - `dev` 当前开发分支历史推导到:`0.25.3`
## Timeline ## Timeline
@@ -84,6 +84,7 @@
| `0.25.0` | feature | `dev` | `89a71e6f` | add persistent backend-backed AI Playground chat state, split alert workspaces into dedicated pages, and establish the situational-awareness foundation for later multi-signal analysis | | `0.25.0` | feature | `dev` | `89a71e6f` | add persistent backend-backed AI Playground chat state, split alert workspaces into dedicated pages, and establish the situational-awareness foundation for later multi-signal analysis |
| `0.25.1` | bugfix | `dev` | `pending` | clean duplicated Playground flow code, add reusable code-hygiene rules, and fix first-level sidebar menu expansion behavior across route navigation and refresh | | `0.25.1` | bugfix | `dev` | `pending` | clean duplicated Playground flow code, add reusable code-hygiene rules, and fix first-level sidebar menu expansion behavior across route navigation and refresh |
| `0.25.2` | bugfix | `dev` | `pending` | refine Earth settings modal sizing, eliminate first-frame HUD scale flicker, and make dragged HUD panels animate cleanly through maximized layout transitions | | `0.25.2` | bugfix | `dev` | `pending` | refine Earth settings modal sizing, eliminate first-frame HUD scale flicker, and make dragged HUD panels animate cleanly through maximized layout transitions |
| `0.25.3` | bugfix | `dev` | `pending` | refactor the Earth HUD visual system, extract the top-left Earth brand into a reusable language-driven component, and consolidate duplicated brand assets into a single canonical set |
## Maintenance Commits Not Counted as Version Bumps ## Maintenance Commits Not Counted as Version Bumps

View File

@@ -1,6 +1,6 @@
{ {
"name": "planet-frontend", "name": "planet-frontend",
"version": "0.25.2", "version": "0.25.3",
"private": true, "private": true,
"packageManager": "bun@1", "packageManager": "bun@1",
"dependencies": { "dependencies": {

View File

@@ -0,0 +1,9 @@
Earth brand runtime assets live in this folder.
- `earth-logo.png`
- `title-zh.png`
- `title-en.png`
These runtime images were generated from the uploaded SVG artwork so the Earth
page can keep the intended look without tracking unusually large pixel-rect SVG
exports in Git history.

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@@ -9,23 +9,37 @@
:root { :root {
--hud-scale: 1; --hud-scale: 1;
--hud-offset: calc(20px * var(--hud-scale)); --hud-offset: calc(20px * var(--hud-scale));
--hud-radius: calc(20px * var(--hud-scale)); --hud-radius: calc(22px * var(--hud-scale));
--hud-panel-padding: calc(16px * var(--hud-scale)); --hud-panel-padding: calc(18px * var(--hud-scale));
--hud-panel-padding-sm: calc(12px * var(--hud-scale)); --hud-panel-padding-sm: calc(13px * var(--hud-scale));
--hud-gap-xs: calc(6px * var(--hud-scale)); --hud-gap-xs: calc(7px * var(--hud-scale));
--hud-gap-sm: calc(10px * var(--hud-scale)); --hud-gap-sm: calc(11px * var(--hud-scale));
--hud-gap-md: calc(14px * var(--hud-scale)); --hud-gap-md: calc(16px * var(--hud-scale));
--hud-gap-lg: calc(18px * var(--hud-scale)); --hud-gap-lg: calc(22px * var(--hud-scale));
--hud-font-size: calc(0.88rem * var(--hud-scale)); --hud-font-size: calc(0.88rem * var(--hud-scale));
--hud-font-size-sm: calc(0.76rem * var(--hud-scale)); --hud-font-size-sm: calc(0.75rem * var(--hud-scale));
--hud-title-size: calc(1.05rem * var(--hud-scale)); --hud-title-size: calc(1.02rem * var(--hud-scale));
--hud-border: rgba(225, 242, 255, 0.2); --hud-kicker-size: calc(0.68rem * var(--hud-scale));
--hud-border-hover: rgba(236, 248, 255, 0.34); --hud-surface-top: rgba(17, 31, 53, 0.84);
--hud-border-active: rgba(240, 249, 255, 0.5); --hud-surface-bottom: rgba(7, 17, 31, 0.76);
--glass-fill-top: rgba(255, 255, 255, 0.14); --hud-surface-overlay: rgba(157, 204, 255, 0.07);
--glass-fill-bottom: rgba(118, 200, 255, 0.08); --hud-border: rgba(201, 225, 247, 0.14);
--glass-shadow: 0 18px 34px rgba(0, 0, 0, 0.22); --hud-border-hover: rgba(226, 238, 250, 0.24);
--glass-glow: 0 0 26px rgba(145, 214, 255, 0.18); --hud-border-active: rgba(235, 244, 255, 0.32);
--hud-shadow: 0 18px 46px rgba(1, 7, 16, 0.34);
--hud-shadow-soft: 0 10px 28px rgba(3, 10, 22, 0.22);
--hud-highlight: rgba(248, 252, 255, 0.14);
--hud-line: rgba(197, 220, 242, 0.1);
--hud-title: #dbe8f5;
--hud-text: #eef4fb;
--hud-text-muted: #8ea3ba;
--hud-text-soft: #6f849b;
--hud-accent: #91baff;
--hud-accent-strong: #d7e8ff;
--glass-fill-top: rgba(255, 255, 255, 0.08);
--glass-fill-bottom: rgba(109, 157, 214, 0.04);
--glass-shadow: 0 16px 36px rgba(0, 0, 0, 0.2);
--glass-glow: 0 0 18px rgba(123, 176, 236, 0.08);
} }
* { * {

View File

@@ -4,28 +4,30 @@
top: var(--hud-offset); top: var(--hud-offset);
right: var(--hud-offset); right: var(--hud-offset);
border-radius: var(--hud-radius); border-radius: var(--hud-radius);
padding: var(--hud-panel-padding-sm) var(--hud-panel-padding); padding: calc(14px * var(--hud-scale)) var(--hud-panel-padding);
z-index: 10; z-index: 10;
font-size: var(--hud-font-size); font-size: var(--hud-font-size);
min-width: calc(180px * var(--hud-scale)); min-width: calc(196px * var(--hud-scale));
} }
.hud-panel-coordinates .coord-item { .hud-panel-coordinates .coord-item {
margin-bottom: var(--hud-gap-xs); margin-bottom: calc(8px * var(--hud-scale));
} }
.hud-panel-coordinates .earth-zoom-level { .hud-panel-coordinates .earth-zoom-level {
margin-top: var(--hud-gap-xs); margin-top: calc(10px * var(--hud-scale));
color: #ffff44; padding-top: calc(10px * var(--hud-scale));
font-weight: 500; border-top: 1px solid var(--hud-line);
color: var(--hud-accent);
font-weight: 600;
text-align: center; text-align: center;
font-size: calc(1rem * var(--hud-scale)); font-size: calc(0.94rem * var(--hud-scale));
letter-spacing: 0.02em;
} }
.hud-panel-coordinates .earth-mouse-coords { .hud-panel-coordinates .earth-mouse-coords {
font-size: var(--hud-font-size-sm); font-size: var(--hud-font-size-sm);
color: #aaa; color: var(--hud-text-muted);
margin-top: var(--hud-gap-xs); margin-top: calc(8px * var(--hud-scale));
padding-top: var(--hud-gap-xs); line-height: 1.45;
border-top: 1px solid rgba(255, 255, 255, 0.1);
} }

View File

@@ -5,11 +5,22 @@
right: var(--hud-offset); right: var(--hud-offset);
border-radius: var(--hud-radius); border-radius: var(--hud-radius);
padding: var(--hud-panel-padding); padding: var(--hud-panel-padding);
width: calc(250px * var(--hud-scale)); width: calc(264px * var(--hud-scale));
z-index: 10; z-index: 10;
font-size: var(--hud-font-size); font-size: var(--hud-font-size);
} }
.hud-panel-stats .stats-item { .hud-panel-stats .stats-item {
margin-bottom: var(--hud-gap-sm); margin-bottom: 0;
padding: calc(9px * var(--hud-scale)) 0;
border-bottom: 1px solid rgba(214, 229, 245, 0.06);
}
.hud-panel-stats .stats-item:last-child {
border-bottom: none;
padding-bottom: 0;
}
.hud-panel-stats .stats-item:first-of-type {
padding-top: 0;
} }

View File

@@ -5,28 +5,28 @@
overflow: hidden; overflow: hidden;
isolation: isolate; isolation: isolate;
background: background:
radial-gradient(circle at 24% 12%, rgba(255, 255, 255, 0.12), transparent 28%), radial-gradient(circle at 18% 0%, rgba(255, 255, 255, 0.08), transparent 30%),
radial-gradient(circle at 78% 115%, rgba(255, 255, 255, 0.06), transparent 32%), radial-gradient(circle at 86% 115%, rgba(145, 186, 255, 0.08), transparent 36%),
linear-gradient(180deg, rgba(255, 255, 255, 0.14), rgba(110, 176, 255, 0.06)), linear-gradient(180deg, rgba(255, 255, 255, 0.05), transparent 26%),
rgba(7, 18, 36, 0.28); linear-gradient(180deg, var(--hud-surface-top), var(--hud-surface-bottom));
border: 1px solid rgba(225, 242, 255, 0.2); border: 1px solid var(--hud-border);
box-shadow: box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.14), inset 0 1px 0 var(--hud-highlight),
inset 0 -1px 0 rgba(255, 255, 255, 0.04), inset 0 -1px 0 rgba(255, 255, 255, 0.03),
0 18px 40px rgba(0, 0, 0, 0.24), var(--hud-shadow),
0 0 32px rgba(120, 200, 255, 0.12); 0 0 0 1px rgba(255, 255, 255, 0.02);
backdrop-filter: blur(20px) saturate(145%); backdrop-filter: blur(18px) saturate(125%);
-webkit-backdrop-filter: blur(20px) saturate(145%); -webkit-backdrop-filter: blur(18px) saturate(125%);
} }
.hud-panel::before { .hud-panel::before {
content: ''; content: '';
position: absolute; position: absolute;
inset: 1px 1px 24% 1px; inset: 1px 1px 52% 1px;
border-radius: inherit; border-radius: inherit;
background: background:
linear-gradient(180deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.05) 26%, transparent 70%); linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.02) 58%, transparent 100%);
opacity: 0.46; opacity: 0.52;
pointer-events: none; pointer-events: none;
} }
@@ -34,13 +34,13 @@
content: ''; content: '';
position: absolute; position: absolute;
inset: -1px; inset: -1px;
padding: 1.4px; padding: 1px;
border-radius: inherit; border-radius: inherit;
background: background:
linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(170, 223, 255, 0.2) 34%, rgba(88, 169, 255, 0.14) 68%, rgba(255, 255, 255, 0.24)); linear-gradient(135deg, rgba(244, 249, 255, 0.22), rgba(164, 194, 226, 0.08) 36%, rgba(90, 123, 161, 0.04) 70%, rgba(255, 255, 255, 0.16));
opacity: 0.78; opacity: 0.72;
pointer-events: none; pointer-events: none;
filter: url(#liquid-glass-distortion) blur(0.35px); filter: blur(0.2px);
-webkit-mask: -webkit-mask:
linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0) content-box,
linear-gradient(#000 0 0); linear-gradient(#000 0 0);
@@ -57,9 +57,11 @@
} }
.hud-panel-title { .hud-panel-title {
color: #4db8ff; color: var(--hud-title);
margin: 0 0 var(--hud-gap-sm); margin: 0 0 var(--hud-gap-sm);
font-size: var(--hud-title-size); font-size: var(--hud-title-size);
font-weight: 600;
letter-spacing: 0.01em;
line-height: 1.2; line-height: 1.2;
} }
@@ -69,6 +71,8 @@
justify-content: space-between; justify-content: space-between;
gap: var(--hud-gap-sm); gap: var(--hud-gap-sm);
margin-bottom: var(--hud-gap-sm); margin-bottom: var(--hud-gap-sm);
padding-bottom: var(--hud-gap-sm);
border-bottom: 1px solid var(--hud-line);
} }
.hud-panel-header .hud-panel-title { .hud-panel-header .hud-panel-title {
@@ -90,15 +94,20 @@
height: calc(var(--hud-title-size) * 1.24); height: calc(var(--hud-title-size) * 1.24);
min-width: calc(var(--hud-title-size) * 1.24); min-width: calc(var(--hud-title-size) * 1.24);
padding: 0; padding: 0;
border: 0; border: 1px solid rgba(220, 234, 248, 0.08);
border-radius: 999px; border-radius: 999px;
background: rgba(255, 255, 255, 0.08); background: rgba(255, 255, 255, 0.04);
color: #d9efff; color: var(--hud-text-muted);
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: background 0.18s ease, transform 0.18s ease, opacity 0.18s ease; transition:
background 0.18s ease,
border-color 0.18s ease,
color 0.18s ease,
transform 0.18s ease,
opacity 0.18s ease;
} }
.hud-panel-close .material-symbols-rounded { .hud-panel-close .material-symbols-rounded {
@@ -107,8 +116,10 @@
} }
.hud-panel-close:hover { .hud-panel-close:hover {
background: rgba(255, 255, 255, 0.14); background: rgba(255, 255, 255, 0.08);
transform: scale(1.04); border-color: rgba(225, 239, 255, 0.14);
color: var(--hud-accent-strong);
transform: translateY(-1px);
} }
.hud-panel.is-dragging { .hud-panel.is-dragging {
@@ -132,15 +143,19 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
gap: var(--hud-gap-sm); gap: var(--hud-gap-sm);
align-items: baseline;
} }
.hud-panel-label { .hud-panel-label {
color: #aaa; color: var(--hud-text-soft);
font-size: var(--hud-font-size-sm);
letter-spacing: 0.08em;
text-transform: uppercase;
} }
.hud-panel-value { .hud-panel-value {
color: #4db8ff; color: var(--hud-text);
font-weight: 500; font-weight: 600;
} }
.hud-error-message { .hud-error-message {
@@ -159,15 +174,16 @@
top: 20px; top: 20px;
left: 50%; left: 50%;
transform: translate(-50%, -18px); transform: translate(-50%, -18px);
background-color: rgba(10, 10, 30, 0.85); background:
border-radius: 10px; linear-gradient(180deg, rgba(18, 31, 52, 0.92), rgba(8, 18, 32, 0.9));
padding: 10px 15px; border-radius: 14px;
padding: 11px 15px;
z-index: 210; z-index: 210;
box-shadow: 0 0 20px rgba(0, 150, 255, 0.3); box-shadow: var(--hud-shadow-soft);
border: 1px solid rgba(0, 150, 255, 0.2); border: 1px solid var(--hud-border);
font-size: 0.9rem; font-size: 0.9rem;
display: none; display: none;
backdrop-filter: blur(5px); backdrop-filter: blur(10px);
text-align: center; text-align: center;
min-width: 180px; min-width: 180px;
opacity: 0; opacity: 0;
@@ -182,31 +198,32 @@
} }
.earth-status-message.success { .earth-status-message.success {
color: #44ff44; color: #d8f7df;
border-left: 3px solid #44ff44; border-left: 3px solid #66d18f;
} }
.earth-status-message.warning { .earth-status-message.warning {
color: #ffff44; color: #fff2c3;
border-left: 3px solid #ffff44; border-left: 3px solid #e4c464;
} }
.earth-status-message.error { .earth-status-message.error {
color: #ff4444; color: #ffd4d7;
border-left: 3px solid #ff4444; border-left: 3px solid #ff7b86;
} }
.earth-tooltip { .earth-tooltip {
position: absolute; position: absolute;
background-color: rgba(10, 10, 30, 0.95); background:
border: 1px solid #4db8ff; linear-gradient(180deg, rgba(21, 37, 61, 0.96), rgba(8, 18, 31, 0.95));
border-radius: 5px; border: 1px solid rgba(214, 230, 247, 0.14);
padding: 5px 10px; border-radius: 10px;
font-size: 0.8rem; padding: 8px 12px;
color: #fff; font-size: 0.78rem;
color: var(--hud-text);
pointer-events: none; pointer-events: none;
z-index: 100; z-index: 100;
box-shadow: 0 0 10px rgba(77, 184, 255, 0.3); box-shadow: var(--hud-shadow-soft);
display: none; display: none;
user-select: none; user-select: none;
} }
@@ -225,9 +242,9 @@
.earth-settings-backdrop { .earth-settings-backdrop {
position: fixed; position: fixed;
inset: 0; inset: 0;
background: rgba(2, 8, 20, 0.38); background: rgba(2, 8, 20, 0.46);
backdrop-filter: blur(10px); backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(14px);
} }
.earth-settings-sheet { .earth-settings-sheet {
@@ -240,13 +257,25 @@
max-height: calc(100vh - max(64px, 18vh)); max-height: calc(100vh - max(64px, 18vh));
margin-inline: auto; margin-inline: auto;
transform: none; transform: none;
border-radius: calc(28px * var(--hud-scale)); border-radius: calc(24px * var(--hud-scale));
padding: calc(20px * var(--hud-scale)); padding: calc(20px * var(--hud-scale));
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: var(--hud-gap-md); gap: var(--hud-gap-md);
overflow: hidden; overflow: hidden;
}
.earth-settings-sheet.liquid-glass-surface {
animation: none; animation: none;
background:
radial-gradient(circle at 18% 0%, rgba(255, 255, 255, 0.09), transparent 30%),
linear-gradient(180deg, rgba(255, 255, 255, 0.05), transparent 28%),
linear-gradient(180deg, rgba(19, 34, 56, 0.92), rgba(8, 18, 31, 0.9));
border-color: rgba(207, 224, 243, 0.12);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.08),
0 24px 56px rgba(2, 7, 15, 0.4),
0 0 0 1px rgba(255, 255, 255, 0.025);
} }
.earth-settings-sheet.liquid-glass-surface:hover, .earth-settings-sheet.liquid-glass-surface:hover,
@@ -270,19 +299,19 @@
justify-content: space-between; justify-content: space-between;
gap: var(--hud-gap-md); gap: var(--hud-gap-md);
padding-bottom: var(--hud-gap-sm); padding-bottom: var(--hud-gap-sm);
border-bottom: 1px solid rgba(255, 255, 255, 0.08); border-bottom: 1px solid var(--hud-line);
} }
.earth-settings-kicker { .earth-settings-kicker {
color: #9eb7d0; color: var(--hud-text-soft);
font-size: 0.78rem; font-size: var(--hud-kicker-size);
letter-spacing: 0.08em; letter-spacing: 0.16em;
text-transform: uppercase; text-transform: uppercase;
} }
.earth-settings-title { .earth-settings-title {
margin: 4px 0 0; margin: 4px 0 0;
color: #eef7ff; color: var(--hud-title);
} }
.earth-settings-close { .earth-settings-close {
@@ -293,7 +322,7 @@
overflow-y: auto; overflow-y: auto;
padding-right: 4px; padding-right: 4px;
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: rgba(160, 220, 255, 0.45) transparent; scrollbar-color: rgba(160, 186, 216, 0.34) transparent;
} }
.earth-settings-content::-webkit-scrollbar { .earth-settings-content::-webkit-scrollbar {
@@ -305,7 +334,7 @@
} }
.earth-settings-content::-webkit-scrollbar-thumb { .earth-settings-content::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, rgba(210, 237, 255, 0.28), rgba(110, 176, 255, 0.34)); background: linear-gradient(180deg, rgba(210, 225, 242, 0.2), rgba(126, 154, 185, 0.28));
border-radius: 999px; border-radius: 999px;
} }
@@ -315,9 +344,9 @@
.earth-settings-section-title { .earth-settings-section-title {
margin-bottom: 12px; margin-bottom: 12px;
color: #9eb7d0; color: var(--hud-text-soft);
font-size: 0.8rem; font-size: var(--hud-kicker-size);
letter-spacing: 0.08em; letter-spacing: 0.16em;
text-transform: uppercase; text-transform: uppercase;
} }
@@ -332,11 +361,23 @@
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
gap: 16px; gap: 16px;
padding: 14px 16px; padding: 15px 16px;
border-radius: 18px; border-radius: 16px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(92, 151, 218, 0.03)); background:
border: 1px solid rgba(255, 255, 255, 0.08); linear-gradient(180deg, rgba(255, 255, 255, 0.04), transparent),
rgba(255, 255, 255, 0.025);
border: 1px solid rgba(212, 227, 244, 0.08);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
cursor: pointer; cursor: pointer;
transition: background 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
}
.earth-settings-item:hover {
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.06), transparent),
rgba(255, 255, 255, 0.04);
border-color: rgba(224, 236, 249, 0.14);
transform: translateY(-1px);
} }
.earth-settings-copy { .earth-settings-copy {
@@ -346,13 +387,13 @@
} }
.earth-settings-item-title { .earth-settings-item-title {
color: #eef7ff; color: var(--hud-text);
font-size: 1rem; font-size: calc(0.98rem * var(--hud-scale));
font-weight: 500; font-weight: 600;
} }
.earth-settings-item-subtitle { .earth-settings-item-subtitle {
color: #90a6bb; color: var(--hud-text-muted);
font-size: 0.82rem; font-size: 0.82rem;
line-height: 1.4; line-height: 1.4;
} }
@@ -373,8 +414,8 @@
width: 48px; width: 48px;
height: 30px; height: 30px;
border-radius: 999px; border-radius: 999px;
background: rgba(255, 255, 255, 0.14); background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12); border: 1px solid rgba(215, 229, 242, 0.12);
position: relative; position: relative;
transition: background 0.18s ease, border-color 0.18s ease; transition: background 0.18s ease, border-color 0.18s ease;
} }
@@ -387,14 +428,14 @@
width: 22px; width: 22px;
height: 22px; height: 22px;
border-radius: 50%; border-radius: 50%;
background: #f5fbff; background: #edf4fc;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.22); box-shadow: 0 6px 14px rgba(1, 8, 18, 0.26);
transition: transform 0.18s ease; transition: transform 0.18s ease;
} }
.earth-settings-switch input:checked + .earth-settings-switch-track { .earth-settings-switch input:checked + .earth-settings-switch-track {
background: linear-gradient(180deg, rgba(69, 171, 255, 0.92), rgba(34, 123, 255, 0.84)); background: linear-gradient(180deg, rgba(143, 185, 255, 0.72), rgba(104, 147, 221, 0.78));
border-color: rgba(220, 243, 255, 0.36); border-color: rgba(223, 236, 252, 0.28);
} }
.earth-settings-switch input:checked + .earth-settings-switch-track::after { .earth-settings-switch input:checked + .earth-settings-switch-track::after {

View File

@@ -4,45 +4,97 @@
top: var(--hud-offset); top: var(--hud-offset);
left: var(--hud-offset); left: var(--hud-offset);
border-radius: var(--hud-radius); border-radius: var(--hud-radius);
padding: calc(20px * var(--hud-scale)); padding: calc(22px * var(--hud-scale));
width: calc(320px * var(--hud-scale)); width: calc(336px * var(--hud-scale));
z-index: 10; z-index: 10;
font-size: var(--hud-font-size); font-size: var(--hud-font-size);
} }
.hud-panel-info .earth-app-title { .hud-panel-info .earth-brand {
font-size: calc(1.8rem * var(--hud-scale)); margin-bottom: calc(12px * var(--hud-scale));
margin-bottom: var(--hud-gap-xs); display: flex;
color: #4db8ff; align-items: flex-start;
text-shadow: 0 0 10px rgba(77, 184, 255, 0.5); gap: calc(10px * var(--hud-scale));
text-align: center; min-width: 0;
} }
.hud-panel-info .subtitle { .hud-panel-info .earth-brand__logo {
margin-bottom: calc(20px * var(--hud-scale)); display: block;
border-bottom: 1px solid rgba(255,255,255,0.1); flex: 0 0 auto;
padding-bottom: calc(12px * var(--hud-scale)); width: min(calc(148px * var(--hud-scale)), 41%);
text-align: center; height: auto;
object-fit: contain;
image-rendering: auto;
}
.hud-panel-info .earth-brand__copy {
display: flex;
flex: 1 1 auto;
min-width: 0;
flex-direction: column;
justify-content: center;
gap: calc(8px * var(--hud-scale));
}
.hud-panel-info .earth-brand__title {
display: block;
width: min(100%, calc(196px * var(--hud-scale)));
max-width: 100%;
height: auto;
object-fit: contain;
image-rendering: auto;
}
.hud-panel-info .earth-brand__meta {
text-align: left;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: flex-start;
gap: calc(4px * var(--hud-scale)); gap: calc(4px * var(--hud-scale));
} }
.hud-panel-info .subtitle-main { .hud-panel-info .earth-brand__subtitle {
color: #d7e7f5; color: var(--hud-text-muted);
font-size: calc(0.95rem * var(--hud-scale)); font-size: calc(0.84rem * var(--hud-scale));
line-height: 1.35; line-height: 1.38;
font-weight: 500; font-weight: 500;
letter-spacing: 0.02em; letter-spacing: 0.015em;
} }
.hud-panel-info .subtitle-meta { .hud-panel-info .earth-brand__description {
color: #8ea5bc; color: var(--hud-text-soft);
font-size: calc(0.74rem * var(--hud-scale)); font-size: calc(0.66rem * var(--hud-scale));
line-height: 1.3; line-height: 1.35;
letter-spacing: 0.08em; letter-spacing: 0.08em;
text-transform: uppercase; }
.hud-panel-info .earth-brand--en .earth-brand__logo {
width: min(calc(140px * var(--hud-scale)), 39%);
}
.hud-panel-info .earth-brand--en .earth-brand__title {
width: min(100%, calc(208px * var(--hud-scale)));
}
.hud-panel-info .earth-brand--en .earth-brand__meta {
gap: calc(3px * var(--hud-scale));
}
.hud-panel-info .earth-brand--en .earth-brand__subtitle,
.hud-panel-info .earth-brand--en .earth-brand__description {
font-family: "Roboto Condensed", "Arial Narrow", "Trebuchet MS", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
.hud-panel-info .earth-brand--en .earth-brand__subtitle {
font-size: calc(0.84rem * var(--hud-scale));
line-height: 1.26;
letter-spacing: 0.01em;
}
.hud-panel-info .earth-brand--en .earth-brand__description {
font-size: calc(0.66rem * var(--hud-scale));
line-height: 1.24;
letter-spacing: 0.045em;
} }
/* Info Card - Unified details panel (inside info-panel) */ /* Info Card - Unified details panel (inside info-panel) */
@@ -50,13 +102,13 @@
display: none; display: none;
margin-top: var(--hud-gap-lg); margin-top: var(--hud-gap-lg);
background: background:
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(110, 176, 255, 0.04)), linear-gradient(180deg, rgba(255, 255, 255, 0.04), transparent 48%),
rgba(7, 18, 36, 0.2); rgba(255, 255, 255, 0.025);
border-radius: calc(14px * var(--hud-scale)); border-radius: calc(18px * var(--hud-scale));
border: 1px solid rgba(225, 242, 255, 0.12); border: 1px solid rgba(214, 229, 245, 0.08);
box-shadow: box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.05),
0 10px 24px rgba(0, 0, 0, 0.16); 0 12px 28px rgba(0, 0, 0, 0.14);
padding: 0; padding: 0;
overflow: hidden; overflow: hidden;
pointer-events: auto; pointer-events: auto;
@@ -70,8 +122,9 @@
.info-card-header { .info-card-header {
display: flex; display: flex;
align-items: center; align-items: center;
padding: calc(10px * var(--hud-scale)) calc(12px * var(--hud-scale)); padding: calc(12px * var(--hud-scale)) calc(14px * var(--hud-scale));
background: linear-gradient(180deg, rgba(255, 255, 255, 0.09), rgba(77, 184, 255, 0.06)); background: linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.015));
border-bottom: 1px solid var(--hud-line);
gap: var(--hud-gap-sm); gap: var(--hud-gap-sm);
} }
@@ -82,16 +135,17 @@
.info-card-header h3 { .info-card-header h3 {
flex: 1; flex: 1;
margin: 0; margin: 0;
font-size: calc(1rem * var(--hud-scale)); font-size: calc(0.96rem * var(--hud-scale));
color: #4db8ff; color: var(--hud-title);
font-weight: 600;
} }
.info-card-content { .info-card-content {
padding: calc(10px * var(--hud-scale)) calc(12px * var(--hud-scale)); padding: calc(12px * var(--hud-scale)) calc(14px * var(--hud-scale));
max-height: 40vh; max-height: 40vh;
overflow-y: auto; overflow-y: auto;
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: rgba(160, 220, 255, 0.45) transparent; scrollbar-color: rgba(160, 186, 216, 0.34) transparent;
pointer-events: auto; pointer-events: auto;
} }
@@ -104,19 +158,20 @@
} }
.info-card-content::-webkit-scrollbar-thumb { .info-card-content::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, rgba(210, 237, 255, 0.32), rgba(110, 176, 255, 0.34)); background: linear-gradient(180deg, rgba(210, 225, 242, 0.2), rgba(126, 154, 185, 0.28));
border-radius: 999px; border-radius: 999px;
} }
.info-card-content::-webkit-scrollbar-thumb:hover { .info-card-content::-webkit-scrollbar-thumb:hover {
background: linear-gradient(180deg, rgba(232, 246, 255, 0.42), rgba(128, 198, 255, 0.46)); background: linear-gradient(180deg, rgba(226, 236, 246, 0.28), rgba(136, 164, 196, 0.34));
} }
.info-card-property { .info-card-property {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
padding: calc(6px * var(--hud-scale)); align-items: flex-start;
border-bottom: 1px solid rgba(255, 255, 255, 0.05); padding: calc(8px * var(--hud-scale)) 0;
border-bottom: 1px solid rgba(214, 229, 245, 0.06);
pointer-events: auto; pointer-events: auto;
gap: var(--hud-gap-sm); gap: var(--hud-gap-sm);
} }
@@ -126,22 +181,25 @@
} }
.info-card-label { .info-card-label {
color: #aaa; color: var(--hud-text-soft);
font-size: calc(0.85rem * var(--hud-scale)); font-size: calc(0.72rem * var(--hud-scale));
letter-spacing: 0.1em;
text-transform: uppercase;
cursor: pointer; cursor: pointer;
transition: color 0.18s ease; transition: color 0.18s ease;
} }
.info-card-label:hover { .info-card-label:hover {
color: #d9f1ff; color: var(--hud-text-muted);
} }
.info-card-value { .info-card-value {
color: #4db8ff; color: var(--hud-text);
font-weight: 500; font-weight: 600;
font-size: calc(0.9rem * var(--hud-scale)); font-size: calc(0.88rem * var(--hud-scale));
line-height: 1.45;
text-align: right; text-align: right;
max-width: calc(180px * var(--hud-scale)); max-width: calc(190px * var(--hud-scale));
word-break: break-word; word-break: break-word;
} }

View File

@@ -5,24 +5,24 @@
left: var(--hud-offset); left: var(--hud-offset);
border-radius: var(--hud-radius); border-radius: var(--hud-radius);
padding: var(--hud-panel-padding); padding: var(--hud-panel-padding);
width: calc(220px * var(--hud-scale)); width: calc(236px * var(--hud-scale));
z-index: 10; z-index: 10;
font-size: var(--hud-font-size); font-size: var(--hud-font-size);
} }
.hud-panel-legend .legend-title { .hud-panel-legend .legend-title {
margin-bottom: var(--hud-gap-md); margin-bottom: 0;
} }
.hud-panel-legend .legend-list { .hud-panel-legend .legend-list {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: var(--hud-gap-sm); gap: calc(9px * var(--hud-scale));
max-height: calc(202px * var(--hud-scale)); max-height: calc(214px * var(--hud-scale));
overflow-y: auto; overflow-y: auto;
padding-right: calc(4px * var(--hud-scale)); padding-right: calc(4px * var(--hud-scale));
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: rgba(160, 220, 255, 0.4) transparent; scrollbar-color: rgba(160, 186, 216, 0.32) transparent;
} }
.hud-panel-legend .legend-list::-webkit-scrollbar { .hud-panel-legend .legend-list::-webkit-scrollbar {
@@ -34,27 +34,38 @@
} }
.hud-panel-legend .legend-list::-webkit-scrollbar-thumb { .hud-panel-legend .legend-list::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, rgba(210, 237, 255, 0.28), rgba(110, 176, 255, 0.34)); background: linear-gradient(180deg, rgba(210, 225, 242, 0.2), rgba(126, 154, 185, 0.28));
border-radius: 999px; border-radius: 999px;
} }
.hud-panel-legend .legend-item { .hud-panel-legend .legend-item {
display: flex; display: flex;
align-items: center; align-items: center;
padding: calc(6px * var(--hud-scale)) calc(8px * var(--hud-scale)); gap: calc(10px * var(--hud-scale));
border-radius: calc(10px * var(--hud-scale)); padding: calc(9px * var(--hud-scale)) calc(10px * var(--hud-scale));
background: linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(120, 180, 255, 0.02)); border-radius: calc(14px * var(--hud-scale));
border: 1px solid rgba(225, 242, 255, 0.06); background:
linear-gradient(180deg, rgba(255, 255, 255, 0.035), transparent),
rgba(255, 255, 255, 0.018);
border: 1px solid rgba(214, 229, 245, 0.07);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.035);
} }
.hud-panel-legend .legend-color { .hud-panel-legend .legend-color {
width: calc(20px * var(--hud-scale)); width: calc(16px * var(--hud-scale));
height: calc(20px * var(--hud-scale)); height: calc(16px * var(--hud-scale));
border-radius: calc(6px * var(--hud-scale)); border-radius: 999px;
margin-right: var(--hud-gap-md); margin-right: 0;
box-shadow: box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.28),
0 0 12px rgba(77, 184, 255, 0.18); 0 0 0 3px rgba(255, 255, 255, 0.04);
}
.hud-panel-legend .legend-item span {
color: var(--hud-text);
font-size: calc(0.84rem * var(--hud-scale));
font-weight: 500;
line-height: 1.35;
} }
.legend-color-americas { .legend-color-americas {

View File

@@ -415,6 +415,9 @@
.earth-zoom-toolbar .earth-zoom-btn { .earth-zoom-toolbar .earth-zoom-btn {
height: 42px; height: 42px;
font-size: 20px;
font-weight: 500;
line-height: 1;
} }
.earth-zoom-toolbar .earth-zoom-value { .earth-zoom-toolbar .earth-zoom-value {

View File

@@ -34,6 +34,7 @@
<link rel="stylesheet" href="css/coordinates-display.css"> <link rel="stylesheet" href="css/coordinates-display.css">
<link rel="stylesheet" href="css/legend.css"> <link rel="stylesheet" href="css/legend.css">
<link rel="stylesheet" href="css/earth-stats.css"> <link rel="stylesheet" href="css/earth-stats.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@400;500;600&display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@24,500,0,0"> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@24,500,0,0">
</head> </head>
<body class="earth-page"> <body class="earth-page">
@@ -48,11 +49,7 @@
</svg> </svg>
<div id="container" class="earth-app"> <div id="container" class="earth-app">
<div id="info-panel" class="hud-panel hud-panel-info"> <div id="info-panel" class="hud-panel hud-panel-info">
<h1 class="earth-app-title">智能星球计划</h1> <div id="brand-root"></div>
<div class="subtitle">
<span class="subtitle-main">现实层宇宙全息感知系统</span>
<span class="subtitle-meta">卫星 · 海底光缆 · 算力基础设施</span>
</div>
<div id="info-card" class="info-card"> <div id="info-card" class="info-card">
<div class="info-card-header"> <div class="info-card-header">
@@ -137,9 +134,9 @@
<span class="tooltip earth-toolbar-tooltip">缩放控制</span> <span class="tooltip earth-toolbar-tooltip">缩放控制</span>
</button> </button>
<div id="zoom-toolbar" class="earth-stack-toolbar earth-zoom-toolbar"> <div id="zoom-toolbar" class="earth-stack-toolbar earth-zoom-toolbar">
<button id="zoom-in" class="liquid-glass-surface earth-zoom-btn" title="放大">+<span class="tooltip earth-toolbar-tooltip">放大</span></button> <button id="zoom-in" class="liquid-glass-surface earth-zoom-btn" title="放大" aria-label="放大"><span aria-hidden="true">+</span></button>
<span id="zoom-value" class="liquid-glass-surface earth-zoom-value" title="重置缩放到100%">100%<span class="tooltip earth-toolbar-tooltip">重置缩放到100%</span></span> <span id="zoom-value" class="liquid-glass-surface earth-zoom-value" title="重置缩放到100%">100%<span class="tooltip earth-toolbar-tooltip">重置缩放到100%</span></span>
<button id="zoom-out" class="liquid-glass-surface earth-zoom-btn" title="缩小"><span class="tooltip earth-toolbar-tooltip">缩小</span></button> <button id="zoom-out" class="liquid-glass-surface earth-zoom-btn" title="缩小" aria-label="缩小"><span aria-hidden="true"></span></button>
</div> </div>
</div> </div>
<button id="settings-trigger" class="floating-btn liquid-glass-surface earth-toolbar-btn" title="设置"> <button id="settings-trigger" class="floating-btn liquid-glass-surface earth-toolbar-btn" title="设置">

View File

@@ -0,0 +1,55 @@
const BRANDS = {
zh: {
ariaLabel: "智能星球计划品牌标识",
titleAlt: "智能星球计划",
titleSrc: "assets/brand/title-zh.png",
subtitle: "现实层宇宙全息感知系统",
description: "卫星 · 海底光缆 · 算力基础设施",
},
en: {
ariaLabel: "Intelligent Planet Program brand banner",
titleAlt: "Intelligent Planet Program",
titleSrc: "assets/brand/title-en.png",
subtitle: "Physical-Universe Holography",
description: "Satellites · Cables · Compute Infra",
},
};
function getBrandConfig(variant = "zh") {
return BRANDS[variant] ?? BRANDS.zh;
}
export function renderBrand(variant = "zh") {
const config = getBrandConfig(variant);
return `
<div class="earth-brand earth-brand--${variant}" aria-label="${config.ariaLabel}">
<img
class="earth-brand__logo"
src="assets/brand/earth-logo.png"
alt=""
aria-hidden="true"
>
<div class="earth-brand__copy">
<img
class="earth-brand__title"
src="${config.titleSrc}"
alt="${config.titleAlt}"
>
<div class="earth-brand__meta">
<span class="earth-brand__subtitle">${config.subtitle}</span>
<span class="earth-brand__description">${config.description}</span>
</div>
</div>
</div>
`.trim();
}
export function mountBrand(target, variant = "zh") {
if (!target) return;
target.innerHTML = renderBrand(variant);
}
export function getBrandVariants() {
return Object.keys(BRANDS);
}

View File

@@ -17,6 +17,7 @@ export const HUD_CONFIG = {
scaleReferenceHeight: 1080, scaleReferenceHeight: 1080,
minScale: 0.7, minScale: 0.7,
maxScale: 1, maxScale: 1,
brandLanguage: "zh",
}; };
// Earth coordinate constants // Earth coordinate constants

View File

@@ -123,6 +123,7 @@ import {
refreshLegend, refreshLegend,
setLegendItems, setLegendItems,
} from "./legend.js"; } from "./legend.js";
import { mountBrand } from "./brand.js";
export let scene; export let scene;
export let camera; export let camera;
@@ -853,6 +854,11 @@ export function init() {
initialized = true; initialized = true;
simplex = createNoise3D(); simplex = createNoise3D();
updateHudScale(); updateHudScale();
const brandRoot = document.getElementById("brand-root");
mountBrand(
brandRoot,
HUD_CONFIG.brandLanguage || "zh",
);
scene = new THREE.Scene(); scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( camera = new THREE.PerspectiveCamera(

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "planet" name = "planet"
version = "0.25.2" version = "0.25.3"
description = "智能星球计划 - 态势感知系统" description = "智能星球计划 - 态势感知系统"
requires-python = ">=3.14" requires-python = ">=3.14"
dependencies = [ dependencies = [

2
uv.lock generated
View File

@@ -475,7 +475,7 @@ wheels = [
[[package]] [[package]]
name = "planet" name = "planet"
version = "0.25.2" version = "0.25.3"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "aiofiles" }, { name = "aiofiles" },