输入框里左边选模型、右边发送。回答下的赞、踩、复制、重新生成和追问改用组件库按钮。不满意原因和兑换窗改用对话框,句子不变。桌面顶栏可以打开当前人物的本命盘,能拖宽,刷新后还在;手机没有这个入口。当前会话和流式状态从 Home() 移进已有会话 store,useState 从 33 减到 25。流式、停止、排队、撤回、退点和寒暄免费没有改。 自测:tsc 退出码 0;lint 0 error、122 条警告;定向测试 275 通过、失败 0、取消 0;npm run build 退出码 0,/ 仍是 Static。首屏 gzip-9 639127,相对基线 634528 多 0.72%。隐私标记测试退出码 0。 Co-Authored-By: Grok (agent loop)
7.7 KiB
PROGRESS · 组件库 K2 对话页(2026-10-25)
工单 #106。分支 codex/ui-kit-2-chat-20261023。基线 origin/staging e4e240bf863b49e75bf9c7e1ba54b40cb1265f64(#105 新侧栏和 #99 启程动效已在这个提交里)。只做任务书 K2 对话页。K0、K1 已完成,K3 及之后没做。
结论
输入框里左边选模型,右边发送。各模型的价格只写在菜单里。回答下面仍是赞、踩、复制、重新生成。桌面上可以在对话旁边打开当前人物的本命盘,能拖宽,也能收起,刷新后还在。手机上看不到这个入口。发消息、停止、排队、撤回、退点和寒暄免费没有改。
做了什么
- 输入框改用组件库的组合输入。底边左边是模型菜单,只显示名字;「N 点」只在菜单项里。右边是圆形发送,和框的底边对齐。停止、排队召回和「内容由 AI 生成」仍在。模型菜单走外壳已经在用的延后载入:库还没到时,按钮上仍是当前模型名,点开还没有菜单。
- 赞、踩、复制、重新生成是图标按钮,各有提示。不满意原因和兑换窗改用对话框,句子不改。追问是描边小按钮,仍用启程进场依次浮出(260ms,间隔 64ms),没有另写时长。跳到最新和今日星语入口改用组件库按钮,原来的尺寸类还在。
- 当前会话、咨询阶段、停止中的标记、排队中的会话和请求、流式回答、赞踩和「已复制」从
Home()移进已有的会话 store。消息列表本来就在会话列表里,跟着同一份 store。Home()的 useState 从 33 减到 25。useRef 开工时是 37,做完仍是 37,没有新加。page.tsx从 1419 行到 1450 行,粗护栏是 1567。useSessionManagement仍在useRectificationSurface前面。 - 桌面顶栏、点数右边,是打开或收起本命盘的图标按钮,提示「打开本命盘」或「收起本命盘」。面板在可拖分栏里,宽 280–560,默认 360。开着和宽度记在本机
chat_chart_panel_open、chat_chart_panel_width。收起不把宽度写成 0。手机视口还没定、或小于 768 时不显示按钮,也不因为藏起来就把「开着」写成关掉。 - 面板里是当前人物的本命盘,复用星盘页的绘制。只取本命分盘这一层。缓存里的盘必须是同一个人,否则重新取。没有骨架,也没有「正在加载」。不标星盘页那一次「画出来」的标记。可拖分栏和星盘绘制都在第一次打开后面才载入。外层对话网格没有改,里面用一列重复原来的行高,次级页面不包这一列。
- 流式逐字仍在
chat-message-row.tsx,这个文件没有改。消息进场仍是已有的 Motion。扣点和落库没有改。 - 白名单去掉 9 个已经不再违规的文件,没有加长,也没有改测试里写死的基线名单。
- 没有改
.gitea/**,没有改生产部署,没有动数据库,没有给scripts/jyotish_api_server.py加方法。没有重做 #99 的动效时长。
断言改动(原值 / 新值 / 原因)
| 位置 | 原值 | 新值 | 原因 |
|---|---|---|---|
| 输入框 | <Textarea 直接放在表单里,并带 ref={inputRef} |
<InputGroupTextarea,仍绑定同一份草稿和同一个 ref |
输入框改用组合输入。聚焦和草稿订阅不变 |
| 跳到最新 | <button |
<Button,仍是 type="button" |
改用组件库按钮。类名、焦点环和 44px 目标不变 |
| 今日星语 | <button className="starter-entry" |
<Button className="starter-entry" |
改用组件库按钮。36px 胶囊和 44px 点按区仍由原来的类决定 |
| 兑换窗 | 自绘遮罩 account-modal-overlay,并用 createPortal |
Dialog,内容类名仍是 account-modal paywall-modal |
改用组件库对话框。文案和这些类名留下 |
| 不满意原因 | 文件顶部静态引入,只在挂载容器里找文案 | 先建好测试文档再动态引入,容器和 document.body 都找 |
对话框在模块加载时才决定把内容挂到 body。测试文档必须先就位。提交、原因顺序和补充说明仍在 |
| 白名单 | 含首页和 8 个对话零件 | 这 9 个移出 | 它们已经改用组件库。名单只许变短 |
移出的 9 个文件:page.tsx、chat-composer.tsx、chat-message-actions.tsx、conversation-follow-ups.tsx、jump-to-latest-button.tsx、model-selector.tsx、onboarding-redeem-paywall.tsx、reply-down-reason.tsx、starter-home.tsx。
自测
| 检查 | 命令 | 结果 |
|---|---|---|
| 类型 | 仓库根 frontend\node_modules\.bin\tsc --noEmit -p frontend |
退出码 0 |
| 检查 | 在 frontend 下 npm run lint |
退出码 0。122 个警告,0 error |
| 定向测试 | 在 frontend 下 node --import tsx --test 下面列出的文件 |
275 条,通过 275,失败 0,取消 0 |
| 构建 | 在 frontend 下 npm run build |
退出码 0。编译 8.2s,TypeScript 17.3s。/ 仍是 ○ Static。5 条既有 skill-package-registry 警告,没有改 |
| 首屏体积 | 首页 HTML 引用的 /_next/static/**.js,gzip-9 相加,不含 CSS |
基线 e4e240bf:36 个文件,缺失 0,634528 字节。本单:36 个文件,缺失 0,639127 字节,多 4599(+0.72%)。±2% 上限 647219 |
定向测试文件:account-dialog-inert-20260918.test.ts、ai-generated-notice-20261014.test.ts、character-remaining-contract.test.ts、chat-chart-panel-state.test.ts、chat-composer-queue.test.ts、chat-message-actions.test.ts、chat-navigation-a11y-contract.test.ts、chat-stream-layout.test.ts、composer-isolation-contract.test.ts、consult-first-frame-and-pacing-20260928.test.tsx、consultation-entrypoint.test.ts、consultation-recovery.test.ts、consultation-smalltalk-ui.test.tsx、consultation-smalltalk.test.ts、home-shell-growth-contract.test.ts、home-streaming-render-split.test.ts、home-warm-return-lifecycle.test.tsx、membership-page.test.ts、onboarding-checklist-20261022.test.ts、rectification-agentic-entry.test.ts、rectification-grounding-regenerate-20260927.test.ts、reply-quality-20260930.test.tsx、session-conversation-layout.test.ts、session-list-lifecycle.test.tsx、starter-entry-soften.test.ts、stream-text-response.test.ts、ui-kit-whitelist.test.ts。
Home() hook:开工 useState 33、useRef 37、page.tsx 1419 行。做完 useState 25、useRef 37、1450 行。上限是 useState 36、useRef 37、1567 行。
没有跑前端全量 npm test,没有跑 Python 快速门,没有跑 test:db。Python 入口和 scripts/jyotish_api_server.py 没有改。
偏离
- 测试用的假文档补了
documentElement、dataset、style.setProperty、requestAnimationFrame和children。组件库对话框要这些才能把内容挂出来。产品页面没有为测试改行为。 - 不满意原因的测试改成先建好文档再载入组件。同一份原因、补充说明和提交仍会发出去。
- 第一次构建把模型菜单静态打进首页脚本,gzip-9 是 655070(38 个文件,+20542,+3.24%,超出 ±2%)。模型菜单改走外壳已有的延后载入后再构建。延后载入后的首屏里,
dropdown-menu、chat-chart-split、chat-natal-chart、react-resizable-panels都是 0。ResizablePanelGroup与VedicChartSvg的首屏命中数和基线一样(1 和 2);多出来的绘制和分栏只在未写进首页 HTML 的脚本里。库还没到时,模型按钮上仍是当前模型名。
环境缺口
- 没有登录态。没有在浏览器里发过一条对话,没有点过停止,没有拖过本命盘。本机记忆由测试读写
chat_chart_panel_open和chat_chart_panel_width证明。可照做的步骤在docs/testing/ui-kit-migration-20261023.md的「对话」一节。