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`
- `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
Released: 2026-04-10

View File

@@ -16,7 +16,7 @@
## Current Version
- `main` 当前主线历史推导到:`0.16.5`
- `dev` 当前开发分支历史推导到:`0.25.2`
- `dev` 当前开发分支历史推导到:`0.25.3`
## 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.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.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

View File

@@ -1,6 +1,6 @@
{
"name": "planet-frontend",
"version": "0.25.2",
"version": "0.25.3",
"private": true,
"packageManager": "bun@1",
"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 {
--hud-scale: 1;
--hud-offset: calc(20px * var(--hud-scale));
--hud-radius: calc(20px * var(--hud-scale));
--hud-panel-padding: calc(16px * var(--hud-scale));
--hud-panel-padding-sm: calc(12px * var(--hud-scale));
--hud-gap-xs: calc(6px * var(--hud-scale));
--hud-gap-sm: calc(10px * var(--hud-scale));
--hud-gap-md: calc(14px * var(--hud-scale));
--hud-gap-lg: calc(18px * var(--hud-scale));
--hud-radius: calc(22px * var(--hud-scale));
--hud-panel-padding: calc(18px * var(--hud-scale));
--hud-panel-padding-sm: calc(13px * var(--hud-scale));
--hud-gap-xs: calc(7px * var(--hud-scale));
--hud-gap-sm: calc(11px * var(--hud-scale));
--hud-gap-md: calc(16px * var(--hud-scale));
--hud-gap-lg: calc(22px * var(--hud-scale));
--hud-font-size: calc(0.88rem * var(--hud-scale));
--hud-font-size-sm: calc(0.76rem * var(--hud-scale));
--hud-title-size: calc(1.05rem * var(--hud-scale));
--hud-border: rgba(225, 242, 255, 0.2);
--hud-border-hover: rgba(236, 248, 255, 0.34);
--hud-border-active: rgba(240, 249, 255, 0.5);
--glass-fill-top: rgba(255, 255, 255, 0.14);
--glass-fill-bottom: rgba(118, 200, 255, 0.08);
--glass-shadow: 0 18px 34px rgba(0, 0, 0, 0.22);
--glass-glow: 0 0 26px rgba(145, 214, 255, 0.18);
--hud-font-size-sm: calc(0.75rem * var(--hud-scale));
--hud-title-size: calc(1.02rem * var(--hud-scale));
--hud-kicker-size: calc(0.68rem * var(--hud-scale));
--hud-surface-top: rgba(17, 31, 53, 0.84);
--hud-surface-bottom: rgba(7, 17, 31, 0.76);
--hud-surface-overlay: rgba(157, 204, 255, 0.07);
--hud-border: rgba(201, 225, 247, 0.14);
--hud-border-hover: rgba(226, 238, 250, 0.24);
--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);
right: var(--hud-offset);
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;
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 {
margin-bottom: var(--hud-gap-xs);
margin-bottom: calc(8px * var(--hud-scale));
}
.hud-panel-coordinates .earth-zoom-level {
margin-top: var(--hud-gap-xs);
color: #ffff44;
font-weight: 500;
margin-top: calc(10px * var(--hud-scale));
padding-top: calc(10px * var(--hud-scale));
border-top: 1px solid var(--hud-line);
color: var(--hud-accent);
font-weight: 600;
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 {
font-size: var(--hud-font-size-sm);
color: #aaa;
margin-top: var(--hud-gap-xs);
padding-top: var(--hud-gap-xs);
border-top: 1px solid rgba(255, 255, 255, 0.1);
color: var(--hud-text-muted);
margin-top: calc(8px * var(--hud-scale));
line-height: 1.45;
}

View File

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

View File

@@ -4,45 +4,97 @@
top: var(--hud-offset);
left: var(--hud-offset);
border-radius: var(--hud-radius);
padding: calc(20px * var(--hud-scale));
width: calc(320px * var(--hud-scale));
padding: calc(22px * var(--hud-scale));
width: calc(336px * var(--hud-scale));
z-index: 10;
font-size: var(--hud-font-size);
}
.hud-panel-info .earth-app-title {
font-size: calc(1.8rem * var(--hud-scale));
margin-bottom: var(--hud-gap-xs);
color: #4db8ff;
text-shadow: 0 0 10px rgba(77, 184, 255, 0.5);
text-align: center;
.hud-panel-info .earth-brand {
margin-bottom: calc(12px * var(--hud-scale));
display: flex;
align-items: flex-start;
gap: calc(10px * var(--hud-scale));
min-width: 0;
}
.hud-panel-info .subtitle {
margin-bottom: calc(20px * var(--hud-scale));
border-bottom: 1px solid rgba(255,255,255,0.1);
padding-bottom: calc(12px * var(--hud-scale));
text-align: center;
.hud-panel-info .earth-brand__logo {
display: block;
flex: 0 0 auto;
width: min(calc(148px * var(--hud-scale)), 41%);
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;
flex-direction: column;
align-items: center;
align-items: flex-start;
gap: calc(4px * var(--hud-scale));
}
.hud-panel-info .subtitle-main {
color: #d7e7f5;
font-size: calc(0.95rem * var(--hud-scale));
line-height: 1.35;
.hud-panel-info .earth-brand__subtitle {
color: var(--hud-text-muted);
font-size: calc(0.84rem * var(--hud-scale));
line-height: 1.38;
font-weight: 500;
letter-spacing: 0.02em;
letter-spacing: 0.015em;
}
.hud-panel-info .subtitle-meta {
color: #8ea5bc;
font-size: calc(0.74rem * var(--hud-scale));
line-height: 1.3;
.hud-panel-info .earth-brand__description {
color: var(--hud-text-soft);
font-size: calc(0.66rem * var(--hud-scale));
line-height: 1.35;
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) */
@@ -50,13 +102,13 @@
display: none;
margin-top: var(--hud-gap-lg);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(110, 176, 255, 0.04)),
rgba(7, 18, 36, 0.2);
border-radius: calc(14px * var(--hud-scale));
border: 1px solid rgba(225, 242, 255, 0.12);
linear-gradient(180deg, rgba(255, 255, 255, 0.04), transparent 48%),
rgba(255, 255, 255, 0.025);
border-radius: calc(18px * var(--hud-scale));
border: 1px solid rgba(214, 229, 245, 0.08);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.08),
0 10px 24px rgba(0, 0, 0, 0.16);
inset 0 1px 0 rgba(255, 255, 255, 0.05),
0 12px 28px rgba(0, 0, 0, 0.14);
padding: 0;
overflow: hidden;
pointer-events: auto;
@@ -70,8 +122,9 @@
.info-card-header {
display: flex;
align-items: center;
padding: calc(10px * var(--hud-scale)) calc(12px * var(--hud-scale));
background: linear-gradient(180deg, rgba(255, 255, 255, 0.09), rgba(77, 184, 255, 0.06));
padding: calc(12px * var(--hud-scale)) calc(14px * var(--hud-scale));
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);
}
@@ -82,16 +135,17 @@
.info-card-header h3 {
flex: 1;
margin: 0;
font-size: calc(1rem * var(--hud-scale));
color: #4db8ff;
font-size: calc(0.96rem * var(--hud-scale));
color: var(--hud-title);
font-weight: 600;
}
.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;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: rgba(160, 220, 255, 0.45) transparent;
scrollbar-color: rgba(160, 186, 216, 0.34) transparent;
pointer-events: auto;
}
@@ -104,19 +158,20 @@
}
.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;
}
.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 {
display: flex;
justify-content: space-between;
padding: calc(6px * var(--hud-scale));
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
align-items: flex-start;
padding: calc(8px * var(--hud-scale)) 0;
border-bottom: 1px solid rgba(214, 229, 245, 0.06);
pointer-events: auto;
gap: var(--hud-gap-sm);
}
@@ -126,22 +181,25 @@
}
.info-card-label {
color: #aaa;
font-size: calc(0.85rem * var(--hud-scale));
color: var(--hud-text-soft);
font-size: calc(0.72rem * var(--hud-scale));
letter-spacing: 0.1em;
text-transform: uppercase;
cursor: pointer;
transition: color 0.18s ease;
}
.info-card-label:hover {
color: #d9f1ff;
color: var(--hud-text-muted);
}
.info-card-value {
color: #4db8ff;
font-weight: 500;
font-size: calc(0.9rem * var(--hud-scale));
color: var(--hud-text);
font-weight: 600;
font-size: calc(0.88rem * var(--hud-scale));
line-height: 1.45;
text-align: right;
max-width: calc(180px * var(--hud-scale));
max-width: calc(190px * var(--hud-scale));
word-break: break-word;
}

