@burdenoff/microfe-mybodyshield 2026.821.2 → 2026.830.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/mybodyshield/MyBodyShieldRoot.d.ts.map +1 -1
  2. package/dist/mybodyshield/MyBodyShieldRoot.js +54 -56
  3. package/dist/mybodyshield/MyBodyShieldRoot.js.map +1 -1
  4. package/dist/mybodyshield/MyBodyShieldRoutes.d.ts.map +1 -1
  5. package/dist/mybodyshield/MyBodyShieldRoutes.js +121 -62
  6. package/dist/mybodyshield/MyBodyShieldRoutes.js.map +1 -1
  7. package/dist/mybodyshield/components/EvidenceUpload.d.ts.map +1 -1
  8. package/dist/mybodyshield/components/EvidenceUpload.js +46 -45
  9. package/dist/mybodyshield/components/EvidenceUpload.js.map +1 -1
  10. package/dist/mybodyshield/components/FileLink.d.ts.map +1 -1
  11. package/dist/mybodyshield/components/FileLink.js +27 -18
  12. package/dist/mybodyshield/components/FileLink.js.map +1 -1
  13. package/dist/mybodyshield/components/MybDiscussion.d.ts +1 -1
  14. package/dist/mybodyshield/components/MybDiscussion.d.ts.map +1 -1
  15. package/dist/mybodyshield/components/MybDiscussion.js +59 -58
  16. package/dist/mybodyshield/components/MybDiscussion.js.map +1 -1
  17. package/dist/mybodyshield/components/MybTags.d.ts +1 -1
  18. package/dist/mybodyshield/components/MybTags.d.ts.map +1 -1
  19. package/dist/mybodyshield/components/MybTags.js +83 -74
  20. package/dist/mybodyshield/components/MybTags.js.map +1 -1
  21. package/dist/mybodyshield/components/PageDisabled.d.ts.map +1 -1
  22. package/dist/mybodyshield/components/PageDisabled.js +16 -11
  23. package/dist/mybodyshield/components/PageDisabled.js.map +1 -1
  24. package/dist/mybodyshield/components/Pagination.d.ts.map +1 -1
  25. package/dist/mybodyshield/components/Pagination.js +36 -27
  26. package/dist/mybodyshield/components/Pagination.js.map +1 -1
  27. package/dist/mybodyshield/components/StateViews.d.ts.map +1 -1
  28. package/dist/mybodyshield/components/StateViews.js +42 -34
  29. package/dist/mybodyshield/components/StateViews.js.map +1 -1
  30. package/dist/mybodyshield/components/UserSearchSelect.d.ts.map +1 -1
  31. package/dist/mybodyshield/components/UserSearchSelect.js +66 -68
  32. package/dist/mybodyshield/components/UserSearchSelect.js.map +1 -1
  33. package/dist/mybodyshield/hooks/index.d.ts +1 -0
  34. package/dist/mybodyshield/hooks/index.d.ts.map +1 -1
  35. package/dist/mybodyshield/hooks/index.js +1 -0
  36. package/dist/mybodyshield/hooks/useTr.d.ts +5 -0
  37. package/dist/mybodyshield/hooks/useTr.d.ts.map +1 -0
  38. package/dist/mybodyshield/hooks/useTr.js +12 -0
  39. package/dist/mybodyshield/hooks/useTr.js.map +1 -0
  40. package/dist/mybodyshield/pages/DashboardPage.d.ts.map +1 -1
  41. package/dist/mybodyshield/pages/DashboardPage.js +157 -136
  42. package/dist/mybodyshield/pages/DashboardPage.js.map +1 -1
  43. package/dist/mybodyshield/pages/SettingsPage.d.ts.map +1 -1
  44. package/dist/mybodyshield/pages/SettingsPage.js +50 -59
  45. package/dist/mybodyshield/pages/SettingsPage.js.map +1 -1
  46. package/dist/mybodyshield/pages/_shared/visuals.d.ts +2 -1
  47. package/dist/mybodyshield/pages/_shared/visuals.d.ts.map +1 -1
  48. package/dist/mybodyshield/pages/_shared/visuals.js +91 -81
  49. package/dist/mybodyshield/pages/_shared/visuals.js.map +1 -1
  50. package/dist/mybodyshield/pages/ai/AiControlsPage.d.ts.map +1 -1
  51. package/dist/mybodyshield/pages/ai/AiControlsPage.js +279 -231
  52. package/dist/mybodyshield/pages/ai/AiControlsPage.js.map +1 -1
  53. package/dist/mybodyshield/pages/coaching/CoachingPage.d.ts.map +1 -1
  54. package/dist/mybodyshield/pages/coaching/CoachingPage.js +349 -258
  55. package/dist/mybodyshield/pages/coaching/CoachingPage.js.map +1 -1
  56. package/dist/mybodyshield/pages/goals/GoalsPage.d.ts.map +1 -1
  57. package/dist/mybodyshield/pages/goals/GoalsPage.js +247 -251
  58. package/dist/mybodyshield/pages/goals/GoalsPage.js.map +1 -1
  59. package/dist/mybodyshield/pages/insights/InsightsCharts.d.ts.map +1 -1
  60. package/dist/mybodyshield/pages/insights/InsightsCharts.js +216 -213
  61. package/dist/mybodyshield/pages/insights/InsightsCharts.js.map +1 -1
  62. package/dist/mybodyshield/pages/insights/InsightsPage.d.ts.map +1 -1
  63. package/dist/mybodyshield/pages/insights/InsightsPage.js +327 -220
  64. package/dist/mybodyshield/pages/insights/InsightsPage.js.map +1 -1
  65. package/dist/mybodyshield/pages/nutrition/NutritionPage.d.ts.map +1 -1
  66. package/dist/mybodyshield/pages/nutrition/NutritionPage.js +575 -529
  67. package/dist/mybodyshield/pages/nutrition/NutritionPage.js.map +1 -1
  68. package/dist/mybodyshield/pages/programs/ProgramDetailPage.d.ts.map +1 -1
  69. package/dist/mybodyshield/pages/programs/ProgramDetailPage.js +333 -275
  70. package/dist/mybodyshield/pages/programs/ProgramDetailPage.js.map +1 -1
  71. package/dist/mybodyshield/pages/programs/ProgramsPage.d.ts.map +1 -1
  72. package/dist/mybodyshield/pages/programs/ProgramsPage.js +258 -253
  73. package/dist/mybodyshield/pages/programs/ProgramsPage.js.map +1 -1
  74. package/dist/mybodyshield/pages/progress/ProgressPage.d.ts.map +1 -1
  75. package/dist/mybodyshield/pages/progress/ProgressPage.js +271 -254
  76. package/dist/mybodyshield/pages/progress/ProgressPage.js.map +1 -1
  77. package/dist/mybodyshield/pages/recovery/RecoveryPage.d.ts.map +1 -1
  78. package/dist/mybodyshield/pages/recovery/RecoveryPage.js +206 -200
  79. package/dist/mybodyshield/pages/recovery/RecoveryPage.js.map +1 -1
  80. package/dist/mybodyshield/pages/train/SessionDetailPage.d.ts.map +1 -1
  81. package/dist/mybodyshield/pages/train/SessionDetailPage.js +327 -294
  82. package/dist/mybodyshield/pages/train/SessionDetailPage.js.map +1 -1
  83. package/dist/mybodyshield/pages/train/SessionsPage.d.ts.map +1 -1
  84. package/dist/mybodyshield/pages/train/SessionsPage.js +180 -163
  85. package/dist/mybodyshield/pages/train/SessionsPage.js.map +1 -1
  86. package/dist/mybodyshield/utils/i18n.d.ts +1 -2
  87. package/dist/mybodyshield/utils/i18n.d.ts.map +1 -1
  88. package/dist/mybodyshield/utils/i18n.js +15 -0
  89. package/dist/mybodyshield/utils/i18n.js.map +1 -0
  90. package/package.json +1 -1
@@ -4,16 +4,17 @@ import { MetricsCard as n } from "../components/MetricsCard.js";
4
4
  import { formatEnumLabel as r, formatNumber as i, formatPercent as a, formatRelativeTime as o, formatWeight as s } from "../utils/formatters.js";
5
5
  import { StatusBadge as c } from "../components/StatusBadge.js";
6
6
  import { EmptyState as l } from "../components/EmptyState.js";
7
- import { LoadingView as ee, Section as u } from "../components/StateViews.js";
8
- import { MiniBar as d } from "../components/MiniBar.js";
9
7
  import "../context/index.js";
10
- import { useMybBodyMetrics as te, useMybDailyMacros as ne, useMybGoals as re, useMybPrograms as ie, useMybRecoveryLogs as ae, useMybSessions as f, useMybTodayGuidance as p } from "../hooks/useMyBodyShieldApi.js";
8
+ import { useMybBodyMetrics as ee, useMybDailyMacros as te, useMybGoals as ne, useMybPrograms as re, useMybRecoveryLogs as u, useMybSessions as d, useMybTodayGuidance as f } from "../hooks/useMyBodyShieldApi.js";
9
+ import { useTr as ie } from "../hooks/useTr.js";
11
10
  import "../hooks/index.js";
11
+ import { LoadingView as ae, Section as p } from "../components/StateViews.js";
12
+ import { MiniBar as oe } from "../components/MiniBar.js";
12
13
  import { motion as m } from "../../node_modules/framer-motion/dist/es/render/components/motion/proxy.js";
13
- import { useReducedMotion as oe } from "../../node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js";
14
- import { GOAL_TYPE_META as se, IconChip as h, MacroBar as ce, MacroLegend as le, Meter as g, ProgressRing as ue, WORKOUT_TYPE_META as de, computeGoalProgress as _ } from "./_shared/visuals.js";
14
+ import { useReducedMotion as se } from "../../node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js";
15
+ import { GOAL_TYPE_META as ce, IconChip as h, MacroBar as le, MacroLegend as g, Meter as _, ProgressRing as ue, WORKOUT_TYPE_META as de, computeGoalProgress as v } from "./_shared/visuals.js";
15
16
  import { useMemo as fe } from "react";
16
- import { ArrowRight as v, BedDouble as y, CalendarCheck as b, CheckCircle2 as x, Dumbbell as pe, Flame as S, Moon as C, Salad as w, Sparkles as me, Target as T, TrendingUp as E, Utensils as D, Weight as he } from "lucide-react";
17
+ import { ArrowRight as y, BedDouble as b, CalendarCheck as pe, CheckCircle2 as x, Dumbbell as S, Flame as C, Moon as w, Salad as me, Sparkles as he, Target as T, TrendingUp as E, Utensils as D, Weight as ge } from "lucide-react";
17
18
  import { jsx as O, jsxs as k } from "react/jsx-runtime";
18
19
  import { GlassCard as A } from "@burdenoff/fe-libs/ui";
19
20
  //#region src/mybodyshield/pages/DashboardPage.tsx
@@ -24,38 +25,43 @@ var j = [
24
25
  1
25
26
  ], M = {
26
27
  REST: {
27
- icon: y,
28
+ icon: b,
28
29
  textClass: "text-status-error-text",
29
30
  bgClass: "bg-status-error-bg-subtle",
30
- label: "Rest"
31
+ labelKey: "mybodyshield.pages.dashboard.rest",
32
+ labelFallback: "Rest"
31
33
  },
32
34
  LIGHTEN_SESSION: {
33
- icon: C,
35
+ icon: w,
34
36
  textClass: "text-status-warning-text",
35
37
  bgClass: "bg-status-warning-bg-subtle",
36
- label: "Lighten session"
38
+ labelKey: "mybodyshield.pages.dashboard.lightenSession",
39
+ labelFallback: "Lighten session"
37
40
  },
38
41
  PROCEED_AS_PLANNED: {
39
42
  icon: x,
40
43
  textClass: "text-status-success-text",
41
44
  bgClass: "bg-status-success-bg-subtle",
42
- label: "Proceed as planned"
45
+ labelKey: "mybodyshield.pages.dashboard.proceedAsPlanned",
46
+ labelFallback: "Proceed as planned"
43
47
  },
44
48
  INCREASE_LOAD: {
45
49
  icon: E,
46
50
  textClass: "text-status-success-text",
47
51
  bgClass: "bg-status-success-bg-subtle",
48
- label: "Increase load"
52
+ labelKey: "mybodyshield.pages.dashboard.increaseLoad",
53
+ labelFallback: "Increase load"
49
54
  },
50
55
  REVIEW_NUTRITION: {
51
56
  icon: D,
52
57
  textClass: "text-status-warning-text",
53
58
  bgClass: "bg-status-warning-bg-subtle",
54
- label: "Review nutrition"
59
+ labelKey: "mybodyshield.pages.dashboard.reviewNutrition",
60
+ labelFallback: "Review nutrition"
55
61
  }
56
62
  };
