feat(chart): 「那一刻的天空」封面 — engine, BFF, canvas painter, chart header entry
T1 scripts/birth_sky.py: real alt/az of the seven visible grahas (swe.calc_ut + swe.azalt, geometric altitude, azimuth converted from swe's south origin to north-east) and Yale BSC5 stars V<=4.0 (IAU 1976 precession); phase day / twilight_morning / twilight_evening / night. Thin POST /api/birth_sky registration in do_POST (no new handler method, no __new__). T2 GET /api/birth-sky?subject=: birth truth read server side through loadSubjectBirth + prepareChartViewProfile; zod contract; no billing, no writes, no birth data in the response. T3/T4 lib/birth-sky: sentence table, pure Canvas 2D drawBirthSky (night / paper palettes from DESIGN tokens, east on the left, serif headline with 1.5 s font wait), PNG export via navigator.share or Blob + a.download. Chart page prefetches and paints the cover once the chart is ok; the header button appears only when the PNG is ready. Dialog is a lazy chunk. T7 DESIGN §17, VOICE, CONTEXT glossary, CHANGELOG, real-device checklist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
d670521f47
commit
d277cbd8ad
@@ -1130,3 +1130,22 @@ D40 / D45 / D60 的表格上方,出生时间不是「已校正」时多一句
|
||||
- **出口(2026-09-26 挪位):** 「带这天去提问」不在顶栏了。页面最底部一张浅色提示卡 `.ephemeris-ask-card`(`--color-action-soft` 底、`--radius-lg`、宽度与段落卡一致):左侧「想问这一天适不适合做某件事?」,右侧主按钮「带这天去提问」(44px),行为不变——把当前日期预填进对话草稿并回到 `/`。窄屏时问句自己折行,按钮不变宽。不写「这一页是天象本身,不是对你的判断。」
|
||||
- **等待:** 揭幕后不得再出现 spinner / 骨架 / 「正在加载」。首屏未到时 `SecondaryPageShell` 写「这一天的星历还没拿到。」,居中在已撑满的内容区里。未登录是静态「请先登录」加去登录,不是转圈。同一会话再次进入直接用模块缓存。
|
||||
- **文案:** 不得写运势结论,不得把三套坐标系换算或叠加。当日总评只来自上面的固定规则。不另印「这是天象本身」这类边界说明。
|
||||
|
||||
## 17. 那一刻的天空(2026-09-28,TASK-birth-sky-cover-20260928)
|
||||
|
||||
出生地、出生那一刻头顶的真实天空,画成一张 3:4 封面。不讲运势,不贴标签。产品从三版样稿(`docs/tasks/assets/birth-sky-cover-sample-20260928.html`)里选了 C;A 年轮、B 一笔画不做。
|
||||
|
||||
- **投影与方位:** 天顶在圆心,r = (90 − 高度) / 90 × R;北在上,**东在左**(仰望天空,不是俯视地图)。圆是地平线,另有 30° / 60° 两道虚线高度圈;东南西北四个字在圆外。方位角一律「自正北起、向东为正」(Swiss Ephemeris 的 `azalt` 自正南起算,服务端已换算)。高度是几何高度,不加大气折射。
|
||||
- **画什么:** 地平线以上的太阳、月亮、水金火木土;太阳是赭色空心圆加光晕,其余是小圆点加中文名。V ≤ 4.0 的亮星(耶鲁亮星表,公有领域),点的大小按星等。北斗、仙后座、猎户座三组连线,只连两端都在地平线上的那一段。罗睺、计都不画;月亮在地平线下不画,只进事实句。
|
||||
- **版面(600 × 800 设计格,导出 1080 × 1440):** 顶部小字「JYOTISHA · 那 一 刻」→ 细线 → 主句 → 天空圆 → 细线 → 事实句 → 需要时「按你填写的时间」(出生时间不是已采用的校正时间时)→ 最底「仅供自我探索,不替你做决定。」。主句与顶部小字用 Jyotisha Serif SC(§3);画布绘制前 `document.fonts.load` 最多等 1.5 秒,超时就用黑体画,不出等待态。事实句、方位字、行星名、底部说明用黑体栈。
|
||||
- **两套 palette,只用现有 token:** `night`(屏幕)= 深色主题的页底 `#1a1a19`、墨色 `#f2f0ea`、二三级墨色、深色细线、深色 action `#d78064` 画太阳;`paper`(报告打印)= `--report-paper`、`--color-ink`、`--report-rule`、`--report-accent` 画太阳。不新增品牌色。
|
||||
- **不印出生资料:** 图上没有姓名、日期、时刻、经纬度、地名;接口响应里也没有。天空本身会透露大致时段,产品已接受。文件名固定 `jyotisha-sky.png`。
|
||||
- **一个画法:** 预览、保存、打印共用 `lib/birth-sky/draw.ts` 的 `drawBirthSky`(Canvas 2D 纯函数)。预览是这张 PNG 的 `<img>`,手机长按即可存图;不走 SVG 转图片(网页字体会丢)。
|
||||
|
||||
### 位置一:星盘页顶栏按钮
|
||||
|
||||
- 星盘页 `ok` 后立即预取 `/api/birth-sky?subject=<当前人物>` 并在屏外画好 PNG;**画好之后**顶栏右侧才出现一枚描边按钮「那一刻的天空」(`<Button variant="outline" size="sm">`,顶栏里按 `.chat-header-actions button` 收成 32px + 命中区外扩)。预取失败、资料不全、切人物时都不显示按钮,不占位、不报错。切换人物或改出生资料(指纹变)就按新人物重新预取。家人的盘也能生成。
|
||||
- 点按钮打开原生 `<dialog>`:窄屏占满(`100dvh`),≥860px 居中 `min(520px, 92vw)`、最高 92vh,框与报告「分块导出」抽屉同一套描边、圆角、阴影与遮罩。内容只有标题「那一刻的天空」+「关闭」、3:4 等比缩放的图、底部「保存图片」。Esc、点遮罩、关闭都能关,焦点回到按钮。所有按钮 ≥ 44px。
|
||||
- 「保存图片」:浏览器能分享文件时(iOS Safari)调 `navigator.share({ files })`,系统面板里有「存储图像」;否则 Blob + `a.download`。用户取消分享不算错误、不提示。
|
||||
- 弹层、画布与导出代码都在懒加载 chunk 里(`next/dynamic` + 动态 `import()`),首页 `/` 不带它们。按钮本身是星盘页里的一个普通 `<Button>`(只在数据就绪时渲染)。
|
||||
- 等待:没有等待态。按钮出现时图已就绪;弹层打开就是图。
|
||||
|
||||
Reference in New Issue
Block a user