# 本地验收记录 ## 连接交互、样式栏与图标(2026-11-06) - 移除“保存在此浏览器”状态行;卡片连接点恢复四边中心,未选中显示点,选中后动画变为加号。同一个 React Flow Handle 支持拖出贝塞尔线;点击加号打开文本/图片/脚本菜单,图片需用户选图,取消不会创建空节点。选中卡片拖线到空白处,在释放位置打开菜单。 - 连接点大小与加号显隐、选中边框有 CSS 过渡,样式栏与菜单提供 Motion 进入/退出动画;尊重减少动态效果偏好。 - 标题移到框外,textarea 充满卡片内部,卡片与纯文本均覆盖全局聚焦阴影,去掉额外内框。 - 删除八向缩放和常驻旋转柄,仅保留右下角缩放符号。旋转从样式栏开启,拖动元素旋转,点击外部或 Esc 退出;Shift 吸附 15°。 - 样式支持颜色、背景、字体、字号、粗体、斜体、下划线、对齐及行距;节点样式可撤销、导入导出和本地保存。根据用户后续反馈,纯文本改为宽高独立调整、自动换行,缩放不改变字号;仅图标保持等比。 - 底部图标入口打开左侧浮层,提供 45 个 Lucide 图标及中英文名称搜索,支持插入、缩放、旋转、颜色和 JSON 往返。浮层使用 Portal,避免被展开的工作空间侧栏遮住。 - 核对 Core main e8ed5e4 的 content/materials 实现:board.content 目前只允许 schema_version,无法存储节点或样式。尚未对接不存在的 API,也未修改真实账户或服务端数据。完整接口建议、字段和验收标准见 docs/CORE_CANVAS_API.md。 - 29 项自动测试及类型检查通过;覆盖选择不同类型的分支、空白处释放位置、样式完整往返与撤销、非法样式拒绝、图标继承与缩放,以及已有画布/工作空间流程。 - 最终源代码的隔离 Webpack 生产构建、完整 API/路由/88 个品牌资源冒烟回归均通过;未改动正在使用的开发服务缓存。 - 按用户既定安排未访问项目浏览器,实际拖线手感、弹层位置与动画视觉由用户试用反馈;自动状态测试不代表浏览器交互验收。 ## 元素继承、缩放、旋转与纯文本(2026-11-06) - 新增业务元素类继承,卡片与纯文本共享基础变换;纯文本不提供连接点或四向分支。 - 选中元素提供八向缩放与旋转柄;几何计算使用旋转后的局部坐标,保持对侧锚点。纯文本按比例缩放字号,支持大小、角度、字号的草稿/JSON 持久化和单次手势撤销。 - 类型检查通过;24 项自动测试通过,包含八个方向在多个角度下的锚点不变、纯文本缩放限制、旋转吸附、继承能力、导入兼容与撤销。 - 独立临时目录的 Webpack 生产构建通过;完整 API/路由/88 个品牌资源冒烟回归通过,未改写正在使用的开发服务缓存。 - 遵循用户安排未访问项目浏览器,实际拖动手感和旋转后的连线视觉仍由用户试用反馈。 - 生产构建:Next.js 16.4.5,TypeScript 检查及 6 个页面静态生成成功。 - API 会话测试:HttpOnly / SameSite Cookie、令牌不返回前端、带会话代理、401、跨站拒绝、非法 Origin、路径白名单、OAuth challenge 校验通过。 - 线上轻量检查:profile 401;空登录参数 400;Slack 与 Google 启动登录均返回 302,目标分别为 slack.com、accounts.google.com。未执行真人账户登录。 - 浏览器:登录/注册切换、演示画布创建、搜索无结果、打开画布、笔记保存、待办勾选,以及未登录访问 /dashboard 返回 /login。 - 1440px 首页和 390px 首页/工作台:页面宽度等于视口宽度,未发现横向溢出。首页图片全部加载。 - Figma:原为 DIRECT;已添加 figma.com、figmausercontent.com 代理规则并从实际连接确认 DomainSuffix 生效。验证时代理组当前节点为香港 Y03。 - 本机生产预览:http://localhost:17321(只监听本机)。 - 尚未完成:真人 OAuth / 邮箱验证完整回路、后端项目回调地址匹配、完整编辑器布局持久化、分享/收藏/Agent。 - 本项目仅本地创建,未新建 Gitea 远程仓库、未提交或推送。 后续性能检查与首次创建流程修复已完成,最终构建、API smoke、4 项流程回归与隔离浏览器验收通过。详见 PERFORMANCE.md。 ## 真实账号创建验收 已在用户已登录的 Chrome 中打开 http://localhost:17321/dashboard。初始空间列表为空;使用新建画布流程提交用户原先填写的「周末的灵感」后,创建了「个人空间」和该画布。完整刷新页面后,侧栏和主列表仍显示该画布,确认读取到后端持久化记录。此项为真实账号验收,补充此前只完成隔离模拟测试的限制。 ## App Router 迁移验收(2026-11-05) - 全部页面迁入 `src/app`;根布局提供全局样式、`zh-CN`、标题及描述。工作台通过 `next/navigation` 读取演示参数,入口提供 Suspense 边界。 - 两个 API 改为 Route Handlers,保留会话 Cookie、Origin 校验、路径和查询参数白名单、15 秒超时、请求取消及 Server-Timing;显式保留 1 MiB 请求体限制。 - `npm run build -- --webpack`:通过,构建结果全部为 App Router 路由。 - 默认 `npm run build`:当前环境禁止 Turbopack CSS 工作进程绑定本地端口而失败;没有更改项目默认构建器。清理迁移前 `.next` 缓存后,Webpack 编译、类型检查和静态生成均通过。 - `npm run typecheck`:通过。 - `node --experimental-strip-types --test tests/workspace.test.mjs`:4 项通过。 - `node tests/api-smoke.mjs`:通过。覆盖首页、登录、登录回调、真实及演示工作台的 HTTP 响应、语言/标题/描述/viewport、404、Cookie 与令牌隔离、HTTPS Secure Cookie、登录态代理、跨站及非法 Origin、路径及查询白名单、请求方法、非法 JSON、超限请求体、Google/Slack 302、无效 challenge 和 204 退出清除 Cookie。 - 本次未重跑浏览器交互与响应式验收:浏览器连接不可用;未进行真人账户登录或部署验证。 - 迁移前 Pages Router 快照已先推送到现有仓库 main;本次迁移按用户明确授权直接更新 main,不创建 PR。 ## 合并侧栏与新建图谱(2026-11-05) - 移除最左侧独立 icon 栏,侧栏使用纵向 flex;顶部操作、搜索栏和底部账户按钮内部使用横向 flex。 - Lucide 图标按钮以 16×16px 图标、上下 4px / 左右 6px 内边距实现;收起后只保留左上角浮框,可恢复侧栏或新建页面。 - 账户弹出框使用原生 Popover,支持浏览器的外部点击及 Escape 关闭;菜单提供实际用户资料、空间切换和退出。 - 创建契约核对 Foundry Core 主线 `e8ed5e4` 的 materials/workspaces 实现:`kind=board`,后端生成 ID、workspace 归属、版本;前端提供默认名称“未命名图谱”,首次创建时可先建立“个人空间”。 - 类型检查通过;6 项 workspace 单元测试通过,包含默认名称、ID 和 workspace 保留、路由编码、首次建空间及失败重试。 - 在独立临时目录执行 `npm run build -- --webpack` 成功,未改写当前开发服务的构建缓存。 - 隔离生产构建的 API 冒烟测试通过,新增模拟 Foundry 的创建 201、会话转发、默认名称与 schema、按生成 ID 重新读取及图谱路由 200 检查。 - 按用户要求不访问浏览器,本次未验证实际界面交互或使用真实账户创建图谱;浏览器和线上验收由用户后续反馈。 ## 侧栏动画、字体与 Google 头像(2026-11-06) - 使用固定版本 Motion for React 14.9.1:侧栏宽度和位置以 240ms 缓动变化,浮框以 140ms 淡入淡出;系统减少动态效果偏好下立即切换。收起时侧栏设为 inert/aria-hidden,焦点转移到展开按钮。 - 侧栏主文字改为 14px、#37352f;列表内边距改为 4px 8px,行高 20px,最小高度 30px;个人空间等分组标题保持原来的 11px 浅灰色。 - 账户弹出框重新设置分区、工作空间图标、用户资料、头像、分隔线、边框和阴影,保留原生 Popover 的 Escape 与外部点击关闭;账户设置和新建工作空间接入实际 profile PATCH / workspaces POST。 - Foundry 主线已保存 OAuth picture 并通过 profile.avatar_url 返回,本次补齐前端类型和头像渲染,无需修改后端。图片失败或缺失时回退首字,图片使用 no-referrer。 - 类型检查与 6 项 workspace 测试通过;隔离临时目录的 Webpack 生产构建及 API 冒烟检查通过,新增头像 URL 透传、资料修改后保留头像的检查。 - 沿用用户“不访问浏览器,由用户试用反馈”的要求,未运行本次浏览器视觉、动画及真实 Google 头像加载验收;未修改真实账户资料。 ## 全屏画布与原始品牌资源(2026-11-06) - 删除图谱顶部标题栏及相关 CSS;画布 `position: fixed; inset: 0; height: 100dvh`,侧栏和浮框保留在更高层级,加载与错误消息以浮层显示。 - 收起侧栏后,将原新建按钮位置替换为 Logo 链接,目标为主页 `/`;Logo 提供 1x/2x/3x PNG,展开侧栏的新建按钮不变。 - 从旧 PROMPT 提交 `47467874841ea7f7b4b362d4ec0e66f236c6a7d6` 复制 88 个原始 PNG/ICO/SVG,逐一核对 Git blob 哈希完全一致;PNG 尺寸为 16px 至 2048px。 - 全局 Brand 组件与根布局 favicon/Apple Touch 元信息使用迁入资源。 - 按用户约定不访问浏览器,视觉与点击交互由用户试用反馈;自动检查覆盖资源 HTTP 响应和字节一致性、图标元信息及既有接口流程。 - 本次类型检查、隔离 Webpack 生产构建、6 项 workspace 测试及扩展 API 冒烟检查均通过;88 个品牌资源的 HTTP 状态和响应字节与本地原文件一致。 ## React Flow 与悬浮工具栏(2026-11-06) - 根因:此前画布仅为静态点阵 div,没有安装或渲染 React Flow。本次加入固定版本 `@xyflow/react@12.12.1` 和官方样式,使用 ReactFlowProvider / ReactFlow 实现真正的平移、缩放、节点拖动、连线与多选。 - 默认启用空白处左键拖动平移和触控板滚动平移,Ctrl/Meta 激活滚动缩放,支持捏合与空格平移;抓手模式关闭节点拖动,并让节点编辑区域的指针事件穿透到画布。 - 底部工具栏提供选择、抓手、文字、图片、脚本、创作模板与导入;右上角提供撤销重做、缩放、100%、适应画布及导出。没有接入虚假的 AI 生成或会员功能。 - 左上角增加 Google 头像入口;共享账户 Popover 移出会变为 inert 的侧栏,收起时将弹出位置改为左上角,保留原账户设置、空间切换及退出功能。 - 节点、连线和视图暂存 localStorage,按 workspace 与 board 分离;这不是服务端同步。导入校验节点/边/图片来源/视图/大小,导出提供 JSON 备份;存储失败明确提示。 - 13 项自动测试通过:节点位置变化与撤销重做、删除连线清理、文字编辑事务、导入导出、恶意图片与无效图谱拒绝、草稿隔离、历史上限及既有工作空间流程。 - 类型检查、隔离 Webpack 生产构建和完整 API 冒烟回归通过;原有 88 个品牌资源与账户/Foundry 创建接口保持通过。 - 遵循用户不访问浏览器的安排,未做实际浏览器拖动、触控手势和视觉验收;不将状态测试表述为已完成浏览器手感验收。 ## 悬浮栏标题与尺寸统一(2026-11-06) - 当前图谱标题通过共享 ActiveBoardProvider 从图谱页面传到左上悬浮栏,按图谱 ID 与 workspace 校验,避免错显上一张图谱;不增加重复 API 请求,长标题省略并保留完整 title 属性。 - 统一所有悬浮栏的 surface 样式:16px 图标、28×24px border-box 按钮、12px 字体、4px 内边距、2px 间隙、8px 圆角;浮框头像缩为 16px,账户菜单内头像仍保持原尺寸。 - 删除 canvas 工具栏的 content-box 与 8px/9px 内边距覆盖,缩放文字和帮助按钮采用同一高度、字号及容器;下方和右侧距屏幕边缘统一 12px。 - 沿用不访问浏览器的安排,本次验证以类型检查、生产构建和现有接口回归为准,未进行浏览器视觉验收。 - 本次类型检查、隔离 Webpack 生产构建和完整 API/品牌资源冒烟检查均通过。 ## 悬浮栏 32px 图标试用(2026-11-06) - 按用户要求将共享悬浮栏图标、Logo 和头像改为 32×32px,按钮改为 44×40px,主文字 14px;保留 4px 容器内边距,整体高度 50px。 - Logo 切换到 32/64/128px 原始资源,账户与帮助弹出框偏移同步调整,窄屏工具栏允许横向滚动。 - 类型检查和差异检查通过。本次为尺寸试调,未重复生产构建,未访问浏览器。 ## 修正 32×32 总尺寸(2026-11-06) - 用户澄清 32×32 指包含 padding 的按钮总尺寸。统一使用 border-box 的 32×32px 按钮,内部图标、Logo 与浮框头像为 20px,保留上下 4px、左右 6px 内边距;主文字仍为 14px。 - 公共图标按钮默认尺寸同步修正,悬浮栏整体高度为 42px;账户和帮助弹出框偏移随之调整,保留高清 Logo 资源。 - 类型检查及差异检查通过;本次尺寸修正未重复构建或访问浏览器。 ## 悬浮栏间距微调(2026-11-06) - 控件间距从 2px 增加到 4px,统一应用于左上、右上、底部及帮助悬浮栏;保持图标按钮含 padding 总尺寸 32×32px。 - 差异检查通过;仅调整 CSS 间距,未重复构建或访问浏览器。 ## 左上角标题改名(2026-11-06) - 标题交互为 idle → selected → editing,第一次点击选中,第二次点击编辑;支持 Enter/失焦保存、Esc 取消、F2 编辑与输入法组合输入保护。 - 改名前 GET 最新图谱,PATCH 携带带引号的 If-Match 版本、原 description/content;成功后更新共享标题、侧栏列表及导出使用的名称。演示模式写入本地列表,跨图谱切换不会覆盖新图谱的标题。 - 名称去除首尾空格,拒绝空名及超过 300 UTF-8 字节的名称;版本冲突不自动覆盖或重试,失败保留输入。 - 类型检查和 16 项画布/工作空间测试通过,新增原内容保留、名称校验和版本冲突不重试的检查。 - 按既定约定不访问浏览器,未进行实际点击与输入法交互验收。 - 隔离 Webpack 生产构建和完整 API 冒烟检查通过;新增改名 PATCH/If-Match、204 响应、重新读取名称和内容保留检查通过。 ## 参照右上控件调整分组留白(2026-11-06) - 右上现有尺寸和间距保持不变;左上与底部采用稍宽的 6px 横向间隙和横向内边距,保持 4px 竖向内边距与 32×32px 按钮。 - 左上在标题前后增加与右上相同的分隔线,去掉标题额外外边距;三处分隔线改为共享样式。 - 类型检查和差异检查通过;本次 CSS 留白试调未重复生产构建或访问浏览器。 ## 选中节点四向加号(2026-11-06) - 节点 selected 时显示上/下/左/右四个加号,未选中时隐藏;加号使用 nodrag/nopan 并阻止指针事件传播,避免触发节点或画布拖动。 - 点击按实际测量的节点尺寸在对应方向新增文字节点并自动连线,重复添加避开已有节点;选择与视图跟随新节点,添加及连线组成一步撤销。 - 四侧使用命名 Handle 与 Loose 连接模式;保留旧无名连接点用于已有连线,导入导出校验并保留新的 sourceHandle/targetHandle。 - 类型检查与 18 项自动测试通过,新增四向位置、连接方向持久化、一步撤销和重复添加避让测试。 - 按用户既定安排不访问浏览器,本次未进行视觉和实际点击验收。 - 隔离 Webpack 生产构建与完整 API/路由/品牌资源冒烟回归均通过。