skill-calorie 0.2.2 → 0.2.4

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 (1300) hide show
  1. package/SKILL.md +477 -123
  2. package/dist/.gen-inputs.json +170 -0
  3. package/dist/analysis/commands.d.ts +62 -0
  4. package/dist/analysis/commands.d.ts.map +1 -0
  5. package/dist/analysis/commands.js +386 -0
  6. package/dist/analysis/commands.js.map +1 -0
  7. package/dist/analysis/contraindications.d.ts.map +1 -1
  8. package/dist/analysis/contraindications.js +16 -12
  9. package/dist/analysis/contraindications.js.map +1 -1
  10. package/dist/analysis/cross.d.ts +3 -0
  11. package/dist/analysis/cross.d.ts.map +1 -1
  12. package/dist/analysis/cross.js +57 -29
  13. package/dist/analysis/cross.js.map +1 -1
  14. package/dist/analysis/dashboard.d.ts.map +1 -1
  15. package/dist/analysis/dashboard.js +3 -2
  16. package/dist/analysis/dashboard.js.map +1 -1
  17. package/dist/analysis/exerciseReview.js +1 -1
  18. package/dist/analysis/exerciseReview.js.map +1 -1
  19. package/dist/analysis/healthPlate.d.ts +21 -0
  20. package/dist/analysis/healthPlate.d.ts.map +1 -0
  21. package/dist/analysis/healthPlate.js +41 -0
  22. package/dist/analysis/healthPlate.js.map +1 -0
  23. package/dist/analysis/historyStore.d.ts +30 -0
  24. package/dist/analysis/historyStore.d.ts.map +1 -0
  25. package/dist/analysis/historyStore.js +32 -0
  26. package/dist/analysis/historyStore.js.map +1 -0
  27. package/dist/analysis/index.d.ts +23 -0
  28. package/dist/analysis/index.d.ts.map +1 -0
  29. package/dist/analysis/index.js +23 -0
  30. package/dist/analysis/index.js.map +1 -0
  31. package/dist/analysis/multiTrend.d.ts +67 -0
  32. package/dist/analysis/multiTrend.d.ts.map +1 -0
  33. package/dist/analysis/multiTrend.js +106 -0
  34. package/dist/analysis/multiTrend.js.map +1 -0
  35. package/dist/analysis/multiTrendPage.d.ts +4 -0
  36. package/dist/analysis/multiTrendPage.d.ts.map +1 -0
  37. package/dist/analysis/multiTrendPage.js +502 -0
  38. package/dist/analysis/multiTrendPage.js.map +1 -0
  39. package/dist/analysis/reportDoc.d.ts +12 -0
  40. package/dist/analysis/reportDoc.d.ts.map +1 -0
  41. package/dist/analysis/reportDoc.js +244 -0
  42. package/dist/analysis/reportDoc.js.map +1 -0
  43. package/dist/analysis/reportDocBmi.d.ts +4 -0
  44. package/dist/analysis/reportDocBmi.d.ts.map +1 -0
  45. package/dist/analysis/reportDocBmi.js +104 -0
  46. package/dist/analysis/reportDocBmi.js.map +1 -0
  47. package/dist/analysis/reportDocParts.d.ts +77 -0
  48. package/dist/analysis/reportDocParts.d.ts.map +1 -0
  49. package/dist/analysis/reportDocParts.js +249 -0
  50. package/dist/analysis/reportDocParts.js.map +1 -0
  51. package/dist/analysis/reportDocScore.d.ts +8 -0
  52. package/dist/analysis/reportDocScore.d.ts.map +1 -0
  53. package/dist/analysis/reportDocScore.js +223 -0
  54. package/dist/analysis/reportDocScore.js.map +1 -0
  55. package/dist/analysis/reportDocScoreSeries.d.ts +3 -0
  56. package/dist/analysis/reportDocScoreSeries.d.ts.map +1 -0
  57. package/dist/analysis/reportDocScoreSeries.js +27 -0
  58. package/dist/analysis/reportDocScoreSeries.js.map +1 -0
  59. package/dist/analysis/reportDocTracked.d.ts +10 -0
  60. package/dist/analysis/reportDocTracked.d.ts.map +1 -0
  61. package/dist/analysis/reportDocTracked.js +195 -0
  62. package/dist/analysis/reportDocTracked.js.map +1 -0
  63. package/dist/analysis/reportPlate.d.ts +163 -0
  64. package/dist/analysis/reportPlate.d.ts.map +1 -0
  65. package/dist/analysis/reportPlate.js +251 -0
  66. package/dist/analysis/reportPlate.js.map +1 -0
  67. package/dist/analysis/routes.d.ts +18 -0
  68. package/dist/analysis/routes.d.ts.map +1 -0
  69. package/dist/analysis/routes.js +178 -0
  70. package/dist/analysis/routes.js.map +1 -0
  71. package/dist/analysis/series.d.ts +31 -6
  72. package/dist/analysis/series.d.ts.map +1 -1
  73. package/dist/analysis/series.js +124 -27
  74. package/dist/analysis/series.js.map +1 -1
  75. package/dist/analysis/simulate.d.ts.map +1 -1
  76. package/dist/analysis/simulate.js +17 -6
  77. package/dist/analysis/simulate.js.map +1 -1
  78. package/dist/analysis/simulate2.d.ts.map +1 -1
  79. package/dist/analysis/simulate2.js +43 -11
  80. package/dist/analysis/simulate2.js.map +1 -1
  81. package/dist/analysis/trend.d.ts +9 -1
  82. package/dist/analysis/trend.d.ts.map +1 -1
  83. package/dist/analysis/trend.js +24 -8
  84. package/dist/analysis/trend.js.map +1 -1
  85. package/dist/analysis/utils.d.ts +50 -1
  86. package/dist/analysis/utils.d.ts.map +1 -1
  87. package/dist/analysis/utils.js +73 -1
  88. package/dist/analysis/utils.js.map +1 -1
  89. package/dist/body/bodyDocs.d.ts +4 -0
  90. package/dist/body/bodyDocs.d.ts.map +1 -0
  91. package/dist/body/bodyDocs.js +284 -0
  92. package/dist/body/bodyDocs.js.map +1 -0
  93. package/dist/body/bodyPlate.d.ts +145 -0
  94. package/dist/body/bodyPlate.d.ts.map +1 -0
  95. package/dist/body/bodyPlate.js +243 -0
  96. package/dist/body/bodyPlate.js.map +1 -0
  97. package/dist/body/bodyReadUi.d.ts +47 -0
  98. package/dist/body/bodyReadUi.d.ts.map +1 -0
  99. package/dist/body/bodyReadUi.js +164 -0
  100. package/dist/body/bodyReadUi.js.map +1 -0
  101. package/dist/body/commands.d.ts +29 -0
  102. package/dist/body/commands.d.ts.map +1 -0
  103. package/dist/body/commands.js +18 -0
  104. package/dist/body/commands.js.map +1 -0
  105. package/dist/body/compare.d.ts +62 -0
  106. package/dist/body/compare.d.ts.map +1 -0
  107. package/dist/body/compare.js +162 -0
  108. package/dist/body/compare.js.map +1 -0
  109. package/dist/body/compareCompositionDoc.d.ts +3 -0
  110. package/dist/body/compareCompositionDoc.d.ts.map +1 -0
  111. package/dist/body/compareCompositionDoc.js +99 -0
  112. package/dist/body/compareCompositionDoc.js.map +1 -0
  113. package/dist/body/compareMeasureDoc.d.ts +3 -0
  114. package/dist/body/compareMeasureDoc.d.ts.map +1 -0
  115. package/dist/body/compareMeasureDoc.js +91 -0
  116. package/dist/body/compareMeasureDoc.js.map +1 -0
  117. package/dist/body/compareUi.d.ts +12 -0
  118. package/dist/body/compareUi.d.ts.map +1 -0
  119. package/dist/body/compareUi.js +27 -0
  120. package/dist/body/compareUi.js.map +1 -0
  121. package/dist/body/index.d.ts +21 -0
  122. package/dist/body/index.d.ts.map +1 -0
  123. package/dist/body/index.js +22 -0
  124. package/dist/body/index.js.map +1 -0
  125. package/dist/body/log.d.ts +29 -0
  126. package/dist/body/log.d.ts.map +1 -0
  127. package/dist/body/log.js +196 -0
  128. package/dist/body/log.js.map +1 -0
  129. package/dist/body/receipt.d.ts +52 -0
  130. package/dist/body/receipt.d.ts.map +1 -0
  131. package/dist/body/receipt.js +248 -0
  132. package/dist/body/receipt.js.map +1 -0
  133. package/dist/body/receiptData.d.ts +46 -0
  134. package/dist/body/receiptData.d.ts.map +1 -0
  135. package/dist/body/receiptData.js +107 -0
  136. package/dist/body/receiptData.js.map +1 -0
  137. package/dist/body/receiptUi.d.ts +9 -0
  138. package/dist/body/receiptUi.d.ts.map +1 -0
  139. package/dist/body/receiptUi.js +75 -0
  140. package/dist/body/receiptUi.js.map +1 -0
  141. package/dist/body/remove.d.ts +21 -0
  142. package/dist/body/remove.d.ts.map +1 -0
  143. package/dist/body/remove.js +78 -0
  144. package/dist/body/remove.js.map +1 -0
  145. package/dist/body/routes.d.ts +10 -0
  146. package/dist/body/routes.d.ts.map +1 -0
  147. package/dist/body/routes.js +20 -0
  148. package/dist/body/routes.js.map +1 -0
  149. package/dist/body/view.d.ts +21 -0
  150. package/dist/body/view.d.ts.map +1 -0
  151. package/dist/body/view.js +50 -0
  152. package/dist/body/view.js.map +1 -0
  153. package/dist/body/wizard.d.ts +14 -0
  154. package/dist/body/wizard.d.ts.map +1 -0
  155. package/dist/body/wizard.js +21 -0
  156. package/dist/body/wizard.js.map +1 -0
  157. package/dist/body/wizardDocs.d.ts +4 -0
  158. package/dist/body/wizardDocs.d.ts.map +1 -0
  159. package/dist/body/wizardDocs.js +260 -0
  160. package/dist/body/wizardDocs.js.map +1 -0
  161. package/dist/body/wizardPlate.d.ts +146 -0
  162. package/dist/body/wizardPlate.d.ts.map +1 -0
  163. package/dist/body/wizardPlate.js +260 -0
  164. package/dist/body/wizardPlate.js.map +1 -0
  165. package/dist/body/wizardPrompt.d.ts +52 -0
  166. package/dist/body/wizardPrompt.d.ts.map +1 -0
  167. package/dist/body/wizardPrompt.js +146 -0
  168. package/dist/body/wizardPrompt.js.map +1 -0
  169. package/dist/body/wizardUi.d.ts +11 -0
  170. package/dist/body/wizardUi.d.ts.map +1 -0
  171. package/dist/body/wizardUi.js +35 -0
  172. package/dist/body/wizardUi.js.map +1 -0
  173. package/dist/cli/cmd_read.d.ts +7 -21
  174. package/dist/cli/cmd_read.d.ts.map +1 -1
  175. package/dist/cli/cmd_read.js +45 -1044
  176. package/dist/cli/cmd_read.js.map +1 -1
  177. package/dist/cli/delivery.d.ts +34 -0
  178. package/dist/cli/delivery.d.ts.map +1 -0
  179. package/dist/cli/delivery.js +223 -0
  180. package/dist/cli/delivery.js.map +1 -0
  181. package/dist/cli/keys.d.ts +305 -163
  182. package/dist/cli/keys.d.ts.map +1 -1
  183. package/dist/cli/keys.js +101 -74
  184. package/dist/cli/keys.js.map +1 -1
  185. package/dist/cli/legacy/index.d.ts +25 -0
  186. package/dist/cli/legacy/index.d.ts.map +1 -0
  187. package/dist/cli/legacy/index.js +37 -0
  188. package/dist/cli/legacy/index.js.map +1 -0
  189. package/dist/cli/legacy/routes/index.d.ts +8 -0
  190. package/dist/cli/legacy/routes/index.d.ts.map +1 -0
  191. package/dist/cli/legacy/routes/index.js +23 -0
  192. package/dist/cli/legacy/routes/index.js.map +1 -0
  193. package/dist/cli/legacy/routes/scene-01.d.ts +12 -0
  194. package/dist/cli/legacy/routes/scene-01.d.ts.map +1 -0
  195. package/dist/cli/legacy/routes/scene-01.js +2 -0
  196. package/dist/cli/legacy/routes/scene-01.js.map +1 -0
  197. package/dist/cli/legacy/routes/scene-02.d.ts +18 -0
  198. package/dist/cli/legacy/routes/scene-02.d.ts.map +1 -0
  199. package/dist/cli/legacy/routes/scene-02.js +2 -0
  200. package/dist/cli/legacy/routes/scene-02.js.map +1 -0
  201. package/dist/cli/legacy/routes/scene-03.d.ts +13 -0
  202. package/dist/cli/legacy/routes/scene-03.d.ts.map +1 -0
  203. package/dist/cli/legacy/routes/scene-03.js +2 -0
  204. package/dist/cli/legacy/routes/scene-03.js.map +1 -0
  205. package/dist/cli/legacy/routes/scene-04.d.ts +10 -0
  206. package/dist/cli/legacy/routes/scene-04.d.ts.map +1 -0
  207. package/dist/cli/legacy/routes/scene-04.js +2 -0
  208. package/dist/cli/legacy/routes/scene-04.js.map +1 -0
  209. package/dist/cli/legacy/routes/scene-05.d.ts +10 -0
  210. package/dist/cli/legacy/routes/scene-05.d.ts.map +1 -0
  211. package/dist/cli/legacy/routes/scene-05.js +2 -0
  212. package/dist/cli/legacy/routes/scene-05.js.map +1 -0
  213. package/dist/cli/legacy/routes/scene-06.d.ts +10 -0
  214. package/dist/cli/legacy/routes/scene-06.d.ts.map +1 -0
  215. package/dist/cli/legacy/routes/scene-06.js +2 -0
  216. package/dist/cli/legacy/routes/scene-06.js.map +1 -0
  217. package/dist/cli/legacy/routes/scene-07.d.ts +10 -0
  218. package/dist/cli/legacy/routes/scene-07.d.ts.map +1 -0
  219. package/dist/cli/legacy/routes/scene-07.js +2 -0
  220. package/dist/cli/legacy/routes/scene-07.js.map +1 -0
  221. package/dist/cli/legacy/routes/scene-08.d.ts +12 -0
  222. package/dist/cli/legacy/routes/scene-08.d.ts.map +1 -0
  223. package/dist/cli/legacy/routes/scene-08.js +2 -0
  224. package/dist/cli/legacy/routes/scene-08.js.map +1 -0
  225. package/dist/cli/legacy/routes/scene-09.d.ts +12 -0
  226. package/dist/cli/legacy/routes/scene-09.d.ts.map +1 -0
  227. package/dist/cli/legacy/routes/scene-09.js +2 -0
  228. package/dist/cli/legacy/routes/scene-09.js.map +1 -0
  229. package/dist/cli/legacy/routes/scene-10.d.ts +10 -0
  230. package/dist/cli/legacy/routes/scene-10.d.ts.map +1 -0
  231. package/dist/cli/legacy/routes/scene-10.js +2 -0
  232. package/dist/cli/legacy/routes/scene-10.js.map +1 -0
  233. package/dist/cli/legacy/scene-01.d.ts +13 -0
  234. package/dist/cli/legacy/scene-01.d.ts.map +1 -0
  235. package/dist/cli/legacy/scene-01.js +2 -0
  236. package/dist/cli/legacy/scene-01.js.map +1 -0
  237. package/dist/cli/legacy/scene-02.d.ts +12 -0
  238. package/dist/cli/legacy/scene-02.d.ts.map +1 -0
  239. package/dist/cli/legacy/scene-02.js +2 -0
  240. package/dist/cli/legacy/scene-02.js.map +1 -0
  241. package/dist/cli/legacy/scene-03.d.ts +14 -0
  242. package/dist/cli/legacy/scene-03.d.ts.map +1 -0
  243. package/dist/cli/legacy/scene-03.js +2 -0
  244. package/dist/cli/legacy/scene-03.js.map +1 -0
  245. package/dist/cli/legacy/scene-04.d.ts +12 -0
  246. package/dist/cli/legacy/scene-04.d.ts.map +1 -0
  247. package/dist/cli/legacy/scene-04.js +2 -0
  248. package/dist/cli/legacy/scene-04.js.map +1 -0
  249. package/dist/cli/legacy/scene-05.d.ts +14 -0
  250. package/dist/cli/legacy/scene-05.d.ts.map +1 -0
  251. package/dist/cli/legacy/scene-05.js +2 -0
  252. package/dist/cli/legacy/scene-05.js.map +1 -0
  253. package/dist/cli/legacy/scene-06.d.ts +15 -0
  254. package/dist/cli/legacy/scene-06.d.ts.map +1 -0
  255. package/dist/cli/legacy/scene-06.js +2 -0
  256. package/dist/cli/legacy/scene-06.js.map +1 -0
  257. package/dist/cli/legacy/scene-07.d.ts +15 -0
  258. package/dist/cli/legacy/scene-07.d.ts.map +1 -0
  259. package/dist/cli/legacy/scene-07.js +2 -0
  260. package/dist/cli/legacy/scene-07.js.map +1 -0
  261. package/dist/cli/legacy/scene-08.d.ts +13 -0
  262. package/dist/cli/legacy/scene-08.d.ts.map +1 -0
  263. package/dist/cli/legacy/scene-08.js +2 -0
  264. package/dist/cli/legacy/scene-08.js.map +1 -0
  265. package/dist/cli/legacy/scene-09.d.ts +13 -0
  266. package/dist/cli/legacy/scene-09.d.ts.map +1 -0
  267. package/dist/cli/legacy/scene-09.js +2 -0
  268. package/dist/cli/legacy/scene-09.js.map +1 -0
  269. package/dist/cli/legacy/scene-10.d.ts +13 -0
  270. package/dist/cli/legacy/scene-10.d.ts.map +1 -0
  271. package/dist/cli/legacy/scene-10.js +2 -0
  272. package/dist/cli/legacy/scene-10.js.map +1 -0
  273. package/dist/cli/legacy/types.d.ts +16 -0
  274. package/dist/cli/legacy/types.d.ts.map +1 -0
  275. package/dist/cli/legacy/types.js +2 -0
  276. package/dist/cli/legacy/types.js.map +1 -0
  277. package/dist/cli/readArgs.d.ts +21 -0
  278. package/dist/cli/readArgs.d.ts.map +1 -0
  279. package/dist/cli/readArgs.js +72 -0
  280. package/dist/cli/readArgs.js.map +1 -0
  281. package/dist/cli/registry.d.ts +12 -0
  282. package/dist/cli/registry.d.ts.map +1 -0
  283. package/dist/cli/registry.js +38 -0
  284. package/dist/cli/registry.js.map +1 -0
  285. package/dist/cli/write.d.ts +17 -15
  286. package/dist/cli/write.d.ts.map +1 -1
  287. package/dist/cli/write.js +38 -902
  288. package/dist/cli/write.js.map +1 -1
  289. package/dist/diet/commands.d.ts +37 -0
  290. package/dist/diet/commands.d.ts.map +1 -0
  291. package/dist/diet/commands.js +44 -0
  292. package/dist/diet/commands.js.map +1 -0
  293. package/dist/diet/dietEngine.d.ts +79 -0
  294. package/dist/diet/dietEngine.d.ts.map +1 -0
  295. package/dist/diet/dietEngine.js +171 -0
  296. package/dist/diet/dietEngine.js.map +1 -0
  297. package/dist/diet/dietUi.d.ts +9 -0
  298. package/dist/diet/dietUi.d.ts.map +1 -0
  299. package/dist/diet/dietUi.js +45 -0
  300. package/dist/diet/dietUi.js.map +1 -0
  301. package/dist/diet/edit.d.ts +22 -0
  302. package/dist/diet/edit.d.ts.map +1 -0
  303. package/dist/diet/edit.js +96 -0
  304. package/dist/diet/edit.js.map +1 -0
  305. package/dist/diet/fieldLabels.d.ts +5 -0
  306. package/dist/diet/fieldLabels.d.ts.map +1 -0
  307. package/dist/diet/fieldLabels.js +44 -0
  308. package/dist/diet/fieldLabels.js.map +1 -0
  309. package/dist/diet/index.d.ts +26 -0
  310. package/dist/diet/index.d.ts.map +1 -0
  311. package/dist/diet/index.js +22 -0
  312. package/dist/diet/index.js.map +1 -0
  313. package/dist/diet/library.d.ts +20 -0
  314. package/dist/diet/library.d.ts.map +1 -0
  315. package/dist/diet/library.js +52 -0
  316. package/dist/diet/library.js.map +1 -0
  317. package/dist/diet/libraryDocs.d.ts +7 -0
  318. package/dist/diet/libraryDocs.d.ts.map +1 -0
  319. package/dist/diet/libraryDocs.js +361 -0
  320. package/dist/diet/libraryDocs.js.map +1 -0
  321. package/dist/diet/libraryPlate.d.ts +41 -0
  322. package/dist/diet/libraryPlate.d.ts.map +1 -0
  323. package/dist/diet/libraryPlate.js +57 -0
  324. package/dist/diet/libraryPlate.js.map +1 -0
  325. package/dist/diet/log.d.ts +18 -0
  326. package/dist/diet/log.d.ts.map +1 -0
  327. package/dist/diet/log.js +152 -0
  328. package/dist/diet/log.js.map +1 -0
  329. package/dist/diet/nutrition.d.ts +37 -0
  330. package/dist/diet/nutrition.d.ts.map +1 -0
  331. package/dist/diet/nutrition.js +135 -0
  332. package/dist/diet/nutrition.js.map +1 -0
  333. package/dist/diet/nutritionPort.d.ts +129 -0
  334. package/dist/diet/nutritionPort.d.ts.map +1 -0
  335. package/dist/diet/nutritionPort.js +246 -0
  336. package/dist/diet/nutritionPort.js.map +1 -0
  337. package/dist/diet/nutritionPortDocs.d.ts +106 -0
  338. package/dist/diet/nutritionPortDocs.d.ts.map +1 -0
  339. package/dist/diet/nutritionPortDocs.js +651 -0
  340. package/dist/diet/nutritionPortDocs.js.map +1 -0
  341. package/dist/diet/precheck.d.ts +7 -0
  342. package/dist/diet/precheck.d.ts.map +1 -0
  343. package/dist/diet/precheck.js +194 -0
  344. package/dist/diet/precheck.js.map +1 -0
  345. package/dist/diet/precheckLabel.d.ts +4 -0
  346. package/dist/diet/precheckLabel.d.ts.map +1 -0
  347. package/dist/diet/precheckLabel.js +191 -0
  348. package/dist/diet/precheckLabel.js.map +1 -0
  349. package/dist/diet/precheckParts.d.ts +49 -0
  350. package/dist/diet/precheckParts.d.ts.map +1 -0
  351. package/dist/diet/precheckParts.js +69 -0
  352. package/dist/diet/precheckParts.js.map +1 -0
  353. package/dist/diet/precheckPort.d.ts +82 -0
  354. package/dist/diet/precheckPort.d.ts.map +1 -0
  355. package/dist/diet/precheckPort.js +176 -0
  356. package/dist/diet/precheckPort.js.map +1 -0
  357. package/dist/diet/productImport.d.ts +28 -0
  358. package/dist/diet/productImport.d.ts.map +1 -0
  359. package/dist/diet/productImport.js +152 -0
  360. package/dist/diet/productImport.js.map +1 -0
  361. package/dist/diet/productStore.d.ts +62 -0
  362. package/dist/diet/productStore.d.ts.map +1 -0
  363. package/dist/diet/productStore.js +73 -0
  364. package/dist/diet/productStore.js.map +1 -0
  365. package/dist/diet/products.d.ts +15 -0
  366. package/dist/diet/products.d.ts.map +1 -0
  367. package/dist/diet/products.js +87 -0
  368. package/dist/diet/products.js.map +1 -0
  369. package/dist/diet/ranking.d.ts +18 -0
  370. package/dist/diet/ranking.d.ts.map +1 -0
  371. package/dist/diet/ranking.js +23 -0
  372. package/dist/diet/ranking.js.map +1 -0
  373. package/dist/diet/rankingDocs.d.ts +13 -0
  374. package/dist/diet/rankingDocs.d.ts.map +1 -0
  375. package/dist/diet/rankingDocs.js +341 -0
  376. package/dist/diet/rankingDocs.js.map +1 -0
  377. package/dist/diet/rankingPlate.d.ts +42 -0
  378. package/dist/diet/rankingPlate.d.ts.map +1 -0
  379. package/dist/diet/rankingPlate.js +96 -0
  380. package/dist/diet/rankingPlate.js.map +1 -0
  381. package/dist/diet/receipt.d.ts +34 -0
  382. package/dist/diet/receipt.d.ts.map +1 -0
  383. package/dist/diet/receipt.js +371 -0
  384. package/dist/diet/receipt.js.map +1 -0
  385. package/dist/diet/review.d.ts +36 -0
  386. package/dist/diet/review.d.ts.map +1 -0
  387. package/dist/diet/review.js +152 -0
  388. package/dist/diet/review.js.map +1 -0
  389. package/dist/diet/reviewDocs.d.ts +72 -0
  390. package/dist/diet/reviewDocs.d.ts.map +1 -0
  391. package/dist/diet/reviewDocs.js +312 -0
  392. package/dist/diet/reviewDocs.js.map +1 -0
  393. package/dist/diet/routes.d.ts +12 -0
  394. package/dist/diet/routes.d.ts.map +1 -0
  395. package/dist/diet/routes.js +108 -0
  396. package/dist/diet/routes.js.map +1 -0
  397. package/dist/diet/sourceStatsDocs.d.ts +3 -0
  398. package/dist/diet/sourceStatsDocs.d.ts.map +1 -0
  399. package/dist/diet/sourceStatsDocs.js +115 -0
  400. package/dist/diet/sourceStatsDocs.js.map +1 -0
  401. package/dist/diet/today.d.ts +14 -0
  402. package/dist/diet/today.d.ts.map +1 -0
  403. package/dist/diet/today.js +87 -0
  404. package/dist/diet/today.js.map +1 -0
  405. package/dist/diet/todayDocs.d.ts +53 -0
  406. package/dist/diet/todayDocs.d.ts.map +1 -0
  407. package/dist/diet/todayDocs.js +238 -0
  408. package/dist/diet/todayDocs.js.map +1 -0
  409. package/dist/exercise/cardio.d.ts +11 -0
  410. package/dist/exercise/cardio.d.ts.map +1 -0
  411. package/dist/exercise/cardio.js +14 -0
  412. package/dist/exercise/cardio.js.map +1 -0
  413. package/dist/exercise/categoryColors.d.ts +23 -0
  414. package/dist/exercise/categoryColors.d.ts.map +1 -0
  415. package/dist/exercise/categoryColors.js +28 -0
  416. package/dist/exercise/categoryColors.js.map +1 -0
  417. package/dist/exercise/commands.d.ts +20 -0
  418. package/dist/exercise/commands.d.ts.map +1 -0
  419. package/dist/exercise/commands.js +22 -0
  420. package/dist/exercise/commands.js.map +1 -0
  421. package/dist/exercise/distribution.d.ts +11 -0
  422. package/dist/exercise/distribution.d.ts.map +1 -0
  423. package/dist/exercise/distribution.js +14 -0
  424. package/dist/exercise/distribution.js.map +1 -0
  425. package/dist/exercise/edit.d.ts +22 -0
  426. package/dist/exercise/edit.d.ts.map +1 -0
  427. package/dist/exercise/edit.js +148 -0
  428. package/dist/exercise/edit.js.map +1 -0
  429. package/dist/exercise/exerciseStore.d.ts +87 -0
  430. package/dist/exercise/exerciseStore.d.ts.map +1 -0
  431. package/dist/exercise/exerciseStore.js +287 -0
  432. package/dist/exercise/exerciseStore.js.map +1 -0
  433. package/dist/exercise/fieldLabels.d.ts +5 -0
  434. package/dist/exercise/fieldLabels.d.ts.map +1 -0
  435. package/dist/exercise/fieldLabels.js +34 -0
  436. package/dist/exercise/fieldLabels.js.map +1 -0
  437. package/dist/exercise/goal.d.ts +16 -0
  438. package/dist/exercise/goal.d.ts.map +1 -0
  439. package/dist/exercise/goal.js +46 -0
  440. package/dist/exercise/goal.js.map +1 -0
  441. package/dist/exercise/index.d.ts +22 -0
  442. package/dist/exercise/index.d.ts.map +1 -0
  443. package/dist/exercise/index.js +22 -0
  444. package/dist/exercise/index.js.map +1 -0
  445. package/dist/exercise/log.d.ts +19 -0
  446. package/dist/exercise/log.d.ts.map +1 -0
  447. package/dist/exercise/log.js +102 -0
  448. package/dist/exercise/log.js.map +1 -0
  449. package/dist/exercise/precheck.d.ts +19 -0
  450. package/dist/exercise/precheck.d.ts.map +1 -0
  451. package/dist/exercise/precheck.js +127 -0
  452. package/dist/exercise/precheck.js.map +1 -0
  453. package/dist/exercise/recap.d.ts +11 -0
  454. package/dist/exercise/recap.d.ts.map +1 -0
  455. package/dist/exercise/recap.js +14 -0
  456. package/dist/exercise/recap.js.map +1 -0
  457. package/dist/exercise/receipt.d.ts +43 -0
  458. package/dist/exercise/receipt.d.ts.map +1 -0
  459. package/dist/exercise/receipt.js +401 -0
  460. package/dist/exercise/receipt.js.map +1 -0
  461. package/dist/exercise/records.d.ts +60 -0
  462. package/dist/exercise/records.d.ts.map +1 -0
  463. package/dist/exercise/records.js +317 -0
  464. package/dist/exercise/records.js.map +1 -0
  465. package/dist/exercise/routes.d.ts +21 -0
  466. package/dist/exercise/routes.d.ts.map +1 -0
  467. package/dist/exercise/routes.js +38 -0
  468. package/dist/exercise/routes.js.map +1 -0
  469. package/dist/exercise/sportUi.d.ts +77 -0
  470. package/dist/exercise/sportUi.d.ts.map +1 -0
  471. package/dist/exercise/sportUi.js +268 -0
  472. package/dist/exercise/sportUi.js.map +1 -0
  473. package/dist/exercise/strength.d.ts +11 -0
  474. package/dist/exercise/strength.d.ts.map +1 -0
  475. package/dist/exercise/strength.js +14 -0
  476. package/dist/exercise/strength.js.map +1 -0
  477. package/dist/exercise/trend.d.ts +11 -0
  478. package/dist/exercise/trend.d.ts.map +1 -0
  479. package/dist/exercise/trend.js +14 -0
  480. package/dist/exercise/trend.js.map +1 -0
  481. package/dist/fetch/audit.d.ts +2 -0
  482. package/dist/fetch/audit.d.ts.map +1 -1
  483. package/dist/fetch/audit.js +11 -10
  484. package/dist/fetch/audit.js.map +1 -1
  485. package/dist/fetch/batch.js +1 -1
  486. package/dist/fetch/batch.js.map +1 -1
  487. package/dist/fetch/body.d.ts +104 -1
  488. package/dist/fetch/body.d.ts.map +1 -1
  489. package/dist/fetch/body.js +200 -31
  490. package/dist/fetch/body.js.map +1 -1
  491. package/dist/fetch/cli.js +11 -5
  492. package/dist/fetch/cli.js.map +1 -1
  493. package/dist/fetch/exercise.d.ts.map +1 -1
  494. package/dist/fetch/exercise.js +7 -3
  495. package/dist/fetch/exercise.js.map +1 -1
  496. package/dist/fetch/index.d.ts +5 -7
  497. package/dist/fetch/index.d.ts.map +1 -1
  498. package/dist/fetch/index.js +7 -6
  499. package/dist/fetch/index.js.map +1 -1
  500. package/dist/fetch/nutritionGoal.d.ts.map +1 -1
  501. package/dist/fetch/nutritionGoal.js +15 -4
  502. package/dist/fetch/nutritionGoal.js.map +1 -1
  503. package/dist/fetch/profile.d.ts +24 -3
  504. package/dist/fetch/profile.d.ts.map +1 -1
  505. package/dist/fetch/profile.js +43 -14
  506. package/dist/fetch/profile.js.map +1 -1
  507. package/dist/fetch/xunji-catalog.d.ts +5 -0
  508. package/dist/fetch/xunji-catalog.d.ts.map +1 -1
  509. package/dist/fetch/xunji-catalog.js +22 -1
  510. package/dist/fetch/xunji-catalog.js.map +1 -1
  511. package/dist/goal/commands.d.ts +31 -0
  512. package/dist/goal/commands.d.ts.map +1 -0
  513. package/dist/goal/commands.js +20 -0
  514. package/dist/goal/commands.js.map +1 -0
  515. package/dist/goal/goalExtraPlate.d.ts +45 -0
  516. package/dist/goal/goalExtraPlate.d.ts.map +1 -0
  517. package/dist/goal/goalExtraPlate.js +95 -0
  518. package/dist/goal/goalExtraPlate.js.map +1 -0
  519. package/dist/goal/goalHistory.d.ts +24 -0
  520. package/dist/goal/goalHistory.d.ts.map +1 -0
  521. package/dist/goal/goalHistory.js +51 -0
  522. package/dist/goal/goalHistory.js.map +1 -0
  523. package/dist/goal/goalPlate.d.ts +24 -0
  524. package/dist/goal/goalPlate.d.ts.map +1 -0
  525. package/dist/goal/goalPlate.js +34 -0
  526. package/dist/goal/goalPlate.js.map +1 -0
  527. package/dist/goal/goalPlates.d.ts +66 -0
  528. package/dist/goal/goalPlates.d.ts.map +1 -0
  529. package/dist/goal/goalPlates.js +114 -0
  530. package/dist/goal/goalPlates.js.map +1 -0
  531. package/dist/goal/goalRecommendDoc.d.ts +6 -0
  532. package/dist/goal/goalRecommendDoc.d.ts.map +1 -0
  533. package/dist/goal/goalRecommendDoc.js +107 -0
  534. package/dist/goal/goalRecommendDoc.js.map +1 -0
  535. package/dist/goal/goalStore.d.ts +56 -0
  536. package/dist/goal/goalStore.d.ts.map +1 -0
  537. package/dist/goal/goalStore.js +111 -0
  538. package/dist/goal/goalStore.js.map +1 -0
  539. package/dist/goal/goalWeightDoc.d.ts +7 -0
  540. package/dist/goal/goalWeightDoc.d.ts.map +1 -0
  541. package/dist/goal/goalWeightDoc.js +107 -0
  542. package/dist/goal/goalWeightDoc.js.map +1 -0
  543. package/dist/goal/index.d.ts +17 -0
  544. package/dist/goal/index.d.ts.map +1 -0
  545. package/dist/goal/index.js +21 -0
  546. package/dist/goal/index.js.map +1 -0
  547. package/dist/goal/nutritionGoal.d.ts +115 -0
  548. package/dist/goal/nutritionGoal.d.ts.map +1 -0
  549. package/dist/goal/nutritionGoal.js +165 -0
  550. package/dist/goal/nutritionGoal.js.map +1 -0
  551. package/dist/goal/precheck.d.ts +14 -0
  552. package/dist/goal/precheck.d.ts.map +1 -0
  553. package/dist/goal/precheck.js +213 -0
  554. package/dist/goal/precheck.js.map +1 -0
  555. package/dist/goal/read.d.ts +53 -0
  556. package/dist/goal/read.d.ts.map +1 -0
  557. package/dist/goal/read.js +154 -0
  558. package/dist/goal/read.js.map +1 -0
  559. package/dist/goal/receipt.d.ts +38 -0
  560. package/dist/goal/receipt.d.ts.map +1 -0
  561. package/dist/goal/receipt.js +290 -0
  562. package/dist/goal/receipt.js.map +1 -0
  563. package/dist/goal/resultDocs.d.ts +23 -0
  564. package/dist/goal/resultDocs.d.ts.map +1 -0
  565. package/dist/goal/resultDocs.js +279 -0
  566. package/dist/goal/resultDocs.js.map +1 -0
  567. package/dist/goal/routes.d.ts +12 -0
  568. package/dist/goal/routes.d.ts.map +1 -0
  569. package/dist/goal/routes.js +29 -0
  570. package/dist/goal/routes.js.map +1 -0
  571. package/dist/goal/set.d.ts +97 -0
  572. package/dist/goal/set.d.ts.map +1 -0
  573. package/dist/goal/set.js +103 -0
  574. package/dist/goal/set.js.map +1 -0
  575. package/dist/goal/write.d.ts +30 -0
  576. package/dist/goal/write.d.ts.map +1 -0
  577. package/dist/goal/write.js +102 -0
  578. package/dist/goal/write.js.map +1 -0
  579. package/dist/help-missing.json +35 -0
  580. package/dist/home/commands.d.ts +11 -0
  581. package/dist/home/commands.d.ts.map +1 -0
  582. package/dist/home/commands.js +8 -0
  583. package/dist/home/commands.js.map +1 -0
  584. package/dist/home/exercise.d.ts +27 -0
  585. package/dist/home/exercise.d.ts.map +1 -0
  586. package/dist/home/exercise.js +60 -0
  587. package/dist/home/exercise.js.map +1 -0
  588. package/dist/home/goalProgressDocs.d.ts +27 -0
  589. package/dist/home/goalProgressDocs.d.ts.map +1 -0
  590. package/dist/home/goalProgressDocs.js +363 -0
  591. package/dist/home/goalProgressDocs.js.map +1 -0
  592. package/dist/home/home.d.ts +38 -0
  593. package/dist/home/home.d.ts.map +1 -0
  594. package/dist/home/home.js +78 -0
  595. package/dist/home/home.js.map +1 -0
  596. package/dist/home/homeDocs.d.ts +8 -0
  597. package/dist/home/homeDocs.d.ts.map +1 -0
  598. package/dist/home/homeDocs.js +307 -0
  599. package/dist/home/homeDocs.js.map +1 -0
  600. package/dist/home/homeViewParts.d.ts +42 -0
  601. package/dist/home/homeViewParts.d.ts.map +1 -0
  602. package/dist/home/homeViewParts.js +316 -0
  603. package/dist/home/homeViewParts.js.map +1 -0
  604. package/dist/home/index.d.ts +14 -0
  605. package/dist/home/index.d.ts.map +1 -0
  606. package/dist/home/index.js +13 -0
  607. package/dist/home/index.js.map +1 -0
  608. package/dist/home/routes.d.ts +10 -0
  609. package/dist/home/routes.d.ts.map +1 -0
  610. package/dist/home/routes.js +47 -0
  611. package/dist/home/routes.js.map +1 -0
  612. package/dist/home/today.d.ts +50 -0
  613. package/dist/home/today.d.ts.map +1 -0
  614. package/dist/home/today.js +255 -0
  615. package/dist/home/today.js.map +1 -0
  616. package/dist/index.d.ts +2 -0
  617. package/dist/index.d.ts.map +1 -1
  618. package/dist/index.js +3 -0
  619. package/dist/index.js.map +1 -1
  620. package/dist/migrate/migrate.js +1 -1
  621. package/dist/output.d.ts +31 -16
  622. package/dist/output.d.ts.map +1 -1
  623. package/dist/output.js +118 -143
  624. package/dist/output.js.map +1 -1
  625. package/dist/photo/commands.d.ts +55 -0
  626. package/dist/photo/commands.d.ts.map +1 -0
  627. package/dist/photo/commands.js +25 -0
  628. package/dist/photo/commands.js.map +1 -0
  629. package/dist/photo/compare.d.ts +24 -0
  630. package/dist/photo/compare.d.ts.map +1 -0
  631. package/dist/photo/compare.js +48 -0
  632. package/dist/photo/compare.js.map +1 -0
  633. package/dist/photo/compareDoc.d.ts +5 -0
  634. package/dist/photo/compareDoc.d.ts.map +1 -0
  635. package/dist/photo/compareDoc.js +221 -0
  636. package/dist/photo/compareDoc.js.map +1 -0
  637. package/dist/photo/dir.d.ts +5 -0
  638. package/dist/photo/dir.d.ts.map +1 -0
  639. package/dist/photo/dir.js +22 -0
  640. package/dist/photo/dir.js.map +1 -0
  641. package/dist/photo/gallery.d.ts +16 -0
  642. package/dist/photo/gallery.d.ts.map +1 -0
  643. package/dist/photo/gallery.js +45 -0
  644. package/dist/photo/gallery.js.map +1 -0
  645. package/dist/photo/galleryDoc.d.ts +12 -0
  646. package/dist/photo/galleryDoc.d.ts.map +1 -0
  647. package/dist/photo/galleryDoc.js +291 -0
  648. package/dist/photo/galleryDoc.js.map +1 -0
  649. package/dist/photo/gif.d.ts +28 -0
  650. package/dist/photo/gif.d.ts.map +1 -0
  651. package/dist/photo/gif.js +281 -0
  652. package/dist/photo/gif.js.map +1 -0
  653. package/dist/photo/gifDoc.d.ts +52 -0
  654. package/dist/photo/gifDoc.d.ts.map +1 -0
  655. package/dist/photo/gifDoc.js +311 -0
  656. package/dist/photo/gifDoc.js.map +1 -0
  657. package/dist/photo/help.d.ts +4 -0
  658. package/dist/photo/help.d.ts.map +1 -0
  659. package/dist/photo/help.js +87 -0
  660. package/dist/photo/help.js.map +1 -0
  661. package/dist/photo/helpCenter.d.ts +137 -0
  662. package/dist/photo/helpCenter.d.ts.map +1 -0
  663. package/dist/photo/helpCenter.js +475 -0
  664. package/dist/photo/helpCenter.js.map +1 -0
  665. package/dist/photo/helpDoc.d.ts +5 -0
  666. package/dist/photo/helpDoc.d.ts.map +1 -0
  667. package/dist/photo/helpDoc.js +205 -0
  668. package/dist/photo/helpDoc.js.map +1 -0
  669. package/dist/photo/helpDocContent.d.ts +77 -0
  670. package/dist/photo/helpDocContent.d.ts.map +1 -0
  671. package/dist/photo/helpDocContent.js +120 -0
  672. package/dist/photo/helpDocContent.js.map +1 -0
  673. package/dist/photo/helpDocCss.d.ts +5 -0
  674. package/dist/photo/helpDocCss.d.ts.map +1 -0
  675. package/dist/photo/helpDocCss.js +119 -0
  676. package/dist/photo/helpDocCss.js.map +1 -0
  677. package/dist/photo/helpFile.d.ts +26 -0
  678. package/dist/photo/helpFile.d.ts.map +1 -0
  679. package/dist/photo/helpFile.js +90 -0
  680. package/dist/photo/helpFile.js.map +1 -0
  681. package/dist/photo/helpLookup.d.ts +18 -0
  682. package/dist/photo/helpLookup.d.ts.map +1 -0
  683. package/dist/photo/helpLookup.js +58 -0
  684. package/dist/photo/helpLookup.js.map +1 -0
  685. package/dist/photo/helpPaths.d.ts +22 -0
  686. package/dist/photo/helpPaths.d.ts.map +1 -0
  687. package/dist/photo/helpPaths.js +22 -0
  688. package/dist/photo/helpPaths.js.map +1 -0
  689. package/dist/photo/index.d.ts +17 -0
  690. package/dist/photo/index.d.ts.map +1 -0
  691. package/dist/photo/index.js +21 -0
  692. package/dist/photo/index.js.map +1 -0
  693. package/dist/photo/manage.d.ts +13 -0
  694. package/dist/photo/manage.d.ts.map +1 -0
  695. package/dist/photo/manage.js +64 -0
  696. package/dist/photo/manage.js.map +1 -0
  697. package/dist/photo/photo.d.ts +118 -0
  698. package/dist/photo/photo.d.ts.map +1 -0
  699. package/dist/photo/photo.js +279 -0
  700. package/dist/photo/photo.js.map +1 -0
  701. package/dist/photo/photoThumb.d.ts +38 -0
  702. package/dist/photo/photoThumb.d.ts.map +1 -0
  703. package/dist/photo/photoThumb.js +83 -0
  704. package/dist/photo/photoThumb.js.map +1 -0
  705. package/dist/photo/photoUi.d.ts +39 -0
  706. package/dist/photo/photoUi.d.ts.map +1 -0
  707. package/dist/photo/photoUi.js +233 -0
  708. package/dist/photo/photoUi.js.map +1 -0
  709. package/dist/photo/photos.d.ts +76 -0
  710. package/dist/photo/photos.d.ts.map +1 -0
  711. package/dist/photo/photos.js +193 -0
  712. package/dist/photo/photos.js.map +1 -0
  713. package/dist/photo/picker.d.ts +41 -0
  714. package/dist/photo/picker.d.ts.map +1 -0
  715. package/dist/photo/picker.js +132 -0
  716. package/dist/photo/picker.js.map +1 -0
  717. package/dist/photo/pickerDoc.d.ts +12 -0
  718. package/dist/photo/pickerDoc.d.ts.map +1 -0
  719. package/dist/photo/pickerDoc.js +231 -0
  720. package/dist/photo/pickerDoc.js.map +1 -0
  721. package/dist/photo/receipt.d.ts +23 -0
  722. package/dist/photo/receipt.d.ts.map +1 -0
  723. package/dist/photo/receipt.js +331 -0
  724. package/dist/photo/receipt.js.map +1 -0
  725. package/dist/photo/receiptUi.d.ts +42 -0
  726. package/dist/photo/receiptUi.d.ts.map +1 -0
  727. package/dist/photo/receiptUi.js +147 -0
  728. package/dist/photo/receiptUi.js.map +1 -0
  729. package/dist/photo/routes.d.ts +10 -0
  730. package/dist/photo/routes.d.ts.map +1 -0
  731. package/dist/photo/routes.js +29 -0
  732. package/dist/photo/routes.js.map +1 -0
  733. package/dist/photo/store.d.ts +10 -0
  734. package/dist/photo/store.d.ts.map +1 -0
  735. package/dist/photo/store.js +44 -0
  736. package/dist/photo/store.js.map +1 -0
  737. package/dist/photo/viewerDoc.d.ts +5 -0
  738. package/dist/photo/viewerDoc.d.ts.map +1 -0
  739. package/dist/photo/viewerDoc.js +255 -0
  740. package/dist/photo/viewerDoc.js.map +1 -0
  741. package/dist/photo/wizard.d.ts +15 -0
  742. package/dist/photo/wizard.d.ts.map +1 -0
  743. package/dist/photo/wizard.js +25 -0
  744. package/dist/photo/wizard.js.map +1 -0
  745. package/dist/photo/wizardUi.d.ts +24 -0
  746. package/dist/photo/wizardUi.d.ts.map +1 -0
  747. package/dist/photo/wizardUi.js +101 -0
  748. package/dist/photo/wizardUi.js.map +1 -0
  749. package/dist/profile/commands.d.ts +28 -0
  750. package/dist/profile/commands.d.ts.map +1 -0
  751. package/dist/profile/commands.js +10 -0
  752. package/dist/profile/commands.js.map +1 -0
  753. package/dist/profile/index.d.ts +23 -0
  754. package/dist/profile/index.d.ts.map +1 -0
  755. package/dist/profile/index.js +22 -0
  756. package/dist/profile/index.js.map +1 -0
  757. package/dist/profile/labels.d.ts +10 -0
  758. package/dist/profile/labels.d.ts.map +1 -0
  759. package/dist/profile/labels.js +52 -0
  760. package/dist/profile/labels.js.map +1 -0
  761. package/dist/profile/read.d.ts +13 -0
  762. package/dist/profile/read.d.ts.map +1 -0
  763. package/dist/profile/read.js +24 -0
  764. package/dist/profile/read.js.map +1 -0
  765. package/dist/profile/receipt.d.ts +10 -0
  766. package/dist/profile/receipt.d.ts.map +1 -0
  767. package/dist/profile/receipt.js +19 -0
  768. package/dist/profile/receipt.js.map +1 -0
  769. package/dist/profile/routes.d.ts +8 -0
  770. package/dist/profile/routes.d.ts.map +1 -0
  771. package/dist/profile/routes.js +9 -0
  772. package/dist/profile/routes.js.map +1 -0
  773. package/dist/profile/setup.d.ts +67 -0
  774. package/dist/profile/setup.d.ts.map +1 -0
  775. package/dist/profile/setup.js +396 -0
  776. package/dist/profile/setup.js.map +1 -0
  777. package/dist/profile/update.d.ts +5 -0
  778. package/dist/profile/update.d.ts.map +1 -0
  779. package/dist/profile/update.js +85 -0
  780. package/dist/profile/update.js.map +1 -0
  781. package/dist/profile/view.d.ts +64 -0
  782. package/dist/profile/view.d.ts.map +1 -0
  783. package/dist/profile/view.js +204 -0
  784. package/dist/profile/view.js.map +1 -0
  785. package/dist/profile/write.d.ts +16 -0
  786. package/dist/profile/write.d.ts.map +1 -0
  787. package/dist/profile/write.js +75 -0
  788. package/dist/profile/write.js.map +1 -0
  789. package/dist/render/analysisPlate.d.ts +1 -1
  790. package/dist/render/analysisPlate.d.ts.map +1 -1
  791. package/dist/render/analysisPlate.js +1 -1
  792. package/dist/render/analysisPlate.js.map +1 -1
  793. package/dist/render/dietDocs.d.ts +19 -19
  794. package/dist/render/dietDocs.d.ts.map +1 -1
  795. package/dist/render/dietDocs.js +173 -435
  796. package/dist/render/dietDocs.js.map +1 -1
  797. package/dist/render/exercisePort.d.ts +3 -1
  798. package/dist/render/exercisePort.d.ts.map +1 -1
  799. package/dist/render/exercisePort.js +4 -3
  800. package/dist/render/exercisePort.js.map +1 -1
  801. package/dist/render/goalExtra.d.ts.map +1 -1
  802. package/dist/render/goalExtra.js +2 -1
  803. package/dist/render/goalExtra.js.map +1 -1
  804. package/dist/render/goalPlate.d.ts +2 -2
  805. package/dist/render/goalPlate.d.ts.map +1 -1
  806. package/dist/render/goalPlate.js +3 -3
  807. package/dist/render/goalPlate.js.map +1 -1
  808. package/dist/render/helpCenter.d.ts.map +1 -1
  809. package/dist/render/helpCenter.js +4 -2
  810. package/dist/render/helpCenter.js.map +1 -1
  811. package/dist/render/helpFile.d.ts +26 -0
  812. package/dist/render/helpFile.d.ts.map +1 -0
  813. package/dist/render/helpFile.js +60 -0
  814. package/dist/render/helpFile.js.map +1 -0
  815. package/dist/render/helpPaths.d.ts +22 -0
  816. package/dist/render/helpPaths.d.ts.map +1 -0
  817. package/dist/render/helpPaths.js +22 -0
  818. package/dist/render/helpPaths.js.map +1 -0
  819. package/dist/render/helpShell.d.ts +16 -0
  820. package/dist/render/helpShell.d.ts.map +1 -0
  821. package/dist/render/helpShell.js +27 -0
  822. package/dist/render/helpShell.js.map +1 -0
  823. package/dist/render/html.d.ts +37 -21
  824. package/dist/render/html.d.ts.map +1 -1
  825. package/dist/render/html.js +37 -45
  826. package/dist/render/html.js.map +1 -1
  827. package/dist/render/index.d.ts +37 -33
  828. package/dist/render/index.d.ts.map +1 -1
  829. package/dist/render/index.js +32 -18
  830. package/dist/render/index.js.map +1 -1
  831. package/dist/render/insightPlate.d.ts +17 -0
  832. package/dist/render/insightPlate.d.ts.map +1 -1
  833. package/dist/render/insightPlate.js +109 -1
  834. package/dist/render/insightPlate.js.map +1 -1
  835. package/dist/render/nutritionPortDocs.d.ts.map +1 -1
  836. package/dist/render/nutritionPortDocs.js +41 -48
  837. package/dist/render/nutritionPortDocs.js.map +1 -1
  838. package/dist/render/pageChromeCss.d.ts +24 -0
  839. package/dist/render/pageChromeCss.d.ts.map +1 -0
  840. package/dist/render/pageChromeCss.js +45 -0
  841. package/dist/render/pageChromeCss.js.map +1 -0
  842. package/dist/render/planCopyBlock.d.ts +32 -0
  843. package/dist/render/planCopyBlock.d.ts.map +1 -0
  844. package/dist/render/planCopyBlock.js +34 -0
  845. package/dist/render/planCopyBlock.js.map +1 -0
  846. package/dist/render/planEditor.d.ts +94 -0
  847. package/dist/render/planEditor.d.ts.map +1 -0
  848. package/dist/render/planEditor.js +38 -0
  849. package/dist/render/planEditor.js.map +1 -0
  850. package/dist/render/planEditorCss.d.ts +13 -0
  851. package/dist/render/planEditorCss.d.ts.map +1 -0
  852. package/dist/render/planEditorCss.js +140 -0
  853. package/dist/render/planEditorCss.js.map +1 -0
  854. package/dist/render/planEditorDocs.d.ts +7 -0
  855. package/dist/render/planEditorDocs.d.ts.map +1 -0
  856. package/dist/render/planEditorDocs.js +56 -0
  857. package/dist/render/planEditorDocs.js.map +1 -0
  858. package/dist/render/planEditorPort.d.ts +45 -0
  859. package/dist/render/planEditorPort.d.ts.map +1 -0
  860. package/dist/render/planEditorPort.js +217 -0
  861. package/dist/render/planEditorPort.js.map +1 -0
  862. package/dist/render/planEditorRuntime.d.ts +15 -0
  863. package/dist/render/planEditorRuntime.d.ts.map +1 -0
  864. package/dist/render/planEditorRuntime.js +427 -0
  865. package/dist/render/planEditorRuntime.js.map +1 -0
  866. package/dist/render/planPlate.d.ts +84 -4
  867. package/dist/render/planPlate.d.ts.map +1 -1
  868. package/dist/render/planPlate.js +155 -7
  869. package/dist/render/planPlate.js.map +1 -1
  870. package/dist/render/planWizardCss.d.ts +21 -0
  871. package/dist/render/planWizardCss.d.ts.map +1 -0
  872. package/dist/render/planWizardCss.js +121 -0
  873. package/dist/render/planWizardCss.js.map +1 -0
  874. package/dist/render/planWizardDocs.d.ts +8 -0
  875. package/dist/render/planWizardDocs.d.ts.map +1 -0
  876. package/dist/render/planWizardDocs.js +151 -0
  877. package/dist/render/planWizardDocs.js.map +1 -0
  878. package/dist/render/receipt.d.ts +4 -0
  879. package/dist/render/receipt.d.ts.map +1 -1
  880. package/dist/render/receipt.js +4 -1
  881. package/dist/render/receipt.js.map +1 -1
  882. package/dist/render/reviewDocs.d.ts +3 -0
  883. package/dist/render/reviewDocs.d.ts.map +1 -0
  884. package/dist/render/reviewDocs.js +222 -0
  885. package/dist/render/reviewDocs.js.map +1 -0
  886. package/dist/render/reviewDocsCss.d.ts +5 -0
  887. package/dist/render/reviewDocsCss.d.ts.map +1 -0
  888. package/dist/render/reviewDocsCss.js +128 -0
  889. package/dist/render/reviewDocsCss.js.map +1 -0
  890. package/dist/render/sportDocs.d.ts +17 -12
  891. package/dist/render/sportDocs.d.ts.map +1 -1
  892. package/dist/render/sportDocs.js +370 -497
  893. package/dist/render/sportDocs.js.map +1 -1
  894. package/dist/render/sportPortDocs.d.ts +3 -2
  895. package/dist/render/sportPortDocs.d.ts.map +1 -1
  896. package/dist/render/sportPortDocs.js +825 -397
  897. package/dist/render/sportPortDocs.js.map +1 -1
  898. package/dist/render/trendDocs.d.ts +16 -6
  899. package/dist/render/trendDocs.d.ts.map +1 -1
  900. package/dist/render/trendDocs.js +310 -262
  901. package/dist/render/trendDocs.js.map +1 -1
  902. package/dist/render/trendMiscPort.d.ts +9 -24
  903. package/dist/render/trendMiscPort.d.ts.map +1 -1
  904. package/dist/render/trendMiscPort.js +7 -30
  905. package/dist/render/trendMiscPort.js.map +1 -1
  906. package/dist/render/trendMiscPortDocs.d.ts +1 -2
  907. package/dist/render/trendMiscPortDocs.d.ts.map +1 -1
  908. package/dist/render/trendMiscPortDocs.js +303 -133
  909. package/dist/render/trendMiscPortDocs.js.map +1 -1
  910. package/dist/render/trendPredictDocs.d.ts +16 -0
  911. package/dist/render/trendPredictDocs.d.ts.map +1 -0
  912. package/dist/render/trendPredictDocs.js +1131 -0
  913. package/dist/render/trendPredictDocs.js.map +1 -0
  914. package/dist/render/wizardPort.d.ts +9 -62
  915. package/dist/render/wizardPort.d.ts.map +1 -1
  916. package/dist/render/wizardPort.js +20 -180
  917. package/dist/render/wizardPort.js.map +1 -1
  918. package/dist/render/wizardPortDocs.d.ts +5 -5
  919. package/dist/render/wizardPortDocs.d.ts.map +1 -1
  920. package/dist/render/wizardPortDocs.js +282 -234
  921. package/dist/render/wizardPortDocs.js.map +1 -1
  922. package/dist/render/workoutMovementTable.d.ts +10 -0
  923. package/dist/render/workoutMovementTable.d.ts.map +1 -0
  924. package/dist/render/workoutMovementTable.js +153 -0
  925. package/dist/render/workoutMovementTable.js.map +1 -0
  926. package/dist/render/workoutPlanCss.d.ts +15 -0
  927. package/dist/render/workoutPlanCss.d.ts.map +1 -0
  928. package/dist/render/workoutPlanCss.js +217 -0
  929. package/dist/render/workoutPlanCss.js.map +1 -0
  930. package/dist/render/workoutPlanDocs.d.ts +23 -0
  931. package/dist/render/workoutPlanDocs.d.ts.map +1 -0
  932. package/dist/render/workoutPlanDocs.js +244 -0
  933. package/dist/render/workoutPlanDocs.js.map +1 -0
  934. package/dist/render/workoutPlanLook.d.ts +16 -0
  935. package/dist/render/workoutPlanLook.d.ts.map +1 -0
  936. package/dist/render/workoutPlanLook.js +135 -0
  937. package/dist/render/workoutPlanLook.js.map +1 -0
  938. package/dist/schema.d.ts.map +1 -1
  939. package/dist/schema.js +11 -0
  940. package/dist/schema.js.map +1 -1
  941. package/dist/shared/commandSpec.d.ts +73 -0
  942. package/dist/shared/commandSpec.d.ts.map +1 -0
  943. package/dist/shared/commandSpec.js +2 -0
  944. package/dist/shared/commandSpec.js.map +1 -0
  945. package/dist/shared/conclusionLine.d.ts +3 -0
  946. package/dist/shared/conclusionLine.d.ts.map +1 -0
  947. package/dist/shared/conclusionLine.js +21 -0
  948. package/dist/shared/conclusionLine.js.map +1 -0
  949. package/dist/shared/contentSuffix.d.ts +17 -0
  950. package/dist/shared/contentSuffix.d.ts.map +1 -0
  951. package/dist/shared/contentSuffix.js +125 -0
  952. package/dist/shared/contentSuffix.js.map +1 -0
  953. package/dist/shared/copyArea.d.ts +73 -0
  954. package/dist/shared/copyArea.d.ts.map +1 -0
  955. package/dist/shared/copyArea.js +144 -0
  956. package/dist/shared/copyArea.js.map +1 -0
  957. package/dist/shared/docPage.d.ts +42 -0
  958. package/dist/shared/docPage.d.ts.map +1 -0
  959. package/dist/shared/docPage.js +129 -0
  960. package/dist/shared/docPage.js.map +1 -0
  961. package/dist/shared/emptyGuide.d.ts +9 -0
  962. package/dist/shared/emptyGuide.d.ts.map +1 -0
  963. package/dist/shared/emptyGuide.js +31 -0
  964. package/dist/shared/emptyGuide.js.map +1 -0
  965. package/dist/shared/fieldLabel.d.ts +5 -0
  966. package/dist/shared/fieldLabel.d.ts.map +1 -0
  967. package/dist/shared/fieldLabel.js +42 -0
  968. package/dist/shared/fieldLabel.js.map +1 -0
  969. package/dist/shared/operationHead.d.ts +21 -0
  970. package/dist/shared/operationHead.d.ts.map +1 -0
  971. package/dist/shared/operationHead.js +73 -0
  972. package/dist/shared/operationHead.js.map +1 -0
  973. package/dist/shared/pageKit.d.ts +25 -0
  974. package/dist/shared/pageKit.d.ts.map +1 -0
  975. package/dist/shared/pageKit.js +56 -0
  976. package/dist/shared/pageKit.js.map +1 -0
  977. package/dist/shared/params.d.ts +54 -0
  978. package/dist/shared/params.d.ts.map +1 -0
  979. package/dist/shared/params.js +176 -0
  980. package/dist/shared/params.js.map +1 -0
  981. package/dist/shared/receiptParts.d.ts +9 -0
  982. package/dist/shared/receiptParts.d.ts.map +1 -0
  983. package/dist/shared/receiptParts.js +40 -0
  984. package/dist/shared/receiptParts.js.map +1 -0
  985. package/dist/shared/sceneEnvelope.d.ts +32 -0
  986. package/dist/shared/sceneEnvelope.d.ts.map +1 -0
  987. package/dist/shared/sceneEnvelope.js +12 -0
  988. package/dist/shared/sceneEnvelope.js.map +1 -0
  989. package/dist/shared/sourceLine.d.ts +10 -0
  990. package/dist/shared/sourceLine.d.ts.map +1 -0
  991. package/dist/shared/sourceLine.js +37 -0
  992. package/dist/shared/sourceLine.js.map +1 -0
  993. package/dist/shared/writeParts.d.ts +61 -0
  994. package/dist/shared/writeParts.d.ts.map +1 -0
  995. package/dist/shared/writeParts.js +79 -0
  996. package/dist/shared/writeParts.js.map +1 -0
  997. package/dist/triggers/help-lookup.d.ts +41 -5
  998. package/dist/triggers/help-lookup.d.ts.map +1 -1
  999. package/dist/triggers/help-lookup.js +100 -51
  1000. package/dist/triggers/help-lookup.js.map +1 -1
  1001. package/dist/triggers/index.js +1 -1
  1002. package/dist/triggers/routeSpec.d.ts +66 -0
  1003. package/dist/triggers/routeSpec.d.ts.map +1 -0
  1004. package/dist/triggers/routeSpec.js +21 -0
  1005. package/dist/triggers/routeSpec.js.map +1 -0
  1006. package/dist/triggers/routes.generated.d.ts +17 -0
  1007. package/dist/triggers/routes.generated.d.ts.map +1 -0
  1008. package/dist/triggers/routes.generated.js +519 -0
  1009. package/dist/triggers/routes.generated.js.map +1 -0
  1010. package/dist/triggers/routing.d.ts +17 -38
  1011. package/dist/triggers/routing.d.ts.map +1 -1
  1012. package/dist/triggers/routing.js +13 -527
  1013. package/dist/triggers/routing.js.map +1 -1
  1014. package/dist/triggers/scene-01-home.js +9 -9
  1015. package/dist/triggers/scene-01-home.js.map +1 -1
  1016. package/dist/triggers/scene-02-diet.js +62 -62
  1017. package/dist/triggers/scene-02-diet.js.map +1 -1
  1018. package/dist/triggers/scene-03-weight.js +54 -54
  1019. package/dist/triggers/scene-03-weight.js.map +1 -1
  1020. package/dist/triggers/scene-04-exercise.js +33 -33
  1021. package/dist/triggers/scene-04-exercise.js.map +1 -1
  1022. package/dist/triggers/scene-05-workout.js +32 -32
  1023. package/dist/triggers/scene-05-workout.js.map +1 -1
  1024. package/dist/triggers/scene-06-goal.d.ts +1 -1
  1025. package/dist/triggers/scene-06-goal.d.ts.map +1 -1
  1026. package/dist/triggers/scene-06-goal.js +25 -24
  1027. package/dist/triggers/scene-06-goal.js.map +1 -1
  1028. package/dist/triggers/scene-07-profile.js +4 -4
  1029. package/dist/triggers/scene-07-profile.js.map +1 -1
  1030. package/dist/triggers/scene-08-body.js +10 -10
  1031. package/dist/triggers/scene-08-body.js.map +1 -1
  1032. package/dist/triggers/scene-09-photo.js +10 -10
  1033. package/dist/triggers/scene-09-photo.js.map +1 -1
  1034. package/dist/triggers/scene-10-analysis.js +176 -176
  1035. package/dist/triggers/scene-10-analysis.js.map +1 -1
  1036. package/dist/triggers/wake-assets.d.ts +47 -0
  1037. package/dist/triggers/wake-assets.d.ts.map +1 -0
  1038. package/dist/triggers/wake-assets.js +4725 -0
  1039. package/dist/triggers/wake-assets.js.map +1 -0
  1040. package/dist/weight/commands.d.ts +21 -0
  1041. package/dist/weight/commands.d.ts.map +1 -0
  1042. package/dist/weight/commands.js +18 -0
  1043. package/dist/weight/commands.js.map +1 -0
  1044. package/dist/weight/compare.d.ts +60 -0
  1045. package/dist/weight/compare.d.ts.map +1 -0
  1046. package/dist/weight/compare.js +570 -0
  1047. package/dist/weight/compare.js.map +1 -0
  1048. package/dist/weight/edit.d.ts +13 -0
  1049. package/dist/weight/edit.d.ts.map +1 -0
  1050. package/dist/weight/edit.js +87 -0
  1051. package/dist/weight/edit.js.map +1 -0
  1052. package/dist/weight/fieldLabels.d.ts +5 -0
  1053. package/dist/weight/fieldLabels.d.ts.map +1 -0
  1054. package/dist/weight/fieldLabels.js +23 -0
  1055. package/dist/weight/fieldLabels.js.map +1 -0
  1056. package/dist/weight/figures.d.ts +87 -0
  1057. package/dist/weight/figures.d.ts.map +1 -0
  1058. package/dist/weight/figures.js +219 -0
  1059. package/dist/weight/figures.js.map +1 -0
  1060. package/dist/weight/history.d.ts +85 -0
  1061. package/dist/weight/history.d.ts.map +1 -0
  1062. package/dist/weight/history.js +771 -0
  1063. package/dist/weight/history.js.map +1 -0
  1064. package/dist/weight/index.d.ts +27 -0
  1065. package/dist/weight/index.d.ts.map +1 -0
  1066. package/dist/weight/index.js +23 -0
  1067. package/dist/weight/index.js.map +1 -0
  1068. package/dist/weight/log.d.ts +40 -0
  1069. package/dist/weight/log.d.ts.map +1 -0
  1070. package/dist/weight/log.js +355 -0
  1071. package/dist/weight/log.js.map +1 -0
  1072. package/dist/weight/logReceipt.d.ts +28 -0
  1073. package/dist/weight/logReceipt.d.ts.map +1 -0
  1074. package/dist/weight/logReceipt.js +259 -0
  1075. package/dist/weight/logReceipt.js.map +1 -0
  1076. package/dist/weight/plate.d.ts +77 -0
  1077. package/dist/weight/plate.d.ts.map +1 -0
  1078. package/dist/weight/plate.js +60 -0
  1079. package/dist/weight/plate.js.map +1 -0
  1080. package/dist/weight/plateDocs.d.ts +83 -0
  1081. package/dist/weight/plateDocs.d.ts.map +1 -0
  1082. package/dist/weight/plateDocs.js +179 -0
  1083. package/dist/weight/plateDocs.js.map +1 -0
  1084. package/dist/weight/receipt.d.ts +23 -0
  1085. package/dist/weight/receipt.d.ts.map +1 -0
  1086. package/dist/weight/receipt.js +178 -0
  1087. package/dist/weight/receipt.js.map +1 -0
  1088. package/dist/weight/records.d.ts +109 -0
  1089. package/dist/weight/records.d.ts.map +1 -0
  1090. package/dist/weight/records.js +210 -0
  1091. package/dist/weight/records.js.map +1 -0
  1092. package/dist/weight/review.d.ts +114 -0
  1093. package/dist/weight/review.d.ts.map +1 -0
  1094. package/dist/weight/review.js +651 -0
  1095. package/dist/weight/review.js.map +1 -0
  1096. package/dist/weight/routes.d.ts +7 -0
  1097. package/dist/weight/routes.d.ts.map +1 -0
  1098. package/dist/weight/routes.js +68 -0
  1099. package/dist/weight/routes.js.map +1 -0
  1100. package/dist/weight/volatility.d.ts +78 -0
  1101. package/dist/weight/volatility.d.ts.map +1 -0
  1102. package/dist/weight/volatility.js +203 -0
  1103. package/dist/weight/volatility.js.map +1 -0
  1104. package/dist/weight/volatilityDoc.d.ts +10 -0
  1105. package/dist/weight/volatilityDoc.d.ts.map +1 -0
  1106. package/dist/weight/volatilityDoc.js +395 -0
  1107. package/dist/weight/volatilityDoc.js.map +1 -0
  1108. package/dist/weight/weightCompare.d.ts +70 -0
  1109. package/dist/weight/weightCompare.d.ts.map +1 -0
  1110. package/dist/weight/weightCompare.js +221 -0
  1111. package/dist/weight/weightCompare.js.map +1 -0
  1112. package/dist/weight/weightCompare2.d.ts +66 -0
  1113. package/dist/weight/weightCompare2.d.ts.map +1 -0
  1114. package/dist/weight/weightCompare2.js +218 -0
  1115. package/dist/weight/weightCompare2.js.map +1 -0
  1116. package/dist/weight/weightCompare3.d.ts +18 -0
  1117. package/dist/weight/weightCompare3.d.ts.map +1 -0
  1118. package/dist/weight/weightCompare3.js +222 -0
  1119. package/dist/weight/weightCompare3.js.map +1 -0
  1120. package/dist/weight/weightUi.d.ts +114 -0
  1121. package/dist/weight/weightUi.d.ts.map +1 -0
  1122. package/dist/weight/weightUi.js +256 -0
  1123. package/dist/weight/weightUi.js.map +1 -0
  1124. package/dist/workout/commands.d.ts +29 -0
  1125. package/dist/workout/commands.d.ts.map +1 -0
  1126. package/dist/workout/commands.js +35 -0
  1127. package/dist/workout/commands.js.map +1 -0
  1128. package/dist/workout/contraindication.d.ts +11 -0
  1129. package/dist/workout/contraindication.d.ts.map +1 -0
  1130. package/dist/workout/contraindication.js +11 -0
  1131. package/dist/workout/contraindication.js.map +1 -0
  1132. package/dist/workout/dayPhrase.d.ts +13 -0
  1133. package/dist/workout/dayPhrase.d.ts.map +1 -0
  1134. package/dist/workout/dayPhrase.js +15 -0
  1135. package/dist/workout/dayPhrase.js.map +1 -0
  1136. package/dist/workout/fieldLabels.d.ts +5 -0
  1137. package/dist/workout/fieldLabels.d.ts.map +1 -0
  1138. package/dist/workout/fieldLabels.js +45 -0
  1139. package/dist/workout/fieldLabels.js.map +1 -0
  1140. package/dist/workout/index.d.ts +30 -0
  1141. package/dist/workout/index.d.ts.map +1 -0
  1142. package/dist/workout/index.js +34 -0
  1143. package/dist/workout/index.js.map +1 -0
  1144. package/dist/workout/land.d.ts +45 -0
  1145. package/dist/workout/land.d.ts.map +1 -0
  1146. package/dist/workout/land.js +280 -0
  1147. package/dist/workout/land.js.map +1 -0
  1148. package/dist/workout/landBatch.d.ts +60 -0
  1149. package/dist/workout/landBatch.d.ts.map +1 -0
  1150. package/dist/workout/landBatch.js +225 -0
  1151. package/dist/workout/landBatch.js.map +1 -0
  1152. package/dist/workout/landBatchPages.d.ts +31 -0
  1153. package/dist/workout/landBatchPages.d.ts.map +1 -0
  1154. package/dist/workout/landBatchPages.js +132 -0
  1155. package/dist/workout/landBatchPages.js.map +1 -0
  1156. package/dist/workout/landPages.d.ts +41 -0
  1157. package/dist/workout/landPages.d.ts.map +1 -0
  1158. package/dist/workout/landPages.js +153 -0
  1159. package/dist/workout/landPages.js.map +1 -0
  1160. package/dist/workout/landRunner.d.ts +42 -0
  1161. package/dist/workout/landRunner.d.ts.map +1 -0
  1162. package/dist/workout/landRunner.js +155 -0
  1163. package/dist/workout/landRunner.js.map +1 -0
  1164. package/dist/workout/movementType.d.ts +14 -0
  1165. package/dist/workout/movementType.d.ts.map +1 -0
  1166. package/dist/workout/movementType.js +16 -0
  1167. package/dist/workout/movementType.js.map +1 -0
  1168. package/dist/workout/plan.d.ts +21 -0
  1169. package/dist/workout/plan.d.ts.map +1 -0
  1170. package/dist/workout/plan.js +44 -0
  1171. package/dist/workout/plan.js.map +1 -0
  1172. package/dist/workout/planStore.d.ts +157 -0
  1173. package/dist/workout/planStore.d.ts.map +1 -0
  1174. package/dist/workout/planStore.js +282 -0
  1175. package/dist/workout/planStore.js.map +1 -0
  1176. package/dist/workout/precheckPrompt.d.ts +7 -0
  1177. package/dist/workout/precheckPrompt.d.ts.map +1 -0
  1178. package/dist/workout/precheckPrompt.js +35 -0
  1179. package/dist/workout/precheckPrompt.js.map +1 -0
  1180. package/dist/workout/progress.d.ts +12 -0
  1181. package/dist/workout/progress.d.ts.map +1 -0
  1182. package/dist/workout/progress.js +16 -0
  1183. package/dist/workout/progress.js.map +1 -0
  1184. package/dist/workout/receipt.d.ts +15 -0
  1185. package/dist/workout/receipt.d.ts.map +1 -0
  1186. package/dist/workout/receipt.js +128 -0
  1187. package/dist/workout/receipt.js.map +1 -0
  1188. package/dist/workout/review.d.ts +12 -0
  1189. package/dist/workout/review.d.ts.map +1 -0
  1190. package/dist/workout/review.js +15 -0
  1191. package/dist/workout/review.js.map +1 -0
  1192. package/dist/workout/routes.d.ts +13 -0
  1193. package/dist/workout/routes.d.ts.map +1 -0
  1194. package/dist/workout/routes.js +49 -0
  1195. package/dist/workout/routes.js.map +1 -0
  1196. package/dist/workout/wizard.d.ts +14 -0
  1197. package/dist/workout/wizard.d.ts.map +1 -0
  1198. package/dist/workout/wizard.js +20 -0
  1199. package/dist/workout/wizard.js.map +1 -0
  1200. package/dist/workout/write.d.ts +78 -0
  1201. package/dist/workout/write.d.ts.map +1 -0
  1202. package/dist/workout/write.js +607 -0
  1203. package/dist/workout/write.js.map +1 -0
  1204. package/dist/workout/xunjiBackfill.d.ts +36 -0
  1205. package/dist/workout/xunjiBackfill.d.ts.map +1 -0
  1206. package/dist/workout/xunjiBackfill.js +198 -0
  1207. package/dist/workout/xunjiBackfill.js.map +1 -0
  1208. package/dist/workout/xunjiPush.d.ts +33 -0
  1209. package/dist/workout/xunjiPush.d.ts.map +1 -0
  1210. package/dist/workout/xunjiPush.js +236 -0
  1211. package/dist/workout/xunjiPush.js.map +1 -0
  1212. package/dist/workout/xunjiRunner.d.ts +29 -0
  1213. package/dist/workout/xunjiRunner.d.ts.map +1 -0
  1214. package/dist/workout/xunjiRunner.js +110 -0
  1215. package/dist/workout/xunjiRunner.js.map +1 -0
  1216. package/dist/xunji/backfill.d.ts +63 -0
  1217. package/dist/xunji/backfill.d.ts.map +1 -0
  1218. package/dist/xunji/backfill.js +150 -0
  1219. package/dist/xunji/backfill.js.map +1 -0
  1220. package/dist/xunji/catalog.d.ts +53 -0
  1221. package/dist/xunji/catalog.d.ts.map +1 -0
  1222. package/dist/xunji/catalog.js +126 -0
  1223. package/dist/xunji/catalog.js.map +1 -0
  1224. package/dist/xunji/cli.d.ts +3 -0
  1225. package/dist/xunji/cli.d.ts.map +1 -0
  1226. package/dist/xunji/cli.js +15 -0
  1227. package/dist/xunji/cli.js.map +1 -0
  1228. package/dist/xunji/exitMap.d.ts +37 -0
  1229. package/dist/xunji/exitMap.d.ts.map +1 -0
  1230. package/dist/xunji/exitMap.js +42 -0
  1231. package/dist/xunji/exitMap.js.map +1 -0
  1232. package/dist/xunji/fetch.d.ts +77 -0
  1233. package/dist/xunji/fetch.d.ts.map +1 -0
  1234. package/dist/xunji/fetch.js +160 -0
  1235. package/dist/xunji/fetch.js.map +1 -0
  1236. package/dist/xunji/index.d.ts +21 -0
  1237. package/dist/xunji/index.d.ts.map +1 -0
  1238. package/dist/xunji/index.js +18 -0
  1239. package/dist/xunji/index.js.map +1 -0
  1240. package/dist/xunji/key.d.ts +77 -0
  1241. package/dist/xunji/key.d.ts.map +1 -0
  1242. package/dist/xunji/key.js +160 -0
  1243. package/dist/xunji/key.js.map +1 -0
  1244. package/dist/xunji/overlay-plan.d.ts +79 -0
  1245. package/dist/xunji/overlay-plan.d.ts.map +1 -0
  1246. package/dist/xunji/overlay-plan.js +145 -0
  1247. package/dist/xunji/overlay-plan.js.map +1 -0
  1248. package/dist/xunji/planSource.d.ts +40 -0
  1249. package/dist/xunji/planSource.d.ts.map +1 -0
  1250. package/dist/xunji/planSource.js +78 -0
  1251. package/dist/xunji/planSource.js.map +1 -0
  1252. package/dist/xunji/push.d.ts +55 -0
  1253. package/dist/xunji/push.d.ts.map +1 -0
  1254. package/dist/xunji/push.js +69 -0
  1255. package/dist/xunji/push.js.map +1 -0
  1256. package/dist/xunji/rateLimit.d.ts +44 -0
  1257. package/dist/xunji/rateLimit.d.ts.map +1 -0
  1258. package/dist/xunji/rateLimit.js +99 -0
  1259. package/dist/xunji/rateLimit.js.map +1 -0
  1260. package/dist/xunji/request.d.ts +48 -0
  1261. package/dist/xunji/request.d.ts.map +1 -0
  1262. package/dist/xunji/request.js +60 -0
  1263. package/dist/xunji/request.js.map +1 -0
  1264. package/dist/xunji/retry.d.ts +50 -0
  1265. package/dist/xunji/retry.d.ts.map +1 -0
  1266. package/dist/xunji/retry.js +106 -0
  1267. package/dist/xunji/retry.js.map +1 -0
  1268. package/dist/xunji/rows.d.ts +32 -0
  1269. package/dist/xunji/rows.d.ts.map +1 -0
  1270. package/dist/xunji/rows.js +74 -0
  1271. package/dist/xunji/rows.js.map +1 -0
  1272. package/dist/xunji/run-sync.d.ts +106 -0
  1273. package/dist/xunji/run-sync.d.ts.map +1 -0
  1274. package/dist/xunji/run-sync.js +223 -0
  1275. package/dist/xunji/run-sync.js.map +1 -0
  1276. package/dist/xunji/run.d.ts +56 -0
  1277. package/dist/xunji/run.d.ts.map +1 -0
  1278. package/dist/xunji/run.js +300 -0
  1279. package/dist/xunji/run.js.map +1 -0
  1280. package/dist/xunji/store.d.ts +31 -0
  1281. package/dist/xunji/store.d.ts.map +1 -0
  1282. package/dist/xunji/store.js +60 -0
  1283. package/dist/xunji/store.js.map +1 -0
  1284. package/dist/xunji/subcommands.d.ts +64 -0
  1285. package/dist/xunji/subcommands.d.ts.map +1 -0
  1286. package/dist/xunji/subcommands.js +203 -0
  1287. package/dist/xunji/subcommands.js.map +1 -0
  1288. package/dist/xunji/upsert.d.ts +61 -0
  1289. package/dist/xunji/upsert.d.ts.map +1 -0
  1290. package/dist/xunji/upsert.js +100 -0
  1291. package/dist/xunji/upsert.js.map +1 -0
  1292. package/package.json +7 -3
  1293. package/src/xunji/data//350/256/255/350/256/260/345/256/230/346/226/271/345/212/250/344/275/234.json +1099 -0
  1294. package/templates/help.html +1 -1
  1295. package/workflows/08-/350/272/253/344/275/223/347/273/206/350/212/202.md +60 -0
  1296. package/workflows/09-/350/272/253/346/235/220/347/205/247/347/211/207.md +98 -0
  1297. package/dist/render/profilePlate.d.ts +0 -17
  1298. package/dist/render/profilePlate.d.ts.map +0 -1
  1299. package/dist/render/profilePlate.js +0 -18
  1300. package/dist/render/profilePlate.js.map +0 -1
