@siegesailor/terminal-sigma 1.1.0 → 1.2.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.
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { usePalette } from "../theme.js";
4
+ // A vertical list in Claude Code's style. Unlike @inkjs/ui's Select, Enter on
5
+ // the preselected option still counts, which editing a saved value needs.
6
+ export default function Choice({ options, onSelect, initialValue, isActive = true, }) {
7
+ const palette = usePalette();
8
+ const [index, setIndex] = React.useState(() => Math.max(options.findIndex((option) => option.value === initialValue), 0));
9
+ useInput((input, key) => {
10
+ const count = options.length;
11
+ if (key.upArrow || input === "k") {
12
+ setIndex((current) => (current - 1 + count) % count);
13
+ }
14
+ else if (key.downArrow || input === "j") {
15
+ setIndex((current) => (current + 1) % count);
16
+ }
17
+ else if (key.return) {
18
+ const option = options[index];
19
+ if (option) {
20
+ onSelect(option.value);
21
+ }
22
+ }
23
+ }, { isActive });
24
+ return (React.createElement(Box, { flexDirection: "column" }, options.map((option, optionIndex) => {
25
+ const isFocused = optionIndex === index;
26
+ return (React.createElement(Box, { key: option.value, gap: 1 },
27
+ React.createElement(Text, { color: palette.accent }, isFocused ? "❯" : " "),
28
+ React.createElement(Text, { bold: isFocused, color: isFocused ? palette.accent : undefined }, option.label),
29
+ option.hint));
30
+ })));
31
+ }
32
+ //# sourceMappingURL=choice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choice.js","sourceRoot":"","sources":["../../source/components/choice.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAezC,8EAA8E;AAC9E,0EAA0E;AAC1E,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,QAAQ,GAAG,IAAI,GACF;IACb,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAC7C,IAAI,CAAC,GAAG,CACP,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,YAAY,CAAC,EAC5D,CAAC,CACD,CACD,CAAC;IAEF,QAAQ,CACP,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACd,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;QAE7B,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC3C,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAE9B,IAAI,MAAM,EAAE,CAAC;gBACZ,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;IACF,CAAC,EACD,EAAE,QAAQ,EAAE,CACZ,CAAC;IAEF,OAAO,CACN,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,IACzB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,WAAW,KAAK,KAAK,CAAC;QAExC,OAAO,CACN,oBAAC,GAAG,IAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YAC7B,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,MAAM,IAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAQ;YAC3D,oBAAC,IAAI,IACJ,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAE5C,MAAM,CAAC,KAAK,CACP;YACN,MAAM,CAAC,IAAI,CACP,CACN,CAAC;IACH,CAAC,CAAC,CACG,CACN,CAAC;AACH,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import React from "react";
2
- import { Select, TextInput } from "@inkjs/ui";
2
+ import { TextInput } from "@inkjs/ui";
3
3
  import { Box, Text } from "ink";
4
4
  import { parseWholeNumber } from "../progress.js";
