skill-calorie 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/SKILL.md +10 -9
  2. package/dist/.gen-inputs.json +16 -100
  3. package/dist/analysis/anomaly/common.d.ts +11 -1
  4. package/dist/analysis/anomaly/common.d.ts.map +1 -1
  5. package/dist/analysis/anomaly/common.js +11 -12
  6. package/dist/analysis/anomaly/common.js.map +1 -1
  7. package/dist/analysis/anomaly/diet.d.ts.map +1 -1
  8. package/dist/analysis/anomaly/diet.js +11 -3
  9. package/dist/analysis/anomaly/diet.js.map +1 -1
  10. package/dist/analysis/deficit.d.ts +4 -2
  11. package/dist/analysis/deficit.d.ts.map +1 -1
  12. package/dist/analysis/deficit.js +2 -1
  13. package/dist/analysis/deficit.js.map +1 -1
  14. package/dist/analysis/historyStore.d.ts +2 -2
  15. package/dist/analysis/historyStore.d.ts.map +1 -1
  16. package/dist/analysis/historyStore.js +2 -2
  17. package/dist/analysis/historyStore.js.map +1 -1
  18. package/dist/analysis/index.d.ts +7 -13
  19. package/dist/analysis/index.d.ts.map +1 -1
  20. package/dist/analysis/index.js +15 -21
  21. package/dist/analysis/index.js.map +1 -1
  22. package/dist/analysis/reportDocTracked.d.ts.map +1 -1
  23. package/dist/analysis/reportDocTracked.js +3 -2
  24. package/dist/analysis/reportDocTracked.js.map +1 -1
  25. package/dist/analysis/review.d.ts.map +1 -1
  26. package/dist/analysis/review.js +5 -3
  27. package/dist/analysis/review.js.map +1 -1
  28. package/dist/analysis/simulate.d.ts +4 -2
  29. package/dist/analysis/simulate.d.ts.map +1 -1
  30. package/dist/analysis/simulate.js +5 -2
  31. package/dist/analysis/simulate.js.map +1 -1
  32. package/dist/analysis/simulate2.d.ts.map +1 -1
  33. package/dist/analysis/simulate2.js +4 -1
  34. package/dist/analysis/simulate2.js.map +1 -1
  35. package/dist/analysis/utils.d.ts +21 -25
  36. package/dist/analysis/utils.d.ts.map +1 -1
  37. package/dist/analysis/utils.js +34 -38
  38. package/dist/analysis/utils.js.map +1 -1
  39. package/dist/body/commands.d.ts +5 -1
  40. package/dist/body/commands.d.ts.map +1 -1
  41. package/dist/body/commands.js +5 -4
  42. package/dist/body/commands.js.map +1 -1
  43. package/dist/body/index.d.ts +9 -13
  44. package/dist/body/index.d.ts.map +1 -1
  45. package/dist/body/index.js +14 -19
  46. package/dist/body/index.js.map +1 -1
  47. package/dist/body/wizardDocs.js +1 -1
  48. package/dist/body/wizardPlate.d.ts +1 -1
  49. package/dist/cli/cmd_read.d.ts.map +1 -1
  50. package/dist/cli/cmd_read.js +23 -4
  51. package/dist/cli/cmd_read.js.map +1 -1
  52. package/dist/cli/config.d.ts +16 -0
  53. package/dist/cli/config.d.ts.map +1 -0
  54. package/dist/cli/config.js +68 -0
  55. package/dist/cli/config.js.map +1 -0
  56. package/dist/cli/delivery.d.ts +2 -1
  57. package/dist/cli/delivery.d.ts.map +1 -1
  58. package/dist/cli/delivery.js +4 -3
  59. package/dist/cli/delivery.js.map +1 -1
  60. package/dist/cli/health.d.ts +7 -0
  61. package/dist/cli/health.d.ts.map +1 -0
  62. package/dist/cli/health.js +21 -0
  63. package/dist/cli/health.js.map +1 -0
  64. package/dist/cli/keys.d.ts +1 -2
  65. package/dist/cli/keys.d.ts.map +1 -1
  66. package/dist/cli/keys.js.map +1 -1
  67. package/dist/cli/readArgs.d.ts.map +1 -1
  68. package/dist/cli/readArgs.js +6 -5
  69. package/dist/cli/readArgs.js.map +1 -1
  70. package/dist/cli/write.d.ts +9 -12
  71. package/dist/cli/write.d.ts.map +1 -1
  72. package/dist/cli/write.js +7 -27
  73. package/dist/cli/write.js.map +1 -1
  74. package/dist/config.d.ts +55 -0
  75. package/dist/config.d.ts.map +1 -0
  76. package/dist/config.js +64 -0
  77. package/dist/config.js.map +1 -0
  78. package/dist/diet/commands.d.ts +6 -1
  79. package/dist/diet/commands.d.ts.map +1 -1
  80. package/dist/diet/commands.js +15 -14
  81. package/dist/diet/commands.js.map +1 -1
  82. package/dist/diet/dietEngine.d.ts.map +1 -1
  83. package/dist/diet/dietEngine.js +3 -1
  84. package/dist/diet/dietEngine.js.map +1 -1
  85. package/dist/diet/dietUi.d.ts +8 -3
  86. package/dist/diet/dietUi.d.ts.map +1 -1
  87. package/dist/diet/dietUi.js +18 -25
  88. package/dist/diet/dietUi.js.map +1 -1
  89. package/dist/diet/index.d.ts +7 -11
  90. package/dist/diet/index.d.ts.map +1 -1
  91. package/dist/diet/index.js +18 -19
  92. package/dist/diet/index.js.map +1 -1
  93. package/dist/diet/nutritionPort.d.ts +2 -5
  94. package/dist/diet/nutritionPort.d.ts.map +1 -1
  95. package/dist/diet/nutritionPort.js +14 -12
  96. package/dist/diet/nutritionPort.js.map +1 -1
  97. package/dist/diet/precheckPort.d.ts.map +1 -1
  98. package/dist/diet/precheckPort.js +3 -1
  99. package/dist/diet/precheckPort.js.map +1 -1
  100. package/dist/diet/review.d.ts.map +1 -1
  101. package/dist/diet/review.js +3 -18
  102. package/dist/diet/review.js.map +1 -1
  103. package/dist/exercise/cardio.js +1 -1
  104. package/dist/exercise/cardio.js.map +1 -1
  105. package/dist/exercise/commands.d.ts +1 -1
  106. package/dist/exercise/commands.d.ts.map +1 -1
  107. package/dist/exercise/commands.js +3 -3
  108. package/dist/exercise/commands.js.map +1 -1
  109. package/dist/exercise/distribution.js +1 -1
  110. package/dist/exercise/distribution.js.map +1 -1
  111. package/dist/exercise/edit.d.ts.map +1 -1
  112. package/dist/exercise/edit.js +4 -2
  113. package/dist/exercise/edit.js.map +1 -1
  114. package/dist/exercise/exerciseStore.d.ts.map +1 -1
  115. package/dist/exercise/exerciseStore.js +16 -10
  116. package/dist/exercise/exerciseStore.js.map +1 -1
  117. package/dist/exercise/index.d.ts +7 -12
  118. package/dist/exercise/index.d.ts.map +1 -1
  119. package/dist/exercise/index.js +14 -19
  120. package/dist/exercise/index.js.map +1 -1
  121. package/dist/exercise/recap.js +1 -1
  122. package/dist/exercise/recap.js.map +1 -1
  123. package/dist/exercise/sportPortDocs.d.ts +9 -0
  124. package/dist/exercise/sportPortDocs.d.ts.map +1 -0
  125. package/dist/exercise/sportPortDocs.js +896 -0
  126. package/dist/exercise/sportPortDocs.js.map +1 -0
  127. package/dist/exercise/sportUi.d.ts +4 -2
  128. package/dist/exercise/sportUi.d.ts.map +1 -1
  129. package/dist/exercise/sportUi.js +13 -44
  130. package/dist/exercise/sportUi.js.map +1 -1
  131. package/dist/exercise/strength.js +1 -1
  132. package/dist/exercise/strength.js.map +1 -1
  133. package/dist/exercise/trend.js +1 -1
  134. package/dist/exercise/trend.js.map +1 -1
  135. package/dist/fetch/body.d.ts.map +1 -1
  136. package/dist/fetch/body.js +15 -12
  137. package/dist/fetch/body.js.map +1 -1
  138. package/dist/fetch/diet.d.ts +6 -5
  139. package/dist/fetch/diet.d.ts.map +1 -1
  140. package/dist/fetch/diet.js +19 -25
  141. package/dist/fetch/diet.js.map +1 -1
  142. package/dist/goal/commands.d.ts +5 -1
  143. package/dist/goal/commands.d.ts.map +1 -1
  144. package/dist/goal/commands.js +7 -6
  145. package/dist/goal/commands.js.map +1 -1
  146. package/dist/goal/goalExtraPlate.d.ts.map +1 -1
  147. package/dist/goal/goalExtraPlate.js +3 -1
  148. package/dist/goal/goalExtraPlate.js.map +1 -1
  149. package/dist/goal/goalHistory.d.ts +2 -2
  150. package/dist/goal/goalHistory.d.ts.map +1 -1
  151. package/dist/goal/goalHistory.js +4 -9
  152. package/dist/goal/goalHistory.js.map +1 -1
  153. package/dist/goal/index.d.ts +6 -10
  154. package/dist/goal/index.d.ts.map +1 -1
  155. package/dist/goal/index.js +11 -19
  156. package/dist/goal/index.js.map +1 -1
  157. package/dist/goal/nutritionGoal.d.ts.map +1 -1
  158. package/dist/goal/nutritionGoal.js +4 -1
  159. package/dist/goal/nutritionGoal.js.map +1 -1
  160. package/dist/goal/read.d.ts +1 -1
  161. package/dist/goal/read.d.ts.map +1 -1
  162. package/dist/goal/read.js +1 -1
  163. package/dist/goal/read.js.map +1 -1
  164. package/dist/goal/set.d.ts.map +1 -1
  165. package/dist/goal/set.js +2 -2
  166. package/dist/goal/set.js.map +1 -1
  167. package/dist/health.d.ts +41 -0
  168. package/dist/health.d.ts.map +1 -0
  169. package/dist/health.js +501 -0
  170. package/dist/health.js.map +1 -0
  171. package/dist/help-missing.json +1 -1
  172. package/dist/home/index.d.ts +8 -9
  173. package/dist/home/index.d.ts.map +1 -1
  174. package/dist/home/index.js +11 -11
  175. package/dist/home/index.js.map +1 -1
  176. package/dist/index.d.ts +24 -16
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +24 -12
  179. package/dist/index.js.map +1 -1
  180. package/dist/migrate/migrate.js +2 -2
  181. package/dist/migrate/migrate.js.map +1 -1
  182. package/dist/output.d.ts +4 -3
  183. package/dist/output.d.ts.map +1 -1
  184. package/dist/output.js +12 -5
  185. package/dist/output.js.map +1 -1
  186. package/dist/paths.d.ts +6 -2
  187. package/dist/paths.d.ts.map +1 -1
  188. package/dist/paths.js +28 -17
  189. package/dist/paths.js.map +1 -1
  190. package/dist/photo/commands.d.ts +1 -1
  191. package/dist/photo/commands.d.ts.map +1 -1
  192. package/dist/photo/commands.js +3 -3
  193. package/dist/photo/commands.js.map +1 -1
  194. package/dist/photo/compareDoc.js +1 -1
  195. package/dist/photo/compareDoc.js.map +1 -1
  196. package/dist/photo/dir.d.ts +1 -1
  197. package/dist/photo/dir.d.ts.map +1 -1
  198. package/dist/photo/dir.js +6 -5
  199. package/dist/photo/dir.js.map +1 -1
  200. package/dist/photo/gifDoc.d.ts.map +1 -1
  201. package/dist/photo/gifDoc.js +10 -4
  202. package/dist/photo/gifDoc.js.map +1 -1
  203. package/dist/photo/helpCenter.js +1 -1
  204. package/dist/photo/helpCenter.js.map +1 -1
  205. package/dist/photo/helpFile.js +1 -1
  206. package/dist/photo/helpFile.js.map +1 -1
  207. package/dist/photo/helpPaths.d.ts +1 -1
  208. package/dist/photo/helpPaths.js +1 -1
  209. package/dist/photo/helpShell.d.ts +16 -0
  210. package/dist/photo/helpShell.d.ts.map +1 -0
  211. package/dist/photo/helpShell.js +27 -0
  212. package/dist/photo/helpShell.js.map +1 -0
  213. package/dist/photo/index.d.ts +7 -11
  214. package/dist/photo/index.d.ts.map +1 -1
  215. package/dist/photo/index.js +11 -19
  216. package/dist/photo/index.js.map +1 -1
  217. package/dist/photo/photos.d.ts +5 -3
  218. package/dist/photo/photos.d.ts.map +1 -1
  219. package/dist/photo/photos.js +15 -14
  220. package/dist/photo/photos.js.map +1 -1
  221. package/dist/photo/pickerDoc.js +1 -1
  222. package/dist/photo/templates.d.ts +4 -0
  223. package/dist/photo/templates.d.ts.map +1 -0
  224. package/dist/photo/templates.js +29 -0
  225. package/dist/photo/templates.js.map +1 -0
  226. package/dist/photo/viewerDoc.js +1 -1
  227. package/dist/photo/viewerDoc.js.map +1 -1
  228. package/dist/photo/wizard.d.ts +1 -1
  229. package/dist/photo/wizard.js +2 -2
  230. package/dist/photo/wizard.js.map +1 -1
  231. package/dist/photo/wizardPort.d.ts +70 -0
  232. package/dist/photo/wizardPort.d.ts.map +1 -0
  233. package/dist/photo/wizardPort.js +232 -0
  234. package/dist/photo/wizardPort.js.map +1 -0
  235. package/dist/photo/wizardPortDocs.d.ts +6 -0
  236. package/dist/photo/wizardPortDocs.d.ts.map +1 -0
  237. package/dist/photo/wizardPortDocs.js +322 -0
  238. package/dist/photo/wizardPortDocs.js.map +1 -0
  239. package/dist/profile/commands.d.ts +5 -1
  240. package/dist/profile/commands.d.ts.map +1 -1
  241. package/dist/profile/commands.js +4 -3
  242. package/dist/profile/commands.js.map +1 -1
  243. package/dist/profile/index.d.ts +7 -13
  244. package/dist/profile/index.d.ts.map +1 -1
  245. package/dist/profile/index.js +14 -19
  246. package/dist/profile/index.js.map +1 -1
  247. package/dist/profile/setup.d.ts +1 -1
  248. package/dist/render/analysisPlate.d.ts +3 -3
  249. package/dist/render/analysisPlate.d.ts.map +1 -1
  250. package/dist/render/analysisPlate.js +4 -21
  251. package/dist/render/analysisPlate.js.map +1 -1
  252. package/dist/render/diet.d.ts +10 -6
  253. package/dist/render/diet.d.ts.map +1 -1
  254. package/dist/render/diet.js +8 -23
  255. package/dist/render/diet.js.map +1 -1
  256. package/dist/render/exercisePort.d.ts +1 -1
  257. package/dist/render/html.d.ts +0 -6
  258. package/dist/render/html.d.ts.map +1 -1
  259. package/dist/render/html.js +2 -44
  260. package/dist/render/html.js.map +1 -1
  261. package/dist/render/index.d.ts +0 -3
  262. package/dist/render/index.d.ts.map +1 -1
  263. package/dist/render/index.js +2 -2
  264. package/dist/render/index.js.map +1 -1
  265. package/dist/render/planWizardDocs.js +1 -1
  266. package/dist/render/planWizardDocs.js.map +1 -1
  267. package/dist/render/trendMiscPort.d.ts.map +1 -1
  268. package/dist/render/trendMiscPort.js +6 -4
  269. package/dist/render/trendMiscPort.js.map +1 -1
  270. package/dist/render/workoutPlanDocs.js +1 -1
  271. package/dist/render/workoutPlanDocs.js.map +1 -1
  272. package/dist/shared/alive.d.ts +22 -0
  273. package/dist/shared/alive.d.ts.map +1 -0
  274. package/dist/shared/alive.js +22 -0
  275. package/dist/shared/alive.js.map +1 -0
  276. package/dist/shared/commandSpec.d.ts +14 -4
  277. package/dist/shared/commandSpec.d.ts.map +1 -1
  278. package/dist/shared/copyBlock.d.ts +4 -0
  279. package/dist/shared/copyBlock.d.ts.map +1 -0
  280. package/dist/shared/copyBlock.js +26 -0
  281. package/dist/shared/copyBlock.js.map +1 -0
  282. package/dist/shared/docPage.d.ts +2 -1
  283. package/dist/shared/docPage.d.ts.map +1 -1
  284. package/dist/shared/docPage.js +21 -33
  285. package/dist/shared/docPage.js.map +1 -1
  286. package/dist/shared/healthRate.d.ts +21 -0
  287. package/dist/shared/healthRate.d.ts.map +1 -0
  288. package/dist/shared/healthRate.js +21 -0
  289. package/dist/shared/healthRate.js.map +1 -0
  290. package/dist/shared/kcalPerKg.d.ts +16 -0
  291. package/dist/shared/kcalPerKg.d.ts.map +1 -0
  292. package/dist/shared/kcalPerKg.js +16 -0
  293. package/dist/shared/kcalPerKg.js.map +1 -0
  294. package/dist/shared/meal.d.ts +46 -0
  295. package/dist/shared/meal.d.ts.map +1 -0
  296. package/dist/shared/meal.js +75 -0
  297. package/dist/shared/meal.js.map +1 -0
  298. package/dist/shared/nutritionRange.d.ts +28 -0
  299. package/dist/shared/nutritionRange.d.ts.map +1 -0
  300. package/dist/shared/nutritionRange.js +28 -0
  301. package/dist/shared/nutritionRange.js.map +1 -0
  302. package/dist/shared/pageStrips.d.ts +81 -0
  303. package/dist/shared/pageStrips.d.ts.map +1 -0
  304. package/dist/shared/pageStrips.js +166 -0
  305. package/dist/shared/pageStrips.js.map +1 -0
  306. package/dist/shared/planCopyBlock.d.ts +32 -0
  307. package/dist/shared/planCopyBlock.d.ts.map +1 -0
  308. package/dist/shared/planCopyBlock.js +34 -0
  309. package/dist/shared/planCopyBlock.js.map +1 -0
  310. package/dist/shared/sourceLine.d.ts +5 -5
  311. package/dist/shared/sourceLine.d.ts.map +1 -1
  312. package/dist/shared/sourceLine.js +3 -1
  313. package/dist/shared/sourceLine.js.map +1 -1
  314. package/dist/shared/time.d.ts +28 -0
  315. package/dist/shared/time.d.ts.map +1 -0
  316. package/dist/shared/time.js +37 -0
  317. package/dist/shared/time.js.map +1 -0
  318. package/dist/triggers/routeSpec.d.ts +3 -3
  319. package/dist/triggers/routeSpec.js +3 -3
  320. package/dist/triggers/routes.generated.d.ts +2 -2
  321. package/dist/weight/commands.d.ts +4 -1
  322. package/dist/weight/commands.d.ts.map +1 -1
  323. package/dist/weight/commands.js +5 -4
  324. package/dist/weight/commands.js.map +1 -1
  325. package/dist/weight/figures.d.ts.map +1 -1
  326. package/dist/weight/figures.js +3 -1
  327. package/dist/weight/figures.js.map +1 -1
  328. package/dist/weight/index.d.ts +11 -17
  329. package/dist/weight/index.d.ts.map +1 -1
  330. package/dist/weight/index.js +16 -19
  331. package/dist/weight/index.js.map +1 -1
  332. package/dist/weight/records.d.ts.map +1 -1
  333. package/dist/weight/records.js +4 -2
  334. package/dist/weight/records.js.map +1 -1
  335. package/dist/weight/review.js +2 -2
  336. package/dist/weight/review.js.map +1 -1
  337. package/dist/weight/weightUi.d.ts +16 -4
  338. package/dist/weight/weightUi.d.ts.map +1 -1
  339. package/dist/weight/weightUi.js +23 -53
  340. package/dist/weight/weightUi.js.map +1 -1
  341. package/dist/workout/commands.d.ts +16 -2
  342. package/dist/workout/commands.d.ts.map +1 -1
  343. package/dist/workout/commands.js +17 -16
  344. package/dist/workout/commands.js.map +1 -1
  345. package/dist/workout/index.d.ts +10 -19
  346. package/dist/workout/index.d.ts.map +1 -1
  347. package/dist/workout/index.js +17 -31
  348. package/dist/workout/index.js.map +1 -1
  349. package/dist/workout/land.d.ts +1 -1
  350. package/dist/workout/land.js +3 -3
  351. package/dist/workout/land.js.map +1 -1
  352. package/dist/workout/landBatch.d.ts +7 -5
  353. package/dist/workout/landBatch.d.ts.map +1 -1
  354. package/dist/workout/landBatch.js +17 -15
  355. package/dist/workout/landBatch.js.map +1 -1
  356. package/dist/workout/landBatchPages.d.ts.map +1 -1
  357. package/dist/workout/landBatchPages.js +2 -23
  358. package/dist/workout/landBatchPages.js.map +1 -1
  359. package/dist/workout/landPages.d.ts.map +1 -1
  360. package/dist/workout/landPages.js +2 -23
  361. package/dist/workout/landPages.js.map +1 -1
  362. package/dist/workout/landRunner.d.ts +8 -10
  363. package/dist/workout/landRunner.d.ts.map +1 -1
  364. package/dist/workout/landRunner.js +35 -56
  365. package/dist/workout/landRunner.js.map +1 -1
  366. package/dist/workout/planCopyBlock.d.ts +9 -0
  367. package/dist/workout/planCopyBlock.d.ts.map +1 -0
  368. package/dist/workout/planCopyBlock.js +9 -0
  369. package/dist/workout/planCopyBlock.js.map +1 -0
  370. package/dist/workout/planEditor.d.ts +94 -0
  371. package/dist/workout/planEditor.d.ts.map +1 -0
  372. package/dist/workout/planEditor.js +38 -0
  373. package/dist/workout/planEditor.js.map +1 -0
  374. package/dist/workout/planEditorCss.d.ts +13 -0
  375. package/dist/workout/planEditorCss.d.ts.map +1 -0
  376. package/dist/workout/planEditorCss.js +140 -0
  377. package/dist/workout/planEditorCss.js.map +1 -0
  378. package/dist/workout/planEditorDocs.d.ts +7 -0
  379. package/dist/workout/planEditorDocs.d.ts.map +1 -0
  380. package/dist/workout/planEditorDocs.js +56 -0
  381. package/dist/workout/planEditorDocs.js.map +1 -0
  382. package/dist/workout/planEditorPort.d.ts +45 -0
  383. package/dist/workout/planEditorPort.d.ts.map +1 -0
  384. package/dist/workout/planEditorPort.js +217 -0
  385. package/dist/workout/planEditorPort.js.map +1 -0
  386. package/dist/workout/planEditorRuntime.d.ts +15 -0
  387. package/dist/workout/planEditorRuntime.d.ts.map +1 -0
  388. package/dist/workout/planEditorRuntime.js +427 -0
  389. package/dist/workout/planEditorRuntime.js.map +1 -0
  390. package/dist/workout/planStore.d.ts.map +1 -1
  391. package/dist/workout/planStore.js +1 -3
  392. package/dist/workout/planStore.js.map +1 -1
  393. package/dist/workout/receipt.d.ts +1 -1
  394. package/dist/workout/receipt.js +1 -1
  395. package/dist/workout/receipt.js.map +1 -1
  396. package/dist/workout/review.d.ts +1 -1
  397. package/dist/workout/review.js +1 -1
  398. package/dist/workout/review.js.map +1 -1
  399. package/dist/workout/reviewDocs.d.ts +3 -0
  400. package/dist/workout/reviewDocs.d.ts.map +1 -0
  401. package/dist/{render → workout}/reviewDocs.js +2 -2
  402. package/dist/workout/reviewDocs.js.map +1 -0
  403. package/dist/workout/reviewDocsCss.d.ts.map +1 -0
  404. package/dist/{render → workout}/reviewDocsCss.js +1 -1
  405. package/dist/workout/reviewDocsCss.js.map +1 -0
  406. package/dist/workout/xunjiBackfill.d.ts.map +1 -1
  407. package/dist/workout/xunjiBackfill.js +4 -25
  408. package/dist/workout/xunjiBackfill.js.map +1 -1
  409. package/dist/workout/xunjiPush.d.ts.map +1 -1
  410. package/dist/workout/xunjiPush.js +4 -25
  411. package/dist/workout/xunjiPush.js.map +1 -1
  412. package/dist/workout/xunjiRunner.d.ts +11 -5
  413. package/dist/workout/xunjiRunner.d.ts.map +1 -1
  414. package/dist/workout/xunjiRunner.js +29 -29
  415. package/dist/workout/xunjiRunner.js.map +1 -1
  416. package/dist/xunji/backfill.d.ts +5 -3
  417. package/dist/xunji/backfill.d.ts.map +1 -1
  418. package/dist/xunji/backfill.js +11 -5
  419. package/dist/xunji/backfill.js.map +1 -1
  420. package/dist/xunji/catalog.d.ts +3 -1
  421. package/dist/xunji/catalog.d.ts.map +1 -1
  422. package/dist/xunji/catalog.js +12 -6
  423. package/dist/xunji/catalog.js.map +1 -1
  424. package/dist/xunji/fetch.d.ts +3 -4
  425. package/dist/xunji/fetch.d.ts.map +1 -1
  426. package/dist/xunji/fetch.js +8 -9
  427. package/dist/xunji/fetch.js.map +1 -1
  428. package/dist/xunji/key.d.ts +16 -56
  429. package/dist/xunji/key.d.ts.map +1 -1
  430. package/dist/xunji/key.js +44 -104
  431. package/dist/xunji/key.js.map +1 -1
  432. package/dist/xunji/planSource.d.ts +3 -3
  433. package/dist/xunji/planSource.js +6 -6
  434. package/dist/xunji/planSource.js.map +1 -1
  435. package/dist/xunji/rateLimit.d.ts +7 -2
  436. package/dist/xunji/rateLimit.d.ts.map +1 -1
  437. package/dist/xunji/rateLimit.js +12 -3
  438. package/dist/xunji/rateLimit.js.map +1 -1
  439. package/dist/xunji/run-sync.d.ts +3 -3
  440. package/dist/xunji/run-sync.d.ts.map +1 -1
  441. package/dist/xunji/run-sync.js +5 -5
  442. package/dist/xunji/run-sync.js.map +1 -1
  443. package/dist/xunji/run.d.ts +2 -4
  444. package/dist/xunji/run.d.ts.map +1 -1
  445. package/dist/xunji/run.js +5 -5
  446. package/dist/xunji/run.js.map +1 -1
  447. package/dist/xunji/subcommands.d.ts.map +1 -1
  448. package/dist/xunji/subcommands.js +2 -3
  449. package/dist/xunji/subcommands.js.map +1 -1
  450. package/dist/xunji/upsert.d.ts +4 -4
  451. package/dist/xunji/upsert.d.ts.map +1 -1
  452. package/dist/xunji/upsert.js +6 -6
  453. package/dist/xunji/upsert.js.map +1 -1
  454. package/package.json +2 -9
  455. package/dist/cli/legacy/index.d.ts +0 -25
  456. package/dist/cli/legacy/index.d.ts.map +0 -1
  457. package/dist/cli/legacy/index.js +0 -37
  458. package/dist/cli/legacy/index.js.map +0 -1
  459. package/dist/cli/legacy/routes/index.d.ts +0 -8
  460. package/dist/cli/legacy/routes/index.d.ts.map +0 -1
  461. package/dist/cli/legacy/routes/index.js +0 -23
  462. package/dist/cli/legacy/routes/index.js.map +0 -1
  463. package/dist/cli/legacy/routes/scene-01.d.ts +0 -12
  464. package/dist/cli/legacy/routes/scene-01.d.ts.map +0 -1
  465. package/dist/cli/legacy/routes/scene-01.js +0 -2
  466. package/dist/cli/legacy/routes/scene-01.js.map +0 -1
  467. package/dist/cli/legacy/routes/scene-02.d.ts +0 -18
  468. package/dist/cli/legacy/routes/scene-02.d.ts.map +0 -1
  469. package/dist/cli/legacy/routes/scene-02.js +0 -2
  470. package/dist/cli/legacy/routes/scene-02.js.map +0 -1
  471. package/dist/cli/legacy/routes/scene-03.d.ts +0 -13
  472. package/dist/cli/legacy/routes/scene-03.d.ts.map +0 -1
  473. package/dist/cli/legacy/routes/scene-03.js +0 -2
  474. package/dist/cli/legacy/routes/scene-03.js.map +0 -1
  475. package/dist/cli/legacy/routes/scene-04.d.ts +0 -10
  476. package/dist/cli/legacy/routes/scene-04.d.ts.map +0 -1
  477. package/dist/cli/legacy/routes/scene-04.js +0 -2
  478. package/dist/cli/legacy/routes/scene-04.js.map +0 -1
  479. package/dist/cli/legacy/routes/scene-05.d.ts +0 -10
  480. package/dist/cli/legacy/routes/scene-05.d.ts.map +0 -1
  481. package/dist/cli/legacy/routes/scene-05.js +0 -2
  482. package/dist/cli/legacy/routes/scene-05.js.map +0 -1
  483. package/dist/cli/legacy/routes/scene-06.d.ts +0 -10
  484. package/dist/cli/legacy/routes/scene-06.d.ts.map +0 -1
  485. package/dist/cli/legacy/routes/scene-06.js +0 -2
  486. package/dist/cli/legacy/routes/scene-06.js.map +0 -1
  487. package/dist/cli/legacy/routes/scene-07.d.ts +0 -10
  488. package/dist/cli/legacy/routes/scene-07.d.ts.map +0 -1
  489. package/dist/cli/legacy/routes/scene-07.js +0 -2
  490. package/dist/cli/legacy/routes/scene-07.js.map +0 -1
  491. package/dist/cli/legacy/routes/scene-08.d.ts +0 -12
  492. package/dist/cli/legacy/routes/scene-08.d.ts.map +0 -1
  493. package/dist/cli/legacy/routes/scene-08.js +0 -2
  494. package/dist/cli/legacy/routes/scene-08.js.map +0 -1
  495. package/dist/cli/legacy/routes/scene-09.d.ts +0 -12
  496. package/dist/cli/legacy/routes/scene-09.d.ts.map +0 -1
  497. package/dist/cli/legacy/routes/scene-09.js +0 -2
  498. package/dist/cli/legacy/routes/scene-09.js.map +0 -1
  499. package/dist/cli/legacy/routes/scene-10.d.ts +0 -10
  500. package/dist/cli/legacy/routes/scene-10.d.ts.map +0 -1
  501. package/dist/cli/legacy/routes/scene-10.js +0 -2
  502. package/dist/cli/legacy/routes/scene-10.js.map +0 -1
  503. package/dist/cli/legacy/scene-01.d.ts +0 -13
  504. package/dist/cli/legacy/scene-01.d.ts.map +0 -1
  505. package/dist/cli/legacy/scene-01.js +0 -2
  506. package/dist/cli/legacy/scene-01.js.map +0 -1
  507. package/dist/cli/legacy/scene-02.d.ts +0 -12
  508. package/dist/cli/legacy/scene-02.d.ts.map +0 -1
  509. package/dist/cli/legacy/scene-02.js +0 -2
  510. package/dist/cli/legacy/scene-02.js.map +0 -1
  511. package/dist/cli/legacy/scene-03.d.ts +0 -14
  512. package/dist/cli/legacy/scene-03.d.ts.map +0 -1
  513. package/dist/cli/legacy/scene-03.js +0 -2
  514. package/dist/cli/legacy/scene-03.js.map +0 -1
  515. package/dist/cli/legacy/scene-04.d.ts +0 -12
  516. package/dist/cli/legacy/scene-04.d.ts.map +0 -1
  517. package/dist/cli/legacy/scene-04.js +0 -2
  518. package/dist/cli/legacy/scene-04.js.map +0 -1
  519. package/dist/cli/legacy/scene-05.d.ts +0 -14
  520. package/dist/cli/legacy/scene-05.d.ts.map +0 -1
  521. package/dist/cli/legacy/scene-05.js +0 -2
  522. package/dist/cli/legacy/scene-05.js.map +0 -1
  523. package/dist/cli/legacy/scene-06.d.ts +0 -15
  524. package/dist/cli/legacy/scene-06.d.ts.map +0 -1
  525. package/dist/cli/legacy/scene-06.js +0 -2
  526. package/dist/cli/legacy/scene-06.js.map +0 -1
  527. package/dist/cli/legacy/scene-07.d.ts +0 -15
  528. package/dist/cli/legacy/scene-07.d.ts.map +0 -1
  529. package/dist/cli/legacy/scene-07.js +0 -2
  530. package/dist/cli/legacy/scene-07.js.map +0 -1
  531. package/dist/cli/legacy/scene-08.d.ts +0 -13
  532. package/dist/cli/legacy/scene-08.d.ts.map +0 -1
  533. package/dist/cli/legacy/scene-08.js +0 -2
  534. package/dist/cli/legacy/scene-08.js.map +0 -1
  535. package/dist/cli/legacy/scene-09.d.ts +0 -13
  536. package/dist/cli/legacy/scene-09.d.ts.map +0 -1
  537. package/dist/cli/legacy/scene-09.js +0 -2
  538. package/dist/cli/legacy/scene-09.js.map +0 -1
  539. package/dist/cli/legacy/scene-10.d.ts +0 -13
  540. package/dist/cli/legacy/scene-10.d.ts.map +0 -1
  541. package/dist/cli/legacy/scene-10.js +0 -2
  542. package/dist/cli/legacy/scene-10.js.map +0 -1
  543. package/dist/cli/legacy/types.d.ts +0 -16
  544. package/dist/cli/legacy/types.d.ts.map +0 -1
  545. package/dist/cli/legacy/types.js +0 -2
  546. package/dist/cli/legacy/types.js.map +0 -1
  547. package/dist/render/reviewDocs.d.ts +0 -3
  548. package/dist/render/reviewDocs.d.ts.map +0 -1
  549. package/dist/render/reviewDocs.js.map +0 -1
  550. package/dist/render/reviewDocsCss.d.ts.map +0 -1
  551. package/dist/render/reviewDocsCss.js.map +0 -1
  552. /package/dist/{render → workout}/reviewDocsCss.d.ts +0 -0
