READMESource: main@4baf6fdd
身体时钟 · Body Clock
A draggable floating window for DeepSeek Harness with three tabs — meals, water, standing. It picks breakfast, lunch and dinner at random, counts water cups and standing breaks, and plays a distinct 3-second chime when a reminder is due. Collapses to a 32px ball.
DeepSeek Harness Web 界面里的一个可自由拖动的悬浮窗:帮你决定今天吃什么,顺便管住喝水和站起来。
功能
- 悬浮在界面之上,按住标题栏即可随意拖动;位置会被记住。
- 每次打开 DSH / 重启后都以最小的悬浮球形式出现(不会自动弹出大窗口),点一下才展开。 收起状态下到点提醒也不会自动展开大窗口:晃的就是那颗小圆球本身,晃完圆球留着红色光圈、 球里换成对应提醒的图标(🍽️ 吃饭 / 💧 喝水 / 🧍 站立,细节放在悬停提示里),点一下展开才算读过。
- 展开后顶层三个 tab:🍽️ 吃饭、💧 喝水、🧍 站立(吃饭 tab 里面才是早饭 / 午饭 / 晚饭)。
- 早饭 / 午饭 / 晚饭三个分类,每类每天 3 次「帮我决定」机会,跨天自动重置。
- 随机时不重复(一圈抽完才重新开始)。
- 候选食物可随时添加、删除,默认各带一份常见清单。
- 收起后变成一颗正圆小悬浮球(32px,只有饭点图标,不显示剩余次数),也可拖动,悬停时微微放大; 点一下重新展开,键盘 Tab 聚焦后按回车 / 空格也能打开。
- 吃饭提醒:点标题栏的 ⏰ 打开设置,可为早/中/晚饭分别设定时间(默认 07:30 / 12:00 / 18:30), 时间为 24 小时制,分成「时」「分」两个输入框(小时 0–23、分钟 0–59,直接键入即可)。 在小时和分钟之间用 Tab 切换不会误提交;点别处或按回车才生效;格式不对会提示并保留原值,不会出现 AM/PM。 到点后浮窗会晃动约 6 秒并弹出提醒;收起时晃动的是最小图标本身,不会自动展开, 图标会留着红色标记直到你点开它。 每天每个饭点只提醒一次,提醒后有 30 分钟宽限窗口(例如 12:05 打开页面仍会收到午饭提醒)。 编辑设置期间暂停提醒,点「完成」后才按新时间开始计时(避免一边输入时间一边被晃)。 改时间会让该饭点重新生效(当天还能在新时间再提醒一次);设置页会标记「已提醒」, 底部还有「重置今天的提醒」可以手动允许今天再次提醒。 设置里有「试一下晃动」按钮可以先看效果。
- 喝水提醒:💧 喝水 tab 里记录今天的杯数(默认目标 8 杯、每杯 250ml),支持 「喝了一杯」(会把下次提醒推后一个间隔)、「撤销一杯」、「稍后 30 分钟」、「今天暂停」。 设置页顶部再分「🍽️ 吃饭提醒 / 💧 喝水提醒」两段:喝水段可设开关、活跃时段 (默认 09:00–21:00,同样是「时」「分」双输入框)、提醒间隔(默认 60 分钟,1–240;想快速看效果可设成 1)、 每日目标杯数(1–24)。达到目标或过了结束时间当天就不再提醒。 喝水到点时:展开状态窗口晃动 + toast「该喝水啦 · 3/8 杯」;收起状态只有小圆球晃动,球变成 💧 并带蓝色光圈,点开直接进喝水 tab 并清掉标记。
- 站立提醒(久坐提醒):🧍 站立 tab 记录今天已站次数(默认每天 6 次),可设活跃时段 (默认 09:00–21:00)、提醒间隔(默认 45 分钟)、站立时长(默认 3 分钟)。 到点后点「现在站一下」进入倒计时(大号 mm:ss + 进度条,倒计时结束自动算一次), 也可以「完成」提前结束或「跳过」不计次;另有「稍后 10 分钟」「今天暂停」、「重置今天的站立」。 到达每日次数或过了结束时间当天就不再提醒。
- 三种提醒到点时的规则:谁的计划时间更早谁先提醒(同一时刻按 吃饭 > 喝水 > 站立), 一次只晃一个,下一个至少隔 1 分钟;另外两个 tab 会留小圆点提示未读。 小球图标与颜色对应提醒类型:🍽️ 吃饭(红圈)、💧 喝水(蓝圈)、🧍 站立(绿圈); 同时未读时显示最新那个,其余留在各自 tab 的小圆点上。 提醒在窗口展开时也会留下未读标记:切到别的 tab 时对应 tab 出现小圆点,收起后小球照样显示该图标。
- 提醒音效:三种提醒到点时会连续响约 3 秒(每 0.5 秒一轮、共 6 轮),音色各不相同—— 吃饭 660→880(中音上行)、喝水 990→1320(高音)、站立 880→660(中音下行),与晃动同时发生。 默认开启,可在提醒设置的「吃饭提醒」段用「提醒音效」开关关闭;点旁边的「试听」会依次播放这三种音色(每种约 1 秒); 首次在 DSH 里点击或按键时会解锁音频(浏览器自动播放策略),之后即使你没在操作窗口,到点提醒也能出声; 系统静音或没有音频设备时自动静默,只剩晃动,不影响提醒本身——此时点「试听」会明确提示原因。
- 统一窗口高度、不出滚动条:吃饭 / 喝水 / 站立 / 提醒设置四个视图共用一个高度, 基准是吃饭面板的最高内容高度(实测 597px,取 600px),切 tab 不再上下跳动。 窗口高度由吃饭面板实测内容决定:内容更多或宿主字体更高时会自动增高(只增不减), 所以正常使用不会出现滚动条;内容少的视图(喝水、站立、倒计时)垂直居中,设置页顶部对齐。 只有「候选食物多到超过屏幕高度」这种物理上限才会在面板内滚动;窗口贴底/视口变矮时按可用高度收缩(最矮 305px)。
- 饭票视觉语言:决定结果是一张「今日饭票」——宋体票面、票号
NO.01、餐盘承托 emoji、 虚线撕口(两侧半圆缺口)和一枚旋转的红色印章;抽中时票面滑入 260ms、餐盘轻弹、印章盖下, 减少动态效果的系统设置下这些动画会自动关闭。标题栏是齿孔点 + 虚线,分段控件用「墨底反白」的票根样式, 候选食物是方签(抽中的带红点),设置页用虚线分区、已提醒标记也做成小红章。 - 配色与排版:表面、文字、边框全部沿用 Harness 的主题变量(
--dsw-alias-*),自动跟随深色 / 浅色主题。 三个模块各有一个强调色——吃饭暖红#c62b3a、喝水蓝#1a6ab5、站立绿#1a7f4f——只用于主操作、 当前选择和状态标记(tab 下划线、进度点、未读光圈、开关),不再使用任何渐变; 面板与它对应的设置页共享同一个强调色。正文最小 12px、控件最小 24px 点击区, 浅色与深色下的文字对比度都 ≥ 4.5:1。
结构
| 文件 | 作用 |
|---|---|
cordis.patch.yml |
Bundle patch:把 Host 侧插件行插进 profile 配置树 |
index.js |
Host 侧(无状态;界面全部在浏览器端) |
client.js |
浏览器端:注册 shell.overlay 槽位里的悬浮窗 |
locale/*.json |
插件管理器里显示的名称与说明(zh / en) |
icon.svg |
插件图标(原创) |
安装
dsh plugin add dsh-body-clock # 来自 npm
dsh plugin add github:Qing45/dsh-body-clock # 或直接从仓库
也可以在 Harness 的插件管理里从插件市场一键安装,装完刷新页面。
本地开发时用目录链接:
dsh plugin --profile <profile> add link:/Users/yang/Documents/DSH/吃什么插件/dsh-body-clock
测试
npm test # 等价于 node test/run-tests.mjs
- 89 项断言,零依赖:用假的 React、假的
window(localStorage / 定时器 / 视口)在 Node 里加载client.js, 再把内部的纯函数(时间解析、排期、到点判断)暴露出来单测。 - 覆盖范围:
- 时间:24 小时制解析、
时:分双输入框提交、非法值回退; - 输入法:中文选词时的 Enter(
isComposing/ keyCode 229)不会被当成确认; - 音效:三段提示音的音符数与兜底、音效开关的默认值与非法值修复;
- 吃饭:30 分钟宽限、每天一次、改时间重新生效、按最早到点排序;
- 喝水:目标/间隔/暂停/暂停恢复/跨天清零/长时间缺席只补一次;
- 站立:间隔排期、倒计时自动计数、「完成」计数、「跳过」不计、暂停/稍后;
- 界面:小球三态图标与颜色(🍽️/💧/🧍)、三层 tab、三个面板、设置三段表单、 键盘打开与拖拽记忆位置、未读圆点;
- 引擎:三种提醒排队(最早到点优先,同时刻 吃饭 > 喝水 > 站立)、60 秒节流、 不开窗打扰、打开才确认、设置编辑期间静默;
- 数据:五个 localStorage key 的写入、损坏数据兜底、locale 中英对齐
(含源码里每个
t('…')字面量是否存在)、包文件完整性。
- 时间:24 小时制解析、
数据
候选食物、抽取次数与窗口位置保存在浏览器 localStorage:
dsh-body-clock:data:v2— 食物清单 / 次数 / 今日结果dsh-body-clock:ui:v1— 悬浮球位置 / 当前分类 / 顶层 tab(展开状态不持久化,启动固定为收起)dsh-body-clock:reminders:v1— 吃饭提醒开关、三个饭点时间、今天已提醒过的饭点、提醒音效开关dsh-body-clock:water:v1— 喝水:今日杯数、上次喝水时间、下次提醒时间、暂停状态、喝水设置dsh-body-clock:stand:v1— 站立:今日次数、站立倒计时、下次提醒时间、暂停状态、站立设置
设计 / 视觉自检
外观改动可以离线验证,不需要装进 Harness:同工作区的 preview/ 里有一套零依赖的预览与审计工具,
它用假的 React 把 client.js 里真实的组件渲染成 HTML,所以预览不会与真实界面脱节。
(preview/ 属于开发辅助,不在本仓库内。)
许可证
MIT
No comments yet. Be the first to write one.