@@ -17,59 +17,36 @@
17
17
  * 图表页另加 CHARTS-HELPERS+buildChartsHelpersJs,图表 CSS 由其运行时注入)。
18
18
  * 复制文本一律 buildDataText(#77 契约):stat 投影 metrics 只收确定数字。
19
19
  * 本层不做取数(数据由 render/exercisePort.ts 备齐),不返空(缺失由数据层抛 missing-data)。
20
+ *
21
+ * **#453(地图 #156 页面族第 4 票,形状照已验样板 #423)**:分布/力量/有氧三支换融合版式——
22
+ * 卡清单(`Card`)各自判空+`renderTocBlock` 页内导航+`renderCaliberLine` 口径行+
23
+ * `shared/sourceLine.ts` 来源脚注+`assembleDocPage({printable:true})`(#448 透传位)+
24
+ * `shared/copyArea.ts` 三格式复制+`shared/emptyGuide.ts` 空态带下一句;类别色只走
25
+ * `exercise/categoryColors.ts` 的 `categoryColor()`。**#454(第 5 票)把趋势(`buildTrendDoc`)
26
+ * 与复盘(`buildRecapDoc`)两支也换成同一套融合版式**(卡清单逐卡判空+五窗同版+逐日表截断明示);
27
+ * `buildReviewDoc`(计划复盘)仍走老版式。本族不接四态头与变更卡载具(那是写操作器件,
28
+ * 只读页硬套会印出与事实不符的态标签)。
20
29
  */
21
- import { blocksCss, renderChartBlock, renderCopyBlock, renderDataTable, renderDisclosure, renderKpiGrid, renderListRows, renderPageShell, renderParamForm, } from 'base-paint/blocks';
22
- import { buildChartsHelpersJs, buildDataText, buildSharedHelpersJs, buildStyleSheet, fillTemplate } from 'base-paint';
30
+ import { renderCaliberLine, renderChartBlock, renderChips, renderDataTable, renderDisclosure, renderDistributionRows, renderFeedbackBlock, renderKpiGrid, renderListRows, renderParamForm, renderTocBlock, } from 'base-paint/blocks';
31
+ import { categoryColor } from '../exercise/categoryColors.js';
32
+ import { exerciseUiCss, factStrip, fmtNum, windowStrip } from '../exercise/sportUi.js';
33
+ import { assembleDocPage, metricsOf } from '../shared/docPage.js';
34
+ import { copyArea } from '../shared/copyArea.js';
35
+ import { emptyGuide } from '../shared/emptyGuide.js';
23
36
  /** envelope 头(值冻结对齐 cli/keys.ts ENVELOPE_VERSION/CALORIE_SKILL;测试钉死一致)。 */
24
37
  const DOC_VERSION = '0.1.0';
25
38
  const DOC_SKILL = 'calorie';
26
- /** 内容页壳(裸标记+CONTENT 槽;包裹约定:资产裸文本+填充器包裹,标记不得预包裹)。
27
- * wrap ilife-page 兼容既有 --html 断言。 */
28
- const DOC_SHELL = '<!doctype html>\n<html lang="zh-CN">\n<head>\n<meta charset="utf-8">\n' +
29
- '<meta name="viewport" content="width=device-width,initial-scale=1">\n' +
30
- '<title>卡路里·运动移植</title>\n<!--SHARED-CSS-->\n</head>\n<body>\n' +
31
- '<div class="wrap ilife-page">\n<!--CONTENT-->\n</div>\n<!--SHARED-HELPERS-->\n</body>\n</html>';
32
- /** 图表页壳(多一个 CHARTS-HELPERS 标记,图表 CSS 由 charts helpers 运行时注入)。 */
33
- const DOC_SHELL_CHARTS = '<!doctype html>\n<html lang="zh-CN">\n<head>\n<meta charset="utf-8">\n' +
34
- '<meta name="viewport" content="width=device-width,initial-scale=1">\n' +
35
- '<title>卡路里·运动移植</title>\n<!--SHARED-CSS-->\n</head>\n<body>\n' +
36
- '<div class="wrap ilife-page">\n<!--CONTENT-->\n</div>\n<!--SHARED-HELPERS-->\n<!--CHARTS-HELPERS-->\n</body>\n</html>';
37
- function assemble(title, eyebrow, subtitle, content, charts) {
38
- const assets = {
39
- sharedCssText: buildStyleSheet().css + '\n' + blocksCss(),
40
- sharedHelpersJs: buildSharedHelpersJs(),
41
- };
42
- if (charts)
43
- assets.chartsHelpersJs = buildChartsHelpersJs();
44
- const body = renderPageShell({
45
- title,
46
- ...(eyebrow ? { eyebrow } : {}),
47
- ...(subtitle ? { subtitle } : {}),
48
- content,
49
- });
50
- return fillTemplate({ template: charts ? DOC_SHELL_CHARTS : DOC_SHELL, assets, content: body }).html;
51
- }
52
- function copyBlock(title, input) {
53
- return renderCopyBlock({ title, dataText: buildDataText(input) });
54
- }
39
+ /** 本文件各页共用的 head 标题(整页模板住 `src/shared/docPage.ts`,标题走参数)。 */
40
+ const DOC_TITLE = '卡路里·运动移植';
55
41
  function fmt(n) {
56
42
  if (n === null || n === undefined)
57
43
  return '—';
58
44
  return String(n);
59
45
  }
60
- /** 复制投影 stat-metrics 只收确定数字(冻结口径:null/undefined 不进投影)。 */
61
- function metricsOf(obj) {
62
- const out = {};
63
- for (const [k, v] of Object.entries(obj)) {
64
- if (v !== null && v !== undefined)
65
- out[k] = v;
66
- }
67
- return out;
68
- }
69
46
  function fmtPace(p) {
70
47
  if (p === null || p === undefined)
71
48
  return '—';
72
- return String(p) + ' 分/公里';
49
+ return fmtNum(p, 1) + ' 分/km';
73
50
  }
74
51
  /** 逐条记录表(100 条截断明示,沿 R3 口径;备注仅展示,不做筛选维度)。 */
75
52
  const RECORD_CAP = 100;
@@ -82,387 +59,838 @@ function windowForm(start, end, extra) {
82
59
  description: extra,
83
60
  });
84
61
  }
