release: bump version to 0.76.4
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:
rayd1o
2026-10-01 21:11:00 +08:00
parent 28a7132eec
commit e8742b5d3c
8 changed files with 73 additions and 25 deletions

View File

@@ -1 +1 @@
0.76.3
0.76.4

View File

@@ -8,6 +8,20 @@ This project follows the repository versioning rule:
- `improvement` -> `+0.0.1`(bugfix + 小功能混合)
- `bugfix` -> `+0.0.1`
## [0.76.4] — 2026-10-01
Released: 2026-10-01
### Highlights
- 修正 breaking 新闻状态显示:ticker 仅在当前滚动到 breaking 新闻时变红,展开面板始终保持蓝色。
### Added / Fixed / Improved
- 选中、焦点、关闭动画与 breaking 数据状态彻底分离,关闭新闻栏不再留下橙色边线。
- breaking 新闻按过期时间重新计算,单条新闻卡片继续保留自身 breaking 红色样式。
- 增加 ticker breaking 状态单测和浏览器关闭/重开验证。
---
## [0.76.3] — 2026-10-01
Released: 2026-10-01

View File

@@ -16,12 +16,13 @@
## Current Version
- `main` 当前主线历史推导到:`0.16.5`
- `dev` 当前开发分支历史推导到:`0.76.3`
- `dev` 当前开发分支历史推导到:`0.76.4`
## Timeline
| Version | Type | Branch | Commit | Summary |
| --- | --- | --- | --- | --- |
| `0.76.4` | bugfix | `dev` | `v0.76.4` | 修正 breaking 新闻 ticker 与面板状态边界,当前滚动到 breaking 项时才显示红色 |
| `0.76.3` | bugfix | `dev` | `v0.76.3` | 修复新闻栏关闭后残留 breaking 橙色边线,分离 ticker、面板、选择和过期状态 |
| `0.76.2` | bugfix | `dev` | `v0.76.2` | 优化光缆密集区卫星点拾取,统一点状对象与线缆候选排序并补齐回归验证 |
| `0.76.1` | bugfix | `dev` | `v0.76.1` | 修复选中 BGP 事件静态光晕地表遮挡,统一事件锚点显隐与前景偏移,清理中间态逻辑并补齐验证 |

View File

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

View File