@@ -0,0 +1,75 @@
1
+ /** 餐别的**唯一定义地**(#717 批①):时间窗、归属、四桶,全包只此一份。
2
+ *
3
+ * 谁在用(写得出哪两个能力在用):
4
+ * ① 饮食能力 `diet/`(`diet/review.ts` 的餐别分布页归桶);
5
+ * ② 分析能力 `analysis/`(`analysis/anomaly/common.ts` 的「诊断饮食结构问题」餐次统计);
6
+ * ③ 取数层 `fetch/diet.ts`(记一餐时的餐别推断、按餐别删除的 SQL 窗口)与页面层
7
+ * `render/diet.ts`/`render/analysisPlate.ts`(复盘页按餐汇总)——都从这里转出。
8
+ *
9
+ * 本件**零依赖**:不 import 任何件,也不出现任何一个能力目录的名字(结构标准的「依赖方向」)。
10
+ *
11
+ * 收在这里之前的样子(#701 普查、#717 批①):时间窗的正本在 `fetch/diet.ts`,
12
+ * 而 `analysis/anomaly/common.ts` 另写了一套小时边界(10/15/21),两套边界在
13
+ * 14:30/21:30/22:30 这类时刻给出不同餐别——同一条记录在两个页面上被算进不同的餐。
14
+ *
15
+ * 窗一律**半开区间** `[from, to)`;`to` 可以大于 24(跨零点那一档),判定时按 24 取模。
16
+ */
17
+ /** 五类餐名(不含聚合桶「加餐」;写入口的 `--meal` 值域逐字用这一份)。 */
18
+ export const MEAL_NAMES = ['早餐', '午餐', '下午茶', '晚餐', '夜宵'];
19
+ /** 餐别**桶**(餐别分布页与复盘页的四桶;「加餐」=下午茶 + 夜宵)。 */
20
+ export const MEAL_BUCKETS = ['早餐', '午餐', '晚餐', '加餐'];
21
+ /** 时间窗正本(半开区间 `[from, to)`;`to > 24` 表示跨零点)。 */
22
+ export const MEAL_WINDOW = {
23
+ 早餐: [6, 10],
24
+ 午餐: [10, 14],
25
+ 下午茶: [14, 18],
26
+ 晚餐: [18, 22],
27
+ 夜宵: [22, 30],
28
+ };
29
+ /** 聚合桶「加餐」的窗口:下午茶 + 夜宵,逐格取自 `MEAL_WINDOW`、不另写一套。
30
+ *
31
+ * **夜宵跨零点**:22:00 之后的记录归夜宵,故夜宵窗口是 `[22, 30)`(按 24 取模=`[22, 6)`)。
32
+ * 收在正本之前那处自相矛盾——夜宵窗只写了 `0-6`,22 点后的记录归成夜宵却不落进夜宵窗,
33
+ * 删「夜宵」也删不掉它;`MEAL_WINDOW` 与按窗删的 SQL 现在读同一份,不再各写各的。 */
34
+ export const SNACK_WINDOW = [
35
+ MEAL_WINDOW.下午茶[0], MEAL_WINDOW.下午茶[1], MEAL_WINDOW.夜宵[0], MEAL_WINDOW.夜宵[1],
36
+ ];
37
+ /** 全包唯一的时间窗表:五类餐 + 加餐(列序即 `mealWindowSql()` 的占位符顺序)。 */
38
+ export const MEAL_WINDOWS = {
39
+ 早餐: MEAL_WINDOW.早餐, 午餐: MEAL_WINDOW.午餐, 下午茶: MEAL_WINDOW.下午茶,
40
+ 晚餐: MEAL_WINDOW.晚餐, 夜宵: MEAL_WINDOW.夜宵, 加餐: SNACK_WINDOW, 其他: [],
41
+ };
42
+ /** 钟点落在哪个窗(半开 `[from, to)`,`to > 24` 即跨零点):判据只此一处。
43
+ *
44
+ * 两段的写法与 SQL 那侧同一套(`>= from AND < 24` 或 `>= 0 AND < to-24`):
45
+ * `to` 允许等于 24(=零点收口,第二段退化成空),也允许大于 24(跨零点那一档)。 */
46
+ export function inMealWindow(hour, from, to) {
47
+ const h = ((hour % 24) + 24) % 24;
48
+ return (h >= from && h < Math.min(to, 24)) || (to > 24 && h < to - 24);
49
+ }
50
+ /** 时间串 → 五类餐名。按 `MEAL_NAMES` 的次序过一遍 `MEAL_WINDOW`,认不出回 `'其他'`。
51
+ *
52
+ * 边界的正本只有 `MEAL_WINDOW` 一处:这里不再写任何字面小时数。 */
53
+ export function inferMealType(timeStr) {
54
+ const hour = parseInt(String(timeStr).split(':')[0], 10);
55
+ if (Number.isNaN(hour))
56
+ return '其他';
57
+ for (const name of MEAL_NAMES) {
58
+ const w = MEAL_WINDOW[name];
59
+ if (inMealWindow(hour, w[0], w[1]))
60
+ return name;
61
+ }
62
+ return '其他';
63
+ }
64
+ /** 时间串 → 餐别桶(四桶)。下午茶与夜宵并入「加餐」;认不出回 `null`(调用方各自决定怎么显示缺值)。 */
65
+ export function mealBucketOf(time) {
66
+ if (!time)
67
+ return null;
68
+ const m = inferMealType(time);
69
+ if (m === '早餐' || m === '午餐' || m === '晚餐')
70
+ return m;
71
+ if (m === '下午茶' || m === '夜宵')
72
+ return '加餐';
73
+ return null;
74
+ }
75
+ //# sourceMappingURL=meal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meal.js","sourceRoot":"","sources":["../../src/shared/meal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAInE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAO9D,gDAAgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAgD;IACtE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACX,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACZ,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACb,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACZ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;CACb,CAAC;AAEF;;;;wDAIwD;AACxD,MAAM,CAAC,MAAM,YAAY,GAA8C;IACrE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;CAC7E,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,YAAY,GAAuC;IAC9D,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG;IAC5D,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE;CACjE,CAAC;AAEF;;;oDAGoD;AACpD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,EAAU;IACjE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAClC,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;6CAE6C;AAC7C,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,IAA+B;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,28 @@
1
+ /** 三大营养素推荐区间的**唯一定义地**(#717 批②)。
2
+ *
3
+ * 谁在用(写得出哪两个能力在用):
4
+ * ① 饮食能力 `diet/`——「营养配比」页的推荐范围对比表(`diet/nutritionPort.ts` 取数、`diet/nutritionPortDocs.ts` 上屏);
5
+ * ② 分析能力 `analysis/`——「诊断营养不均衡(含均衡判断)」的失衡判决(`analysis/anomaly/diet.ts`)。
6
+ *
7
+ * 本件**零依赖**:不 import 任何件,也不出现任何一个能力目录的名字(结构标准的「依赖方向」)。
8
+ *
9
+ * 收在这里之前的样子(#701 普查、#717 批②):配比页那一套(旧 `render_nutrition_ratio.py` 的 range 表逐字)
10
+ * 住 `diet/nutritionPort.ts`,而诊断侧另写了一套 **无出处** 的数(15-30/40-60/20-35)并拿它出判决——
11
+ * 同一份库上,一边印 10-20/45-65/20-35,另一边印 15-30/40-60/20-35 并按后者判「失衡」。
12
+ * 内容三裁(#701 已由维护者裁定):取**有出处的那一套**(蛋白 10-20/碳水 45-65/脂肪 20-35),
13
+ * 孤儿那套作废。
14
+ */
15
+ /** 三大营养素的名字(取值键;页面与诊断两侧共用同一组键,避免各写一套中文名)。 */
16
+ export declare const MACRO_NAMES: readonly ["protein", "carb", "fat"];
17
+ export type MacroName = (typeof MACRO_NAMES)[number];
18
+ /** 推荐区间(占**总热量**的百分比,闭区间)。 */
19
+ export interface NutritionRange {
20
+ readonly min: number;
21
+ readonly max: number;
22
+ /** 上屏用的现成说法(`10-20%` 这一形状;两侧页面的那句话都取它,不各自拼)。 */
23
+ readonly label: string;
24
+ }
25
+ export declare const NUTRITION_RANGE: Record<MacroName, NutritionRange>;
26
+ /** 判决用的一句话参考串(诊断侧的证据句用它,免得逐项拼、也免得两处措辞走散)。 */
27
+ export declare function nutritionRangeNote(): string;
28
+ //# sourceMappingURL=nutritionRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nutritionRange.d.ts","sourceRoot":"","sources":["../../src/shared/nutritionRange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,WAAW,qCAAsC,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,8BAA8B;AAC9B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAI7D,CAAC;AAEF,6CAA6C;AAC7C,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C"}
@@ -0,0 +1,28 @@
1
+ /** 三大营养素推荐区间的**唯一定义地**(#717 批②)。
2
+ *
3
+ * 谁在用(写得出哪两个能力在用):
4
+ * ① 饮食能力 `diet/`——「营养配比」页的推荐范围对比表(`diet/nutritionPort.ts` 取数、`diet/nutritionPortDocs.ts` 上屏);
5
+ * ② 分析能力 `analysis/`——「诊断营养不均衡(含均衡判断)」的失衡判决(`analysis/anomaly/diet.ts`)。
6
+ *
7
+ * 本件**零依赖**:不 import 任何件,也不出现任何一个能力目录的名字(结构标准的「依赖方向」)。
8
+ *
9
+ * 收在这里之前的样子(#701 普查、#717 批②):配比页那一套(旧 `render_nutrition_ratio.py` 的 range 表逐字)
10
+ * 住 `diet/nutritionPort.ts`,而诊断侧另写了一套 **无出处** 的数(15-30/40-60/20-35)并拿它出判决——
11
+ * 同一份库上,一边印 10-20/45-65/20-35,另一边印 15-30/40-60/20-35 并按后者判「失衡」。
12
+ * 内容三裁(#701 已由维护者裁定):取**有出处的那一套**(蛋白 10-20/碳水 45-65/脂肪 20-35),
13
+ * 孤儿那套作废。
14
+ */
15
+ /** 三大营养素的名字(取值键;页面与诊断两侧共用同一组键,避免各写一套中文名)。 */
16
+ export const MACRO_NAMES = ['protein', 'carb', 'fat'];
17
+ export const NUTRITION_RANGE = {
18
+ protein: { min: 10, max: 20, label: '10-20%' },
19
+ carb: { min: 45, max: 65, label: '45-65%' },
20
+ fat: { min: 20, max: 35, label: '20-35%' },
21
+ };
22
+ /** 判决用的一句话参考串(诊断侧的证据句用它,免得逐项拼、也免得两处措辞走散)。 */
23
+ export function nutritionRangeNote() {
24
+ return '参考 蛋白' + NUTRITION_RANGE.protein.min + '-' + NUTRITION_RANGE.protein.max
25
+ + ' 碳水' + NUTRITION_RANGE.carb.min + '-' + NUTRITION_RANGE.carb.max
26
+ + ' 脂肪' + NUTRITION_RANGE.fat.min + '-' + NUTRITION_RANGE.fat.max;
27
+ }
28
+ //# sourceMappingURL=nutritionRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nutritionRange.js","sourceRoot":"","sources":["../../src/shared/nutritionRange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAY/D,MAAM,CAAC,MAAM,eAAe,GAAsC;IAChE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC9C,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC3C,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;CAC3C,CAAC;AAEF,6CAA6C;AAC7C,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG;UAC5E,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG;UACjE,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;AACtE,CAAC"}
@@ -0,0 +1,81 @@
1
+ /** 窗口条的类名词汇(族给)。 */
2
+ export interface WindowVocab {
3
+ readonly window: string;
4
+ readonly date: string;
5
+ readonly arrow: string;
6
+ readonly days: string;
7
+ }
8
+ /** 事实条的类名词汇(族给)。 */
9
+ export interface FactVocab {
10
+ readonly facts: string;
11
+ readonly fact: string;
12
+ readonly key: string;
13
+ readonly value: string;
14
+ }
15
+ /** 三族的类名词汇表(**唯一一份**;各族形状件从这里取自己那一套)。 */
16
+ export declare const WINDOW_VOCAB: {
17
+ readonly exercise: {
18
+ readonly window: "sui-window";
19
+ readonly date: "sui-date";
20
+ readonly arrow: "sui-arrow";
21
+ readonly days: "sui-days";
22
+ };
23
+ readonly weight: {
24
+ readonly window: "wui-window";
25
+ readonly date: "wui-date";
26
+ readonly arrow: "wui-arrow";
27
+ readonly days: "wui-days";
28
+ };
29
+ readonly diet: {
30
+ readonly window: "dui-window";
31
+ readonly date: "dui-date";
32
+ readonly arrow: "dui-arrow";
33
+ readonly days: "dui-chip";
34
+ };
35
+ };
36
+ /** 三族的类名词汇表(事实条只有运动族与体重族在用;饮食族不产事实条)。 */
37
+ export declare const FACT_VOCAB: {
38
+ readonly exercise: {
39
+ readonly facts: "sui-facts";
40
+ readonly fact: "sui-fact";
41
+ readonly key: "sui-fact-k";
42
+ readonly value: "sui-fact-v";
43
+ };
44
+ readonly weight: {
45
+ readonly facts: "wui-strip";
46
+ readonly fact: "wui-fact";
47
+ readonly key: "wui-fact-k";
48
+ readonly value: "wui-fact-v";
49
+ };
50
+ };
51
+ /** 窗口条:`2026-09-01 → 2026-09-07` + 天数(或条数)胶囊。
52
+ *
53
+ * `start === end`(单日窗)只出一枚日期块、不出箭头,块内写「(单日)」——不替读者断言一个
54
+ * 不存在的跨度(#510 立的退化分支,三族同口径)。日期文本走 `escapeHtml`。 */
55
+ export declare function windowStrip(start: string, end: string, chipText: string | undefined, vocab: WindowVocab): string;
56
+ /** 事实条:一组「标签 + 值」。`v` 为空串的那一条整条不出(缺值不留空槽)。
57
+ *
58
+ * `variant` 三位是**落点**不是形状(见 `variantClasses`)。 */
59
+ export declare function factStrip(facts: ReadonlyArray<{
60
+ k: string;
61
+ v: string;
62
+ }>, vocab: FactVocab, variant?: {
63
+ readonly vertical?: boolean;
64
+ readonly gap?: boolean;
65
+ readonly asNote?: boolean;
66
+ }): string;
67
+ /** 窗口条的 CSS(**裸串,不带 `<style>` 标签**;三族逐值保留各自的几何)。
68
+ *
69
+ * 体重族与饮食族取值相同,只类名前缀不同。本函数产出的是一段可直接拼进族样式段的字符串。 */
70
+ export declare function windowStripCss(): string;
71
+ /** 事实条的 CSS(**裸串,不带 `<style>` 标签**)。
72
+ *
73
+ * **本票唯一一处可见版式变更落在这里**:体重族的容器从「一行横排(`flex-wrap:wrap`)」改成
74
+ * 「等宽小格(`auto-fit` 栅格、窄屏塌单列)」——正本取运动族那套(票面 §二、§六 第 1 条,用户已授权)。
75
+ * 类名与其余属性(字号/色/权重)一律不动:体重族那三个变体位(`-v`/`-gap`/`-note`)的原规则
76
+ * 也逐值保留,故 `wui-strip-v` 的纵列版式与 `wui-strip-note` 的脚注口气字**一行未改**。
77
+ *
78
+ * 体重族与运动族的**键/值两小格在桌面档的取向不同**(运动族「键上值下」,体重族「键值同行」),
79
+ * 故 `.wui-fact` 不给 `flex-direction:column`;到了窄屏两族同归「键贴左、值贴右的纵列」。 */
80
+ export declare function factStripCss(): string;
81
+ //# sourceMappingURL=pageStrips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageStrips.d.ts","sourceRoot":"","sources":["../../src/shared/pageStrips.ts"],"names":[],"mappings":"AA8BA,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,oBAAoB;AACpB,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,yCAAyC;AACzC,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;CAIuB,CAAC;AAEjD,yCAAyC;AACzC,eAAO,MAAM,UAAU;;;;;;;;;;;;;CAGuB,CAAC;AAqB/C;;;mDAGmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAWhH;AAED;;mDAEmD;AACnD,wBAAgB,SAAS,CACvB,KAAK,EAAE,aAAa,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9C,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/F,MAAM,CAOR;AAED;;kDAEkD;AAClD,wBAAgB,cAAc,IAAI,MAAM,CAiCvC;AAED;;;;;;;;qEAQqE;AACrE,wBAAgB,YAAY,IAAI,MAAM,CAsCrC"}
@@ -0,0 +1,166 @@
1
+ /** #719 · 页内两类形状的**唯一定义地**:**窗口条**与**事实条**。
2
+ *
3
+ * 为什么收在这里:这两类形状原先在三个能力族里各写一份(窗口条四份、事实条两份),
4
+ * 实测「函数体逐字同构、只差 CSS 类名前缀与几处几何值」——任何一处单独改动都会与另外几份漂移。
5
+ * 故按 `docs/agents/structure.md` 铁律二(概念唯一)收成一份:形状的拼装只写一次,
6
+ * 「族用什么类名」(`WindowVocab`/`FactVocab`)与「几处几何值」(下面两段 CSS 里的逐值差异)由族参数给。
7
+ *
8
+ * 谁在用(写得出哪两个能力在用):**运动族**(`src/exercise/sportUi.ts`)、**体重族**
9
+ * (`src/weight/weightUi.ts`,经 `src/goal/goalWeightDoc.ts` 与 `src/weight/plateDocs.ts` 间接使用)、
10
+ * **饮食族**(`src/diet/dietUi.ts`)。三族各自的形状件留一行包装并转出原名字,
11
+ * 调用方一行不动(既有 34 个文件的 import 与 65 处调用点全部原样)。
12
+ *
13
+ * ── 类名不统一,是**故意的** ──
14
+ * `sui-`/`wui-`/`dui-` 三套类名是既有**外部契约**:包内十余个测试件按字面断言它们
15
+ * (`sui-window`/`sui-facts`/`sui-fact-k`/`wui-strip`/`wui-strip-v`/`wui-strip-note`/
16
+ * `dui-window` 等)。统一类名会把十几件测试一起打红,而本票的红线之一是「测试只在外部行为上说话、
17
+ * 不为了绿而改断言」。故共用件收的是**形状的拼装逻辑**,不是类名。
18
+ *
19
+ * ── 几何值也不统一,同样是**故意的** ──
20
+ * 三族的圆角/内距/外边距逐值不同(日期块圆角 `8px` vs `10px`、内距 `4px 8px` vs `3px 9px`、
21
+ * 条外边距 `4px 0 16px` vs `2px 0 10px`、窄屏日期块内距 `8px 12px` vs `6px 10px`)。
22
+ * 那些不是随手写的,是各次视觉裁定落下的值;把它们统一=改三族外观,超出本票授权。
23
+ * 故两段 CSS 里按族逐值保留(体重族与饮食族除类名外**取值相同**,一行对齐即可)。
24
+ *
25
+ * 本件不取数、不取时钟、不出现任何一个能力目录的名字。
26
+ */
27
+ import { escapeHtml } from 'base-paint';
28
+ const esc = (s) => escapeHtml(s);
29
+ /** 三族的类名词汇表(**唯一一份**;各族形状件从这里取自己那一套)。 */
30
+ export const WINDOW_VOCAB = {
31
+ exercise: { window: 'sui-window', date: 'sui-date', arrow: 'sui-arrow', days: 'sui-days' },
32
+ weight: { window: 'wui-window', date: 'wui-date', arrow: 'wui-arrow', days: 'wui-days' },
33
+ diet: { window: 'dui-window', date: 'dui-date', arrow: 'dui-arrow', days: 'dui-chip' },
34
+ };
35
+ /** 三族的类名词汇表(事实条只有运动族与体重族在用;饮食族不产事实条)。 */
36
+ export const FACT_VOCAB = {
37
+ exercise: { facts: 'sui-facts', fact: 'sui-fact', key: 'sui-fact-k', value: 'sui-fact-v' },
38
+ weight: { facts: 'wui-strip', fact: 'wui-fact', key: 'wui-fact-k', value: 'wui-fact-v' },
39
+ };
40
+ /** 事实条容器/小格的附加类(体重族三个专用变体位;**不进共用件接口**,只作内部附加类串)。
41
+ *
42
+ * `vertical` → `<facts>-v`:整块恒纵列;`gap` → `<facts>-gap`:整块与上一件之间空一行;
43
+ * `asNote` → `<facts>-note`:值退成脚注口气的字。三者的名字都从 `facts` 类派生
44
+ * (`wui-strip` → `wui-strip-v`/`-gap`/`-note`),运动族的 `facts` 是 `sui-facts` 故给了也不出
45
+ * ——运动族的三个调用点从不给这三个位。
46
+ *
47
+ * **顺序固定 `facts` → `-v` → `-gap` → `-note`**:既有测试件按字面断言 `wui-strip-v`/
48
+ * `wui-strip-note`,且原实现就是这个顺序,重排会让产物变形。 */
49
+ function variantClasses(vocab, v) {
50
+ return (v.vertical === true ? ' ' + vocab.facts + '-v' : '')
51
+ + (v.gap === true ? ' ' + vocab.facts + '-gap' : '')
52
+ + (v.asNote === true ? ' ' + vocab.facts + '-note' : '');
53
+ }
54
+ /** 窗口条:`2026-09-01 → 2026-09-07` + 天数(或条数)胶囊。
55
+ *
56
+ * `start === end`(单日窗)只出一枚日期块、不出箭头,块内写「(单日)」——不替读者断言一个
57
+ * 不存在的跨度(#510 立的退化分支,三族同口径)。日期文本走 `escapeHtml`。 */
58
+ export function windowStrip(start, end, chipText, vocab) {
59
+ const chip = chipText === undefined || chipText === '' ? '' : '<span class="' + vocab.days + '">' + esc(chipText) + '</span>';
60
+ if (start === end) {
61
+ return '<div class="' + vocab.window + '"><span class="' + vocab.date + '">' + esc(start) + '(单日)</span>' + chip + '</div>';
62
+ }
63
+ return '<div class="' + vocab.window + '">'
64
+ + '<span class="' + vocab.date + '">' + esc(start) + '</span>'
65
+ + '<span class="' + vocab.arrow + '">→</span>'
66
+ + '<span class="' + vocab.date + '">' + esc(end) + '</span>'
67
+ + chip
68
+ + '</div>';
69
+ }
70
+ /** 事实条:一组「标签 + 值」。`v` 为空串的那一条整条不出(缺值不留空槽)。
71
+ *
72
+ * `variant` 三位是**落点**不是形状(见 `variantClasses`)。 */
73
+ export function factStrip(facts, vocab, variant = {}) {
74
+ const body = facts
75
+ .filter((f) => f.v !== '')
76
+ .map((f) => '<span class="' + vocab.fact + '"><span class="' + vocab.key + '">' + esc(f.k) + '</span>'
77
+ + '<span class="' + vocab.value + '">' + esc(f.v) + '</span></span>')
78
+ .join('');
79
+ return body === '' ? '' : '<div class="' + vocab.facts + variantClasses(vocab, variant) + '">' + body + '</div>';
80
+ }
81
+ /** 窗口条的 CSS(**裸串,不带 `<style>` 标签**;三族逐值保留各自的几何)。
82
+ *
83
+ * 体重族与饮食族取值相同,只类名前缀不同。本函数产出的是一段可直接拼进族样式段的字符串。 */
84
+ export function windowStripCss() {
85
+ return ''
86
+ // ── 运动族(`sui-`):圆角 8px/内距 4px 8px/条外边距 4px 0 16px/窄屏 8px 12px ──
87
+ + '.sui-window{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;margin:4px 0 16px}'
88
+ + '.sui-date{font-size:13px;font-weight:600;color:var(--fg);background:var(--card);'
89
+ + 'border:1px solid var(--line);border-radius:8px;padding:4px 8px;font-variant-numeric:tabular-nums}'
90
+ + '.sui-arrow{color:var(--fg3);font-size:13px}'
91
+ + '.sui-days{font-size:12px;font-weight:700;color:var(--blue2);background:var(--soft);'
92
+ + 'border-radius:999px;padding:4px 8px}'
93
+ + '@media (max-width:820px){'
94
+ + ' .sui-window{gap:8px}'
95
+ + ' .sui-date{padding:8px 12px;min-height:32px;display:inline-flex;align-items:center}'
96
+ + ' .sui-days{padding:4px 12px}'
97
+ + '}'
98
+ // ── 体重族(`wui-`):圆角 10px/内距 3px 9px/条外边距 2px 0 10px/窄屏 6px 10px ──
99
+ + '.wui-window{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;margin:2px 0 10px}'
100
+ + '.wui-date{font-size:13px;font-weight:600;color:var(--fg);background:var(--card);border:1px solid var(--line);'
101
+ + 'border-radius:10px;padding:3px 9px;font-variant-numeric:tabular-nums}'
102
+ + '.wui-arrow{color:var(--fg3);font-size:13px}'
103
+ + '.wui-days{font-size:12px;font-weight:700;color:var(--blue2);background:var(--soft);border-radius:999px;padding:3px 10px}'
104
+ + '@media (max-width:820px){'
105
+ + ' .wui-window{gap:6px}'
106
+ + ' .wui-date{padding:6px 10px;min-height:32px;display:inline-flex;align-items:center}'
107
+ + ' .wui-days{padding:5px 10px}'
108
+ + '}'
109
+ // ── 饮食族(`dui-`;天数胶囊叫 `dui-chip`):逐值同体重族 ──
110
+ + '.dui-window{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;margin:2px 0 10px}'
111
+ + '.dui-date{font-size:13px;font-weight:600;color:var(--fg);background:var(--card);border:1px solid var(--line);'
112
+ + 'border-radius:10px;padding:3px 9px;font-variant-numeric:tabular-nums}'
113
+ + '.dui-arrow{color:var(--fg3);font-size:13px}'
114
+ + '.dui-chip{font-size:12px;font-weight:700;color:var(--blue2);background:var(--soft);border-radius:999px;padding:3px 10px}'
115
+ + '@media (max-width:820px){.dui-window{gap:6px}'
116
+ + '.dui-date{padding:6px 10px;min-height:32px;display:inline-flex;align-items:center}}';
117
+ }
118
+ /** 事实条的 CSS(**裸串,不带 `<style>` 标签**)。
119
+ *
120
+ * **本票唯一一处可见版式变更落在这里**:体重族的容器从「一行横排(`flex-wrap:wrap`)」改成
121
+ * 「等宽小格(`auto-fit` 栅格、窄屏塌单列)」——正本取运动族那套(票面 §二、§六 第 1 条,用户已授权)。
122
+ * 类名与其余属性(字号/色/权重)一律不动:体重族那三个变体位(`-v`/`-gap`/`-note`)的原规则
123
+ * 也逐值保留,故 `wui-strip-v` 的纵列版式与 `wui-strip-note` 的脚注口气字**一行未改**。
124
+ *
125
+ * 体重族与运动族的**键/值两小格在桌面档的取向不同**(运动族「键上值下」,体重族「键值同行」),
126
+ * 故 `.wui-fact` 不给 `flex-direction:column`;到了窄屏两族同归「键贴左、值贴右的纵列」。 */
127
+ export function factStripCss() {
128
+ return ''
129
+ // ── 运动族(`sui-`)──
130
+ + '.sui-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:8px 16px;margin:8px 0 16px}'
131
+ + '.sui-fact{display:flex;flex-direction:column;gap:2px;min-width:0}'
132
+ // 键色 `--fg3`(#86868b) 对白底仅 3.62:1,12px 正文要 4.5:1;`--fg2`(#6e6e73) 为 5.07:1
133
+ // (同包 `base-render/src/style.ts:567` 已为同类 12px 小字做过同一次改动,本处照办)。
134
+ + '.sui-fact-k{font-size:12px;color:var(--fg2);white-space:nowrap}'
135
+ + '.sui-fact-v{font-size:13px;font-weight:600;color:var(--fg);font-variant-numeric:tabular-nums;min-width:0}'
136
+ // ── 体重族(`wui-strip`):容器**逐值换成运动族那套栅格**(本票唯一可见变更);键值两格与三个变体位原样 ──
137
+ + '.wui-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:8px 16px;margin:2px 0 10px}'
138
+ + '.wui-strip-v{flex-direction:column;align-items:stretch;gap:8px}'
139
+ // 空槽(`margin-top:16px`):**卡片的 `detail` 槽**里本件没有兄弟件可借距(KPI 值槽之下直接是本条)。
140
+ + '.wui-strip-gap{margin-top:16px}'
141
+ // 纵列里的一组「标签 + 值」:标签在左、值贴右,行行对齐(窄屏的事实一栏读法)。
142
+ + '.wui-strip-v .wui-fact{width:100%;justify-content:space-between;gap:12px}'
143
+ // 「标签 + **说明句**」那一型(`factStrip(facts, false, true, true)`):值不是量值而是一句脚注口气的
144
+ // 说明(「目标值超出刻度」),整块退一档(同 `.wui-note` 的字号/行高/色),不跟量值抢眼。
145
+ // #510:两半**分两档**——标签留 `--fg3`、说明那半落到 `--fg2` 且不加粗(原来两半同为 13px 加粗 `--fg`,
146
+ // 并排读成一句不通的话:`图上没画目标线 目标值超出刻度`)。
147
+ + '.wui-strip-note .wui-fact{display:flex;align-items:baseline;flex-wrap:wrap;gap:2px 8px}'
148
+ + '.wui-strip-note .wui-fact-k{font-size:12px;color:var(--fg3);font-weight:400;white-space:normal}'
149
+ + '.wui-strip-note .wui-fact-v{font-size:12px;font-weight:400;color:var(--fg2);line-height:1.6}'
150
+ // 体重族的键值两格:**逐值保留原写法**(桌面「键值同行」,与原 `.wui-fact` 一字不差)。
151
+ + '.wui-fact{display:inline-flex;align-items:baseline;gap:6px;min-width:0}'
152
+ + '.wui-fact-k{font-size:12px;color:var(--fg3);white-space:nowrap}'
153
+ + '.wui-fact-v{font-size:13px;font-weight:600;color:var(--fg);font-variant-numeric:tabular-nums}'
154
+ // ── 两族的窄屏段(820):塌单列,键贴左/值贴右(两族同写法,逐值保留)──
155
+ + '@media (max-width:820px){'
156
+ + ' .sui-facts{grid-template-columns:minmax(0,1fr);gap:8px}'
157
+ + ' .sui-fact{flex-direction:row;justify-content:space-between;align-items:baseline;gap:12px}'
158
+ + ' .wui-strip{grid-template-columns:minmax(0,1fr);gap:8px}'
159
+ + ' .wui-strip-v{gap:8px}'
160
+ + ' .wui-fact{flex-direction:row;justify-content:space-between;align-items:baseline;gap:12px}'
161
+ + ' .wui-fact-v{font-size:13px}'
162
+ + '}'
163
+ // ── 触摸面(HELP 第 ①):两族的键值行/窗口条都是读者在手机上会按住的一块内容 ──
164
+ + '.sui-facts,.sui-window{-webkit-tap-highlight-color:transparent;touch-action:manipulation}';
165
+ }
166
+ //# sourceMappingURL=pageStrips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageStrips.js","sourceRoot":"","sources":["../../src/shared/pageStrips.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** T351 · 健身计划页面底部复制区:prompt 段(预检确认页才有)+ 冻结双按钮段。
2
+ *
3
+ * 谁在用(写得出哪两个在用):**看训练计划**(`src/render/workoutPlanDocs.ts` 的结果页与过程页)
4
+ * 与**写后回执**(`src/workout/receipt.ts` 的十条会改数据库的命令)——四条调用点产物逐字同形,
5
+ * 故收成一份,免得各自漂移。只有过程型两页(预检确认页)传 `prompt`。
6
+ *
7
+ * 与 `src/shared/copyArea.ts` 的 `copyArea` 分家:`copyArea` 的数据位恒出三格式菜单
8
+ * (纯文本/JSON/CSV,场景 07 等页在用,本次不动它);本件按视觉审查口径**不出菜单**——
9
+ * `renderCopyBlock` 不传 `dataFormats`,并把两颗按钮的 `id` 补成冻结表那两颗
10
+ * (`ilife-copy-data`/`ilife-copy-log`,见 `COPY_ACTION_IDS.actionBar`),供页面运行时的
11
+ * 双通道复制认领。故本件只服务健身计划这一路,不替换 `copyArea` 的既有行为。
12
+ *
13
+ * 复制文本仍走唯一出处:数据位 `base-paint` 的 `buildDataText`(#77 数据投影),
14
+ * 日志位 `buildLogText` + 共用件 `copyLog`(#77 六段日志)。本件不取数、不取时钟。
15
+ */
16
+ import type { CopyLogFields, SerializableEnvelope } from 'base-paint';
17
+ /** 复制区入参:信封(八键载荷)+ 日志六段(由调用方 `copyLog({…})` 派生)。 */
18
+ interface PlanCopyInput {
19
+ /** 页面载荷信封(`version`/`skill`/`shape`/`key`/`data`)。 */
20
+ readonly envelope: SerializableEnvelope;
21
+ /** 日志六段(调用方给 `command`/`source`/`m5Line`/`actionAt`/`version` 后由 `copyLog` 派生)。 */
22
+ readonly log: CopyLogFields;
23
+ /** 复制数据文本的输出头;不给即按信封模板派生(`DataTextInput.title` 口径)。 */
24
+ readonly dataTitle?: string;
25
+ /** 本写词的逐字 prompt(只在预检确认页给;空串/不给即不出 prompt 段)。 */
26
+ readonly prompt?: string;
27
+ }
28
+ /** 复制区:数据位单格式、日志位直挂,按钮 `id` 补成冻结表那两颗;无三格式菜单、无英文菜单项。
29
+ * 日志位的信封先过 #550 归一(`key` 带 `calorie.` 前缀时剥一层),**数据位一字不动**。 */
30
+ export declare function planCopyBlock(input: PlanCopyInput): string;
31
+ export {};
32
+ //# sourceMappingURL=planCopyBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planCopyBlock.d.ts","sourceRoot":"","sources":["../../src/shared/planCopyBlock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAoBtE,oDAAoD;AACpD,UAAU,aAAa;IACrB,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;+DAC+D;AAC/D,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAa1D"}
@@ -0,0 +1,34 @@
1
+ import { buildDataText, buildLogText, renderActionBar } from 'base-paint';
2
+ import { renderCopyBlock, renderPreBlock } from 'base-paint/blocks';
3
+ import { CALORIE_COPY_ACTION } from '../render/copy.js';
4
+ import { sceneEnvelope } from './sceneEnvelope.js';
5
+ /** prompt 段:预览块 + 一颗「复制指令」(预检确认页「复制 prompt 回给 AI」那一环,老侧 `promptCopyArea` 的语序)。
6
+ *
7
+ * **这颗只能走 `renderActionBar` 的日志位**:`renderActionBar`(`base-render/src/controls.ts:1367`)
8
+ * 在「数据位在场而日志位缺席」时会按 #336 自动补一颗**禁用**「复制日志」,其 id 正是
9
+ * `COPY_ACTION_IDS.actionBar.copyLog`——与底部冻结那颗撞 id,页上就成了两颗同名按钮(其中一颗灰的)。
10
+ * 日志位单独给一颗复制按钮不触发 #336,且 actionId/文案由调用方定。「一排三颗」用冻结 API 表达不出来:
11
+ * `buttons` 位的场景按钮不写 `data-t`,运行时认领不到,做成第三颗就是个点不动的死按钮。 */
12
+ function promptArea(prompt) {
13
+ return renderPreBlock({ command: prompt })
14
+ + renderActionBar({
15
+ copyLog: { actionId: CALORIE_COPY_ACTION.actionId, label: CALORIE_COPY_ACTION.label, text: prompt },
16
+ });
17
+ }
18
+ /** 复制区:数据位单格式、日志位直挂,按钮 `id` 补成冻结表那两颗;无三格式菜单、无英文菜单项。
19
+ * 日志位的信封先过 #550 归一(`key` 带 `calorie.` 前缀时剥一层),**数据位一字不动**。 */
20
+ export function planCopyBlock(input) {
21
+ const title = input.dataTitle;
22
+ const prompt = input.prompt;
23
+ return (prompt === undefined || prompt === '' ? '' : promptArea(prompt))
24
+ + renderCopyBlock({
25
+ dataText: buildDataText({
26
+ envelope: input.envelope,
27
+ ...(title === undefined ? {} : { title }),
28
+ }),
29
+ logText: buildLogText({ envelope: sceneEnvelope(input.envelope), copyLog: input.log }),
30
+ })
31
+ .replace('data-action-id="ilife-copy-data"', 'id="ilife-copy-data" data-action-id="ilife-copy-data"')
32
+ .replace('data-action-id="ilife-copy-log"', 'id="ilife-copy-log" data-action-id="ilife-copy-log"');
33
+ }
34
+ //# sourceMappingURL=planCopyBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planCopyBlock.js","sourceRoot":"","sources":["../../src/shared/planCopyBlock.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;;;2DAM2D;AAC3D,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;UACtC,eAAe,CAAC;YAChB,OAAO,EAAE,EAAE,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;SACpG,CAAC,CAAC;AACP,CAAC;AAcD;+DAC+D;AAC/D,MAAM,UAAU,aAAa,CAAC,KAAoB;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;UACpE,eAAe,CAAC;YAChB,QAAQ,EAAE,aAAa,CAAC;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;aAC1C,CAAC;YACF,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;SACvF,CAAC;aACC,OAAO,CAAC,kCAAkC,EAAE,uDAAuD,CAAC;aACpG,OAAO,CAAC,iCAAiC,EAAE,qDAAqD,CAAC,CAAC;AACzG,CAAC"}
@@ -1,10 +1,10 @@
1
- /** 来源脚注入参:`source` 不给/空串即只印窗口与条数(老件缺来源时的那种写法)。 */
2
- export interface SourceLineInput {
1
+ /** 来源脚注:`数据来源 · 来源 · 起 → 止 · 共 N 条`。
2
+ * 入参形状**内联在签名里**(#708 收掉原来那个零 import 的 `SourceLineInput` 导出名):
3
+ * `source` 不给/空串即只印窗口与条数(老件缺来源时的那种写法)。 */
4
+ export declare function sourceLine(input: {
3
5
  readonly source: string;
4
6
  readonly start: string;
5
7
  readonly end: string;
6
8
  readonly count: number;
7
- }
8
- /** 来源脚注:`数据来源 · 来源 · 起 → 止 · 共 N 条`。 */
9
- export declare function sourceLine(input: SourceLineInput): string;
9
+ }): string;
10
10
  //# sourceMappingURL=sourceLine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sourceLine.d.ts","sourceRoot":"","sources":["../../src/shared/sourceLine.ts"],"names":[],"mappings":"AAaA,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AASD,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAezD"}
1
+ {"version":3,"file":"sourceLine.d.ts","sourceRoot":"","sources":["../../src/shared/sourceLine.ts"],"names":[],"mappings":"AAoBA;;2CAE2C;AAC3C,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAe3I"}
@@ -16,7 +16,9 @@ function reqText(value, field) {
16
16
  }
17
17
  return value;
18
18
  }
19
- /** 来源脚注:`数据来源 · 来源 · 起 → 止 · 共 N 条`。 */
19
+ /** 来源脚注:`数据来源 · 来源 · 起 → 止 · 共 N 条`。
20
+ * 入参形状**内联在签名里**(#708 收掉原来那个零 import 的 `SourceLineInput` 导出名):
21
+ * `source` 不给/空串即只印窗口与条数(老件缺来源时的那种写法)。 */
20
22
  export function sourceLine(input) {
21
23
  if (input === null || typeof input !== 'object' || Array.isArray(input)) {
22
24
  throw new CalorieRenderError('bad-input', 'sourceLine: input 必须是对象');
@@ -1 +1 @@
1
- {"version":3,"file":"sourceLine.js","sourceRoot":"","sources":["../../src/shared/sourceLine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAUzD,SAAS,OAAO,CAAC,KAAc,EAAE,KAAa;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,kBAAkB,CAAC,WAAW,EAAE,KAAK,GAAG,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,kBAAkB,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,GAAG,KAAwB,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,kBAAkB,CAAC,WAAW,EAAE,gCAAgC,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACrC,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"sourceLine.js","sourceRoot":"","sources":["../../src/shared/sourceLine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,SAAS,OAAO,CAAC,KAAc,EAAE,KAAa;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,kBAAkB,CAAC,WAAW,EAAE,KAAK,GAAG,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;2CAE2C;AAC3C,MAAM,UAAU,UAAU,CAAC,KAAwG;IACjI,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,kBAAkB,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,kBAAkB,CAAC,WAAW,EAAE,gCAAgC,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACrC,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,28 @@
1
+ /** 时钟的**唯一定义地**(#717 批③):「今天是哪一天」「现在是几点」只从这里取。
2
+ *
3
+ * 谁在用(写得出哪两个能力在用):
4
+ * ① 分析能力 `analysis/`(`analysis/utils.ts` 的 `todayISO` 正本在这里,原处按原名转出);
5
+ * ② 饮食能力 `diet/`(`fetch/diet.ts` 记一餐时的落库日期与时刻);
6
+ * ③ 运动能力 `exercise/`(`exercise/exerciseStore.ts` 记一条时的时刻);
7
+ * ④ 体重能力 `weight/`(`weight/records.ts` 记体重时的日期与时刻)。
8
+ *
9
+ * 本件**零依赖**:不 import 任何件,也不出现任何一个能力目录的名字。
10
+ *
11
+ * 收在这里之前的样子(#701 普查、#717 批③):`todayISO` 的正本住 `analysis/utils.ts`,而
12
+ * `fetch/diet.ts`/`exercise/exerciseStore.ts`/`weight/records.ts` **各写一份私有的本地时钟**
13
+ * (`new Date().toISOString().slice(0,10)` 与 `new Date().toTimeString().slice(0,8)`)——
14
+ * 抓取层被要求「不反向依赖 analysis」,于是绕路自己读系统钟,三份副本各自走散。
15
+ *
16
+ * 口径:**读系统钟**(进程级钉钟由测试的 `--require freeze-clock.cjs` 预载件盖住整个 `Date`,
17
+ * 故钉钟时本件三个读数同时跟走——写入日、回执日、累计读日不会再分家)。
18
+ */
19
+ /** 当刻的日(`YYYY-MM-DD`,UTC 日口径,与全包既有口径一致)。 */
20
+ export declare function todayISO(): string;
21
+ /** 当刻的时刻(`HH:MM:SS`,本地时刻口径)。 */
22
+ export declare function timeOfDayISO(): string;
23
+ /** 日期加减(按整天,`shiftISODate('2026-09-07', -6) === '2026-09-01'`)。
24
+ *
25
+ * 锚到 UTC 正午再加减,避开夏令时把某一天算成 23/25 小时那种边界。
26
+ * 非法日期当场抛(消息形状与全包既有写法一致)。 */
27
+ export declare function shiftISODate(iso: string, deltaDays: number): string;
28
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/shared/time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,4CAA4C;AAC5C,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,gCAAgC;AAChC,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;8BAG8B;AAC9B,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAInE"}
@@ -0,0 +1,37 @@
1
+ /** 时钟的**唯一定义地**(#717 批③):「今天是哪一天」「现在是几点」只从这里取。
2
+ *
3
+ * 谁在用(写得出哪两个能力在用):
4
+ * ① 分析能力 `analysis/`(`analysis/utils.ts` 的 `todayISO` 正本在这里,原处按原名转出);
5
+ * ② 饮食能力 `diet/`(`fetch/diet.ts` 记一餐时的落库日期与时刻);
6
+ * ③ 运动能力 `exercise/`(`exercise/exerciseStore.ts` 记一条时的时刻);
7
+ * ④ 体重能力 `weight/`(`weight/records.ts` 记体重时的日期与时刻)。
8
+ *
9
+ * 本件**零依赖**:不 import 任何件,也不出现任何一个能力目录的名字。
10
+ *
11
+ * 收在这里之前的样子(#701 普查、#717 批③):`todayISO` 的正本住 `analysis/utils.ts`,而
12
+ * `fetch/diet.ts`/`exercise/exerciseStore.ts`/`weight/records.ts` **各写一份私有的本地时钟**
13
+ * (`new Date().toISOString().slice(0,10)` 与 `new Date().toTimeString().slice(0,8)`)——
14
+ * 抓取层被要求「不反向依赖 analysis」,于是绕路自己读系统钟,三份副本各自走散。
15
+ *
16
+ * 口径:**读系统钟**(进程级钉钟由测试的 `--require freeze-clock.cjs` 预载件盖住整个 `Date`,
17
+ * 故钉钟时本件三个读数同时跟走——写入日、回执日、累计读日不会再分家)。
18
+ */
19
+ /** 当刻的日(`YYYY-MM-DD`,UTC 日口径,与全包既有口径一致)。 */
20
+ export function todayISO() {
21
+ return new Date().toISOString().slice(0, 10);
22
+ }
23
+ /** 当刻的时刻(`HH:MM:SS`,本地时刻口径)。 */
24
+ export function timeOfDayISO() {
25
+ return new Date().toTimeString().slice(0, 8);
26
+ }
27
+ /** 日期加减(按整天,`shiftISODate('2026-09-07', -6) === '2026-09-01'`)。
28
+ *
29
+ * 锚到 UTC 正午再加减,避开夏令时把某一天算成 23/25 小时那种边界。
30
+ * 非法日期当场抛(消息形状与全包既有写法一致)。 */
31
+ export function shiftISODate(iso, deltaDays) {
32
+ const t = Date.parse(iso + 'T12:00:00Z');
33
+ if (Number.isNaN(t))
34
+ throw new Error('[calorie] 日期非法: ' + iso);
35
+ return new Date(t + deltaDays * 86400000).toISOString().slice(0, 10);
36
+ }
37
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/shared/time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,4CAA4C;AAC5C,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;8BAG8B;AAC9B,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,SAAiB;IACzD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,GAAG,CAAC,CAAC;IAC/D,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC"}