release: bump version to 0.54.0
Some checks failed
ci / backend (push) Has been cancelled
ci / frontend (push) Has been cancelled
ci / delivery (push) Has been cancelled
release / images (push) Has been cancelled

This commit is contained in:
linkong
2026-05-13 14:26:47 +08:00
parent d9efd98d26
commit 3b4347c87d
11 changed files with 98 additions and 45 deletions

View File

@@ -1 +1 @@
0.53.0
0.54.0

View File

@@ -8,6 +8,22 @@ This project follows the repository versioning rule:
- `improvement` -> `+0.0.1`bugfix + 小功能混合)
- `bugfix` -> `+0.0.1`
## [0.54.0] — 2026-05-13
Released: 2026-05-13
### Highlights
- 新增 Earth 轨迹显示设置,将卫星轨迹从图层列表迁移到桌面与移动设置面板,便于独立控制轨迹线显示。
- 优化卫星静止呼吸与低缩放圆点闪烁参数,让卫星态势视觉节奏更柔和、层次更清晰。
- 更新算力中心图标资产,统一 Earth 交互图标在高分辨率显示下的视觉规格。
### Added / Fixed / Improved
- 新增轨迹显示偏好持久化,并在卫星图层不可用时同步禁用轨迹设置入口。
- 调整卫星呼吸、透明度和 twinkle 参数,降低闪烁频率并增强可读性。
- 将轨迹控制状态同步到桌面设置、移动设置和图层卡片刷新流程。
---
## [0.53.0] — 2026-05-13
Released: 2026-05-13

View File

@@ -16,12 +16,13 @@
## Current Version
- `main` 当前主线历史推导到:`0.16.5`
- `dev` 当前开发分支历史推导到:`0.53.0`
- `dev` 当前开发分支历史推导到:`0.54.0`
## Timeline
| Version | Type | Branch | Commit | Summary |
| --- | --- | --- | --- | --- |
| `0.54.0` | feature | `dev` | `pending` | 新增 Earth 轨迹显示设置并迁移到桌面/移动设置面板,持久化轨迹偏好,同时优化卫星呼吸闪烁参数和算力中心图标资产 |
| `0.53.0` | feature | `dev` | `pending` | 新增 Gitea Actions CI/CD、生产镜像、Kubernetes Helm chart 与 staging 部署 smoke test明确 Vite 生产构建和 planet.sh 开发入口边界 |
| `0.52.0` | feature | `dev` | `pending` | 新增邮箱验证码账号自助链路、AISStream 船只实时采集与受控 snapshot/WS 展示、数据产品统计接口、受控图层接口和数据源批量运维 |
| `0.51.1` | bugfix | `dev` | `pending` | 修复 Earth 静态资源模块相对路径与 Material Symbols 本地字体加载,避免部署路径变化或外部字体不可用时图标/边界资源失效 |

View File

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

View File

@@ -1,3 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#38bdf8" class="bi bi-pc" viewBox="0 0 16 16">
<path d="M5 0a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1H5Zm.5 14a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1Zm2 0a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1ZM5 1.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5ZM5.5 3h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1Z"/>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<g fill="none">
<path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"/>
<path fill="#38bdf8" d="M3 19h1V6.36a1.5 1.5 0 0 1 1.026-1.423l8-2.666A1.5 1.5 0 0 1 15 3.694V19h1V9.99a.5.5 0 0 1 .598-.49l2.196.44A1.5 1.5 0 0 1 20 11.41V19h1a1 1 0 1 1 0 2H3a1 1 0 1 1 0-2"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 821 B

View File

