Files
kitchen/docs/design/IOS26_UI_DESIGN.md
2026-04-13 07:51:51 +08:00

544 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# 小妈厨房 iOS 26 UI 设计方案
> 版本: 1.3 | 日期: 2026-04-12 | 设计语言: Liquid Glass (iOS 26)
>
> 本文档是项目 UI 改造的完整规范,任何开发者(含 AI Coder必须按此方案执行。
---
## 目录
1. [设计语言Liquid Glass 核心特征](#一设计语言liquid-glass-核心特征)
2. [设计令牌 (Design Tokens)](#二设计令牌-design-tokens)
3. [页面架构总览](#三页面架构总览)
4. [各页面布局演示](#四各页面布局演示)
5. [导航流程图](#五页面导航流程图)
6. [组件规范](#六liquid-glass-组件规范)
7. [改进对比](#七关键改进点对比现有设计)
8. [暗色模式适配](#八暗色模式适配)
9. [响应式适配](#九响应式适配)
10. [实施计划](#十实施计划)
11. [iOS 组件清单](#十一ios-组件清单component-inventory)
---
## 一、设计语言Liquid Glass 核心特征
iOS 26 的 **Liquid Glass液态玻璃** 是苹果自 iOS 7 扁平化以来最大的视觉变革,灵感源自 Vision Pro。
### 五大核心特征
| # | 特征 | Flutter 实现 |
|---|------|-------------|
| 1 | 半透明毛玻璃 | `BackdropFilter` + `ImageFilter.blur(20)` |
| 2 | 动态光效/折射 | 渐变边框 + `Shimmer` 动画 |
| 3 | 深度层次感 | 多层 `Container` + `BoxShadow` |
| 4 | 圆角同心设计 | 统一 `BorderRadius` 体系 |
| 5 | 内容聚焦 | `Stack` + 半透明 `Positioned` |
### 与现有代码映射
```
TapLiquidGlassNavigation → 保留,升级为 GlassNavBar
FloatingCupertinoTabBar → 废弃,统一用 GlassNavBar
BottomBarStyle.liquidGlass → 透明玻璃杯效果(贴边样式)
BottomBarStyle.floating → 悬浮液态玻璃效果
ThemeService.primaryColor (#2196F3) → 改为 iOS 蓝 #007AFF
ThemeService.secondaryColor (#FF9800) → 改为 iOS 橙 #FF9500
```
### 设计原则
```
内容为王 · 一致性 · 深度感 · 流畅性(250-350ms) · 可达性(≥44px触摸/≥11px文字)
```
---
## 二、设计令牌 (Design Tokens)
> 所有页面必须基于此令牌,禁止硬编码颜色、间距、圆角。若令牌中无所需值,需先在此处添加再使用。
### 颜色体系
| 类别 | Token | 值 | 用途 |
|------|-------|-----|------|
| 主色系 | primary | `#007AFF` | iOS系统蓝 |
| | primaryLight | `rgba(0,122,255,0.1)` | 浅蓝背景 |
| | secondary | `#FF9500` | iOS系统橙 |
| 背景系 | background | `#F2F2F7` | iOS浅灰底 |
| | card | `#FFFFFF` | 卡片白 |
| | cardAlpha | `rgba(255,255,255,0.72)` | 半透明卡片 |
| 毛玻璃系 | glass | `rgba(255,255,255,0.45)` | 毛玻璃底色 |
| | glassBorder | `rgba(255,255,255,0.3)` | 毛玻璃边框 |
| | glassShadow | `rgba(0,0,0,0.06)` | 毛玻璃投影 |
| 文字系 | text1 / text2 / text3 | `#1C1C1E` / `#8E8E93` / `#C7C7CC` | 主/副/占位文字 |
| 功能色 | red / orange / green | `#FF3B30` / `#FF9500` / `#34C759` | 删除/热门/成功 |
### 圆角体系
| Token | 值 | 用途 | 同心规则 |
|-------|-----|------|---------|
| radius-sm | 8px | 标签/Chip/小按钮 | 内层比外层小4-8px |
| radius-md | 12px | 卡片/输入框/列表项 | xl→lg→md→sm |
| radius-lg | 20px | 大卡片/弹窗/搜索栏 | 28→20→12→8 |
| radius-xl | 28px | 底栏/全屏容器 | — |
| radius-full | 999px | 圆形头像/胶囊按钮 | — |
### 间距体系4的倍数
| Token | 值 | 用途 |
|-------|-----|------|
| space-1 ~ space-7 | 4/8/12/16/20/24/32px | 图标间距→页面顶部 |
### 毛玻璃参数
```
blur: 20-30px | opacity: 0.45-0.72 | border: 0.5px solid rgba(255,255,255,0.3) | shadow: 0 4px 16px rgba(0,0,0,0.06)
```
### 字体 / 阴影 / 动画
| 字体 | 值 | 阴影 | 值 | 动画 | 值 |
|------|-----|------|-----|------|-----|
| font-xs | 11px 标签/徽章 | shadow-sm | `0 1px 3px rgba(0,0,0,0.04)` | fast | 150ms 按钮 |
| font-sm | 12px 副文字 | shadow-md | `0 4px 12px rgba(0,0,0,0.06)` | normal | 250ms 页面切换 |
| font-md | 14px 正文 | shadow-lg | `0 8px 24px rgba(0,0,0,0.08)` | slow | 350ms 弹窗 |
| font-lg | 16px 标题 | | | curve | easeInOutCubic |
| font-xl | 18px 大标题 | | | | |
| font-xxl | 22px 页面主标题 | | | | |
---
## 三、页面架构总览
### Tab 结构变更
```
现有 4Tab: 新 4Tab:
Tab0: 🏠 首页 → Tab0: 🏠 首页 (信息流)
Tab1: 🛒 购物车(实为收藏)→ Tab1: ❤️ 收藏
Tab2: 🕐 足迹 → Tab2: 🔍 发现 (聚合页)
Tab3: 👤 个人中心 → Tab3: 👤 我的 (简化设置)
```
### 全局布局
```
┌─────────────────────────────────────┐
│ ⚠️ 离线横幅 (仅离线时显示) │
│ ┌─────────────────────────────┐ │
│ │ Page Content Area │ │
│ │ (IndexedStack 切换) │ │
│ │ 首页 | 收藏 | 发现 | 我的 │ │
│ └─────────────────────────────┘ │
│ 🫧 Liquid Glass 底部导航栏 🫧 │
│ 🏠首页 ❤️收藏 🔍发现 👤我的 │
└─────────────────────────────────────┘
```
### 导航栏规范
```
统一使用 CupertinoPageScaffold + CupertinoNavigationBar
背景: 毛玻璃(blur:20, opacity:0.72) | 标题: font-xl(18px)+text1
子页面: 左侧返回箭头(CupertinoIcons.back) | 右侧功能按钮(图标22px)
```
---
## 四、各页面布局演示
### Tab0首页Home
```
┌─────────────────────────────────────┐
│ 🍳 小妈厨房 🔔 👤 │
├─────────────────────────────────────┤
│ ┌─ 营养仪表盘 (NutritionDashboard)─┐ │
│ │ <20> 今日摄入: 热量/蛋白质/碳水...│ │
│ └──────────────────────────────────┘ │
│ │
│ 🌊 发现 24 项 │
│ 探索菜谱、食材、分类 │
│ ┌──────┐ ┌────────────┐ │
│ │🖼️封面│ │🥬食材卡片 │ │
│ │红烧排│ │⚠含过敏原 │ │
│ │骨 ⭐4.8│ │简介文字.. │ │
│ │👁1.2k│ └────────────┘ │
│ └──────┘ ┌──────┐ ┌──────────┐ │
│ ┌──────────┐ │📂分类│ │🏷️口味标签│ │
│ │🖼️宽图 │ │家常菜│ │酸辣甜鲜..│ │
│ │宫保鸡丁 │ │128项│ └──────────┘ │
│ │⭐4.5 │ └──────┘ ┌──────────┐ │
│ │👁2.3k │ ┌──────────┐ │🕐早餐推荐│ │
│ └──────────┘ │🖼️菜品卡 │ │7-10点.. │ │
│ │番茄炒蛋 │ └──────────┘ │
│ └──────────┘ ↓下拉加载更多│
└─────────────────────────────────────┘
```
**操作**: 下拉刷新/上拉加载/点击菜品→详情/点击食材→搜索/点击分类→浏览/点击标签→列表/滚动隐藏顶部栏
**布局说明 (v0.90.0 更新)**:
- 移除旧「今日推荐」「分类浏览」「口味工艺」横向卡片
- 使用 `api_discover.php` 接口数据构建 **MasonryGridView 2列瀑布流**
- 5种卡片类型混合展示菜品(Recipe)/食材(Ingredient)/分类(Category)/口味标签(Tag)/时段(MealTime)
- Liquid Glass 毛玻璃风格统一视觉
### Tab1收藏Favorites
```
┌─────────────────────────────────────┐
│ ❤️ 我的收藏 🗑️ 清空 │
├─────────────────────────────────────┤
│ ┌──┐ 红烧排骨 家常菜·👁1.2k ❤ │
│ │🖼️│ │
│ ├──┤ ┌──┐ 宫保鸡丁 川菜·👁2.3k ❤ │
│ │🖼️│ │
│ └──┘ 共12个菜谱 [清空收藏] │
│ ┌─ 空状态: ❤ 收藏夹是空的 ──────┐ │
│ │ 去首页发现美味吧 → │ │
│ └────────────────────────────────┘ │
└─────────────────────────────────────┘
```
**操作**: 左滑删除/点击❤取消收藏/清空确认弹窗/空状态→切换首页Tab
### Tab2发现Discover
```
┌─────────────────────────────────────┐
│ 🔍 发现 │
├─────────────────────────────────────┤
│ ┌─ 🔍 搜索菜谱、食材、标签... ──┐ │
│ ├─ 🏷️ 热门标签: 家常|快手|川菜|粤菜 →┤
│ ├─ 🎲 今天吃什么? 让我来帮你选! → ─┤
│ ├─ 🔥 热门排行: 🥇排骨 🥈宫保 🥉番茄→┤
│ ├─ 📂 分类浏览 (2列网格): │ │
│ │ 🍳家常 🥘快手 🌶️川菜 🍜粤菜 │ │
│ └────────────────────────────────┘ │
└─────────────────────────────────────┘
```
**操作**: 搜索→实时列表/标签筛选/今天吃什么→WhatToEatPage/排行→HotPage/分类→列表页
### Tab3我的Profile
```
┌─────────────────────────────────────┐
│ 👤 我的 │
├─────────────────────────────────────┤
│ ┌─ 用户卡片(毛玻璃): 👤美食爱好者 ─┐│
│ │ user@example.com [编辑][个性化] ││
│ ├─ 📊 统计: 12收藏 56浏览 8点赞 ──┤│
│ ├─ 分组1: 今天吃什么/数据管理/设置 →││
│ ├─ 分组2: 购物单/营养中心/睡眠提醒→││
│ └────────────────────────────────┘│
└─────────────────────────────────────┘
```
### 子页面菜谱详情Recipe Detail
```
┌─────────────────────────────────────┐
│ ← 返回 分享 收藏 更多 │
├─────────────────────────────────────┤
│ ┌─ 封面大图 (圆角+阴影) ─────────┐ │
│ ├─ 标题区: 名称/评分/时间/难度 ────┤ │
│ ├─ 作者卡片: 头像+昵称+关注 ──────┤ │
│ ├─ 信息卡: 口味/工艺/份量/热量 ────┤ │
│ ├─ 食材区: 图片+名称+用量+过敏警告─┤ │
│ ├─ 步骤区: 编号+图文+计时器 ──────┤ │
│ ├─ 营养区: 宏量营养素环形图 ──────┤ │
│ ├─ 标签区: 可跳转的分类/口味标签 ──┤ │
│ ├─ 统计栏: 👁浏览 ❤点赞 ⭐推荐 ───┤ │
│ ├─ 操作栏: 开始烹饪/分享/评分 ────┤ │
│ └─ PicId调试卡(开发模式可见) ─────┘ │
└─────────────────────────────────────┘
```
### 子页面工具中心Tools Center
```
┌─────────────────────────────────────┐
│ ← 返回 工具中心 │
├─────────────────────────────────────┤
│ ┌─ 分类Tab: 全部|烹饪|健康|数据|规划┤│
│ ├─ 工具网格 (3列): ││
│ │ ⏱️计时 📐缩放 🍽️时段 📊BMI ││
│ │ ⚠️过敏 🥗营养 🔢换算 🥕食材详情 ││
│ │ 🔥排行 📈统计 📅规划 ││
│ └────────────────────────────────┘│
└─────────────────────────────────────┘
```
---
## 五、导航流程图
```
┌──────────┐
│ 首页 │
│ (Tab0) │
└────┬─────┘
│ 点击卡片
┌─────────────────┐
│ 菜谱详情页 │◄─────────────────┐
└──┬──────┬───────┘ │
│ │ │
┌──────────┘ └──────────┐ │
▼ ▼ │
┌────────────┐ ┌────────────┐ │
│ 笔记页面 │ │ 食材详情 │──────────┘
└────────────┘ └─────┬──────┘
┌──────▼──────┐
│ 食材菜品列表 │
└─────────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 收藏(Tab1)│ │ 发现(Tab2)│ │ 我的(Tab3)│ │ 工具中心 │
└────┬─────┘ └──┬───────┘ └──┬───────┘ └────┬─────┘
│ │ │ │
▼ ▼ ▼ ▼
详情页 搜索/分类/排行 设置子页面 各工具子页面
```
---
## 六、Liquid Glass 组件规范
### 6.1 GlassContainer 毛玻璃容器
```dart
GlassContainer(
child: Widget,
blur: double, // 默认20
opacity: double, // 默认0.45
borderRadius: double,// 默认radius-lg(20)
border: bool, // 默认true
padding: EdgeInsets,
)
// 使用场景: 卡片/弹窗/浮层
```
### 6.2 GlassNavBar 液态玻璃底栏
```dart
GlassNavBar(
currentIndex: int,
onTap: (int),
items: [
NavItem(icon: CupertinoIcons.home, label: '首页'),
NavItem(icon: CupertinoIcons.heart, label: '收藏'),
NavItem(icon: CupertinoIcons.search, label: '发现'),
NavItem(icon: CupertinoIcons.person, label: '我的'),
],
)
// 特性: blur(20)+opacity(0.72)+圆角xl(28)+选中高亮动画
```
### 6.3 GlassFeedCard 信息流卡片
```dart
GlassFeedCard(
imageUrl: String,
title: String,
subtitle: String,
viewCount: int,
likeCount: int,
recommendCount: int,
onTap: VoidCallback,
onLike: VoidCallback,
onRecommend: VoidCallback,
)
// 特性: 圆角md(12)+shadow-md+毛玻璃底部操作栏
```
### 6.4 GlassSearchBar 搜索栏
```dart
GlassSearchBar(
hintText: '搜索菜谱、食材...',
onChanged: (String),
onSubmitted: (String),
)
// 特性: 圆角lg(20)+毛玻璃背景+搜索图标+清除按钮
```
### 6.5 GlassSegmentedControl 分段选择器
```dart
GlassSegmentedControl(
segments: ['推荐', '最新', '热门', '个性化'],
selectedIndex: int,
onSelected: (int),
)
// 特性: 毛玻璃滑块+250ms平滑过渡+选中高亮
```
### 6.6 GlassSettingsGroup/Tile 设置组(备用)
```dart
GlassSettingsGroup(
header: '通用',
children: [
GlassSettingsTile(title: '今天吃什么', trailing: ''),
GlassSettingsTile(title: '深色模式', toggle: true),
],
)
```
---
## 七、改进对比
| 维度 | 现有问题 | iOS 26 改进 |
|------|---------|------------|
| 视觉风格 | Material/Cupertino混用颜色不统一 | 统一Liquid Glass毛玻璃风格 |
| 导航栏 | 各页面实现不一致 | 统一CupertinoPageScaffold+毛玻璃 |
| 底部栏 | edge/floating两套并存 | 统一GlassNavBar(floating) |
| 颜色 | primary=#2196F3(Material蓝) | 改为iOS标准#007AFF |
| 圆角 | 各组件硬编码不统一 | 统一radius-sm/md/lg/xl体系 |
| 卡片 | 扁平无层次感 | 毛玻璃半透明+多层深度 |
| 动画 | 无统一规范 | 150/250/350ms三级动画体系 |
| 暗色模式 | 部分支持 | 完整DarkDesignTokens适配 |
---
## 八、暗色模式适配
| Token | Light | Dark |
|-------|-------|------|
| background | `#F2F2F7` | `#000000` |
| card | `#FFFFFF` | `#1C1C1E` |
| text1 | `#1C1C1E` | `#F2F2F7` |
| text2 | `#8E8E93` | `#8E8E93` |
| text3 | `#C7C7CC` | `#48484A` |
| glass | `rgba(255,255,255,0.45)` | `rgba(30,30,30,0.65)` |
| glassBorder | `rgba(255,255,255,0.3)` | `rgba(255,255,255,0.1)` |
| glassShadow | `rgba(0,0,0,0.06)` | `rgba(0,0,0,0.3)` |
| shadow-sm/md/lg | alpha降低 | alpha提高 |
> 实现方式: `CupertinoTheme.brightnessOf(context)` 判断,使用 `DarkDesignTokens` 类获取暗色值
---
## 九、响应式适配
| 设备 | 宽度范围 | 布局策略 |
|------|---------|---------|
| 手机 | 360-640px | 单列 |
| 平板竖屏 | 600-900px | 双列(折叠屏适配) |
| 平板横屏 | 768-1024px | 双列+侧边详情 |
| 桌面 | ≥1024px | 多列+最大宽度1200px居中 |
> 折叠屏特殊处理: 避免关键内容置于折痕区域(屏幕中央)使用order或grid调整流式排列
---
## 十、实施计划
| 阶段 | 内容 | 状态 |
|------|------|------|
| P0 | DesignTokens全局替换硬编码值 | ✅ 已完成 |
| P1 | GlassContainer/GlassNavBar/GlassFeedCard基础组件 | ✅ 已完成 |
| P2 | 首页/发现页改造为信息流 | 🔄 进行中 |
| P3 | 收藏页/我的页改造 | ⏳ 待开始 |
| P4 | 暗色模式完整适配 | ⏳ 待开始 |
| P5 | 响应式多端适配 | ⏳ 待开始 |
---
## 十一、iOS 组件清单Component Inventory
> 统计日期: 2026-04-12 | 总计48个组件 | 35已使用 ✅ | 10未使用 ❌ | 3待集成 ⚠️
### 11.1 基础组件 (`widgets/base/`) — 4个
| 文件 | 类名 | 状态 | 引用数 |
|------|------|------|--------|
| app_page_scaffold.dart | AppPageScaffold, AppCard | ✅ | 2+ |
| skeleton_loader.dart | SkeletonLoader | ✅ | 2 |
| standard_button.dart | StandardButton | ✅ | 2 |
| tap_liquid_glass_nav.dart | TapLiquidGlassNavigation | ❌ | 0 |
### 11.2 Cupertino组件 (`widgets/cupertino/`) — 3个全部未使用
| 文件 | 类名 | 状态 | 备注 |
|------|------|------|------|
| app_button.dart | AppButton | ❌ | 项目主要用CupertinoButton |
| app_card.dart | AppCard | ❌ | ⚠与base/app_page_scaffold.dart同名重复 |
| app_text_field.dart | AppTextField | ❌ | 可后续启用 |
### 11.3 毛玻璃组件 (`widgets/glass/`) — 8个
| 文件 | 类名 | 状态 | 引用数 |
|------|------|------|--------|
| glass_container.dart | GlassContainer | ✅ | 9处 |
| glass_nav_bar.dart | GlassNavBar | ✅ | 1 |
| glass_feed_card.dart | GlassFeedCard | ✅ | 1 |
| glass_search_bar.dart | GlassSearchBar | ✅ | 2 |
| glass_segmented_control.dart | GlassSegmentedControl | ✅ | 4 |
| glass_animations.dart | GlassBounce/Shimmer | ❌ | 0 |
| glass_responsive.dart | GlassResponsive | ❌ | 0 |
| glass_settings_tile.dart | GlassSettingsGroup/Tile | ❌ | 0 |
### 11.4 状态组件 (`widgets/states/`) — 5个
| 文件 | 类名 | 状态 | 引用数 |
|------|------|------|--------|
| empty_state.dart | EmptyState | ✅ | 11处 |
| error_state.dart | ErrorState | ✅ | 3处 |
| offline_banner.dart | OfflineBanner | ⚠️ | 仅自身定义 |
| standard_dialog.dart | StandardDialog | ✅ | 1 |
| standard_picker.dart | StandardPicker\<T\> | ❌ | 0 |
### 11.5 通用组件 (`widgets/`根目录) — 11个
| 文件 | 类名 | 状态 | 引用数 |
|------|------|------|--------|
| adaptive_widgets.dart | AdaptiveDestination/Interface | ❌ | 0 |
| charts_widgets.dart | 营养图表 | ✅ | 2 |
| custom_widgets.dart | 自定义控件集 | ✅ | 1 |
| loading_indicator.dart | LoadingIndicator | ⚠️ | 间接依赖 |
| navigation_widgets.dart | 导航组件 | ✅ | 1 |
| nutrition_dashboard_card.dart | NutritionDashboardCard | ✅ | 2 |
| product_card.dart | ProductCard | ⚠️ | 间接依赖 |
| recipe_card.dart | RecipeCard | ✅ | 7处 |
| recipe_image.dart | RecipeImage | ✅ | 10处 |
| responsive_grid.dart | ResponsiveGrid | ⚠️ | 间接依赖 |
| skeleton_widgets.dart | 骨架屏组件 | ✅ | 1 |
### 11.6 菜谱详情组件 (`widgets/recipe_detail/`) — 17个全部已使用
action_bar, allergen_warning, author_card, category_breadcrumb, cover_image, indices_card, ingredient_details, ingredients_section, meta_info_card, nutrition_section, picid_card, rating_dialog, skeleton_view, statistics_bar, steps_section, tags_section, time_info, title_section
### 11.7 未用组件处理建议
| 组件 | 建议 |
|------|------|
| TapLiquidGlassNavigation | 整合到glass_nav_bar或删除 |
| cupertino/AppButton/AppCard/AppTextField | 删除cupertino目录合并AppCard到base |
| GlassAnimations | 保留,点赞动画可启用 |
| GlassResponsive | 删除,功能简单可内联 |
| GlassSettingsGroup/Tile | 保留,设置页改造时启用 |
| StandardPicker | 保留,表单页可启用 |
| AdaptiveWidgets | 删除,当前无平板需求 |
| OfflineBanner | 集成到全局App Shell |
---
## 变更记录
| 日期 | 版本 | 变更内容 |
|------|------|---------|
| 2026-04-12 | 1.3 | **压缩重构**: 1182行→~780行合并设计令牌为紧凑表格精简ASCII图和操作表组件清单改为汇总格式 |
| 2026-04-12 | 1.2 | 新增第十一章「iOS 组件清单」完整统计48个组件使用状态按6个分类整理含处理建议 |
| 2026-04-09 | 1.1 | 重写完整文档:增加目录、设计原则、动画规范、暗色模式详细参数、响应式规则、实施计划状态追踪 |
| 2026-04-09 | 1.0 | 初始版本:基础设计方案 |