View File

@@ -5,24 +5,24 @@
left: var(--hud-offset);
border-radius: var(--hud-radius);
padding: var(--hud-panel-padding);
width: calc(220px * var(--hud-scale));
width: calc(236px * var(--hud-scale));
z-index: 10;
font-size: var(--hud-font-size);
}
.hud-panel-legend .legend-title {
margin-bottom: var(--hud-gap-md);
margin-bottom: 0;
}
.hud-panel-legend .legend-list {
display: flex;
flex-direction: column;
gap: var(--hud-gap-sm);
max-height: calc(202px * var(--hud-scale));
gap: calc(9px * var(--hud-scale));
max-height: calc(214px * var(--hud-scale));
overflow-y: auto;
padding-right: calc(4px * var(--hud-scale));
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 {
@@ -34,27 +34,38 @@
}
.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;
}
.hud-panel-legend .legend-item {
display: flex;
align-items: center;
padding: calc(6px * var(--hud-scale)) calc(8px * var(--hud-scale));
border-radius: calc(10px * var(--hud-scale));
background: linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(120, 180, 255, 0.02));
border: 1px solid rgba(225, 242, 255, 0.06);
gap: calc(10px * var(--hud-scale));
padding: calc(9px * var(--hud-scale)) calc(10px * var(--hud-scale));
border-radius: calc(14px * var(--hud-scale));
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 {
width: calc(20px * var(--hud-scale));
height: calc(20px * var(--hud-scale));
border-radius: calc(6px * var(--hud-scale));
margin-right: var(--hud-gap-md);
width: calc(16px * var(--hud-scale));
height: calc(16px * var(--hud-scale));
border-radius: 999px;
margin-right: 0;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.2),
0 0 12px rgba(77, 184, 255, 0.18);
inset 0 1px 0 rgba(255, 255, 255, 0.28),
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 {

View File

@@ -415,6 +415,9 @@
.earth-zoom-toolbar .earth-zoom-btn {
height: 42px;
font-size: 20px;
font-weight: 500;
line-height: 1;
}
.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/legend.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">
</head>
<body class="earth-page">
@@ -48,11 +49,7 @@
</svg>
<div id="container" class="earth-app">
<div id="info-panel" class="hud-panel hud-panel-info">
<h1 class="earth-app-title">智能星球计划</h1>
<div class="subtitle">
<span class="subtitle-main">现实层宇宙全息感知系统</span>
<span class="subtitle-meta">卫星 · 海底光缆 · 算力基础设施</span>
</div>
<div id="brand-root"></div>
<div id="info-card" class="info-card">
<div class="info-card-header">
@@ -137,9 +134,9 @@
<span class="tooltip earth-toolbar-tooltip">缩放控制</span>
</button>
<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>
<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>
<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,
minScale: 0.7,
maxScale: 1,
brandLanguage: "zh",
};
// Earth coordinate constants

View File

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

View File

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

2
uv.lock generated
View File

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