Skip to content

♻️ 新 UI 重写:shadcn/ui + Tailwind v4 + React 19 全面重构表现层#1514

Draft
CodFrm wants to merge 123 commits into
release/v1.4-agentfrom
develop/new-ui
Draft

♻️ 新 UI 重写:shadcn/ui + Tailwind v4 + React 19 全面重构表现层#1514
CodFrm wants to merge 123 commits into
release/v1.4-agentfrom
develop/new-ui

Conversation

@CodFrm

@CodFrm CodFrm commented Jun 17, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试(单元测试已覆盖,真机可视化验收进行中)

设计稿.pen.zip

Description / 描述

🚧 草稿 PR:整个新 UI 重写的集成 PR,合并目标为 main。目前仍在做各页面的真机可视化验收,完成后再转为正式 PR。

使用 shadcn/ui + Tailwind CSS v4 + React 19src/pages/ 表现层进行从零重写,替换原有的 Arco Design + UnoCSS 技术栈。设计系统(颜色令牌、组件、布局/动效/状态规范)统一沉淀在 docs/DESIGN.md,所有页面同时适配亮色/暗色主题(Tailwind dark: 变体 + src/index.css 设计令牌)。

已完成页面

核心管理页

  • 脚本列表(ScriptList,含表格/卡片、过滤侧栏、批量操作、移动端)
  • 订阅列表(SubscribeList)
  • 脚本编辑器(ScriptEditor,Monaco + 多标签 + 代码/资源/设置/存储面板)
  • 日志(Logger)、设置(Setting)、工具(Tools)
  • 弹出层(popup)

独立页面

  • 安装页(install,身份→权限→代码 信任优先布局,脚本/订阅/Skill 安装、本地文件监听、移动端)
  • 数据导入页(import,数据导入/备份恢复)
  • 授权确认页(confirm,时长选择 + 允许/拒绝)
  • 批量更新页(batchupdate,表格勾选 + 风险标签 + 已忽略分组)

Agent 套件(7 页)

  • 会话(AgentChat,三栏可折叠 + 流式 + thinking/工具调用/任务列表/ask_user/附件富块 + 移动导航抽屉)
  • 模型服务(AgentProvider)、Skills、MCP、定时任务(AgentTasks)、OPFS 文件浏览器、设置(AgentSettings)

其它

  • i18n:7 种语言(zh-CN / zh-TW / en-US / ja-JP / de-DE / ru-RU / vi-VN)同步更新
  • 测试:遵循 TDD,使用 vitest + Testing Library,新页面均有单元/组件测试覆盖
  • 文档:新增 docs/DESIGN.md,更新 docs/DEVELOP.md / docs/README.md 等贡献者文档

待办(转正式 PR 前)

  • 各页面真机可视化验收(亮色/暗色 + 桌面/移动)
  • 页内功能与旧版逐项对账复核

Screenshots / 截图

CodFrm added 30 commits April 6, 2026 00:14
移除基于 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
@cyfung1031

Copy link
Copy Markdown
Collaborator

9e80ae2 Editor侧栏隐藏后,能以hover方式展开

screen-capture.3.-00.00.15.265-00.00.43.778.mp4

@cyfung1031

Copy link
Copy Markdown
Collaborator

1addb76 ui adjust - BatchActionsBar / FilterBar

screen-capture.4.-00.00.01.876-00.00.26.497.mp4

@cyfung1031

Copy link
Copy Markdown
Collaborator

4aadf3b 统一 Icon (Update / Sync)

Screenshot 2026-06-19 at 11 45 20 Screenshot 2026-06-19 at 11 45 52

@cyfung1031

cyfung1031 commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

@CodFrm 用AI做了这个 preloadable-query.ts 的工具 f8cfabd
它解决了我们一直以来面对的问题: 用 useEffect 异步载入然后搞一大堆 mounted 什么。但开启页面时会有空白时间。
我用这个 createPreloadableQuery 做了一个例子

ResourcePane 未使用 createPreloadableQuery

screen-capture.6.-00.00.05.193-00.00.15.282.mp4

ResourcePane 使用了 createPreloadableQuery

screen-capture.5.-00.00.08.695-00.00.20.990.mp4

在 按进脚本页时先做 preload
在 tab 确认进入,React开始构建做 query (自动搞 useEffect )
最后会清回 cache

key传 function, 回传 string 即可。简单例是 uuid.
这样 React 就能用 string key 判断要不要改state

@CodFrm

CodFrm commented Jun 19, 2026

Copy link
Copy Markdown
Member Author

@CodFrm 用AI做了这个 preloadable-query.ts 的工具 f8cfabd

它解决了我们一直以来面对的问题: 用 useEffect 异步载入然后搞一大堆 mounted 什么。但开启页面时会有空白时间。

我用这个 createPreloadableQuery 做了一个例子

ResourcePane 未使用 createPreloadableQuery

screen-capture.6.-00.00.05.193-00.00.15.282.mp4

ResourcePane 使用了 createPreloadableQuery

screen-capture.5.-00.00.08.695-00.00.20.990.mp4

在 按进脚本页时先做 preload

在 tab 确认进入,React开始构建做 query (自动搞 useEffect )

最后会清回 cache

key传 function, 回传 string 即可。简单例是 uuid.

这样 React 就能用 string key 判断要不要改state

可以考虑状态管理库,比如 zustand

前后色都是浅色,导致字好难看。

我感觉还好,看你有什么更好的想法

@cyfung1031

cyfung1031 commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

zustand

之前研究过但不适合ScriptCat所以一直都没提这方面的PR
(ScriptCat 的 data 不是什么 state 管理问题。 本质就是用 extension api 存取。完全不一样)

用这个 createPreloadableQuery 就好。符合 ScriptCat 设计
又不用引入一堆库

cyfung1031 and others added 7 commits June 19, 2026 17:49
For new (unsaved) scripts, scriptClient.info(uuid) via doThrow throws
when the UUID is not in storage yet. This propagated to toast.error in
usePreloadResourcePane/SettingsPane/StoragePane, whose error toast was
misread by saveCurrentEditor's any-toast heuristic as a save success,
causing installScriptByCode to exit before the script was actually saved.
GM API e2e tests then found failed=-1 because the test script never ran.

Fix: add .catch(() => null/[]) at the fetchScript and
permissionClient.getScriptPermissions callsites so unsaved scripts
return empty results instead of throwing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cyfung1031

cyfung1031 commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

33e514c
6d5c403

之前 ArcoDesign 内部一直使用 dayjs,去除不了
现在可以直接用 Intl.RelativeTimeFormat 做 semTime 了

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat

cyfung1031 and others added 5 commits June 19, 2026 19:00
- Replace Arco Design + UnoCSS with the current shadcn/ui + Tailwind CSS v4 stack
- Replace all `translation.json` references with the actual per-namespace file structure (common.json, popup.json, etc.)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cyfung1031

Copy link
Copy Markdown
Collaborator

e2e speed up 7ca40dd

Before

Screenshot 2026-06-19 at 21 02 12

After

Screenshot 2026-06-19 at 21 02 21

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants