Files
ztab/产品设计.md
yinsx 5674ce116e 1
2026-01-23 15:23:04 +08:00

224 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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/交互要完整可实现