85
- /* ── 力量训练总览(exercise_strength.html 对照:按动作聚合+重量轨迹+逐条记录) ── */
86
- export function buildStrengthDoc(v) {
87
- const parts = [
88
- windowForm(v.start, v.end, '力量子集(库内分类实填优先、缺失按名推断;旧配速/时长口径不在此页)'),
89
- renderKpiGrid([
90
- { label: '动作数', value: String(v.movementCount), unit: '个', detail: v.start + ' ~ ' + v.end },
91
- { label: '总组数', value: String(v.totalSets), unit: '组' },
92
- { label: '总重量', value: fmt(v.totalVolumeKg), unit: 'kg', detail: '单侧口径 Σload×reps(沿旧模板)' },
93
- { label: '总次数', value: fmt(v.totalReps), unit: '次' },
94
- ]),
95
- ];
96
- let charts = false;
97
- const trail = v.trail.filter((p) => p.volumeKg !== null);
98
- if (trail.length > 0) {
99
- parts.push(renderChartBlock({
100
- kind: 'line',
101
- title: '重量轨迹(近 10 个训练日)',
102
- input: { items: v.trail.map((p) => ({ label: p.date.slice(5), value: p.volumeKg })) },
103
- }));
104
- charts = true;
62
+ function shell(card) {
63
+ return '<section id="' + card.id + '">'
64
+ + (card.head === undefined ? '' : '<h2>' + card.head + '</h2>')
65
+ + card.html + '</section>';
66
+ }
67
+ /** 窗口卡:这一页看的是哪一段(开始/结束两个真日期)。 */
68
+ function windowCard(start, end, description) {
69
+ return { id: 'sec-window', label: '窗口', html: windowForm(start, end, description) };
70
+ }
71
+ /** 数值格的人话写法:缺值一律「—」(不空着、也不编 0);`unit` 空串即不带单位。
72
+ * #544:显示层取整走 `sportUi.fmtNum()`(整数不带小数点;库内浮点尘不上屏)。
73
+ * 计数类单位(次/组/条/个/分钟/空串)取 0 位小数,量值类(卡/kg/km/公里)取 1 位。 */
74
+ const INT_UNITS = new Set(['', '次', '组', '条', '个', '分钟', '卡']);
75
+ function numUnit(v, unit) {
76
+ if (v === null || v === undefined)
77
+ return '';
78
+ const n = fmtNum(v, INT_UNITS.has(unit) ? 0 : 1);
79
+ return unit === '' ? n : n + ' ' + unit;
80
+ }
81
+ /** 窗内天数(闭区间;只做天数差,不当取数口径)——窗口条胶囊的唯一出处。 */
82
+ function windowDays(start, end) {
83
+ return Math.round((Date.parse(end) - Date.parse(start)) / 86400000) + 1;
84
+ }
85
+ /** 折线纵轴三件套(#544 视觉第 1 轮整改;形状照 `analysis/multiTrendPage.ts:65` 的 `weightAxisOf`)。
86
+ *
87
+ * ① **刻度**:共享层折线**缺省不给刻度标注**(`spec/charts.ts` 的 `yTicks` 缺省 → 0 条,图中只剩网格线),
88
+ * 不传就读不出量级 —— 同族先例 `analysis-deficit-385` 已把这条定成「本页漏传参数,本页补 `yTicks:3`」,
89
+ * 本族三张折线照办;`format` 给整数原样、带小数的一位(口径与 KPI 卡同:读数不印浮点尘)。
90
+ * ② **量程**:一律显式给 `yMin`/`yMax`(见 `valueAxisOf()`),理由有三条,都是量程的语义而不是观感:
91
+ * ① **最小值恒为 0**:这三条纵轴量的都是「消耗了多少卡/举起了多少 kg」,负值不存在——
92
+ * 原来的 `lo` 由共享层缺省域「数据两端各外扩 6%」算出来,窗内最小日要是 0,`lo` 就成了负数
93
+ * (#268 终审席打回项 P1-5:38/39 两页纵轴最低刻度印出 `-87.4`);
94
+ * ② **刻度落在整数上**:不给界时刻度值是「域两端内插」的产物,实测印出过 `1065.1`/`2217.7`
95
+ * (38)、`31.4`/`1118.0`/`2204.5`(37)这类带 `.0`/`.5` 尾巴的读数——刻度是**刻度**,不是量出来的数;
96
+ * ③ **线不贴上下沿**:显式给界会让共享层的「峰值余量」(`lineDomainOf` 只补派生域)失效,
97
+ * 故峰值与顶端刻度之间那点余量由 `setAxisRange()` 自己保证。 */
98
+ function valueAxisOf(values) {
99
+ // 整数原样、小数一位:刻度是取整后的整数,`toFixed(1)` 只是兜住极小量程的尾巴(不印浮点尘)。
100
+ const format = (v) => (Number.isInteger(v) ? String(v) : v.toFixed(1));
101
+ const nums = values.filter((v) => typeof v === 'number' && Number.isFinite(v));
102
+ // 数的顶点走 `reduce`(不铺参:窗内最多 366 个点,`Math.max(...nums)` 会压栈)。
103
+ // 全空或全零:`maxOf` 取 1,域退化成 0…1 而不是 0…0(量程为 0 会让刻度三条叠在同一处)。
104
+ let peak = 0;
105
+ for (const v of nums)
106
+ if (v > peak)
107
+ peak = v;
108
+ const maxOf = peak > 0 ? peak : 1;
109
+ // 刻度=`hi·i/(条数−1)`:`hi` 是 `step×(条数−1)` 的整数倍,三条刻度才全是步长的整数倍
110
+ // (否则会印出 `600.2`/`1200.4` 这种「峰值本身」——那是读数,不是刻度)。
111
+ return { yTicks: TICK_COUNT, yMin: 0, yMax: axisHeightOf(maxOf), format };
112
+ }
113
+ /** 纵轴刻度条数(#544:三条 —— 共享层 `yTicks` 的缺省是 0 条,不显式给就一个刻度都没有)。 */
114
+ const TICK_COUNT = 3;
115
+ /** 线位下限/上限:峰值至少离顶端刻度一档边距(0.88),也别把自己缩在图高一角(0.45)。 */
116
+ const LINE_TOP_LIMIT = 0.88;
117
+ const LINE_BOTTOM_LIMIT = 0.45;
118
+ /** 刻度步长候选序列(1/2/5×10ᵏ 里 ≥ 入参的最小一个)。 */
119
+ function niceStepAtOrAbove(v) {
120
+ const mag = Math.pow(10, Math.floor(Math.log10(v)));
121
+ for (const m of [1, 2, 5, 10])
122
+ if (v <= m * mag)
123
+ return Math.max(1, m * mag);
124
+ return Math.max(1, 10 * mag);
125
+ }
126
+ /** 上界(=顶端那条刻度):**让峰值落在图高 0.60 处**是这里的唯一目标——量程与刻度是同一件事的两面
127
+ * (`hi = step×(条数−1)`),故直接按「哪一档 1/2/5×10ᵏ 步长把峰值放在最合适的位置」来挑:
128
+ * 比值 `peak/hi` 落在 0.45–0.88 之间给低分(离 0.60 越近越低),越界按距离重罚,
129
+ * **步长不是整数再加一点罚**(刻度值会带 `.5` 尾巴,那正是 K2 那条打回项),取罚分最小、并列取较大步长。
130
+ *
131
+ * 为什么步长非要是 1/2/5×10ᵏ:三条刻度=`hi·i/2`,只有 `hi` 是步长整数倍时刻度才全是整数
132
+ * (否则会印出 `600.2`/`1200.4` 这种「峰值本身」——那是读数,不是刻度)。
133
+ * 例:峰值 500 ⇒ `0/500/1000`;峰值 1250 ⇒ `0/1000/2000`;峰值 2753 ⇒ `0/2000/4000`。 */
134
+ function axisHeightOf(maxOf) {
135
+ const base = niceStepAtOrAbove(Math.max(maxOf, 1) * 0.4);
136
+ let best = { step: base, score: Infinity };
137
+ for (const k of [0.5, 1, 2, 5, 10, 20, 50, 100, 200]) {
138
+ const step = Math.max(1, base * k);
139
+ if (step * (TICK_COUNT - 1) < maxOf)
140
+ continue; // 刻度带撑不住峰值 ⇒ 这一档不用看
141
+ const ratio = maxOf / (step * (TICK_COUNT - 1));
142
+ const integer = Number.isInteger(step) ? 0 : 0.1; // 刻度值带小数尾巴(`2204.5` 那类)要罚
143
+ const score = ratio > LINE_TOP_LIMIT || ratio < LINE_BOTTOM_LIMIT
144
+ ? Math.abs(ratio - 0.6) * 2 + integer
145
+ : Math.abs(ratio - 0.6) * 0.1 + integer;
146
+ if (score <= best.score)
147
+ best = { step, score };
105
148
  }
106
- parts.push(renderDataTable({
107
- columns: [
108
- { key: 'movement', label: '动作' },
109
- { key: 'sets', label: '组数', align: 'right' },
110
- { key: 'volumeKg', label: '总重量kg', align: 'right' },
111
- { key: 'reps', label: '总次数', align: 'right' },
112
- ],
113
- rows: v.byMovement.map((m) => ({ movement: m.movement, sets: m.sets, volumeKg: m.volumeKg, reps: m.reps })),
114
- caption: '按动作聚合(' + v.start + ' ~ ' + v.end + ')',
115
- emptyText: '本窗无动作聚合',
116
- }));
117
- const total = v.rows.length;
118
- parts.push(renderDataTable({
119
- columns: [
120
- { key: 'date', label: '日期' },
121
- { key: 'type', label: '动作' },
122
- { key: 'load', label: '重量×次数' },
123
- { key: 'note', label: '备注' },
124
- ],
125
- rows: v.rows.slice(0, RECORD_CAP).map((r) => ({
126
- date: r.date,
127
- type: r.type,
128
- load: (r.loadKg === null ? '—' : String(r.loadKg) + 'kg') + '×' + (r.reps === null ? '—' : String(r.reps)),
129
- note: r.note === '' ? '—' : r.note,
130
- })),
131
- caption: '力量逐条记录(共 ' + total + ' 条' + (total > RECORD_CAP ? ',仅列前 ' + RECORD_CAP + ' 条' : '') + ')',
132
- emptyText: '本窗无逐条记录',
133
- }));
134
- parts.push(copyBlock('复制数据', {
135
- envelope: {
136
- version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.exercise-strength',
149
+ return best.step * (TICK_COUNT - 1);
150
+ }
151
+ /** 折线卡的横轴日期标尺(#268 终审席 K4 的处置,第 2 版)。
152
+ *
153
+ * **为什么不加这把尺的初版被视觉席打回**(复评 r3:39 页桌面表尺标签压在 07-10 一带、读成
154
+ * `02-2704-01 05-05 …`):初版一页印 **7** 条(含窗口首尾两条),条与条只隔 4.05% 宽(桌面 36px、
155
+ * 手机 20px),而标签本身就要 31px —— 必然叠字;且首尾两条与折线**自带**的首尾横轴标签逐字重复
156
+ * (共享层折线的 X 标签口径是 `'edge'`)。
157
+ *
158
+ * 本版的形状:**只出窗口内部 5 条**(首尾让给折线自己的那两条),按**等宽槽**摆(`flex:1 1 0`),
159
+ * 槽宽=容器宽÷5(桌面 176px、手机 71px),标签 26px ⇒ 相邻最小空档约 45px,三档都不叠。
160
+ * 一把尺要两样东西才算「轴」:一条细轴线 等距刻度点,故每个槽里自带一段轴线与一个小圆点,
161
+ * 尺因此读成一条时间轴,而不是一行浮在空中的日期。
162
+ *
163
+ * 退化:点数 < 45(短窗)不出——那一档日期本来就稀,多点两条标签反而添乱;点数不整除 5
164
+ * 取 4 条(见 `INTERIOR_COUNT`)。 */
165
+ const RULER_MIN_DAYS = 45;
166
+ /** 标尺槽数:内部日期的枚数(首尾归折线自己的标签;5 条在 390 档仍有约 45px 空档)。 */
167
+ const INTERIOR_COUNT = 5;
168
+ /** 折线块画布容器的开标签(日期轴从**结构位**注入,见 `withXRuler`)。 */
169
+ const S544_CANVAS_OPEN = '<div class="ilife-block-chart-block-canvas">';
170
+ /** 日期轴的槽串(只出窗口内部几条日期;取数与退化见 `RULER_MIN_DAYS`)。 */
171
+ function xRulerOf(items) {
172
+ const n = items.length;
173
+ if (n < RULER_MIN_DAYS)
174
+ return '';
175
+ const count = n % INTERIOR_COUNT === 0 ? INTERIOR_COUNT - 1 : INTERIOR_COUNT;
176
+ const cells = [];
177
+ for (let i = 1; i <= count; i += 1) {
178
+ const idx = Math.round((n - 1) * (i / (count + 1)));
179
+ const label = items[idx] === undefined ? '' : items[idx].label; // 逐字复用图上那几条日期
180
+ cells.push('<span class="sui-xruler-t"><i></i>' + label + '</span>');
181
+ }
182
+ return '<div class="sui-xruler" aria-hidden="true">' + cells.join('') + '</div>';
183
+ }
184
+ /** 折线卡 + 日期轴(#268 K4 第二版):标尺**必须挂在卡片内**(视觉复评 r3b:初版挂在卡外,
185
+ * 整条轴线比绘图区左宽 100px、还把卡片下边框顶出去),落点=画布容器的**末尾**(SVG 之后)。
186
+ * `renderChartBlock` 的 title 只会进 `esc()` 后的文本节点(哨兵都逃不出来),故只从结构位注入。 */
187
+ function withXRuler(chart, items) {
188
+ const ruler = xRulerOf(items);
189
+ if (ruler === '')
190
+ return chart;
191
+ const open = chart.indexOf(S544_CANVAS_OPEN);
192
+ const end = chart.lastIndexOf('</div>'); // 容器的收标签=整卡的收标签
193
+ if (open === -1 || end <= open)
194
+ return chart; // 结构变了就退回不带轴(不硬塞)
195
+ return chart.slice(0, end) + ruler + chart.slice(end);
196
+ }
197
+ /** 本族页内小样式(#544)。落本件常量,不新开样式件;`<style>` 段不进可见文本,探针无感。
198
+ * **#544 视觉第 1 轮整改三处**(都在本件内联规则里做,不碰共用层):
199
+ * ① 窄屏页内导航:共享页框在 ≤640 把胶囊轨切成横滑(`nowrap + overflow-x:auto`,滚动条还被藏),
200
+ * 实测 390 档第 5、6 枚胶囊被拦腰切断且无滚动提示 —— 本族窄屏改回**换行铺开**(与桌面同规则);
201
+ * ② 窗口卡的「开始/结束」两格是只读回显(字段本身由 `exercise-port-111` 钉死,不能删),
202
+ * 但共用件给每格 `margin:8px 0`,桌面档拉出约 200px 空洞 —— 本族把它收成两格一行;
203
+ * ③ 窄屏分布条给 4px 下沿(`K5`:占比 <1% 的条实渲不到 1px,肉眼读成空行)。
204
+ *
205
+ * **#544 终审席(票 #268 §4/§5)四条打回项**也落在这一段(都不出本件):
206
+ * ① `E1` 触摸目标:本族页级规则原写 `min-height:38px`,把 #525 配方给全宽档的 44px **压下来了**
207
+ * (实测 31–39 九页输入框 1440 档 434×38)——改回 44px(= HELP 参照页与 `.ilife-copy-btn` 同值);
208
+ * ② `K1` 字号混用:原本只把 `#sec-figures` **首卡**值放大到 28px,一排四卡字号 28/22 混用、基线错开——
209
+ * 整排退回公共层那一档 22px(同批 01–30 页的读数),本段不再改 KPI 字号;
210
+ * ③ `K5` 细条:`renderDistributionRows` 的填充宽=占比(行内联 `width:<pct>%`,共用件只收百分比),
211
+ * 给 `.ilife-block-dist-row-fill` 加 4px 下限——**几何在 CSS 层解决**,不改共用件的入参口径,
212
+ * 也不在页面里新算第二个百分比;
213
+ * ④ `P1-6/K6` 三节无可见标题(核心数字/类型分布/高频运动):节标题由 `shell()` 写进 `<section>`
214
+ * 首个子节点,样式落本段 `#sec-figures > h2,…` 一条(沿用公共层卡题那一档:15px/700)。 */
215
+ const S544_CSS = '<style>'
216
+ + '@media (max-width:820px){.ilife-page .ilife-block-toc{flex-wrap:wrap;overflow-x:visible}'
217
+ + '.ilife-page .ilife-block-toc a{flex:0 1 auto}}'
218
+ + '#sec-window .ilife-block-param-form{margin:12px 0 0}'
219
+ + '#sec-window .ilife-block-param-form-field{display:inline-block;width:calc(50% - 6px);margin:6px 0}'
220
+ + '#sec-window .ilife-block-param-form-field + .ilife-block-param-form-field{margin-left:12px}'
221
+ + '#sec-window .ilife-block-param-form-input{min-height:44px}'
222
+ + '.ilife-page .ilife-block-dist-row-fill{min-width:4px}'
223
+ // 日期轴(#268 K4 第二版):一条细轴线 + 等宽槽里的刻度点与日期。轴线与刻度点必须是
224
+ // **同一层两个元素**(同一层各自的伪元素会互相盖住),刻度的圆点用 `i` 的伪元素画。
225
+ // 内距**按百分比**(不能写死 px):折线 SVG 的绘图区两侧在 viewBox 里的位置是定值
226
+ // (`charts.ts`:x0=58、x1=566,viewBox 宽 580),而 SVG 盒宽随卡片变(桌面 850px、手机 328px)
227
+ // ⇒ 左=58/580=10%,右=1−566/580=2.414%。`padding` 里再让出一半槽宽(5 个槽的槽心因此落到
228
+ // 58+槽宽×(i−0.5),与绘图区 1/6…5/6 的锚点同列)。写成定值 px 时手机档会偏 25px(≈18 天)——
229
+ // 视觉复评 r3b/r3c 连量两轮的那一笔。
230
+ + '.sui-xruler{position:relative;display:flex;align-items:flex-start;margin:2px 2.414% 0 10%;'
231
+ + 'padding-left:4%;padding-right:4%}'
232
+ + '.sui-xruler::before{content:"";position:absolute;left:0;right:0;top:3px;height:1px;background:var(--line)}'
233
+ + '.sui-xruler-t{position:relative;flex:1 1 0;min-width:26px;text-align:center;font-size:11px;'
234
+ + 'line-height:1.3;color:var(--fg2);font-variant-numeric:tabular-nums;white-space:nowrap}'
235
+ + '.sui-xruler-t > i{position:relative;display:inline-block;width:7px;height:7px}'
236
+ + '.sui-xruler-t > i::before{content:"";position:absolute;left:3px;top:0;width:1px;height:3px;background:var(--line)}'
237
+ + '.sui-xruler-t > i::after{content:"";position:absolute;left:1.5px;top:3px;width:4px;height:4px;'
238
+ + 'border-radius:50%;background:var(--fg3)}'
239
+ + '#sec-figures > h2,#sec-category > h2,#sec-badges > h2{margin:0;font-size:15px;font-weight:700;color:var(--fg)}'
240
+ + '</style>';
241
+ /** 来源脚注卡(#544 形状化,照 #523 的 `footFacts`):键值行「数据来源/窗口/记录数」,
242
+ * 三个独立文本节点,不再产 `数据来源 · <来源> · 起 → 止 · 共 N 条` 那种 `·` 串,
243
+ * 来源名给读者话(库表名只留复制载荷里)。共用层口径统一归 #470。 */
244
+ function footFacts(source, start, end, count) {
245
+ return {
246
+ id: 'sec-source',
247
+ label: '数据来源',
248
+ html: factStrip([
249
+ { k: '数据来源', v: source },
250
+ { k: '窗口', v: start + ' → ' + end },
251
+ { k: '记录数', v: '共 ' + fmtNum(count, 0) + ' 条' },
252
+ ]),
253
+ };
254
+ }
255
+ /** 页尾装配(#544,照 #523 的 `pageBody` 顺序):页内导航 + 口径行(一条事实一行)
256
+ * + 卡 + 三格式复制区(五页装配的唯一出口,免得各页抄一遍)。
257
+ * 页内样式(`exerciseUiCss`+本族小样式)与窗口条由各页组在 `content` 首两项(同 #523)。 */
258
+ function finishPage(cards, calibers, envelopeKey, metrics) {
259
+ return [
260
+ renderTocBlock({ items: cards.map((c) => ({ id: c.id, text: c.label })) }),
261
+ calibers.map((t) => renderCaliberLine(t)).join(''),
262
+ cards.map(shell).join(''),
263
+ copyArea({
137
264
  data: {
138
- metrics: metricsOf({
139
- movementCount: v.movementCount, totalSets: v.totalSets,
140
- totalVolumeKg: v.totalVolumeKg, totalReps: v.totalReps,
141
- }),
265
+ envelope: {
266
+ version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: envelopeKey,
267
+ data: { metrics: metricsOf(metrics) },
268
+ },
142
269
  },
270
+ }),
271
+ ].join('');
272
+ }
273
+ /** 库内分类 → 类别色键(`categoryColors.ts` 的四键);表外分类不给键。 */
274
+ const CATEGORY_KEYS = { 力量: 'strength', 有氧: 'cardio', 柔韧: 'flex', 日常: 'daily' };
275
+ /** 分类色:只从 `categoryColor()`(技能层单源色表)取 hex;表外分类返回 `{}`
276
+ * (不给色=区块回落到冻结 token 缺省色,本层不写第二份色表、也不写 token 名)。 */
277
+ function colorOf(category) {
278
+ const key = CATEGORY_KEYS[category];
279
+ const hex = key === undefined ? undefined : categoryColor(key);
280
+ return hex === undefined ? {} : { color: hex };
281
+ }
282
+ /* ── 力量训练总览(exercise_strength.html 对照:#453 融合版式:动作表+重量轨迹+逐条记录) ── */
283
+ /** 力量页的来源句(读者话;库表名不上屏)。 */
284
+ const STRENGTH_SOURCE = '运动记录(本窗未删除的力量行)';
285
+ /** 力量页口径行(#544:一条事实一行;第一条保留 `口径:` 前缀,回归判据读它)。 */
286
+ const STRENGTH_CALIBERS = [
287
+ '口径:组数=本窗动作记录条数',
288
+ '总重量=逐条重量乘次数累加,缺一即显「—」',
289
+ '总次数=本窗各条次数之和',
290
+ ];
291
+ export function buildStrengthDoc(v) {
292
+ const hasRows = v.byMovement.length > 0;
293
+ const cards = [
294
+ windowCard(v.start, v.end, '只数分类为力量的记录。库内分类实填优先,缺失按名推断。配速与时长口径不在此页'),
295
+ {
296
+ id: 'sec-figures',
297
+ label: '核心数字', head: '核心数字',
298
+ // #544:主角(总重量)排首卡吃 28px;窗口与口径事实住窗口条与口径行,卡里只报数。
299
+ html: renderKpiGrid([
300
+ { label: '总重量', value: numUnit(v.totalVolumeKg, 'kg') },
301
+ { label: '总次数', value: numUnit(v.totalReps, '次') },
302
+ { label: '动作数', value: String(v.movementCount), unit: '个' },
303
+ { label: '总组数', value: String(v.totalSets), unit: '组' },
304
+ ]),
143
305
  },
144
- }));
145
- return assemble('力量训练总览 ' + v.start + ' ~ ' + v.end, 'calorie.view.exercise-strength · 运动移植域', '按动作聚合+重量轨迹(无重量数据即“—”,不编数)', parts.join(''), charts);
306
+ ];
307
+ // 口径写在动作表的标题里(票面第 2 条):窗口 「单侧口径 Σkg×次数」,全页只此一处。
308
+ if (hasRows) {
309
+ cards.push({
310
+ id: 'sec-table',
311
+ label: '按动作聚合',
312
+ html: renderDataTable({
313
+ columns: [
314
+ { key: 'movement', label: '动作' },
315
+ { key: 'sets', label: '组数', align: 'right' },
316
+ { key: 'volumeKg', label: '总重量', align: 'right' },
317
+ { key: 'reps', label: '总次数', align: 'right' },
318
+ ],
319
+ rows: v.byMovement.map((m) => ({
320
+ movement: m.movement,
321
+ sets: numUnit(m.sets, '组'),
322
+ volumeKg: numUnit(m.volumeKg, 'kg'),
323
+ reps: numUnit(m.reps, '次'),
324
+ })),
325
+ caption: '按动作聚合(' + v.start + ' ~ ' + v.end + ')。单侧口径 Σkg×次数:逐条重量乘次数累加,'
326
+ + '重量或次数缺一即显「—」',
327
+ }),
328
+ });
329
+ }
330
+ const trail = v.trail.filter((p) => p.volumeKg !== null);
331
+ // #623:轨迹轴按轨迹自身首末年派生 crossYear(与周柱按页窗口派生不同:轨迹只看近 10 个训练日,
332
+ // 页窗口跨年而轨迹同年时不许补年份,反之页窗口同年而轨迹跨年仍补全年;与 axisDateLabel 同一口径)。
333
+ const trailCrossYear = trail.length > 0
334
+ && trail[0].date.slice(0, 4) !== trail[trail.length - 1].date.slice(0, 4);
335
+ const trailItems = trail.map((p) => ({ label: axisDateLabel(trailCrossYear)(p.date), value: Number(fmtNum(p.volumeKg)) }));
336
+ const charts = trailItems.length > 0;
337
+ if (charts) {
338
+ cards.push({
339
+ id: 'sec-chart',
340
+ label: '重量轨迹',
341
+ html: renderChartBlock({
342
+ kind: 'line',
343
+ title: '重量轨迹(近 10 个训练日)',
344
+ // #544:纵轴刻度与量程走 `valueAxisOf()`(全等序列不再贴底,同族先例见该函数注释)。
345
+ input: { items: trailItems, options: valueAxisOf(trailItems.map((p) => p.value)) },
346
+ }),
347
+ });
348
+ }
349
+ if (hasRows) {
350
+ const total = v.rows.length;
351
+ cards.push({
352
+ id: 'sec-detail',
353
+ label: '逐条记录',
354
+ html: renderDataTable({
355
+ columns: [
356
+ { key: 'date', label: '日期' },
357
+ { key: 'type', label: '动作' },
358
+ { key: 'load', label: '重量×次数' },
359
+ { key: 'note', label: '备注' },
360
+ ],
361
+ rows: v.rows.slice(0, RECORD_CAP).map((r) => ({
362
+ date: r.date,
363
+ type: r.type,
364
+ load: numUnit(r.loadKg, 'kg') + '×' + numUnit(r.reps, ''),
365
+ note: r.note.trim() === '' ? '—' : r.note,
366
+ })),
367
+ caption: '力量逐条记录(共 ' + total + ' 条'
368
+ + (total > RECORD_CAP ? ',本页只列前 ' + RECORD_CAP + ' 条' : '') + ')',
369
+ }),
370
+ });
371
+ }
372
+ else {
373
+ cards.push({
374
+ id: 'sec-empty',
375
+ label: '按动作聚合',
376
+ html: emptyGuide({ icon: '🏋️', text: '本窗还没有力量训练记录', hint: '说「记力量训练」就能记下第一条' }),
377
+ });
378
+ }
379
+ cards.push(footFacts(STRENGTH_SOURCE, v.start, v.end, v.rows.length));
380
+ return assembleDocPage({
381
+ docTitle: '卡路里 力量训练总览',
382
+ title: '力量训练总览',
383
+ // #544 视觉第 1 轮:眉标曾试改成与 H1 逐字一致(`力量训练总览`),实测撞 `exercise-accept-267.test.mjs:528`
384
+ // 的「眉标=它自己那一族」钉子(`'力量训练总览' !== '运动力量总览'`)——那件不在本票写集,故**回退**,
385
+ // 两处命名并存记进证据件 §八(转票处置,本票不自行放宽别席判据)。
386
+ eyebrow: '力量训练总览',
387
+ subtitle: '按动作聚合+重量轨迹(缺值显「—」,不编数)',
388
+ content: exerciseUiCss() + S544_CSS
389
+ + windowStrip(v.start, v.end, windowDays(v.start, v.end) + ' 天')
390
+ + finishPage(cards, STRENGTH_CALIBERS, '力量训练总览', {
391
+ movementCount: v.movementCount, totalSets: v.totalSets,
392
+ totalVolumeKg: v.totalVolumeKg, totalReps: v.totalReps,
393
+ }),
394
+ charts,
395
+ printable: true,
396
+ pageUi: true,
397
+ });
146
398
  }
147
- /* ── 有氧训练总览(exercise_cardio.html 对照:按类型聚合+配速+逐条记录) ── */
399
+ /* ── 有氧训练总览(exercise_cardio.html 对照:#453 融合版式:类型表+类型图+逐条记录) ── */
400
+ /** 有氧页的来源句(读者话;库表名不上屏)。 */
401
+ const CARDIO_SOURCE = '运动记录(本窗未删除的有氧行)';
402
+ /** 有氧页口径行(#544:一条事实一行;第一条保留 `口径:` 前缀,回归判据读它)。 */
403
+ const CARDIO_CALIBERS = [
404
+ '口径:次数=本窗记录条数',
405
+ '时长=分钟,距离=km',
406
+ '步速=分钟÷km,没有距离就不算步速',
407
+ '缺一格显「—」,不空着也不编 0',
408
+ ];
148
409
  export function buildCardioDoc(v) {
149
- const parts = [
150
- windowForm(v.start, v.end, '有氧子集(库内分类实填优先、缺失按名推断)'),
151
- renderKpiGrid([
152
- { label: '次数', value: String(v.sessions), unit: '次', detail: v.start + ' ~ ' + v.end },
153
- { label: '总时长', value: fmt(v.totalMinutes), unit: '分钟' },
154
- { label: '总距离', value: fmt(v.totalDistanceKm), unit: '公里' },
155
- { label: '平均配速', value: fmtPace(v.avgPaceMinPerKm), detail: '总分钟/总公里(距离加权,沿旧模板)' },
156
- ]),
410
+ const hasRows = v.byType.length > 0;
411
+ const cards = [
412
+ windowCard(v.start, v.end, '只数分类为有氧的记录。库内分类实填优先,缺失按名推断。柔韧与日常不在此页'),
413
+ {
414
+ id: 'sec-figures',
415
+ label: '核心数字', head: '核心数字',
416
+ // #544:主角(总时长)排首卡吃 28px;窗口与口径事实住窗口条与口径行,卡里只报数。
417
+ html: renderKpiGrid([
418
+ { label: '总时长', value: numUnit(v.totalMinutes, '分钟') },
419
+ { label: '总距离', value: numUnit(v.totalDistanceKm, 'km') },
420
+ { label: '次数', value: String(v.sessions), unit: '次' },
421
+ { label: '平均步速', value: fmtPace(v.avgPaceMinPerKm) },
422
+ ]),
423
+ },
157
424
  ];
158
- let charts = false;
159
- if (v.byType.length > 0) {
160
- parts.push(renderChartBlock({
161
- kind: 'bar',
162
- title: '按类型次数',
163
- input: { items: v.byType.map((t) => ({ label: t.type, value: t.sessions })) },
164
- }));
165
- charts = true;
425
+ if (hasRows) {
426
+ cards.push({
427
+ id: 'sec-table',
428
+ label: '按类型聚合',
429
+ html: renderDataTable({
430
+ columns: [
431
+ { key: 'type', label: '类型' },
432
+ { key: 'sessions', label: '次数', align: 'right' },
433
+ { key: 'minutes', label: '时长', align: 'right' },
434
+ { key: 'km', label: '距离', align: 'right' },
435
+ { key: 'pace', label: '步速', align: 'right' },
436
+ ],
437
+ rows: v.byType.map((t) => ({
438
+ type: t.type,
439
+ sessions: numUnit(t.sessions, '次'),
440
+ minutes: numUnit(t.minutes, '分钟'),
441
+ km: numUnit(t.distanceKm, 'km'),
442
+ pace: fmtPace(t.paceMinPerKm),
443
+ })),
444
+ caption: '按类型聚合。缺一格显「—」,不空着',
445
+ }),
446
+ });
447
+ cards.push({
448
+ id: 'sec-chart',
449
+ label: '按类型次数',
450
+ html: renderChartBlock({
451
+ kind: 'bar',
452
+ title: '按类型次数',
453
+ input: { items: v.byType.map((t) => ({ label: t.type, value: t.sessions })) },
454
+ }),
455
+ });
456
+ cards.push({
457
+ id: 'sec-detail',
458
+ label: '逐条记录',
459
+ html: renderDataTable({
460
+ columns: [
461
+ { key: 'date', label: '日期' },
462
+ { key: 'type', label: '类型' },
463
+ { key: 'minutes', label: '时长' },
464
+ { key: 'km', label: '距离' },
465
+ { key: 'note', label: '备注' },
466
+ ],
467
+ rows: v.rows.slice(0, RECORD_CAP).map((r) => ({
468
+ date: r.date,
469
+ type: r.type,
470
+ minutes: numUnit(r.minutes, '分钟'),
471
+ km: numUnit(r.distanceKm, 'km'),
472
+ note: r.note.trim() === '' ? '—' : r.note,
473
+ })),
474
+ caption: '有氧逐条记录(共 ' + v.rows.length + ' 条'
475
+ + (v.rows.length > RECORD_CAP ? ',本页只列前 ' + RECORD_CAP + ' 条' : '') + ')',
476
+ }),
477
+ });
166
478
  }
167
- parts.push(renderDataTable({
168
- columns: [
169
- { key: 'type', label: '类型' },
170
- { key: 'sessions', label: '次数', align: 'right' },
171
- { key: 'minutes', label: '总时长', align: 'right' },
172
- { key: 'km', label: '总距离', align: 'right' },
173
- { key: 'pace', label: '平均配速' },
174
- ],
175
- rows: v.byType.map((t) => ({
176
- type: t.type, sessions: t.sessions, minutes: t.minutes, km: t.distanceKm, pace: fmtPace(t.paceMinPerKm),
177
- })),
178
- caption: '按类型聚合(配速=分钟/公里,无距离即“—”)',
179
- emptyText: '本窗无类型聚合',
180
- }));
181
- const total = v.rows.length;
182
- parts.push(renderDataTable({
183
- columns: [
184
- { key: 'date', label: '日期' },
185
- { key: 'type', label: '类型' },
186
- { key: 'minutes', label: '时长' },
187
- { key: 'km', label: '距离' },
188
- { key: 'note', label: '备注' },
189
- ],
190
- rows: v.rows.slice(0, RECORD_CAP).map((r) => ({
191
- date: r.date, type: r.type, minutes: r.minutes, km: r.distanceKm, note: r.note === '' ? '—' : r.note,
192
- })),
193
- caption: '有氧逐条记录(共 ' + total + ' 条' + (total > RECORD_CAP ? ',仅列前 ' + RECORD_CAP + ' 条' : '') + ')',
194
- emptyText: '本窗无逐条记录',
195
- }));
196
- parts.push(copyBlock('复制数据', {
197
- envelope: {
198
- version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.exercise-cardio',
199
- data: {
200
- metrics: metricsOf({
201
- sessions: v.sessions, totalMinutes: v.totalMinutes,
202
- totalDistanceKm: v.totalDistanceKm, avgPaceMinPerKm: v.avgPaceMinPerKm,
203
- }),
204
- },
205
- },
206
- }));
207
- return assemble('有氧训练总览 ' + v.start + ' ~ ' + v.end, 'calorie.view.exercise-cardio · 运动移植域', '按类型聚合+配速(无距离不算配速,不编数)', parts.join(''), charts);
479
+ else {
480
+ cards.push({
481
+ id: 'sec-empty',
482
+ label: '按类型聚合',
483
+ html: emptyGuide({ icon: '🏃', text: '本窗还没有有氧运动记录', hint: '说「记有氧运动」就能记下第一条' }),
484
+ });
485
+ }
486
+ cards.push(footFacts(CARDIO_SOURCE, v.start, v.end, v.sessions));
487
+ return assembleDocPage({
488
+ docTitle: '卡路里 有氧训练总览',
489
+ title: '有氧训练总览',
490
+ // #544 视觉第 1 轮:同力量页,眉标与 H1 并存两名是既成钉子(`exercise-accept-267.test.mjs:528`),本票回退。
491
+ eyebrow: '有氧训练总览',
492
+ subtitle: '按类型聚合+步速(没有距离就不算步速,缺值显「—」)',
493
+ content: exerciseUiCss() + S544_CSS
494
+ + windowStrip(v.start, v.end, windowDays(v.start, v.end) + ' 天')
495
+ + finishPage(cards, CARDIO_CALIBERS, '有氧训练总览', {
496
+ sessions: v.sessions, totalMinutes: v.totalMinutes,
497
+ totalDistanceKm: v.totalDistanceKm, avgPaceMinPerKm: v.avgPaceMinPerKm,
498
+ }),
499
+ charts: hasRows,
500
+ printable: true,
501
+ pageUi: true,
502
+ });
208
503
  }
209
- /* ── 运动类型分布(exercise_distribution.html 对照:分类占比+摄入/TDEE 联动) ── */
504
+ /* ── 运动类型分布(exercise_distribution.html 对照:#453 融合版式:占比迷你条+分类表+共享图表) ── */
505
+ /** 分布页的来源句(读者话;库表名不上屏)。 */
506
+ const DIST_SOURCE = '运动记录(本窗未删除的行)';
507
+ /** 分布页口径行(#544:一条事实一行;第一条保留 `口径:` 前缀,回归判据读它)。 */
508
+ const DIST_CALIBERS = [
509
+ '口径:占比=该类热量除以本窗合计热量',
510
+ '次数=本窗记录条数',
511
+ '时长=分钟,没有时长的分类不进合计',
512
+ '缺口=TDEE×天+运动−摄入,缺摄入即显「—」',
513
+ ];
210
514
  export function buildDistributionDoc(v) {
211
- const parts = [
212
- windowForm(v.start, v.end, '分类=库内实填优先(力量/有氧/柔韧/日常/其他);旧双饼改双 bar(冻结图表层无 pie 接口,D8)'),
213
- renderKpiGrid([
214
- { label: '会话', value: String(v.sessions), unit: '次', detail: v.days + ' 天 · 活跃 ' + v.activeDays + ' 天' },
215
- { label: '总消耗', value: String(v.totalBurned), unit: '卡' },
216
- { label: '摄入', value: fmt(v.intakeCal), unit: '卡', detail: '窗内饮食合计(无饮食记录即“—”)' },
217
- { label: '缺口', value: fmt(v.deficit), unit: '卡', detail: 'TDEE×天+运动−摄入(缺摄入即“—”)' },
218
- ]),
219
- ];
220
- let charts = false;
221
- if (v.buckets.length > 0) {
222
- parts.push(renderChartBlock({
223
- kind: 'bar',
224
- title: '按分类热量分布',
225
- input: { items: v.buckets.map((b) => ({ label: b.category + ' ' + (b.shareByBurned ?? '—') + '%', value: b.burned })) },
226
- }));
227
- parts.push(renderChartBlock({
228
- kind: 'bar',
229
- title: '按分类次数占比',
230
- input: { items: v.buckets.map((b) => ({ label: b.category + ' ' + (b.shareBySessions ?? '—') + '%', value: b.sessions })) },
231
- }));
232
- charts = true;
515
+ const hasRows = v.buckets.length > 0;
516
+ // 合计行:四类桶逐项累加;时长只在有已知值的桶间累加(缺值不进合计,也不印假 0)。
517
+ let totalMinutes = 0;
518
+ let minutesKnown = false;
519
+ for (const b of v.buckets) {
520
+ if (b.minutes !== null) {
521
+ totalMinutes += b.minutes;
522
+ minutesKnown = true;
523
+ }
233
524
  }
234
- parts.push(renderDataTable({
235
- columns: [
236
- { key: 'category', label: '分类' },
237
- { key: 'sessions', label: '次数', align: 'right' },
238
- { key: 'burned', label: '消耗', align: 'right' },
239
- { key: 'minutes', label: '时长', align: 'right' },
240
- { key: 'shareBurn', label: '热量占比%' },
241
- { key: 'shareN', label: '次数占比%' },
242
- ],
243
- rows: v.buckets.map((b) => ({
244
- category: b.category, sessions: b.sessions, burned: b.burned, minutes: b.minutes,
245
- shareBurn: b.shareByBurned, shareN: b.shareBySessions,
246
- })),
247
- caption: '分类明细(' + v.start + ' ~ ' + v.end + '',
248
- emptyText: '本窗无分类明细',
249
- }));
250
- parts.push(renderDisclosure({
251
- title: '摄入/TDEE 联动(运动贡献)',
252
- contentHtml: renderListRows({
253
- items: [
254
- { left: '摄入合计', main: fmt(v.intakeCal) + ' 卡', right: v.days + ' 天' },
255
- { left: '运动消耗', main: String(v.totalBurned) + ' 卡', right: v.sessions + ' 次' },
256
- { left: 'TDEE 合计', main: fmt(v.tdeeTotal) + ' 卡', right: '档案静态值×天' },
257
- { left: '缺口', main: fmt(v.deficit) + ' 卡', right: v.deficit === null ? '缺摄入未算' : 'TDEE+运动−摄入' },
258
- ],
259
- }),
260
- }));
261
- parts.push(copyBlock('复制数据', {
262
- envelope: {
263
- version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.exercise-distribution',
264
- data: {
265
- metrics: metricsOf({
266
- sessions: v.sessions, activeDays: v.activeDays, days: v.days, totalBurned: v.totalBurned,
267
- intakeCal: v.intakeCal, tdeeTotal: v.tdeeTotal, deficit: v.deficit,
268
- }),
269
- },
525
+ const share = (n) => (n === null ? '—' : String(n) + '%');
526
+ const cards = [
527
+ windowCard(v.start, v.end, '分类先看库内填写,四类之外归入其他。占比按该类热量占本窗合计'),
528
+ {
529
+ id: 'sec-figures',
530
+ label: '核心数字', head: '核心数字',
531
+ // #544:主角(总消耗)排首卡吃 28px;窗口天数住窗口条胶囊,会话卡只报活跃天数。
532
+ html: renderKpiGrid([
533
+ { label: '总消耗', value: numUnit(v.totalBurned, '卡') },
534
+ { label: '会话', value: String(v.sessions), unit: '次', detail: '活跃 ' + v.activeDays + ' 天' },
535
+ { label: '摄入', value: numUnit(v.intakeCal, '卡'),
536
+ // #544 视觉第 1 轮:有值时不再挂「没有饮食记录即「—」」这句 fallback 说明
537
+ // (有值却写「没有饮食记录」=自相矛盾);缺值那一支才说为什么是「—」。
538
+ detail: v.intakeCal === null ? '窗内没有饮食记录' : '窗内饮食合计' },
539
+ { label: '缺口', value: numUnit(v.deficit, '卡') },
540
+ ]),
270
541
  },
271
- }));
272
- return assemble('运动类型分布 ' + v.start + ' ~ ' + v.end, 'calorie.view.exercise-distribution · 运动移植域', '分类占比+摄入/TDEE 联动(缺摄入不断缺口,不编数)', parts.join(''), charts);
542
+ ];
543
+ if (hasRows) {
544
+ // 分类占比:迷你条与数字同格;条色走 `categoryColor()` 的 hex(四类色不在此处另写一份)。
545
+ cards.push({
546
+ id: 'sec-ratio',
547
+ label: '分类占比', head: '分类占比',
548
+ html: renderDistributionRows({
549
+ rows: v.buckets.map((b) => ({
550
+ label: b.category,
551
+ value: share(b.shareByBurned),
552
+ pct: b.shareByBurned ?? 0,
553
+ ...colorOf(b.category),
554
+ })),
555
+ }),
556
+ });
557
+ cards.push({
558
+ id: 'sec-table',
559
+ label: '分类明细',
560
+ html: renderDataTable({
561
+ columns: [
562
+ { key: 'category', label: '分类' },
563
+ { key: 'sessions', label: '次数', align: 'right' },
564
+ { key: 'burned', label: '热量', align: 'right' },
565
+ { key: 'share', label: '占比', align: 'right' },
566
+ { key: 'minutes', label: '时长', align: 'right' },
567
+ ],
568
+ rows: [
569
+ ...v.buckets.map((b) => ({
570
+ category: b.category,
571
+ sessions: numUnit(b.sessions, '次'),
572
+ burned: numUnit(b.burned, '卡'),
573
+ share: share(b.shareByBurned),
574
+ minutes: numUnit(b.minutes, '分钟'),
575
+ })),
576
+ {
577
+ category: '合计',
578
+ sessions: numUnit(v.sessions, '次'),
579
+ burned: numUnit(v.totalBurned, '卡'),
580
+ share: '100%',
581
+ minutes: numUnit(minutesKnown ? totalMinutes : null, '分钟'),
582
+ },
583
+ ],
584
+ caption: '分类明细(' + v.start + ' ~ ' + v.end + ',末行为合计)',
585
+ }),
586
+ });
587
+ cards.push({
588
+ id: 'sec-chart',
589
+ label: '按分类热量分布',
590
+ html: renderChartBlock({
591
+ kind: 'bar',
592
+ title: '按分类热量分布',
593
+ input: { items: v.buckets.map((b) => ({ label: b.category, value: Number(fmtNum(b.burned, 0)) })) },
594
+ }),
595
+ });
596
+ cards.push({
597
+ id: 'sec-link',
598
+ label: '摄入/TDEE 联动',
599
+ html: renderDisclosure({
600
+ title: '摄入/TDEE 联动(运动贡献)',
601
+ contentHtml: renderListRows({
602
+ items: [
603
+ { left: '摄入合计', main: numUnit(v.intakeCal, '卡'), right: v.days + ' 天' },
604
+ { left: '运动消耗', main: numUnit(v.totalBurned, '卡'), right: v.sessions + ' 次' },
605
+ { left: 'TDEE 合计', main: numUnit(v.tdeeTotal, '卡'), right: '档案静态值×天' },
606
+ { left: '缺口', main: numUnit(v.deficit, '卡'), right: v.deficit === null ? '缺摄入未算' : 'TDEE+运动−摄入' },
607
+ ],
608
+ }),
609
+ }),
610
+ });
611
+ }
612
+ else {
613
+ cards.push({
614
+ id: 'sec-empty',
615
+ label: '分类明细',
616
+ html: emptyGuide({ icon: '📊', text: '本窗还没有运动记录', hint: '说「记运动」就能记下第一条' }),
617
+ });
618
+ }
619
+ cards.push(footFacts(DIST_SOURCE, v.start, v.end, v.sessions));
620
+ return assembleDocPage({
621
+ docTitle: '卡路里 运动类型分布',
622
+ title: '运动类型分布',
623
+ eyebrow: '运动类型分布',
624
+ subtitle: '分类占比+摄入/TDEE 联动(缺摄入不编缺口,缺值显「—」)',
625
+ content: exerciseUiCss() + S544_CSS
626
+ + windowStrip(v.start, v.end, v.days + ' 天')
627
+ + finishPage(cards, DIST_CALIBERS, '运动类型分布', {
628
+ sessions: v.sessions, activeDays: v.activeDays, days: v.days, totalBurned: v.totalBurned,
629
+ intakeCal: v.intakeCal, tdeeTotal: v.tdeeTotal, deficit: v.deficit,
630
+ }),
631
+ charts: hasRows,
632
+ printable: true,
633
+ pageUi: true,
634
+ });
273
635
  }
274
- /* ── 运动复盘(exercise_recap.html 对照:KPI+分类+TOP5+日趋势+一句话) ── */
636
+ /* ── 运动复盘(exercise_recap.html 对照:#454 融合版式:一句话结论+类型分布+高频徽章+每日消耗) ── */
637
+ /** 折线横轴日期的上屏口径(#615):与汇总族(`sportDocs.ts` 的 `buildExerciseDoc`)**同一口径**——
638
+ * 窗口**跨年**时印全年 `YYYY-MM-DD`,同年仍只印 `MM-DD`。
639
+ *
640
+ * 为什么必须补:跨年窗的左端 `09-08` 排在右端 `09-07` 前头,两条标签同形(都只是月日),读者按字面
641
+ * 读成「起点比终点晚一天」——#577 的 N2 判据当时只枚举了汇总页,趋势族(`buildTrendDoc` 的每日折线)
642
+ * 与复盘族(`buildRecapDoc` 的每日消耗趋势)漏在判据面外(与 N1 漏目标两页 23/24 同型)。
643
+ * 同年窗**不许**补年份:本族一半的图是「本周」「本月」短窗,补年份只会把轴挤满,是另一处走样。
644
+ * 两族同住本件,故这一处改、两族受益(#268 终审席 K4 那条日期标尺逐字复用图上标签,跟着一起变)。 */
645
+ function axisDateLabel(crossYear) {
646
+ return (date) => (crossYear ? date : date.slice(5));
647
+ }
648
+ /** 复盘页的来源句(读者话;库表名不上屏)。 */
649
+ const RECAP_SOURCE = '运动记录(本窗未删除的行)';
650
+ /** 复盘页口径行(#544:一条事实一行;第一条保留 `口径:` 前缀,回归判据读它)。 */
651
+ const RECAP_CALIBERS = [
652
+ '口径:结论句按本窗记录算,频次指记录条数',
653
+ '分布条占比=该类次数÷本窗次数,条色是该类别的固定色',
654
+ '徽章取本窗次数前 5 的运动',
655
+ '折线按窗口每一天画点,没有记录的日子留空,不断 0',
656
+ '时长单位分钟,消耗单位卡',
657
+ ];
658
+ /** 五个时间窗(本周/本月/最近 90 天/今年/自定义时间)共用这一个装配:窗口只从数据侧进,
659
+ * 模板零分支——同一组锚点 id 与区块类名,差异只在文本与数据;`sessions === 0` 才改走空态。 */
275
660
  export function buildRecapDoc(v) {
276
- const parts = [
277
- windowForm(v.start, v.end, '复盘窗=调用方给 start/end(旧 period week/month/90d/year/range 逐一映射;多窗各直出一页)'),
278
- renderKpiGrid([
279
- { label: '总时长', value: fmt(v.totalMinutes), unit: '分钟', detail: v.start + ' ~ ' + v.end },
280
- { label: '总消耗', value: String(v.totalBurned), unit: '卡' },
281
- { label: '频次', value: String(v.sessions), unit: '次', detail: '活跃 ' + v.activeDays + ' / ' + v.days + ' 天' },
282
- { label: '覆盖分类', value: String(v.byCategory.length), unit: '类' },
283
- ]),
661
+ const hasRows = v.sessions > 0;
662
+ const cards = [
663
+ windowCard(v.start, v.end, '按你选的起止日期出这一页。说「本周」「本月」这类叫法时,落到同一张页上,只是窗口不同'),
284
664
  ];
285
- let charts = false;
286
- if (v.daily.some((d) => d.burned !== null)) {
287
- parts.push(renderChartBlock({
288
- kind: 'line',
289
- title: '每日消耗趋势(空缺断点不断 0,沿 t110 R1)',
290
- input: { items: v.daily.map((d) => ({ label: d.date.slice(5), value: d.burned })) },
291
- }));
292
- charts = true;
665
+ // 结论条=页内静态提示形态(浅色、不可点掉),一句话由数据侧给,页面不另编措辞;
666
+ // 取数层结论句里的 `;` 并列由显示层换成逗号承接(一句话结论不断句;`,` 不在探针并列集里)。
667
+ // 取数层(`exercisePort.ts`)一个字不动,#523 明细页的取数路径天然不受影响。
668
+ // **空窗不印结论条**:取数层那句在本窗无记录时是「共运动 0 天、0 次、累计消耗 0 卡」——
669
+ // 三个零在核心数字卡已各有一处,再印一遍既是冗余,也是一处 `、` 三连并列(#508 的 R3 债);
670
+ // 空窗的交代交给下面那张空态引导块(图标+下一句话),页形与分布/力量/有氧三页一致。
671
+ if (hasRows) {
672
+ cards.push({
673
+ id: 'sec-conclusion',
674
+ label: '一句话结论',
675
+ html: renderFeedbackBlock({
676
+ staticNotice: true,
677
+ toast: { msg: v.summary.split(';').join(','), icon: 'ok' },
678
+ }),
679
+ });
293
680
  }
294
- parts.push(renderDataTable({
295
- columns: [
296
- { key: 'category', label: '分类' },
297
- { key: 'sessions', label: '次数', align: 'right' },
298
- { key: 'burned', label: '消耗', align: 'right' },
299
- ],
300
- rows: v.byCategory.map((b) => ({ category: b.category, sessions: b.sessions, burned: b.burned })),
301
- caption: '类型分布(按分类)',
302
- emptyText: '本窗无分类分布',
303
- }));
304
- parts.push(renderDataTable({
305
- columns: [
306
- { key: 'type', label: '高频运动' },
307
- { key: 'sessions', label: '次数', align: 'right' },
308
- { key: 'burned', label: '消耗', align: 'right' },
309
- ],
310
- rows: v.top5.map((t) => ({ type: t.type, sessions: t.sessions, burned: t.burned })),
311
- caption: '高频 TOP5(旧截断沿袭:只列前 5,明细见运动总览全量表)',
312
- emptyText: '本窗无高频运动',
313
- }));
314
- parts.push(copyBlock('复制数据', {
315
- envelope: {
316
- version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.exercise-recap',
317
- data: {
318
- metrics: metricsOf({
319
- sessions: v.sessions, totalMinutes: v.totalMinutes, totalBurned: v.totalBurned,
320
- activeDays: v.activeDays, days: v.days,
321
- }),
322
- },
323
- },
324
- }));
325
- return assemble('运动复盘 ' + v.start + ' ~ ' + v.end, 'calorie.view.exercise-recap · 运动移植域', v.summary, parts.join(''), charts);
326
- }
327
- /* ── 计划复盘(exercise_review.html 对照:计划 vs 实绩+完成率+未完成清单) ── */
328
- export function buildReviewDoc(v) {
329
- const parts = [
330
- windowForm(v.start, v.end, '计划来源=workout_plans(会话日期按周一口径由 start_date 派生;休息日不计)'),
331
- renderKpiGrid([
332
- { label: '计划会话', value: String(v.plannedSessions), unit: '场', detail: v.planTitle },
333
- { label: '已完成', value: String(v.hitSessions), unit: '场' },
334
- {
335
- label: '会话完成率', value: v.completionPct === null ? '—' : String(v.completionPct) + '%',
336
- status: (v.completionPct ?? 0) >= 80 ? 'ok' : 'warn',
337
- },
338
- {
339
- label: '动作完成率', value: v.movementPct === null ? '—' : String(v.movementPct) + '%',
340
- detail: v.hitMovements + '/' + v.plannedMovements,
341
- },
681
+ cards.push({
682
+ id: 'sec-figures',
683
+ label: '核心数字',
684
+ // #268 终审席 P1-6:核心数字这三节在正文里没有落点(节身份只在顶部导航的胶囊里),补可见节标题。
685
+ head: '核心数字',
686
+ // #544:主角(总消耗)排首卡;窗口住窗口条胶囊,活跃天数只报分子。
687
+ // (第 1 轮曾把首卡值放大到 28px 当主角,终审席 K1 判「一排四卡字号 28/22 混用、基线错开」,
688
+ // 故整排退回公共层那一档 22px,见 `S544_CSS` 件头。)
689
+ html: renderKpiGrid([
690
+ { label: '总消耗', value: numUnit(v.totalBurned, '卡') },
691
+ { label: '总时长', value: numUnit(v.totalMinutes, '分钟') },
692
+ { label: '频次', value: String(v.sessions), unit: '次', detail: '活跃 ' + v.activeDays + ' 天' },
693
+ { label: '覆盖分类', value: String(v.byCategory.length), unit: '' },
342
694
  ]),
343
- ];
344
- let charts = false;
345
- parts.push(renderChartBlock({
346
- kind: 'bar',
347
- title: '计划 vs 实做',
348
- input: {
349
- items: [
350
- { label: '计划会话', value: v.plannedSessions },
351
- { label: '已完成', value: v.hitSessions },
352
- ],
353
- },
354
- }));
355
- charts = true;
356
- parts.push(renderDataTable({
357
- columns: [
358
- { key: 'date', label: '日期' },
359
- { key: 'label', label: '计划' },
360
- { key: 'moves', label: '计划动作' },
361
- { key: 'actual', label: '实做' },
362
- { key: 'hit', label: '完成' },
363
- ],
364
- rows: v.sessions.map((s) => ({
365
- date: s.date,
366
- label: s.label === '' ? '—' : s.label,
367
- moves: s.movements.length === 0 ? '—' : s.movements.join('、'),
368
- actual: s.actualTypes.length === 0 ? '—' : s.actualTypes.join('、'),
369
- hit: s.hit ? '是' : '否',
370
- })),
371
- caption: '每日明细(完成=当日有运动记录;动作命中=双向子串)',
372
- emptyText: '窗内无计划会话',
373
- }));
374
- if (v.unhit.length > 0) {
375
- parts.push(renderDisclosure({
376
- title: '未完成训练(共 ' + v.unhit.length + ' 场)',
377
- contentHtml: renderListRows({
378
- items: v.unhit.map((s) => ({
379
- left: s.date,
380
- main: (s.label === '' ? '训练' : s.label) + (s.movements.length > 0 ? ':' + s.movements.join('、') : ''),
381
- right: '未完成',
695
+ });
696
+ if (hasRows) {
697
+ // 类型分布条:条色只走 `categoryColor()` 的 hex;占比按次数(与结论句同一口径)。
698
+ // #615:折线轴标签走窗口口径(跨年印全年),不再对日期一律 `slice(5)`。
699
+ const axisDate = axisDateLabel(v.start.slice(0, 4) !== v.end.slice(0, 4));
700
+ const dailyItems = v.daily.map((d) => ({
701
+ label: axisDate(d.date),
702
+ value: d.burned === null ? null : Number(fmtNum(d.burned, 0)),
703
+ }));
704
+ cards.push({
705
+ id: 'sec-category',
706
+ label: '类型分布',
707
+ head: '类型分布',
708
+ html: renderDistributionRows({
709
+ rows: v.byCategory.map((b) => ({
710
+ label: b.category,
711
+ value: b.sessions + '' + fmtNum(b.burned, 0) + '',
712
+ pct: Math.round((b.sessions / v.sessions) * 1000) / 10,
713
+ ...colorOf(b.category),
382
714
  })),
383
715
  }),
384
- }));
716
+ });
717
+ // 高频运动徽章:本窗次数前 5(次数并列时取并到的顺手序,页面不另排序)。
718
+ cards.push({
719
+ id: 'sec-badges',
720
+ label: '高频运动',
721
+ head: '高频运动',
722
+ html: renderChips({ items: v.top5.map((t) => ({ text: t.type + ' ×' + t.sessions })) }),
723
+ });
724
+ cards.push({
725
+ id: 'sec-daily',
726
+ label: '每日消耗趋势',
727
+ // #268 K4:长窗(≥45 天)在折线卡下方补一条日期轴(只出窗口内部日期,短窗不出)。
728
+ html: withXRuler(renderChartBlock({
729
+ kind: 'line',
730
+ title: '每日消耗趋势(空缺断点不断 0)',
731
+ // #544:纵轴刻度与量程走 `valueAxisOf()`(最小值锚 0、刻度落整数、线不贴上下沿)。
732
+ input: { items: dailyItems, options: valueAxisOf(dailyItems.map((p) => p.value)) },
733
+ }), dailyItems),
734
+ });
385
735
  }
386
- parts.push(copyBlock('复制数据', {
387
- envelope: {
388
- version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.exercise-review',
389
- data: {
390
- metrics: metricsOf({
391
- plannedSessions: v.plannedSessions, hitSessions: v.hitSessions,
392
- completionPct: v.completionPct, plannedMovements: v.plannedMovements,
393
- hitMovements: v.hitMovements, movementPct: v.movementPct,
394
- }),
395
- },
396
- },
397
- }));
398
- return assemble('计划复盘 ' + v.start + ' ~ ' + v.end, 'calorie.view.exercise-review · 运动移植域', v.planTitle + '(会话完成=当日有记录;动作完成=计划名与实做双向子串命中)', parts.join(''), charts);
736
+ else {
737
+ cards.push({
738
+ id: 'sec-empty',
739
+ label: '类型分布',
740
+ html: emptyGuide({ icon: '📊', text: '本窗还没有运动记录', hint: '说「记运动」就能记下第一条' }),
741
+ });
742
+ }
743
+ cards.push(footFacts(RECAP_SOURCE, v.start, v.end, v.sessions));
744
+ return assembleDocPage({
745
+ docTitle: '卡路里 运动复盘',
746
+ title: '运动复盘 ' + v.start + ' ~ ' + v.end,
747
+ eyebrow: '运动复盘',
748
+ subtitle: '结论一句话,类型分布,高频运动,每日消耗趋势',
749
+ content: exerciseUiCss() + S544_CSS
750
+ + windowStrip(v.start, v.end, v.days + ' 天')
751
+ + finishPage(cards, RECAP_CALIBERS, '运动复盘', {
752
+ sessions: v.sessions, totalMinutes: v.totalMinutes, totalBurned: v.totalBurned,
753
+ activeDays: v.activeDays, days: v.days,
754
+ }),
755
+ charts: hasRows,
756
+ printable: true,
757
+ pageUi: true,
758
+ });
399
759
  }
400
- /* ── 运动趋势(exercise_trend.html 对照:日序列+周频次+峰值) ── */
760
+ /* ── 计划复盘(exercise_review.html 对照) ──
761
+ *
762
+ * **T351-v7:整支已搬进姊妹件 `./reviewDocs.ts`**(键 `calorie.view.exercise-review`,
763
+ * order201–206)——本件已超 350 行告警线(见包 `AGENTS.md` 台账挂号行),复盘族的页内样式
764
+ * 与热力图再挤进来只会更糟;搬走后本件只留「分布/力量/有氧/运动复盘/趋势」五键,
765
+ * `buildReviewDoc` 改由 `../workout/review.ts` 直接 import 姊妹件。
766
+ * 台账许诺的「趋势/复盘一族分住两件」这次只走完「复盘」这一半:`buildRecapDoc`(运动复盘)
767
+ * 与 `buildTrendDoc`(运动趋势)是 #454 刚换过版式的融合版式,属另一半,留给收口票。
768
+ */
769
+ /* ── 运动趋势(exercise_trend.html 对照:#454 融合版式:每日折线+每周柱图+逐日表) ── */
770
+ /** 趋势页的来源句(读者话;库表名不上屏)。 */
771
+ const TREND_SOURCE = '运动记录(本窗未删除的行)';
772
+ /** 逐日表上限:超出即印截断(页眉条数与可见行数同口径,沿 R3 的截断明示)。 */
773
+ const TREND_ROWS_CAP = 100;
774
+ /** 趋势页口径行(#544:一条事实一行;第一条保留 `口径:` 前缀,回归判据读它)。 */
775
+ const TREND_CALIBERS = [
776
+ '口径:折线与逐日表按窗口每一天画一行,没有记录的日子留空「—」,不补 0',
777
+ '次数=本窗记录条数',
778
+ '时长单位分钟,消耗单位卡',
779
+ '逐日表最多列 ' + TREND_ROWS_CAP + ' 天,超出即印截断,页眉天数与表内可见行数同口径',
780
+ ];
401
781
  export function buildTrendDoc(v) {
402
- const parts = [
403
- windowForm(v.start, v.end, '时序视角(旧 --days 30 默认;本键 start/end 显式窗)'),
404
- renderKpiGrid([
405
- { label: '运动天数', value: String(v.activeDays), unit: '天', detail: v.start + ' ~ ' + v.end },
406
- { label: '总时长', value: fmt(v.totalMinutes), unit: '分钟' },
407
- { label: '总消耗', value: String(v.totalBurned), unit: '' },
408
- {
409
- label: '峰值', value: v.peak ? String(v.peak.burned) : '—', unit: '卡',
410
- detail: v.peak ? '单日最高 ' + v.peak.date : undefined,
411
- },
412
- ]),
413
- ];
414
- let charts = false;
415
- if (v.days.some((d) => d.burned !== null)) {
416
- const burnItems = v.days.map((d) => ({ label: d.date.slice(5), value: d.burned }));
417
- const minItems = v.days.map((d) => ({ label: d.date.slice(5), value: d.minutes }));
418
- parts.push(renderChartBlock({
419
- kind: 'line',
420
- title: '每日消耗+时长(消耗实线 · 时长虚线独立刻度;空缺断点不断 0,沿 t110 R1)',
421
- input: {
422
- items: burnItems,
423
- options: {
424
- series: [
425
- { name: '消耗(卡)', items: burnItems },
426
- { name: '时长(分)', items: minItems, dashed: true, ownScale: true },
427
- ],
782
+ const hasRows = v.activeDays > 0;
783
+ const shown = Math.min(v.days.length, TREND_ROWS_CAP);
784
+ const truncated = v.days.length > TREND_ROWS_CAP;
785
+ const sessions = v.days.reduce((n, d) => n + d.sessions, 0);
786
+ const cards = [
787
+ windowCard(v.start, v.end, '按天看这段的走势。只说天数时默认三十天,这里按起止日期定窗'),
788
+ {
789
+ id: 'sec-figures',
790
+ label: '核心数字', head: '核心数字',
791
+ // #544:主角(总消耗)排首卡吃 28px;窗口住窗口条胶囊,只留峰值那一处点睛。
792
+ html: renderKpiGrid([
793
+ { label: '总消耗', value: numUnit(v.totalBurned, '卡') },
794
+ { label: '总时长', value: numUnit(v.totalMinutes, '分钟') },
795
+ { label: '运动天数', value: String(v.activeDays), unit: '天' },
796
+ {
797
+ label: '峰值',
798
+ value: v.peak === null ? '—' : numUnit(v.peak.burned, '卡'),
799
+ detail: v.peak === null ? '本窗无记录' : '单日最高 ' + v.peak.date,
428
800
  },
429
- },
801
+ ]),
802
+ },
803
+ ];
804
+ if (hasRows) {
805
+ // 每日消耗折线:消耗实线(共享刻度)+时长虚线(`ownScale` 独立归一,不另出第二套刻度);
806
+ // 没有记录的日子当场是 `null`(不是 0),点自然断开——「空缺断点不断 0」由数据结构保证。
807
+ // #544:图表入参过显示层取整(空值仍 `null`,不断 0 口径不动)。
808
+ // #615:两条序列的轴标签走窗口口径(跨年印全年),否则跨年窗左端 `09-08` 与右端 `09-07` 同形。
809
+ const axisDate = axisDateLabel(v.start.slice(0, 4) !== v.end.slice(0, 4));
810
+ const burnItems = v.days.map((d) => ({
811
+ label: axisDate(d.date),
812
+ value: d.burned === null ? null : Number(fmtNum(d.burned, 0)),
430
813
  }));
431
- charts = true;
432
- }
433
- if (v.weekly.length > 0) {
434
- parts.push(renderChartBlock({
435
- kind: 'bar',
436
- title: '每周运动频次',
437
- input: { items: v.weekly.map((w) => ({ label: w.weekStart.slice(5) + '周', value: w.sessions })) },
814
+ const minItems = v.days.map((d) => ({
815
+ label: axisDate(d.date),
816
+ value: d.minutes === null ? null : Number(fmtNum(d.minutes, 0)),
438
817
  }));
439
- charts = true;
818
+ cards.push({
819
+ id: 'sec-line',
820
+ label: '每日消耗折线',
821
+ // #268 K4:长窗(≥45 天)在折线卡下方补一条日期轴(只出窗口内部日期,短窗不出)。
822
+ html: withXRuler(renderChartBlock({
823
+ kind: 'line',
824
+ title: '每日消耗与时长(消耗实线,时长虚线)',
825
+ input: {
826
+ items: burnItems,
827
+ options: {
828
+ // #544:纵轴刻度与量程走 `valueAxisOf()`(共享域=消耗那条;时长是 `ownScale` 独立刻度)。
829
+ ...valueAxisOf(burnItems.map((p) => p.value)),
830
+ series: [
831
+ { name: '消耗(卡)', items: burnItems },
832
+ { name: '时长(分)', items: minItems, dashed: true, ownScale: true },
833
+ ],
834
+ },
835
+ },
836
+ }), burnItems),
837
+ });
838
+ // #623:周柱轴按页窗口首末年派生 crossYear(与 sec-line 同一个 axisDate:周起点可能落在窗口外,
839
+ // 仍按窗口派生;与轨迹按自身首末派生不同;与 axisDateLabel 同一口径:跨年印全年、同年只印月日)。
840
+ cards.push({
841
+ id: 'sec-weekly',
842
+ label: '每周频次',
843
+ html: renderChartBlock({
844
+ kind: 'bar',
845
+ title: '每周运动频次',
846
+ input: { items: v.weekly.map((w) => ({ label: axisDate(w.weekStart) + '周', value: w.sessions })) },
847
+ }),
848
+ });
849
+ cards.push({
850
+ id: 'sec-daily',
851
+ label: '逐日明细',
852
+ html: renderDataTable({
853
+ columns: [
854
+ { key: 'date', label: '日期' },
855
+ { key: 'sessions', label: '次数', align: 'right' },
856
+ { key: 'minutes', label: '时长', align: 'right' },
857
+ { key: 'burned', label: '消耗', align: 'right' },
858
+ ],
859
+ // 空缺日(窗内没有记录的那天)一律「—」:0 次/0 卡都不是那天的实话。
860
+ rows: v.days.slice(0, TREND_ROWS_CAP).map((d) => ({
861
+ date: d.date,
862
+ sessions: d.sessions === 0 ? '—' : d.sessions + ' 次',
863
+ minutes: numUnit(d.minutes, '分钟'),
864
+ burned: numUnit(d.burned, '卡'),
865
+ })),
866
+ caption: '逐日明细(共 ' + v.days.length + ' 天,本表列出 ' + shown + ' 天'
867
+ + (truncated ? ',已截断,只列前 ' + TREND_ROWS_CAP + ' 天' : ',未截断')
868
+ + ',空缺日「—」不断 0)',
869
+ }),
870
+ });
440
871
  }
441
- const TREND_CAP = 100;
442
- const trendTotal = v.days.length;
443
- const trendSlice = v.days.slice(0, TREND_CAP);
444
- parts.push(renderDataTable({
445
- columns: [
446
- { key: 'date', label: '日期' },
447
- { key: 'sessions', label: '次数', align: 'right' },
448
- { key: 'minutes', label: '时长', align: 'right' },
449
- { key: 'burned', label: '消耗', align: 'right' },
450
- ],
451
- rows: trendSlice.map((d) => ({ date: d.date, sessions: d.sessions, minutes: d.minutes, burned: d.burned })),
452
- caption: '逐日明细(共 ' + trendTotal + ' 天' + (trendTotal > TREND_CAP ? ',仅列前 ' + TREND_CAP + ' 天' : '') + ';空日“—”不断 0)',
453
- emptyText: '本窗无逐日明细',
454
- }));
455
- parts.push(copyBlock('复制数据', {
456
- envelope: {
457
- version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.exercise-trend',
458
- data: {
459
- metrics: metricsOf({
460
- activeDays: v.activeDays, totalMinutes: v.totalMinutes,
461
- totalBurned: v.totalBurned, peakBurned: v.peak?.burned,
462
- }),
463
- },
464
- },
465
- }));
466
- return assemble('运动趋势 ' + v.start + ' ~ ' + v.end, 'calorie.view.exercise-trend · 运动移植域', '日序列+周频次+峰值(空日断点,不断 0)', parts.join(''), charts);
872
+ else {
873
+ cards.push({
874
+ id: 'sec-empty',
875
+ label: '逐日明细',
876
+ html: emptyGuide({ icon: '📈', text: '本窗还没有运动记录', hint: '说「记运动」就能记下第一笔' }),
877
+ });
878
+ }
879
+ cards.push(footFacts(TREND_SOURCE, v.start, v.end, sessions));
880
+ return assembleDocPage({
881
+ docTitle: '卡路里 运动趋势',
882
+ title: '运动趋势 ' + v.start + ' ~ ' + v.end,
883
+ eyebrow: '运动趋势',
884
+ subtitle: '每日消耗与时长,每周频次,逐日明细(空缺日留空,不补 0)',
885
+ content: exerciseUiCss() + S544_CSS
886
+ + windowStrip(v.start, v.end, v.days.length + '')
887
+ + finishPage(cards, TREND_CALIBERS, '运动趋势', {
888
+ activeDays: v.activeDays, totalMinutes: v.totalMinutes,
889
+ totalBurned: v.totalBurned, peakBurned: v.peak === null ? null : v.peak.burned,
890
+ }),
891
+ charts: hasRows,
892
+ printable: true,
893
+ pageUi: true,
894
+ });
467
895
  }
468
896
  //# sourceMappingURL=sportPortDocs.js.map