@siegesailor/terminal-sigma 1.1.0 → 1.3.0

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/build/content.js CHANGED
@@ -1,20 +1,26 @@
1
- import { formatNumber, intensities, workoutActivities, } from "./i18n.js";
1
+ import { adviceOf, targetsOf } from "./health.js";
2
+ import { formatNumber, genders, healthGoals, intensities, messagesOf, workoutActivities, workStyles, } from "./i18n.js";
2
3
  import { dailyGoals, experienceOf, experiencePerLevel, todayOf, } from "./progress.js";
3
4
  import { quoteRefreshMinutes } from "./quotes.js";
4
- import { colors } from "./theme.js";
5
- export const characterWidth = 30;
6
- // Header and footer take 5 rows; the character and Today panels 15 each.
5
+ export const characterWidth = 28;
6
+ // Header and footer take 5 rows. The character panel is 19 rows tall, Today
7
+ // 25 with its spacing or 16 compact, the menu about 11, and Recent 7.
7
8
  const chromeRows = 5;
8
- const panelRows = 15;
9
+ const characterRows = 19;
10
+ const todayRows = 25;
11
+ const compactTodayRows = 16;
12
+ const menuRows = 11;
13
+ const recentRows = 7;
9
14
  // The panel that takes input always shows; the rest appears as space allows.
