/** * 后台部署状态条(5n B1):Sveltia 管理页右下角浮层,轮询站点构建状态。 * spec:.spec/specs/2026-11-05_blog-5n-admin-deep-optimization(T4) * * JSON 接口契约(build.sh 每次部署写 /admin/build-status.json): * { "sha": "a555a3e…", // 部署 commit(展示取前 7 位) * "time": "2026-11-05T19:20:25+08:00", // 构建完成时刻(展示取 HH:MM) * "state": "ok" | "building" | "fail", * "pages": 53 } // 页面数(仪表盘消费,本条不读) * 文件缺失 / 响应非 200 / JSON 解析失败 / state 非法 → 视为「不可知」: * 胶囊淡出、不报错,下一轮照常再试——状态条是增益件,接口坏了不能吵主人。 * * 为什么轮询而不是 SSE/WebSocket:本站是纯静态托管(CDN 上没有可驻留的 * 服务端进程,无推送通道);「保存→看部署结果」的节奏里 10s 间隔已足够 * 感知,且零服务端成本、零额外基础设施。 */ (function () { 'use strict'; if (window.DEPLOY_STATUS) return; // 防重复初始化:脚本被引入两次时静默退出 var POLL_MS = 10000; var timer = null; // null = 停表中(初始 / 页面隐藏) var STATES = { ok: { bg: 'rgba(28,30,34,.92)', label: '已上线' }, building: { bg: 'rgba(52,84,209,.92)', label: '构建中…' }, fail: { bg: 'rgba(179,32,32,.92)', label: '构建失败' }, }; /** 构建中呼吸动画的 keyframes 无法用元素内联样式表达,注入一次