# Jyotisha Web Design System This file adapts the full visual analysis in `CLAUDE_DESIGN.md` to the shipped Jyotisha application. `CLAUDE_DESIGN.md` remains the upstream reference; this file is the implementation contract. ## 校正按盘型交付(2026-09-30,在途,BUG-1115~1117) 复用范围卡布局:主行逐张写目标盘的上升与可信档位,分钟范围降为次行。完整扫描缺失时明确不能证明全窗一致;超过 61 分钟的 D9/D10 不作解读推荐。采用按钮沿用旧 owner/result/candidate 与门控,不另造候选:采用服务端头段交集/优先级/clamp 后的实际日期和分钟。已采用状态只认服务端核验的 result、候选锚点、date/time 与 segment provenance 身份,不能仅凭钟点相同点亮;只读与锁门仍禁用。来源偏移按实际采用日历日期计算,原填报资料保留,采用不等于确认。不增加 Home 状态、等待动画或新输入框。当前自动化/真机验收未闭环,不视作上线完成。 ### 新产品缺扫描与部分扫描(T4 子组,在途) 持久产品领域构造 `segment-product-v1` 身份,不以可选扫描是否存在决定新旧布局。新案缺摘要仍复用盘型卡,主句明确目标盘「上升盘型暂未知,完整窗口扫描暂不可用」,分钟范围保次行;不退回「最可能」分钟卡、不提供采用按钮。缺扫描不是出生精度不足,报告仍阻止分盘推荐,但不混写「需要更准的出生时间」。部分扫描卡、气泡、timeline 与报告均注明仅是候选盘型、不能证明全窗一致。顶层持久身份覆盖嵌套缺失,目标不匹配摘要不呈现;显式历史 null 不凭 receipt 自动升级。无新增入口、Home 状态、等待动画或输入框。真实 golden + 故障注入只证明投影/文案/持久化调用合同,不替代真 SQL、账户浏览器或完整 T4。 ### 全窗一致开场卡(T3,在途) 只有持久产品目标集合每张盘完整全窗上升唯一,才在原assistant server turn下挂「盘型一致,不用校正」卡;逐行上升后写「全窗一致」,不以候选质量假称较可信,也不确认某分钟。复用原范围卡class和现消息live/reload映射,无第二composer/scroll/loading、无Home状态增长。服务端检查先于模型解析/收费/采集focus;结束步骤与下一动作改为看盘,不再暗示继续采集。扫描不可用、disjoint或超过1440分钟不能触发。历史domain null保旧开场,正常锁窗回复不被一致出口吞掉。 ### 咨询来源与旧案呈现隔离(2026-09-30,在途) 咨询转校正只传已持久来源session引用;服务端核owner、consultation类型与主题allowlist决定婚恋D1+D9、事业D1+D10、其它D1+D9+D10。浏览器不传domain、不以每题focus或用户文本猜领域;新案一次固定,resume不漂移。旧nullable domain即使重计分也不生成新段卡,原native raw/signature审计仍保留;exact-session身份链不升级旧案。来源失败复用原错误区域,无新等待或入口。当前DB opening权限阻塞,浏览器生命周期未验,不称上线。 ## 普通咨询:步骤栏第一节与正文三标题(2026-09-27,TASK-consult-answer-the-question,BUG-1071~1073) 步骤栏(思考计划)第一节标题从「先抓住你真正在问的事」改成「先回答你问的这件事」;首轮它的唯一步骤是「用盘上的反差回答这个问题」,追问轮是「直接回答这句话」。这一节没有自己的正文标题(口语开场没有 H2),它和「盘里支持这个判断的地方」共用一个 heading:第一个正文 H2 出现时两节一起收口;追问轮整篇没有 H2,四节都在结算时收口。无新组件、无新动效。 写作行(`write-<标题>`)跟着正文标题走:首轮依次是「盘里支持这个判断的地方」「时间怎么看」「这周可以做的一件事」,不再出现「正在写先回答你的问题」;追问轮没有标题,写作行是「组织回答」那一条。`shortenAnswerHeading` 里「先回答你的问题 → 先回答」的缩写保留,给历史消息用。 ## 校正回答没有「重新生成」;范围句结算时出现一次(2026-09-27,BUG-1055~1058) 生时校正里助手回答下面的操作条只有「赞 / 踩 / 复制」三个按钮,不再有「重新生成回答」(BUG-1056:那条路是盲写,不校验就落库)。普通对话的操作条不变,最近一条回答仍可重新生成。`ChatMessageActions` 不传 `onRegenerate` 时不画这个按钮,其余按钮位置不变。 「范围从 A 变为 B。」「这次没有重新比较,稍后再比一次。」「候选比较这次没跑成,下一句话时会自动再试。」这几句服务端事实句只在结算那一帧随最终正文出现一次(`answer.delta` replace),之后不会再被撤回;流式过程中先出现的是模型正文,结算时模型正文可能被裁成一句或去掉数字不符的整句(BUG-606 / BUG-615 口径不变)。没有新组件、没有新动效。 ## 普通咨询:数据卡与「多看一眼」(2026-09-27,TASK-consult-evidence-card) 写回答的模型只读数据卡;界面上唯一新增的是写作行在模型补取一段卡外数据时的进行中句:「正在多看一眼:D60 分盘…」(分盘写「Dxx 分盘」,其余用中文名:格局明细、八分法(Ashtakavarga)、六力(Shadbala)、太阳回归等,见 `evidenceLookupSectionLabel`)。它复用写作行(`answer-composition` 活动),不加新行、新组件或动效;第一段正文出来时照常换成写作句。每轮最多一次。补取发生在已放出正文之后时,界面上的正文不会被截断,也不会重复出现:模型若把已写的开头原样重写一遍,重复部分在服务端丢掉(记 `answer-restart-dropped` 校验步)。一步里调工具前没写完的半句过程说明不会再粘到下一步的正文开头(BUG-1059)。数据卡 v2(TASK-consult-evidence-card-v2-20260927)只改卡的内容和可多看的段,界面不变:写作行同一句式,新增名称见 VOICE.md。 ## 普通咨询一遍成文(2026-09-27,BUG-1053) 本命咨询不再有单独的「写结论」阶段:算完盘后,同一个模型循环接着就写回答。时间线的变化只有两处,没有新组件、没有新动效。一是不再出现「正在整理判断依据」「正在写结论」这两个阶段事件,也不再发 `think.step`;计划里的思考行在第一段正文出现时收口(沿用 `completeLiveThink`),写作行的进行中句统一为「正在组织回答」。二是第一段正文要等模型写出第一个二级标题或满 160 字才出现(为了把工具前后的过程说明挡在正文外),开场句会整段一起到达,之后照常按帧放出。截断、停止、失败三种收口与提示不变(BUG-1051)。 ## 校正开场与步骤回执(2026-09-26,BUG-1049 / BUG-1050) 开场一轮只有两段字:正文两句讲做法(要把出生时间缩小到更准的范围、现在先在哪段时间里找;你说几件大事和大概年月,我拿去和星盘对照),下面是问题块里的题干(六个例子 + 一个带年月的回答示例)。题干只出现一次:正文里和题干逐句相同或几乎相同的句子才会被去掉;只是开头几个字一样、内容不同的句子保留(以前按前 12 个字判定,把正文里的例子句删掉了)。 回答上方的步骤时间线:同一个完成名只出现一行(同一工具调两次、或两个工具共用一个名字,都只算一步),折叠后的「已完成 N 步」数的是读者看得见的行数。完成名与进行中句都写大白话,进行中句沿用 BUG-1047 已批准的「正在准备下一个问题…」「正在记下这件事…」「正在重新对照盘面…」;失败行写「重新对照盘面未完成」这类「在做什么 + 未完成」,不写「重新对照了盘面未完成」。没有新组件、没有新动效。 ## 校正打字回答的阶段进度句(2026-09-26,BUG-1047) 生时校正里打字回答一句话,发送的同一帧,这条回复的时间线 live 行就是「收到,正在对照你的档案…」,不再先出现「正在处理…」再干等。服务端先建流、第一行就推这一句,再做意图分类;之后由真实动作推动 `turn.progress`:写入经历 →「正在记下这件事…」,引擎重算 →「正在重新对照盘面…」,经历写完或定下一问 →「正在准备下一个问题…」。阶段只往前走;工具步骤进行中那一行也显示当前阶段句,完成后仍写工具的完成名(「看了你的资料」等,BUG-1050 起为大白话);步骤之间不再落回「正在分析…」。这仍是 §9 的「流式生成中」:同一个 `InlineSpinner` live 行,没有新组件、没有新动效;结算时连同 live 行一起消失,不进正文、不进历史。选择题点选、开场与只读续轮不变。 ## 读者版年运与正文投影(2026-09-25) 年主、Muntha 星座、年度上升与返照时刻分别来自对应年度的真实计算字段,不从年主对象猜补。两种口径不一致时并列注明,不合成单一结论;本地结果不等于完成外部验证。姓名缺失不显示空行,五要素字段使用中文列名。 Bhava Bala 保留完整十二宫力量表;Score / Weight 等领域表头不单独触发整表删除。内部表连同紧邻说明段移除,标题留下,避免后续正常表归错章节。PL9 审计词和长英文段过滤只用于报告正文,聊天导出与安全图盘沿用既有安全规则。不增加入口、等待动画、布局或颜色。 ## 报告核对层与独立附录(2026-09-23) 个人报告保留原 Markdown 阅读、目录隔离与 memo 边界;文后独立渲染服务端分盘和事实表。分盘复用 VedicChartSvg 与 chart-grid/chart-card,不使用 float 或负 margin。事实表默认折叠、可键盘展开,横向溢出仅在表格区域滚动,缺数据不补写。Sade Sati 明确缺三轮日期。09-24 reader-actions D2 撤下操作区「下载原始附录」入口;相关组件、路由和 helper 因删除权限阻塞暂留源码,不当作完成清理。不接普通下载 fallback、不增加 spinner。旧缓存不升级、不重算;没有结构化层就不显示占位盘。文案遵守 VOICE:不把可计算写成已验证。 事实表用中文列名和领域行列呈现,不把引擎路径当行名。主运、分运与小运、SAV 与 BAV、年度位置与 Saham 分为同组子表;缺失的年度行星位置明确说明,不用本命盘替代。机器溯源路径保留在数据中、不渲染。打印或保存 PDF 前自动展开此核对层全部折叠组,完成或取消后恢复原状态;打印解除表格横向滚动裁剪、重复表头,宽 BAV 表仍保留十二星座列。不新增打印入口或等待动画。 ## 校正跨午夜日期与采用(2026-09-20) 复用现有时段选择卡追问一次午夜前/后;不知道或跳过保留填报当天凌晨与深夜两段,不补白昼或次日。选项用中文钟点,继续遵守题卡禁止暴露数字钟点的现有校验,不新增入口、状态或等待动画。 区间交付卡按实际日期序号显示分段;跨申报日明确「前一天 / 后一天」,候选列同时给实际日期与钟点,说明「采用后,排盘使用这一日期和时间;原填报日期保留。」图表库默认显示当前采用的有效日期;原申报日期仍独立保存,不猜补历史结果。沿用原按钮、只读门与代表分钟免责声明,不把采用写成唯一分钟确认。文案已对照 VOICE 的服务端数字来源、短句与采用不等于确认原则。 本命上升的分段展示给出完整本地日历日期与钟点,避免同一个钟点被误读为同一天;历史缺日期的结果仍显示 HH:MM,不猜补。沿用既有布局与颜色,不增加入口、状态或动画。 ## 校正历史结果身份只读(2026-09-20) 历史打开、刷新与比较返回的结果若无法核实为当前算法及策略,消息区顶部复用 `rectification-pending-note`、`role="status"` 显示「按旧算法产出。当前暂不能核实结果,请先查看,暂不能选择或采用。」保留原历史内容和来源,不出现强制重算入口;关闭旧结果选项、候选采用及普通输入,输入提示为「当前结果仅供查看」。可信当前身份已知但与旧结果不同,非终止会话可显式点「重新比较」,复用既有发送链路;身份未知时无此入口,服务端再次探测失败也不能重算。此状态不等同 Case 已结束,不显示误导的结束提示或额外「再次校正」按钮。真正终止的历史仍沿用原结束操作。服务端独立核验所有结果写入,不以界面禁用代替权限。无新颜色、加载动画或 Home 状态。 ## 普通对话寒暄轮(2026-09-20) 服务端标记 `responseKind: smalltalk` 的回复仅展示正文与既有头像/消息操作,不展示思考面板、活动步骤、已完成步骤或技法证据;刷新后的历史也遵循此规则。分类尚未确定、且没有任何真实 activity/thinking/timeline 时,保留消息位置,不虚构「正在分析」或步骤,不另加 spinner。咨询收到真实活动后恢复既有呈现。完成后读取服务端账户余额,寒暄预留点数原额退回,净点数不变;不增加 Home 状态。 ## 1. Atmosphere & Identity Jyotisha feels like a private reading room: warm, editorial, grounded, and quiet enough for reflective conversation. The signature is a pale parchment canvas, translucent warm-gray navigation, fine neutral hairlines, and restrained deep-brown accents. Serif display type gives astrological guidance the gravity of a considered essay rather than a generic chatbot. ## 2. Color ### Palette | Role | Token | Value | Usage | |---|---|---:|---| | Canvas | `--color-canvas` | `#fbfaf7` | Main reading surface, inputs, light controls | | Page floor | `--color-canvas-soft` | `#f3f2ee` | App background and quiet secondary bands | | Warm surface | `--color-canvas-muted` | `#ebe9e3` | Cards, user messages, table headings | | Strong neutral | `--color-canvas-strong` | `#e1ded6` | Pressed and emphasized neutral surfaces | | Sidebar glass | `--color-sidebar` | `rgba(235, 233, 227, .86)` | Desktop navigation only | | Sidebar solid | `--color-sidebar-solid` | `#ebe9e3` | Mobile drawer, and any reduced-transparency surface | | Selected surface | `--color-selected` | `rgba(255, 255, 255, .62)` | Current navigation and raised light rows | | Ink | `--color-ink` | `#1d1d1f` | Headlines and primary text | | Body | `--color-ink-strong` | `#32322f` | Strong body copy | | Secondary text | `--color-ink-secondary` | `#5f5f59` | Supporting copy and labels, section headings | | Tertiary text | `--color-ink-tertiary` | `#6a6963` | Hints, metadata, empty-state copy | | Primary action (text rank) | `--color-action` | `#a9583e` | Links, tinted labels, icons — anything the user reads | | Primary action (fill rank) | `--color-action-strong` | `#cc785c` | Avatar fills, the active session rail, rings, carets, checked radios — never a button with a label | | Solid button fill | `--color-action-fill` / `--color-on-action-fill` | `#a9583e` / `#fbfaf7` (dark `#8f4a33` / `#f2f0ea`) | Every solid primary button: `