skill-calorie 0.2.3 → 0.2.5
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.
- package/SKILL.md +474 -122
- package/dist/.gen-inputs.json +86 -0
- package/dist/analysis/anomaly/common.d.ts +11 -1
- package/dist/analysis/anomaly/common.d.ts.map +1 -1
- package/dist/analysis/anomaly/common.js +11 -12
- package/dist/analysis/anomaly/common.js.map +1 -1
- package/dist/analysis/anomaly/diet.d.ts.map +1 -1
- package/dist/analysis/anomaly/diet.js +11 -3
- package/dist/analysis/anomaly/diet.js.map +1 -1
- package/dist/analysis/commands.d.ts +62 -0
- package/dist/analysis/commands.d.ts.map +1 -0
- package/dist/analysis/commands.js +386 -0
- package/dist/analysis/commands.js.map +1 -0
- package/dist/analysis/contraindications.d.ts.map +1 -1
- package/dist/analysis/contraindications.js +16 -12
- package/dist/analysis/contraindications.js.map +1 -1
- package/dist/analysis/cross.d.ts +3 -0
- package/dist/analysis/cross.d.ts.map +1 -1
- package/dist/analysis/cross.js +54 -26
- package/dist/analysis/cross.js.map +1 -1
- package/dist/analysis/dashboard.d.ts.map +1 -1
- package/dist/analysis/dashboard.js +3 -2
- package/dist/analysis/dashboard.js.map +1 -1
- package/dist/analysis/deficit.d.ts +4 -2
- package/dist/analysis/deficit.d.ts.map +1 -1
- package/dist/analysis/deficit.js +2 -1
- package/dist/analysis/deficit.js.map +1 -1
- package/dist/analysis/exerciseReview.js +1 -1
- package/dist/analysis/exerciseReview.js.map +1 -1
- package/dist/analysis/healthPlate.d.ts +21 -0
- package/dist/analysis/healthPlate.d.ts.map +1 -0
- package/dist/analysis/healthPlate.js +41 -0
- package/dist/analysis/healthPlate.js.map +1 -0
- package/dist/analysis/historyStore.d.ts +30 -0
- package/dist/analysis/historyStore.d.ts.map +1 -0
- package/dist/analysis/historyStore.js +32 -0
- package/dist/analysis/historyStore.js.map +1 -0
- package/dist/analysis/index.d.ts +17 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +17 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/multiTrend.d.ts +67 -0
- package/dist/analysis/multiTrend.d.ts.map +1 -0
- package/dist/analysis/multiTrend.js +106 -0
- package/dist/analysis/multiTrend.js.map +1 -0
- package/dist/analysis/multiTrendPage.d.ts +4 -0
- package/dist/analysis/multiTrendPage.d.ts.map +1 -0
- package/dist/analysis/multiTrendPage.js +502 -0
- package/dist/analysis/multiTrendPage.js.map +1 -0
- package/dist/analysis/reportDoc.d.ts +12 -0
- package/dist/analysis/reportDoc.d.ts.map +1 -0
- package/dist/analysis/reportDoc.js +244 -0
- package/dist/analysis/reportDoc.js.map +1 -0
- package/dist/analysis/reportDocBmi.d.ts +4 -0
- package/dist/analysis/reportDocBmi.d.ts.map +1 -0
- package/dist/analysis/reportDocBmi.js +104 -0
- package/dist/analysis/reportDocBmi.js.map +1 -0
- package/dist/analysis/reportDocParts.d.ts +77 -0
- package/dist/analysis/reportDocParts.d.ts.map +1 -0
- package/dist/analysis/reportDocParts.js +249 -0
- package/dist/analysis/reportDocParts.js.map +1 -0
- package/dist/analysis/reportDocScore.d.ts +8 -0
- package/dist/analysis/reportDocScore.d.ts.map +1 -0
- package/dist/analysis/reportDocScore.js +223 -0
- package/dist/analysis/reportDocScore.js.map +1 -0
- package/dist/analysis/reportDocScoreSeries.d.ts +3 -0
- package/dist/analysis/reportDocScoreSeries.d.ts.map +1 -0
- package/dist/analysis/reportDocScoreSeries.js +27 -0
- package/dist/analysis/reportDocScoreSeries.js.map +1 -0
- package/dist/analysis/reportDocTracked.d.ts +10 -0
- package/dist/analysis/reportDocTracked.d.ts.map +1 -0
- package/dist/analysis/reportDocTracked.js +196 -0
- package/dist/analysis/reportDocTracked.js.map +1 -0
- package/dist/analysis/reportPlate.d.ts +163 -0
- package/dist/analysis/reportPlate.d.ts.map +1 -0
- package/dist/analysis/reportPlate.js +251 -0
- package/dist/analysis/reportPlate.js.map +1 -0
- package/dist/analysis/review.d.ts.map +1 -1
- package/dist/analysis/review.js +5 -3
- package/dist/analysis/review.js.map +1 -1
- package/dist/analysis/routes.d.ts +18 -0
- package/dist/analysis/routes.d.ts.map +1 -0
- package/dist/analysis/routes.js +178 -0
- package/dist/analysis/routes.js.map +1 -0
- package/dist/analysis/series.d.ts +31 -6
- package/dist/analysis/series.d.ts.map +1 -1
- package/dist/analysis/series.js +121 -24
- package/dist/analysis/series.js.map +1 -1
- package/dist/analysis/simulate.d.ts +4 -2
- package/dist/analysis/simulate.d.ts.map +1 -1
- package/dist/analysis/simulate.js +22 -8
- package/dist/analysis/simulate.js.map +1 -1
- package/dist/analysis/simulate2.d.ts.map +1 -1
- package/dist/analysis/simulate2.js +47 -12
- package/dist/analysis/simulate2.js.map +1 -1
- package/dist/analysis/trend.d.ts +9 -1
- package/dist/analysis/trend.d.ts.map +1 -1
- package/dist/analysis/trend.js +24 -8
- package/dist/analysis/trend.js.map +1 -1
- package/dist/analysis/utils.d.ts +55 -21
- package/dist/analysis/utils.d.ts.map +1 -1
- package/dist/analysis/utils.js +85 -28
- package/dist/analysis/utils.js.map +1 -1
- package/dist/body/bodyDocs.d.ts +4 -0
- package/dist/body/bodyDocs.d.ts.map +1 -0
- package/dist/body/bodyDocs.js +284 -0
- package/dist/body/bodyDocs.js.map +1 -0
- package/dist/body/bodyPlate.d.ts +145 -0
- package/dist/body/bodyPlate.d.ts.map +1 -0
- package/dist/body/bodyPlate.js +243 -0
- package/dist/body/bodyPlate.js.map +1 -0
- package/dist/body/bodyReadUi.d.ts +47 -0
- package/dist/body/bodyReadUi.d.ts.map +1 -0
- package/dist/body/bodyReadUi.js +164 -0
- package/dist/body/bodyReadUi.js.map +1 -0
- package/dist/body/commands.d.ts +33 -0
- package/dist/body/commands.d.ts.map +1 -0
- package/dist/body/commands.js +19 -0
- package/dist/body/commands.js.map +1 -0
- package/dist/body/compare.d.ts +62 -0
- package/dist/body/compare.d.ts.map +1 -0
- package/dist/body/compare.js +162 -0
- package/dist/body/compare.js.map +1 -0
- package/dist/body/compareCompositionDoc.d.ts +3 -0
- package/dist/body/compareCompositionDoc.d.ts.map +1 -0
- package/dist/body/compareCompositionDoc.js +99 -0
- package/dist/body/compareCompositionDoc.js.map +1 -0
- package/dist/body/compareMeasureDoc.d.ts +3 -0
- package/dist/body/compareMeasureDoc.d.ts.map +1 -0
- package/dist/body/compareMeasureDoc.js +91 -0
- package/dist/body/compareMeasureDoc.js.map +1 -0
- package/dist/body/compareUi.d.ts +12 -0
- package/dist/body/compareUi.d.ts.map +1 -0
- package/dist/body/compareUi.js +27 -0
- package/dist/body/compareUi.js.map +1 -0
- package/dist/body/index.d.ts +17 -0
- package/dist/body/index.d.ts.map +1 -0
- package/dist/body/index.js +17 -0
- package/dist/body/index.js.map +1 -0
- package/dist/body/log.d.ts +29 -0
- package/dist/body/log.d.ts.map +1 -0
- package/dist/body/log.js +196 -0
- package/dist/body/log.js.map +1 -0
- package/dist/body/receipt.d.ts +52 -0
- package/dist/body/receipt.d.ts.map +1 -0
- package/dist/body/receipt.js +248 -0
- package/dist/body/receipt.js.map +1 -0
- package/dist/body/receiptData.d.ts +46 -0
- package/dist/body/receiptData.d.ts.map +1 -0
- package/dist/body/receiptData.js +107 -0
- package/dist/body/receiptData.js.map +1 -0
- package/dist/body/receiptUi.d.ts +9 -0
- package/dist/body/receiptUi.d.ts.map +1 -0
- package/dist/body/receiptUi.js +75 -0
- package/dist/body/receiptUi.js.map +1 -0
- package/dist/body/remove.d.ts +21 -0
- package/dist/body/remove.d.ts.map +1 -0
- package/dist/body/remove.js +78 -0
- package/dist/body/remove.js.map +1 -0
- package/dist/body/routes.d.ts +10 -0
- package/dist/body/routes.d.ts.map +1 -0
- package/dist/body/routes.js +20 -0
- package/dist/body/routes.js.map +1 -0
- package/dist/body/view.d.ts +21 -0
- package/dist/body/view.d.ts.map +1 -0
- package/dist/body/view.js +50 -0
- package/dist/body/view.js.map +1 -0
- package/dist/body/wizard.d.ts +14 -0
- package/dist/body/wizard.d.ts.map +1 -0
- package/dist/body/wizard.js +21 -0
- package/dist/body/wizard.js.map +1 -0
- package/dist/body/wizardDocs.d.ts +4 -0
- package/dist/body/wizardDocs.d.ts.map +1 -0
- package/dist/body/wizardDocs.js +260 -0
- package/dist/body/wizardDocs.js.map +1 -0
- package/dist/body/wizardPlate.d.ts +146 -0
- package/dist/body/wizardPlate.d.ts.map +1 -0
- package/dist/body/wizardPlate.js +260 -0
- package/dist/body/wizardPlate.js.map +1 -0
- package/dist/body/wizardPrompt.d.ts +52 -0
- package/dist/body/wizardPrompt.d.ts.map +1 -0
- package/dist/body/wizardPrompt.js +146 -0
- package/dist/body/wizardPrompt.js.map +1 -0
- package/dist/body/wizardUi.d.ts +11 -0
- package/dist/body/wizardUi.d.ts.map +1 -0
- package/dist/body/wizardUi.js +35 -0
- package/dist/body/wizardUi.js.map +1 -0
- package/dist/cli/cmd_read.d.ts +7 -26
- package/dist/cli/cmd_read.d.ts.map +1 -1
- package/dist/cli/cmd_read.js +68 -1084
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/config.d.ts +16 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +68 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/delivery.d.ts +35 -0
- package/dist/cli/delivery.d.ts.map +1 -0
- package/dist/cli/delivery.js +224 -0
- package/dist/cli/delivery.js.map +1 -0
- package/dist/cli/health.d.ts +7 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +21 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/keys.d.ts +302 -165
- package/dist/cli/keys.d.ts.map +1 -1
- package/dist/cli/keys.js +101 -77
- package/dist/cli/keys.js.map +1 -1
- package/dist/cli/readArgs.d.ts +21 -0
- package/dist/cli/readArgs.d.ts.map +1 -0
- package/dist/cli/readArgs.js +73 -0
- package/dist/cli/readArgs.js.map +1 -0
- package/dist/cli/registry.d.ts +12 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +38 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/write.d.ts +14 -17
- package/dist/cli/write.d.ts.map +1 -1
- package/dist/cli/write.js +18 -946
- package/dist/cli/write.js.map +1 -1
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/diet/commands.d.ts +42 -0
- package/dist/diet/commands.d.ts.map +1 -0
- package/dist/diet/commands.js +45 -0
- package/dist/diet/commands.js.map +1 -0
- package/dist/diet/dietEngine.d.ts +79 -0
- package/dist/diet/dietEngine.d.ts.map +1 -0
- package/dist/diet/dietEngine.js +173 -0
- package/dist/diet/dietEngine.js.map +1 -0
- package/dist/diet/dietUi.d.ts +14 -0
- package/dist/diet/dietUi.d.ts.map +1 -0
- package/dist/diet/dietUi.js +38 -0
- package/dist/diet/dietUi.js.map +1 -0
- package/dist/diet/edit.d.ts +22 -0
- package/dist/diet/edit.d.ts.map +1 -0
- package/dist/diet/edit.js +96 -0
- package/dist/diet/edit.js.map +1 -0
- package/dist/diet/fieldLabels.d.ts +5 -0
- package/dist/diet/fieldLabels.d.ts.map +1 -0
- package/dist/diet/fieldLabels.js +44 -0
- package/dist/diet/fieldLabels.js.map +1 -0
- package/dist/diet/index.d.ts +22 -0
- package/dist/diet/index.d.ts.map +1 -0
- package/dist/diet/index.js +21 -0
- package/dist/diet/index.js.map +1 -0
- package/dist/diet/library.d.ts +20 -0
- package/dist/diet/library.d.ts.map +1 -0
- package/dist/diet/library.js +52 -0
- package/dist/diet/library.js.map +1 -0
- package/dist/diet/libraryDocs.d.ts +7 -0
- package/dist/diet/libraryDocs.d.ts.map +1 -0
- package/dist/diet/libraryDocs.js +361 -0
- package/dist/diet/libraryDocs.js.map +1 -0
- package/dist/diet/libraryPlate.d.ts +41 -0
- package/dist/diet/libraryPlate.d.ts.map +1 -0
- package/dist/diet/libraryPlate.js +57 -0
- package/dist/diet/libraryPlate.js.map +1 -0
- package/dist/diet/log.d.ts +18 -0
- package/dist/diet/log.d.ts.map +1 -0
- package/dist/diet/log.js +152 -0
- package/dist/diet/log.js.map +1 -0
- package/dist/diet/nutrition.d.ts +37 -0
- package/dist/diet/nutrition.d.ts.map +1 -0
- package/dist/diet/nutrition.js +135 -0
- package/dist/diet/nutrition.js.map +1 -0
- package/dist/diet/nutritionPort.d.ts +126 -0
- package/dist/diet/nutritionPort.d.ts.map +1 -0
- package/dist/diet/nutritionPort.js +248 -0
- package/dist/diet/nutritionPort.js.map +1 -0
- package/dist/diet/nutritionPortDocs.d.ts +106 -0
- package/dist/diet/nutritionPortDocs.d.ts.map +1 -0
- package/dist/diet/nutritionPortDocs.js +651 -0
- package/dist/diet/nutritionPortDocs.js.map +1 -0
- package/dist/diet/precheck.d.ts +7 -0
- package/dist/diet/precheck.d.ts.map +1 -0
- package/dist/diet/precheck.js +194 -0
- package/dist/diet/precheck.js.map +1 -0
- package/dist/diet/precheckLabel.d.ts +4 -0
- package/dist/diet/precheckLabel.d.ts.map +1 -0
- package/dist/diet/precheckLabel.js +191 -0
- package/dist/diet/precheckLabel.js.map +1 -0
- package/dist/diet/precheckParts.d.ts +49 -0
- package/dist/diet/precheckParts.d.ts.map +1 -0
- package/dist/diet/precheckParts.js +69 -0
- package/dist/diet/precheckParts.js.map +1 -0
- package/dist/diet/precheckPort.d.ts +82 -0
- package/dist/diet/precheckPort.d.ts.map +1 -0
- package/dist/diet/precheckPort.js +178 -0
- package/dist/diet/precheckPort.js.map +1 -0
- package/dist/diet/productImport.d.ts +28 -0
- package/dist/diet/productImport.d.ts.map +1 -0
- package/dist/diet/productImport.js +152 -0
- package/dist/diet/productImport.js.map +1 -0
- package/dist/diet/productStore.d.ts +62 -0
- package/dist/diet/productStore.d.ts.map +1 -0
- package/dist/diet/productStore.js +73 -0
- package/dist/diet/productStore.js.map +1 -0
- package/dist/diet/products.d.ts +15 -0
- package/dist/diet/products.d.ts.map +1 -0
- package/dist/diet/products.js +87 -0
- package/dist/diet/products.js.map +1 -0
- package/dist/diet/ranking.d.ts +18 -0
- package/dist/diet/ranking.d.ts.map +1 -0
- package/dist/diet/ranking.js +23 -0
- package/dist/diet/ranking.js.map +1 -0
- package/dist/diet/rankingDocs.d.ts +13 -0
- package/dist/diet/rankingDocs.d.ts.map +1 -0
- package/dist/diet/rankingDocs.js +341 -0
- package/dist/diet/rankingDocs.js.map +1 -0
- package/dist/diet/rankingPlate.d.ts +42 -0
- package/dist/diet/rankingPlate.d.ts.map +1 -0
- package/dist/diet/rankingPlate.js +96 -0
- package/dist/diet/rankingPlate.js.map +1 -0
- package/dist/diet/receipt.d.ts +34 -0
- package/dist/diet/receipt.d.ts.map +1 -0
- package/dist/diet/receipt.js +371 -0
- package/dist/diet/receipt.js.map +1 -0
- package/dist/diet/review.d.ts +36 -0
- package/dist/diet/review.d.ts.map +1 -0
- package/dist/diet/review.js +137 -0
- package/dist/diet/review.js.map +1 -0
- package/dist/diet/reviewDocs.d.ts +72 -0
- package/dist/diet/reviewDocs.d.ts.map +1 -0
- package/dist/diet/reviewDocs.js +312 -0
- package/dist/diet/reviewDocs.js.map +1 -0
- package/dist/diet/routes.d.ts +12 -0
- package/dist/diet/routes.d.ts.map +1 -0
- package/dist/diet/routes.js +108 -0
- package/dist/diet/routes.js.map +1 -0
- package/dist/diet/sourceStatsDocs.d.ts +3 -0
- package/dist/diet/sourceStatsDocs.d.ts.map +1 -0
- package/dist/diet/sourceStatsDocs.js +115 -0
- package/dist/diet/sourceStatsDocs.js.map +1 -0
- package/dist/diet/today.d.ts +14 -0
- package/dist/diet/today.d.ts.map +1 -0
- package/dist/diet/today.js +87 -0
- package/dist/diet/today.js.map +1 -0
- package/dist/diet/todayDocs.d.ts +53 -0
- package/dist/diet/todayDocs.d.ts.map +1 -0
- package/dist/diet/todayDocs.js +238 -0
- package/dist/diet/todayDocs.js.map +1 -0
- package/dist/exercise/cardio.d.ts +11 -0
- package/dist/exercise/cardio.d.ts.map +1 -0
- package/dist/exercise/cardio.js +14 -0
- package/dist/exercise/cardio.js.map +1 -0
- package/dist/exercise/categoryColors.d.ts +23 -0
- package/dist/exercise/categoryColors.d.ts.map +1 -0
- package/dist/exercise/categoryColors.js +28 -0
- package/dist/exercise/categoryColors.js.map +1 -0
- package/dist/exercise/commands.d.ts +20 -0
- package/dist/exercise/commands.d.ts.map +1 -0
- package/dist/exercise/commands.js +22 -0
- package/dist/exercise/commands.js.map +1 -0
- package/dist/exercise/distribution.d.ts +11 -0
- package/dist/exercise/distribution.d.ts.map +1 -0
- package/dist/exercise/distribution.js +14 -0
- package/dist/exercise/distribution.js.map +1 -0
- package/dist/exercise/edit.d.ts +22 -0
- package/dist/exercise/edit.d.ts.map +1 -0
- package/dist/exercise/edit.js +150 -0
- package/dist/exercise/edit.js.map +1 -0
- package/dist/exercise/exerciseStore.d.ts +87 -0
- package/dist/exercise/exerciseStore.d.ts.map +1 -0
- package/dist/exercise/exerciseStore.js +293 -0
- package/dist/exercise/exerciseStore.js.map +1 -0
- package/dist/exercise/fieldLabels.d.ts +5 -0
- package/dist/exercise/fieldLabels.d.ts.map +1 -0
- package/dist/exercise/fieldLabels.js +34 -0
- package/dist/exercise/fieldLabels.js.map +1 -0
- package/dist/exercise/goal.d.ts +16 -0
- package/dist/exercise/goal.d.ts.map +1 -0
- package/dist/exercise/goal.js +46 -0
- package/dist/exercise/goal.js.map +1 -0
- package/dist/exercise/index.d.ts +17 -0
- package/dist/exercise/index.d.ts.map +1 -0
- package/dist/exercise/index.js +17 -0
- package/dist/exercise/index.js.map +1 -0
- package/dist/exercise/log.d.ts +19 -0
- package/dist/exercise/log.d.ts.map +1 -0
- package/dist/exercise/log.js +102 -0
- package/dist/exercise/log.js.map +1 -0
- package/dist/exercise/precheck.d.ts +19 -0
- package/dist/exercise/precheck.d.ts.map +1 -0
- package/dist/exercise/precheck.js +127 -0
- package/dist/exercise/precheck.js.map +1 -0
- package/dist/exercise/recap.d.ts +11 -0
- package/dist/exercise/recap.d.ts.map +1 -0
- package/dist/exercise/recap.js +14 -0
- package/dist/exercise/recap.js.map +1 -0
- package/dist/exercise/receipt.d.ts +43 -0
- package/dist/exercise/receipt.d.ts.map +1 -0
- package/dist/exercise/receipt.js +401 -0
- package/dist/exercise/receipt.js.map +1 -0
- package/dist/exercise/records.d.ts +60 -0
- package/dist/exercise/records.d.ts.map +1 -0
- package/dist/exercise/records.js +317 -0
- package/dist/exercise/records.js.map +1 -0
- package/dist/exercise/routes.d.ts +21 -0
- package/dist/exercise/routes.d.ts.map +1 -0
- package/dist/exercise/routes.js +38 -0
- package/dist/exercise/routes.js.map +1 -0
- package/dist/exercise/sportPortDocs.d.ts +9 -0
- package/dist/exercise/sportPortDocs.d.ts.map +1 -0
- package/dist/exercise/sportPortDocs.js +896 -0
- package/dist/exercise/sportPortDocs.js.map +1 -0
- package/dist/exercise/sportUi.d.ts +79 -0
- package/dist/exercise/sportUi.d.ts.map +1 -0
- package/dist/exercise/sportUi.js +237 -0
- package/dist/exercise/sportUi.js.map +1 -0
- package/dist/exercise/strength.d.ts +11 -0
- package/dist/exercise/strength.d.ts.map +1 -0
- package/dist/exercise/strength.js +14 -0
- package/dist/exercise/strength.js.map +1 -0
- package/dist/exercise/trend.d.ts +11 -0
- package/dist/exercise/trend.d.ts.map +1 -0
- package/dist/exercise/trend.js +14 -0
- package/dist/exercise/trend.js.map +1 -0
- package/dist/fetch/audit.d.ts +2 -0
- package/dist/fetch/audit.d.ts.map +1 -1
- package/dist/fetch/audit.js +11 -10
- package/dist/fetch/audit.js.map +1 -1
- package/dist/fetch/batch.js +1 -1
- package/dist/fetch/batch.js.map +1 -1
- package/dist/fetch/body.d.ts +104 -1
- package/dist/fetch/body.d.ts.map +1 -1
- package/dist/fetch/body.js +203 -31
- package/dist/fetch/body.js.map +1 -1
- package/dist/fetch/cli.js +11 -5
- package/dist/fetch/cli.js.map +1 -1
- package/dist/fetch/diet.d.ts +6 -5
- package/dist/fetch/diet.d.ts.map +1 -1
- package/dist/fetch/diet.js +19 -25
- package/dist/fetch/diet.js.map +1 -1
- package/dist/fetch/index.d.ts +5 -7
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/index.js +7 -6
- package/dist/fetch/index.js.map +1 -1
- package/dist/fetch/profile.d.ts +24 -3
- package/dist/fetch/profile.d.ts.map +1 -1
- package/dist/fetch/profile.js +43 -14
- package/dist/fetch/profile.js.map +1 -1
- package/dist/fetch/xunji-catalog.d.ts +5 -0
- package/dist/fetch/xunji-catalog.d.ts.map +1 -1
- package/dist/fetch/xunji-catalog.js +22 -1
- package/dist/fetch/xunji-catalog.js.map +1 -1
- package/dist/goal/commands.d.ts +35 -0
- package/dist/goal/commands.d.ts.map +1 -0
- package/dist/goal/commands.js +21 -0
- package/dist/goal/commands.js.map +1 -0
- package/dist/goal/goalExtraPlate.d.ts +45 -0
- package/dist/goal/goalExtraPlate.d.ts.map +1 -0
- package/dist/goal/goalExtraPlate.js +97 -0
- package/dist/goal/goalExtraPlate.js.map +1 -0
- package/dist/goal/goalHistory.d.ts +24 -0
- package/dist/goal/goalHistory.d.ts.map +1 -0
- package/dist/goal/goalHistory.js +46 -0
- package/dist/goal/goalHistory.js.map +1 -0
- package/dist/goal/goalPlate.d.ts +24 -0
- package/dist/goal/goalPlate.d.ts.map +1 -0
- package/dist/goal/goalPlate.js +34 -0
- package/dist/goal/goalPlate.js.map +1 -0
- package/dist/goal/goalPlates.d.ts +66 -0
- package/dist/goal/goalPlates.d.ts.map +1 -0
- package/dist/goal/goalPlates.js +114 -0
- package/dist/goal/goalPlates.js.map +1 -0
- package/dist/goal/goalRecommendDoc.d.ts +6 -0
- package/dist/goal/goalRecommendDoc.d.ts.map +1 -0
- package/dist/goal/goalRecommendDoc.js +107 -0
- package/dist/goal/goalRecommendDoc.js.map +1 -0
- package/dist/goal/goalStore.d.ts +56 -0
- package/dist/goal/goalStore.d.ts.map +1 -0
- package/dist/goal/goalStore.js +111 -0
- package/dist/goal/goalStore.js.map +1 -0
- package/dist/goal/goalWeightDoc.d.ts +7 -0
- package/dist/goal/goalWeightDoc.d.ts.map +1 -0
- package/dist/goal/goalWeightDoc.js +107 -0
- package/dist/goal/goalWeightDoc.js.map +1 -0
- package/dist/goal/index.d.ts +13 -0
- package/dist/goal/index.d.ts.map +1 -0
- package/dist/goal/index.js +13 -0
- package/dist/goal/index.js.map +1 -0
- package/dist/goal/nutritionGoal.d.ts +115 -0
- package/dist/goal/nutritionGoal.d.ts.map +1 -0
- package/dist/goal/nutritionGoal.js +168 -0
- package/dist/goal/nutritionGoal.js.map +1 -0
- package/dist/goal/precheck.d.ts +14 -0
- package/dist/goal/precheck.d.ts.map +1 -0
- package/dist/goal/precheck.js +213 -0
- package/dist/goal/precheck.js.map +1 -0
- package/dist/goal/read.d.ts +53 -0
- package/dist/goal/read.d.ts.map +1 -0
- package/dist/goal/read.js +154 -0
- package/dist/goal/read.js.map +1 -0
- package/dist/goal/receipt.d.ts +38 -0
- package/dist/goal/receipt.d.ts.map +1 -0
- package/dist/goal/receipt.js +290 -0
- package/dist/goal/receipt.js.map +1 -0
- package/dist/goal/resultDocs.d.ts +23 -0
- package/dist/goal/resultDocs.d.ts.map +1 -0
- package/dist/goal/resultDocs.js +279 -0
- package/dist/goal/resultDocs.js.map +1 -0
- package/dist/goal/routes.d.ts +12 -0
- package/dist/goal/routes.d.ts.map +1 -0
- package/dist/goal/routes.js +29 -0
- package/dist/goal/routes.js.map +1 -0
- package/dist/goal/set.d.ts +97 -0
- package/dist/goal/set.d.ts.map +1 -0
- package/dist/goal/set.js +103 -0
- package/dist/goal/set.js.map +1 -0
- package/dist/goal/write.d.ts +30 -0
- package/dist/goal/write.d.ts.map +1 -0
- package/dist/goal/write.js +102 -0
- package/dist/goal/write.js.map +1 -0
- package/dist/health.d.ts +41 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +501 -0
- package/dist/health.js.map +1 -0
- package/dist/help-missing.json +35 -0
- package/dist/home/commands.d.ts +11 -0
- package/dist/home/commands.d.ts.map +1 -0
- package/dist/home/commands.js +8 -0
- package/dist/home/commands.js.map +1 -0
- package/dist/home/exercise.d.ts +27 -0
- package/dist/home/exercise.d.ts.map +1 -0
- package/dist/home/exercise.js +60 -0
- package/dist/home/exercise.js.map +1 -0
- package/dist/home/goalProgressDocs.d.ts +27 -0
- package/dist/home/goalProgressDocs.d.ts.map +1 -0
- package/dist/home/goalProgressDocs.js +363 -0
- package/dist/home/goalProgressDocs.js.map +1 -0
- package/dist/home/home.d.ts +38 -0
- package/dist/home/home.d.ts.map +1 -0
- package/dist/home/home.js +78 -0
- package/dist/home/home.js.map +1 -0
- package/dist/home/homeDocs.d.ts +8 -0
- package/dist/home/homeDocs.d.ts.map +1 -0
- package/dist/home/homeDocs.js +307 -0
- package/dist/home/homeDocs.js.map +1 -0
- package/dist/home/homeViewParts.d.ts +42 -0
- package/dist/home/homeViewParts.d.ts.map +1 -0
- package/dist/home/homeViewParts.js +316 -0
- package/dist/home/homeViewParts.js.map +1 -0
- package/dist/home/index.d.ts +13 -0
- package/dist/home/index.d.ts.map +1 -0
- package/dist/home/index.js +13 -0
- package/dist/home/index.js.map +1 -0
- package/dist/home/routes.d.ts +10 -0
- package/dist/home/routes.d.ts.map +1 -0
- package/dist/home/routes.js +47 -0
- package/dist/home/routes.js.map +1 -0
- package/dist/home/today.d.ts +50 -0
- package/dist/home/today.d.ts.map +1 -0
- package/dist/home/today.js +255 -0
- package/dist/home/today.js.map +1 -0
- package/dist/index.d.ts +24 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -9
- package/dist/index.js.map +1 -1
- package/dist/migrate/migrate.js +3 -3
- package/dist/migrate/migrate.js.map +1 -1
- package/dist/output.d.ts +22 -11
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +68 -128
- package/dist/output.js.map +1 -1
- package/dist/paths.d.ts +6 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +28 -17
- package/dist/paths.js.map +1 -1
- package/dist/photo/commands.d.ts +55 -0
- package/dist/photo/commands.d.ts.map +1 -0
- package/dist/photo/commands.js +25 -0
- package/dist/photo/commands.js.map +1 -0
- package/dist/photo/compare.d.ts +24 -0
- package/dist/photo/compare.d.ts.map +1 -0
- package/dist/photo/compare.js +48 -0
- package/dist/photo/compare.js.map +1 -0
- package/dist/photo/compareDoc.d.ts +5 -0
- package/dist/photo/compareDoc.d.ts.map +1 -0
- package/dist/photo/compareDoc.js +221 -0
- package/dist/photo/compareDoc.js.map +1 -0
- package/dist/photo/dir.d.ts +5 -0
- package/dist/photo/dir.d.ts.map +1 -0
- package/dist/photo/dir.js +23 -0
- package/dist/photo/dir.js.map +1 -0
- package/dist/photo/gallery.d.ts +16 -0
- package/dist/photo/gallery.d.ts.map +1 -0
- package/dist/photo/gallery.js +45 -0
- package/dist/photo/gallery.js.map +1 -0
- package/dist/photo/galleryDoc.d.ts +12 -0
- package/dist/photo/galleryDoc.d.ts.map +1 -0
- package/dist/photo/galleryDoc.js +291 -0
- package/dist/photo/galleryDoc.js.map +1 -0
- package/dist/photo/gif.d.ts +28 -0
- package/dist/photo/gif.d.ts.map +1 -0
- package/dist/photo/gif.js +281 -0
- package/dist/photo/gif.js.map +1 -0
- package/dist/photo/gifDoc.d.ts +52 -0
- package/dist/photo/gifDoc.d.ts.map +1 -0
- package/dist/photo/gifDoc.js +317 -0
- package/dist/photo/gifDoc.js.map +1 -0
- package/dist/photo/help.d.ts +4 -0
- package/dist/photo/help.d.ts.map +1 -0
- package/dist/photo/help.js +87 -0
- package/dist/photo/help.js.map +1 -0
- package/dist/photo/helpCenter.d.ts +137 -0
- package/dist/photo/helpCenter.d.ts.map +1 -0
- package/dist/photo/helpCenter.js +475 -0
- package/dist/photo/helpCenter.js.map +1 -0
- package/dist/photo/helpDoc.d.ts +5 -0
- package/dist/photo/helpDoc.d.ts.map +1 -0
- package/dist/photo/helpDoc.js +205 -0
- package/dist/photo/helpDoc.js.map +1 -0
- package/dist/photo/helpDocContent.d.ts +77 -0
- package/dist/photo/helpDocContent.d.ts.map +1 -0
- package/dist/photo/helpDocContent.js +120 -0
- package/dist/photo/helpDocContent.js.map +1 -0
- package/dist/photo/helpDocCss.d.ts +5 -0
- package/dist/photo/helpDocCss.d.ts.map +1 -0
- package/dist/photo/helpDocCss.js +119 -0
- package/dist/photo/helpDocCss.js.map +1 -0
- package/dist/photo/helpFile.d.ts +26 -0
- package/dist/photo/helpFile.d.ts.map +1 -0
- package/dist/photo/helpFile.js +90 -0
- package/dist/photo/helpFile.js.map +1 -0
- package/dist/photo/helpLookup.d.ts +18 -0
- package/dist/photo/helpLookup.d.ts.map +1 -0
- package/dist/photo/helpLookup.js +58 -0
- package/dist/photo/helpLookup.js.map +1 -0
- package/dist/photo/helpPaths.d.ts +22 -0
- package/dist/photo/helpPaths.d.ts.map +1 -0
- package/dist/photo/helpPaths.js +22 -0
- package/dist/photo/helpPaths.js.map +1 -0
- package/dist/photo/helpShell.d.ts +16 -0
- package/dist/photo/helpShell.d.ts.map +1 -0
- package/dist/photo/helpShell.js +27 -0
- package/dist/photo/helpShell.js.map +1 -0
- package/dist/photo/index.d.ts +13 -0
- package/dist/photo/index.d.ts.map +1 -0
- package/dist/photo/index.js +13 -0
- package/dist/photo/index.js.map +1 -0
- package/dist/photo/manage.d.ts +13 -0
- package/dist/photo/manage.d.ts.map +1 -0
- package/dist/photo/manage.js +64 -0
- package/dist/photo/manage.js.map +1 -0
- package/dist/photo/photo.d.ts +118 -0
- package/dist/photo/photo.d.ts.map +1 -0
- package/dist/photo/photo.js +279 -0
- package/dist/photo/photo.js.map +1 -0
- package/dist/photo/photoThumb.d.ts +38 -0
- package/dist/photo/photoThumb.d.ts.map +1 -0
- package/dist/photo/photoThumb.js +83 -0
- package/dist/photo/photoThumb.js.map +1 -0
- package/dist/photo/photoUi.d.ts +39 -0
- package/dist/photo/photoUi.d.ts.map +1 -0
- package/dist/photo/photoUi.js +233 -0
- package/dist/photo/photoUi.js.map +1 -0
- package/dist/photo/photos.d.ts +78 -0
- package/dist/photo/photos.d.ts.map +1 -0
- package/dist/photo/photos.js +194 -0
- package/dist/photo/photos.js.map +1 -0
- package/dist/photo/picker.d.ts +41 -0
- package/dist/photo/picker.d.ts.map +1 -0
- package/dist/photo/picker.js +132 -0
- package/dist/photo/picker.js.map +1 -0
- package/dist/photo/pickerDoc.d.ts +12 -0
- package/dist/photo/pickerDoc.d.ts.map +1 -0
- package/dist/photo/pickerDoc.js +231 -0
- package/dist/photo/pickerDoc.js.map +1 -0
- package/dist/photo/receipt.d.ts +23 -0
- package/dist/photo/receipt.d.ts.map +1 -0
- package/dist/photo/receipt.js +331 -0
- package/dist/photo/receipt.js.map +1 -0
- package/dist/photo/receiptUi.d.ts +42 -0
- package/dist/photo/receiptUi.d.ts.map +1 -0
- package/dist/photo/receiptUi.js +147 -0
- package/dist/photo/receiptUi.js.map +1 -0
- package/dist/photo/routes.d.ts +10 -0
- package/dist/photo/routes.d.ts.map +1 -0
- package/dist/photo/routes.js +29 -0
- package/dist/photo/routes.js.map +1 -0
- package/dist/photo/store.d.ts +10 -0
- package/dist/photo/store.d.ts.map +1 -0
- package/dist/photo/store.js +44 -0
- package/dist/photo/store.js.map +1 -0
- package/dist/photo/templates.d.ts +4 -0
- package/dist/photo/templates.d.ts.map +1 -0
- package/dist/photo/templates.js +29 -0
- package/dist/photo/templates.js.map +1 -0
- package/dist/photo/viewerDoc.d.ts +5 -0
- package/dist/photo/viewerDoc.d.ts.map +1 -0
- package/dist/photo/viewerDoc.js +255 -0
- package/dist/photo/viewerDoc.js.map +1 -0
- package/dist/photo/wizard.d.ts +15 -0
- package/dist/photo/wizard.d.ts.map +1 -0
- package/dist/photo/wizard.js +25 -0
- package/dist/photo/wizard.js.map +1 -0
- package/dist/photo/wizardPort.d.ts +70 -0
- package/dist/photo/wizardPort.d.ts.map +1 -0
- package/dist/photo/wizardPort.js +232 -0
- package/dist/photo/wizardPort.js.map +1 -0
- package/dist/photo/wizardPortDocs.d.ts +6 -0
- package/dist/photo/wizardPortDocs.d.ts.map +1 -0
- package/dist/photo/wizardPortDocs.js +322 -0
- package/dist/photo/wizardPortDocs.js.map +1 -0
- package/dist/photo/wizardUi.d.ts +24 -0
- package/dist/photo/wizardUi.d.ts.map +1 -0
- package/dist/photo/wizardUi.js +101 -0
- package/dist/photo/wizardUi.js.map +1 -0
- package/dist/profile/commands.d.ts +32 -0
- package/dist/profile/commands.d.ts.map +1 -0
- package/dist/profile/commands.js +11 -0
- package/dist/profile/commands.js.map +1 -0
- package/dist/profile/index.d.ts +17 -0
- package/dist/profile/index.d.ts.map +1 -0
- package/dist/profile/index.js +17 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/labels.d.ts +10 -0
- package/dist/profile/labels.d.ts.map +1 -0
- package/dist/profile/labels.js +52 -0
- package/dist/profile/labels.js.map +1 -0
- package/dist/profile/read.d.ts +13 -0
- package/dist/profile/read.d.ts.map +1 -0
- package/dist/profile/read.js +24 -0
- package/dist/profile/read.js.map +1 -0
- package/dist/profile/receipt.d.ts +10 -0
- package/dist/profile/receipt.d.ts.map +1 -0
- package/dist/profile/receipt.js +19 -0
- package/dist/profile/receipt.js.map +1 -0
- package/dist/profile/routes.d.ts +8 -0
- package/dist/profile/routes.d.ts.map +1 -0
- package/dist/profile/routes.js +9 -0
- package/dist/profile/routes.js.map +1 -0
- package/dist/profile/setup.d.ts +26 -7
- package/dist/profile/setup.d.ts.map +1 -1
- package/dist/profile/setup.js +184 -78
- package/dist/profile/setup.js.map +1 -1
- package/dist/profile/update.d.ts +1 -1
- package/dist/profile/update.d.ts.map +1 -1
- package/dist/profile/update.js +33 -13
- package/dist/profile/update.js.map +1 -1
- package/dist/profile/view.d.ts +35 -4
- package/dist/profile/view.d.ts.map +1 -1
- package/dist/profile/view.js +132 -22
- package/dist/profile/view.js.map +1 -1
- package/dist/profile/write.d.ts +16 -0
- package/dist/profile/write.d.ts.map +1 -0
- package/dist/profile/write.js +75 -0
- package/dist/profile/write.js.map +1 -0
- package/dist/render/analysisPlate.d.ts +4 -4
- package/dist/render/analysisPlate.d.ts.map +1 -1
- package/dist/render/analysisPlate.js +5 -22
- package/dist/render/analysisPlate.js.map +1 -1
- package/dist/render/diet.d.ts +10 -6
- package/dist/render/diet.d.ts.map +1 -1
- package/dist/render/diet.js +8 -23
- package/dist/render/diet.js.map +1 -1
- package/dist/render/dietDocs.d.ts +19 -19
- package/dist/render/dietDocs.d.ts.map +1 -1
- package/dist/render/dietDocs.js +158 -457
- package/dist/render/dietDocs.js.map +1 -1
- package/dist/render/exercisePort.d.ts +4 -2
- package/dist/render/exercisePort.d.ts.map +1 -1
- package/dist/render/exercisePort.js +4 -3
- package/dist/render/exercisePort.js.map +1 -1
- package/dist/render/goalExtra.d.ts.map +1 -1
- package/dist/render/goalExtra.js +2 -1
- package/dist/render/goalExtra.js.map +1 -1
- package/dist/render/goalPlate.d.ts +2 -2
- package/dist/render/goalPlate.d.ts.map +1 -1
- package/dist/render/goalPlate.js +3 -3
- package/dist/render/goalPlate.js.map +1 -1
- package/dist/render/helpShell.d.ts +1 -1
- package/dist/render/helpShell.d.ts.map +1 -1
- package/dist/render/html.d.ts +34 -24
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +38 -88
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +34 -33
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +30 -18
- package/dist/render/index.js.map +1 -1
- package/dist/render/insightPlate.d.ts +17 -0
- package/dist/render/insightPlate.d.ts.map +1 -1
- package/dist/render/insightPlate.js +109 -1
- package/dist/render/insightPlate.js.map +1 -1
- package/dist/render/pageChromeCss.d.ts +24 -0
- package/dist/render/pageChromeCss.d.ts.map +1 -0
- package/dist/render/pageChromeCss.js +45 -0
- package/dist/render/pageChromeCss.js.map +1 -0
- package/dist/render/planCopyBlock.d.ts +32 -0
- package/dist/render/planCopyBlock.d.ts.map +1 -0
- package/dist/render/planCopyBlock.js +34 -0
- package/dist/render/planCopyBlock.js.map +1 -0
- package/dist/render/planEditor.d.ts +94 -0
- package/dist/render/planEditor.d.ts.map +1 -0
- package/dist/render/planEditor.js +38 -0
- package/dist/render/planEditor.js.map +1 -0
- package/dist/render/planEditorCss.d.ts +13 -0
- package/dist/render/planEditorCss.d.ts.map +1 -0
- package/dist/render/planEditorCss.js +140 -0
- package/dist/render/planEditorCss.js.map +1 -0
- package/dist/render/planEditorDocs.d.ts +7 -0
- package/dist/render/planEditorDocs.d.ts.map +1 -0
- package/dist/render/planEditorDocs.js +56 -0
- package/dist/render/planEditorDocs.js.map +1 -0
- package/dist/render/planEditorPort.d.ts +45 -0
- package/dist/render/planEditorPort.d.ts.map +1 -0
- package/dist/render/planEditorPort.js +217 -0
- package/dist/render/planEditorPort.js.map +1 -0
- package/dist/render/planEditorRuntime.d.ts +15 -0
- package/dist/render/planEditorRuntime.d.ts.map +1 -0
- package/dist/render/planEditorRuntime.js +427 -0
- package/dist/render/planEditorRuntime.js.map +1 -0
- package/dist/render/planPlate.d.ts +84 -4
- package/dist/render/planPlate.d.ts.map +1 -1
- package/dist/render/planPlate.js +155 -7
- package/dist/render/planPlate.js.map +1 -1
- package/dist/render/planWizardCss.d.ts +21 -0
- package/dist/render/planWizardCss.d.ts.map +1 -0
- package/dist/render/planWizardCss.js +121 -0
- package/dist/render/planWizardCss.js.map +1 -0
- package/dist/render/planWizardDocs.d.ts +8 -0
- package/dist/render/planWizardDocs.d.ts.map +1 -0
- package/dist/render/planWizardDocs.js +151 -0
- package/dist/render/planWizardDocs.js.map +1 -0
- package/dist/render/receipt.d.ts +1 -1
- package/dist/render/receipt.d.ts.map +1 -1
- package/dist/render/receipt.js +1 -1
- package/dist/render/receipt.js.map +1 -1
- package/dist/render/sportDocs.d.ts +17 -12
- package/dist/render/sportDocs.d.ts.map +1 -1
- package/dist/render/sportDocs.js +370 -525
- package/dist/render/sportDocs.js.map +1 -1
- package/dist/render/sportPortDocs.d.ts +3 -2
- package/dist/render/sportPortDocs.d.ts.map +1 -1
- package/dist/render/sportPortDocs.js +810 -389
- package/dist/render/sportPortDocs.js.map +1 -1
- package/dist/render/trendDocs.d.ts +16 -6
- package/dist/render/trendDocs.d.ts.map +1 -1
- package/dist/render/trendDocs.js +293 -252
- package/dist/render/trendDocs.js.map +1 -1
- package/dist/render/trendMiscPort.d.ts +9 -24
- package/dist/render/trendMiscPort.d.ts.map +1 -1
- package/dist/render/trendMiscPort.js +13 -34
- package/dist/render/trendMiscPort.js.map +1 -1
- package/dist/render/trendMiscPortDocs.d.ts +1 -2
- package/dist/render/trendMiscPortDocs.d.ts.map +1 -1
- package/dist/render/trendMiscPortDocs.js +256 -107
- package/dist/render/trendMiscPortDocs.js.map +1 -1
- package/dist/render/trendPredictDocs.d.ts +16 -0
- package/dist/render/trendPredictDocs.d.ts.map +1 -0
- package/dist/render/trendPredictDocs.js +1131 -0
- package/dist/render/trendPredictDocs.js.map +1 -0
- package/dist/render/wizardPort.d.ts +9 -62
- package/dist/render/wizardPort.d.ts.map +1 -1
- package/dist/render/wizardPort.js +20 -180
- package/dist/render/wizardPort.js.map +1 -1
- package/dist/render/wizardPortDocs.d.ts +5 -5
- package/dist/render/wizardPortDocs.d.ts.map +1 -1
- package/dist/render/wizardPortDocs.js +273 -215
- package/dist/render/wizardPortDocs.js.map +1 -1
- package/dist/render/workoutMovementTable.d.ts +10 -0
- package/dist/render/workoutMovementTable.d.ts.map +1 -0
- package/dist/render/workoutMovementTable.js +153 -0
- package/dist/render/workoutMovementTable.js.map +1 -0
- package/dist/render/workoutPlanCss.d.ts +15 -0
- package/dist/render/workoutPlanCss.d.ts.map +1 -0
- package/dist/render/workoutPlanCss.js +217 -0
- package/dist/render/workoutPlanCss.js.map +1 -0
- package/dist/render/workoutPlanDocs.d.ts +23 -0
- package/dist/render/workoutPlanDocs.d.ts.map +1 -0
- package/dist/render/workoutPlanDocs.js +244 -0
- package/dist/render/workoutPlanDocs.js.map +1 -0
- package/dist/render/workoutPlanLook.d.ts +16 -0
- package/dist/render/workoutPlanLook.d.ts.map +1 -0
- package/dist/render/workoutPlanLook.js +135 -0
- package/dist/render/workoutPlanLook.js.map +1 -0
- package/dist/shared/alive.d.ts +22 -0
- package/dist/shared/alive.d.ts.map +1 -0
- package/dist/shared/alive.js +22 -0
- package/dist/shared/alive.js.map +1 -0
- package/dist/shared/commandSpec.d.ts +83 -0
- package/dist/shared/commandSpec.d.ts.map +1 -0
- package/dist/shared/commandSpec.js +2 -0
- package/dist/shared/commandSpec.js.map +1 -0
- package/dist/shared/conclusionLine.d.ts +3 -0
- package/dist/shared/conclusionLine.d.ts.map +1 -0
- package/dist/shared/conclusionLine.js +21 -0
- package/dist/shared/conclusionLine.js.map +1 -0
- package/dist/shared/contentSuffix.d.ts +17 -0
- package/dist/shared/contentSuffix.d.ts.map +1 -0
- package/dist/shared/contentSuffix.js +125 -0
- package/dist/shared/contentSuffix.js.map +1 -0
- package/dist/shared/copyArea.d.ts +30 -11
- package/dist/shared/copyArea.d.ts.map +1 -1
- package/dist/shared/copyArea.js +68 -13
- package/dist/shared/copyArea.js.map +1 -1
- package/dist/shared/copyBlock.d.ts +4 -0
- package/dist/shared/copyBlock.d.ts.map +1 -0
- package/dist/shared/copyBlock.js +26 -0
- package/dist/shared/copyBlock.js.map +1 -0
- package/dist/shared/docPage.d.ts +26 -4
- package/dist/shared/docPage.d.ts.map +1 -1
- package/dist/shared/docPage.js +84 -10
- package/dist/shared/docPage.js.map +1 -1
- package/dist/shared/emptyGuide.d.ts +9 -0
- package/dist/shared/emptyGuide.d.ts.map +1 -0
- package/dist/shared/emptyGuide.js +31 -0
- package/dist/shared/emptyGuide.js.map +1 -0
- package/dist/shared/fieldLabel.d.ts +5 -0
- package/dist/shared/fieldLabel.d.ts.map +1 -0
- package/dist/shared/fieldLabel.js +42 -0
- package/dist/shared/fieldLabel.js.map +1 -0
- package/dist/shared/healthRate.d.ts +21 -0
- package/dist/shared/healthRate.d.ts.map +1 -0
- package/dist/shared/healthRate.js +21 -0
- package/dist/shared/healthRate.js.map +1 -0
- package/dist/shared/kcalPerKg.d.ts +16 -0
- package/dist/shared/kcalPerKg.d.ts.map +1 -0
- package/dist/shared/kcalPerKg.js +16 -0
- package/dist/shared/kcalPerKg.js.map +1 -0
- package/dist/shared/meal.d.ts +46 -0
- package/dist/shared/meal.d.ts.map +1 -0
- package/dist/shared/meal.js +75 -0
- package/dist/shared/meal.js.map +1 -0
- package/dist/shared/nutritionRange.d.ts +28 -0
- package/dist/shared/nutritionRange.d.ts.map +1 -0
- package/dist/shared/nutritionRange.js +28 -0
- package/dist/shared/nutritionRange.js.map +1 -0
- package/dist/shared/operationHead.d.ts +21 -0
- package/dist/shared/operationHead.d.ts.map +1 -0
- package/dist/shared/operationHead.js +73 -0
- package/dist/shared/operationHead.js.map +1 -0
- package/dist/shared/pageKit.d.ts +25 -0
- package/dist/shared/pageKit.d.ts.map +1 -0
- package/dist/shared/pageKit.js +56 -0
- package/dist/shared/pageKit.js.map +1 -0
- package/dist/shared/pageStrips.d.ts +81 -0
- package/dist/shared/pageStrips.d.ts.map +1 -0
- package/dist/shared/pageStrips.js +166 -0
- package/dist/shared/pageStrips.js.map +1 -0
- package/dist/shared/params.d.ts +54 -0
- package/dist/shared/params.d.ts.map +1 -0
- package/dist/shared/params.js +176 -0
- package/dist/shared/params.js.map +1 -0
- package/dist/shared/planCopyBlock.d.ts +32 -0
- package/dist/shared/planCopyBlock.d.ts.map +1 -0
- package/dist/shared/planCopyBlock.js +34 -0
- package/dist/shared/planCopyBlock.js.map +1 -0
- package/dist/shared/receiptParts.d.ts +9 -0
- package/dist/shared/receiptParts.d.ts.map +1 -0
- package/dist/shared/receiptParts.js +40 -0
- package/dist/shared/receiptParts.js.map +1 -0
- package/dist/shared/sceneEnvelope.d.ts +32 -0
- package/dist/shared/sceneEnvelope.d.ts.map +1 -0
- package/dist/shared/sceneEnvelope.js +12 -0
- package/dist/shared/sceneEnvelope.js.map +1 -0
- package/dist/shared/sourceLine.d.ts +10 -0
- package/dist/shared/sourceLine.d.ts.map +1 -0
- package/dist/shared/sourceLine.js +39 -0
- package/dist/shared/sourceLine.js.map +1 -0
- package/dist/shared/time.d.ts +28 -0
- package/dist/shared/time.d.ts.map +1 -0
- package/dist/shared/time.js +37 -0
- package/dist/shared/time.js.map +1 -0
- package/dist/shared/writeParts.d.ts +61 -0
- package/dist/shared/writeParts.d.ts.map +1 -0
- package/dist/shared/writeParts.js +79 -0
- package/dist/shared/writeParts.js.map +1 -0
- package/dist/triggers/help-lookup.d.ts +41 -5
- package/dist/triggers/help-lookup.d.ts.map +1 -1
- package/dist/triggers/help-lookup.js +100 -51
- package/dist/triggers/help-lookup.js.map +1 -1
- package/dist/triggers/index.js +1 -1
- package/dist/triggers/routeSpec.d.ts +66 -0
- package/dist/triggers/routeSpec.d.ts.map +1 -0
- package/dist/triggers/routeSpec.js +21 -0
- package/dist/triggers/routeSpec.js.map +1 -0
- package/dist/triggers/routes.generated.d.ts +17 -0
- package/dist/triggers/routes.generated.d.ts.map +1 -0
- package/dist/triggers/routes.generated.js +519 -0
- package/dist/triggers/routes.generated.js.map +1 -0
- package/dist/triggers/routing.d.ts +11 -34
- package/dist/triggers/routing.d.ts.map +1 -1
- package/dist/triggers/routing.js +12 -528
- package/dist/triggers/routing.js.map +1 -1
- package/dist/triggers/scene-01-home.js +9 -9
- package/dist/triggers/scene-01-home.js.map +1 -1
- package/dist/triggers/scene-02-diet.js +62 -62
- package/dist/triggers/scene-02-diet.js.map +1 -1
- package/dist/triggers/scene-03-weight.js +54 -54
- package/dist/triggers/scene-03-weight.js.map +1 -1
- package/dist/triggers/scene-04-exercise.js +33 -33
- package/dist/triggers/scene-04-exercise.js.map +1 -1
- package/dist/triggers/scene-05-workout.js +32 -32
- package/dist/triggers/scene-05-workout.js.map +1 -1
- package/dist/triggers/scene-06-goal.d.ts +1 -1
- package/dist/triggers/scene-06-goal.d.ts.map +1 -1
- package/dist/triggers/scene-06-goal.js +25 -24
- package/dist/triggers/scene-06-goal.js.map +1 -1
- package/dist/triggers/scene-07-profile.js +1 -1
- package/dist/triggers/scene-07-profile.js.map +1 -1
- package/dist/triggers/scene-08-body.js +10 -10
- package/dist/triggers/scene-08-body.js.map +1 -1
- package/dist/triggers/scene-09-photo.js +10 -10
- package/dist/triggers/scene-09-photo.js.map +1 -1
- package/dist/triggers/scene-10-analysis.js +176 -176
- package/dist/triggers/scene-10-analysis.js.map +1 -1
- package/dist/triggers/wake-assets.d.ts.map +1 -1
- package/dist/triggers/wake-assets.js +21 -11
- package/dist/triggers/wake-assets.js.map +1 -1
- package/dist/weight/commands.d.ts +24 -0
- package/dist/weight/commands.d.ts.map +1 -0
- package/dist/weight/commands.js +19 -0
- package/dist/weight/commands.js.map +1 -0
- package/dist/weight/compare.d.ts +60 -0
- package/dist/weight/compare.d.ts.map +1 -0
- package/dist/weight/compare.js +570 -0
- package/dist/weight/compare.js.map +1 -0
- package/dist/weight/edit.d.ts +13 -0
- package/dist/weight/edit.d.ts.map +1 -0
- package/dist/weight/edit.js +87 -0
- package/dist/weight/edit.js.map +1 -0
- package/dist/weight/fieldLabels.d.ts +5 -0
- package/dist/weight/fieldLabels.d.ts.map +1 -0
- package/dist/weight/fieldLabels.js +23 -0
- package/dist/weight/fieldLabels.js.map +1 -0
- package/dist/weight/figures.d.ts +87 -0
- package/dist/weight/figures.d.ts.map +1 -0
- package/dist/weight/figures.js +221 -0
- package/dist/weight/figures.js.map +1 -0
- package/dist/weight/history.d.ts +85 -0
- package/dist/weight/history.d.ts.map +1 -0
- package/dist/weight/history.js +771 -0
- package/dist/weight/history.js.map +1 -0
- package/dist/weight/index.d.ts +21 -0
- package/dist/weight/index.d.ts.map +1 -0
- package/dist/weight/index.js +20 -0
- package/dist/weight/index.js.map +1 -0
- package/dist/weight/log.d.ts +40 -0
- package/dist/weight/log.d.ts.map +1 -0
- package/dist/weight/log.js +355 -0
- package/dist/weight/log.js.map +1 -0
- package/dist/weight/logReceipt.d.ts +28 -0
- package/dist/weight/logReceipt.d.ts.map +1 -0
- package/dist/weight/logReceipt.js +259 -0
- package/dist/weight/logReceipt.js.map +1 -0
- package/dist/weight/plate.d.ts +77 -0
- package/dist/weight/plate.d.ts.map +1 -0
- package/dist/weight/plate.js +60 -0
- package/dist/weight/plate.js.map +1 -0
- package/dist/weight/plateDocs.d.ts +83 -0
- package/dist/weight/plateDocs.d.ts.map +1 -0
- package/dist/weight/plateDocs.js +179 -0
- package/dist/weight/plateDocs.js.map +1 -0
- package/dist/weight/receipt.d.ts +23 -0
- package/dist/weight/receipt.d.ts.map +1 -0
- package/dist/weight/receipt.js +178 -0
- package/dist/weight/receipt.js.map +1 -0
- package/dist/weight/records.d.ts +109 -0
- package/dist/weight/records.d.ts.map +1 -0
- package/dist/weight/records.js +212 -0
- package/dist/weight/records.js.map +1 -0
- package/dist/weight/review.d.ts +114 -0
- package/dist/weight/review.d.ts.map +1 -0
- package/dist/weight/review.js +651 -0
- package/dist/weight/review.js.map +1 -0
- package/dist/weight/routes.d.ts +7 -0
- package/dist/weight/routes.d.ts.map +1 -0
- package/dist/weight/routes.js +68 -0
- package/dist/weight/routes.js.map +1 -0
- package/dist/weight/volatility.d.ts +78 -0
- package/dist/weight/volatility.d.ts.map +1 -0
- package/dist/weight/volatility.js +203 -0
- package/dist/weight/volatility.js.map +1 -0
- package/dist/weight/volatilityDoc.d.ts +10 -0
- package/dist/weight/volatilityDoc.d.ts.map +1 -0
- package/dist/weight/volatilityDoc.js +395 -0
- package/dist/weight/volatilityDoc.js.map +1 -0
- package/dist/weight/weightCompare.d.ts +70 -0
- package/dist/weight/weightCompare.d.ts.map +1 -0
- package/dist/weight/weightCompare.js +221 -0
- package/dist/weight/weightCompare.js.map +1 -0
- package/dist/weight/weightCompare2.d.ts +66 -0
- package/dist/weight/weightCompare2.d.ts.map +1 -0
- package/dist/weight/weightCompare2.js +218 -0
- package/dist/weight/weightCompare2.js.map +1 -0
- package/dist/weight/weightCompare3.d.ts +18 -0
- package/dist/weight/weightCompare3.d.ts.map +1 -0
- package/dist/weight/weightCompare3.js +222 -0
- package/dist/weight/weightCompare3.js.map +1 -0
- package/dist/weight/weightUi.d.ts +126 -0
- package/dist/weight/weightUi.d.ts.map +1 -0
- package/dist/weight/weightUi.js +226 -0
- package/dist/weight/weightUi.js.map +1 -0
- package/dist/workout/commands.d.ts +43 -0
- package/dist/workout/commands.d.ts.map +1 -0
- package/dist/workout/commands.js +36 -0
- package/dist/workout/commands.js.map +1 -0
- package/dist/workout/contraindication.d.ts +11 -0
- package/dist/workout/contraindication.d.ts.map +1 -0
- package/dist/workout/contraindication.js +11 -0
- package/dist/workout/contraindication.js.map +1 -0
- package/dist/workout/dayPhrase.d.ts +13 -0
- package/dist/workout/dayPhrase.d.ts.map +1 -0
- package/dist/workout/dayPhrase.js +15 -0
- package/dist/workout/dayPhrase.js.map +1 -0
- package/dist/workout/fieldLabels.d.ts +5 -0
- package/dist/workout/fieldLabels.d.ts.map +1 -0
- package/dist/workout/fieldLabels.js +45 -0
- package/dist/workout/fieldLabels.js.map +1 -0
- package/dist/workout/index.d.ts +21 -0
- package/dist/workout/index.d.ts.map +1 -0
- package/dist/workout/index.js +20 -0
- package/dist/workout/index.js.map +1 -0
- package/dist/workout/land.d.ts +45 -0
- package/dist/workout/land.d.ts.map +1 -0
- package/dist/workout/land.js +280 -0
- package/dist/workout/land.js.map +1 -0
- package/dist/workout/landBatch.d.ts +62 -0
- package/dist/workout/landBatch.d.ts.map +1 -0
- package/dist/workout/landBatch.js +227 -0
- package/dist/workout/landBatch.js.map +1 -0
- package/dist/workout/landBatchPages.d.ts +31 -0
- package/dist/workout/landBatchPages.d.ts.map +1 -0
- package/dist/workout/landBatchPages.js +111 -0
- package/dist/workout/landBatchPages.js.map +1 -0
- package/dist/workout/landPages.d.ts +41 -0
- package/dist/workout/landPages.d.ts.map +1 -0
- package/dist/workout/landPages.js +132 -0
- package/dist/workout/landPages.js.map +1 -0
- package/dist/workout/landRunner.d.ts +40 -0
- package/dist/workout/landRunner.d.ts.map +1 -0
- package/dist/workout/landRunner.js +134 -0
- package/dist/workout/landRunner.js.map +1 -0
- package/dist/workout/movementType.d.ts +14 -0
- package/dist/workout/movementType.d.ts.map +1 -0
- package/dist/workout/movementType.js +16 -0
- package/dist/workout/movementType.js.map +1 -0
- package/dist/workout/plan.d.ts +21 -0
- package/dist/workout/plan.d.ts.map +1 -0
- package/dist/workout/plan.js +44 -0
- package/dist/workout/plan.js.map +1 -0
- package/dist/workout/planCopyBlock.d.ts +9 -0
- package/dist/workout/planCopyBlock.d.ts.map +1 -0
- package/dist/workout/planCopyBlock.js +9 -0
- package/dist/workout/planCopyBlock.js.map +1 -0
- package/dist/workout/planEditor.d.ts +94 -0
- package/dist/workout/planEditor.d.ts.map +1 -0
- package/dist/workout/planEditor.js +38 -0
- package/dist/workout/planEditor.js.map +1 -0
- package/dist/workout/planEditorCss.d.ts +13 -0
- package/dist/workout/planEditorCss.d.ts.map +1 -0
- package/dist/workout/planEditorCss.js +140 -0
- package/dist/workout/planEditorCss.js.map +1 -0
- package/dist/workout/planEditorDocs.d.ts +7 -0
- package/dist/workout/planEditorDocs.d.ts.map +1 -0
- package/dist/workout/planEditorDocs.js +56 -0
- package/dist/workout/planEditorDocs.js.map +1 -0
- package/dist/workout/planEditorPort.d.ts +45 -0
- package/dist/workout/planEditorPort.d.ts.map +1 -0
- package/dist/workout/planEditorPort.js +217 -0
- package/dist/workout/planEditorPort.js.map +1 -0
- package/dist/workout/planEditorRuntime.d.ts +15 -0
- package/dist/workout/planEditorRuntime.d.ts.map +1 -0
- package/dist/workout/planEditorRuntime.js +427 -0
- package/dist/workout/planEditorRuntime.js.map +1 -0
- package/dist/workout/planStore.d.ts +157 -0
- package/dist/workout/planStore.d.ts.map +1 -0
- package/dist/workout/planStore.js +280 -0
- package/dist/workout/planStore.js.map +1 -0
- package/dist/workout/precheckPrompt.d.ts +7 -0
- package/dist/workout/precheckPrompt.d.ts.map +1 -0
- package/dist/workout/precheckPrompt.js +35 -0
- package/dist/workout/precheckPrompt.js.map +1 -0
- package/dist/workout/progress.d.ts +12 -0
- package/dist/workout/progress.d.ts.map +1 -0
- package/dist/workout/progress.js +16 -0
- package/dist/workout/progress.js.map +1 -0
- package/dist/workout/receipt.d.ts +15 -0
- package/dist/workout/receipt.d.ts.map +1 -0
- package/dist/workout/receipt.js +128 -0
- package/dist/workout/receipt.js.map +1 -0
- package/dist/workout/review.d.ts +12 -0
- package/dist/workout/review.d.ts.map +1 -0
- package/dist/workout/review.js +15 -0
- package/dist/workout/review.js.map +1 -0
- package/dist/workout/reviewDocs.d.ts +3 -0
- package/dist/workout/reviewDocs.d.ts.map +1 -0
- package/dist/workout/reviewDocs.js +222 -0
- package/dist/workout/reviewDocs.js.map +1 -0
- package/dist/workout/reviewDocsCss.d.ts +5 -0
- package/dist/workout/reviewDocsCss.d.ts.map +1 -0
- package/dist/workout/reviewDocsCss.js +128 -0
- package/dist/workout/reviewDocsCss.js.map +1 -0
- package/dist/workout/routes.d.ts +13 -0
- package/dist/workout/routes.d.ts.map +1 -0
- package/dist/workout/routes.js +49 -0
- package/dist/workout/routes.js.map +1 -0
- package/dist/workout/wizard.d.ts +14 -0
- package/dist/workout/wizard.d.ts.map +1 -0
- package/dist/workout/wizard.js +20 -0
- package/dist/workout/wizard.js.map +1 -0
- package/dist/workout/write.d.ts +78 -0
- package/dist/workout/write.d.ts.map +1 -0
- package/dist/workout/write.js +607 -0
- package/dist/workout/write.js.map +1 -0
- package/dist/workout/xunjiBackfill.d.ts +36 -0
- package/dist/workout/xunjiBackfill.d.ts.map +1 -0
- package/dist/workout/xunjiBackfill.js +177 -0
- package/dist/workout/xunjiBackfill.js.map +1 -0
- package/dist/workout/xunjiPush.d.ts +33 -0
- package/dist/workout/xunjiPush.d.ts.map +1 -0
- package/dist/workout/xunjiPush.js +215 -0
- package/dist/workout/xunjiPush.js.map +1 -0
- package/dist/workout/xunjiRunner.d.ts +35 -0
- package/dist/workout/xunjiRunner.d.ts.map +1 -0
- package/dist/workout/xunjiRunner.js +110 -0
- package/dist/workout/xunjiRunner.js.map +1 -0
- package/dist/xunji/backfill.d.ts +65 -0
- package/dist/xunji/backfill.d.ts.map +1 -0
- package/dist/xunji/backfill.js +156 -0
- package/dist/xunji/backfill.js.map +1 -0
- package/dist/xunji/catalog.d.ts +55 -0
- package/dist/xunji/catalog.d.ts.map +1 -0
- package/dist/xunji/catalog.js +132 -0
- package/dist/xunji/catalog.js.map +1 -0
- package/dist/xunji/cli.d.ts +3 -0
- package/dist/xunji/cli.d.ts.map +1 -0
- package/dist/xunji/cli.js +15 -0
- package/dist/xunji/cli.js.map +1 -0
- package/dist/xunji/exitMap.d.ts +37 -0
- package/dist/xunji/exitMap.d.ts.map +1 -0
- package/dist/xunji/exitMap.js +42 -0
- package/dist/xunji/exitMap.js.map +1 -0
- package/dist/xunji/fetch.d.ts +76 -0
- package/dist/xunji/fetch.d.ts.map +1 -0
- package/dist/xunji/fetch.js +159 -0
- package/dist/xunji/fetch.js.map +1 -0
- package/dist/xunji/index.d.ts +21 -0
- package/dist/xunji/index.d.ts.map +1 -0
- package/dist/xunji/index.js +18 -0
- package/dist/xunji/index.js.map +1 -0
- package/dist/xunji/key.d.ts +37 -0
- package/dist/xunji/key.d.ts.map +1 -0
- package/dist/xunji/key.js +100 -0
- package/dist/xunji/key.js.map +1 -0
- package/dist/xunji/overlay-plan.d.ts +79 -0
- package/dist/xunji/overlay-plan.d.ts.map +1 -0
- package/dist/xunji/overlay-plan.js +145 -0
- package/dist/xunji/overlay-plan.js.map +1 -0
- package/dist/xunji/planSource.d.ts +40 -0
- package/dist/xunji/planSource.d.ts.map +1 -0
- package/dist/xunji/planSource.js +78 -0
- package/dist/xunji/planSource.js.map +1 -0
- package/dist/xunji/push.d.ts +55 -0
- package/dist/xunji/push.d.ts.map +1 -0
- package/dist/xunji/push.js +69 -0
- package/dist/xunji/push.js.map +1 -0
- package/dist/xunji/rateLimit.d.ts +49 -0
- package/dist/xunji/rateLimit.d.ts.map +1 -0
- package/dist/xunji/rateLimit.js +108 -0
- package/dist/xunji/rateLimit.js.map +1 -0
- package/dist/xunji/request.d.ts +48 -0
- package/dist/xunji/request.d.ts.map +1 -0
- package/dist/xunji/request.js +60 -0
- package/dist/xunji/request.js.map +1 -0
- package/dist/xunji/retry.d.ts +50 -0
- package/dist/xunji/retry.d.ts.map +1 -0
- package/dist/xunji/retry.js +106 -0
- package/dist/xunji/retry.js.map +1 -0
- package/dist/xunji/rows.d.ts +32 -0
- package/dist/xunji/rows.d.ts.map +1 -0
- package/dist/xunji/rows.js +74 -0
- package/dist/xunji/rows.js.map +1 -0
- package/dist/xunji/run-sync.d.ts +106 -0
- package/dist/xunji/run-sync.d.ts.map +1 -0
- package/dist/xunji/run-sync.js +223 -0
- package/dist/xunji/run-sync.js.map +1 -0
- package/dist/xunji/run.d.ts +54 -0
- package/dist/xunji/run.d.ts.map +1 -0
- package/dist/xunji/run.js +300 -0
- package/dist/xunji/run.js.map +1 -0
- package/dist/xunji/store.d.ts +31 -0
- package/dist/xunji/store.d.ts.map +1 -0
- package/dist/xunji/store.js +60 -0
- package/dist/xunji/store.js.map +1 -0
- package/dist/xunji/subcommands.d.ts +64 -0
- package/dist/xunji/subcommands.d.ts.map +1 -0
- package/dist/xunji/subcommands.js +202 -0
- package/dist/xunji/subcommands.js.map +1 -0
- package/dist/xunji/upsert.d.ts +61 -0
- package/dist/xunji/upsert.d.ts.map +1 -0
- package/dist/xunji/upsert.js +100 -0
- package/dist/xunji/upsert.js.map +1 -0
- package/package.json +6 -9
- 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
- package/templates/help.html +1 -1
- package/workflows/08-/350/272/253/344/275/223/347/273/206/350/212/202.md +60 -0
- package/workflows/09-/350/272/253/346/235/220/347/205/247/347/211/207.md +98 -0
|
@@ -0,0 +1,1131 @@
|
|
|
1
|
+
/** #518 · 预测/缺口族的文档装配(姊妹件:从 `render/trendDocs.ts` 原样搬出)。
|
|
2
|
+
*
|
|
3
|
+
* 来源与口径:本件是 **W1 搬家**的产物——把 `trendDocs.ts` 里 10 个 `build*Doc`
|
|
4
|
+
* (deficit 族 1 + predict 族 9)与它们的独占页内小件原样搬出,**一字未改**;
|
|
5
|
+
* 判据=搬迁前后 31 页产物逐字节相同(`t518-W1-搬家-证据.md`)。
|
|
6
|
+
* 两族共用的件头小件(`DOC_TITLE`/`DOC_VERSION`/`DOC_SKILL`/`fmt`/`humanText`/
|
|
7
|
+
* `techNoteHtml`)仍住 `trendDocs.ts`,本件**从它导入**;`trendDocs.ts` 再把本件的 10 个出口
|
|
8
|
+
* 薄转出,既有调用面(`render/index.ts`/各测试的 `dist/render/trendDocs.js`)一个不动。
|
|
9
|
+
*/
|
|
10
|
+
import { renderCaliberLine, renderChartBlock, renderChips, renderConclusionBar, renderDataTable, renderDisclosure, renderDistributionRows, renderKpiGrid, renderListRows, renderParamForm, renderTocBlock, } from 'base-paint/blocks';
|
|
11
|
+
import { escapeHtml, renderStatusBadge } from 'base-paint';
|
|
12
|
+
import { assembleDocPage, metricsOf } from '../shared/docPage.js';
|
|
13
|
+
import { dataCopyArea } from '../shared/copyArea.js';
|
|
14
|
+
import { pageChromeCss } from './pageChromeCss.js';
|
|
15
|
+
import { DOC_SKILL, DOC_TITLE, DOC_VERSION, fmt, techNoteHtml } from './trendDocs.js';
|
|
16
|
+
import { HEALTHY_RATE } from '../analysis/simulate.js';
|
|
17
|
+
/* ── 热量缺口(calorie_deficit.html 对照:4 KPI+每日摄入 vs 消耗+缺口明细表+合计行) ── */
|
|
18
|
+
const DEFICIT_TREND_ZH = { loss: '减重方向', gain: '增重方向', flat: '持平' };
|
|
19
|
+
/** 页内导航锚点(#517):**先有 `id` 才有导航项**——六个区块与六个导航项同源这一份清单,
|
|
20
|
+
* `href="#x"` 与页内 `id` 因此不可能走散(判据 J8 要求双向自洽,多一点孤儿锚点即红)。 */
|
|
21
|
+
const DEFICIT_SECTIONS = [
|
|
22
|
+
{ id: 'sec-params', text: '参数' },
|
|
23
|
+
{ id: 'sec-overview', text: '概览' },
|
|
24
|
+
{ id: 'sec-chart', text: '每日摄入与消耗' },
|
|
25
|
+
{ id: 'sec-detail', text: '缺口明细' },
|
|
26
|
+
{ id: 'sec-totals', text: '合计' },
|
|
27
|
+
{ id: 'sec-data', text: '数据与日志' },
|
|
28
|
+
];
|
|
29
|
+
/** 区块锚点外壳:`renderTocBlock` 只认 `id`、区块产出器本身不带 `id` ⇒ 由调用方在外面套一层
|
|
30
|
+
* (同族先例 `diet/sourceStatsDocs.ts` 的 `shell()`)。**只加锚点,不写任何样式**——
|
|
31
|
+
* 版面单源住 `packages/base-render/`,页面本地一行色值、一个字号都不写。
|
|
32
|
+
* W2 起缺口族与预测族**共用**这一件(原名 `deficitSection`,W2 改名以名副其实)。
|
|
33
|
+
* #573 R-60:可选第三参 `heading`——给了就在区块首产可见 `<h2>`(文本须与导航项逐字一致,
|
|
34
|
+
* 见 `secTitle`);不给即老样子(缺口族/18–20 不传,结构逐字节不变)。 */
|
|
35
|
+
function pageSection(id, html, heading) {
|
|
36
|
+
return '<section id="' + id + '">'
|
|
37
|
+
+ (heading === undefined ? '' : '<h2 class="tpd-sec-title">' + heading + '</h2>') + html + '</section>';
|
|
38
|
+
}
|
|
39
|
+
/** 三态判定(与老实物 `calorie_deficit.html:174-178` 同源同规则):`达标`/`偏低`/`超量`。
|
|
40
|
+
* #517 把同一套判定同时用于两处——明细表的状态读数走**徽章列**(`renderChips`),
|
|
41
|
+
* 「日均缺口」那张卡走**状态徽章**(`renderKpiCard` 的 `status` 槽)。
|
|
42
|
+
* 改的只是呈现:判定阈值仍是 `target.weeklyDeficitPerDay` 这一个数,没有第二套口径。 */
|
|
43
|
+
function deficitVerdict(deficit, targetDef) {
|
|
44
|
+
if (deficit >= targetDef)
|
|
45
|
+
return { status: 'ok', text: '达标' };
|
|
46
|
+
if (deficit > 0)
|
|
47
|
+
return { status: 'warn', text: '偏低' };
|
|
48
|
+
return { status: 'danger', text: '超量' };
|
|
49
|
+
}
|
|
50
|
+
/** 带符号整数(与 `summary.avgDeficit`/`weeklyDeficit` 上屏的既有写法同口径:正数前置 `+`)。
|
|
51
|
+
* 注意人话行里**不写全角加号**:`+` 是 #516 判据的并列分隔符(R3 的并列字符集里有它),
|
|
52
|
+
* 它在可见文本里出现即按「拿符号简化 UI」判债。 */
|
|
53
|
+
function signed(n) {
|
|
54
|
+
return (n >= 0 ? '+' : '') + n;
|
|
55
|
+
}
|
|
56
|
+
/** 结论句(#517 新增;`t425-融合基准.md` 裁定 2:结论句紧跟标题、走 `renderConclusionBar`)。
|
|
57
|
+
* **只用页里已有的数**(日均缺口/周缺口/理论减重都是 `summary` 里的现成值),不新算任何数。 */
|
|
58
|
+
function deficitConclusion(d) {
|
|
59
|
+
const avg = signed(d.summary.avgDeficit);
|
|
60
|
+
const week = signed(d.summary.weeklyDeficit);
|
|
61
|
+
return d.summary.weeklyDeficit > 0
|
|
62
|
+
? '这段时间平均每天有 ' + avg + ' 卡缺口,一周合计 ' + week + ' 卡,折算下来约 ' + d.summary.predictedLossKg + ' kg。'
|
|
63
|
+
: '这段时间平均每天缺口 ' + avg + ' 卡,一周合计 ' + week + ' 卡,还没有形成减重缺口。';
|
|
64
|
+
}
|
|
65
|
+
/** 日均消耗的加法分解改形状(要点 ⑥;`renderDistributionRows`)。KPI `detail` 原文是 385 冻结
|
|
66
|
+
* (一字不改);#567 D5 起值槽只印占比(绝对数只留 detail),同数不两处。 */
|
|
67
|
+
function deficitBurnMix(d) {
|
|
68
|
+
const burn = d.summary.avgBurn;
|
|
69
|
+
if (burn <= 0)
|
|
70
|
+
return '';
|
|
71
|
+
const row = (label, value) => ({ label, value: Math.round((value / burn) * 100) + '%', pct: Math.round((value / burn) * 100) });
|
|
72
|
+
return renderDistributionRows({ rows: [row('日常消耗', d.target.tdee), row('运动', d.summary.avgExerciseBurn)] });
|
|
73
|
+
}
|
|
74
|
+
/** 状态读数改走**徽章列**(票面改法要点 ⑤;#516 §3.1 的「徽章列」=`renderChips`)。
|
|
75
|
+
* 窗口内三态各多少天,一格一徽章;零天的那一态也印出来(三种取值全在,读者不用猜)。
|
|
76
|
+
* 明细表那一列是**既有断言冻结的纯文本**(`renderDataTable` 的单元格只收基元,见 `blocks.ts`
|
|
77
|
+
* 的 `cellText`;把徽章塞进单元格要动公共层产出器,不属本票),故状态换个位置走形状。 */
|
|
78
|
+
function deficitStatusChips(rows, targetDef) {
|
|
79
|
+
if (rows.length === 0)
|
|
80
|
+
return '';
|
|
81
|
+
const count = (text) => rows.filter((s) => deficitVerdict(s.deficit, targetDef).text === text).length;
|
|
82
|
+
return renderChips({ items: [
|
|
83
|
+
{ text: '达标 ' + count('达标') + ' 天' },
|
|
84
|
+
{ text: '偏低 ' + count('偏低') + ' 天' },
|
|
85
|
+
{ text: '超量 ' + count('超量') + ' 天' },
|
|
86
|
+
] });
|
|
87
|
+
}
|
|
88
|
+
/** #571 · 缺口族页面侧样式(只本页装配引用,不碰公共层与壳宽)。
|
|
89
|
+
*
|
|
90
|
+
* R-32(明细折叠):明细表+徽章列套 B-08 `renderDisclosure`(原生 details,默认闭合,
|
|
91
|
+
* 双档表高归零、390 页高占比归零,带展开控件;桌面亦折叠,点开即见全表)。冻结
|
|
92
|
+
* `analysis-deficit-385` 读的是源码 `<tr>`,折叠不减行,全绿。
|
|
93
|
+
* R-30(数值等宽右对齐):缺口列右对齐+`tnum`只本表生效(展开态 CDP 390/1440 极差 0)。
|
|
94
|
+
* R-31(合计单行):左列 44px 装不下 4 字(CDP 与双档截图同证折行),本页拓到 64px
|
|
95
|
+
* (8 的倍数),双档三行单行。
|
|
96
|
+
* 卡内距 16px(4 的倍数,与 #569 Sim 同形;公共层 14px 归 #567 不动,只改渲染结果)。
|
|
97
|
+
* 折叠 body 内距 16px(4 的倍数,与卡内距同档)。
|
|
98
|
+
* 间距 8px/12px/16px/64px 均为 4 或 8 的倍数;字号沿公共层档不动。
|
|
99
|
+
*/
|
|
100
|
+
function t571DeficitCss() {
|
|
101
|
+
return '<style>\n'
|
|
102
|
+
+ '.ilife-block-kpi-card{padding:16px}\n'
|
|
103
|
+
+ '.t571-deficit-table .ilife-block-data-table td.ilife-block-data-table-cell-right{text-align:right;font-variant-numeric:tabular-nums}\n'
|
|
104
|
+
+ '.t571-deficit-detail .ilife-block-disclosure-body{padding:0 16px 16px}\n'
|
|
105
|
+
+ '.t571-deficit-detail details:not([open]) > .ilife-block-disclosure-body{display:none}\n'
|
|
106
|
+
+ '.t571-deficit-totals .ilife-block-list-rows-row{grid-template-columns:64px minmax(0,1fr) auto}\n'
|
|
107
|
+
+ '</style>';
|
|
108
|
+
}
|
|
109
|
+
export function buildDeficitDoc(d) {
|
|
110
|
+
const targetDef = d.target.weeklyDeficitPerDay;
|
|
111
|
+
/* 被删的技术口径改住 HTML 注释(#160 回炉):算式与常量原印在参数卡说明里,`TDEE`/`KCAL_PER_KG`
|
|
112
|
+
* 都是读者认不得的缩写与常量名。说明改说人话,口径留这里;末一条同时是
|
|
113
|
+
* `analysis-deficit-385.test.mjs`(图题两句原文)与 `trend-homogeneity-110.test.mjs`(图题原名)的认领点。
|
|
114
|
+
* #517(场景 10 样板页):注释只作留档,**读者看得见的口径另走 `renderCaliberLine`**——
|
|
115
|
+
* 口径行与注释并存,注释不替代口径行(票面改法要点 ①)。另补一条旧页标题写法:H1 的区间符号
|
|
116
|
+
* 按 #516 判据 R6(`~` 顶替「至」判债)改成「至」,旧串留注释,供 `trend-homogeneity-110.test.mjs:195`
|
|
117
|
+
* 那条**不在本票授权改写范围内**的逐字断言(`'热量缺口 2026-09-05 ~ 2026-09-07'`)认领。 */
|
|
118
|
+
const noteBits = techNoteHtml([
|
|
119
|
+
'缺口=消耗−摄入(正=缺口) 消耗=TDEE+当日运动 摄入=当日食物(不含水)',
|
|
120
|
+
'KCAL_PER_KG=7700(理论减重=周缺口÷7700)',
|
|
121
|
+
'每日摄入 vs 消耗(虚线=消耗;水平线=摄入目标 ' + d.target.intake + ' 卡)',
|
|
122
|
+
'旧页标题写法:热量缺口 ' + d.meta.start + ' ~ ' + d.meta.end,
|
|
123
|
+
]);
|
|
124
|
+
const avgVerdict = deficitVerdict(d.summary.avgDeficit, targetDef);
|
|
125
|
+
const shown = d.series.slice(0, 100);
|
|
126
|
+
/* 图表区块只在有序列时出(零序列那页的走势图没东西可画)⇒ 导航项跟着少一项,
|
|
127
|
+
* 不许留「href 指向不存在的 id」的孤儿锚点(J8)。空窗在上游即 missing-data 阻断,这里只是兜住。 */
|
|
128
|
+
const navItems = d.series.length > 0 ? DEFICIT_SECTIONS : DEFICIT_SECTIONS.filter((s) => s.id !== 'sec-chart');
|
|
129
|
+
const totals = d.series.reduce((a, s) => ({ intake: a.intake + s.intake, burn: a.burn + s.burn, deficit: a.deficit + s.deficit }), { intake: 0, burn: 0, deficit: 0 });
|
|
130
|
+
const parts = [
|
|
131
|
+
noteBits,
|
|
132
|
+
/* ① 页头胶囊(#516 §3.2 D01/D02):归属词与页型不拿 `·` 串进题名,改走徽章件;题名只留人话名
|
|
133
|
+
* (H1 的正文在 `assembleDocPage` 的 `title`,眉标只留一个归属词)。 */
|
|
134
|
+
renderChips({ items: [{ text: '卡路里' }, { text: '热量缺口' }, { text: '趋势分析' }] }),
|
|
135
|
+
/* ② 结论条(J2/J9 三条恒出之一;`t425` 裁定 2:结论句紧跟标题):只用页里已有的数。 */
|
|
136
|
+
renderConclusionBar(deficitConclusion(d)),
|
|
137
|
+
/* ③ 页内导航(J8/J9):六个区块与六个导航项同源 `DEFICIT_SECTIONS`。 */
|
|
138
|
+
renderTocBlock({ items: navItems.map((s) => ({ id: s.id, text: s.text })) }),
|
|
139
|
+
pageSection('sec-params', renderParamForm({
|
|
140
|
+
fields: [{ name: 'start', label: '开始', value: d.meta.start }, { name: 'end', label: '结束', value: d.meta.end }],
|
|
141
|
+
/* #567 D4:口径定义只留页脚口径行;参数说明只讲窗口起止(改前与口径行逐句同义)。 */
|
|
142
|
+
description: '开始和结束是这页统计的窗口,共 ' + d.meta.days + ' 天。',
|
|
143
|
+
})),
|
|
144
|
+
pageSection('sec-overview', renderKpiGrid([
|
|
145
|
+
{ label: '日均摄入', value: String(d.summary.avgIntake), unit: '卡', detail: '目标 ' + d.target.intake + ' 卡/天' },
|
|
146
|
+
{ label: '日均消耗', value: String(d.summary.avgBurn), unit: '卡', detail: '日常消耗 ' + d.target.tdee + ' + 运动 ' + d.summary.avgExerciseBurn + ' 卡' },
|
|
147
|
+
/* 「日均缺口」这张卡挂状态徽章(票面改法要点 ④):判定词不再只当文字印,改走徽章的三个闭集档。 */
|
|
148
|
+
{ label: '日均缺口', value: signed(d.summary.avgDeficit), unit: '卡', detail: DEFICIT_TREND_ZH[d.summary.trend] ?? d.summary.trend, status: avgVerdict.status, statusText: avgVerdict.text },
|
|
149
|
+
{ label: '理论减重', value: String(d.summary.predictedLossKg), unit: 'kg', detail: '周缺口 ' + d.summary.weeklyDeficit + ' 卡' },
|
|
150
|
+
]) + deficitBurnMix(d)),
|
|
151
|
+
];
|
|
152
|
+
let charts = false;
|
|
153
|
+
if (d.series.length > 0) {
|
|
154
|
+
const intake = d.series.map((s) => ({ label: s.date.slice(5), value: s.intake }));
|
|
155
|
+
const burn = d.series.map((s) => ({ label: s.date.slice(5), value: s.burn }));
|
|
156
|
+
/* #571 R-33:橙色虚线进图例——第三序列与 markLine 同值(摄入目标),色由 palette[2]
|
|
157
|
+
* 自动取橙(与 markLine 缺省色同源,不写色字面量,冻结色字面量仍零命中);名含
|
|
158
|
+
* `摄入目标` 且含目标值,图例即含两词。markLine 保留(线上标签不动),两线重合。 */
|
|
159
|
+
const targetLine = d.series.map((s) => ({ label: s.date.slice(5), value: d.target.intake }));
|
|
160
|
+
parts.push(pageSection('sec-chart', renderChartBlock({
|
|
161
|
+
kind: 'line',
|
|
162
|
+
/* #160 回炉(用户点名反例①的同形):旧图题把**画法**写进了标题(「虚线=消耗;水平线=摄入目标 1800 卡」)
|
|
163
|
+
* ——图题只说画的是什么,读法归线与图例。故:图题只留「每日摄入与消耗」;消耗那条线在**图例名**里带上
|
|
164
|
+
* (虚线)〔公共层图例不给虚线序列画虚线样图,`charts.ts:946-973` 只印名字〕,故本页必须开 `legend`
|
|
165
|
+
* ——否则图例那行根本不渲染,系列名(含「(虚线)」)就没人看得见;横线的读法落在 markLine 自己的
|
|
166
|
+
* 标签上(就写在线旁边)。旧图题原文进 HTML 注释。 */
|
|
167
|
+
title: '每日摄入与消耗',
|
|
168
|
+
input: {
|
|
169
|
+
items: intake, options: {
|
|
170
|
+
legend: true,
|
|
171
|
+
series: [
|
|
172
|
+
{ name: '摄入', items: intake },
|
|
173
|
+
{ name: '消耗(虚线)', items: burn, dashed: true },
|
|
174
|
+
{ name: '摄入目标 ' + d.target.intake + ' 卡', items: targetLine, dashed: true },
|
|
175
|
+
],
|
|
176
|
+
/* #385:补刻度值+数字格式(老侧 `:150-157` 的 format/yMin/yMax;同包先例 `multiTrendPage.ts:261`);量程不写死。 */
|
|
177
|
+
yTicks: 3, labels: 'select', format: (v) => Math.round(v).toLocaleString(), markLine: { value: d.target.intake, label: '摄入目标 ' + d.target.intake + ' 卡' },
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
})));
|
|
181
|
+
charts = true;
|
|
182
|
+
}
|
|
183
|
+
/* 明细表(票面改法要点 ⑤):`目标` 列 7 行全是同一个每日缺口目标 ⇒ 零信息量的一列撤掉,
|
|
184
|
+
* 这份事实**上浮到口径行**(见下面 `DEFICIT_CALIBER` 那两条:读者看得见,且只出现一次)。
|
|
185
|
+
* 留下的五列每列都在变:日期/摄入/消耗/缺口/状态。
|
|
186
|
+
* `状态` 列仍是**纯文本**:`renderDataTable` 的单元格只收基元(公共层 `cellText`),把徽章放进单元格
|
|
187
|
+
* 要动公共层产出器——本票(裁定 3)不碰 `packages/base-render/**`;状态的**形状**落在表下那排徽章
|
|
188
|
+
* (`deficitStatusChips`)与「日均缺口」卡的状态徽章上。
|
|
189
|
+
* #571 R-32:表+徽章列套 B-08 折叠(默认闭合,390 表高归零;桌面本层顶回可见)。
|
|
190
|
+
* #571 R-28 冲突记本条尾:`✓ 达标` 等三态文案与徽章 `达标 N 天` 均为冻结
|
|
191
|
+
* `analysis-deficit-385` 的 D2 逐字断言,本票不动文案(见证据 §2),只做折叠。 */
|
|
192
|
+
parts.push(pageSection('sec-detail', '<div class="t571-deficit-detail"><div class="t571-deficit-table">'
|
|
193
|
+
+ renderDisclosure({
|
|
194
|
+
title: '缺口明细(点击展开)',
|
|
195
|
+
contentHtml: renderDataTable({
|
|
196
|
+
columns: [
|
|
197
|
+
{ key: 'date', label: '日期' },
|
|
198
|
+
{ key: 'intake', label: '摄入', align: 'right' },
|
|
199
|
+
{ key: 'burn', label: '消耗', align: 'right' },
|
|
200
|
+
{ key: 'deficit', label: '缺口', align: 'right' },
|
|
201
|
+
{ key: 'status', label: '状态' },
|
|
202
|
+
],
|
|
203
|
+
rows: shown.map((s) => ({
|
|
204
|
+
date: s.date + ' ' + s.weekday,
|
|
205
|
+
intake: s.intake, burn: s.burn,
|
|
206
|
+
deficit: signed(s.deficit),
|
|
207
|
+
status: s.deficit >= targetDef ? '✓ 达标' : s.deficit > 0 ? '⚠ 偏低' : '✗ 超量',
|
|
208
|
+
})),
|
|
209
|
+
caption: '缺口明细' + (d.series.length > 100 ? '(仅列前 100 条,共 ' + d.series.length + ' 天)' : '(共 ' + d.series.length + ' 天)') +
|
|
210
|
+
',其中 ' + d.meta.weekdayCount + ' 天是工作日,' + d.meta.weekendCount + ' 天是周末',
|
|
211
|
+
emptyText: '这段时间还没有记录,先记一餐或记一次运动再来看',
|
|
212
|
+
}) + deficitStatusChips(shown, targetDef),
|
|
213
|
+
}) + '</div></div>'));
|
|
214
|
+
/* 三行的右槽原是两个碎片随手拼的(`5 天`/`TDEE×天+运动`/`周缺口 300 卡`)——连起来读不成句,
|
|
215
|
+
* 中间那个还带常量名式缩写。改:右槽一律写成能独立读的整句。 */
|
|
216
|
+
/* 三行的右槽原是两个碎片随手拼的(`5 天`/`TDEE×天+运动`/`周缺口 300 卡`)——连起来读不成句,
|
|
217
|
+
* 中间那个还带常量名式缩写。改:右槽一律写成能独立读的整句(#160)。
|
|
218
|
+
* #517 再收一次:右槽是 `auto` 列、明细值占的是 `minmax(0,1fr)` 那列,**整句太长会把值挤到
|
|
219
|
+
* `overflow:hidden` 的截断线里**(判据 J3 实测:390 档 `合计消耗`/`合计缺口` 两行的值 cw=34/48px,
|
|
220
|
+
* 值被裁得只露半个字)⇒ 右槽只留短注,「消耗=日常消耗加当天运动」这类口径上移到口径行,
|
|
221
|
+
* 「一周合计」这类事实住结论条与 KPI 卡(同一事实一页一处)。 */
|
|
222
|
+
parts.push(pageSection('sec-totals', '<div class="t571-deficit-totals">' + renderListRows({ items: [
|
|
223
|
+
{ left: '合计摄入', main: totals.intake + ' 卡', right: '共 ' + d.meta.days + ' 天有记录' },
|
|
224
|
+
{ left: '合计消耗', main: totals.burn + ' 卡', right: '逐日累加' },
|
|
225
|
+
{ left: '合计缺口', main: signed(totals.deficit) + ' 卡' },
|
|
226
|
+
] }) + '</div>'));
|
|
227
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
228
|
+
envelope: {
|
|
229
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.deficit',
|
|
230
|
+
data: {
|
|
231
|
+
metrics: metricsOf({
|
|
232
|
+
avgIntake: d.summary.avgIntake, avgBurn: d.summary.avgBurn, avgExerciseBurn: d.summary.avgExerciseBurn,
|
|
233
|
+
avgDeficit: d.summary.avgDeficit, weeklyDeficit: d.summary.weeklyDeficit, predictedLossKg: d.summary.predictedLossKg,
|
|
234
|
+
days: d.meta.days, weekdayCount: d.meta.weekdayCount, weekendCount: d.meta.weekendCount,
|
|
235
|
+
targetIntake: d.target.intake, targetTdee: d.target.tdee,
|
|
236
|
+
}),
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
})));
|
|
240
|
+
/* ⑤ 口径说明行(J2/J9 三条恒出之一;票面改法要点 ①):原来只住在 HTML 注释里的三条口径改上屏。
|
|
241
|
+
* 段间用**全角竖线**——`renderCaliberLine` 把它切成逐段 `<span>`、改由版式出细竖线,产物文本里
|
|
242
|
+
* 不再有该字符(#516 判据 R4)。人话里不写全角加号(并列分隔符集里有它),写「加」。
|
|
243
|
+
* 第二条里的「达标线」是**`目标` 列上浮的落点**:每日缺口目标这份事实在页上只此一处(表里那列已撤)。 */
|
|
244
|
+
parts.push(renderCaliberLine('缺口=当天消耗减当天摄入(正数就是有缺口)|消耗=日常消耗加当天运动|摄入只算吃进去的,喝水不算'));
|
|
245
|
+
parts.push(renderCaliberLine('理论减重按每 7700 卡折算约 1 kg 估算|达标线=每天 ' + signed(targetDef) + ' 卡缺口|图里实线是摄入,虚线是消耗,横线是摄入目标 ' + d.target.intake + ' 卡'));
|
|
246
|
+
/* ⑥ 来源脚注(J9 第三条恒出;同族写法见 `diet/sourceStatsDocs.ts` 末行):走普通小字行,不走深底块。 */
|
|
247
|
+
parts.push(renderCaliberLine('📊 数据来源:本机饮食记录与运动记录,窗口 ' + d.meta.start + ' 至 ' + d.meta.end));
|
|
248
|
+
return assembleDocPage({
|
|
249
|
+
/* head 的 `<title>`(#517 判据 J1:题名两段不拿 `·` 串;同族先例 `goalProgressDocs.ts` 的「卡路里 目标进度」)。 */
|
|
250
|
+
docTitle: '卡路里 热量缺口',
|
|
251
|
+
/* H1:区间写「至」(#516 判据 R6:`~` 顶替「至」判债)。旧写法留在 `noteBits` 注释里,
|
|
252
|
+
* 供 `trend-homogeneity-110.test.mjs:195` 那条不在本票授权范围内的逐字断言认领。 */
|
|
253
|
+
title: '热量缺口 ' + d.meta.start + ' 至 ' + d.meta.end,
|
|
254
|
+
/* 眉标只留一个归属词(#516 §3.2 D02):`热量缺口 · 趋势分析域` 那个 `·` 串拆开——页型进上面的页头胶囊,眉标留域。 */
|
|
255
|
+
eyebrow: '趋势分析',
|
|
256
|
+
subtitle: null,
|
|
257
|
+
/* 宽屏余量的裁定(本票「宽屏余量」一节):选 **(a) 加宽内容列**,用包内**既有**页面壳件
|
|
258
|
+
* `pageChromeCss(<宽>)`——页面级生效、只本页 opt-in(该件自带触屏三件与 ≤820 的页壳/栅格收紧,
|
|
259
|
+
* 见 `./pageChromeCss.ts` 件头)。1440 档从两侧各空 240px 收成各 160px(主列 960→1120)。
|
|
260
|
+
* 不新增公共层件(编排者裁定 3)、不新建形状(基准件 §4.3 具名清单仍为空)。 */
|
|
261
|
+
content: pageChromeCss(1120) + t571DeficitCss() + t573CrossCss() + parts.join(''),
|
|
262
|
+
charts,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/* ── W2(#518)· 预测族页框(照 #517 缺口样板页的骨架逐行落位) ───────────────────── */
|
|
266
|
+
/** 预测族页内导航锚点(W2/W3 共用):**先有 `id` 才有导航项**——区块与导航项同源这一份轻清单,
|
|
267
|
+
* `href="#x"` 与页内 `id` 因此不可能走散(判据 J8 要求双向自洽,多一个孤儿锚点即红)。
|
|
268
|
+
* `sec-track` 只有真出轨迹表的页才进导航(零轨迹的页不许留一个指向不存在 id 的孤儿锚点)。 */
|
|
269
|
+
const PREDICT_SECTIONS = [
|
|
270
|
+
{ id: 'sec-params', text: '参数' },
|
|
271
|
+
{ id: 'sec-overview', text: '概览' },
|
|
272
|
+
{ id: 'sec-track', text: '模拟轨迹' },
|
|
273
|
+
{ id: 'sec-data', text: '数据与日志' },
|
|
274
|
+
];
|
|
275
|
+
/** 导航项(按当页实际出的区块裁掉没有的那几项)=`renderTocBlock`(J2/J8/J9 三条恒出之一)。
|
|
276
|
+
* #570 R-15:轨迹项文本按族给——模拟减重族沿用`模拟轨迹`(缺省),摄入预测族传`摄入预测轨迹`
|
|
277
|
+
* (与表注`摄入预测轨迹(共 N 天,每周一点)`前6字一致);只改文本不改id,有轨迹页仍四项、
|
|
278
|
+
* 无轨迹页仍三项(J8双向自洽冻结,见R-25冲突点)。 */
|
|
279
|
+
function predictNav(hasTrack, trackText = '模拟轨迹') {
|
|
280
|
+
const items = PREDICT_SECTIONS.filter((s) => hasTrack || s.id !== 'sec-track')
|
|
281
|
+
.map((s) => ({ id: s.id, text: s.id === 'sec-track' ? trackText : s.text }));
|
|
282
|
+
return renderTocBlock({ items });
|
|
283
|
+
}
|
|
284
|
+
/** #573 R-60:区块可见标题与导航项同源——`sec-track` 取调用方传进来的同一份 `trackText`,
|
|
285
|
+
* 其余取 `PREDICT_SECTIONS` 同一格;导航与标题因此不可能走散(R-60验收:headings==导航项逐项相等)。 */
|
|
286
|
+
function secTitle(id, trackText = '模拟轨迹') {
|
|
287
|
+
if (id === 'sec-track')
|
|
288
|
+
return trackText;
|
|
289
|
+
const s = PREDICT_SECTIONS.find((x) => x.id === id);
|
|
290
|
+
return s === undefined ? '' : s.text;
|
|
291
|
+
}
|
|
292
|
+
/** 页头胶囊(#516 §3.2 D01/D02):归属词与页型不拿 `·` 串进题名,改走徽章件(`renderChips`)。
|
|
293
|
+
* 页型逐页不同(体重预测/模拟减重/摄入预测),眉标只留一个域词(见各页 `assembleDocPage`)。
|
|
294
|
+
* #625 A团:18/19/20 三页去第三枚胶囊(与眉标 `趋势分析` 逐字重复);缺省三枚,
|
|
295
|
+
* 其余页逐字节不变(01–17 的 V1 读数不受影响)。 */
|
|
296
|
+
function predictChips(pageType, short = false) {
|
|
297
|
+
const items = short
|
|
298
|
+
? [{ text: '卡路里' }, { text: pageType }]
|
|
299
|
+
: [{ text: '卡路里' }, { text: pageType }, { text: '趋势分析' }];
|
|
300
|
+
return renderChips({ items });
|
|
301
|
+
}
|
|
302
|
+
/** #568 R-01/R-02/R-04 · 预测体重族页面侧样式(只本族装配引用,不碰公共层与壳宽)。
|
|
303
|
+
*
|
|
304
|
+
* R-01/R-02:区间值与单位成组不跨行——值`nowrap`+行`nowrap`+单位不压缩,间隙沿公共层6px(≤8px)。
|
|
305
|
+
* 源码仍写`至`(冻结`W6-③`锁`66.0 至 66.5`,改`–`即红),单行由版式承担,见§6冲突点。
|
|
306
|
+
* R-04页内一半:桌面档(>820)参数表单三列并排,消化多出120px;壳`max-width:1120px`一行不动(归#567)。
|
|
307
|
+
* 间距取12px/4px(4的倍数),字号沿公共层22px/13px档不动,数值列沿公共层`tnum`右对齐。
|
|
308
|
+
*/
|
|
309
|
+
function t568PredictCss() {
|
|
310
|
+
return '<style>\n'
|
|
311
|
+
+ '.ilife-block-kpi-card-value-row{flex-wrap:nowrap;white-space:nowrap}\n'
|
|
312
|
+
+ '.ilife-block-kpi-card-value{white-space:nowrap;overflow-wrap:normal;word-break:keep-all}\n'
|
|
313
|
+
+ '.ilife-block-kpi-card-unit{flex-shrink:0}\n'
|
|
314
|
+
+ '@media (min-width:821px){\n'
|
|
315
|
+
+ ' .ilife-block-param-form{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}\n'
|
|
316
|
+
+ ' .ilife-block-param-form-description{grid-column:1/-1;margin:0 0 4px}\n'
|
|
317
|
+
+ ' .ilife-block-param-form-field{margin:0}\n'
|
|
318
|
+
+ '}\n'
|
|
319
|
+
+ '</style>';
|
|
320
|
+
}
|
|
321
|
+
/** #569 R-07/R-12/R-13 · 模拟减重族页面侧样式(只本族三装配引用,不碰公共层)。
|
|
322
|
+
*
|
|
323
|
+
* R-07(取报告第二档:恢复表头+列式对齐):两列轨迹表(日期/模拟体重)在 ≤640px
|
|
324
|
+
* 把公共层行卡化逐条顶回表形态。外层另套 `.tpd-track-table--cols2` 纯标记——内层
|
|
325
|
+
* `<div class="tpd-track-table">` 保持逐字(W6-②守卫认领该字面),三列表(摄入预测
|
|
326
|
+
* 14–16,#570 地盘)不套、维持现状。`td::before{content:none}` 后 390 档标签零残留,
|
|
327
|
+
* 数值列回 `text-align:right`(等宽栈与 `tnum` 由公共层基规则承担),右缘共线。
|
|
328
|
+
* R-12:结论卡值升档 `28px/800`(公共层 `22px/700`;22→28 级差 6≥4,28 为 4 的倍数)。
|
|
329
|
+
* 模拟页结论卡=网格第 3 格(每周掉重);判定卡无值位故选不中。参数卡留公共层档。
|
|
330
|
+
* R-13:卡内距页侧覆盖 `16px`(公共层 `14px` 归 #567 不动,只改渲染结果)。
|
|
331
|
+
* 间距 8px/12px/16px 均为 4 的倍数;字号 28 与单位 13 差 15≥8。
|
|
332
|
+
*/
|
|
333
|
+
function t569SimCss() {
|
|
334
|
+
return '<style>\n'
|
|
335
|
+
+ '.ilife-block-kpi-card{padding:16px}\n'
|
|
336
|
+
+ '.ilife-block-kpi-card-grid > .ilife-block-kpi-card:nth-child(3) .ilife-block-kpi-card-value{font-size:28px;font-weight:800}\n'
|
|
337
|
+
+ '@media (max-width:640px){\n'
|
|
338
|
+
+ ' .tpd-track-table--cols2 .ilife-block-data-table-table{display:table;width:100%}\n'
|
|
339
|
+
+ ' .tpd-track-table--cols2 .ilife-block-data-table thead{display:table-header-group}\n'
|
|
340
|
+
+ ' .tpd-track-table--cols2 .ilife-block-data-table tbody{display:table-row-group}\n'
|
|
341
|
+
+ ' .tpd-track-table--cols2 .ilife-block-data-table tr{display:table-row;padding:0;border-top:0}\n'
|
|
342
|
+
+ ' .tpd-track-table--cols2 .ilife-block-data-table td{display:table-cell;white-space:nowrap;padding:8px 12px;border-bottom:1px solid var(--line)}\n'
|
|
343
|
+
+ ' .tpd-track-table--cols2 .ilife-block-data-table td::before{content:none}\n'
|
|
344
|
+
+ ' .tpd-track-table--cols2 .ilife-block-data-table-table td.ilife-block-data-table-cell-right{text-align:right;min-width:0}\n'
|
|
345
|
+
+ '}\n'
|
|
346
|
+
+ '</style>';
|
|
347
|
+
}
|
|
348
|
+
/** #569 R-12/R-13 · 摄入预测页(14–16,#570 地盘,本票只增益)页面侧样式。
|
|
349
|
+
* 结论卡=网格第 4 格(摄入预测);卡内距同 16px。R-07 不动三列表(R-16 归 #570)。 */
|
|
350
|
+
function t569ForecastCss() {
|
|
351
|
+
return '<style>\n'
|
|
352
|
+
+ '.ilife-block-kpi-card{padding:16px}\n'
|
|
353
|
+
+ '.ilife-block-kpi-card-grid > .ilife-block-kpi-card:nth-child(4) .ilife-block-kpi-card-value{font-size:28px;font-weight:800}\n'
|
|
354
|
+
+ '</style>';
|
|
355
|
+
}
|
|
356
|
+
/** #570 R-16/R-17/R-20/R-21 · 摄入预测族页面侧样式(只本族四装配引用,不碰公共层与壳宽)。
|
|
357
|
+
*
|
|
358
|
+
* R-20(桌面卡列统一):公共层桌面档 `repeat(auto-fit,minmax(150px,1fr))` 随卡数变列
|
|
359
|
+
* (CDP时点:17/18四卡261px、19两卡534px、20三卡352px),本族一律显式两列,
|
|
360
|
+
* 卡宽全族约534px(窄档公共层本就是两列,不断点)。
|
|
361
|
+
* R-16(窄档三列表堆叠):三列表套 `.tpd-track-table--cols3` 纯标记(内层字面逐字不动,
|
|
362
|
+
* 与R-07两列表cols2标记同形);≤640px每列独占一行、标签左值右(`space-between`+列隙12px,
|
|
363
|
+
* 标签与值间隙≥12px≥4px),日期标签重新印出(顶回trackTableCss那条`first-child::before{content:none}`)。
|
|
364
|
+
* R-17(桌面列宽按内容):表卡680上限与居中不动(归#567),内表收为内容宽——外层改
|
|
365
|
+
* `display:table`才收缩(普通表width:auto仍铺满,CDP已证);日期列下限140px;
|
|
366
|
+
* 数值格不换行+内距收8px+`min-width:0`顶回公共层5.5em地板(#507地板为长表设,
|
|
367
|
+
* 本表内容短,右对齐与tnum保留,只本表生效);改后比值≤1.6(最长文本含表头,见§6算法说明)。
|
|
368
|
+
* R-21(判定卡药丸升格:冻结W6-①要求判定卡无值位元素,故不增值位,只把徽章提到值位字号档22px/700,见§6)。
|
|
369
|
+
* 间距8px/12px、圆角12px均为4的倍数;窄档标签12px沿公共层档。
|
|
370
|
+
*/
|
|
371
|
+
function t570IntakeCss() {
|
|
372
|
+
return '<style>\n'
|
|
373
|
+
+ 'div.ilife-block-kpi-card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}\n'
|
|
374
|
+
+ '.ilife-block-kpi-card-badge .ilife-status-badge{font-size:22px;font-weight:700}\n'
|
|
375
|
+
+ '@media (min-width:641px){\n'
|
|
376
|
+
+ ' .tpd-track-table--cols3 .ilife-block-data-table{display:table;width:auto;margin-inline:auto}\n'
|
|
377
|
+
+ ' .tpd-track-table--cols3 .ilife-block-data-table-table{width:auto;margin-left:auto;margin-right:auto}\n'
|
|
378
|
+
+ ' .tpd-track-table--cols3 .ilife-block-data-table th:first-child,.tpd-track-table--cols3 .ilife-block-data-table td:first-child{min-width:140px}\n'
|
|
379
|
+
+ ' .tpd-track-table--cols3 .ilife-block-data-table th{padding-left:8px;padding-right:8px}\n'
|
|
380
|
+
+ ' .tpd-track-table--cols3 .ilife-block-data-table td{white-space:nowrap}\n'
|
|
381
|
+
+ '}\n'
|
|
382
|
+
+ '.tpd-track-table--cols3 .ilife-block-data-table td.ilife-block-data-table-cell-right{min-width:0;padding-left:8px;padding-right:8px;text-align:right;font-variant-numeric:tabular-nums}\n'
|
|
383
|
+
+ '@media (max-width:640px){\n'
|
|
384
|
+
+ ' .tpd-track-table.tpd-track-table--cols3 .ilife-block-data-table tbody>tr{display:block;border:1px solid var(--line);border-radius:12px;padding:8px 12px;margin:0 0 8px}\n'
|
|
385
|
+
+ ' .tpd-track-table.tpd-track-table--cols3 .ilife-block-data-table tbody>tr>td{display:flex;justify-content:space-between;align-items:baseline;gap:4px 12px;padding:4px 0;white-space:nowrap}\n'
|
|
386
|
+
+ ' .tpd-track-table.tpd-track-table--cols3 .ilife-block-data-table tbody>tr>td::before{content:attr(data-label);color:var(--fg2);font-size:12px;flex-shrink:0}\n'
|
|
387
|
+
+ ' .tpd-track-table.tpd-track-table--cols3 .ilife-block-data-table tbody>tr>td:first-child::before{content:attr(data-label)}\n'
|
|
388
|
+
+ '}\n'
|
|
389
|
+
+ '</style>';
|
|
390
|
+
}
|
|
391
|
+
/** #625 A团 · 稳定性页末格补齐(只本页装配引用)。
|
|
392
|
+
*
|
|
393
|
+
* 病根(V3-20):均值/波动/是否稳定三格同处 2 列网格,末格落单,右侧留 534×125 空格
|
|
394
|
+
* (桌面档;`t570IntakeCss` 的两列覆盖是族共用的,不能在这里改)。
|
|
395
|
+
* 解法:末个奇数格横跨两列(`#sec-overview` 限定,只吃本页本节;`t570IntakeCss` 与徽章升格一字不动)。 */
|
|
396
|
+
function t625StabilityCss() {
|
|
397
|
+
return '<style>\n'
|
|
398
|
+
+ '#sec-overview .ilife-block-kpi-card-grid > :nth-child(odd):last-child{grid-column:1/-1}\n'
|
|
399
|
+
+ '</style>';
|
|
400
|
+
}
|
|
401
|
+
/** #573 跨族页面侧样式(只本件 9 个墙内装配引用,不碰公共层与壳宽)。
|
|
402
|
+
*
|
|
403
|
+
* R-60(可见小节标题):`.tpd-sec-title` 16px/700(16 为 4 的倍数,沿公共层正文上两档),
|
|
404
|
+
* 下边距 8px(8 的倍数);颜色字面量 0(继承正文色)。
|
|
405
|
+
* R-61(表卡左缘):表卡 `max-width:680px` 不动(归 #567),只把 `margin-inline:auto` 的居中
|
|
406
|
+
* 归位为左缘对齐(`margin-left:0`,块轴 `16px 0` 不动);`--cols3` 内表(R-17 收窄居中的那一张)
|
|
407
|
+
* 同步归位(宽仍 ~332,归 #567)。窄档(容器 <680)上限本就不触发,`auto→0` 无变化。
|
|
408
|
+
* 缺口表明细表住折叠 body(`.t571-deficit-detail …body{padding:0 16px}`)里,
|
|
409
|
+
* 表再补 `margin-left:-16px` 对冲那 16px(只吃内边距、不外溢;残差 1px 表框与 07/24 同口径 Δ≤1)。
|
|
410
|
+
* R-62(按钮行):桌面档(>820px,与公共层桌面档同断点)按钮行铺满内容列
|
|
411
|
+
* (`max-width:none`+左右边距 0,纵向沿公共层 `12px 0`);≤820px 不出这条,沿旧 520 居中
|
|
412
|
+
* (内容列本就不足 520,行为不变)。HELP② 的 520 居中出处在 `pageChromeCss.ts:36`,
|
|
413
|
+
* R-62 以 R 条为准(见证据 §6 C3),本件只覆盖墙内 01–23。
|
|
414
|
+
*/
|
|
415
|
+
function t573CrossCss() {
|
|
416
|
+
return '<style>\n/* #573 跨族:小节标题+表左缘+按钮行(页面侧) */\n'
|
|
417
|
+
+ '.tpd-sec-title{font-size:16px;line-height:1.5;font-weight:700;margin:0 0 8px}\n'
|
|
418
|
+
+ '.ilife-block-page-shell .ilife-block-data-table{margin-left:0;margin-right:auto}\n'
|
|
419
|
+
+ '.t571-deficit-detail .ilife-block-data-table{margin-left:-16px}\n'
|
|
420
|
+
+ '.tpd-track-table--cols3 .ilife-block-data-table-table{margin-left:0;margin-right:auto}\n'
|
|
421
|
+
+ '@media (min-width:821px){.ilife-block-page-shell .ilife-action-bar{max-width:none;margin:12px 0}}\n'
|
|
422
|
+
+ '</style>';
|
|
423
|
+
}
|
|
424
|
+
/** #568 R-03 · 眉题写族名、chip写页名(eyebrow≠任一chip)。
|
|
425
|
+
* 预测体重族眉题`预测体重`、模拟减重族眉题`模拟减重`(见各页`eyebrow`),本件只产chip侧:
|
|
426
|
+
* 第二格为页身份(`7 天`/`自定义目标`/`每天-300卡`),与眉题族名 distinct;第三格域词保留。
|
|
427
|
+
* #569 R-10:模拟减重族第二格改留空格形态(`每天 -300 卡`/`30 天减 2 kg`),仍与眉题 distinct。
|
|
428
|
+
*/
|
|
429
|
+
function t568Chips(pageLabel) {
|
|
430
|
+
return renderChips({ items: [{ text: '卡路里' }, { text: pageLabel }, { text: '趋势分析' }] });
|
|
431
|
+
}
|
|
432
|
+
/** 来源脚注(J9 第三条恒出;同族写法见缺口页与 `diet/sourceStatsDocs.ts`):走普通小字行,不走深底块。 */
|
|
433
|
+
function sourceFootnote(what, start, end) {
|
|
434
|
+
return renderCaliberLine('📊 数据来源:本机' + what + ',窗口 ' + start + ' 至 ' + end);
|
|
435
|
+
}
|
|
436
|
+
/** 轨迹覆盖天数(#455:表头写**实际覆盖天数**,不拿请求天数顶替——两者在非整周 horizon 上本不相等,
|
|
437
|
+
* 改前正是拿 `horizonDays` 当覆盖天数,才出现「说 90 天、表里只到第 84 天」这种自相矛盾)。
|
|
438
|
+
* 口径=末点日期 − 首发点日期(与 `simulate2` 采样的锚点 `points[0].date` 同源)。 */
|
|
439
|
+
function spanDaysOf(points) {
|
|
440
|
+
if (points.length < 2)
|
|
441
|
+
return 0;
|
|
442
|
+
const first = points[0];
|
|
443
|
+
const last = points[points.length - 1];
|
|
444
|
+
return Math.round((Date.parse(last.date) - Date.parse(first.date)) / 86400000);
|
|
445
|
+
}
|
|
446
|
+
/* ── W5(#518)· 数值有效位一致(视觉抽查 §2.1 缺陷 4/§2.2 缺陷 5) ───────────────────
|
|
447
|
+
*
|
|
448
|
+
* 病根:同一列/同一卡里的数各自走 `String(n)` ⇒ 把上游的**浮点尾数**原样印上屏。实测两个反例:
|
|
449
|
+
* · 页 01「预计区间」卡:`74.69 至 74.80` 由 `fmt()` 出(尾部零被 JS 吃掉)与 `74.8` 混排;
|
|
450
|
+
* · 页 07 结论句 `1.36 kg` 与卡里 `1.36`/区间端点混排;页 10–13「每周掉重」`1.87` 与
|
|
451
|
+
* 「当前」`75.1` 同排(体重 1 位、速率 2 位,是**语义档**不是随手)。
|
|
452
|
+
*
|
|
453
|
+
* 口径(本件页族统一,**不改任何冻结断言的期望值**——下面每一处都只走显示层):
|
|
454
|
+
* · 体重类(kg 值、预测值)=**1 位**;
|
|
455
|
+
* · 速率/比率类(kg/周)=**2 位**;
|
|
456
|
+
* · 整数语义的读数(卡路里、天数、天数差)=原样,不补小数。
|
|
457
|
+
* 非有限数(`undefined`/`NaN`)交给 `fmt` 的既有退化分支印 `—`。 */
|
|
458
|
+
function fixedOrUndefined(n, digits) {
|
|
459
|
+
return n === null || n === undefined || !Number.isFinite(n) ? undefined : Number(n.toFixed(digits));
|
|
460
|
+
}
|
|
461
|
+
/** 体重读数(**固定 1 位**;非有限数印 `—`)。
|
|
462
|
+
* **W6**:这里必须走 `toFixed(1)` 的**字面**,不能走 `fmt(Number(n.toFixed(1)))`——
|
|
463
|
+
* 后者把整数位的小数点吃掉,页 07 轨迹列就会出现 `71` 与 `72.4` 同列两种字面
|
|
464
|
+
* (视觉抽查 §9.5 那格「部分修」的尾巴:源码命中 `>71</td>`,与同列 `72.4`/`73.7` 不一致)。
|
|
465
|
+
* 非有限数那一支仍是**真缺值**语境,故照既有口径印 `—`。 */
|
|
466
|
+
function fmtWeight(n) {
|
|
467
|
+
return n === null || n === undefined || !Number.isFinite(n) ? '—' : n.toFixed(1);
|
|
468
|
+
}
|
|
469
|
+
/** 速率读数(2 位)。 */
|
|
470
|
+
function fmtRate(n) {
|
|
471
|
+
return fmt(fixedOrUndefined(n, 2));
|
|
472
|
+
}
|
|
473
|
+
/** 卡路里读数(整数)。摄入/消耗是整数语义的量——同页「当前摄入」「目标」都是整数,
|
|
474
|
+
* 外推出来的 `1666.98` 是**算出来的小数**,不是量出来的精度(视觉抽查 §2.2 缺陷 5 的同一病根)。 */
|
|
475
|
+
function fmtKcal(n) {
|
|
476
|
+
return fmt(fixedOrUndefined(n, 0));
|
|
477
|
+
}
|
|
478
|
+
/** 轨迹表的公共装配(有表的页共用):列与表题同源,表题按**实际覆盖天数**写实(#455)。
|
|
479
|
+
* **W5**:① 值走 `fmtWeight`(1 位)——同列有效位一致(视觉抽查 §2.2 缺陷 5);
|
|
480
|
+
* ② 外层套 `.tpd-track-table` 一个**纯标记类**(公共层产出器不吃额外入参,故只能在外层套),
|
|
481
|
+
* 供本页族窄档那条规则定位——窄档「一行两行」的标签噪声缓解见件头下方 `trackTableCss`。
|
|
482
|
+
* **#569 R-07**:两列模拟表(`restoreHead=true`)再套一层 `.tpd-track-table--cols2`
|
|
483
|
+
* 纯标记(内层字面逐字不动,W6-②守卫),供 `t569SimCss` 窄档恢复表头+列式对齐;
|
|
484
|
+
* 三列表(摄入预测)传缺省,维持行卡化(R-16 归 #570)。 */
|
|
485
|
+
function trackTable(points, what, unit, restoreHead = false) {
|
|
486
|
+
const span = spanDaysOf(points);
|
|
487
|
+
const shown = points.slice(0, 14);
|
|
488
|
+
const truncated = points.length > shown.length ? '(仅列前 14 点,共 ' + points.length + ' 点)' : '';
|
|
489
|
+
const table = '<div class="tpd-track-table">' + renderDataTable({
|
|
490
|
+
columns: [{ key: 'date', label: '日期' }, { key: 'weight', label: what + '(' + unit + ')', align: 'right' }],
|
|
491
|
+
rows: shown.map((p) => ({ date: p.date, weight: fmtWeight(p.value) })),
|
|
492
|
+
caption: '模拟轨迹(共 ' + span + ' 天,每周一点' + truncated + ')',
|
|
493
|
+
emptyText: '这一段还没有体重记录,先称一次体重再来看',
|
|
494
|
+
}) + '</div>';
|
|
495
|
+
return restoreHead ? '<div class="tpd-track-table--cols2">' + table + '</div>' : table;
|
|
496
|
+
}
|
|
497
|
+
/** 轨迹表的**窄档**样式(#518 W5 · 只做页面侧,逐条都住本页族自己的 `<style>` 段里)。
|
|
498
|
+
*
|
|
499
|
+
* 视觉抽查 §2.2 缺陷 6(页 07 · 390 档):「表格堆叠后每条记录占两行、且**逐行重复字段名**
|
|
500
|
+
* 『日期』『模拟体重』15 遍,15 个数据点摊成 30 行、整页拉到 2066px」。
|
|
501
|
+
*
|
|
502
|
+
* 公共层在 ≤640px 把每格做成「标签 + 值」一行(`td::before{content:attr(data-label)}`,
|
|
503
|
+
* 见 `packages/base-render/src/blocks.ts` 的 t154-r3/#541 段)——那是**多列任意表**的通用解。
|
|
504
|
+
* 本页族这张表只有两列,其中**日期这一列的名自明**(`2026-09-16` 谁都认得出是日期),
|
|
505
|
+
* 故窄档把它压回**一行一条**:
|
|
506
|
+
* · 行改 flex(`tr` 本身没有类名,故用 `tbody > tr` 与容器类两层限定);
|
|
507
|
+
* · 日期格去掉那半个标签(`first-child::before{content:none}`),值独占;
|
|
508
|
+
* · 体重格保留「模拟体重」标签——它是这一行唯一的字段名,逐行出现是本职,不是噪声;
|
|
509
|
+
* · `nowrap` 兜住:值再长也不逐格换行。
|
|
510
|
+
* 高度读数:30 行 → 15 行(15 行表=每行「日期」「模拟体重」两行合成一行)。
|
|
511
|
+
* **不碰公共层**:`packages/base-render/**` 一行未动(票面红线),只在本页族的 `<style>` 段覆盖。
|
|
512
|
+
*
|
|
513
|
+
* 限定面:`<div class="tpd-track-table">` 由 `trackTable()` 自己套上(本件独有,逐字可检索),
|
|
514
|
+
* 公共层产出器不吃额外入参,故只能在外层套这一层——不改公共层、也不改公共层的产出结构。
|
|
515
|
+
*
|
|
516
|
+
* **W6 追加**:表头那一格的单位**只许一种形态**。公共层的 `.ilife-block-data-table th` 带
|
|
517
|
+
* `text-transform: uppercase`(`base-render/src/blocks.ts` 的 `th` 一段),1440 档把
|
|
518
|
+
* `模拟体重(kg)` 渲染成 `模拟体重(KG)`,而同一页的 KPI 卡单位是 `kg/周`、脚注写「公斤」
|
|
519
|
+
* ⇒ 同页同单位三形态(视觉抽查 §9.2 新引入项之一的原句)。修正动作=在本页族这一层把 `th`
|
|
520
|
+
* 的转换压掉(`text-transform:none`),字面就回到源码里的 `kg`;脚注那一侧的用词由本件自己
|
|
521
|
+
* 统一成 `kg`(见各页 `renderCaliberLine`)。表头缩写的选择权仍在**公共层**(红线:不动
|
|
522
|
+
* `packages/base-render/**`),本件只覆盖这一张表的列头。 */
|
|
523
|
+
function trackTableCss() {
|
|
524
|
+
return '<style>\n'
|
|
525
|
+
/* 纯标记块:桌面档不给任何样式,只作窄档那段规则的锚点。 */
|
|
526
|
+
+ '.tpd-track-table{display:block}\n'
|
|
527
|
+
/* W6:列头不放大写——单位写 `kg` 就渲染 `kg`(选择器多一层,压过公共层的同名同权重规则)。 */
|
|
528
|
+
+ '.tpd-track-table .ilife-block-data-table th{text-transform:none}\n'
|
|
529
|
+
+ '@media (max-width:640px){\n'
|
|
530
|
+
+ ' .tpd-track-table tbody>tr{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 10px}\n'
|
|
531
|
+
+ ' .tpd-track-table tbody>tr>td{display:block;white-space:nowrap;overflow-wrap:normal;padding:4px 0}\n'
|
|
532
|
+
+ ' .tpd-track-table tbody>tr>td:first-child::before{content:none}\n'
|
|
533
|
+
+ '}\n'
|
|
534
|
+
+ '</style>';
|
|
535
|
+
}
|
|
536
|
+
/* ── W6(#518)· 判定卡的值位**整格撤掉**(视觉抽查 §9.6 新引入问题①) ─────────────────
|
|
537
|
+
|
|
538
|
+
* 缺陷原文(`docs/skills/skill-calorie/t518-视觉抽查.md` §9.6):「KPI 行里三张卡是大号数字、
|
|
539
|
+
* 第四张是一个短横,**值位这个全页最大的字号位置被空符号占住**,整行扫读节奏断掉」+
|
|
540
|
+
* 「更关键的是**符号语义撞车**:`—` 在数据页的通行读法是『缺值/无数据』,这里却被用来表达
|
|
541
|
+
* 『该指标不是数值型』。同一符号在别的卡上若真出现缺值,读者无法区分『没有数据』和『不适用』。」
|
|
542
|
+
*
|
|
543
|
+
* 改法=W6 派单 §1 的推荐①:**撤掉该卡的值位**——判定词只由状态徽标承担(一处),空出的位置
|
|
544
|
+
* 由 `detail` 补一句人话(**不引入任何新数字**,也不与徽标同词,故 W5-① 那条「同卡不重复」仍绿)。
|
|
545
|
+
*
|
|
546
|
+
* 为什么这张卡不走 `renderKpiCard`:公共层的 `KpiCardInput.value` 是**必填非空**
|
|
547
|
+
* (`base-render/src/blocks.ts` 的 `KpiCardInput.value` + `reqText` 的 `value === '' → badInput`)
|
|
548
|
+
* ⇒「没有值位的卡」在公共层**产不出来**,而本票红线不许动 `packages/base-render/**`。
|
|
549
|
+
* 故本件自出这一张卡的**页框**:类名沿用公共层同一套命名空间(`ilife-block-kpi-card` 一族),
|
|
550
|
+
* `.ilife-block-kpi-card-grid` 的网格与全部样式因此仍单源住公共层——
|
|
551
|
+
* **徽章本身**照旧走公共层 `renderStatusBadge`(本件不造第二份徽章)。
|
|
552
|
+
* 同族先例:`sportDocs.ts` 的目标环卡(`ilife-block-ring-*`)同样是页面自出的卡。
|
|
553
|
+
*
|
|
554
|
+
* 硬规矩(W6 派单 §1):**可见文本里的 `—` 只允许用于缺值语境**。本件剩下两处 `—` 都在
|
|
555
|
+
* `?? '—'` 的**真缺值**分支上(页 14–17 的「目标」「日变化」);非数值型的判定卡一处不留。
|
|
556
|
+
* 机器守卫=`test/analysis-deficit-eta-466.test.mjs` 的 `#518 W6-①`(含变异两行)。 */
|
|
557
|
+
function verdictCard(label, detail, ok, okText, badText) {
|
|
558
|
+
return '<div class="ilife-block ilife-block-kpi-card">'
|
|
559
|
+
+ '<div class="ilife-block-kpi-card-label">' + escapeHtml(label) + '</div>'
|
|
560
|
+
+ '<div class="ilife-block-kpi-card-detail">' + escapeHtml(detail) + '</div>'
|
|
561
|
+
+ '<div class="ilife-block-kpi-card-badge">'
|
|
562
|
+
+ renderStatusBadge({ status: ok ? 'ok' : 'warn', text: ok ? okText : badText })
|
|
563
|
+
+ '</div></div>';
|
|
564
|
+
}
|
|
565
|
+
/** 判定卡补进网格的尾位:`renderKpiGrid` 只吃 `KpiCardInput`(值位必填非空),
|
|
566
|
+
* 而判定卡没有值位 ⇒ 在网格收尾前把这一张塞进去,网格结构与卡序(前 3 张数据卡 + 尾位判定卡)不变。 */
|
|
567
|
+
function withVerdictCard(gridHtml, cardHtml) {
|
|
568
|
+
const CLOSE = '</div>';
|
|
569
|
+
return gridHtml.endsWith(CLOSE) ? gridHtml.slice(0, -CLOSE.length) + cardHtml + CLOSE : gridHtml + cardHtml;
|
|
570
|
+
}
|
|
571
|
+
/* ── 体重预测(predict_report 对照:点预测 KPI+insight;曲线归组合分析,见 §3 R4) ── */
|
|
572
|
+
export function buildPredictDoc(v) {
|
|
573
|
+
const parts = [
|
|
574
|
+
/* #568 R-03:眉题写族名(见`eyebrow:预测体重`)、chip写页名(第二格`N 天`),二者 distinct。 */
|
|
575
|
+
t568Chips(String(v.horizonDays) + ' 天'),
|
|
576
|
+
/* 结论条(J2/J9 三条恒出之一;`t425` 裁定 2:结论句紧跟标题):只用页里已有的数——
|
|
577
|
+
* `forecastValue` 是**轨迹末点**的值,补了第 horizon 天末点之后它与「N 天后」真正同轴(#455)。
|
|
578
|
+
* W5:末值走 `fmtWeight`(1 位)——与同页「预计区间」两端同一档(视觉抽查 §2.1 缺陷 4)。 */
|
|
579
|
+
renderConclusionBar('按最近的趋势,' + v.horizonDays + ' 天后体重约 ' + fmtWeight(v.forecastValue) + ' kg。'),
|
|
580
|
+
/* 页内导航(J8/J9):本页无轨迹表(`PredictView` 不带点列),导航项同步不出「模拟轨迹」那一项。 */
|
|
581
|
+
predictNav(false),
|
|
582
|
+
pageSection('sec-params', renderParamForm({
|
|
583
|
+
fields: [
|
|
584
|
+
{ name: 'start', label: '开始', value: v.start },
|
|
585
|
+
{ name: 'end', label: '结束', value: v.end },
|
|
586
|
+
{ name: 'horizonDays', label: '预测天数', value: String(v.horizonDays) },
|
|
587
|
+
],
|
|
588
|
+
/* 说明里原印内部参数名与拒绝码(`horizonDays`/`missing-data`)——读者认不得;参数名仍在
|
|
589
|
+
* 参数表单的 `name` 属性里。W2 再把那句 `;` 改写成两句(#516 §3.2 D03:参数说明里的 `;`
|
|
590
|
+
* 是「拿符号简化 UI」的债,该处要做的是换成两句人话,不是删掉标点)。
|
|
591
|
+
* 这 8 页(predict 族)**不另加 HTML 注释**:`analysis-predict-383.test.mjs` 的残留判据只认
|
|
592
|
+
* 五个未填充的槽位标记,口径一律走可见的口径行(下面那两条),不靠注释留档。 */
|
|
593
|
+
description: '按最近的体重趋势往后推,能推 7 到 180 天。体重记录不到 14 天就只说数据不够,不编预测。',
|
|
594
|
+
}), secTitle('sec-params')),
|
|
595
|
+
pageSection('sec-overview', renderKpiGrid([
|
|
596
|
+
{ label: '当前', value: String(v.current), unit: 'kg' },
|
|
597
|
+
/* W5:与结论句同一档(1 位)——同一件事(末点预测值)在页上只该有一个写法。 */
|
|
598
|
+
{ label: '预测', value: fmtWeight(v.forecastValue), unit: 'kg', detail: v.horizonDays + ' 天后' },
|
|
599
|
+
/* W5:速率 2 位(语义档=kg/周)。 */
|
|
600
|
+
{ label: '速率', value: fmtRate(v.ratePerWeek), unit: 'kg/周' },
|
|
601
|
+
/* 区间写「至」(#516 §3.2 D06:值位不许拿 `~` 顶替「至」)。
|
|
602
|
+
* W5:两端走 `fmtWeight`(1 位)——原写法 `fmt()` 把 `74.80` 印成 `74.8`,
|
|
603
|
+
* 与同卡另一端的两位小数混排(视觉抽查 §2.1 缺陷 4 的原句)。 */
|
|
604
|
+
{ label: '预计区间', value: fmtWeight(v.forecastLo) + ' 至 ' + fmtWeight(v.forecastHi), unit: 'kg', detail: '95% 置信带' },
|
|
605
|
+
]), secTitle('sec-overview')),
|
|
606
|
+
];
|
|
607
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
608
|
+
envelope: {
|
|
609
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
610
|
+
data: {
|
|
611
|
+
metrics: metricsOf({
|
|
612
|
+
current: v.current, ratePerWeek: v.ratePerWeek, forecastValue: v.forecastValue,
|
|
613
|
+
forecastLo: v.forecastLo, forecastHi: v.forecastHi, horizonDays: v.horizonDays,
|
|
614
|
+
}),
|
|
615
|
+
},
|
|
616
|
+
},
|
|
617
|
+
}), secTitle('sec-data')));
|
|
618
|
+
/* 口径行(J2/J9 三条恒出之一;`renderCaliberLine` 走 `|` 分槽,产物可见文本里不留该字符)。 */
|
|
619
|
+
parts.push(renderCaliberLine('体重=当前值加日速率乘天数|预计区间按体重残差向外放宽,取 95% 置信带|体重记录不到 14 天不出预测'));
|
|
620
|
+
parts.push(sourceFootnote('体重记录', v.start, v.end));
|
|
621
|
+
return assembleDocPage({
|
|
622
|
+
/* head 的 `<title>` 也去 `·`(J1 题名两段不拿 `·` 串;同族先例 #517 缺口页的「卡路里 热量缺口」)。 */
|
|
623
|
+
docTitle: '卡路里 体重预测',
|
|
624
|
+
title: '体重预测(' + v.horizonDays + ' 天)',
|
|
625
|
+
/* 眉标只留一个归属词(#516 §3.2 D02):原来那串 `体重预测 · 趋势分析域` 的 `·` 拆开——
|
|
626
|
+
* 页型进了页头胶囊,眉标留域;`域` 是仓库里的架构词,不上屏。
|
|
627
|
+
* #568 R-03:眉题改写族名`预测体重`(chip第二格写页名`N 天`,二者 distinct,8/8)。 */
|
|
628
|
+
eyebrow: '预测体重',
|
|
629
|
+
subtitle: null,
|
|
630
|
+
content: pageChromeCss(1120) + t568PredictCss() + t573CrossCss() + parts.join(''),
|
|
631
|
+
charts: false,
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
/* ── #383 · 预测体重(自定义目标)(weightTarget:预计达成日+可行性;只改本图会碰到的预测段) ── */
|
|
635
|
+
export function buildPredictTargetDoc(v) {
|
|
636
|
+
/* #568 R-06:差异量(还差Xkg)与期限(剩余Y天)取页里已有数(current/target/daysLeft),不新算口径;
|
|
637
|
+
* 结论第二句不再写判断(`超出健康范围`只留徽标一处),detail改速率事实,与徽标/结论两两不互为子串。 */
|
|
638
|
+
const diffKg = (typeof v.current === 'number' && typeof v.target === 'number'
|
|
639
|
+
&& Number.isFinite(v.current) && Number.isFinite(v.target))
|
|
640
|
+
? (v.current - v.target).toFixed(1) : null;
|
|
641
|
+
const conclTail = diffKg === null
|
|
642
|
+
? '' : '还差 ' + diffKg + ' kg,剩余 ' + String(v.daysLeft) + ' 天。';
|
|
643
|
+
/* W6-①硬规矩:可见文本里的`—`只许用于真缺值。此处降级视图(rate缺失)不许印`—`(否则完整夹具也被判有`—`),改一句无数字人话。 */
|
|
644
|
+
const rateText = (typeof v.ratePerWeek === 'number' && Number.isFinite(v.ratePerWeek))
|
|
645
|
+
? '当前速率 ' + fmtRate(v.ratePerWeek) + ' kg/周。' : '按窗口内趋势推算。';
|
|
646
|
+
const parts = [
|
|
647
|
+
/* #568 R-03:chip第二格写页名`自定义目标`,眉题写族名`预测体重`(见`eyebrow`)。 */
|
|
648
|
+
t568Chips('自定义目标'),
|
|
649
|
+
/* 结论句只用页里已有的数(`eta`/`target`/`diff`/`daysLeft`),判断只留徽标(R-06计数==1)。 */
|
|
650
|
+
renderConclusionBar('按最近的趋势,预计 ' + String(v.eta) + ' 前后达到 ' + String(v.target) + ' kg。' + conclTail),
|
|
651
|
+
predictNav(false),
|
|
652
|
+
pageSection('sec-params', renderParamForm({
|
|
653
|
+
fields: [
|
|
654
|
+
{ name: 'start', label: '开始', value: v.start ?? '' },
|
|
655
|
+
{ name: 'end', label: '结束', value: v.end ?? '' },
|
|
656
|
+
{ name: 'target', label: '目标体重', value: String(v.target ?? '') },
|
|
657
|
+
],
|
|
658
|
+
description: '按当前的体重趋势算出哪天能达到目标体重。体重记录不到 14 天就只说数据不够,不编一个日期出来。',
|
|
659
|
+
}), secTitle('sec-params')),
|
|
660
|
+
pageSection('sec-overview', withVerdictCard(renderKpiGrid([
|
|
661
|
+
{ label: '当前', value: String(v.current), unit: 'kg' },
|
|
662
|
+
{ label: '目标', value: String(v.target), unit: 'kg' },
|
|
663
|
+
{ label: '预计达成', value: String(v.eta), detail: '剩余 ' + String(v.daysLeft) + ' 天' },
|
|
664
|
+
]), verdictCard('可行性', rateText, v.feasible, '可行', '超范围')), secTitle('sec-overview')),
|
|
665
|
+
];
|
|
666
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
667
|
+
envelope: {
|
|
668
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
669
|
+
data: {
|
|
670
|
+
metrics: metricsOf({
|
|
671
|
+
target: v.target, days_left: v.daysLeft, feasible: v.feasible ? 1 : 0,
|
|
672
|
+
current: v.current, ratePerWeek: v.ratePerWeek,
|
|
673
|
+
}),
|
|
674
|
+
},
|
|
675
|
+
},
|
|
676
|
+
}), secTitle('sec-data')));
|
|
677
|
+
parts.push(renderCaliberLine('预计达成日=按当前速率线性外推的那一天|健康范围=每周掉 0.5 到 1.0 kg|体重记录不到 14 天不出日期'));
|
|
678
|
+
parts.push(sourceFootnote('体重记录', String(v.start ?? ''), String(v.end ?? '')));
|
|
679
|
+
return assembleDocPage({
|
|
680
|
+
docTitle: '卡路里 体重预测',
|
|
681
|
+
/* H1(W5:括号统一为全角)**必须带本页自己的参数**:`analysis-accept-386.test.mjs:327` 那条
|
|
682
|
+
* 「页头不是它自己那一页」的断言对 `target:65` 这条词要求「非 window 的数字参数都出现在 H1 里」
|
|
683
|
+
* (同族 01–05/07–17 本就满足:H1 里带天数/卡数);本页原文不带目标值 ⇒ 补上「65 kg」。
|
|
684
|
+
* 括号**只换形状不换词**:唤醒词原文与冻结表仍写半角(`routes.ts` 的 `wake_word` 一字未动)。
|
|
685
|
+
* #568 R-05:`65`与`kg`之间用不换行空格(U+00A0),二者不可断(冻结W5-③要求H1纯文本,故不用span,见§6冲突点)。 */
|
|
686
|
+
title: '预测体重(自定义目标 ' + String(v.target ?? '') + ' kg)',
|
|
687
|
+
/* #568 R-03:眉题写族名`预测体重`(chip第二格`自定义目标`,二者 distinct)。 */
|
|
688
|
+
eyebrow: '预测体重',
|
|
689
|
+
subtitle: null,
|
|
690
|
+
content: pageChromeCss(1120) + t568PredictCss() + t573CrossCss() + parts.join(''),
|
|
691
|
+
charts: false,
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
/* ── #383 · 模拟减重(每天多减 cutKcal 卡)(每周掉重+可行性;只改本图会碰到的预测段) ── */
|
|
695
|
+
export function buildSimCutDoc(v) {
|
|
696
|
+
const pts = v.forecast ? v.forecast.points : [];
|
|
697
|
+
/* #569 R-09:判断只留徽标一处(`超范围`/`可行`)。结论只留两主数(前半句式冻结 W5-②
|
|
698
|
+
* `/一周大约掉 (\d+\.\d+) kg/` 不动);判定卡 detail 改互补事实——`newDeficit`(每天总缺口)
|
|
699
|
+
* 页上别处未用,不与徽标同词(W5-①),无 `—`(W6-①-c),缺数时 fallback 无数字人话。 */
|
|
700
|
+
const totalGap = (typeof v.newDeficit === 'number' && Number.isFinite(v.newDeficit))
|
|
701
|
+
? '每天总缺口约 ' + String(v.newDeficit) + ' 卡。' : '缺口按窗口内趋势另算。';
|
|
702
|
+
const parts = [
|
|
703
|
+
/* #568 R-03(01–08):chip第二格写页名`每天-N卡`,眉题写族名`模拟减重`(见`eyebrow`)。
|
|
704
|
+
* #569 R-10:页名留半角空格(`每天 -300 卡`),与正文同一间距规则(数字与单位间留空格)。 */
|
|
705
|
+
t568Chips('每天 -' + String(v.cutKcal) + ' 卡'),
|
|
706
|
+
/* 结论句只用页里已有的数(`cutKcal`/`weeklyLoss`)。
|
|
707
|
+
* W5:`weeklyLoss` 走 `fmtRate`(2 位)——与第 3 张卡的「每周掉重」同一档。 */
|
|
708
|
+
renderConclusionBar('每天多减 ' + String(v.cutKcal ?? '') + ' 卡,一周大约掉 ' + fmtRate(v.weeklyLoss) + ' kg。'),
|
|
709
|
+
predictNav(pts.length > 0),
|
|
710
|
+
pageSection('sec-params', renderParamForm({
|
|
711
|
+
fields: [
|
|
712
|
+
{ name: 'start', label: '开始', value: v.start ?? '' },
|
|
713
|
+
{ name: 'end', label: '结束', value: v.end ?? '' },
|
|
714
|
+
{ name: 'cut_kcal', label: '每天多减', value: String(v.cutKcal ?? '') },
|
|
715
|
+
],
|
|
716
|
+
/* 原说明里那句 `;` 与「90 天的轨迹在下面」拆开:轨迹那一句由区块自己(表题)承担,
|
|
717
|
+
* 这里只说这一页在做什么(#516 §3.2 D03;`KCAL_PER_KG` 这类常量名不上屏)。 */
|
|
718
|
+
description: '看看每天再多减一些卡路里,体重会怎么掉。每 7700 卡大约对应 1 kg,按这个折算每周掉多少。能不能做到,看每周的掉重落在 0.5 到 1.0 kg 这个安全区间里没有。',
|
|
719
|
+
}), secTitle('sec-params')),
|
|
720
|
+
trackTableCss(),
|
|
721
|
+
pageSection('sec-overview', withVerdictCard(renderKpiGrid([
|
|
722
|
+
{ label: '当前', value: String(v.current), unit: 'kg' },
|
|
723
|
+
{ label: '每天多减', value: String(v.cutKcal), unit: '卡' },
|
|
724
|
+
/* W5:值走 `fmtRate`(2 位,kg/周 的语义档)——原写法把上游 `round2` 的尾零吃掉,
|
|
725
|
+
* 会出现 `1.4` 与同族 `1.36` 两种写法;`安全区间 0.5 到 1.0 kg/周`这份事实已由
|
|
726
|
+
* 同页口径行末段承担(「安全区间=每周掉 0.5 到 1.0 kg」),卡内不再印第二遍。
|
|
727
|
+
* #569 R-12:本卡为结论卡(字号由 `t569SimCss` 升档,不改此处)。 */
|
|
728
|
+
{ label: '每周掉重', value: fmtRate(v.weeklyLoss), unit: 'kg/周' },
|
|
729
|
+
]), verdictCard('可行性', totalGap, v.feasible, '可行', '超范围')), secTitle('sec-overview')),
|
|
730
|
+
];
|
|
731
|
+
/* #569 R-07:两列表传 `restoreHead`(窄档恢复表头+列式对齐,见 `t569SimCss`)。 */
|
|
732
|
+
if (pts.length > 0)
|
|
733
|
+
parts.push(pageSection('sec-track', trackTable(pts, '模拟体重', 'kg', true), secTitle('sec-track')));
|
|
734
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
735
|
+
envelope: {
|
|
736
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
737
|
+
data: {
|
|
738
|
+
metrics: metricsOf({
|
|
739
|
+
cut_kcal: v.cutKcal, weekly_loss: v.weeklyLoss, feasible: v.feasible ? 1 : 0,
|
|
740
|
+
current: v.current,
|
|
741
|
+
}),
|
|
742
|
+
},
|
|
743
|
+
},
|
|
744
|
+
}), secTitle('sec-data')));
|
|
745
|
+
parts.push(renderCaliberLine('每 7700 卡大约折算 1 kg|轨迹从窗口最后一天起算,每周一点,非整周时补最后一天那一行|安全区间=每周掉 0.5 到 1.0 kg'));
|
|
746
|
+
parts.push(sourceFootnote('体重记录与运动记录', String(v.start ?? ''), String(v.end ?? '')));
|
|
747
|
+
return assembleDocPage({
|
|
748
|
+
docTitle: '卡路里 模拟减重',
|
|
749
|
+
/* #569 R-10:主标与正文同一间距规则(数字与单位间留半角空格):`每天 -300 卡`。
|
|
750
|
+
* 唤醒词原文(`模拟减重(每天-300卡)`)住 routes.ts 冻结不动;括号仍全角(W5-③)。 */
|
|
751
|
+
title: '模拟减重(每天 -' + String(v.cutKcal) + ' 卡)',
|
|
752
|
+
/* #568 R-03:眉题写族名`模拟减重`(chip第二格页名,二者 distinct)。 */
|
|
753
|
+
eyebrow: '模拟减重',
|
|
754
|
+
subtitle: null,
|
|
755
|
+
content: pageChromeCss(1120) + t568PredictCss() + t569SimCss() + t573CrossCss() + parts.join(''),
|
|
756
|
+
charts: false,
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
/* ── #383 · 模拟减重(自定天数减 Xkg)(所需每日缺口+可行性;只改本图会碰到的预测段) ── */
|
|
760
|
+
export function buildSimTargetDoc(v) {
|
|
761
|
+
const pts = v.forecast ? v.forecast.points : [];
|
|
762
|
+
/* #569 R-11:`所需缺口`卡 detail 原与结论条同前缀(`要在 X 天里减掉 Y kg`)。
|
|
763
|
+
* 改总量互补——`neededDeficit×daysTarget`(渲染层派生,R-06 `diffKg` 先例;
|
|
764
|
+
* 该视图无“当前缺口”字段,报告的“如…”例无数组成)。无 `—`(W6-①-c)。 */
|
|
765
|
+
const periodTotal = (typeof v.neededDeficit === 'number' && typeof v.daysTarget === 'number'
|
|
766
|
+
&& Number.isFinite(v.neededDeficit) && Number.isFinite(v.daysTarget))
|
|
767
|
+
? String(v.daysTarget) + ' 天合计约 ' + String(v.neededDeficit * v.daysTarget) + ' 卡。'
|
|
768
|
+
: '缺口按窗口内趋势另算。';
|
|
769
|
+
/* #620 增量1:结论与徽标按 `weeklyRate` 分偏慢/偏快(`feasible`只保兼容)。慢速(<0.5)说“偏慢”,快速(>1.0)说“超出/偏快”,口径唯一处 `HEALTHY_RATE`。 */
|
|
770
|
+
const weeklyRateNum = typeof v.weeklyRate === 'number' ? v.weeklyRate : NaN;
|
|
771
|
+
const slowTarget = Number.isFinite(weeklyRateNum) && weeklyRateNum < HEALTHY_RATE[0];
|
|
772
|
+
const parts = [
|
|
773
|
+
/* #569 R-03 同形延伸(10–13):眉题写族名`模拟减重`、chip 写页名(与 H1 同 spaced 形态),
|
|
774
|
+
* 二者 distinct(改前眉题`趋势分析`与第三格同字,R-03 的 01–08 范围未含 10–13)。 */
|
|
775
|
+
t568Chips(String(v.daysTarget) + ' 天减 ' + String(v.targetLoss) + ' kg'),
|
|
776
|
+
/* 结论句只用页里已有的数(`daysTarget`/`targetLoss`/`neededDeficit`/`feasible`+`weeklyRate`判方向)。 */
|
|
777
|
+
renderConclusionBar('要在 ' + String(v.daysTarget) + ' 天里减掉 ' + String(v.targetLoss) + ' kg,每天大约要留出 ' + String(v.neededDeficit) + ' 卡缺口。'
|
|
778
|
+
+ (v.feasible ? '这个速度在健康范围内。' : slowTarget ? '这个速度偏慢,建议缩短时间或提高目标。' : '这个速度超出健康范围,建议拉长时间或降低目标。')),
|
|
779
|
+
predictNav(pts.length > 0),
|
|
780
|
+
pageSection('sec-params', renderParamForm({
|
|
781
|
+
fields: [
|
|
782
|
+
{ name: 'start', label: '开始', value: v.start ?? '' },
|
|
783
|
+
{ name: 'end', label: '结束', value: v.end ?? '' },
|
|
784
|
+
{ name: 'target_loss', label: '想减', value: String(v.targetLoss ?? '') },
|
|
785
|
+
{ name: 'days_target', label: '天数', value: String(v.daysTarget ?? '') },
|
|
786
|
+
],
|
|
787
|
+
/* 原说明句尾夹常量名、还拿 `;` 串两条规则(#516 §3.2 D03;`Xkg` 那种占位写法不上屏)。 */
|
|
788
|
+
description: '模拟在自定的天数里减掉想减的重量,需要每天留出多少缺口。每 7700 卡大约对应 1 kg,按这个反推。能不能做到,看每周的掉重落在 0.5 到 1.0 kg 这个安全区间里没有。',
|
|
789
|
+
}), secTitle('sec-params')),
|
|
790
|
+
trackTableCss(),
|
|
791
|
+
pageSection('sec-overview', withVerdictCard(renderKpiGrid([
|
|
792
|
+
{ label: '当前', value: String(v.current), unit: 'kg' },
|
|
793
|
+
/* #569 R-11:detail 改总量互补(见本函数头注释)。
|
|
794
|
+
* #569 R-12:本页结论卡为第 3 格`每周掉重`(报告点名的模拟页结论数量级即 kg/周),
|
|
795
|
+
* 由 `t569SimCss` 统一升档。 */
|
|
796
|
+
{ label: '所需缺口', value: String(v.neededDeficit), unit: '卡/天', detail: periodTotal },
|
|
797
|
+
/* W5:值走 `fmtRate`(2 位)——与结论句及同页轨迹同一语义档;「安全区间」那半句已住口径行,卡内不重印。 */
|
|
798
|
+
{ label: '每周掉重', value: fmtRate(v.weeklyRate), unit: 'kg/周' },
|
|
799
|
+
]), verdictCard('可行性', v.feasible
|
|
800
|
+
? '这个期限赶得上。'
|
|
801
|
+
: slowTarget ? '这个期限赶得偏慢。' : '这个期限赶得偏快。', v.feasible, '可行', '超范围')), secTitle('sec-overview')),
|
|
802
|
+
];
|
|
803
|
+
/* #569 R-07:两列表传 `restoreHead`(同 cut 页)。 */
|
|
804
|
+
if (pts.length > 0)
|
|
805
|
+
parts.push(pageSection('sec-track', trackTable(pts, '模拟体重', 'kg', true), secTitle('sec-track')));
|
|
806
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
807
|
+
envelope: {
|
|
808
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
809
|
+
data: {
|
|
810
|
+
metrics: metricsOf({
|
|
811
|
+
target_loss: v.targetLoss, days_target: v.daysTarget,
|
|
812
|
+
needed_deficit: v.neededDeficit, feasible: v.feasible ? 1 : 0, current: v.current,
|
|
813
|
+
}),
|
|
814
|
+
},
|
|
815
|
+
},
|
|
816
|
+
}), secTitle('sec-data')));
|
|
817
|
+
parts.push(renderCaliberLine('所需缺口=用 7700 卡折算要减的重量,再除以天数|轨迹从窗口最后一天起算,每周一点,末点是第 ' + String(v.daysTarget) + ' 天|安全区间=每周掉 0.5 到 1.0 kg'));
|
|
818
|
+
parts.push(sourceFootnote('体重记录与运动记录', String(v.start ?? ''), String(v.end ?? '')));
|
|
819
|
+
return assembleDocPage({
|
|
820
|
+
docTitle: '卡路里 模拟减重',
|
|
821
|
+
/* #569 R-10:主标与正文同一间距规则(数字与单位间留半角空格):`30 天减 2 kg`。
|
|
822
|
+
* 唤醒词原文住 routes.ts 冻结不动;括号仍全角(W5-③);目标/天数仍在 H1(386:327)。 */
|
|
823
|
+
title: '模拟减重(' + String(v.daysTarget) + ' 天减 ' + String(v.targetLoss) + ' kg)',
|
|
824
|
+
/* #569 R-03 同形延伸:眉题写族名`模拟减重`(chip 第二格为页名,二者 distinct)。 */
|
|
825
|
+
eyebrow: '模拟减重',
|
|
826
|
+
subtitle: null,
|
|
827
|
+
content: pageChromeCss(1120) + t569SimCss() + t573CrossCss() + parts.join(''),
|
|
828
|
+
charts: false,
|
|
829
|
+
});
|
|
830
|
+
}
|
|
831
|
+
/* ── #383 · 摄入预测(按当前速率)(日均摄入外推+目标对照;只改本图会碰到的预测段) ── */
|
|
832
|
+
export function buildCalorieForecastDoc(v) {
|
|
833
|
+
const pts = v.forecast ? v.forecast.points : [];
|
|
834
|
+
const span = spanDaysOf(pts);
|
|
835
|
+
const lastV = pts.length > 0 ? pts[pts.length - 1].value : null;
|
|
836
|
+
/* #570 R-19:自定义入口身份。路由层只注册了四档horizon(order406–409:7/30/90为按当前速率,
|
|
837
|
+
* 60为自定义),装配层拿不到唤醒词,horizon 60即自定义(注册命令空间内精确成立,非启发)。
|
|
838
|
+
* H1含`自定义`且与14–16互异;括号仍全角(W5-③)。结论句不动(取数层口径)。 */
|
|
839
|
+
const horizon = v.forecast?.horizonDays ?? 0;
|
|
840
|
+
const isCustom = horizon === 60;
|
|
841
|
+
/* #570 R-27:结论卡detail原印`N 天后`(与H1/结论句同事实,17页`60 天后`真子串)。
|
|
842
|
+
* 改互补事实——与目标的差(渲染层派生,R-06 `diffKg`先例;页上别处未印该差值)。
|
|
843
|
+
* 缺目标时回无数字人话(W6-①硬规矩:非缺值语境不印`—`)。 */
|
|
844
|
+
const gapDetail = (typeof lastV === 'number' && Number.isFinite(lastV)
|
|
845
|
+
&& typeof v.goal === 'number' && Number.isFinite(v.goal))
|
|
846
|
+
? (lastV >= v.goal
|
|
847
|
+
? '比目标高 ' + fmtKcal(lastV - v.goal) + ' 卡'
|
|
848
|
+
: '比目标低 ' + fmtKcal(v.goal - lastV) + ' 卡')
|
|
849
|
+
: '按当前趋势';
|
|
850
|
+
const parts = [
|
|
851
|
+
predictChips('摄入预测'),
|
|
852
|
+
/* 结论只给判定不复述数(末点预测值/目标两数住卡;`目标`一词保留,383 针住它;
|
|
853
|
+
* #625 A团)。W5 有效位口径不变:卡内末值与目标仍走 `fmtKcal`(整数)。 */
|
|
854
|
+
renderConclusionBar(lastV === null
|
|
855
|
+
? '这一段的摄入还不够算预测。'
|
|
856
|
+
: v.goal === null || v.goal === undefined
|
|
857
|
+
? '按当前速率,' + span + ' 天后继续保持当前节奏(还没有设目标,先去定目标)。'
|
|
858
|
+
: (typeof lastV === 'number' && typeof v.goal === 'number' && lastV >= v.goal)
|
|
859
|
+
? '按当前速率,' + span + ' 天后能达到目标一带。'
|
|
860
|
+
: '按当前速率,' + span + ' 天后离目标还差一些。'),
|
|
861
|
+
/* #570 R-15:轨迹项改`摄入预测轨迹`(与表注前6字一致,模拟族仍缺省`模拟轨迹`)。 */
|
|
862
|
+
predictNav(pts.length > 0, '摄入预测轨迹'),
|
|
863
|
+
pageSection('sec-params', renderParamForm({
|
|
864
|
+
fields: [
|
|
865
|
+
{ name: 'start', label: '开始', value: v.start ?? '' },
|
|
866
|
+
{ name: 'end', label: '结束', value: v.end ?? '' },
|
|
867
|
+
{ name: 'horizonDays', label: '预测天数', value: String(v.forecast?.horizonDays ?? '') },
|
|
868
|
+
],
|
|
869
|
+
/* 原说明那句 `;` 改写成两句(#516 §3.2 D03:该处要换形状,不是删标点)。 */
|
|
870
|
+
description: '按最近的摄入趋势往后推每天会吃多少。摄入记录不到 14 天就只说数据不够,不编预测。',
|
|
871
|
+
}), secTitle('sec-params')),
|
|
872
|
+
pageSection('sec-overview', renderKpiGrid([
|
|
873
|
+
{ label: '当前摄入', value: String(v.current), unit: '卡', detail: '日均' },
|
|
874
|
+
{ label: '目标', value: String(v.goal ?? '—'), unit: '卡' },
|
|
875
|
+
{ label: '日变化', value: String(v.dailyRate ?? '—'), unit: '卡/天' },
|
|
876
|
+
/* 摄入量是**整数语义**的读数(卡路里不印小数),故这一页的数值不动有效位;
|
|
877
|
+
* 只有外推末值走 `fmtKcal`(它自带两位小数,与同排的整数不齐)。 */
|
|
878
|
+
{ label: '摄入预测', value: fmtKcal(v.forecast?.points[v.forecast.points.length - 1]?.value), unit: '卡', detail: gapDetail },
|
|
879
|
+
]), secTitle('sec-overview')),
|
|
880
|
+
];
|
|
881
|
+
if (pts.length > 0) {
|
|
882
|
+
const shown = pts.slice(0, 14);
|
|
883
|
+
const cut = pts.length > shown.length ? '(仅列前 14 点,共 ' + pts.length + ' 点)' : '';
|
|
884
|
+
/* W5:摄入轨迹表也套 `.tpd-track-table`(窄档那三条规则对三列表同样只压掉「日期」那半个标签,
|
|
885
|
+
* 列数多时体重/区间两列的标签仍逐行出现——窄档不叠列、不横滑)。
|
|
886
|
+
* #570 R-16/R-17:再套 `.tpd-track-table--cols3` 纯标记(三列表堆叠+列宽按内容,见`t570IntakeCss`)。 */
|
|
887
|
+
parts.push(trackTableCss());
|
|
888
|
+
parts.push(pageSection('sec-track', '<div class="tpd-track-table tpd-track-table--cols3">' + renderDataTable({
|
|
889
|
+
columns: [
|
|
890
|
+
{ key: 'date', label: '日期' },
|
|
891
|
+
{ key: 'intake', label: '预测摄入', align: 'right' },
|
|
892
|
+
{ key: 'band', label: '预计区间', align: 'right' },
|
|
893
|
+
],
|
|
894
|
+
/* #570 R-18:零宽区间折叠为单值(首行残差为零时`lo/hi`同值)。按**格式化后**字面判等
|
|
895
|
+
* (裸值差半卡内也会印成同字,判裸值会漏折);右缘本就共线(右对齐,CDP极差0),折叠后保持。 */
|
|
896
|
+
rows: shown.map((p) => {
|
|
897
|
+
const loS = fmtKcal(p.lo);
|
|
898
|
+
const hiS = fmtKcal(p.hi);
|
|
899
|
+
return { date: p.date, intake: fmtKcal(p.value), band: loS === hiS ? fmtKcal(p.value) : loS + ' 至 ' + hiS };
|
|
900
|
+
}),
|
|
901
|
+
caption: '摄入预测轨迹(共 ' + span + ' 天,每周一点' + cut + ')',
|
|
902
|
+
emptyText: '这一段还没有饮食记录,先记一餐再来看',
|
|
903
|
+
}) + '</div>', secTitle('sec-track', '摄入预测轨迹')));
|
|
904
|
+
}
|
|
905
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
906
|
+
envelope: {
|
|
907
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
908
|
+
data: {
|
|
909
|
+
metrics: metricsOf({
|
|
910
|
+
calories: v.current, goal: v.goal ?? undefined,
|
|
911
|
+
horizonDays: v.forecast?.horizonDays,
|
|
912
|
+
}),
|
|
913
|
+
},
|
|
914
|
+
},
|
|
915
|
+
}), secTitle('sec-data')));
|
|
916
|
+
parts.push(renderCaliberLine('摄入=按最近的趋势线往外推|预计区间按摄入残差向外放宽,取 95% 置信带|摄入记录不到 14 天不出预测'));
|
|
917
|
+
parts.push(sourceFootnote('饮食记录', String(v.start ?? ''), String(v.end ?? '')));
|
|
918
|
+
return assembleDocPage({
|
|
919
|
+
docTitle: '卡路里 摄入预测',
|
|
920
|
+
/* #570 R-19:自定义入口 H1 带身份(见函数头 `isCustom`;14–16仍按当前速率)。 */
|
|
921
|
+
title: isCustom
|
|
922
|
+
? '摄入预测(自定义 ' + String(v.forecast?.horizonDays ?? '') + ' 天)'
|
|
923
|
+
: '摄入预测(按当前速率 ' + String(v.forecast?.horizonDays ?? '') + ' 天)',
|
|
924
|
+
eyebrow: '趋势分析',
|
|
925
|
+
subtitle: null,
|
|
926
|
+
/* #569 R-12/R-13(09–16,含本页 14–16):结论卡`摄入预测`升档+卡内距 16px(`t569ForecastCss`)。
|
|
927
|
+
* 三列表不动(R-16 归 #570);本改动只增益,#570 可在其上继续。
|
|
928
|
+
* #570 R-16/R-17/R-20/R-21:本族网格两列+三列表堆叠+列宽+徽章升格(`t570IntakeCss`)。 */
|
|
929
|
+
content: pageChromeCss(1120) + t569ForecastCss() + t570IntakeCss() + t573CrossCss() + parts.join(''),
|
|
930
|
+
charts: false,
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
/* ── #383 · 摄入预测(营养目标达成预测)(均值/目标/缺口/是否在轨;只改预测段) ── */
|
|
934
|
+
export function buildCalorieGoalDoc(v) {
|
|
935
|
+
/* #570 R-26:`缺口`卡值是相对目标的差(avg−goal),页上别处未点名该口径。detail 补限定词
|
|
936
|
+
* `相对目标 N 卡`(与该卡数值一一对应;徽标`在轨/偏离`不进detail,W5-①仍绿)。 */
|
|
937
|
+
const gapBasis = (typeof v.goal === 'number' && Number.isFinite(v.goal))
|
|
938
|
+
? '相对目标 ' + fmtKcal(v.goal) + ' 卡' : '相对目标';
|
|
939
|
+
const parts = [
|
|
940
|
+
/* #625 A团:去第三枚胶囊(与眉标逐字重复);结论改综合不断复述数
|
|
941
|
+
* (均值/目标/缺口三数住卡,结论只留判定;`目标`/`在轨`两词保留,383 针住它们)。 */
|
|
942
|
+
predictChips('摄入预测', true),
|
|
943
|
+
renderConclusionBar(v.onTarget
|
|
944
|
+
? '这段的日均摄入守在营养目标 ±10% 以内,在轨。'
|
|
945
|
+
: '这段的日均摄入偏离营养目标较多,偏离。'),
|
|
946
|
+
predictNav(false),
|
|
947
|
+
pageSection('sec-params', renderParamForm({
|
|
948
|
+
fields: [
|
|
949
|
+
{ name: 'start', label: '开始', value: v.start ?? '' },
|
|
950
|
+
{ name: 'end', label: '结束', value: v.end ?? '' },
|
|
951
|
+
],
|
|
952
|
+
/* #570 R-27:原说明与口径行同义(10%两处、14天两处)。说明只讲做法与缺数分支,
|
|
953
|
+
* 阈值与判据归口径行(`达标线=…10%`),两处不再互为子串。 */
|
|
954
|
+
description: '看每天的摄入能不能守在营养目标上。摄入记录不到 14 天就只说数据不够,够 14 天才给判定。',
|
|
955
|
+
}), secTitle('sec-params')),
|
|
956
|
+
pageSection('sec-overview', withVerdictCard(renderKpiGrid([
|
|
957
|
+
{ label: '均值', value: String(v.avg), unit: '卡' },
|
|
958
|
+
{ label: '目标', value: String(v.goal), unit: '卡' },
|
|
959
|
+
{ label: '缺口', value: String(v.gap), unit: '卡', detail: gapBasis },
|
|
960
|
+
]), verdictCard('是否在轨', v.onTarget
|
|
961
|
+
? '日均与目标差得不远。'
|
|
962
|
+
: '日均摄入离目标偏开。', v.onTarget, '在轨', '偏离')), secTitle('sec-overview')),
|
|
963
|
+
];
|
|
964
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
965
|
+
envelope: {
|
|
966
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
967
|
+
data: {
|
|
968
|
+
metrics: metricsOf({
|
|
969
|
+
avg: v.avg, goal: v.goal, gap: v.gap, on_target: v.onTarget ? 1 : 0,
|
|
970
|
+
}),
|
|
971
|
+
},
|
|
972
|
+
},
|
|
973
|
+
}), secTitle('sec-data')));
|
|
974
|
+
parts.push(renderCaliberLine('目标=每天的热量目标|达标线=日均偏离不超过目标的 10%|摄入记录不到 14 天不出判定'));
|
|
975
|
+
parts.push(sourceFootnote('饮食记录', String(v.start ?? ''), String(v.end ?? '')));
|
|
976
|
+
return assembleDocPage({
|
|
977
|
+
docTitle: '卡路里 摄入预测',
|
|
978
|
+
title: '摄入预测(营养目标达成预测)',
|
|
979
|
+
eyebrow: '趋势分析',
|
|
980
|
+
subtitle: null,
|
|
981
|
+
/* #570 R-20/R-21:本族网格两列+判定徽章升格(`t570IntakeCss`;判定卡不增值位,W6-①仍绿)。 */
|
|
982
|
+
content: pageChromeCss(1120) + t570IntakeCss() + t573CrossCss() + parts.join(''),
|
|
983
|
+
charts: false,
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
/* ── #383 · 摄入预测(卡路里缺口预测)(平均缺口+每周掉重;只改预测段) ── */
|
|
987
|
+
export function buildCalorieDeficitDoc(v) {
|
|
988
|
+
/* #570 R-23:缺口取正向表述(结论句本就`+1196`,卡值跟上`+`前缀;量级与整数语义不动)。
|
|
989
|
+
* 体重侧不跟R-23期望的负号统一(`weeklyLoss`正表掉量是取数层语义,翻负会造出页内自相矛盾,
|
|
990
|
+
* 见§6),改由口径行写明两族符号语义(#625 A团起结论句不再印数,`+` 前缀只住卡值)。 */
|
|
991
|
+
const deficitSigned = (typeof v.avgDeficit === 'number' && Number.isFinite(v.avgDeficit))
|
|
992
|
+
? (v.avgDeficit >= 0 ? '+' : '') + String(v.avgDeficit) : String(v.avgDeficit);
|
|
993
|
+
const parts = [
|
|
994
|
+
/* #625 A团:去第三枚胶囊;结论改综合不断复述数(`缺口`/`每周`两词保留,383 针住它们)。 */
|
|
995
|
+
predictChips('摄入预测', true),
|
|
996
|
+
renderConclusionBar((Number(v.avgDeficit) >= 0 ? '这段时间平均每天都有缺口,折到每周掉重,处减重方向。' : '这段时间平均每天还没有缺口,每周掉重无从谈起。')),
|
|
997
|
+
predictNav(false),
|
|
998
|
+
pageSection('sec-params', renderParamForm({
|
|
999
|
+
fields: [
|
|
1000
|
+
{ name: 'start', label: '开始', value: v.start ?? '' },
|
|
1001
|
+
{ name: 'end', label: '结束', value: v.end ?? '' },
|
|
1002
|
+
],
|
|
1003
|
+
/* #570 R-27:原说明与口径行同义(缺口定义两处、7700两处)。说明只讲做法,
|
|
1004
|
+
* 定义与折算归口径行,两处不再互为子串。 */
|
|
1005
|
+
description: '按最近的饮食与运动趋势,推后面每天能留出多少缺口,折算一周能掉多少。',
|
|
1006
|
+
}), secTitle('sec-params')),
|
|
1007
|
+
pageSection('sec-overview', renderKpiGrid([
|
|
1008
|
+
/* #570 R-26:该卡是相对消耗的差(消耗−摄入),detail 补限定词与数值一一对应。 */
|
|
1009
|
+
{ label: '平均缺口', value: deficitSigned, unit: '卡/天', detail: '相对消耗,正数是缺口' },
|
|
1010
|
+
/* W5:卡内只留一条事实——`健康区间 0.3 到 1.2 kg/周` 已由同页口径行末段承担
|
|
1011
|
+
* (「健康区间=每周掉 0.3 到 1.2 kg」;W6 起同页单位统一成 `kg`,不再有「公斤」那一形态),
|
|
1012
|
+
* 卡里再印一遍就是「同一事实在卡内出现两次」,
|
|
1013
|
+
* 且它与主值 1.09 是同一量纲却不同有效位(视觉抽查 §2.3 缺陷 3 的原句)。 */
|
|
1014
|
+
{ label: '每周掉重', value: fmtRate(v.weeklyLoss), unit: 'kg/周' },
|
|
1015
|
+
]), secTitle('sec-overview')),
|
|
1016
|
+
];
|
|
1017
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
1018
|
+
envelope: {
|
|
1019
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
1020
|
+
data: {
|
|
1021
|
+
metrics: metricsOf({ avg_deficit: v.avgDeficit, weekly_loss: v.weeklyLoss }),
|
|
1022
|
+
},
|
|
1023
|
+
},
|
|
1024
|
+
}), secTitle('sec-data')));
|
|
1025
|
+
parts.push(renderCaliberLine('缺口=日常消耗加运动消耗减当天摄入|每 7700 卡大约折算 1 kg|健康区间=每周掉 0.3 到 1.2 kg|符号=缺口取正数表示缺口,每周掉重取掉量为正,体重速率页另取变化率为负表示下降'));
|
|
1026
|
+
parts.push(sourceFootnote('饮食记录与运动记录', String(v.start ?? ''), String(v.end ?? '')));
|
|
1027
|
+
return assembleDocPage({
|
|
1028
|
+
docTitle: '卡路里 摄入预测',
|
|
1029
|
+
title: '摄入预测(卡路里缺口预测)',
|
|
1030
|
+
eyebrow: '趋势分析',
|
|
1031
|
+
subtitle: null,
|
|
1032
|
+
/* #570 R-20:本族网格两列(`t570IntakeCss`)。 */
|
|
1033
|
+
content: pageChromeCss(1120) + t570IntakeCss() + t573CrossCss() + parts.join(''),
|
|
1034
|
+
charts: false,
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
/* ── #383 · 摄入预测(摄入稳定性预测)(均值/波动+是否稳定;只改预测段) ── */
|
|
1038
|
+
export function buildCalorieStabilityDoc(v) {
|
|
1039
|
+
/* #570 R-24:本页`均值`与缺口页`日均摄入`窗口不同(30天窗 vs 7天窗)而都不带窗口。
|
|
1040
|
+
* 缺口页只读(#571地盘),本页均值卡detail补窗口区间(可达文本含窗口;21侧待#571,见§6)。 */
|
|
1041
|
+
const avgWindow = '日均,窗口 ' + String(v.start ?? '') + ' 至 ' + String(v.end ?? '');
|
|
1042
|
+
const parts = [
|
|
1043
|
+
/* #625 A团:去第三枚胶囊;结论改综合不断复述数(`稳定`/`波动`两词保留,383 针住它们)。 */
|
|
1044
|
+
predictChips('摄入预测', true),
|
|
1045
|
+
renderConclusionBar(v.stable ? '每天的摄入比较匀,波动不大,整体稳定。' : '每天的摄入忽高忽低,波动偏大,不稳定。'),
|
|
1046
|
+
predictNav(false),
|
|
1047
|
+
pageSection('sec-params', renderParamForm({
|
|
1048
|
+
fields: [
|
|
1049
|
+
{ name: 'start', label: '开始', value: v.start ?? '' },
|
|
1050
|
+
{ name: 'end', label: '结束', value: v.end ?? '' },
|
|
1051
|
+
],
|
|
1052
|
+
/* #570 R-27:原说明与口径行同义(300卡判据两处)。说明只讲做法与缺数分支,
|
|
1053
|
+
* 阈值归口径行(`判据=…300 卡算稳`),两处不再互为子串。 */
|
|
1054
|
+
description: '看每天的摄入稳不稳定。摄入记录不到 14 天就只说数据不够,够 14 天才给判定。',
|
|
1055
|
+
}), secTitle('sec-params')),
|
|
1056
|
+
pageSection('sec-overview', withVerdictCard(renderKpiGrid([
|
|
1057
|
+
{ label: '均值', value: String(v.avg), unit: '卡', detail: avgWindow },
|
|
1058
|
+
/* σ 是统计符号,读者认不得:这一格就说「上下波动的幅度」(口径在同页的口径行里)。 */
|
|
1059
|
+
{ label: '波动', value: String(v.sigma), unit: '卡', detail: '上下波动的幅度' },
|
|
1060
|
+
]), verdictCard('是否稳定', v.stable
|
|
1061
|
+
? '每天的摄入比较匀。'
|
|
1062
|
+
: '每天的摄入忽高忽低。', v.stable, '稳定', '波动大')), secTitle('sec-overview')),
|
|
1063
|
+
];
|
|
1064
|
+
parts.push(pageSection('sec-data', dataCopyArea('复制数据', {
|
|
1065
|
+
envelope: {
|
|
1066
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.predict',
|
|
1067
|
+
data: {
|
|
1068
|
+
metrics: metricsOf({ avg: v.avg, sigma: v.sigma, stable: v.stable ? 1 : 0 }),
|
|
1069
|
+
},
|
|
1070
|
+
},
|
|
1071
|
+
}), secTitle('sec-data')));
|
|
1072
|
+
parts.push(renderCaliberLine('波动=每天摄入偏离日均的幅度(标准差)|判据=上下波动不超过 300 卡算稳|摄入记录不到 14 天不出判定'));
|
|
1073
|
+
parts.push(sourceFootnote('饮食记录', String(v.start ?? ''), String(v.end ?? '')));
|
|
1074
|
+
return assembleDocPage({
|
|
1075
|
+
docTitle: '卡路里 摄入预测',
|
|
1076
|
+
title: '摄入预测(摄入稳定性预测)',
|
|
1077
|
+
eyebrow: '趋势分析',
|
|
1078
|
+
subtitle: null,
|
|
1079
|
+
/* #570 R-20/R-21:本族网格两列+判定徽章升格(`t570IntakeCss`;判定卡不增值位,W6-①仍绿)。
|
|
1080
|
+
* #625 A团再加本页末格补齐(`t625StabilityCss`,只本页)。 */
|
|
1081
|
+
content: pageChromeCss(1120) + t570IntakeCss() + t625StabilityCss() + t573CrossCss() + parts.join(''),
|
|
1082
|
+
charts: false,
|
|
1083
|
+
});
|
|
1084
|
+
}
|
|
1085
|
+
/* ── 目标预测达成(目标达成 ETA:KPI+可行性;曲线归组合分析,见 §3 R4) ── */
|
|
1086
|
+
export function buildGoalPredictDoc(v) {
|
|
1087
|
+
/* 被删的技术口径改住 HTML 注释(#160 回炉):缺失拒绝码与内部票号(`#103 G2`)原在参数卡说明里。 */
|
|
1088
|
+
const noteBits = techNoteHtml([
|
|
1089
|
+
'无体重目标即 missing-data;默认 14 天窗(7 天窗结构性不可达,#103 G2)',
|
|
1090
|
+
]);
|
|
1091
|
+
const parts = [
|
|
1092
|
+
noteBits,
|
|
1093
|
+
renderParamForm({
|
|
1094
|
+
fields: [
|
|
1095
|
+
{ name: 'start', label: '开始', value: v.start },
|
|
1096
|
+
{ name: 'end', label: '结束', value: v.end },
|
|
1097
|
+
],
|
|
1098
|
+
description: '要先定过体重目标,才能算出哪天能达到;没定目标就只说缺目标,不编一个日期出来。默认看最近 14 天。',
|
|
1099
|
+
}),
|
|
1100
|
+
renderKpiGrid([
|
|
1101
|
+
/* 区间写「至」(#516 判据 R6:值位不许拿 `~` 顶替「至」);W5 顺手统一这一处。 */
|
|
1102
|
+
{ label: '目标', value: String(v.targetKg), unit: 'kg', detail: v.start + ' 至 ' + v.end },
|
|
1103
|
+
{ label: '当前', value: String(v.current), unit: 'kg' },
|
|
1104
|
+
{ label: '预计达成', value: v.eta, detail: '剩余 ' + v.daysLeft + ' 天' },
|
|
1105
|
+
/* W5(同族 06/07/10 的同一处):判定词上屏一次。速率值走 `fmtRate`(2 位);
|
|
1106
|
+
* 原来挂在 `detail` 的「健康/超范围」改由徽标承担(闭集档带语义色)。 */
|
|
1107
|
+
{ label: '速率', value: fmtRate(v.ratePerWeek), unit: 'kg/周', status: v.feasible ? 'ok' : 'warn',
|
|
1108
|
+
statusText: v.feasible ? '健康' : '超范围' },
|
|
1109
|
+
]),
|
|
1110
|
+
];
|
|
1111
|
+
parts.push(dataCopyArea('复制数据', {
|
|
1112
|
+
envelope: {
|
|
1113
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'stat', key: 'calorie.view.goal-predict',
|
|
1114
|
+
data: {
|
|
1115
|
+
metrics: metricsOf({
|
|
1116
|
+
targetKg: v.targetKg, current: v.current, daysLeft: v.daysLeft,
|
|
1117
|
+
ratePerWeek: v.ratePerWeek, feasible: v.feasible ? 1 : 0,
|
|
1118
|
+
}),
|
|
1119
|
+
},
|
|
1120
|
+
},
|
|
1121
|
+
}));
|
|
1122
|
+
return assembleDocPage({
|
|
1123
|
+
docTitle: DOC_TITLE,
|
|
1124
|
+
title: '目标预测达成',
|
|
1125
|
+
eyebrow: '目标预测达成 · 趋势分析域',
|
|
1126
|
+
subtitle: null,
|
|
1127
|
+
content: parts.join(''),
|
|
1128
|
+
charts: false,
|
|
1129
|
+
});
|
|
1130
|
+
}
|
|
1131
|
+
//# sourceMappingURL=trendPredictDocs.js.map
|