跳至内容

iOS 厨房工作台 ​

从任意内置菜谱详情点「厨房工作台」,进入独立的全屏 SwiftUI 页面。「收起」回到原来的详情,备料和计时继续保留。

界面与数据 ​

  • 默认按实际窗口布局:可用宽度达到 760 pt,或宽度至少 641 pt 且高度至少 520 pt 时,左侧图文做法、右侧备料和计时并排展示,分别滚动。后一个条件让竖向展开窗口也能保留各至少 320 pt 的两栏,不依赖设备型号。
  • 窄屏用原生分段控件切换「做法 / 备料与计时」,切换时保留当前阅读位置;阅读时底部保留计时器入口与剩余时间。辅助功能大字号使用单栏,避免拥挤。
  • 正文复用 RecipeTextContent,保留图片放大、出处和原文链接。没有内置图文时说明缺失,并保留原做法链接;不生成或猜测步骤。
  • 备料优先读取正文中「必备原料和工具」章节的列表,原样保留用量、可选说明和工具。不解析后续步骤,也不自动合并不同来源的配方。没有该章节时用已记录的食材。原料显示词典图标和原名称,可选说明完整保留;厨具单列,可补充菜谱元数据中明确记录的工具。原文「计算」章节的等式转换成用量表,并按原料名精确匹配到右侧清单。用量表和备料清单共用份数(1–20 份),两处均可调节并同步显示实际用量。支持范围、分数、向上取整和原料间依赖,先取整鸡蛋再算油;明确写死的量保留并标注「原文固定用量」,无法可靠换算的表达式保留原文并标注「需按原文确认」。
  • 难度与预估热量显示为概览卡片,未收录的数值不补造;热量不自行解释为每份或整菜。
  • 「操作 / 操作步骤 / 制作步骤 / 步骤 / 做法」章节显示步骤卡片。点编号标记完成,再点撤销;固定进度条显示完成数,点「第 N 步」定位到首个未完成步骤。步骤中的子项、链接和配图保留,未知章节仍按原文展示。
  • 步骤内明确的份数公式同步换算为实际用量,支持正文、反引号和「(份数 × 数量)单位」写法;使用步骤自身公式计算分次投料,不拿整菜总量覆盖。已换算的步骤标注当前份数,无法可靠计算的公式保留并提示确认。时间、温度、尺寸和没有份数依据的固定用量不缩放。即使正文没有用量表,只要步骤含可识别的份数公式,也提供份数调节。
  • 明确的「加入/放入/倒入/撒入/撒上/淋入」原料引用可补充实际用量:只有一个明确投料位置时显示该原料总量;「剩余的原料」扣除前面步骤已明确的定量投料。扣减按原文顺序计算,与完成勾选无关,不重复扣料。支持 g/kg 与 ml/L 换算;前序范围、少许/适量、条件投料、单位不兼容或超量时保留原文并提示确认。
  • 步骤以原始文字内容及同名出现次数标识,修改简介不会错位;来源文字发生变化的步骤不会沿用旧勾选。仅调整份数改变展示文字,不改变步骤身份或已完成记录。进度重置只清除步骤,不影响备料或计时。
  • 勾选表示这次已经备好,与推荐页已选食材、常备调料、冰箱库存独立。清空备料不清除计时。调整份数后,只撤销实际用量发生变化的原料勾选,固定用量和厨具的勾选保留;步骤与计时不受影响。

菜谱源文档 ​

此功能不需要重新处理全部 Markdown,也不修改 packages/data/recipe-text.json。独立的 packages/data/recipe-amounts.json 用整篇指纹和逐条原句锚点绑定正文;验证通过后,CookCore 将补充用量、明确章节和投料关系接入现有换算器。来源漂移或标注无效时整菜回退原文与原有规则。原始正文、出处和既有步骤身份保留。

识别采用有限、保守的语法,不保证理解任意自然语言。「分两次加入」但未给各次比例、可选分支、只写「少许」等情况保持原文。标注包括原料、用量/比例、全部/余量、适用条件和原文锚点;未确定的关系保留待确认。补充表只展示原等式表之外的确定项,原文仍完整显示。新增章节的步骤使用独立身份前缀,相同原句通过块与列表项定位,换算不改变进度。数据规则及复现命令见 菜谱数据,全量审查结果由 pnpm audit:amounts 生成,合并复核结论见 用量复核。

