When: 2026-01-23 17:55 Where:
- frontend/store/useLanguageStore.ts
- frontend/components/MonthPicker.tsx
- frontend/components/CalendarSearch.tsx
- frontend/app/(tabs)/calendar.tsx
Why: 响应用户反馈 (日历标题、手势操作、搜索修复、汉化)。
What:
- 日历 (Calendar):
- 标题 "日历视图" 改为 "日历"。
- 支持左右滑动切换日期 (上一天/下一天)。
- 月视图 (MonthPicker):
- 支持左右滑动切换月份 (上个月/下个月)。
- 搜索 (Search):
- 修复 "最近搜索" 点击无反应的问题。
- "AI 建议" 内容完全汉化。
When: 2026-01-23 18:00 Where:
- frontend/components/MonthPicker.tsx
- frontend/app/(tabs)/calendar.tsx
Why: 用户反馈日历视图显示异常及滑动无动画。
What:
- Fix Layout: 移除
MonthPicker触摸容器的flex: 1样式,解决自动高度下的显示崩溃问题。 - Add Animation: 在日期和月份切换时增加
LayoutAnimation布局动画,使视图过渡更连贯顺滑。 - Android Support: 启用 Android 平台的 LayoutAnimation 实验性支持。
When: 2026-01-23 18:05 Where:
- frontend/app/(tabs)/calendar.tsx
- frontend/components/DayTaskView.tsx
- frontend/store/useTaskStore.ts
Why: 用户希望日期切换时有“整个界面横向一体”的滑动感 (Pager effect)。
What:
- Refactor: 将时间轴内容抽取为独立组件
DayTaskView。 - Infinite Paging: 使用
ScrollView (pagingEnabled)实现无限日历翻页逻辑。- 渲染 前一天/今天/后一天 三个视图。
- 滑动停止后动态更新中心日期,并重置滚动位置,实现无缝连续翻页体验。
- Types: 修正
TaskItem/Task类型引用问题。
When: 2026-01-23 18:10 Where: frontend/app/(tabs)/calendar.tsx
Why: 用户反馈滑动切换日期时,界面会出现闪烁(事件先消失再出现或界面跳变)。
What:
- Conditional Animation:
- 修改
handleDateSelect,增加skipAnimation参数。 - 在滑动翻页 (
handleScrollEnd) 时禁用LayoutAnimation,防止布局动画与 ScrollView 的瞬时重置逻辑冲突。 - 保持点击 WeekStrip/MonthPicker 时的过渡动画。
- 修改
When: 2026-01-23 18:15 Where: frontend/app/(tabs)/calendar.tsx
Why: 用户反馈快速滑动日历时会出现“反弹/滑不动”现象 (Rubber-banding at page limits because of async reset delay).
What:
- FlatList Refactor:
- 弃用“三页无限重置”方案,改用 FlatList 实现真正的长列表滚动。
- 生成 ±365 天 (共2年) 的日期列表作为数据源。
- 利用 FlatList 的
initialScrollIndex定位到今天。
- Benefit:
-
原生列表滚动性能,支持惯性连续滑动 (Fast Swipe)。
-
彻底解决“重置延迟”导致的回弹问题。
-
保持与 WeekStrip 的状态同步。
-
保持与 WeekStrip 的状态同步。
-
When: 2026-01-23 18:20 Where: frontend/app/(tabs)/calendar.tsx
Why: 用户反馈滑动后顶部的日期跳转延迟过大(原逻辑需等待惯性滚动完全停止才更新)。
What:
- Real-time Sync:
- 将日期同步逻辑从
onMomentumScrollEnd(滚动停止时触发) 更改为onScroll(实时触发)。 - 使用
scrollEventThrottle={16}确保高频检测。 - 当页面中心点越过屏幕中线时,立即更新顶部 WeekStrip 日期,极大降低了感知延迟。
- 将日期同步逻辑从
When: 2026-01-23 18:25 Where: frontend/components/WeekStrip.tsx
Why: 用户反馈橙色选中滑块稍微有点大,容易遮挡内容。
What:
- Remove Scale: 移除了选中日期背景 (
selectedDayItem) 的scale: 1.05放大效果,使其尺寸回归正常,不再产生视觉溢出或遮挡。
When: 2026-01-23 18:30 Where: backend/main.py
Why: 用户反馈 AI 将一连串活动(早餐、逛街、高尔夫...)合并为了一个大任务,且日期("24号")未能正确识别为具体时间戳,导致日历不显示。
What:
- Prompt Optimization:
- Task Splitting: 强制 AI 将描述中的不同活动(如不同时间段、不同地点)拆分为独立的 Tasks,而不是合并为 Subtasks。
- Date Resolution: 明确指令处理 "24号" 这种相对日期,强制结合当前时间计算为完整的
YYYY-MM-DD时间戳。 - Fix Null Timeline: 修复了因时间戳为 null 导致任务无法在日历时间轴上显示的问题。
When: 2026-01-23 21:00 Where:
- frontend/services/api.ts
- backend/main.py
Why: 为了彻底解决相对时间(如“明天”、“24号”)的理解偏差问题,决定采用“前端注入本地时间”的方案,消除服务器时区差异带来的影响。
What:
- Frontend: 在 API 请求 Header 中新增
X-Client-Time,携带用户设备当前的精确本地时间(YYYY-MM-DD HH:MM:SS)。 - Backend: 接收此 Header 并将其作为 Prompt 中的
Current Time传递给 LLM。 - Outcome: 无论用户身处何地,AI 都会基于用户当下的时间来推算日期,确保“今天”、“明天”等概念绝对准确。
When: 2026-01-23 21:45 Where:
- frontend/app/(tabs)/calendar.tsx
- frontend/components/WeekStrip.tsx
Why: 修复多任务时无法纵向滚动的问题,以及点击日期时界面抽搐和颜色变淡的视觉瑕疵。
What:
- Vertical Scroll Fix: 在日历分页容器 (
renderItem) 中增加flex: 1,确保DayTaskView能撑满屏幕高度并正确响应纵向滚动,解决了长列表被截断的问题。 - Visual Stability:
- No Fading: 将日期选择按钮的
activeOpacity设为1,取消点击时的变淡效果。 - No Twitch: 确保点击日期时的布局动画被禁用(仅保留横向滚动过渡),消除界面抽搐感。
- No Fading: 将日期选择按钮的
When: 2026-01-23 22:15 Where:
- frontend/components/DayTaskView.tsx
- frontend/app/(tabs)/calendar.tsx
- backend/main.py
Why: 用户反馈三个关键问题:(1) 多事件时仍无法滚动,(2) Qwen 2.5 7B 仍将独立事件合并为子任务,(3) 点击日期时仍然抽搐。
What:
- Android 滚动修复: 在
DayTaskView的ScrollView中添加nestedScrollEnabled={true},解决嵌套滚动冲突(Android必需)。 - AI Prompt 终极加强:
- 添加红色警告符号
⚠️ 和明确的 BAD ❌ / GOOD ✅ 示例。 - 使用用户实际输入案例("24号上午吃早饭,中午回家睡觉,下午去山姆超市")作为正例。
- 明确列出"何时使用 subtasks"和"何时分开任务"的规则,针对 Qwen 2.5 7B 的弱点加强提示。
- 添加红色警告符号
- 彻底消除抽搐: 将
scrollToIndex改为animated: false(瞬时跳转),避免与onScroll事件处理的冲突。
When: 2026-01-23 22:40 Where:
- frontend/components/TimelineItem.tsx
- backend/config.json
- frontend/app/(tabs)/settings.tsx
Why: 用户反馈 (1) 垂直滚动依然无效,(2) Qwen 2.5 7B 能力不足仍然合并任务,(3) 抽搐已解决。
What:
-
滚动根因定位与修复:
- 问题根源:
TimelineItem中的时间轴连接线使用了h-full(高度100%),导致在有flex: 1的父容器中无限扩张。 - 解决方案: 将
h-full改为flex-grow+minHeight: 40,允许自然增长但不会撑爆容器。 - 结果: 多事件时列表高度正常,可完美纵向滚动。
- 问题根源:
-
模型配置优化:
- 将默认 LLM 从
Qwen 2.5 7B更换为Qwen3-8B(能力更强)。 - 在模型列表中交换两者位置,Qwen3-8B 置顶。
- 为 Qwen 2.5 7B 添加
"快速模型"标签,提示其特性。 - 更新 settings UI 支持显示模型 tag 字段(橙色徽章)。
- 将默认 LLM 从
When: 2026-01-24 00:45 Where: backend/main.py
Why: 用户反馈生成的任务标题中包含了重复的日期信息(如 "24号早上去吃饭"),导致显示冗余。
What:
- Prompt Refinement: 在 System Prompt 中明确指令
"Specific Activity Title (e.g. 'Eat Breakfast' NOT '24th Eat Breakfast' - STRIP DATE/TIME)",强制 AI 去除标题中的日期和时间修饰词,保持标题纯净。
When: 2026-01-24 01:25 Where:
- frontend/app/(tabs)/stats.tsx
- backend/main.py
Why: 用户需求实现 VIP 专属的统计分析页面,包含本地任务完成度统计和 AI 驱动的深度分析。
What:
-
Frontend Implementation:
- VIP 门控: 非 VIP 用户显示升级提示,VIP 用户显示完整统计界面。
- Flow Score: 使用 SVG 圆形进度条可视化完成率(Excellent/Good/Average/Needs Work)。
- Task Completion Chart: 7天/30天双向柱状图(完成任务向上,未完成任务向下)。
- Weekly/Monthly 切换: 独立缓存分析结果。
- AI Analysis UI: Distribution 分布图 + Deep Dive 深度洞察卡片。
-
Backend API:
- 新增
/api/analyze-tasks端点。 - VIP 权限验证。
- LLM 自动分类任务(3-5个类别 + 颜色)。
- 生成简洁洞察(2-3句话)。
- 新增
-
Dependency Fix:
- 安装
react-native-svg使用--legacy-peer-deps解决依赖冲突。 - 修复所有 TypeScript 类型错误。
- 安装
-
Monthly Chart Crash Fix (Ultimate):
- 问题:点击"本月"时崩溃(NavigationContext 错误)。
- 尝试一:按周聚合数据(减少节点) - 未完全解决。
- 尝试二:修复动态 className 语法 - 未完全解决。
- 最终解决:彻底移除 NativeWind,在图表渲染循环中改用标准
style对象和Colors常量,完全绕过 CSS 互操作层。
- When: 2026-01-23
- Where:
frontend/app/_layout.tsx - Why: iOS 启动时报 “Couldn't find a navigation context”,怀疑根布局上下文不完整,补充安全区 Provider 并简化根布局结构。
- What:
- 将根布局包裹在
SafeAreaProvider中,移除外层View,保持Stack作为根导航容器的直接子级。
- 将根布局包裹在
- When: 2026-01-23
- Where:
frontend/app/_layout.tsx - Why: iOS 仍报 “Couldn't find a navigation context”,为确保导航上下文存在,显式包裹
NavigationContainer。 - What:
- 在根布局中增加
NavigationContainer(independent),保证Stack/Tabs拥有可用的导航上下文。
- 在根布局中增加
- When: 2026-01-27 20:53
- Where:
frontend/app/(tabs)/web/index.tsx - Why:
WebHomeScreen的 "Active Focus" 卡片未能连接到useTimerStore,导致无法显示实时数据和控制全局计时器。 - What:
- 将
WebHomeScreen中的 "Active Focus" 卡片连接到useTimerStore。 - 该卡片(位于 "Quote" 模块下方)现在可以显示实时番茄钟数据,并能控制全局计时器,取代了之前的静态占位符。
- 将
- 2026-01-27 21:05: [Backend/Refactor] Strictly enforced Pomodoro logic (Scheme 1).
- Implemented
JSONEncodedDictfor SQLite/MySQL compatibility. - Refactored
pomodoro.pyto use pure functions for stats/pruning. - Added Redis
SETNXdeduplication (35d TTL). - Added MySQL
with_for_updatelocking.
- Implemented
- When: 2026-01-23
- Where:
frontend/app/_layout.tsx - Why: iOS 提示 NavigationContainer 嵌套冲突,说明 Expo Router 已提供根容器,需要移除手动包裹。
- What:
- 删除
NavigationContainer包裹,恢复由 Expo Router 提供的根导航容器。
- 删除
- When: 2026-01-24 02:40
- Where:
frontend/app/(tabs)/stats.tsx,frontend/package.json - Why: Persistent "Couldn't find a navigation context" crash triggered by
react-native-css-interopinternal failures during stats page interactions, exacerbated by missingexpo-linear-gradientdependency for gradient classes. - What:
- Installed
expo-linear-gradient. - Complete Rewrite: Replaced the entire
StatsScreencomponent to use standardStyleSheetand explicitLinearGradientcomponents. - Removed NativeWind: Completely eliminated
classNamedynamic usage in this file to bypass the crash-prone CSS interop layer.
- Installed
- When: 2026-01-24 16:00
- Where:
frontend/app/(tabs)/index.tsxfrontend/app/(tabs)/web/index.tsxfrontend/components/web/*frontend/components/ui/CustomModal.tsxfrontend/hooks/useBanCheck.tsfrontend/utils/imageUtils.ts
- Why: 实现基于 Stitch 设计规范的响应式 Web 仪表盘。
- What:
- 响应式路由: 改造
index.tsx,使用useWindowDimensions在HomeScreen(移动端) 和WebHomeScreen(桌面端) 之间自动切换。 - Web 组件: 实现了
Sidebar(侧边栏)、WebChatInput(含圆形文件/麦克风按钮) 和WebHomeLayout。 - 功能特性:
- 图片压缩:
imageUtils采用迭代算法将上传图片压缩至 500KB 以下。 - 安全检查:
useBanCheck在用户封禁时拦截操作。 - UI 设计: 使用 NativeWind/Tailwind 实现了 "Today's Focus" 和 "Flow Score" 区域。
- 自定义弹窗: 统一了跨平台的 Modal 弹窗体验。
- 图片压缩:
- 响应式路由: 改造
- When: 2026-01-24 16:05
- Where:
frontend/app/(tabs)/calendar.tsxfrontend/app/(tabs)/web/calendar.tsx
- Why: 实现 Web 端桌面版日历界面,对齐 "Stitch" 设计规范。
- What:
- WebCalendarScreen: 实现了全屏日历网格视图,包含 "AI Insight", "Weekly Focus" 和 "Next Up" 侧边栏面板。
- 响应式架构: 更新
calendar.tsx支持在移动端MobileCalendarScreen和 Web 端WebCalendarScreen间自动切换。 - 功能集成:
- 任务编辑: 点击日历任务触发
AppDialog(CustomModal) 进行编辑/删除。 - 排序逻辑: 强制按时间戳对当日任务进行正序排列。
- 安全风控: 集成
useBanCheck,修改/删除任务前自动校验封禁状态。
- 任务编辑: 点击日历任务触发
- When: 2026-01-24 16:10
- Where:
frontend/app/(tabs)/tasks.tsx(New)frontend/app/(tabs)/web/tasks.tsx(New)frontend/app/(tabs)/_layout.tsx
- Why: 实现专为桌面端设计的任务管理看板,支持三栏布局与批量操作。
- What:
- 响应式架构: 创建了
tasks.tsx作为任务页入口,移动端使用简约 Chips 布局,桌面端自动切换至WebTasksScreen。 - 导航集成: 更新
_layout.tsx,在下方导航栏添加了独立的 "Tasks" 标签页。 - WebTasksScreen (Stitch):
- 三栏布局: 左侧导航 + 中间任务列表 + 右侧详情/筛选栏。
- 批量操作: 桌面端支持多选框,可批量删除任务(集成
AppDialog二次确认)。 - 交互增强: 任务卡片支持 Hover 悬停阴影与微缩放效果。
- 安全风控: 新增任务、删除任务均集成了
useBanCheck封禁校验。
- 响应式架构: 创建了
- When: 2026-01-24 16:15
- Where:
frontend/app/(tabs)/stats.tsxfrontend/app/(tabs)/web/stats.tsxfrontend/hooks/useStatsData.ts
- Why: 实现专为桌面端设计的 "Stitch" 风格数据仪表盘,展示心流分数与动态图表。
- What:
- WebStatsScreen (Dashboard):
- 实现了多列网格布局,包含 "Flow Score", "Completion Rate" 等核心指标卡片。
- 动态图表: 集成
react-native-chart-kit,绘制了 "Weekly Flow Trend" (贝塞尔曲线图) 和 "Focus Distribution" (饼图)。 - AI 报告: 实现了 "AI Intelligence Report" 卡片,提供智能洞察。
- useStatsData Hook:
- 封装了数据获取逻辑,并内置了 Ban Check,若用户被封禁则强制跳转/拦截。
- 响应式集成: 改造
stats.tsx,在桌面端 (Width>=768px) 自动呈现 Web 仪表盘。
- WebStatsScreen (Dashboard):
When: 2026-01-24 17:14 Where: frontend/metro.config.js
Why: Web 端报错 "Cannot use 'import.meta' outside a module",定位到 zustand 的 ESM 入口被解析导致。
What:
- 在 Metro 配置中通过
extraNodeModules强制将zustand/zustand/middleware解析到 CJS 版本,避免 import.meta 进入 web bundle。
- When: 2026-01-24 17:18
- Where: frontend/metro.config.js
- Why: Web 端仍然报 "Cannot use 'import.meta' outside a module",说明 Metro 依旧解析到了 zustand 的 ESM 入口。
- What:
- 新增
resolveRequest自定义解析,硬性将zustand/zustand/middleware指向 CJS 文件,绕开 exports/import 条件分支。
- 新增
- When: 2026-01-24 17:50
- Where:
frontend/app/(tabs)/_layout.tsxfrontend/components/web/Sidebar.tsxfrontend/app/(tabs)/web/index.tsx
- Why: 根据用户反馈重构 Web 端 UI,解决导航混乱问题并对齐新版 Dashbaord 设计。
- What:
- Navigation: 桌面端 (Width>=1024px) 彻底隐藏底部 TabBar,仅使用 Sidebar。
- Sidebar: 重构为 Logo (Top) + Nav + Profile (Bottom) 结构。实现了 "Settings/Login" 弹出菜单交互。
- Dashboard: 1:1 复刻 HTML 设计,包含 "Weekly Progress" (Donut), "Active Focus" (Card) 和 "Habit Tracker" 等新组件。
When: 2026-01-24 18:09 Where:
- frontend/store/useLanguageStore.ts
- frontend/components/web/Sidebar.tsx
- frontend/components/web/WebChatInput.tsx
- frontend/app/(tabs)/web/index.tsx
- frontend/app/(tabs)/web/calendar.tsx
- frontend/app/(tabs)/web/tasks.tsx
- frontend/app/(tabs)/web/stats.tsx
Why: 用户设置简体中文但 Web 界面仍为英文,原因是 Web 端组件大量硬编码英文文本未接入语言 store。
What:
- 为 Web 端新增一批翻译 key(Dashboard/Calendar/Tasks/Stats/Chat 等),补齐通用词条(编辑/删除/访客等)。
- 将 Web 端页面与 Sidebar/Chat 输入框全面改为使用
t(),并补充日期与文案拼接逻辑。 - 修复 Web Chat 输入框错误的 key(改用
input.placeholder)并本地化图片处理弹窗文案。
When: 2026-01-24 18:28 Where:
- frontend/app/(tabs)/web/index.tsx
- frontend/app/(tabs)/web/calendar.tsx
Why: 用户要求让 Web 端具备真实功能,而非仅作为 UI 展示。Mobile 端已具备完善的 AI 对话与任务管理,需要迁移至 Web。
What:
- Web Home:
- 接入
services/api.ts的processText,实现了 Web 版 AI 聊天/任务创建功能 (Global Chat Input)。 - 移除 "Sample Task" 硬编码,改为从
useTaskStore渲染真实任务列表。 - "Active Focus" 卡片逻辑对齐:展示第一个未完成的高优先级任务。
- "Habit Tracker" 增加本地 State 交互(点击切换状态),使其具备演示可用性。
- 接入
- Web Calendar:
- 实现了 "New Event" 按钮:调用
window.prompt获取标题并添加真实任务。 - "Next Up" 模块逻辑实现:计算当前时间之后最近的一个未完成任务。
- 修复了此前编辑导致的语法错误,重构了文件结构。
- 实现了 "New Event" 按钮:调用
- When: 2026-01-25 21:50
- Where:
backend/models.pybackend/database.pybackend/routers/pomodoro.pybackend/schemas/pomodoro.py
- Why: 实现番茄钟数据的云端同步与趋势分析,同时避免建立高频明细表导致数据量膨胀。
- What:
- Schema: User模型新增
pomo_daily_json(JSONOverText) 及累计字段。 - Redis: 新增 Redis 客户端用于接口幂等去重。
- Router: 实现
POST /pomodoro/end(写入+自动裁剪历史) 和GET /pomodoro/stats(统计+Streak计算)。
- Schema: User模型新增
- When: 2026-01-26 01:25
- Where:
frontend/store/useTimerStore.tsfrontend/services/api.tsfrontend/hooks/useStatsData.ts
- Why: 完成番茄钟功能的前端逻辑闭环,实现本地计时与云端统计的无缝同步。
- What:
- Timer Store: 创建
useTimerStore,内置 Pending Queue 机制,确保断网情况下数据不丢失,并在恢复后自动上报。 - Stats Hook: 接入后端
/stats接口,用真实数据(专注时长、Streak、趋势图)替换了之前的 Mock 数据。
- Timer Store: 创建
- When: 2026-01-27 21:05
- Where:
backend/routers/pomodoro.py - Why: 严格执行 Scheme 1 (Users Table JSON) 存储方案,确保数据一致性和存储效率。
- What:
- 重构
pomodoro.py,实现严格的 30 天裁剪和 Redis 去重 (SETNX)。 - 引入
JSONEncodedDict类型装饰器,兼容 SQLite/MySQL。 - 增加 MySQL
with_for_update悲观锁逻辑。
- 重构
- When: 2026-01-28 17:45
- Where:
frontend/app/auth/login.tsx - Why: 完善 Web 端登录流程,对齐 App 端功能并适配桌面 UI。
- What:
- 创建独立的
auth/login页面,采用居中卡片式布局。 - 移植 App 端
AccountSection的登录/注册逻辑与校验规则。 - 修复左侧边栏登录按钮的路由跳转问题。
- 创建独立的
When: 2026-01-28 18:25 Where:
- backend/models.py
Why: 修复启动时 IndentationError,恢复 User 等模型定义,解决后端无法启动导致前端 Failed to fetch。
What:
- 重建
User/Record/SystemConfig/DeviceUsage模型,补齐字段与关系。 - 恢复番茄钟统计字段与
JSONEncodedDict/MutableDict映射。
When: 2026-01-28 18:30 Where:
- backend/schemas/init.py
Why: 修复 from schemas import ProcessAudioResponse 导致的 ImportError,恢复后端可启动。
What:
- 新增 Pydantic schemas:
TaskItem/AIParseResult/ProcessAudioResponse。
When: 2026-01-28 18:34 Where:
- backend/routers/chat.py
Why: 修复 from routers import chat 导致的 ImportError,确保后端能启动。
What:
- 新增最小可用的 chat 路由模块,提供
/api/chat/health占位端点。
When: 2026-01-28 18:50 Where:
- backend/main.py
Why: Web 端从 http://localhost:8081 访问后端时被 CORS 拦截,导致登录 Failed to fetch。
What:
- CORS 白名单显式放行开发端 origin(localhost/127.0.0.1/本机 IP 的 8081/19006)。
When: 2026-01-28 18:53 Where:
- frontend/utils/uuid.ts
Why: HTTP + IP 访问下 Web 不提供 crypto.randomUUID,导致启动崩溃。
What:
- 增加 Web
crypto.getRandomValues和Math.random兜底,确保生成 UUID v4。
When: 2026-01-28 19:54 Where:
- frontend/utils/uuid.ts
Why: expo-crypto 的 randomUUID 在非安全上下文仍会抛错,导致页面启动崩溃。
What:
- 为
Crypto.randomUUID()增加 try/catch,失败时回退到本地 UUID 生成逻辑。
When: 2026-01-28 20:04 Where:
- backend/models.py
Why: 数据库中 tier 存储为 vip/free 小写,SQLAlchemy Enum 默认使用 FREE/VIP 名称,导致读取时报错。
What:
- 将
User.tier的SQLEnum改为使用枚举value(free/vip),并禁用原生枚举以兼容现有数据。
When: 2026-01-28 20:35 Where:
- frontend/components/FocusTimerWidget.tsx
- frontend/store/useTimerStore.ts
Why: 解决番茄钟缺少重置按钮、悬浮胶囊不可拖动、计时不走的问题。
What:
- 增加
reset动作并在界面提供重置按钮。 - 悬浮胶囊加入拖拽逻辑并限制在屏幕范围内。
- 在运行状态启用 1s tick,保证计时实时更新。
When: 2026-01-28 20:40 Where:
- frontend/store/useTimerStore.ts
- frontend/components/FocusTimerWidget.tsx
- frontend/components/web_screens/WebHomeScreen.tsx
Why: Web 端番茄钟卡片缺少重置按钮,无法切换正计时/倒计时,也无法选择倒计时长度。
What:
- TimerStore 增加
mode与setMode,兼容正计时/倒计时。 - 计时逻辑支持正计时增长、倒计时归零完成。
- Web 番茄钟卡片补充重置按钮、计时模式切换与时长快速选择。