5
- import { colors } from "../theme.js";
5
+ import { usePalette } from "../theme.js";
6
+ import Choice from "./choice.js";
6
7
  export default function EntryForm({ title, fields, messages, onSubmit, onValues, }) {
8
+ const palette = usePalette();
7
9
  const [values, setValues] = React.useState({});
8
10
  const [error, setError] = React.useState();
9
11
  const field = fields[Object.keys(values).length];
@@ -35,18 +37,18 @@ export default function EntryForm({ title, fields, messages, onSubmit, onValues,
35
37
  : value;
36
38
  };
37
39
  return (React.createElement(Box, { flexDirection: "column" },
38
- React.createElement(Text, { bold: true, color: colors.accent }, title),
40
+ React.createElement(Text, { bold: true, color: palette.accent }, title),
39
41
  fields
40
42
  .filter((done) => done.key in values)
41
- .map((done) => (React.createElement(Text, { key: done.key },
42
- React.createElement(Text, { color: colors.focus }, "\u2713 "),
43
+ .map((done) => (React.createElement(Text, { key: done.key, wrap: "truncate-end" },
44
+ React.createElement(Text, { color: palette.success }, "\u2713 "),
43
45
  React.createElement(Text, { dimColor: true }, `${done.label}: `),
44
46
  React.createElement(Text, null, shown(done))))),
45
47
  field ? (React.createElement(Box, { flexDirection: "column" },
46
48
  React.createElement(Text, { bold: true }, `❯ ${field.label}`),
47
- React.createElement(Box, { paddingLeft: 2 }, field.kind === "select" ? (React.createElement(Select, { key: field.key, options: field.options, visibleOptionCount: field.options.length, onChange: accept })) : (React.createElement(TextInput, { key: field.key, placeholder: field.kind === "text"
49
+ React.createElement(Box, { paddingLeft: 2 }, field.kind === "select" ? (React.createElement(Choice, { key: field.key, initialValue: field.defaultValue, options: field.options, onSelect: accept })) : (React.createElement(TextInput, { key: field.key, defaultValue: field.defaultValue, placeholder: field.kind === "text"
48
50
  ? field.placeholder
49
51
  : `${field.minimum} - ${field.maximum}`, onSubmit: accept }))))) : null,
50
- error ? React.createElement(Text, { color: colors.error }, error) : null));
52
+ error ? React.createElement(Text, { color: palette.error }, error) : null));
51
53
  }
52
54
  //# sourceMappingURL=entry-form.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-form.js","sourceRoot":"","sources":["../../source/components/entry-form.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry-form.js","sourceRoot":"","sources":["../../source/components/entry-form.tsx"],"names":[],"mappings":"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"}
@@ -1,21 +1,23 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useAnimation } from "ink";
3
- import { colors, spinnerFrames } from "../theme.js";
3
+ import { spinnerFrames, usePalette } from "../theme.js";
4
4
  function Spinner() {
5
+ const palette = usePalette();
5
6
  const { frame } = useAnimation({ interval: 120 });
6
- return (React.createElement(Text, { color: colors.accent }, spinnerFrames[frame % spinnerFrames.length]));
7
+ return (React.createElement(Text, { color: palette.accent }, spinnerFrames[frame % spinnerFrames.length]));
7
8
  }
8
- const toneColor = {
9
- info: undefined,
10
- success: colors.focus,
11
- error: colors.error,
12
- };
13
9
  // Like Claude Code's status line: a spinner while something runs, a bullet otherwise.
14
10
  export default function Footer({ status, message, tone, hint }) {
11
+ const palette = usePalette();
12
+ const toneColor = {
13
+ info: undefined,
14
+ success: palette.success,
15
+ error: palette.error,
16
+ };
15
17
  return (React.createElement(Box, { flexShrink: 0, gap: 2, justifyContent: "space-between", paddingX: 1 },
16
18
  React.createElement(Text, { wrap: "truncate-end" }, status ? (React.createElement(React.Fragment, null,
17
19
  React.createElement(Spinner, null),
18
- React.createElement(Text, { color: colors.accent }, ` ${status}`),
20
+ React.createElement(Text, { color: palette.accent }, ` ${status}`),
19
21
  React.createElement(Text, { dimColor: true }, ` ${message}`))) : (React.createElement(React.Fragment, null,
20
22
  React.createElement(Text, { color: toneColor[tone], dimColor: tone === "info" }, "\u23FA"),
21
23
  React.createElement(Text, null, ` ${message}`)))),
@@ -1 +1 @@
1
- {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../source/components/footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAWpD,SAAS,OAAO;IACf,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,OAAO,CACN,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,IACxB,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CACtC,CACP,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAqC;IACnD,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,MAAM,CAAC,KAAK;IACrB,KAAK,EAAE,MAAM,CAAC,KAAK;CACnB,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAe;IAC1E,OAAO,CACN,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,EAAC,QAAQ,EAAE,CAAC;QACrE,oBAAC,IAAI,IAAC,IAAI,EAAC,cAAc,IACvB,MAAM,CAAC,CAAC,CAAC,CACT;YACC,oBAAC,OAAO,OAAG;YACX,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,IAAG,IAAI,MAAM,EAAE,CAAQ;YACjD,oBAAC,IAAI,IAAC,QAAQ,UAAE,KAAK,OAAO,EAAE,CAAQ,CACpC,CACH,CAAC,CAAC,CAAC,CACH;YACC,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,KAAK,MAAM,aAEhD;YACP,oBAAC,IAAI,QAAE,IAAI,OAAO,EAAE,CAAQ,CAC1B,CACH,CACK;QACP,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;YACjB,oBAAC,IAAI,IAAC,QAAQ,UAAE,IAAI,CAAQ,CACvB,CACD,CACN,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../source/components/footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWxD,SAAS,OAAO;IACf,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,OAAO,CACN,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,MAAM,IACzB,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CACtC,CACP,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAe;IAC1E,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAqC;QACnD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;KACpB,CAAC;IAEF,OAAO,CACN,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,EAAC,QAAQ,EAAE,CAAC;QACrE,oBAAC,IAAI,IAAC,IAAI,EAAC,cAAc,IACvB,MAAM,CAAC,CAAC,CAAC,CACT;YACC,oBAAC,OAAO,OAAG;YACX,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,MAAM,IAAG,IAAI,MAAM,EAAE,CAAQ;YAClD,oBAAC,IAAI,IAAC,QAAQ,UAAE,KAAK,OAAO,EAAE,CAAQ,CACpC,CACH,CAAC,CAAC,CAAC,CACH;YACC,oBAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,KAAK,MAAM,aAEhD;YACP,oBAAC,IAAI,QAAE,IAAI,OAAO,EAAE,CAAQ,CAC1B,CACH,CACK;QACP,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;YACjB,oBAAC,IAAI,IAAC,QAAQ,UAAE,IAAI,CAAQ,CACvB,CACD,CACN,CAAC;AACH,CAAC"}
@@ -1,13 +1,8 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import { formatNumber, workoutActivities, } from "../i18n.js";
4
- import { colors } from "../theme.js";
4
+ import { usePalette } from "../theme.js";
5
5
  const filters = ["all", "focus", "meal", "workout"];
6
- const kindColor = {
7
- focus: colors.focus,
8
- meal: colors.diet,
9
- workout: colors.workout,
10
- };
11
6
  const isWorkoutActivity = (activity) => workoutActivities.includes(activity);
12
7
  export function describeLog(log, language, messages) {
13
8
  const amount = (value) => value === undefined ? "-" : formatNumber(language, value);
@@ -26,18 +21,18 @@ export function describeLog(log, language, messages) {
26
21
  }
27
22
  }
28
23
  }
29
- export default function LogsView({ logs, language, messages, height, }) {
30
- const [filter, setFilter] = React.useState("all");
31
- const [offset, setOffset] = React.useState(0);
32
- const shown = logs.filter((log) => filter === "all" || log.kind === filter);
33
- // Title, tabs, summary, and their spacing take 4 rows.
34
- const pageSize = Math.max(height - 4, 3);
35
- const maximumOffset = Math.max(shown.length - pageSize, 0);
36
- const labels = {
37
- all: messages.logs.all,
38
- focus: messages.logs.focus,
39
- meal: messages.logs.diet,
40
- workout: messages.logs.workout,
24
+ const kindLabels = (messages) => ({
25
+ all: messages.logs.all,
26
+ focus: messages.logs.focus,
27
+ meal: messages.logs.diet,
28
+ workout: messages.logs.workout,
29
+ });
30
+ export function LogRow({ log, language, messages }) {
31
+ const palette = usePalette();
32
+ const kindColor = {
33
+ focus: palette.metrics.focus,
34
+ meal: palette.metrics.protein,
35
+ workout: palette.metrics.workout,
41
36
  };
42
37
  const formatDate = new Intl.DateTimeFormat(language, {
43
38
  month: "2-digit",
@@ -46,6 +41,25 @@ export default function LogsView({ logs, language, messages, height, }) {
46
41
  minute: "2-digit",
47
42
  hour12: false,
48
43
  });
44
+ return (React.createElement(Box, { gap: 2 },
45
+ React.createElement(Box, { flexShrink: 0, width: 12 },
46
+ React.createElement(Text, { dimColor: true }, formatDate.format(new Date(log.at)))),
47
+ React.createElement(Box, { flexShrink: 0, width: 8 },
48
+ React.createElement(Text, { color: kindColor[log.kind], wrap: "truncate-end" }, kindLabels(messages)[log.kind])),
49
+ React.createElement(Box, { flexGrow: 1 },
50
+ React.createElement(Text, { wrap: "truncate-end" }, describeLog(log, language, messages))),
51
+ React.createElement(Box, { flexShrink: 0, justifyContent: "flex-end", width: 8 },
52
+ React.createElement(Text, { color: palette.accent }, `+${log.experience} XP`))));
53
+ }
54
+ export default function LogsView({ logs, language, messages, height, }) {
55
+ const palette = usePalette();
56
+ const [filter, setFilter] = React.useState("all");
57
+ const [offset, setOffset] = React.useState(0);
58
+ const shown = logs.filter((log) => filter === "all" || log.kind === filter);
59
+ // Title, tabs, summary, and their spacing take 4 rows.
60
+ const pageSize = Math.max(height - 4, 3);
61
+ const maximumOffset = Math.max(shown.length - pageSize, 0);
62
+ const labels = kindLabels(messages);
49
63
  useInput((input, key) => {
50
64
  const move = (step) => {
51
65
  const next = filters[(filters.indexOf(filter) + step + filters.length) % filters.length];
@@ -78,19 +92,11 @@ export default function LogsView({ logs, language, messages, height, }) {
78
92
  });
79
93
  return (React.createElement(Box, { flexDirection: "column", flexGrow: 1 },
80
94
  React.createElement(Box, { gap: 2 },
81
- React.createElement(Text, { bold: true, color: colors.accent }, messages.logs.title),
82
- filters.map((option) => (React.createElement(Text, { key: option, bold: option === filter, color: option === filter ? colors.accent : undefined, dimColor: option !== filter, underline: option === filter }, labels[option])))),
95
+ React.createElement(Text, { bold: true, color: palette.accent }, messages.logs.title),
96
+ filters.map((option) => (React.createElement(Text, { key: option, bold: option === filter, color: option === filter ? palette.accent : undefined, dimColor: option !== filter, underline: option === filter }, labels[option])))),
83
97
  React.createElement(Text, { dimColor: true }, messages.logs.summary(shown.length, shown.reduce((total, log) => total + log.experience, 0))),
84
98
  React.createElement(Box, { flexDirection: "column", marginTop: 1 },
85
99
  shown.length === 0 ? (React.createElement(Text, { dimColor: true }, messages.logs.empty)) : null,
86
- shown.slice(offset, offset + pageSize).map((log) => (React.createElement(Box, { key: `${log.kind}-${log.at}`, gap: 2 },
87
- React.createElement(Box, { flexShrink: 0, width: 12 },
88
- React.createElement(Text, { dimColor: true }, formatDate.format(new Date(log.at)))),
89
- React.createElement(Box, { flexShrink: 0, width: 8 },
90
- React.createElement(Text, { color: kindColor[log.kind] }, labels[log.kind])),
91
- React.createElement(Box, { flexGrow: 1 },
92
- React.createElement(Text, { wrap: "truncate-end" }, describeLog(log, language, messages))),
93
- React.createElement(Box, { flexShrink: 0, justifyContent: "flex-end", width: 8 },
94
- React.createElement(Text, { color: colors.accent }, `+${log.experience} XP`))))))));
100
+ shown.slice(offset, offset + pageSize).map((log) => (React.createElement(LogRow, { key: `${log.kind}-${log.at}`, language: language, log: log, messages: messages }))))));
95
101
  }
96
102
  //# sourceMappingURL=logs-view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs-view.js","sourceRoot":"","sources":["../../source/components/logs-view.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logs-view.js","sourceRoot":"","sources":["../../source/components/logs-view.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
- import { colors } from "../theme.js";
3
+ import { usePalette } from "../theme.js";
4
4
  const clamp = (value, minimum, maximum) => Math.min(Math.max(value, minimum), maximum);
5
5
  export default function MenuGrid({ items, columns, onSelect, isActive = true, }) {
6
+ const palette = usePalette();
6
7
  const [selectedIndex, setSelectedIndex] = React.useState(0);
7
8
  const last = items.length - 1;
8
9
  useInput((input, key) => {
@@ -32,7 +33,7 @@ export default function MenuGrid({ items, columns, onSelect, isActive = true, })
32
33
  const index = rowIndex * columns + columnIndex;
33
34
  const isSelected = index === selectedIndex;
34
35
  return (React.createElement(Box, { key: item.label, flexBasis: 0, flexGrow: 1, justifyContent: "space-between" },
35
- React.createElement(Text, { bold: isSelected, color: isSelected ? colors.accent : undefined, wrap: "truncate-end" }, `${isSelected ? "❯" : " "} ${index + 1}. ${item.label}`),
36
+ React.createElement(Text, { bold: isSelected, color: isSelected ? palette.accent : undefined, wrap: "truncate-end" }, `${isSelected ? "❯" : " "} ${index + 1}. ${item.label}`),
36
37
  React.createElement(Text, { dimColor: true }, item.signal)));
37
38
  }),
38
39
  Array.from({ length: columns - row.length }, (_, filler) => (React.createElement(Box, { key: `filler-${filler}`, flexBasis: 0, flexGrow: 1 })))))),
@@ -1 +1 @@
1
- {"version":3,"file":"menu-grid.js","sourceRoot":"","sources":["../../source/components/menu-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAerC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe,EAAE,EAAE,CACjE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAE7C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAChC,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,GAAG,IAAI,GACA;IACf,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9B,QAAQ,CACP,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACd,IAAI,GAAG,CAAC,SAAS,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACpC,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC5C,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzC,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,SAAS,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC3C,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,QAAQ,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC,EACD,EAAE,QAAQ,EAAE,CACZ,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACtB,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,EAC7C,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,CAC/D,CAAC;IAEF,OAAO,CACN,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAC5B,oBAAC,GAAG,IAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YACvD,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;gBAC9B,MAAM,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;gBAC/C,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa,CAAC;gBAE3C,OAAO,CACN,oBAAC,GAAG,IACH,GAAG,EAAE,IAAI,CAAC,KAAK,EACf,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe;oBAE9B,oBAAC,IAAI,IACJ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC7C,IAAI,EAAC,cAAc,IAElB,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAClD;oBACP,oBAAC,IAAI,IAAC,QAAQ,UAAE,IAAI,CAAC,MAAM,CAAQ,CAC9B,CACN,CAAC;YACH,CAAC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAC5D,oBAAC,GAAG,IAAC,GAAG,EAAE,UAAU,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAI,CAC3D,CAAC,CACG,CACN,CAAC;QACF,oBAAC,GAAG,IAAC,SAAS,EAAE,CAAC;YAChB,oBAAC,IAAI,IAAC,QAAQ,UAAE,KAAK,CAAC,aAAa,CAAC,EAAE,WAAW,CAAQ,CACpD,CACD,CACN,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"menu-grid.js","sourceRoot":"","sources":["../../source/components/menu-grid.tsx"],"names":[],"mappings":"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"}
@@ -1,23 +1,30 @@
1
1
  import React from "react";
2
2
  import { Box, Text } from "ink";
3
- import { colors } from "../theme.js";
4
- export default function TodayPanel({ title, metrics, width }) {
3
+ import { usePalette } from "../theme.js";
4
+ function Bar({ metric, width }) {
5
+ const value = Math.min(Math.max(Math.round(metric.value), 0), 100);
6
+ const filled = Math.round((value / 100) * width);
7
+ return (React.createElement(Text, null,
8
+ React.createElement(Text, { color: metric.color }, "█".repeat(filled)),
9
+ React.createElement(Text, { dimColor: true }, "░".repeat(width - filled)),
10
+ React.createElement(Text, null, ` ${String(value).padStart(3)}%`)));
11
+ }
12
+ export default function TodayPanel({ title, sections, width, }) {
13
+ const palette = usePalette();
5
14
  // Border and padding take 4 columns, and " 100%" takes 5.
6
15
  const barWidth = Math.max(width - 9, 4);
7
- return (React.createElement(Box, { borderColor: colors.border, borderStyle: "round", flexDirection: "column", flexShrink: 0, paddingX: 1, width: width },
16
+ return (React.createElement(Box, { borderColor: palette.border, borderStyle: "round", flexDirection: "column", flexShrink: 0, paddingX: 1, width: width },
8
17
  React.createElement(Text, { bold: true }, title),
9
- metrics.map((metric, index) => {
10
- const value = Math.min(Math.max(Math.round(metric.value), 0), 100);
11
- const filled = Math.round((value / 100) * barWidth);
12
- return (React.createElement(Box, { key: metric.label, flexDirection: "column", marginTop: index === 0 ? 0 : 1 },
18
+ sections.map((section, index) => (React.createElement(Box, { key: section.title ?? `section-${index}`, flexDirection: "column", marginTop: index === 0 ? 0 : 1 },
19
+ section.title ? (React.createElement(Text, { bold: true, color: palette.soft }, section.title)) : null,
20
+ section.metrics.map((metric) => (React.createElement(Box, { key: metric.label, flexDirection: "column" },
13
21
  React.createElement(Box, { gap: 1, justifyContent: "space-between" },
14
22
  React.createElement(Box, { flexShrink: 0 },
15
- React.createElement(Text, { bold: true, color: metric.color }, metric.label)),
23
+ React.createElement(Text, { color: metric.color }, metric.label)),
16
24
  React.createElement(Text, { dimColor: true, wrap: "truncate-end" }, metric.detail)),
17
- React.createElement(Text, null,
18
- React.createElement(Text, { color: metric.color }, "█".repeat(filled)),
19
- React.createElement(Text, { dimColor: true }, "░".repeat(barWidth - filled)),
20
- React.createElement(Text, null, ` ${String(value).padStart(3)}%`))));
21
- })));
25
+ React.createElement(Bar, { metric: metric, width: barWidth })))),
26
+ section.advice ? (React.createElement(Text, { wrap: "truncate-end" },
27
+ React.createElement(Text, { color: section.advice.isDone ? palette.success : palette.accent }, "⏺ "),
28
+ React.createElement(Text, { dimColor: true }, section.advice.text))) : null)))));
22
29
  }
23
30
  //# sourceMappingURL=today-panel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"today-panel.js","sourceRoot":"","sources":["../../source/components/today-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAerC,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAmB;IAC5E,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAExC,OAAO,CACN,oBAAC,GAAG,IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAC1B,WAAW,EAAC,OAAO,EACnB,aAAa,EAAC,QAAQ,EACtB,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,KAAK;QAEZ,oBAAC,IAAI,IAAC,IAAI,UAAE,KAAK,CAAQ;QACxB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;YAEpD,OAAO,CACN,oBAAC,GAAG,IACH,GAAG,EAAE,MAAM,CAAC,KAAK,EACjB,aAAa,EAAC,QAAQ,EACtB,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9B,oBAAC,GAAG,IAAC,GAAG,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe;oBAC1C,oBAAC,GAAG,IAAC,UAAU,EAAE,CAAC;wBACjB,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,MAAM,CAAC,KAAK,IAC5B,MAAM,CAAC,KAAK,CACP,CACF;oBACN,oBAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,EAAC,cAAc,IAChC,MAAM,CAAC,MAAM,CACR,CACF;gBACN,oBAAC,IAAI;oBACJ,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAQ;oBACtD,oBAAC,IAAI,IAAC,QAAQ,UAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAQ;oBACrD,oBAAC,IAAI,QAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAQ,CACzC,CACF,CACN,CAAC;QACH,CAAC,CAAC,CACG,CACN,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"today-panel.js","sourceRoot":"","sources":["../../source/components/today-panel.tsx"],"names":[],"mappings":"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"}
package/build/content.js CHANGED
@@ -1,11 +1,14 @@
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 = 26;
6
+ // Header and footer take 5 rows. The character panel is 18 rows tall, Today
7
+ // 17, and the menu with its recent logs at least 16.
7
8
  const chromeRows = 5;
8
- const panelRows = 15;
9
+ const characterRows = 18;
10
+ const todayRows = 17;
11
+ const panelRows = 16;
9
12
  // The panel that takes input always shows; the rest appears as space allows.
10
13
  export function layoutOf(columns, rows) {
11
14
  const menuColumnsOf = (panelWidth) => {
@@ -34,7 +37,7 @@ export function layoutOf(columns, rows) {
34
37
  todayWidth: columns,
35
38
  menuColumns: menuColumnsOf(panelWidth),
36
39
  showCharacter: true,
37
- showToday: rows >= chromeRows + panelRows * 2,
40
+ showToday: rows >= chromeRows + characterRows + todayRows,
38
41
  todayBeside: false,
39
42
  stacked: false,
40
43
  };
@@ -43,54 +46,93 @@ export function layoutOf(columns, rows) {
43
46
  panelWidth: columns,
44
47
  todayWidth: columns,
45
48
  menuColumns: menuColumnsOf(columns),
46
- showCharacter: rows >= chromeRows + panelRows * 2,
47
- showToday: rows >= chromeRows + panelRows * 3,
49
+ showCharacter: rows >= chromeRows + panelRows + characterRows,
50
+ showToday: rows >= chromeRows + panelRows + characterRows + todayRows,
48
51
  todayBeside: false,
49
52
  stacked: true,
50
53
  };
51
54
  }
52
55
  const percentOf = (value, goal) => (value / goal) * 100;
53
- export function metricsOf(messages, language, progress, now) {
56
+ export function sectionsOf(language, palette, progress, now) {
57
+ const messages = messagesOf(language);
54
58
  const today = todayOf(progress, now);
59
+ const targets = targetsOf(progress.profile);
55
60
  const experience = experienceOf(progress);
56
61
  const level = Math.floor(experience / experiencePerLevel) + 1;
57
62
  const levelExperience = experience % experiencePerLevel;
63
+ const advice = adviceOf(progress.profile, today, language, messages);
64
+ const format = (value) => formatNumber(language, value);
58
65
  return [
59
66
  {
60
- label: messages.today.character,
61
- detail: messages.today.characterDetail(level + 1, experiencePerLevel - levelExperience),
62
- value: percentOf(levelExperience, experiencePerLevel),
63
- color: colors.accent,
67
+ metrics: [
68
+ {
69
+ label: messages.today.character,
70
+ detail: messages.today.characterDetail(level + 1, experiencePerLevel - levelExperience),
71
+ value: percentOf(levelExperience, experiencePerLevel),
72
+ color: palette.metrics.character,
73
+ },
74
+ {
75
+ label: messages.today.focus,
76
+ detail: messages.today.focusDetail(today.focusSessions, dailyGoals.focusSessions),
77
+ value: percentOf(today.focusSessions, dailyGoals.focusSessions),
78
+ color: palette.metrics.focus,
79
+ },
80
+ ],
64
81
  },
65
82
  {
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,
83
+ title: progress.profile
84
+ ? messages.health.title(messages.goal[progress.profile.goal])
85
+ : messages.today.health,
86
+ metrics: [
87
+ {
88
+ label: messages.today.protein,
89
+ detail: messages.today.proteinDetail(format(today.protein), format(targets.protein)),
90
+ value: percentOf(today.protein, targets.protein),
91
+ color: palette.metrics.protein,
92
+ },
93
+ {
94
+ label: messages.today.calories,
95
+ detail: messages.today.caloriesDetail(format(today.calories), format(targets.calories), today.meals),
96
+ value: percentOf(today.calories, targets.calories),
97
+ color: palette.metrics.calories,
98
+ },
99
+ {
100
+ label: messages.today.workout,
101
+ detail: messages.today.workoutDetail(today.workoutMinutes, targets.workoutMinutes),
102
+ value: percentOf(today.workoutMinutes, targets.workoutMinutes),
103
+ color: palette.metrics.workout,
104
+ },
105
+ ],
106
+ advice: progress.profile
107
+ ? (advice.find((item) => !item.isDone) ?? advice[0])
108
+ : { text: messages.health.noProfile, isDone: false },
82
109
  },
83
110
  ];
84
111
  }
85
112
  export const menuOrder = [
86
113
  "timer",
87
- "diet",
88
- "workout",
114
+ "health",
89
115
  "logs",
90
116
  "quotes",
117
+ "profile",
118
+ "theme",
91
119
  "language",
92
120
  ];
121
+ const languageSignal = {
122
+ en: "EN",
123
+ "zh-TW": "繁中",
124
+ ko: "한국어",
125
+ };
93
126
  export function menuItemsOf(messages, language, state) {
127
+ const { profile } = state.progress;
128
+ const proteinLeft = targetsOf(profile).protein - todayOf(state.progress, state.now).protein;
129
+ let healthSignal = messages.signal.setUp;
130
+ if (profile) {
131
+ healthSignal =
132
+ proteinLeft > 0
133
+ ? messages.signal.proteinLeft(proteinLeft)
134
+ : messages.signal.onTrack;
135
+ }
94
136
  return [
95
137
  {
96
138
  label: messages.menu.timer,
@@ -98,14 +140,9 @@ export function menuItemsOf(messages, language, state) {
98
140
  description: messages.describe.timer(state.focus, state.rest),
99
141
  },
100
142
  {
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,
143
+ label: messages.menu.health,
144
+ signal: healthSignal,
145
+ description: messages.describe.health,
109
146
  },
110
147
  {
111
148
  label: messages.menu.logs,
@@ -117,9 +154,19 @@ export function menuItemsOf(messages, language, state) {
117
154
  signal: messages.signal.newQuote,
118
155
  description: messages.describe.quotes(quoteRefreshMinutes),
119
156
  },
157
+ {
158
+ label: messages.menu.profile,
159
+ signal: profile?.name ?? messages.signal.setUp,
160
+ description: messages.describe.profile,
161
+ },
162
+ {
163
+ label: messages.menu.theme,
164
+ signal: messages.themes.names[state.theme],
165
+ description: messages.describe.theme,
166
+ },
120
167
  {
121
168
  label: messages.menu.language,
122
- signal: language === "zh-TW" ? "繁中" : "EN",
169
+ signal: languageSignal[language],
123
170
  description: messages.describe.language,
124
171
  },
125
172
  ];
@@ -173,4 +220,67 @@ export const workoutFieldsOf = (messages) => [
173
220
  })),
174
221
  },
175
222
  ];
223
+ // Saved values come back as defaults, so editing the profile is a run of Enter.
224
+ export const profileFieldsOf = (messages, profile, name) => [
225
+ {
226
+ key: "name",
227
+ label: messages.form.name,
228
+ kind: "text",
229
+ defaultValue: profile?.name ?? name,
230
+ },
231
+ {
232
+ key: "age",
233
+ label: messages.form.age,
234
+ kind: "number",
235
+ minimum: 10,
236
+ maximum: 100,
237
+ defaultValue: profile ? String(profile.age) : undefined,
238
+ },
239
+ {
240
+ key: "height",
241
+ label: messages.form.height,
242
+ kind: "number",
243
+ minimum: 100,
244
+ maximum: 250,
245
+ defaultValue: profile ? String(profile.height) : undefined,
246
+ },
247
+ {
248
+ key: "weight",
249
+ label: messages.form.weight,
250
+ kind: "number",
251
+ minimum: 30,
252
+ maximum: 300,
253
+ defaultValue: profile ? String(profile.weight) : undefined,
254
+ },
255
+ {
256
+ key: "gender",
257
+ label: messages.form.gender,
258
+ kind: "select",
259
+ options: genders.map((option) => ({
260
+ label: messages.gender[option],
261
+ value: option,
262
+ })),
263
+ defaultValue: profile?.gender,
264
+ },
265
+ {
266
+ key: "workStyle",
267
+ label: messages.form.workStyle,
268
+ kind: "select",
269
+ options: workStyles.map((option) => ({
270
+ label: messages.workStyle[option],
271
+ value: option,
272
+ })),
273
+ defaultValue: profile?.workStyle,
274
+ },
275
+ {
276
+ key: "goal",
277
+ label: messages.form.goal,
278
+ kind: "select",
279
+ options: healthGoals.map((option) => ({
280
+ label: messages.goal[option],
281
+ value: option,
282
+ })),
283
+ defaultValue: profile?.goal,
284
+ },
285
+ ];
176
286
  //# sourceMappingURL=content.js.map