Files
Jyotisha/docs/tasks/PROGRESS-ui-kit-1-shell-20261023.md
T
jesse-uxandGrok (agent loop) 352d45b2ef
Independent Staging Quality Gate / validate (push) Failing after 9m12s
Independent Staging Quality Gate / publish (push) Skipped
外壳换成组件库:侧栏可拖宽,会话可排序(#105)。
桌面侧栏可在 200 到 360 像素之间拖宽,拖到最左收起,宽度记在本机。手机从左边滑出。会话在同一组里拖动排序,顺序写入可空的 sidebar_order,收藏仍置顶。账户菜单、设置、反馈和退出确认改用组件库。顶栏点数只显示图标和数字。启程清单还在。菜单、拖宽、拖动排序和翻页在首屏之后再载入。

自测:tsc 退出码 0;npm run lint 0 error、121 warning;改到的前端测试 205 项全过;npm run build 后首页仍是 static;首屏 gzip 630350,相对 8f7c0f7d 的 621226 为 +1.47%。test:db 92 项里 79 过、13 败,失败名与 Windows 已知清单一致,排序列在通过的 ok 37。没有跑全量 npm test,没有跑 Python 快速门。没有登录态,没有在浏览器里拖侧栏。

Co-Authored-By: Grok (agent loop)
2026-10-25 01:41:19 +08:00

11 KiB
Raw Blame History

PROGRESS · 组件库 K1 外壳(2026-10-25)

工单 #105。分支 codex/ui-kit-1-shell-20261023。基线 origin/staging 8f7c0f7db42f8cca6122ae39498435f59d63a483(#97 已在这个提交里)。只做任务书 K1 外壳。K0 已完成,K2 及之后没做。

结论

桌面侧栏可以在 200 到 360 像素之间拖宽。拖到最左边收成窄轨,再拉开回到刚才的宽度,这个宽度记在这台浏览器里。手机上侧栏从左边滑出。会话可以在同一组里拖动排序,键盘也可以排;换一台登录的设备,顺序还在。收藏的会话仍然整组排在最前。星盘档案这次不排序。账户菜单和设置换成组件库。顶栏点数只显示硬币图标和数字。右上角启程清单还在。

做了什么

  • 桌面侧栏放进可拖分栏。宽度 200–360,默认 288,记在本机 sidebar_width。拖到最左收成 64 像素窄轨;64 不写进记住的宽度。手机用组件库 Sheet,从左边滑出,宽 min(86vw, 320px)。
  • 当前页高亮在动效库载入之后用已有的 layoutId 滑动。在那之前是一块静止的底色,不另写时长。
  • 翻页在动效库载入之后用已有的页面进入 280ms、离开 150ms,方向跟着侧栏顺序:新对话、星盘、星历、报告、合盘、人物。路由不等待动效。连点五项时停在最后一项。动效库还没到时,页面就是普通容器,首页不会因为库到了再挂载一次。库到达之后的第一次切换可能看不到离开的那一页叠在上面,之后的切换按规范重叠。
  • 会话行的更多菜单是收藏或取消收藏、重命名、转发、删除。删除前用确认框。拖动排序用 dnd-kit,只在收藏组内或最近的一组内移动。顺序写入新列 sidebar_order。没保存过的空会话只改本机顺序,不发请求。保存失败的几条退回原位,并提示「排序没有保存」。只改顺序时不改会话的更新时间。列表查询仍按更新时间取,收藏仍先列出,组内再按这个顺序。
  • 左下角账户按钮只显示头像和名字。主题在菜单里用单选组。点数不在这个按钮上重复。
  • 设置是对话框加三个页签,名字仍是个人资料、账户与点数、通用设置。主题用分段页签。退出登录要再确认一次。反馈与投诉仍是对话框。注销账号的确认还在。
  • 顶栏点数是正常大小的描边按钮,硬币图标加数字,44px。「点」只在读屏名称「余额 N 点,会员与充值」里。数字变少往下滚,变多往上滚,360ms;系统要求减少动态时立刻换数字。启程清单胶囊仍是 32px,仍在点数左边。
  • 菜单、可拖分栏、拖动排序和翻页用的库在页面出来后再载入,不进首屏同步包。Motion 仍走已有的按需 domAnimation,没有把整页包进动效提供者。手机抽屉的 Sheet 留在侧栏零件里,打开抽屉的测试要当场看见它。
  • Home() 的 useState / useRef 没有增加。增长合同通过。白名单去掉 8 个已经不再违规的文件,没有加长,也没有改测试里写死的基线名单。page.tsx 仍在白名单里。
  • 删掉迁移后不再使用的手写类:.session-row、.session-actions、.profile-trigger、.new-chat、.report-nav-button、.sidebar-scrim,以及手机抽屉的位移。对应合同测试同一轮改了,见下表。
  • 新出现的一句是「排序没有保存」。对照文案口径:短句,不另加解释。frontend/docs/VOICE.md 没有改,它不是这句的清单。
  • 没有改 .gitea/**,没有改生产部署配置,没有给 scripts/jyotish_api_server.py 加方法。

数据库

只加列:chat_sessions.sidebar_order integer null default null,并授权已登录用户更新这一列。迁移文件 frontend/supabase/migrations/20261025010000_chat_session_sidebar_order.sql。没有放进 frontend/db/migrations。没有删列,没有改类型,没有收紧 NOT NULL。

npm run test:db(frontend,Docker 29.8.0)退出码 1。92 项,通过 79,失败 13。失败的 13 个名字与 tools/agent-loop/windows-known-failures.txt 逐条一致(备份目录 7 项、环境文件权限 3 项、个人报告任务权限 2 项)。含排序列的那一项通过:ok 37 - local PostgreSQL applies the reviewed business schema and serves authenticated business calls。它核对迁移已应用,列是可空 integer,并且没有复制到 frontend/db/migrations。不把整套写成通过,也不记入 BLOCKED.md。

断言改动(原值 / 新值 / 原因)

位置 原值 新值 原因
账户按钮 profile-trigger sidebar-account-trigger 去掉手写类。仍是按钮,不是回首页的链接
账户菜单 Menu.Item / Menu.Root DropdownMenu / DropdownMenuItem 改用组件库。站外页仍链到 /?account=
设置弹窗 renderToString 看到分区名和表单类 这些字符串锁在源码里 组件库对话框在这个测试环境里不输出 HTML。三个分区名不变
注销确认 role="dialog" 组件库根是 alert-dialog 确认框改用 AlertDialog。页面仍被 inert 盖住
侧栏导航类 .new-chat、.report-nav-button .sidebar-nav-link,新建对话再加 data-nav="new" 导航合成一套菜单行。左对齐、行动色和图标尺寸不变
手机抽屉 手写遮罩、translateX、禁止出现 Sheet Sheet,side="left",桌面直接渲染同一棵侧栏 手机从左边滑出。内容仍是同一个侧栏变量
会话行 .session-row .sidebar-session;收藏用 renderSortableGroup 行改名,组内可拖。收藏整组仍在最前
顶栏点数 .credit-button,与校正窥视同为 40px .credit-balance 高 44px;窥视仍 40px 点数是正常大小的描边按钮
外壳孩子 SidebarInset 直接包 {children} 中间是 PageSwitch,再原样放 {children} 翻页包在外壳上。首页内容没有被复制
侧栏宽度 .chat-app 网格列 288 / 240 / 64 纵向 flex,宽度由可拖面板记住 桌面可以拖宽,不再写死三档
列表列 到 pinned,archived_at 末尾加 sidebar_order,仍不含 created_at 与 messages 只加排序列。查询仍按更新时间
人物切换 直接写 base-ui Popover.Root shadcn Popover 改用组件库。关合和 Escape 不变
反馈表单 渲染整个 FeedbackDialog,类型是 radio 渲染 FeedbackDialogBody,类型是 tab 对话框要等浏览器挂上。提交字段不变
手机测试找侧栏 只在页面容器里找 容器和 document.body 都找 Sheet 打开后挂在 body 上
测试替身 self self: window self: globalThis 残缺的 window 让 cn 解析失败。真实全局才有 setTimeout
白名单 含设置、反馈、账户、主题等 8 个文件 这 8 个移出 它们已经改用组件库。名单只许变短
加号入口 字符「+ 添加一个人」 Lucide Plus 加「添加一个人」 去掉当图标用的字符。入口和人数上限不变
头像说明 必须出现「刷新和换设备后保持一致」 这句不再出现 去掉重复解释布局的小字。配色和尺寸仍在

白名单移出的 8 个文件:account-deletion-gate.tsx、account-deletion-section.tsx、account-dialog-overlay.tsx、billing-panel.tsx、feedback-dialog.tsx、profile-panel.tsx、subject-switcher.tsx、theme-preference-menu.tsx。

自测

检查 命令 结果
类型 仓库根 frontend\node_modules\.bin\tsc.cmd --noEmit -p frontend 退出码 0
检查 在 frontend 下 npm run lint 退出码 0。0 error,121 warning。与 #96、#97 记下的 121 条相同。没有去修无关警告
定向测试 在 frontend 下 node node_modules/tsx/dist/cli.mjs --test 下面列出的文件 205 项,pass 205,fail 0,cancelled 0,skipped 0,todo 0,退出码 0
数据库 在 frontend 下 npm run test:db 退出码 1。92 项,通过 79,失败 13,名字与 Windows 已知清单一致。排序列在通过的 ok 37 里
构建 在 frontend 下 npm run build 退出码 0。/ 在 .next/prerender-manifest.json 里 compute 为 static。skill-package-registry.ts 的 Turbopack 追踪警告是改前就有的,没有改
首屏体积 首页 HTML 引用的 /_next/static/**.js,gzip-9 相加,不含 CSS 基线 8f7c0f7d:32 个文件,缺失 0,621226 字节。这一张:36 个文件,缺失 0,630350 字节。+9124 字节,+1.47%。621226 × 1.02 = 633650.52,留约 3300 字节

定向测试文件:account-dialog-inert-20260918、account-dialog-overlay、account-menu-every-page-20260928、beam-avatar、chart-birth-editor-and-report-table、chat-navigation-a11y-contract、chat-profile-picker、chat-session-authority、consultation-session-capacity、feedback-complaints-20260930、home-sidebar-rerender、home-shell-growth-contract、mobile-viewport-scroll-lock-20260917、motion-presets、new-chat-from-people-lifecycle、personal-report-entry、session-list-lifecycle、session-list-provider、sidebar-contract、starter-questions、synastry-report-surface、ui-kit-whitelist。

首屏里没有 ProjectionNode、DndContext、dropdown-menu、resizable(这四项在首屏脚本中都是 0,在其余产物里分别是 3、1、2、2)。动效、拖动排序、菜单和可拖分栏都在页面出来之后再载入。

没有跑前端全量 npm test,没有跑 Python 快速门。Python 入口和 scripts/jyotish_api_server.py 没有改。

偏离

  • 为了停在 ±2% 以内,翻页、高亮、拖宽、拖动排序和账户菜单都改成页面出来后再载入。没有为了体积去改启程清单,也没有删无关页面。
  • 菜单库还没到时,账户按钮和会话「更多」先是普通按钮,点不开菜单。库到了之后才是真正的菜单。账户按钮的焦点引用也在这时接上。
  • 手机 Sheet 没有再拆出首屏。拆掉会让「打开抽屉」的测试和源码锁对不上,而体积已经在限额内。

环境缺口

  • 没有登录态。没有在浏览器里拖过侧栏,没有点过菜单,没有用键盘排过会话。不能写成已经在真机上看过。可照做的步骤在 docs/testing/ui-kit-migration-20261023.md。
  • 排序跨设备保留,靠上面的数据库测试核对列已经加上、可空、类型是 integer。没有第二台登录设备可看。

记录

  • BUG-1433,状态 enhancement。不是缺陷。编号接在 BUG-1432 之后。
  • CHANGELOG.md(条目日期 2026-10-24)、frontend/DESIGN.md、docs/testing/ui-kit-migration-20261023.md。
  • Skill 版本不变。