@@ -199,16 +199,6 @@
<span class="layer-row-toggle-track"></span>
</button>
</div>
<div class="layer-row" data-layer-name="轨迹 trails">
<span class="material-symbols-rounded layer-row-icon">timeline</span>
<div class="layer-row-copy">
<span class="layer-row-label">轨迹</span>
<span class="layer-row-meta">Trails</span>
</div>
<button id="toggle-trails" class="layer-row-toggle active" type="button" role="switch" aria-checked="true" title="切换轨迹显示">
<span class="layer-row-toggle-track"></span>
</button>
</div>
<div class="layer-row" data-layer-name="卫星 satellites">
<span class="material-symbols-rounded layer-row-icon">satellite_alt</span>
<div class="layer-row-copy">
@@ -889,6 +879,16 @@
<span class="earth-mobile-settings-switch-track"></span>
</span>
</label>
<label class="earth-mobile-settings-card">
<div class="earth-mobile-settings-copy">
<span class="earth-mobile-settings-label">轨迹显示</span>
<span class="earth-mobile-settings-subtitle">控制卫星轨迹线显示</span>
</div>
<span class="earth-mobile-settings-switch">
<input type="checkbox" data-trails-toggle checked>
<span class="earth-mobile-settings-switch-track"></span>
</span>
</label>
<label class="earth-mobile-settings-card">
<div class="earth-mobile-settings-copy">
<span class="earth-mobile-settings-label">低缩放圆点</span>
@@ -1190,6 +1190,16 @@
<span class="earth-settings-switch-track"></span>
</span>
</label>
<label class="earth-settings-item" for="toggle-trails-display">
<div class="earth-settings-copy">
<span class="earth-settings-item-title">轨迹显示</span>
<span class="earth-settings-item-subtitle">控制卫星轨迹线显示,卫星图层关闭时会自动隐藏</span>
</div>
<span class="earth-settings-switch">
<input id="toggle-trails-display" type="checkbox" data-trails-toggle checked>
<span class="earth-settings-switch-track"></span>
</span>
</label>
<label class="earth-settings-item" for="toggle-interactable-compact-dots">
<div class="earth-settings-copy">
<span class="earth-settings-item-title">低缩放圆点</span>

View File

@@ -339,13 +339,13 @@ export const SATELLITE_CONFIG = {
dotZoomScalePower: 1,
ringSize: 0.07,
apiPath: '/api/v1/visualization/geo/satellites',
breathingSpeed: 0.08,
breathingScaleAmplitude: 0.15,
breathingOpacityMin: 0.5,
breathingOpacityMax: 0.8,
breathingSpeed: 0.036,
breathingScaleAmplitude: 0.22,
breathingOpacityMin: 0.34,
breathingOpacityMax: 0.9,
dotBreathingSpeed: 0.12,
dotBreathingScaleAmplitude: 0.2,
dotOpacityMin: 0.7,
dotBreathingScaleAmplitude: 0.28,
dotOpacityMin: 0.42,
dotOpacityMax: 1.0
};

View File