10
15
  export function layoutOf(columns, rows) {
11
16
  const menuColumnsOf = (panelWidth) => {
12
17
  const inner = panelWidth - 4;
13
- if (inner >= 90) {
18
+ if (inner >= 96) {
14
19
  return 3;
15
20
  }
16
- return inner >= 52 ? 2 : 1;
21
+ return inner >= 60 ? 2 : 1;
17
22
  };
23
+ const showRecent = rows >= chromeRows + menuRows + recentRows;
18
24
  if (columns >= 120) {
19
25
  const panelWidth = Math.floor((columns - characterWidth) / 2);
20
26
  return {
@@ -22,7 +28,9 @@ export function layoutOf(columns, rows) {
22
28
  todayWidth: columns - characterWidth - panelWidth,
23
29
  menuColumns: menuColumnsOf(panelWidth),
24
30
  showCharacter: true,
31
+ showRecent,
25
32
  showToday: true,
33
+ isTodayCompact: rows < chromeRows + todayRows,
26
34
  todayBeside: true,
27
35
  stacked: false,
28
36
  };
@@ -34,63 +42,107 @@ export function layoutOf(columns, rows) {
34
42
  todayWidth: columns,
35
43
  menuColumns: menuColumnsOf(panelWidth),
36
44
  showCharacter: true,
37
- showToday: rows >= chromeRows + panelRows * 2,
45
+ showRecent,
46
+ showToday: rows >= chromeRows + characterRows + compactTodayRows,
47
+ isTodayCompact: rows < chromeRows + characterRows + todayRows,
38
48
  todayBeside: false,
39
49
  stacked: false,
40
50
  };
41
51
  }
52
+ const aboveToday = chromeRows + menuRows + recentRows + characterRows;
42
53
  return {
43
54
  panelWidth: columns,
44
55
  todayWidth: columns,
45
56
  menuColumns: menuColumnsOf(columns),
46
- showCharacter: rows >= chromeRows + panelRows * 2,
47
- showToday: rows >= chromeRows + panelRows * 3,
57
+ showCharacter: rows >= aboveToday,
58
+ showRecent,
59
+ showToday: rows >= aboveToday + compactTodayRows,
60
+ isTodayCompact: rows < aboveToday + todayRows,
48
61
  todayBeside: false,
49
62
  stacked: true,
50
63
  };
51
64
  }
52
65
  const percentOf = (value, goal) => (value / goal) * 100;
53
- export function metricsOf(messages, language, progress, now) {
66
+ export function sectionsOf(language, palette, progress, now) {
67
+ const messages = messagesOf(language);
54
68
  const today = todayOf(progress, now);
69
+ const targets = targetsOf(progress.profile);
55
70
  const experience = experienceOf(progress);
56
71
  const level = Math.floor(experience / experiencePerLevel) + 1;
57
72
  const levelExperience = experience % experiencePerLevel;
73
+ const advice = adviceOf(progress.profile, today, language, messages);
74
+ const format = (value) => formatNumber(language, value);
58
75
  return [
59
76
  {
60
- label: messages.today.character,
61
- detail: messages.today.characterDetail(level + 1, experiencePerLevel - levelExperience),
62
- value: percentOf(levelExperience, experiencePerLevel),
63
- color: colors.accent,
77
+ metrics: [
78
+ {
79
+ label: messages.today.character,
80
+ detail: messages.today.characterDetail(level + 1, experiencePerLevel - levelExperience),
81
+ value: percentOf(levelExperience, experiencePerLevel),
82
+ color: palette.metrics.character,
83
+ },
84
+ {
85
+ label: messages.today.focus,
86
+ detail: messages.today.focusDetail(today.focusSessions, dailyGoals.focusSessions),
87
+ value: percentOf(today.focusSessions, dailyGoals.focusSessions),
88
+ color: palette.metrics.focus,
89
+ },
90
+ ],
64
91
  },
65
92
  {
66
- label: messages.today.focus,
67
- detail: messages.today.focusDetail(today.focusSessions, dailyGoals.focusSessions),
68
- value: percentOf(today.focusSessions, dailyGoals.focusSessions),
69
- color: colors.focus,
70
- },
71
- {
72
- label: messages.today.diet,
73
- detail: messages.today.dietDetail(today.meals, dailyGoals.meals, formatNumber(language, today.calories), formatNumber(language, today.protein)),
74
- value: percentOf(today.meals, dailyGoals.meals),
75
- color: colors.diet,
76
- },
77
- {
78
- label: messages.today.workout,
79
- detail: messages.today.workoutDetail(today.workoutMinutes, dailyGoals.workoutMinutes),
80
- value: percentOf(today.workoutMinutes, dailyGoals.workoutMinutes),
81
- color: colors.workout,
93
+ title: progress.profile
94
+ ? messages.health.title(messages.goal[progress.profile.goal])
95
+ : messages.today.health,
96
+ metrics: [
97
+ {
98
+ label: messages.today.protein,
99
+ detail: messages.today.proteinDetail(format(today.protein), format(targets.protein)),
100
+ value: percentOf(today.protein, targets.protein),
101
+ color: palette.metrics.protein,
102
+ },
103
+ {
104
+ label: messages.today.calories,
105
+ detail: messages.today.caloriesDetail(format(today.calories), format(targets.calories), today.meals),
106
+ value: percentOf(today.calories, targets.calories),
107
+ color: palette.metrics.calories,
108
+ },
109
+ {
110
+ label: messages.today.workout,
111
+ detail: messages.today.workoutDetail(today.workoutMinutes, targets.workoutMinutes),
112
+ value: percentOf(today.workoutMinutes, targets.workoutMinutes),
113
+ color: palette.metrics.workout,
114
+ },
115
+ ],
116
+ advice: progress.profile
117
+ ? (advice.find((item) => !item.isDone) ?? advice[0])
118
+ : { text: messages.health.noProfile, isDone: false },
82
119
  },
83
120
  ];
84
121
  }
85
122
  export const menuOrder = [
86
123
  "timer",
87
- "diet",
88
- "workout",
124
+ "health",
89
125
  "logs",
90
126
  "quotes",
127
+ "profile",
128
+ "theme",
91
129
  "language",
92
130
  ];
131
+ const languageSignal = {
132
+ en: "EN",
133
+ "zh-TW": "繁中",
134
+ ko: "한국어",
135
+ };
93
136
  export function menuItemsOf(messages, language, state) {
137
+ const { profile } = state.progress;
138
+ const proteinLeft = targetsOf(profile).protein - todayOf(state.progress, state.now).protein;
139
+ let healthSignal = messages.signal.setUp;
140
+ if (profile) {
141
+ healthSignal =
142
+ proteinLeft > 0
143
+ ? messages.signal.proteinLeft(proteinLeft)
144
+ : messages.signal.onTrack;
145
+ }
94
146
  return [
95
147
  {
96
148
  label: messages.menu.timer,
@@ -98,14 +150,9 @@ export function menuItemsOf(messages, language, state) {
98
150
  description: messages.describe.timer(state.focus, state.rest),
99
151
  },
100
152
  {
101
- label: messages.menu.diet,
102
- signal: messages.signal.meals(state.meals),
103
- description: messages.describe.diet,
104
- },
105
- {
106
- label: messages.menu.workout,
107
- signal: messages.signal.minutes(state.workoutMinutes),
108
- description: messages.describe.workout,
153
+ label: messages.menu.health,
154
+ signal: healthSignal,
155
+ description: messages.describe.health,
109
156
  },
110
157
  {
111
158
  label: messages.menu.logs,
@@ -117,9 +164,19 @@ export function menuItemsOf(messages, language, state) {
117
164
  signal: messages.signal.newQuote,
118
165
  description: messages.describe.quotes(quoteRefreshMinutes),
119
166
  },
167
+ {
168
+ label: messages.menu.profile,
169
+ signal: profile?.name ?? messages.signal.setUp,
170
+ description: messages.describe.profile,
171
+ },
172
+ {
173
+ label: messages.menu.theme,
174
+ signal: messages.themes.names[state.theme],
175
+ description: messages.describe.theme,
176
+ },
120
177
  {
121
178
  label: messages.menu.language,
122
- signal: language === "zh-TW" ? "繁中" : "EN",
179
+ signal: languageSignal[language],
123
180
  description: messages.describe.language,
124
181
  },
125
182
  ];
@@ -173,4 +230,67 @@ export const workoutFieldsOf = (messages) => [
173
230
  })),
174
231
  },
175
232
  ];
233
+ // Saved values come back as defaults, so editing the profile is a run of Enter.
234
+ export const profileFieldsOf = (messages, profile, name) => [
235
+ {
236
+ key: "name",
237
+ label: messages.form.name,
238
+ kind: "text",
239
+ defaultValue: profile?.name ?? name,
240
+ },
241
+ {
242
+ key: "age",
243
+ label: messages.form.age,
244
+ kind: "number",
245
+ minimum: 10,
246
+ maximum: 100,
247
+ defaultValue: profile ? String(profile.age) : undefined,
248
+ },
249
+ {
250
+ key: "height",
251
+ label: messages.form.height,
252
+ kind: "number",
253
+ minimum: 100,
254
+ maximum: 250,
255
+ defaultValue: profile ? String(profile.height) : undefined,
256
+ },
257
+ {
258
+ key: "weight",
259
+ label: messages.form.weight,
260
+ kind: "number",
261
+ minimum: 30,
262
+ maximum: 300,
263
+ defaultValue: profile ? String(profile.weight) : undefined,
264
+ },
265
+ {
266
+ key: "gender",
267
+ label: messages.form.gender,
268
+ kind: "select",
269
+ options: genders.map((option) => ({
270
+ label: messages.gender[option],
271
+ value: option,
272
+ })),
273
+ defaultValue: profile?.gender,
274
+ },
275
+ {
276
+ key: "workStyle",
277
+ label: messages.form.workStyle,
278
+ kind: "select",
279
+ options: workStyles.map((option) => ({
280
+ label: messages.workStyle[option],
281
+ value: option,
282
+ })),
283
+ defaultValue: profile?.workStyle,
284
+ },
285
+ {
286
+ key: "goal",
287
+ label: messages.form.goal,
288
+ kind: "select",
289
+ options: healthGoals.map((option) => ({
290
+ label: messages.goal[option],
291
+ value: option,
292
+ })),
293
+ defaultValue: profile?.goal,
294
+ },
295
+ ];
176
296
  //# sourceMappingURL=content.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../source/content.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,YAAY,EACZ,WAAW,EAGX,iBAAiB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,UAAU,EACV,YAAY,EACZ,kBAAkB,EAElB,OAAO,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,yEAAyE;AACzE,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,SAAS,GAAG,EAAE,CAAC;AAYrB,6EAA6E;AAC7E,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,IAAY;IACrD,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;QAE7B,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC;QACV,CAAC;QAED,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,OAAO;YACN,UAAU;YACV,UAAU,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU;YACjD,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC;YACtC,aAAa,EAAE,IAAI;YACnB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,KAAK;SACd,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC;QAC5C,OAAO;YACN,UAAU;YACV,UAAU,EAAE,OAAO;YACnB,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC;YACtC,aAAa,EAAE,IAAI;YACnB,SAAS,EAAE,IAAI,IAAI,UAAU,GAAG,SAAS,GAAG,CAAC;YAC7C,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,KAAK;SACd,CAAC;IACH,CAAC;IAED,OAAO;QACN,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC;QACnC,aAAa,EAAE,IAAI,IAAI,UAAU,GAAG,SAAS,GAAG,CAAC;QACjD,SAAS,EAAE,IAAI,IAAI,UAAU,GAAG,SAAS,GAAG,CAAC;QAC7C,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,IAAI;KACb,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AAExE,MAAM,UAAU,SAAS,CACxB,QAAkB,EAClB,QAAkB,EAClB,QAAkB,EAClB,GAAW;IAEX,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,UAAU,GAAG,kBAAkB,CAAC;IAExD,OAAO;QACN;YACC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS;YAC/B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,eAAe,CACrC,KAAK,GAAG,CAAC,EACT,kBAAkB,GAAG,eAAe,CACpC;YACD,KAAK,EAAE,SAAS,CAAC,eAAe,EAAE,kBAAkB,CAAC;YACrD,KAAK,EAAE,MAAM,CAAC,MAAM;SACpB;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK;YAC3B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CACjC,KAAK,CAAC,aAAa,EACnB,UAAU,CAAC,aAAa,CACxB;YACD,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC;YAC/D,KAAK,EAAE,MAAM,CAAC,KAAK;SACnB;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;YAC1B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAChC,KAAK,CAAC,KAAK,EACX,UAAU,CAAC,KAAK,EAChB,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EACtC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CACrC;YACD,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;YAC/C,KAAK,EAAE,MAAM,CAAC,IAAI;SAClB;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO;YAC7B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CACnC,KAAK,CAAC,cAAc,EACpB,UAAU,CAAC,cAAc,CACzB;YACD,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC,cAAc,CAAC;YACjE,KAAK,EAAE,MAAM,CAAC,OAAO;SACrB;KACD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,OAAO;IACP,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,UAAU;CACD,CAAC;AAEX,MAAM,UAAU,WAAW,CAC1B,QAAkB,EAClB,QAAkB,EAClB,KAOE;IAEF,OAAO;QACN;YACC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;YAC1B,MAAM,EAAE,KAAK,CAAC,WAAW;YACzB,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;SAC7D;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1C,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;SACnC;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;YAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;YACrD,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO;SACtC;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3C,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;SACnC;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;YAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;YAChC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC;SAC1D;QACD;YACC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ;YAC7B,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAC1C,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ;SACvC;KACD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAkB,EAAW,EAAE,CAAC;IAC5D;QACC,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;QACzB,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW;KACtC;IACD;QACC,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ;QAC7B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,IAAI;KACb;IACD;QACC,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;QAC5B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,GAAG;KACZ;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAkB,EAAW,EAAE,CAAC;IAC/D;QACC,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ;QAC7B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3C,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;YACvC,KAAK,EAAE,MAAM;SACb,CAAC,CAAC;KACH;IACD;QACC,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;QAC5B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,GAAG;KACZ;IACD;QACC,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS;QAC9B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;YACjC,KAAK,EAAE,MAAM;SACb,CAAC,CAAC;KACH;CACD,CAAC"}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../source/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { formatNumber, } from "./i18n.js";
2
+ // Without a profile: the common 2,000 kcal reference, 50 g protein, and 30 active minutes.
3
+ const defaultTargets = {
4
+ calories: 2000,
5
+ protein: 50,
6
+ workoutMinutes: 30,
7
+ };
8
+ // Physical activity levels, from sedentary to very active.
9
+ const activityFactor = {
10
+ desk: 1.2,
11
+ standing: 1.375,
12
+ active: 1.55,
13
+ athlete: 1.725,
14
+ };
15
+ // Mifflin-St Jeor's constant, averaged when gender is not given.
16
+ const genderConstant = {
17
+ male: 5,
18
+ female: -161,
19
+ other: -78,
20
+ };
21
+ const calorieShift = {
22
+ loseFat: -500,
23
+ maintain: 0,
24
+ buildMuscle: 300,
25
+ endurance: 200,
26
+ };
27
+ // Grams of protein per kilogram of body weight, within the 0.8 to 2.2 g that
28
+ // sports nutrition guidance covers.
29
+ const proteinPerKilogram = {
30
+ loseFat: 1.8,
31
+ maintain: 1,
32
+ buildMuscle: 2,
33
+ endurance: 1.4,
34
+ };
35
+ const proteinForWork = {
36
+ desk: 0,
37
+ standing: 0.1,
38
+ active: 0.2,
39
+ athlete: 0.3,
40
+ };
41
+ const workoutMinutes = {
42
+ loseFat: 45,
43
+ maintain: 30,
44
+ buildMuscle: 45,
45
+ endurance: 60,
46
+ };
47
+ export function targetsOf(profile) {
48
+ if (!profile) {
49
+ return defaultTargets;
50
+ }
51
+ const { weight, height, age, gender, workStyle, goal } = profile;
52
+ const restingCalories = 10 * weight + 6.25 * height - 5 * age + genderConstant[gender];
53
+ const calories = restingCalories * activityFactor[workStyle] + calorieShift[goal];
54
+ const proteinRate = Math.min(proteinPerKilogram[goal] + proteinForWork[workStyle], 2.2);
55
+ return {
56
+ calories: Math.round(Math.max(calories, 1200) / 10) * 10,
57
+ protein: Math.round(weight * proteinRate),
58
+ workoutMinutes: workoutMinutes[goal],
59
+ };
60
+ }
61
+ // What is left of today, most pressing first.
62
+ export function adviceOf(profile, today, language, messages) {
63
+ const targets = targetsOf(profile);
64
+ const goal = profile?.goal ?? "maintain";
65
+ const protein = targets.protein - today.protein;
66
+ const minutes = targets.workoutMinutes - today.workoutMinutes;
67
+ const calories = targets.calories - today.calories;
68
+ const { health } = messages;
69
+ return [
70
+ minutes > 0
71
+ ? {
72
+ text: health.workoutLeft(minutes, health.suggestion[goal]),
73
+ isDone: false,
74
+ }
75
+ : { text: health.workoutDone, isDone: true },
76
+ protein > 0
77
+ ? { text: health.proteinLeft(protein), isDone: false }
78
+ : { text: health.proteinDone, isDone: true },
79
+ calories >= 0
80
+ ? {
81
+ text: health.caloriesLeft(formatNumber(language, calories)),
82
+ isDone: false,
83
+ }
84
+ : {
85
+ text: health.caloriesOver(formatNumber(language, -calories)),
86
+ isDone: false,
87
+ },
88
+ ];
89
+ }
90
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../source/health.ts"],"names":[],"mappings":"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"}