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

12 KiB
Raw Blame History

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. 统一样式:全局 SCSSglobal.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/交互要完整可实现