@@ -499,7 +499,6 @@
.earth-news-hud.has-breaking-watch,
.earth-mobile-news-board.has-breaking-watch {
background: linear-gradient(180deg, rgba(72, 53, 26, 0.94), rgba(28, 24, 18, 0.96));
box-shadow:
0 0 0 1px rgba(255, 213, 128, 0.08) inset,
0 18px 46px rgba(156, 106, 20, 0.12);
@@ -507,7 +506,6 @@
.earth-news-hud.has-breaking-breaking,
.earth-mobile-news-board.has-breaking-breaking {
background: linear-gradient(180deg, rgba(82, 44, 28, 0.94), rgba(32, 22, 18, 0.96));
box-shadow:
0 0 0 1px rgba(255, 166, 102, 0.14) inset,
0 18px 48px rgba(185, 89, 32, 0.16);
@@ -515,7 +513,6 @@
.earth-news-hud.has-breaking-critical,
.earth-mobile-news-board.has-breaking-critical {
background: linear-gradient(180deg, rgba(76, 32, 38, 0.94), rgba(30, 18, 24, 0.96));
box-shadow:
0 0 0 1px rgba(255, 118, 118, 0.18) inset,
0 18px 52px rgba(172, 43, 43, 0.18);

View File

@@ -62,6 +62,7 @@ let morphTimer = null;
let morphFrame = null;
let panelPhase = "closed";
let breakingExpiryTimer = null;
let tickerBreakingTimer = null;
let newsRealtimeSocket = null;
let newsRealtimeReconnectTimer = null;
let activeNewsCategoryFilters = null;
@@ -413,20 +414,8 @@ function normalizeBreakingScope(scope) {
function applyNewsBreakingShellState(nextPayload) {
if (breakingExpiryTimer !== null) window.clearTimeout(breakingExpiryTimer);
breakingExpiryTimer = null;
const { level, expiresAt } = getNewsBreakingState(nextPayload);
document
.querySelectorAll(".earth-news-hud, .earth-mobile-news-board")
.forEach((element) => {
if (!(element instanceof HTMLElement)) return;
element.classList.remove(
"has-breaking-watch",
"has-breaking-breaking",
"has-breaking-critical",
);
if (level !== "none") {
element.classList.add(`has-breaking-${level}`);
}
});
const { expiresAt } = getNewsBreakingState(nextPayload);
scheduleTickerBreakingWatcher();
if (expiresAt !== null) {
breakingExpiryTimer = window.setTimeout(() => {
breakingExpiryTimer = null;
@@ -738,6 +727,7 @@ function renderTicker(nextPayload) {
}
if (items.length === 0) {
stopTickerBreakingWatcher();
tickerTrack.textContent = translateText("正在准备全球态势新闻...");
tickerTrack.style.removeProperty("--news-ticker-duration");
return;
@@ -745,23 +735,69 @@ function renderTicker(nextPayload) {
const visibleItems = getDisplayableNewsItems(items).slice(0, 6);
if (visibleItems.length === 0) {
stopTickerBreakingWatcher();
tickerTrack.textContent = translateText("当前新闻类型没有可显示新闻...");
tickerTrack.style.removeProperty("--news-ticker-duration");
return;
}
const tickerItems = [...visibleItems, ...visibleItems];
tickerTrack.innerHTML = tickerItems
.map((item) => `
<span class="earth-news-ticker__item" data-news-id="${escapeTickerText(item.id || "")}">
.map((item) => {
const breakingLevel = isBreakingActive(item) ? normalizeBreakingLevel(item.breaking_level) : "none";
const breakingClass = breakingLevel === "none" ? "" : ` earth-news-ticker__item--breaking-${breakingLevel}`;
return `
<span class="earth-news-ticker__item${breakingClass}" data-news-id="${escapeTickerText(item.id || "")}" data-breaking-level="${breakingLevel}">
<span class="earth-news-ticker__source">${escapeTickerText(getNewsSourceNameLabel({
id: item.source_id,
name: item.source || item.feed_name || "NEWS",
}))}</span>
<span>${escapeTickerText(getNewsDisplaySummary(item))}</span>
</span>
`)
`;
})
.join("");
tickerTrack.style.setProperty("--news-ticker-duration", `${Math.max(22, visibleItems.length * 7)}s`);
scheduleTickerBreakingWatcher();
}
function stopTickerBreakingWatcher() {
if (tickerBreakingTimer !== null) window.clearTimeout(tickerBreakingTimer);
tickerBreakingTimer = null;
document.getElementById("desktop-news-ticker")?.classList.remove(
"has-breaking-watch",
"has-breaking-breaking",
"has-breaking-critical",
);
}
function updateTickerBreakingState() {
const ticker = document.getElementById("desktop-news-ticker");
const viewport = ticker?.querySelector(".earth-news-ticker__viewport");
const items = viewport ? [...viewport.querySelectorAll(".earth-news-ticker__item")] : [];
if (!(ticker instanceof HTMLElement) || !(viewport instanceof HTMLElement) || items.length === 0) {
stopTickerBreakingWatcher();
return;
}
const viewportRect = viewport.getBoundingClientRect();
const viewportCenter = viewportRect.left + viewportRect.width / 2;
let best = null;
for (const item of items) {
const rect = item.getBoundingClientRect();
const overlap = Math.max(0, Math.min(rect.right, viewportRect.right) - Math.max(rect.left, viewportRect.left));
if (overlap <= 0) continue;
const distance = Math.abs((rect.left + rect.right) / 2 - viewportCenter);
if (!best || overlap > best.overlap || (overlap === best.overlap && distance < best.distance)) {
best = { overlap, distance, level: normalizeBreakingLevel(item.dataset.breakingLevel) };
}
}
ticker.classList.remove("has-breaking-watch", "has-breaking-breaking", "has-breaking-critical");
if (best?.level && best.level !== "none") ticker.classList.add(`has-breaking-${best.level}`);
tickerBreakingTimer = window.setTimeout(updateTickerBreakingState, 120);
}
function scheduleTickerBreakingWatcher() {
stopTickerBreakingWatcher();
tickerBreakingTimer = window.setTimeout(updateTickerBreakingState, 0);
}
function renderEmptyState(message) {

View File

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

2
uv.lock generated
View File

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