# Prompt：itab 风格“逻辑型交互”完整多端项目（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×h），label 是视觉附属
  - 像素渲染要加固定 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 拆分与字段（必须给清单）
至少包含：
- useLayoutStore：items、layoutsByBreakpoint、editMode、selectedId、dragState、compactEnabled、gridConfig
- useUIStore：sidebarOpen、activePanel、dialogs、toasts、contextMenuState、actionSheetState（移动端）、overlayStack
- useAuthStore：user、token(mock)、status
- useSettingsStore：theme、wallpaper、searchEngine、openLinkBehavior、gridDensity、motionLevel（可选）
- useWidgetsStore：registry、instances、schemas、mockData
- useSyncStore：syncState(mock)、lastSyncAt、conflictFlag
- useOnboardingStore：hasSeen、steps、currentStep

必须写：
- 哪些组件只通过 store 取数据（容器组件）
- 哪些组件允许 props（纯展示）
- 如何避免 store 间耦合：通过 services/adapters 作为协调层

---

## 6. UI 风格与全局 SCSS（必须能“一处改全局”）
### 6.1 global.scss 结构与 tokens（必须详细）
- tokens.scss：SCSS 变量 + :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 token：duration/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
- 松手 commit：resolve + 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/交互要完整可实现
