完成事项详解 8 项
01 文字颜色全面升级 — 纯白替换灰阶
改前:--text: rgba(var(--paper-rgb), .92) ≈ rgb(210,210,212) — 灰色
改后:--text: #fff — 纯白
波及约 80+ 处文字节点:header、面板、滑块、导出控件、弹窗、toast、页脚。
02 撤销/重做按钮 — 7 次迭代 #066
改前状态:transparent + 微边框,在 header #161618 背景上完全隐形。
| 次数 | 方案 | 结果 |
| 1 | transparent + 微边框 | 透出 header 底色,隐形 |
| 2 | accent 实心紫底 + 白字 | WCAG 2.77:1 FAIL |
| 3 | ghost button(transparent + 微边框) | header 不够黑,消失 |
| 4 | rgba(paper-rgb,.14) 浅色衬底 | 用户:"不要再用浅色" |
| 5 | #fff 白底 + 黑色字 | 用户说不要背景色 |
| 6 | 纯白 outline(白边框 + 白字) | 用户说不够 |
| 7 | 白框白字 + 去掉 JS opacity 覆盖 | ✅ 用户确认 |
根因:JS updateUndoButtons() 设了 .style.opacity = '.3',inline style 优先级高于一切 CSS,前 6 次全白费。
03 画布拖拽调换修复 #067
问题:图库→画布正常,画布内互换完全不行,drop 事件不触发。
根因:HTML5 DnD 规范 — effectAllowed(dragstart)与 dropEffect(dragover)必须兼容。三处 dropEffect = 'copy' 硬编码,但 cell 设了 effectAllowed = 'move' → 不兼容 → 浏览器丢弃 drop。
// 修复:所有 dragover handler 改为动态匹配
e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed === 'move' ? 'move' : 'copy';
次要问题:reorderPhotos() 调用 render() 替换了 canvas.innerHTML,DOM 替换破坏浏览器拖拽状态。
解决:用 pendingReorder 标记延迟到 dragend 才 render。
04 Canvas 尺寸实时显示
画布右上角 overlay 标签,用小字号 monospace 实时显示 宽×高 px。无照片时显示 —。
基于 ResizeObserver 监听画布容器。
05 导出目录记忆
用户问"为什么保存后下次导出不是自动切到上次目录"。
修复:showSaveFilePicker() 加 id: 'collage-export' 参数,浏览器自动记忆目录。
06 Tooltip 提示系统 35+ 控件
方案:HTML title 属性,零依赖零开销。
07 API Token 找回与归档 #068
用户曾在 Cloudflare Dashboard 创建 API Token,上下文压缩后丢失。用户反问"我问你很简单的道理,我没给过你,前几次,你又怎么可能自己能部属呢?"
从 transcript JSONL(第 11108 行)搜索找回 Token:cfut_kNNQzyXjsdRDgqMyZUZ5cspkiAqjQQrqc21cOODNac20f49e
归档到 我的私密.md,建立铁律:凭据收到即写入私密文件。
08 部署到 Cloudflare Pages
第一次:IP 限制 code: 9109 — token 绑了 IPv6 2409:8a55:5180:2821:d493:c3aa:30c0:4d3d
用户到 Dashboard 加入 120.230.56.186
第二次:项目已存在
第三次:✅ 部署成功
npx wrangler pages deploy . --project-name=collage-maker2 --branch=main
✨ Success! Uploaded 21 files (3.84 sec)
✨ Deployment complete! → https://collage-maker2.pages.dev