♻️ 新 UI 重写:shadcn/ui + Tailwind v4 + React 19 全面重构表现层#1514
Conversation
移除基于 Arco Design + UnoCSS 的旧 UI 层与相关依赖,为下一版
基于 Tailwind CSS + shadcn/ui 的 UI 重构做准备。
- 删除 6 个页面(options/popup/install/confirm/import/batchupdate)、所有 UI 组件、HTML 模板和 CSS
- 卸载 16 个 UI 相关依赖(@arco-design/web-react、unocss、@dnd-kit/*、react-dropzone、react-joyride、react-router-dom、react-icons、react-i18next、@playwright/test 等)
- 删除 e2e 测试目录与 Playwright 配置
- 更新 rspack.config.ts 移除 UI entry 和 HtmlRspackPlugin
- 更新技术栈文档(CLAUDE.md、copilot-instructions、CONTRIBUTING)
保留:非 UI 入口(service_worker/content/inject/offscreen/sandbox)、
monaco-editor、i18next、pages/store/{global,favicons,features/script}.ts
- 使用 Tailwind CSS + shadcn/ui 重构 popup 页面 - 实现完整业务逻辑:脚本列表、启用/禁用、删除、排除、GM 菜单等 - 添加 usePopupData hook 对接 service worker 后端 API 和实时订阅 - 新增 Popconfirm 组件用于删除确认 - 配置设计系统色彩令牌(品牌蓝、状态色、暗色模式) - 搭建 options 页面入口(骨架)
- 新增 Sidebar 组件:导航、帮助中心菜单(hover触发)、主题切换、折叠 - 使用 HashRouter 配置路由(脚本列表/订阅/日志/工具/设置/编辑器) - 提取 GithubIcon 组件替代 popup 和 sidebar 中的 inline SVG - i18n 使用已有翻译 key,与 release/v1.4 保持一致
- 将 translation.json 拆分为 11 个命名空间(common/agent/script/editor/settings/install/popup/logs/guide/tools/permission) - 升级 React 18→19、i18next 23→26,引入 react-i18next - 还原 SW 层 popup 逻辑至 v1.5(不在 SW 中处理 i18n) - 删除 Crowdin 配置、伪语言 ach-UG 及相关文档引用 - 修复 React 19 类型兼容(useRef、cloneElement)
# Conflicts: # package.json # pnpm-lock.yaml # src/app/service/service_worker/gm_api/gm_api.ts # src/app/service/service_worker/index.ts # src/locales/ach-UG/translation.json # src/locales/de-DE/translation.json # src/locales/en-US/translation.json # src/locales/ja-JP/translation.json # src/locales/ru-RU/translation.json # src/locales/vi-VN/translation.json # src/locales/zh-CN/translation.json # src/locales/zh-TW/translation.json # src/pages/components/CodeEditor/index.tsx # src/pages/components/UserConfigPanel/index.tsx # src/pages/components/layout/MainLayout.tsx # src/pages/install/App.tsx # src/pages/options/index.css # src/pages/options/routes/Logger.tsx # src/pages/options/routes/Setting.tsx # src/pages/options/routes/script/ScriptEditor.tsx # src/pages/popup/App.tsx
# Conflicts: # CONTRIBUTING.md # README.md # docs/CONTRIBUTING_EN.md # docs/CONTRIBUTING_RU.md # docs/README_RU.md # docs/README_ja.md # docs/README_zh-CN.md # docs/README_zh-TW.md # e2e/install.spec.ts # e2e/popup.spec.ts # e2e/script-editor.spec.ts # e2e/script-management.spec.ts # e2e/settings.spec.ts # e2e/vscode-connect.spec.ts # package.json # playwright.config.ts # pnpm-lock.yaml # src/app/service/content/scripting.ts # src/app/service/service_worker/gm_api/gm_api.ts # src/app/service/service_worker/index.ts # src/index.css # src/locales/README.md # src/locales/de-DE/translation.json # src/locales/en-US/translation.json # src/locales/ja-JP/translation.json # src/locales/locales.ts # src/locales/ru-RU/translation.json # src/locales/vi-VN/translation.json # src/locales/zh-CN/translation.json # src/locales/zh-TW/translation.json # src/manifest.json # src/pages/components/CodeEditor/index.tsx # src/pages/components/ScriptMenuList/index.tsx # src/pages/components/layout/MainLayout.tsx # src/pages/components/layout/Sider.tsx # src/pages/components/layout/SiderGuide.tsx # src/pages/confirm/App.tsx # src/pages/install/App.tsx # src/pages/install/hooks.tsx # src/pages/install/utils.ts # src/pages/options.html # src/pages/options/routes/AgentChat/ChatArea.tsx # src/pages/options/routes/AgentMcp.tsx # src/pages/options/routes/AgentOPFS.tsx # src/pages/options/routes/AgentProvider.tsx # src/pages/options/routes/AgentSettings.tsx # src/pages/options/routes/AgentSkills.tsx # src/pages/options/routes/AgentTasks.tsx # src/pages/options/routes/ScriptList/components.tsx # src/pages/options/routes/ScriptList/index.tsx # src/pages/options/routes/Setting.tsx # src/pages/options/routes/SubscribeList.tsx # src/pages/options/routes/Tools.tsx # src/pages/options/routes/script/ScriptEditor.tsx # src/pages/options/routes/script/index.css # src/pages/popup.html # src/pages/popup/App.tsx # src/pages/template.html # tests/pages/options/MainLayout.test.tsx
e2e speed up 7ca40ddBefore
After
|
@CodFrm 禁用了的脚本的 user config 色没变化 |
…ugin Switch from eslint-plugin-prettier to a dedicated `prettier --check` step in lint/lint:ci and `prettier --write` in lint-fix. ESLint no longer runs Prettier internally; formatting output is unchanged. Also: add .eslintcache to .gitignore, extend .prettierignore and ESLint ignores to cover coverage/.
- DESIGN.md 补充阴影(elevation)/z-index 分层/可访问性/表单校验/微文案章节 - 新增 --label-* 分类标签令牌族,脚本列表标签 chip 改用令牌(替代裸 green-50 等) - muted-foreground 调为 #767676 满足 WCAG AA 对比度 - 全局 prefers-reduced-motion 重置;自定义可点击元素补 focus-visible ring - 图标按钮补 aria-label;移除内联 i18n defaultValue 兜底并补全 7 语言包 key - 新增 SubscribeList 移动端卡片视图;popup 头部加 logo - 删除废弃 theme-toggle.tsx
|
这个 PR 的方向是对的:shadcn/ui + Tailwind v4 的基础接入、主题 token、暗色模式、页面重构思路都不错。 必修问题
中优先级问题
做得好的地方
建议合并门槛合并前至少修:
|
| @@ -1,3 +1,4 @@ | |||
| // can be tested with vitest-environment node | |||
There was a problem hiding this comment.
纯粹说明可以用 // @vitest-environment node 来做测试
只是现在用的是 happy-dom
| @@ -1,3 +1,4 @@ | |||
| // @vitest-environment happy-dom | |||
There was a problem hiding this comment.
这个注释是用来标记使用 happy-dom.
当然现在 default 就是 happy-dom, 只有少量是 jsdom
和default 一样的都可以删
但这样就只有 jsdom有注释其他没有
| @@ -1,3 +1,4 @@ | |||
| // can be tested with vitest-environment node | |||
There was a problem hiding this comment.
现在的是三个都标了出来。
// can be tested with vitest-environment node 可用 node, happy-dom, jsdom 做测试
// @vitest-environment happy-dom 指定为 happy-dom, 即预设,可用 happy-dom, jsdom 做测试
// @vitest-environment jsdom 指定为 jsdom,必须用 jsdom 做测试
|
感谢非常细致的 review 🙏 已逐条复现确认(先确认 bug 存在 → 补失败测试 → 修复),结论是这些问题基本都属实,已按 TDD 修复。全量单测 2837 通过, ✅ 必修项(合并门槛)—— 已全部修复
✅ 中优先级 —— 已修复
❌ 暂未处理(需确认 / 后续)
再次感谢 🙏 |



Checklist / 检查清单
设计稿.pen.zip
Description / 描述
使用 shadcn/ui + Tailwind CSS v4 + React 19 对
src/pages/表现层进行从零重写,替换原有的 Arco Design + UnoCSS 技术栈。设计系统(颜色令牌、组件、布局/动效/状态规范)统一沉淀在docs/DESIGN.md,所有页面同时适配亮色/暗色主题(Tailwinddark:变体 +src/index.css设计令牌)。已完成页面
核心管理页
独立页面
Agent 套件(7 页)
其它
docs/DESIGN.md,更新docs/DEVELOP.md/docs/README.md等贡献者文档待办(转正式 PR 前)
Screenshots / 截图