半折与台面布局 ​

  • 原生「布局」菜单提供「自动 / 台面」。台面模式把图文放在上方,备料与计时放在下方;下方计时操作固定,材料清单独立滚动。菜单选择只作用于当前工作台。
  • iOS 27.1 起读取 GeometryProxy.reservedRegions(kind: .division) 的有效区域及边距。水平折痕采用上下布局,竖直折痕采用左右布局;遵循实际容器坐标,给折痕留空,不假设折痕在屏幕中点。系统分区优先于手动选择。
  • 不使用设备型号、陀螺仪或连续铰链角度猜测台面姿态。采用 SwiftUI Layout 复用同一对原生滚动视图,避免布局变化重建正文。
  • 没有系统分区时,手动台面在宽度 ≥ 320 pt、高度 ≥ 520 pt 下提供上下预览;空间不足或辅助功能大字号时回到单栏/默认宽屏布局。系统实际分区下,大字号的计时器与材料放在同一个可滚动表单中,确保全部控件可访问。
  • 旧 SDK 使用编译条件隔离新 API,最低系统要求仍为 iOS 17。Xcode 27.1 / Swift 6.4 构建才会包含系统分区适配;旧构建保留手动台面布局。

API 与交互参考:Apple 的自适应布局说明。

计时与保存 ​

每道菜一个计时器,默认 5 分钟,可用系统滚轮选择 1–180 分钟,支持开始、暂停、继续、重置、到时后再计一次。以绝对结束时间计算剩余时长;界面每秒刷新,后台不运行循环任务。

制作份数、备料勾选、步骤完成记录、时长、暂停余量和结束时间按菜谱 ID 保存在本机 UserDefaults 的 kitchen.workbench.v1,收起、旋转、切后台、进程重启后可恢复,不上传、不参与 CloudKit 同步。重新开始一轮做菜时可分别清空备料和步骤。旧版存储缺少步骤字段时按空记录解码,缺少份数时默认为 1 份,保留既有备料与计时。计时按钮显式采用图标加文字样式。

首次开始计时请求系统通知权限。允许后由本地通知提醒,拒绝或安排失败时页面显示说明,计时仍然可用。暂停和重置会撤销对应通知;连续操作按菜谱串行更新,避免旧请求覆盖新请求。通知使用 kitchen-timer- 前缀,与冰箱临期通知互不影响。

验证 ​

  • RecipePresentationTests:用量公式与可选项、子步骤保留、未知内容降级、重复步骤身份、全部内置图文转换前后内容核对。
  • RecipeStepUsagePlanTests:1/2/3/20 份的油量和剩余盐量、连续分次扣减、单位换算、重复投料不重复填总量、条件/不明确用量回退、Markdown 与可选说明保留。
  • RecipeInstructionAmountsTests:全部内置步骤份数公式、分次投料与总量分离、取整和依赖、Markdown/链接/可选说明保留、未知及长表达式不局部误算、原始步骤身份稳定。
  • RecipeAmountsTests:真实番茄炒蛋 1/2/3/20 份、取整后的依赖、范围与克重、固定用量、分数、循环和未知表达式回退。
  • KitchenWorkbenchTests:份数持久化与边界、用量变化后的选择性撤销勾选、步骤撤销/恢复、旧版存储迁移、按原文生成清单、暂停/继续、跨后台时间计算、到时与重置、存储恢复、菜谱隔离、快速操作的通知时序。
  • KitchenWorkbenchUITests:从真实菜谱详情进入,查看图文,勾选备料,暂停/继续/重置,横竖屏切换,终止并重启后恢复;步骤完成/撤销、跳转与重置;份数双向同步、实际用量、步骤内分次用量、备料勾选更新与重启恢复;份数变化后保留步骤完成记录。沿用 CI 的 iPhone / iPad 双设备检查。
  • KitchenWorkbenchLayoutTests:验证实际分区、最小两栏宽度、台面和大字号回退;台面 UI 用例验证固定计时器及布局切换后的状态。
  • UI 测试用独立存储和禁用通知的客户端,不读取用户进度或发送真实提醒。

本版不包含视频嵌入、步骤自动同步或多道菜统一调度。手动台面模式已在 iOS 27.0 的 iPhone 和 iPad 实测;iOS 27.1 / iPhone Duo 模拟器已通过 Device Hub 的真实姿态控制验证展开横竖屏、水平/竖直半折自动切换和闭合返回,备料与暂停时间保持。展开竖屏实测宽度 669 pt,已修正原 760 pt 门槛导致的单栏回退。

本轮 6 项布局单元测试和 Duo 外屏台面 UI 用例通过;完整 Duo UI 自动化尚未全绿:内屏流程卡在原生浮层侧栏的可点击性,外屏流程卡在 XCTest 旋转后的窗口尺寸等待。对应实际操作已人工核验,不将人工结果计为自动化通过。截图和复现范围见 验证记录。iPhone Duo 真机和系统通知实际送达仍未验证,宣传材料应明确模拟器演示范围。

Web 已有的「并排浏览」是选材与推荐视图,见 Web 做菜视图,与本页的烹饪任务入口分别维护。