@@ -782,6 +782,7 @@ function getCurrentSharedSettingsSnapshot() {
rotationMode,
cruiseModules: getCruiseModules(),
satelliteDisplayStyle: getSatelliteDisplayStyle(),
trailsEnabled: getShowTrails(),
layerVisibility: Object.fromEntries(
getPersistedLayers().map((layer) => [layer.id, Boolean(layer.getVisible?.())]),
),
@@ -834,6 +835,7 @@ function cloneEarthSettings(settings) {
cruiseModules: [...(settings.shared.cruiseModules || DEFAULT_CRUISE_MODULES)],
satelliteDisplayStyle:
settings.shared.satelliteDisplayStyle || DEFAULT_SATELLITE_DISPLAY_STYLE,
trailsEnabled: settings.shared.trailsEnabled !== false,
terrainOpacity: settings.shared.terrainOpacity,
dayNightEnabled: settings.shared.dayNightEnabled,
defaultEarthZoom: settings.shared.defaultEarthZoom,
@@ -978,6 +980,11 @@ function normalizeEarthSettings(rawSettings, defaults) {
typeof sharedSettings?.interactableCompactDotsEnabled === "boolean"
? sharedSettings.interactableCompactDotsEnabled
: defaults.shared.interactableCompactDotsEnabled;
const nextTrailsEnabled = typeof sharedSettings?.trailsEnabled === "boolean"
? sharedSettings.trailsEnabled
: typeof inputLayerVisibility.trails === "boolean"
? inputLayerVisibility.trails
: defaults.shared.trailsEnabled;
return {
version: EARTH_SETTINGS_VERSION,
@@ -987,6 +994,7 @@ function normalizeEarthSettings(rawSettings, defaults) {
? nextCruiseModules
: [...DEFAULT_CRUISE_MODULES],
satelliteDisplayStyle: nextSatelliteDisplayStyle,
trailsEnabled: nextTrailsEnabled,
layerVisibility: normalizedLayerVisibility,
terrainOpacity: Number.isFinite(nextTerrainOpacity)
? nextTerrainOpacity
@@ -1371,6 +1379,10 @@ async function applyEarthSettings(settings, { applyLayers = true } = {}) {
persist: false,
suppressStatus: true,
});
setTrailsDisplayEnabled(settings.shared.trailsEnabled, {
persist: false,
silent: true,
});
setSatelliteIdleBreathingEnabled(settings.shared.satelliteIdleBreathingEnabled, {
persist: false,
suppressStatus: true,
@@ -1774,14 +1786,34 @@ async function setVesselsLayerEnabled(button, enabled, { persist = true, silent
}
}
function setTrailsLayerEnabled(button, enabled, { persist = true, silent = false } = {}) {
function syncTrailsDisplayControls() {
const trailsEnabled = getShowTrails();
const disabledState = getLayerDisabledState("trails");
document.querySelectorAll("[data-trails-toggle]").forEach((toggle) => {
if (!(toggle instanceof HTMLInputElement)) return;
toggle.checked = trailsEnabled;
toggle.disabled = disabledState.disabled;
const label = toggle.closest("label");
label?.classList.toggle("is-disabled", disabledState.disabled);
if (label instanceof HTMLElement) {
if (disabledState.disabled && disabledState.tooltip) {
label.title = disabledState.tooltip;
} else {
label.removeAttribute("title");
}
}
});
}
function setTrailsDisplayEnabled(enabled, { persist = true, silent = false } = {}) {
toggleTrails(enabled);
const disabledState = getLayerDisabledState("trails");
setLayerButtonState(button, {
setLayerButtonState(getLayerButton("trails"), {
active: enabled,
disabled: disabledState.disabled,
tooltip: disabledState.tooltip || (enabled ? "隐藏轨迹" : "显示轨迹"),
});
syncTrailsDisplayControls();
syncMobileLayerCards();
if (persist) persistEarthSettings();
if (!silent) {
@@ -1798,6 +1830,7 @@ function syncTrailsAvailability() {
disabled: disabledState.disabled,
tooltip: disabledState.tooltip || (trailsEnabled ? "隐藏轨迹" : "显示轨迹"),
});
syncTrailsDisplayControls();
syncMobileLayerCards();
}
@@ -2021,23 +2054,6 @@ function getBuiltinLayerDefinitions() {
setVisible: (visible, options = {}) =>
setSatellitesLayerEnabled(getLayerButton("satellites"), visible, options),
},
{
id: "trails",
buttonId: "toggle-trails",
icon: "timeline",
label: "轨迹",
meta: "Trails",
keywords: "轨迹 trails",
defaultActive: true,
displayOrder: 20,
startupPriority: null,
startupMode: "visible",
startupLabel: "轨迹",
startupMessage: "",
getVisible: () => getShowTrails(),
setVisible: (visible, options = {}) =>
setTrailsLayerEnabled(getLayerButton("trails"), visible, options),
},
{
id: "terrain",
buttonId: "toggle-terrain",
@@ -2698,6 +2714,13 @@ function setupSettingsControls() {
});
});
document.querySelectorAll("[data-trails-toggle]").forEach((toggle) => {
if (!(toggle instanceof HTMLInputElement)) return;
bindListener(toggle, "change", () => {
setTrailsDisplayEnabled(toggle.checked);
});
});
document.querySelectorAll("[data-interactable-compact-dots-toggle]").forEach((toggle) => {
if (!(toggle instanceof HTMLInputElement)) return;
bindListener(toggle, "change", () => {

View File

@@ -681,9 +681,9 @@ function createSatelliteTwinkleState(index) {
return {
phase: hashSatelliteUnit(index, 1) * Math.PI * 2,
secondaryPhase: hashSatelliteUnit(index, 2) * Math.PI * 2,
speed: 0.62 + hashSatelliteUnit(index, 3) * 1.45,
floor: hashSatelliteUnit(index, 4) * 0.22,
intensity: 0.48 + hashSatelliteUnit(index, 5) * 0.52,
speed: 0.38 + hashSatelliteUnit(index, 3) * 0.72,
floor: hashSatelliteUnit(index, 4) * 0.16,
intensity: 0.68 + hashSatelliteUnit(index, 5) * 0.62,
};
}

View File

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

2
uv.lock generated
View File

@@ -757,7 +757,7 @@ wheels = [
[[package]]
name = "planet"
version = "0.53.0"
version = "0.54.0"
source = { virtual = "." }
dependencies = [
{ name = "aiofiles" },