This commit is contained in:
yinsx
2026-01-23 15:23:04 +08:00
commit 5674ce116e
34 changed files with 3901 additions and 0 deletions

223
产品设计.md Normal file
View File

@ -0,0 +1,223 @@
# Promptitab 风格“逻辑型交互”完整多端项目Extension + Web + Mobile H5架构与 UI 交互实现方案SCSS
> 技术栈Vite + Vue3 + TypeScript + Pinia + SCSS
> 目标:交互完整、符合 itab 这类“逻辑型工作台”的使用习惯UI/交互都能跑通(后端接口先 mock支持插件 New Tab + Web 预览 + 移动端 H5。
> 风格iOS 扁平化 + 轻拟物(圆角/阴影/磨砂)+ 丝滑动画
> 规范:统一样式放全局 SCSS组件目录 `ComponentName/index.vue + index.scss`
> 补充Icon/Widget 下方都有 label单行省略Icon 必须可重命名)
---
## 0) 你必须理解“符合 itab 的逻辑型交互”是什么意思(必须按此实现)
itab 类产品的核心不是“能拖就行”,而是**工作台逻辑**:用户进入新标签页后,第一时间完成“搜索/打开网站/查看信息/快速编辑”,交互必须满足:
1) **默认浏览模式是“可用态”**:点击即打开、滚动即查看;不会因为可拖拽导致误触。
2) **编辑模式是“布局态”**:所有拖拽、尺寸、删除、批量操作只发生在编辑模式,且有明显工具条与控件。
3) **行为一致**:空白处/元素处右键菜单内容合理分层;同一入口在桌面与移动端有等价替代(右键=长按)。
4) **轻干扰但明确反馈**toast、状态条、占位符、落位动画都要“轻”不要吓人但要清晰。
5) **数据先本地后同步**:首屏永远本地秒开;同步/登录只影响“增强能力”,不阻断使用。
6) **组件是“卡片 + label”**label 是信息结构的一部分(命名/识别),不是装饰;重命名入口必须自然(右键/设置/编辑态)。
---
## 强约束(必须遵守)
1) 三端同源代码Web/Extension/Mobile H5 共用同一套 Vue3 + Pinia 业务代码;通过 build target/adapter 区分环境。
2) Web 可直接预览:无需插件即可体验完整 UI/交互。
3) Pinia 必须作为核心状态管理:避免 props 风暴。业务状态/交互状态/弹窗菜单状态必须进 store。
4) 禁止第三方拖拽/网格库:不得使用 react-grid-layout、gridstack、interact.js网格拖拽必须原生Pointer Events + rAF + transform + 自研 push-down/compact。
5) 仅鼠标/触控交互:不需要键盘辅助。
6) 元素规则固定:
- Icon固定 `1×1`,可移动/编辑/删除/锁定;不可缩放。
- Widget尺寸只能切换`1×1, 1×2, 2×1, 2×2, 2×4`(离散)。
7) 每个元素都有 label单行省略Icon 必须支持重命名Widget 可选)。
8) 组件封装目录强制:`ComponentName/index.vue + index.scss`
9) 统一样式:全局 SCSS`global.scss`)集中 token组件局部 SCSS 只能引用 token。
10) 丝滑动画:必须给出统一动效体系,所有交互动效使用同一套 motion token。
---
# 你需要输出的 Markdown 文档结构(必须严格按顺序)
## 1. 产品与交互总览itab 逻辑型)
- 用户进入新标签页的 3 个主任务路径(例如:搜索→打开;快速访问→打开;查看组件→轻操作)
- “浏览模式/编辑模式”的设计原则与对用户心智的解释
- 一致性原则:桌面/移动端等价交互映射(右键=长按)
## 2. 信息架构 IA页面/面板/弹窗/菜单:必须完整)
必须列出所有入口并写:
- 触发方式(按钮/右键/长按/侧边栏)
- 承载容器(面板/弹窗/抽屉/路由页)
- 关闭方式(点击遮罩、返回、关闭按钮)
- 与主页面的关系(是否阻断、是否保留状态)
至少包含:
- 主页面(搜索栏 + 网格 + 侧边栏)
- 侧边栏面板:账号、组件库、设置、主题/壁纸、同步中心、帮助/关于
- 弹窗:登录、添加/编辑 Icon、Widget 设置、导入导出、确认删除
- 菜单空白右键、Icon 右键、Widget 右键(移动端长按 ActionSheet
- Onboarding 新手引导(首次进入)
## 3. 关键交互规范(必须写到“照着就能实现”,并符合 itab 逻辑)
### 3.1 浏览模式(默认态)
必须定义:
- 点击 Icon打开链接新标签/当前标签策略写清,可在设置里切换)
- 点击 Widget进入 widget 的“轻交互”(如滚动、按钮刷新、查看详情);不触发拖拽
- 点击 label默认与点击卡片一致或只选中不打开——你必须选一个并解释为啥更像 itab
- hover/pressed 反馈:阴影、缩放、光泽(轻拟物)
- 空白处点击:取消选中、关闭菜单
### 3.2 编辑模式(布局态)
必须定义:
- 进入/退出入口(顶部工具条/侧边栏开关/右键菜单)
- 编辑模式视觉:
- 网格底纹
- 卡片工具按钮(锁定/删除/设置/尺寸)
- 选中态描边
- 编辑模式操作:
- 拖拽移动只允许从手柄触发label 不触发拖拽)
- Widget 尺寸切换(五档 size picker
- 多元素管理(至少支持:批量删除 或 批量锁定 任选其一;若不做必须说明原因)
- 编辑模式退出后自动保存布局toast 提示(轻提示)
### 3.3 右键菜单itab 逻辑:层级清晰、动作合理)
必须分别定义:
1) 空白处右键菜单
2) Icon 右键菜单
3) Widget 右键菜单
对每一项写:名称/图标/动作/是否二级菜单/是否需要确认。
必须包含与 itab 逻辑一致的动作集合(可微调但要齐全):
- 空白:添加 Icon、添加 Widget、进入/退出编辑模式、主题/壁纸、布局设置compact/网格密度)、导入导出、同步中心、帮助/关于
- Icon打开、在新标签打开或设置项控制、编辑含重命名、更换图标、复制链接、删除、锁定/解锁
- Widget刷新、设置、尺寸五档二级菜单、复制配置mock、删除、锁定/解锁
移动端替代:
- 长按空白/元素 → ActionSheet同菜单项结构
### 3.4 侧边栏(工作台逻辑:主入口集合)
必须定义:
- 桌面侧边栏开合overlay + 磨砂背景)
- 分区:账号区(头像/登录态)、快捷区(编辑/同步/主题)、面板区(组件库/设置/主题/同步)
- 面板切换动效与状态保留(切换后保留滚动位置与筛选条件)
- 与编辑模式联动:进入编辑模式时自动打开“组件库/布局设置”面板(或保持上次面板——你必须选一个并解释)
移动端:
- 侧边栏替代形态(建议全屏面板或底部抽屉),写清返回逻辑与层级管理
### 3.5 Label逻辑型识别与管理
必须定义:
- label 视觉:单行省略、对齐、间距(使用全局 label token
- label 的交互:
- 浏览模式:点击 label 的行为(与卡片一致 or 仅选中)
- 编辑模式label 不触发拖拽;重命名入口(至少 Icon
- label 与布局关系:
- 网格占用只算卡片w×hlabel 是视觉附属
- 像素渲染要加固定 labelHeight避免视觉重叠写公式
---
## 4. 工程架构Vite + Vue3 + TS + Pinia多端同源
### 4.1 Monorepo 目录结构(必须可落地)
给出目录树并解释职责,要求包含:
- apps/web、apps/extension、apps/mobile可选
- packages/core、ui、engine、widgets、shared
- 每个模块的职责边界与依赖方向(禁止环依赖)
### 4.2 组件文件组织(必须符合你的封装规范)
- 每个组件一个文件夹:`ComponentName/index.vue` + `index.scss`
- UI 基础组件与业务组件放置规则
- 示例Sidebar/ContextMenu/GridCanvas/IconTile/WidgetCard/Label
---
## 5. Pinia 设计(避免 props 风暴,必须非常具体)
### 5.1 Store 拆分与字段(必须给清单)
至少包含:
- useLayoutStoreitems、layoutsByBreakpoint、editMode、selectedId、dragState、compactEnabled、gridConfig
- useUIStoresidebarOpen、activePanel、dialogs、toasts、contextMenuState、actionSheetState移动端、overlayStack
- useAuthStoreuser、token(mock)、status
- useSettingsStoretheme、wallpaper、searchEngine、openLinkBehavior、gridDensity、motionLevel可选
- useWidgetsStoreregistry、instances、schemas、mockData
- useSyncStoresyncState(mock)、lastSyncAt、conflictFlag
- useOnboardingStorehasSeen、steps、currentStep
必须写:
- 哪些组件只通过 store 取数据(容器组件)
- 哪些组件允许 props纯展示
- 如何避免 store 间耦合:通过 services/adapters 作为协调层
---
## 6. UI 风格与全局 SCSS必须能“一处改全局”
### 6.1 global.scss 结构与 tokens必须详细
- tokens.scssSCSS 变量 + :root CSS variables 映射(推荐双层)
- reset/base/utilities/components
- 必须列出 token 分类与命名规则(颜色/圆角/阴影/动效/间距/层级/label
### 6.2 通用组件样式(必须给示例)
- Card、Button、Menu、Drawer、Modal、Toast、Label 的通用 class 示例(引用 token
- pressed/hover 状态的阴影与轻缩放
- 磨砂背景 class带降级
---
## 7. 动效体系(必须体现“丝滑”与一致性)
- motion tokenduration/easing
- 菜单/抽屉/弹窗/落位动画统一规则
- 拖拽落位动画松手后卡片过渡到最终位置transform 过渡)
- 避免卡顿策略:只动 transform/opacity/box-shadow
---
## 8. 网格布局引擎(原生算法,必须给伪代码)
必须包含并解释:
- collides(a,b)
- clampRect(rect, cols)
- resolvePushDown(target, items, cols):队列迭代 + 固定排序 + icon 优先被推挤
- compactIcons(items, cols)icon-only compact可配置
- findFirstFit(size, items, cols, startY)
并写清:
- 拖动中transform + placeholder
- 松手 commitresolve + compact + save + 落位动画
- labelHeight 的像素渲染处理公式
---
## 9. Mock 与持久化IndexedDB
-layout/settings/user/widgetsData/onboarding
- 迁移version + migrations
- mock 登录、mock 同步、mock widget 刷新、模拟网络失败开关
- 导入导出 JSON包含 label
---
## 10. 逐功能实现清单(必须覆盖 itab 常见功能)
用“功能 → UI 入口 → 交互流程 → store 字段变化 → 组件列表”形式写清:
- 搜索(引擎切换、输入框动效、建议 mock
- Icon 管理(添加/编辑/重命名/更换图标/删除/锁定)
- Widget 管理(添加/设置/刷新/尺寸切换/删除/锁定)
- 主题/壁纸(选择、预览、应用、随机切换 mock
- 设置(布局设置、打开链接行为、动效强度、隐私)
- 同步中心mock
- Onboarding 引导(高亮与遮罩)
- Toast/错误态/空态
---
## 11. 验收标准(至少 35 条,必须体现“符合 itab 逻辑型交互”)
必须覆盖:
- 默认浏览模式不误触拖拽,点击即打开/查看
- 编辑模式才可拖拽与改尺寸,退出自动保存
- 右键菜单/长按菜单结构合理、定位正确、动效顺滑
- 侧边栏作为“主入口集合”逻辑清晰
- label 显示与重命名流程自然(至少 Icon
- 全局 SCSS 改 token 可全局换肤(圆角/阴影/颜色/动效)
- Web 可预览、Extension 可运行、H5 交互等价(右键=长按)
- 性能TTI、拖拽帧率、commit 耗时可观测(本地开发面板)
---
## 输出要求(必须)
- 输出必须是 Markdown
- 不要空话给参数cols/rowHeight/gap/snap阈值/labelHeight/动画时长)
- Pinia 设计要清晰,避免 props 风暴
- 拖拽网格必须自研原生算法
- 登录/同步/刷新均 mock但 UI/交互要完整可实现