57
63
  function N() {
58
- let { navigateTo: y, currentUser: E } = e(), D = oe(), N = (e) => D ? {} : {
64
+ let b = ie(), { navigateTo: E, currentUser: D } = e(), N = se(), P = (e) => N ? {} : {
59
65
  initial: {
60
66
  opacity: 0,
61
67
  y: 14
@@ -73,13 +79,13 @@ function N() {
73
79
  delay: Math.min(e, 8) * .05,
74
80
  ease: j
75
81
  }
76
- }, P = D ? {} : { whileHover: {
82
+ }, F = N ? {} : { whileHover: {
77
83
  y: -3,
78
84
  transition: {
79
85
  duration: .2,
80
86
  ease: j
81
87
  }
82
- } }, F = D ? {} : {
88
+ } }, I = N ? {} : {
83
89
  whileHover: {
84
90
  y: -3,
85
91
  transition: {
@@ -88,39 +94,39 @@ function N() {
88
94
  }
89
95
  },
90
96
  whileTap: { scale: .985 }
91
- }, I = ie({
97
+ }, L = re({
92
98
  status: "ACTIVE",
93
99
  pagination: { limit: 50 }
94
- }), L = f({ pagination: { limit: 20 } }), R = re({
100
+ }), R = d({ pagination: { limit: 20 } }), z = ne({
95
101
  status: "ACTIVE",
96
102
  pagination: { limit: 50 }
97
- }), z = ne(), ge = te({
103
+ }), B = te(), _e = ee({
98
104
  type: "WEIGHT",
99
105
  pagination: { limit: 30 }
100
- }), _e = ae("READINESS"), B = p(), ve = I.data?.items ?? [], V = L.data?.items ?? [], H = R.data?.items ?? [], U = ge.data?.items ?? [], ye = _e.data?.items ?? [], be = (/* @__PURE__ */ new Date()).getTime() - 10080 * 60 * 1e3, W = V.filter((e) => {
106
+ }), ve = u("READINESS"), V = f(), ye = L.data?.items ?? [], H = R.data?.items ?? [], U = z.data?.items ?? [], W = _e.data?.items ?? [], be = ve.data?.items ?? [], xe = (/* @__PURE__ */ new Date()).getTime() - 10080 * 60 * 1e3, G = H.filter((e) => {
101
107
  let t = e.completedAt ?? e.startedAt ?? e.scheduledFor ?? e.createdAt;
102
- return t ? new Date(t).getTime() >= be : !1;
103
- }), G = W.filter((e) => e.status === "COMPLETED").length, K = V.find((e) => e.status === "IN_PROGRESS"), q = V.filter((e) => e.status === "SCHEDULED" && e.scheduledFor).sort((e, t) => new Date(e.scheduledFor).getTime() - new Date(t.scheduledFor).getTime())[0], J = U[0], Y = U[1], X = J && Y ? J.value - Y.value : void 0, Z = ye.slice().sort((e, t) => new Date(t.loggedAt).getTime() - new Date(e.loggedAt).getTime())[0], Q = fe(() => H.length === 0 ? 0 : H.reduce((e, t) => e + _(t), 0) / H.length, [H]), $ = z.data, xe = $?.calorieTarget ? $.calories / $.calorieTarget * 100 : 0;
104
- if (I.isLoading && L.isLoading && R.isLoading && z.isLoading) return /* @__PURE__ */ O(t, {
105
- title: "MyBodyShield",
108
+ return t ? new Date(t).getTime() >= xe : !1;
109
+ }), Se = G.filter((e) => e.status === "COMPLETED").length, K = H.find((e) => e.status === "IN_PROGRESS"), q = H.filter((e) => e.status === "SCHEDULED" && e.scheduledFor).sort((e, t) => new Date(e.scheduledFor).getTime() - new Date(t.scheduledFor).getTime())[0], J = W[0], Y = W[1], X = J && Y ? J.value - Y.value : void 0, Z = be.slice().sort((e, t) => new Date(t.loggedAt).getTime() - new Date(e.loggedAt).getTime())[0], Q = fe(() => U.length === 0 ? 0 : U.reduce((e, t) => e + v(t), 0) / U.length, [U]), $ = B.data, Ce = $?.calorieTarget ? $.calories / $.calorieTarget * 100 : 0;
110
+ if (L.isLoading && R.isLoading && z.isLoading && B.isLoading) return /* @__PURE__ */ O(t, {
111
+ title: b("mybodyshield.pages.dashboard.title", "MyBodyShield"),
106
112
  titleGradient: !0,
107
113
  aurora: !0,
108
- children: /* @__PURE__ */ O(ee, { label: "Loading your fitness overview…" })
114
+ children: /* @__PURE__ */ O(ae, { label: b("mybodyshield.pages.dashboard.loading", "Loading your fitness overview…") })
109
115
  });
110
- let Se = E?.firstName || E?.name || "there", Ce = [
116
+ let we = D?.firstName || D?.name || b("mybodyshield.pages.dashboard.greetingFallback", "there"), Te = [
111
117
  {
112
118
  id: "programs",
113
119
  node: /* @__PURE__ */ O(n, {
114
- icon: /* @__PURE__ */ O(pe, { className: "h-5 w-5" }),
115
- value: i(ve.length),
116
- label: "Active programs",
120
+ icon: /* @__PURE__ */ O(S, { className: "h-5 w-5" }),
121
+ value: i(ye.length),
122
+ label: b("mybodyshield.pages.dashboard.activePrograms", "Active programs"),
117
123
  footer: /* @__PURE__ */ O("p", {
118
124
  className: "text-xs text-text-tertiary",
119
125
  children: /* @__PURE__ */ O("button", {
120
126
  type: "button",
121
- onClick: () => y("programs"),
127
+ onClick: () => E("programs"),
122
128
  className: "font-medium text-accent hover:underline",
123
- children: "Manage programs"
129
+ children: b("mybodyshield.pages.dashboard.managePrograms", "Manage programs")
124
130
  })
125
131
  })
126
132
  })
@@ -128,24 +134,24 @@ function N() {
128
134
  {
129
135
  id: "sessions",
130
136
  node: /* @__PURE__ */ O(n, {
131
- icon: /* @__PURE__ */ O(S, { className: "h-5 w-5" }),
132
- value: i(G),
133
- label: "Sessions this week",
137
+ icon: /* @__PURE__ */ O(C, { className: "h-5 w-5" }),
138
+ value: i(Se),
139
+ label: b("mybodyshield.pages.dashboard.sessionsThisWeek", "Sessions this week"),
134
140
  accent: K ? "warning" : void 0,
135
141
  footer: K ? /* @__PURE__ */ O("button", {
136
142
  type: "button",
137
- onClick: () => y(`train/${K.id}`),
143
+ onClick: () => E(`train/${K.id}`),
138
144
  className: "text-xs font-medium text-status-warning-text hover:underline",
139
- children: "Resume live session →"
145
+ children: b("mybodyshield.pages.dashboard.resumeLiveSession", "Resume live session →")
140
146
  }) : /* @__PURE__ */ k("p", {
141
147
  className: "text-xs text-text-tertiary",
142
148
  children: [
143
149
  /* @__PURE__ */ O("span", {
144
150
  className: "tabular-nums text-text-secondary",
145
- children: W.length
151
+ children: G.length
146
152
  }),
147
153
  " ",
148
- "logged"
154
+ b("mybodyshield.pages.dashboard.logged", "logged")
149
155
  ]
150
156
  })
151
157
  })
@@ -154,11 +160,11 @@ function N() {
154
160
  id: "goals",
155
161
  node: /* @__PURE__ */ O(n, {
156
162
  icon: /* @__PURE__ */ O(T, { className: "h-5 w-5" }),
157
- value: i(H.length),
158
- label: "Active goals",
163
+ value: i(U.length),
164
+ label: b("mybodyshield.pages.dashboard.activeGoals", "Active goals"),
159
165
  footer: /* @__PURE__ */ k("div", {
160
166
  className: "space-y-2",
161
- children: [/* @__PURE__ */ O(d, {
167
+ children: [/* @__PURE__ */ O(oe, {
162
168
  value: Q,
163
169
  height: 4,
164
170
  barClassName: "bg-action-primary-bg"
@@ -170,7 +176,7 @@ function N() {
170
176
  children: a(Q)
171
177
  }),
172
178
  " ",
173
- "avg progress"
179
+ b("mybodyshield.pages.dashboard.avgProgress", "avg progress")
174
180
  ]
175
181
  })]
176
182
  })
@@ -179,27 +185,23 @@ function N() {
179
185
  {
180
186
  id: "weight",
181
187
  node: /* @__PURE__ */ O(n, {
182
- icon: /* @__PURE__ */ O(he, { className: "h-5 w-5" }),
188
+ icon: /* @__PURE__ */ O(ge, { className: "h-5 w-5" }),
183
189
  value: J ? s(J.value) : "—",
184
- label: "Latest weight",
190
+ label: b("mybodyshield.pages.dashboard.latestWeight", "Latest weight"),
185
191
  footer: X == null ? /* @__PURE__ */ O("button", {
186
192
  type: "button",
187
- onClick: () => y("progress"),
193
+ onClick: () => E("progress"),
188
194
  className: "text-xs font-medium text-accent hover:underline",
189
- children: "Log a measurement →"
195
+ children: b("mybodyshield.pages.dashboard.logMeasurement", "Log a measurement →")
190
196
  }) : /* @__PURE__ */ k("p", {
191
197
  className: "text-xs text-text-tertiary",
192
198
  children: [
193
- /* @__PURE__ */ k("span", {
199
+ /* @__PURE__ */ O("span", {
194
200
  className: X <= 0 ? "font-medium text-status-success-text" : "font-medium text-text-secondary",
195
- children: [
196
- X > 0 ? "+" : "",
197
- X.toFixed(1),
198
- " kg"
199
- ]
201
+ children: b("mybodyshield.pages.dashboard.weightDelta", "{{delta}} kg", { delta: `${X > 0 ? "+" : ""}${X.toFixed(1)}` })
200
202
  }),
201
203
  " ",
202
- "vs last"
204
+ b("mybodyshield.pages.dashboard.vsLast", "vs last")
203
205
  ]
204
206
  })
205
207
  })
@@ -207,44 +209,44 @@ function N() {
207
209
  {
208
210
  id: "recovery",
209
211
  node: /* @__PURE__ */ O(n, {
210
- icon: /* @__PURE__ */ O(C, { className: "h-5 w-5" }),
212
+ icon: /* @__PURE__ */ O(w, { className: "h-5 w-5" }),
211
213
  value: Z ? `${Z.score}` : "—",
212
- label: "Recovery readiness",
214
+ label: b("mybodyshield.pages.dashboard.recoveryReadiness", "Recovery readiness"),
213
215
  accent: Z ? Z.score >= 70 ? "success" : Z.score >= 40 ? "warning" : "error" : void 0,
214
216
  footer: Z ? /* @__PURE__ */ O("p", {
215
217
  className: "text-xs text-text-tertiary",
216
218
  children: o(Z.loggedAt)
217
219
  }) : /* @__PURE__ */ O("button", {
218
220
  type: "button",
219
- onClick: () => y("recovery"),
221
+ onClick: () => E("recovery"),
220
222
  className: "text-xs font-medium text-accent hover:underline",
221
- children: "Log recovery →"
223
+ children: b("mybodyshield.pages.dashboard.logRecovery", "Log recovery →")
222
224
  })
223
225
  })
224
226
  }
225
227
  ];
226
228
  return /* @__PURE__ */ k(t, {
227
- title: "MyBodyShield",
229
+ title: b("mybodyshield.pages.dashboard.title", "MyBodyShield"),
228
230
  titleGradient: !0,
229
231
  aurora: !0,
230
- description: `Welcome back, ${Se} — your training, nutrition, progress & recovery control room.`,
232
+ description: b("mybodyshield.pages.dashboard.description", "Welcome back, {{name}} — your training, nutrition, progress & recovery control room.", { name: we }),
231
233
  children: [
232
234
  /* @__PURE__ */ O("div", {
233
235
  "data-tour": "mybodyshield-dashboard-kpi-grid",
234
236
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5",
235
- children: Ce.map((e, t) => /* @__PURE__ */ k(m.div, {
237
+ children: Te.map((e, t) => /* @__PURE__ */ k(m.div, {
236
238
  className: "group relative rounded-2xl transition-shadow duration-300 hover:shadow-float",
237
- ...N(t),
238
- ...P,
239
+ ...P(t),
240
+ ...F,
239
241
  children: [/* @__PURE__ */ O("span", {
240
242
  "aria-hidden": !0,
241
243
  className: "pointer-events-none absolute inset-x-6 top-0 z-10 h-px rounded-full bg-gradient-to-r from-transparent via-action-primary-bg to-transparent opacity-40 transition-opacity duration-300 group-hover:opacity-90"
242
244
  }), e.node]
243
245
  }, e.id))
244
246
  }),
245
- !B.isLoading && (B.data?.cards.length ?? 0) > 0 && /* @__PURE__ */ O(m.div, {
247
+ !V.isLoading && (V.data?.cards.length ?? 0) > 0 && /* @__PURE__ */ O(m.div, {
246
248
  className: "mt-6",
247
- ...N(0),
249
+ ...P(0),
248
250
  children: /* @__PURE__ */ k(A, {
249
251
  treatment: "glass",
250
252
  className: "p-6",
@@ -252,19 +254,19 @@ function N() {
252
254
  /* @__PURE__ */ k("div", {
253
255
  className: "mb-4 flex items-center gap-2",
254
256
  children: [/* @__PURE__ */ O(h, {
255
- icon: /* @__PURE__ */ O(me, { className: "h-5 w-5" }),
257
+ icon: /* @__PURE__ */ O(he, { className: "h-5 w-5" }),
256
258
  tint: "var(--color-accent-primary)"
257
259
  }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
258
260
  className: "text-base font-semibold text-text-primary",
259
- children: "Today's guidance"
261
+ children: b("mybodyshield.pages.dashboard.todaysGuidance", "Today's guidance")
260
262
  }), /* @__PURE__ */ O("p", {
261
263
  className: "mt-0.5 text-sm text-text-secondary",
262
- children: "Recovery-aware suggestions from your logged training & recovery data."
264
+ children: b("mybodyshield.pages.dashboard.guidanceDescription", "Recovery-aware suggestions from your logged training & recovery data.")
263
265
  })] })]
264
266
  }),
265
267
  /* @__PURE__ */ O("div", {
266
268
  className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3",
267
- children: B.data?.cards.map((e, t) => {
269
+ children: V.data?.cards.map((e, t) => {
268
270
  let n = M[e.action], r = n.icon;
269
271
  return /* @__PURE__ */ k("div", {
270
272
  className: `rounded-xl border border-seam ${n.bgClass} p-4`,
@@ -272,7 +274,7 @@ function N() {
272
274
  className: "mb-1.5 flex items-center gap-1.5",
273
275
  children: [/* @__PURE__ */ O(r, { className: `h-4 w-4 shrink-0 ${n.textClass}` }), /* @__PURE__ */ O("span", {
274
276
  className: `text-xs font-semibold uppercase tracking-wide ${n.textClass}`,
275
- children: n.label
277
+ children: b(n.labelKey, n.labelFallback)
276
278
  })]
277
279
  }), /* @__PURE__ */ O("p", {
278
280
  className: "text-sm text-text-secondary",
@@ -281,9 +283,9 @@ function N() {
281
283
  }, `${e.signal}-${t}`);
282
284
  })
283
285
  }),
284
- B.data?.aiSummary && /* @__PURE__ */ O("p", {
286
+ V.data?.aiSummary && /* @__PURE__ */ O("p", {
285
287
  className: "mt-4 rounded-lg bg-surface p-3 text-sm italic text-text-secondary",
286
- children: B.data.aiSummary
288
+ children: V.data.aiSummary
287
289
  })
288
290
  ]
289
291
  })
@@ -293,7 +295,7 @@ function N() {
293
295
  children: [/* @__PURE__ */ O(m.div, {
294
296
  "data-tour": "mybodyshield-dashboard-nutrition",
295
297
  className: "lg:col-span-2",
296
- ...N(0),
298
+ ...P(0),
297
299
  children: /* @__PURE__ */ k(A, {
298
300
  treatment: "glass",
299
301
  className: "h-full p-6",
@@ -301,21 +303,25 @@ function N() {
301
303
  className: "mb-4 flex flex-wrap items-start justify-between gap-3",
302
304
  children: [/* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
303
305
  className: "text-base font-semibold text-text-primary",
304
- children: "Today's nutrition"
306
+ children: b("mybodyshield.pages.dashboard.todaysNutrition", "Today's nutrition")
305
307
  }), /* @__PURE__ */ O("p", {
306
308
  className: "mt-0.5 text-sm text-text-secondary",
307
- children: "Calories & macros logged against your active plan."
309
+ children: b("mybodyshield.pages.dashboard.nutritionDescription", "Calories & macros logged against your active plan.")
308
310
  })] }), /* @__PURE__ */ k("button", {
309
311
  type: "button",
310
- onClick: () => y("nutrition"),
312
+ onClick: () => E("nutrition"),
311
313
  className: "inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline",
312
- children: ["Nutrition ", /* @__PURE__ */ O(v, { className: "h-4 w-4" })]
314
+ children: [
315
+ b("mybodyshield.nav.nutrition", "Nutrition"),
316
+ " ",
317
+ /* @__PURE__ */ O(y, { className: "h-4 w-4" })
318
+ ]
313
319
  })]
314
320
  }), !$ || $.calorieTarget === 0 && $.calories === 0 ? /* @__PURE__ */ O(l, {
315
321
  illustration: "empty-data",
316
- icon: /* @__PURE__ */ O(w, { className: "h-10 w-10" }),
317
- title: "No nutrition data yet",
318
- description: "Activate a nutrition plan and log meals to track your daily macros here."
322
+ icon: /* @__PURE__ */ O(me, { className: "h-10 w-10" }),
323
+ title: b("mybodyshield.pages.dashboard.noNutritionData", "No nutrition data yet"),
324
+ description: b("mybodyshield.pages.dashboard.noNutritionDescription", "Activate a nutrition plan and log meals to track your daily macros here.")
319
325
  }) : /* @__PURE__ */ k("div", {
320
326
  className: "flex flex-col gap-8 sm:flex-row sm:items-center",
321
327
  children: [/* @__PURE__ */ k("div", {
@@ -325,13 +331,13 @@ function N() {
325
331
  className: "pointer-events-none absolute inset-2 rounded-full opacity-70 blur-2xl",
326
332
  style: { background: "radial-gradient(circle, color-mix(in srgb, var(--color-action-primary-bg) 26%, transparent), transparent 70%)" }
327
333
  }), /* @__PURE__ */ k(ue, {
328
- value: xe,
334
+ value: Ce,
329
335
  size: 188,
330
336
  stroke: 16,
331
337
  children: [
332
338
  /* @__PURE__ */ O("span", {
333
339
  className: "text-[11px] font-medium uppercase tracking-wide text-text-tertiary",
334
- children: "Calories"
340
+ children: b("mybodyshield.pages.dashboard.calories", "Calories")
335
341
  }),
336
342
  /* @__PURE__ */ O("span", {
337
343
  className: "text-3xl font-bold tabular-nums text-text-primary",
@@ -351,32 +357,35 @@ function N() {
351
357
  className: "flex-1 space-y-4",
352
358
  children: [/* @__PURE__ */ k("div", {
353
359
  className: "space-y-2",
354
- children: [/* @__PURE__ */ O(ce, {
360
+ children: [/* @__PURE__ */ O(le, {
355
361
  proteinG: $.proteinG,
356
362
  carbsG: $.carbsG,
357
363
  fatG: $.fatG,
358
364
  height: 12
359
- }), /* @__PURE__ */ O(le, {})]
365
+ }), /* @__PURE__ */ O(g, {})]
360
366
  }), /* @__PURE__ */ O("div", {
361
367
  className: "grid grid-cols-3 gap-3",
362
368
  children: [
363
369
  [
370
+ "mybodyshield.pages.dashboard.protein",
364
371
  "Protein",
365
372
  $.proteinG,
366
373
  $.proteinTarget
367
374
  ],
368
375
  [
376
+ "mybodyshield.pages.dashboard.carbs",
369
377
  "Carbs",
370
378
  $.carbsG,
371
379
  $.carbsTarget
372
380
  ],
373
381
  [
382
+ "mybodyshield.pages.dashboard.fat",
374
383
  "Fat",
375
384
  $.fatG,
376
385
  $.fatTarget
377
386
  ]
378
- ].map(([e, t, n]) => {
379
- let r = n ? t / n * 100 : 0;
387
+ ].map(([e, t, n, r]) => {
388
+ let o = r ? n / r * 100 : 0;
380
389
  return /* @__PURE__ */ k("div", {
381
390
  className: "rounded-2xl bg-bg-sunken/60 p-3 ring-1 ring-inset ring-border-seam/40 transition-shadow hover:shadow-float",
382
391
  children: [
@@ -384,26 +393,26 @@ function N() {
384
393
  className: "flex items-center justify-between gap-1",
385
394
  children: [/* @__PURE__ */ O("p", {
386
395
  className: "text-xs font-medium text-text-tertiary",
387
- children: e
396
+ children: b(e, t)
388
397
  }), /* @__PURE__ */ O("span", {
389
398
  className: "text-[11px] tabular-nums text-text-tertiary",
390
- children: a(r)
399
+ children: a(o)
391
400
  })]
392
401
  }),
393
402
  /* @__PURE__ */ k("p", {
394
403
  className: "mt-1 text-sm font-semibold tabular-nums text-text-primary",
395
- children: [i(t), /* @__PURE__ */ k("span", {
404
+ children: [i(n), /* @__PURE__ */ k("span", {
396
405
  className: "text-xs font-normal text-text-tertiary",
397
406
  children: [
398
407
  " ",
399
408
  "/ ",
400
- i(n),
409
+ i(r),
401
410
  " g"
402
411
  ]
403
412
  })]
404
413
  }),
405
- /* @__PURE__ */ O(g, {
406
- value: r,
414
+ /* @__PURE__ */ O(_, {
415
+ value: o,
407
416
  height: 5,
408
417
  className: "mt-2"
409
418
  })
@@ -416,7 +425,7 @@ function N() {
416
425
  })
417
426
  }), /* @__PURE__ */ O(m.div, {
418
427
  "data-tour": "mybodyshield-dashboard-next-up",
419
- ...N(1),
428
+ ...P(1),
420
429
  children: /* @__PURE__ */ k(A, {
421
430
  treatment: "glass",
422
431
  className: "h-full p-6",
@@ -424,18 +433,22 @@ function N() {
424
433
  className: "mb-4 flex items-center justify-between gap-3",
425
434
  children: [/* @__PURE__ */ O("h2", {
426
435
  className: "text-base font-semibold text-text-primary",
427
- children: "Next up"
436
+ children: b("mybodyshield.pages.dashboard.nextUp", "Next up")
428
437
  }), /* @__PURE__ */ k("button", {
429
438
  type: "button",
430
- onClick: () => y("train"),
439
+ onClick: () => E("train"),
431
440
  className: "inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline",
432
- children: ["Train ", /* @__PURE__ */ O(v, { className: "h-4 w-4" })]
441
+ children: [
442
+ b("mybodyshield.nav.train", "Train"),
443
+ " ",
444
+ /* @__PURE__ */ O(y, { className: "h-4 w-4" })
445
+ ]
433
446
  })]
434
447
  }), K ? /* @__PURE__ */ k(m.button, {
435
448
  type: "button",
436
- onClick: () => y(`train/${K.id}`),
449
+ onClick: () => E(`train/${K.id}`),
437
450
  className: "w-full rounded-2xl border border-status-warning-text/40 bg-status-warning-bg-subtle p-4 text-left transition-shadow hover:shadow-float",
438
- ...F,
451
+ ...I,
439
452
  children: [
440
453
  /* @__PURE__ */ O("div", {
441
454
  className: "flex items-center gap-2",
@@ -443,23 +456,23 @@ function N() {
443
456
  }),
444
457
  /* @__PURE__ */ O("p", {
445
458
  className: "mt-2 text-sm font-medium text-text-primary",
446
- children: "Live workout in progress"
459
+ children: b("mybodyshield.pages.dashboard.liveWorkoutInProgress", "Live workout in progress")
447
460
  }),
448
- /* @__PURE__ */ k("p", {
461
+ /* @__PURE__ */ O("p", {
449
462
  className: "mt-0.5 text-xs text-text-tertiary",
450
- children: ["Started ", o(K.startedAt)]
463
+ children: b("mybodyshield.pages.dashboard.startedAgo", "Started {{time}}", { time: o(K.startedAt) })
451
464
  })
452
465
  ]
453
466
  }) : q ? /* @__PURE__ */ O(m.button, {
454
467
  type: "button",
455
- onClick: () => y(`train/${q.id}`),
468
+ onClick: () => E(`train/${q.id}`),
456
469
  className: "w-full rounded-2xl bg-bg-sunken/60 p-4 text-left ring-1 ring-inset ring-border-seam/40 transition-shadow hover:shadow-float",
457
- ...F,
470
+ ...I,
458
471
  children: /* @__PURE__ */ k("div", {
459
472
  className: "flex items-center gap-2",
460
- children: [/* @__PURE__ */ O(h, { icon: /* @__PURE__ */ O(b, { className: "h-4 w-4" }) }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
473
+ children: [/* @__PURE__ */ O(h, { icon: /* @__PURE__ */ O(pe, { className: "h-4 w-4" }) }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
461
474
  className: "text-sm font-medium text-text-primary",
462
- children: "Scheduled session"
475
+ children: b("mybodyshield.pages.dashboard.scheduledSession", "Scheduled session")
463
476
  }), /* @__PURE__ */ O("p", {
464
477
  className: "text-xs text-text-tertiary",
465
478
  children: o(q.scheduledFor)
@@ -470,48 +483,52 @@ function N() {
470
483
  children: [
471
484
  /* @__PURE__ */ O("span", {
472
485
  className: "flex size-11 items-center justify-center rounded-full bg-[var(--color-accent-soft)]",
473
- children: /* @__PURE__ */ O(S, { className: "h-5 w-5 text-accent" })
486
+ children: /* @__PURE__ */ O(C, { className: "h-5 w-5 text-accent" })
474
487
  }),
475
488
  /* @__PURE__ */ O("p", {
476
489
  className: "mt-3 text-sm font-medium text-text-primary",
477
- children: "No session scheduled"
490
+ children: b("mybodyshield.pages.dashboard.noSessionScheduled", "No session scheduled")
478
491
  }),
479
492
  /* @__PURE__ */ O("button", {
480
493
  type: "button",
481
- onClick: () => y("train"),
494
+ onClick: () => E("train"),
482
495
  className: "mt-1 text-xs font-medium text-accent hover:underline",
483
- children: "Start a workout"
496
+ children: b("mybodyshield.pages.dashboard.startWorkout", "Start a workout")
484
497
  })
485
498
  ]
486
499
  })]
487
500
  })
488
501
  })]
489
502
  }),
490
- /* @__PURE__ */ O(u, {
503
+ /* @__PURE__ */ O(p, {
491
504
  "data-tour": "mybodyshield-dashboard-active-goals",
492
- title: "Active goals",
493
- description: "Your current targets across training, nutrition and body composition.",
505
+ title: b("mybodyshield.pages.dashboard.activeGoalsSection", "Active goals"),
506
+ description: b("mybodyshield.pages.dashboard.activeGoalsDescription", "Your current targets across training, nutrition and body composition."),
494
507
  action: /* @__PURE__ */ k("button", {
495
508
  type: "button",
496
- onClick: () => y("goals"),
509
+ onClick: () => E("goals"),
497
510
  className: "inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline",
498
- children: ["All goals ", /* @__PURE__ */ O(v, { className: "h-4 w-4" })]
511
+ children: [
512
+ b("mybodyshield.pages.dashboard.allGoals", "All goals"),
513
+ " ",
514
+ /* @__PURE__ */ O(y, { className: "h-4 w-4" })
515
+ ]
499
516
  }),
500
- children: H.length === 0 ? /* @__PURE__ */ O(l, {
517
+ children: U.length === 0 ? /* @__PURE__ */ O(l, {
501
518
  illustration: "empty-data",
502
519
  icon: /* @__PURE__ */ O(T, { className: "h-10 w-10" }),
503
- title: "No active goals",
504
- description: "Set a goal to give your training and nutrition a clear target to work toward."
520
+ title: b("mybodyshield.pages.dashboard.noActiveGoals", "No active goals"),
521
+ description: b("mybodyshield.pages.dashboard.noActiveGoalsDescription", "Set a goal to give your training and nutrition a clear target to work toward.")
505
522
  }) : /* @__PURE__ */ O("div", {
506
523
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
507
- children: H.slice(0, 6).map((e, t) => {
508
- let n = _(e), o = se[e.type], s = o.icon;
524
+ children: U.slice(0, 6).map((e, t) => {
525
+ let n = v(e), o = ce[e.type], s = o.icon;
509
526
  return /* @__PURE__ */ O(m.button, {
510
527
  type: "button",
511
- onClick: () => y("goals"),
528
+ onClick: () => E("goals"),
512
529
  className: "text-left",
513
- ...N(t),
514
- ...F,
530
+ ...P(t),
531
+ ...I,
515
532
  children: /* @__PURE__ */ k(A, {
516
533
  treatment: "plain",
517
534
  className: "h-full p-4 transition-shadow hover:shadow-float",
@@ -532,7 +549,7 @@ function N() {
532
549
  })]
533
550
  }), /* @__PURE__ */ k("div", {
534
551
  className: "mt-3 space-y-1.5",
535
- children: [/* @__PURE__ */ O(g, { value: n }), /* @__PURE__ */ k("div", {
552
+ children: [/* @__PURE__ */ O(_, { value: n }), /* @__PURE__ */ k("div", {
536
553
  className: "flex items-center justify-between text-xs",
537
554
  children: [/* @__PURE__ */ k("span", {
538
555
  className: "tabular-nums text-text-secondary",
@@ -554,31 +571,35 @@ function N() {
554
571
  })
555
572
  })
556
573
  }),
557
- /* @__PURE__ */ O(u, {
574
+ /* @__PURE__ */ O(p, {
558
575
  "data-tour": "mybodyshield-dashboard-recent-sessions",
559
- title: "Recent sessions",
560
- description: "Your latest logged and scheduled workouts.",
576
+ title: b("mybodyshield.pages.dashboard.recentSessions", "Recent sessions"),
577
+ description: b("mybodyshield.pages.dashboard.recentSessionsDescription", "Your latest logged and scheduled workouts."),
561
578
  action: /* @__PURE__ */ k("button", {
562
579
  type: "button",
563
- onClick: () => y("train"),
580
+ onClick: () => E("train"),
564
581
  className: "inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline",
565
- children: ["All sessions ", /* @__PURE__ */ O(v, { className: "h-4 w-4" })]
582
+ children: [
583
+ b("mybodyshield.pages.dashboard.allSessions", "All sessions"),
584
+ " ",
585
+ /* @__PURE__ */ O(y, { className: "h-4 w-4" })
586
+ ]
566
587
  }),
567
- children: V.length === 0 ? /* @__PURE__ */ O(l, {
588
+ children: H.length === 0 ? /* @__PURE__ */ O(l, {
568
589
  illustration: "empty-data",
569
- icon: /* @__PURE__ */ O(S, { className: "h-10 w-10" }),
570
- title: "No sessions yet",
571
- description: "Start a workout session to begin logging sets and tracking your training."
590
+ icon: /* @__PURE__ */ O(C, { className: "h-10 w-10" }),
591
+ title: b("mybodyshield.pages.dashboard.noSessions", "No sessions yet"),
592
+ description: b("mybodyshield.pages.dashboard.noSessionsDescription", "Start a workout session to begin logging sets and tracking your training.")
572
593
  }) : /* @__PURE__ */ O("div", {
573
594
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
574
- children: V.slice(0, 6).map((e, t) => {
595
+ children: H.slice(0, 6).map((e, t) => {
575
596
  let n = de.STRENGTH, r = e.status === "COMPLETED" ? x : n.icon;
576
597
  return /* @__PURE__ */ O(m.button, {
577
598
  type: "button",
578
- onClick: () => y(`train/${e.id}`),
599
+ onClick: () => E(`train/${e.id}`),
579
600
  className: "text-left",
580
- ...N(t),
581
- ...F,
601
+ ...P(t),
602
+ ...I,
582
603
  children: /* @__PURE__ */ k(A, {
583
604
  treatment: "plain",
584
605
  className: "p-4 transition-shadow hover:shadow-float",
@@ -592,7 +613,7 @@ function N() {
592
613
  }),
593
614
  /* @__PURE__ */ O("p", {
594
615
  className: "mt-3 text-sm font-medium text-text-primary",
595
- children: e.caloriesBurned > 0 ? `${i(e.caloriesBurned)} kcal burned` : "Workout session"
616
+ children: e.caloriesBurned > 0 ? b("mybodyshield.pages.dashboard.kcalBurned", "{{kcal}} kcal burned", { kcal: i(e.caloriesBurned) }) : b("mybodyshield.pages.dashboard.workoutSession", "Workout session")
596
617
  }),
597
618
  /* @__PURE__ */ O("p", {
598
619
  className: "mt-0.5 text-xs text-text-tertiary",