@burdenoff/microfe-mybodyshield 2026.705.1 → 2026.706.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 (591) hide show
  1. package/dist/_virtual/__vite-optional-peer-dep_@emotion/is-prop-valid_framer-motion.js +10 -0
  2. package/dist/_virtual/__vite-optional-peer-dep_@emotion/is-prop-valid_framer-motion.js.map +1 -0
  3. package/dist/_virtual/_rolldown/runtime.js +5 -5
  4. package/dist/mybodyshield/components/DataTable.js +8 -4
  5. package/dist/mybodyshield/components/DataTable.js.map +1 -1
  6. package/dist/mybodyshield/components/EvidenceUpload.js +92 -4
  7. package/dist/mybodyshield/components/EvidenceUpload.js.map +1 -0
  8. package/dist/mybodyshield/components/FileLink.js +35 -2
  9. package/dist/mybodyshield/components/FileLink.js.map +1 -0
  10. package/dist/mybodyshield/components/MybDiscussion.js +107 -6
  11. package/dist/mybodyshield/components/MybDiscussion.js.map +1 -0
  12. package/dist/mybodyshield/components/MybTags.js +148 -4
  13. package/dist/mybodyshield/components/MybTags.js.map +1 -0
  14. package/dist/mybodyshield/components/Pagination.js.map +1 -1
  15. package/dist/mybodyshield/components/UserSearchSelect.js +148 -0
  16. package/dist/mybodyshield/components/UserSearchSelect.js.map +1 -0
  17. package/dist/mybodyshield/components/index.js +1 -0
  18. package/dist/mybodyshield/hooks/index.js +1 -0
  19. package/dist/mybodyshield/hooks/useMyBodyShieldApi.js +47 -27
  20. package/dist/mybodyshield/hooks/useMyBodyShieldApi.js.map +1 -1
  21. package/dist/mybodyshield/hooks/useMybComments.js +44 -2
  22. package/dist/mybodyshield/hooks/useMybComments.js.map +1 -0
  23. package/dist/mybodyshield/hooks/useMybFiles.js +80 -3
  24. package/dist/mybodyshield/hooks/useMybFiles.js.map +1 -0
  25. package/dist/mybodyshield/hooks/useMybTags.js +88 -2
  26. package/dist/mybodyshield/hooks/useMybTags.js.map +1 -0
  27. package/dist/mybodyshield/hooks/useMybUsers.js +36 -0
  28. package/dist/mybodyshield/hooks/useMybUsers.js.map +1 -0
  29. package/dist/mybodyshield/pages/DashboardPage.js +444 -340
  30. package/dist/mybodyshield/pages/DashboardPage.js.map +1 -1
  31. package/dist/mybodyshield/pages/_shared/visuals.js +29 -23
  32. package/dist/mybodyshield/pages/_shared/visuals.js.map +1 -1
  33. package/dist/mybodyshield/pages/coaching/CoachingPage.js +272 -179
  34. package/dist/mybodyshield/pages/coaching/CoachingPage.js.map +1 -1
  35. package/dist/mybodyshield/pages/goals/GoalsPage.js +304 -257
  36. package/dist/mybodyshield/pages/goals/GoalsPage.js.map +1 -1
  37. package/dist/mybodyshield/pages/nutrition/NutritionPage.js +745 -504
  38. package/dist/mybodyshield/pages/nutrition/NutritionPage.js.map +1 -1
  39. package/dist/mybodyshield/pages/programs/ProgramDetailPage.js +688 -320
  40. package/dist/mybodyshield/pages/programs/ProgramDetailPage.js.map +1 -1
  41. package/dist/mybodyshield/pages/programs/ProgramsPage.js +282 -234
  42. package/dist/mybodyshield/pages/programs/ProgramsPage.js.map +1 -1
  43. package/dist/mybodyshield/pages/progress/ProgressPage.js +447 -299
  44. package/dist/mybodyshield/pages/progress/ProgressPage.js.map +1 -1
  45. package/dist/mybodyshield/pages/recovery/RecoveryPage.js +335 -246
  46. package/dist/mybodyshield/pages/recovery/RecoveryPage.js.map +1 -1
  47. package/dist/mybodyshield/pages/train/SessionDetailPage.js +380 -267
  48. package/dist/mybodyshield/pages/train/SessionDetailPage.js.map +1 -1
  49. package/dist/mybodyshield/pages/train/SessionsPage.js +111 -78
  50. package/dist/mybodyshield/pages/train/SessionsPage.js.map +1 -1
  51. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.js +63 -0
  52. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.js.map +1 -0
  53. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.js +55 -0
  54. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.js.map +1 -0
  55. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.js +62 -0
  56. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.js.map +1 -0
  57. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js +22 -0
  58. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js.map +1 -0
  59. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/utils.js +13 -0
  60. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/utils.js.map +1 -0
  61. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js +8 -0
  62. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js.map +1 -0
  63. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js +8 -0
  64. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js.map +1 -0
  65. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js +12 -0
  66. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js.map +1 -0
  67. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js +19 -0
  68. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js.map +1 -0
  69. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js +8 -0
  70. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js.map +1 -0
  71. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js +17 -0
  72. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js.map +1 -0
  73. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js +8 -0
  74. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js.map +1 -0
  75. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js +8 -0
  76. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js.map +1 -0
  77. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js +10 -0
  78. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js.map +1 -0
  79. package/dist/node_modules/framer-motion/dist/es/events/event-info.js +13 -0
  80. package/dist/node_modules/framer-motion/dist/es/events/event-info.js.map +1 -0
  81. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js +260 -0
  82. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js.map +1 -0
  83. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js +24 -0
  84. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js.map +1 -0
  85. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js +61 -0
  86. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js.map +1 -0
  87. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js +29 -0
  88. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js.map +1 -0
  89. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js +22 -0
  90. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js.map +1 -0
  91. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js +140 -0
  92. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js.map +1 -0
  93. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js +44 -0
  94. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js.map +1 -0
  95. package/dist/node_modules/framer-motion/dist/es/gestures/press.js +28 -0
  96. package/dist/node_modules/framer-motion/dist/es/gestures/press.js.map +1 -0
  97. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js +41 -0
  98. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js.map +1 -0
  99. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js +27 -0
  100. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js.map +1 -0
  101. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js +11 -0
  102. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js.map +1 -0
  103. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js +53 -0
  104. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js.map +1 -0
  105. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js +17 -0
  106. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js.map +1 -0
  107. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js +15 -0
  108. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js.map +1 -0
  109. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js +63 -0
  110. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js.map +1 -0
  111. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js +11 -0
  112. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js.map +1 -0
  113. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js +15 -0
  114. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js.map +1 -0
  115. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js +48 -0
  116. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js.map +1 -0
  117. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js +26 -0
  118. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js.map +1 -0
  119. package/dist/node_modules/framer-motion/dist/es/motion/index.js +72 -0
  120. package/dist/node_modules/framer-motion/dist/es/motion/index.js.map +1 -0
  121. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js +6 -0
  122. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js.map +1 -0
  123. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js +23 -0
  124. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js.map +1 -0
  125. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js +60 -0
  126. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js.map +1 -0
  127. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js +52 -0
  128. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js.map +1 -0
  129. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js +9 -0
  130. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js.map +1 -0
  131. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js +12 -0
  132. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js.map +1 -0
  133. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js +15 -0
  134. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js.map +1 -0
  135. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js +9 -0
  136. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js.map +1 -0
  137. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js +10 -0
  138. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js.map +1 -0
  139. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js +23 -0
  140. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js.map +1 -0
  141. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js +21 -0
  142. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js.map +1 -0
  143. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js +9 -0
  144. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js.map +1 -0
  145. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js +13 -0
  146. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js.map +1 -0
  147. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js +28 -0
  148. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js.map +1 -0
  149. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js +11 -0
  150. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js.map +1 -0
  151. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js +32 -0
  152. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js.map +1 -0
  153. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js +28 -0
  154. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js.map +1 -0
  155. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js +13 -0
  156. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js.map +1 -0
  157. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js +10 -0
  158. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js.map +1 -0
  159. package/dist/node_modules/framer-motion/dist/es/utils/distance.js +10 -0
  160. package/dist/node_modules/framer-motion/dist/es/utils/distance.js.map +1 -0
  161. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js +6 -0
  162. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js.map +1 -0
  163. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js +6 -0
  164. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js.map +1 -0
  165. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js +8 -0
  166. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js.map +1 -0
  167. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  168. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  169. package/dist/node_modules/framer-motion/dist/es/utils/use-composed-ref.js +27 -0
  170. package/dist/node_modules/framer-motion/dist/es/utils/use-composed-ref.js.map +1 -0
  171. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js +11 -0
  172. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js.map +1 -0
  173. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js +9 -0
  174. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js.map +1 -0
  175. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js +109 -0
  176. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js.map +1 -0
  177. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js +131 -0
  178. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js.map +1 -0
  179. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js +86 -0
  180. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js.map +1 -0
  181. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js +30 -0
  182. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js.map +1 -0
  183. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js +12 -0
  184. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js.map +1 -0
  185. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js +15 -0
  186. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js.map +1 -0
  187. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js +34 -0
  188. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js.map +1 -0
  189. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js +24 -0
  190. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js.map +1 -0
  191. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js +168 -0
  192. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js.map +1 -0
  193. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js +11 -0
  194. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js.map +1 -0
  195. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js +18 -0
  196. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js.map +1 -0
  197. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js +8 -0
  198. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js.map +1 -0
  199. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js +11 -0
  200. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js.map +1 -0
  201. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js +47 -0
  202. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js.map +1 -0
  203. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js +59 -0
  204. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js.map +1 -0
  205. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js +28 -0
  206. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js.map +1 -0
  207. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js +23 -0
  208. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js.map +1 -0
  209. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js +63 -0
  210. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js.map +1 -0
  211. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js +69 -0
  212. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js.map +1 -0
  213. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js +10 -0
  214. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js.map +1 -0
  215. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js +10 -0
  216. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js.map +1 -0
  217. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js +14 -0
  218. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js.map +1 -0
  219. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js +8 -0
  220. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js.map +1 -0
  221. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js +8 -0
  222. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js.map +1 -0
  223. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js +9 -0
  224. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js.map +1 -0
  225. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js +20 -0
  226. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js.map +1 -0
  227. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js +38 -0
  228. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js.map +1 -0
  229. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js +6 -0
  230. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js.map +1 -0
  231. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js +9 -0
  232. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js.map +1 -0
  233. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js +24 -0
  234. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js.map +1 -0
  235. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js +9 -0
  236. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js.map +1 -0
  237. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js +20 -0
  238. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js.map +1 -0
  239. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js +27 -0
  240. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js.map +1 -0
  241. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js +29 -0
  242. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js.map +1 -0
  243. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js +10 -0
  244. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js.map +1 -0
  245. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js +7 -0
  246. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js.map +1 -0
  247. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js +9 -0
  248. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js.map +1 -0
  249. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js +21 -0
  250. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js.map +1 -0
  251. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js +8 -0
  252. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js.map +1 -0
  253. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js +18 -0
  254. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js.map +1 -0
  255. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js +15 -0
  256. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js.map +1 -0
  257. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js +6 -0
  258. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js.map +1 -0
  259. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js +13 -0
  260. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js.map +1 -0
  261. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js +37 -0
  262. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js.map +1 -0
  263. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js +21 -0
  264. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js.map +1 -0
  265. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js +26 -0
  266. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js.map +1 -0
  267. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js +11 -0
  268. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js.map +1 -0
  269. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js +10 -0
  270. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js.map +1 -0
  271. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js +10 -0
  272. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js.map +1 -0
  273. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js +10 -0
  274. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js.map +1 -0
  275. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js +19 -0
  276. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js.map +1 -0
  277. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js +8 -0
  278. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js.map +1 -0
  279. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js +32 -0
  280. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js.map +1 -0
  281. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js +8 -0
  282. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js.map +1 -0
  283. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js +7 -0
  284. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js.map +1 -0
  285. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js +15 -0
  286. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js.map +1 -0
  287. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js +34 -0
  288. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js.map +1 -0
  289. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js +17 -0
  290. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js.map +1 -0
  291. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js +12 -0
  292. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js.map +1 -0
  293. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js +13 -0
  294. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js.map +1 -0
  295. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js +38 -0
  296. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js.map +1 -0
  297. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js +38 -0
  298. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js.map +1 -0
  299. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js +23 -0
  300. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js.map +1 -0
  301. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js +30 -0
  302. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js.map +1 -0
  303. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js +6 -0
  304. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js.map +1 -0
  305. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js +6 -0
  306. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js.map +1 -0
  307. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js +6 -0
  308. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js.map +1 -0
  309. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js +18 -0
  310. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js.map +1 -0
  311. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js +27 -0
  312. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js.map +1 -0
  313. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js +41 -0
  314. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js.map +1 -0
  315. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js +14 -0
  316. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js.map +1 -0
  317. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js +45 -0
  318. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js.map +1 -0
  319. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js +32 -0
  320. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js.map +1 -0
  321. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js +31 -0
  322. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js.map +1 -0
  323. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js +20 -0
  324. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js.map +1 -0
  325. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js +30 -0
  326. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js.map +1 -0
  327. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js +15 -0
  328. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js.map +1 -0
  329. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js +24 -0
  330. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js.map +1 -0
  331. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js +586 -0
  332. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js.map +1 -0
  333. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js +9 -0
  334. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js.map +1 -0
  335. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js +53 -0
  336. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js.map +1 -0
  337. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js +15 -0
  338. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js.map +1 -0
  339. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js +15 -0
  340. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js.map +1 -0
  341. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js +19 -0
  342. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js.map +1 -0
  343. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js +14 -0
  344. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js.map +1 -0
  345. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js +6 -0
  346. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js.map +1 -0
  347. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js +8 -0
  348. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js.map +1 -0
  349. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js +21 -0
  350. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js.map +1 -0
  351. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js +20 -0
  352. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js.map +1 -0
  353. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js +14 -0
  354. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js.map +1 -0
  355. package/dist/node_modules/motion-dom/dist/es/render/Feature.js +11 -0
  356. package/dist/node_modules/motion-dom/dist/es/render/Feature.js.map +1 -0
  357. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js +206 -0
  358. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js.map +1 -0
  359. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js +30 -0
  360. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js.map +1 -0
  361. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js +6 -0
  362. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js.map +1 -0
  363. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js +58 -0
  364. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js.map +1 -0
  365. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js +9 -0
  366. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js.map +1 -0
  367. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js +8 -0
  368. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js.map +1 -0
  369. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js +37 -0
  370. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js.map +1 -0
  371. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js +30 -0
  372. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js.map +1 -0
  373. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js +38 -0
  374. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js.map +1 -0
  375. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js +10 -0
  376. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js.map +1 -0
  377. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js +13 -0
  378. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js.map +1 -0
  379. package/dist/node_modules/motion-dom/dist/es/render/store.js +6 -0
  380. package/dist/node_modules/motion-dom/dist/es/render/store.js.map +1 -0
  381. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js +42 -0
  382. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js.map +1 -0
  383. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js +24 -0
  384. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js.map +1 -0
  385. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js +30 -0
  386. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js.map +1 -0
  387. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js +6 -0
  388. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js.map +1 -0
  389. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js +17 -0
  390. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js.map +1 -0
  391. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js +12 -0
  392. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js.map +1 -0
  393. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js +16 -0
  394. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js.map +1 -0
  395. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js +137 -0
  396. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js.map +1 -0
  397. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js +21 -0
  398. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js.map +1 -0
  399. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js +8 -0
  400. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js.map +1 -0
  401. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js +14 -0
  402. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js.map +1 -0
  403. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js +10 -0
  404. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js.map +1 -0
  405. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js +6 -0
  406. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js.map +1 -0
  407. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js +8 -0
  408. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js.map +1 -0
  409. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js +15 -0
  410. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js.map +1 -0
  411. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js +24 -0
  412. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js.map +1 -0
  413. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js +23 -0
  414. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js.map +1 -0
  415. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js +13 -0
  416. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js.map +1 -0
  417. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js +6 -0
  418. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js.map +1 -0
  419. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js +10 -0
  420. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js.map +1 -0
  421. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js +22 -0
  422. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js.map +1 -0
  423. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js +22 -0
  424. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js.map +1 -0
  425. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js +12 -0
  426. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js.map +1 -0
  427. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js +14 -0
  428. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js.map +1 -0
  429. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js +39 -0
  430. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js.map +1 -0
  431. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js +24 -0
  432. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js.map +1 -0
  433. package/dist/node_modules/motion-dom/dist/es/resize/index.js +10 -0
  434. package/dist/node_modules/motion-dom/dist/es/resize/index.js.map +1 -0
  435. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js +9 -0
  436. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js.map +1 -0
  437. package/dist/node_modules/motion-dom/dist/es/utils/border-radius.js +11 -0
  438. package/dist/node_modules/motion-dom/dist/es/utils/border-radius.js.map +1 -0
  439. package/dist/node_modules/motion-dom/dist/es/utils/delay.js +14 -0
  440. package/dist/node_modules/motion-dom/dist/es/utils/delay.js.map +1 -0
  441. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js +35 -0
  442. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js.map +1 -0
  443. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js +9 -0
  444. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js.map +1 -0
  445. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js +9 -0
  446. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js.map +1 -0
  447. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js +9 -0
  448. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js.map +1 -0
  449. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js +32 -0
  450. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js.map +1 -0
  451. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js +54 -0
  452. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js.map +1 -0
  453. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js +8 -0
  454. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js.map +1 -0
  455. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js +10 -0
  456. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js.map +1 -0
  457. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js +6 -0
  458. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js.map +1 -0
  459. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js +9 -0
  460. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js.map +1 -0
  461. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js +16 -0
  462. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js.map +1 -0
  463. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js +6 -0
  464. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js.map +1 -0
  465. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js +14 -0
  466. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js.map +1 -0
  467. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js +11 -0
  468. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js.map +1 -0
  469. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js +7 -0
  470. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js.map +1 -0
  471. package/dist/node_modules/motion-dom/dist/es/value/index.js +94 -0
  472. package/dist/node_modules/motion-dom/dist/es/value/index.js.map +1 -0
  473. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js +9 -0
  474. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js.map +1 -0
  475. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js +21 -0
  476. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js.map +1 -0
  477. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js +23 -0
  478. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js.map +1 -0
  479. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js +14 -0
  480. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js.map +1 -0
  481. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js +17 -0
  482. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js.map +1 -0
  483. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js +17 -0
  484. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js.map +1 -0
  485. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js +18 -0
  486. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js.map +1 -0
  487. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js +28 -0
  488. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js.map +1 -0
  489. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js +54 -0
  490. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js.map +1 -0
  491. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js +16 -0
  492. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js.map +1 -0
  493. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js +18 -0
  494. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js.map +1 -0
  495. package/dist/node_modules/motion-dom/dist/es/value/types/int.js +10 -0
  496. package/dist/node_modules/motion-dom/dist/es/value/types/int.js.map +1 -0
  497. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js +26 -0
  498. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js.map +1 -0
  499. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js +66 -0
  500. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js.map +1 -0
  501. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js +34 -0
  502. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js.map +1 -0
  503. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js +17 -0
  504. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js.map +1 -0
  505. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js +14 -0
  506. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js.map +1 -0
  507. package/dist/node_modules/motion-dom/dist/es/value/types/test.js +6 -0
  508. package/dist/node_modules/motion-dom/dist/es/value/types/test.js.map +1 -0
  509. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js +14 -0
  510. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js.map +1 -0
  511. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js +6 -0
  512. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js.map +1 -0
  513. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js +14 -0
  514. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js.map +1 -0
  515. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js +6 -0
  516. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js.map +1 -0
  517. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js +6 -0
  518. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js.map +1 -0
  519. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js +8 -0
  520. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js.map +1 -0
  521. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js +6 -0
  522. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js.map +1 -0
  523. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js +6 -0
  524. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js.map +1 -0
  525. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js +6 -0
  526. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js.map +1 -0
  527. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js +9 -0
  528. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js.map +1 -0
  529. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js +15 -0
  530. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js.map +1 -0
  531. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js +9 -0
  532. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js.map +1 -0
  533. package/dist/node_modules/motion-utils/dist/es/array.js +12 -0
  534. package/dist/node_modules/motion-utils/dist/es/array.js.map +1 -0
  535. package/dist/node_modules/motion-utils/dist/es/clamp.js +6 -0
  536. package/dist/node_modules/motion-utils/dist/es/clamp.js.map +1 -0
  537. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js +7 -0
  538. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js.map +1 -0
  539. package/dist/node_modules/motion-utils/dist/es/easing/back.js +9 -0
  540. package/dist/node_modules/motion-utils/dist/es/easing/back.js.map +1 -0
  541. package/dist/node_modules/motion-utils/dist/es/easing/circ.js +8 -0
  542. package/dist/node_modules/motion-utils/dist/es/easing/circ.js.map +1 -0
  543. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js +20 -0
  544. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js.map +1 -0
  545. package/dist/node_modules/motion-utils/dist/es/easing/ease.js +7 -0
  546. package/dist/node_modules/motion-utils/dist/es/easing/ease.js.map +1 -0
  547. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js +6 -0
  548. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js.map +1 -0
  549. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js +6 -0
  550. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js.map +1 -0
  551. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js +6 -0
  552. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js.map +1 -0
  553. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js +6 -0
  554. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js.map +1 -0
  555. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js +33 -0
  556. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js.map +1 -0
  557. package/dist/node_modules/motion-utils/dist/es/errors.js +12 -0
  558. package/dist/node_modules/motion-utils/dist/es/errors.js.map +1 -0
  559. package/dist/node_modules/motion-utils/dist/es/format-error-message.js +8 -0
  560. package/dist/node_modules/motion-utils/dist/es/format-error-message.js.map +1 -0
  561. package/dist/node_modules/motion-utils/dist/es/global-config.js +6 -0
  562. package/dist/node_modules/motion-utils/dist/es/global-config.js.map +1 -0
  563. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js +6 -0
  564. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js.map +1 -0
  565. package/dist/node_modules/motion-utils/dist/es/is-object.js +6 -0
  566. package/dist/node_modules/motion-utils/dist/es/is-object.js.map +1 -0
  567. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js +6 -0
  568. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js.map +1 -0
  569. package/dist/node_modules/motion-utils/dist/es/memo.js +10 -0
  570. package/dist/node_modules/motion-utils/dist/es/memo.js.map +1 -0
  571. package/dist/node_modules/motion-utils/dist/es/noop.js +6 -0
  572. package/dist/node_modules/motion-utils/dist/es/noop.js.map +1 -0
  573. package/dist/node_modules/motion-utils/dist/es/pipe.js +6 -0
  574. package/dist/node_modules/motion-utils/dist/es/pipe.js.map +1 -0
  575. package/dist/node_modules/motion-utils/dist/es/progress.js +9 -0
  576. package/dist/node_modules/motion-utils/dist/es/progress.js.map +1 -0
  577. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js +28 -0
  578. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js.map +1 -0
  579. package/dist/node_modules/motion-utils/dist/es/time-conversion.js +6 -0
  580. package/dist/node_modules/motion-utils/dist/es/time-conversion.js.map +1 -0
  581. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js +6 -0
  582. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js.map +1 -0
  583. package/dist/node_modules/motion-utils/dist/es/warn-once.js +10 -0
  584. package/dist/node_modules/motion-utils/dist/es/warn-once.js.map +1 -0
  585. package/dist/node_modules/recharts/es6/cartesian/Area.js +435 -0
  586. package/dist/node_modules/recharts/es6/cartesian/Area.js.map +1 -0
  587. package/dist/node_modules/recharts/es6/chart/{LineChart.js → AreaChart.js} +5 -5
  588. package/dist/node_modules/recharts/es6/chart/{LineChart.js.map → AreaChart.js.map} +1 -1
  589. package/package.json +2 -2
  590. package/dist/node_modules/recharts/es6/cartesian/Line.js +0 -473
  591. package/dist/node_modules/recharts/es6/cartesian/Line.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/mybodyshield/pages/DashboardPage.tsx"],"sourcesContent":["/**\n * Dashboard — MyBodyShield health & fitness overview.\n * @module mybodyshield/pages\n *\n * KPIs are aggregated client-side from the real `myb*` list endpoints:\n * active programs, this-week's sessions, goal progress, today's macros vs\n * target, latest body weight and recovery readiness. No mock data.\n */\n\nimport { useMemo } from 'react';\nimport {\n Dumbbell,\n Flame,\n Target,\n Salad,\n Moon,\n ArrowRight,\n CheckCircle2,\n Weight,\n CalendarCheck,\n} from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { MetricsCard } from '../components/MetricsCard';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { MiniBar } from '../components/MiniBar';\nimport { LoadingView, Section } from '../components/StateViews';\nimport { EmptyState } from '../components/EmptyState';\nimport {\n Meter,\n ProgressRing,\n MacroBar,\n MacroLegend,\n IconChip,\n GOAL_TYPE_META,\n RECOVERY_META,\n WORKOUT_TYPE_META,\n computeGoalProgress,\n} from './_shared/visuals';\nimport { useMyBodyShield } from '../context';\nimport {\n useMybPrograms,\n useMybSessions,\n useMybGoals,\n useMybDailyMacros,\n useMybBodyMetrics,\n useMybRecoveryLogs,\n} from '../hooks';\nimport {\n formatNumber,\n formatRelativeTime,\n formatKcal,\n formatWeight,\n formatPercent,\n formatEnumLabel,\n} from '../utils/formatters';\n\nexport function DashboardPage() {\n const { navigateTo, currentUser } = useMyBodyShield();\n\n const programs = useMybPrograms({ status: 'ACTIVE', pagination: { limit: 50 } });\n const sessions = useMybSessions({ pagination: { limit: 20 } });\n const goals = useMybGoals({ status: 'ACTIVE', pagination: { limit: 50 } });\n const macros = useMybDailyMacros();\n const weightMetrics = useMybBodyMetrics({ type: 'WEIGHT', pagination: { limit: 30 } });\n const readiness = useMybRecoveryLogs('READINESS');\n\n const programRows = programs.data?.items ?? [];\n const sessionRows = sessions.data?.items ?? [];\n const goalRows = goals.data?.items ?? [];\n const weightRows = weightMetrics.data?.items ?? [];\n const readinessRows = readiness.data ?? [];\n\n const now = new Date();\n const weekAgo = now.getTime() - 7 * 24 * 60 * 60 * 1000;\n const sessionsThisWeek = sessionRows.filter((s) => {\n const ref = s.completedAt ?? s.startedAt ?? s.scheduledFor ?? s.createdAt;\n return ref ? new Date(ref).getTime() >= weekAgo : false;\n });\n const completedThisWeek = sessionsThisWeek.filter((s) => s.status === 'COMPLETED').length;\n const activeSession = sessionRows.find((s) => s.status === 'IN_PROGRESS');\n const upcomingSession = sessionRows\n .filter((s) => s.status === 'SCHEDULED' && s.scheduledFor)\n .sort((a, b) => new Date(a.scheduledFor!).getTime() - new Date(b.scheduledFor!).getTime())[0];\n\n const latestWeight = weightRows[0];\n const priorWeight = weightRows[1];\n const weightDelta =\n latestWeight && priorWeight ? latestWeight.value - priorWeight.value : undefined;\n\n const latestReadiness = readinessRows\n .slice()\n .sort((a, b) => new Date(b.loggedAt).getTime() - new Date(a.loggedAt).getTime())[0];\n\n const goalProgressAvg = useMemo(() => {\n if (goalRows.length === 0) return 0;\n const sum = goalRows.reduce((acc, g) => acc + computeGoalProgress(g), 0);\n return sum / goalRows.length;\n }, [goalRows]);\n\n const macroData = macros.data;\n const caloriePct = macroData?.calorieTarget\n ? (macroData.calories / macroData.calorieTarget) * 100\n : 0;\n\n const isInitialLoading =\n programs.isLoading && sessions.isLoading && goals.isLoading && macros.isLoading;\n\n if (isInitialLoading) {\n return (\n <PageLayout title=\"MyBodyShield\" titleGradient aurora>\n <LoadingView label=\"Loading your fitness overview…\" />\n </PageLayout>\n );\n }\n\n const greetingName = currentUser?.firstName || currentUser?.name || 'there';\n\n return (\n <PageLayout\n title=\"MyBodyShield\"\n titleGradient\n aurora\n description={`Welcome back, ${greetingName} — your training, nutrition, progress & recovery control room.`}\n >\n {/* KPI grid */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\">\n <MetricsCard\n icon={<Dumbbell className=\"h-5 w-5\" />}\n value={formatNumber(programRows.length)}\n label=\"Active programs\"\n footer={\n <p className=\"text-xs text-text-tertiary\">\n <button\n type=\"button\"\n onClick={() => navigateTo('programs')}\n className=\"font-medium text-accent hover:underline\"\n >\n Manage programs\n </button>\n </p>\n }\n />\n <MetricsCard\n icon={<Flame className=\"h-5 w-5\" />}\n value={formatNumber(completedThisWeek)}\n label=\"Sessions this week\"\n accent={activeSession ? 'warning' : undefined}\n footer={\n activeSession ? (\n <button\n type=\"button\"\n onClick={() => navigateTo(`train/${activeSession.id}`)}\n className=\"text-xs font-medium text-status-warning-text hover:underline\"\n >\n Resume live session →\n </button>\n ) : (\n <p className=\"text-xs text-text-tertiary\">\n <span className=\"tabular-nums text-text-secondary\">{sessionsThisWeek.length}</span>{' '}\n logged\n </p>\n )\n }\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={formatNumber(goalRows.length)}\n label=\"Active goals\"\n footer={\n <div className=\"space-y-2\">\n <MiniBar value={goalProgressAvg} height={4} barClassName=\"bg-accent-teal\" />\n <p className=\"text-xs text-text-tertiary\">\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(goalProgressAvg)}\n </span>{' '}\n avg progress\n </p>\n </div>\n }\n />\n <MetricsCard\n icon={<Weight className=\"h-5 w-5\" />}\n value={latestWeight ? formatWeight(latestWeight.value) : '—'}\n label=\"Latest weight\"\n footer={\n weightDelta != null ? (\n <p className=\"text-xs text-text-tertiary\">\n <span\n className={\n weightDelta <= 0\n ? 'font-medium text-status-success-text'\n : 'font-medium text-text-secondary'\n }\n >\n {weightDelta > 0 ? '+' : ''}\n {weightDelta.toFixed(1)} kg\n </span>{' '}\n vs last\n </p>\n ) : (\n <button\n type=\"button\"\n onClick={() => navigateTo('progress')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n Log a measurement →\n </button>\n )\n }\n />\n <MetricsCard\n icon={<Moon className=\"h-5 w-5\" />}\n value={latestReadiness ? `${latestReadiness.score}` : '—'}\n label=\"Recovery readiness\"\n accent={\n latestReadiness\n ? latestReadiness.score >= 70\n ? 'success'\n : latestReadiness.score >= 40\n ? 'warning'\n : 'error'\n : undefined\n }\n footer={\n latestReadiness ? (\n <p className=\"text-xs text-text-tertiary\">\n {formatRelativeTime(latestReadiness.loggedAt)}\n </p>\n ) : (\n <button\n type=\"button\"\n onClick={() => navigateTo('recovery')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n Log recovery →\n </button>\n )\n }\n />\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Today's nutrition */}\n <GlassCard treatment=\"glass\" className=\"p-6 lg:col-span-2\">\n <div className=\"mb-4 flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h2 className=\"text-base font-semibold text-text-primary\">Today&apos;s nutrition</h2>\n <p className=\"mt-0.5 text-sm text-text-secondary\">\n Calories & macros logged against your active plan.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('nutrition')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n Nutrition <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {!macroData || (macroData.calorieTarget === 0 && macroData.calories === 0) ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Salad className=\"h-10 w-10\" />}\n title=\"No nutrition data yet\"\n description=\"Activate a nutrition plan and log meals to track your daily macros here.\"\n />\n ) : (\n <div className=\"flex flex-col gap-6 sm:flex-row sm:items-center\">\n <ProgressRing value={caloriePct} size={128} stroke={12}>\n <span className=\"text-xl font-bold tabular-nums text-text-primary\">\n {formatNumber(macroData.calories)}\n </span>\n <span className=\"text-xs text-text-tertiary\">\n / {formatNumber(macroData.calorieTarget)} kcal\n </span>\n </ProgressRing>\n <div className=\"flex-1 space-y-4\">\n <div className=\"space-y-2\">\n <MacroBar\n proteinG={macroData.proteinG}\n carbsG={macroData.carbsG}\n fatG={macroData.fatG}\n height={10}\n />\n <MacroLegend />\n </div>\n <div className=\"grid grid-cols-3 gap-3\">\n {(\n [\n ['Protein', macroData.proteinG, macroData.proteinTarget],\n ['Carbs', macroData.carbsG, macroData.carbsTarget],\n ['Fat', macroData.fatG, macroData.fatTarget],\n ] as const\n ).map(([label, val, target]) => (\n <div key={label} className=\"rounded-xl bg-bg-sunken/60 p-3\">\n <p className=\"text-xs text-text-tertiary\">{label}</p>\n <p className=\"mt-0.5 text-sm font-semibold tabular-nums text-text-primary\">\n {formatNumber(val)}\n <span className=\"text-xs font-normal text-text-tertiary\">\n {' '}\n / {formatNumber(target)} g\n </span>\n </p>\n <Meter\n value={target ? (val / target) * 100 : 0}\n height={4}\n className=\"mt-2\"\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </GlassCard>\n\n {/* Next up */}\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">Next up</h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('train')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n Train <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {activeSession ? (\n <button\n type=\"button\"\n onClick={() => navigateTo(`train/${activeSession.id}`)}\n className=\"w-full rounded-xl border border-status-warning-text/40 bg-status-warning-bg-subtle p-4 text-left\"\n >\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={activeSession.status} />\n </div>\n <p className=\"mt-2 text-sm font-medium text-text-primary\">Live workout in progress</p>\n <p className=\"mt-0.5 text-xs text-text-tertiary\">\n Started {formatRelativeTime(activeSession.startedAt)}\n </p>\n </button>\n ) : upcomingSession ? (\n <button\n type=\"button\"\n onClick={() => navigateTo(`train/${upcomingSession.id}`)}\n className=\"w-full rounded-xl bg-bg-sunken/60 p-4 text-left transition-shadow hover:shadow-float\"\n >\n <div className=\"flex items-center gap-2\">\n <IconChip icon={<CalendarCheck className=\"h-4 w-4\" />} />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Scheduled session</p>\n <p className=\"text-xs text-text-tertiary\">\n {formatRelativeTime(upcomingSession.scheduledFor)}\n </p>\n </div>\n </div>\n </button>\n ) : (\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed border-border-seam py-8 text-center\">\n <span className=\"flex size-11 items-center justify-center rounded-full bg-[var(--color-accent-soft)]\">\n <Flame className=\"h-5 w-5 text-accent\" />\n </span>\n <p className=\"mt-3 text-sm font-medium text-text-primary\">No session scheduled</p>\n <button\n type=\"button\"\n onClick={() => navigateTo('train')}\n className=\"mt-1 text-xs font-medium text-accent hover:underline\"\n >\n Start a workout\n </button>\n </div>\n )}\n </GlassCard>\n </div>\n\n {/* Active goals */}\n <Section\n title=\"Active goals\"\n description=\"Your current targets across training, nutrition and body composition.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('goals')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n All goals <ArrowRight className=\"h-4 w-4\" />\n </button>\n }\n >\n {goalRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Target className=\"h-10 w-10\" />}\n title=\"No active goals\"\n description=\"Set a goal to give your training and nutrition a clear target to work toward.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {goalRows.slice(0, 6).map((g) => {\n const pct = computeGoalProgress(g);\n const meta = GOAL_TYPE_META[g.type];\n const Icon = meta.icon;\n return (\n <GlassCard\n key={g.id}\n treatment=\"plain\"\n className=\"p-4 transition-shadow hover:shadow-float\"\n >\n <div className=\"flex items-start gap-3\">\n <IconChip icon={<Icon className=\"h-4 w-4\" />} tint={meta.tint} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-text-primary\">{g.title}</p>\n <p className=\"text-xs text-text-tertiary\">{formatEnumLabel(g.type)}</p>\n </div>\n </div>\n <div className=\"mt-3 space-y-1.5\">\n <Meter value={pct} color={meta.tint} />\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"tabular-nums text-text-secondary\">\n {formatNumber(g.currentValue)}\n {g.unit ? ` ${g.unit}` : ''} / {formatNumber(g.targetValue)}\n {g.unit ? ` ${g.unit}` : ''}\n </span>\n <span className=\"tabular-nums text-text-tertiary\">{formatPercent(pct)}</span>\n </div>\n </div>\n </GlassCard>\n );\n })}\n </div>\n )}\n </Section>\n\n {/* Recent sessions */}\n <Section\n title=\"Recent sessions\"\n description=\"Your latest logged and scheduled workouts.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('train')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n All sessions <ArrowRight className=\"h-4 w-4\" />\n </button>\n }\n >\n {sessionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Flame className=\"h-10 w-10\" />}\n title=\"No sessions yet\"\n description=\"Start a workout session to begin logging sets and tracking your training.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {sessionRows.slice(0, 6).map((s) => {\n const meta = WORKOUT_TYPE_META.STRENGTH;\n const Icon = s.status === 'COMPLETED' ? CheckCircle2 : meta.icon;\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => navigateTo(`train/${s.id}`)}\n className=\"text-left\"\n >\n <GlassCard treatment=\"plain\" className=\"p-4 transition-shadow hover:shadow-float\">\n <div className=\"flex items-center justify-between gap-2\">\n <IconChip icon={<Icon className=\"h-4 w-4\" />} tint={meta.tint} />\n <StatusBadge status={s.status} />\n </div>\n <p className=\"mt-3 text-sm font-medium text-text-primary\">\n {s.caloriesBurned > 0\n ? `${formatNumber(s.caloriesBurned)} kcal burned`\n : 'Workout session'}\n </p>\n <p className=\"mt-0.5 text-xs text-text-tertiary\">\n {formatRelativeTime(s.completedAt ?? s.startedAt ?? s.createdAt)}\n </p>\n </GlassCard>\n </button>\n );\n })}\n </div>\n )}\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/mybodyshield/pages/DashboardPage.tsx"],"sourcesContent":["/**\n * Dashboard — MyBodyShield health & fitness overview.\n * @module mybodyshield/pages\n *\n * KPIs are aggregated client-side from the real `myb*` list endpoints:\n * active programs, this-week's sessions, goal progress, today's macros vs\n * target, latest body weight and recovery readiness. No mock data.\n */\n\nimport { useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport {\n Dumbbell,\n Flame,\n Target,\n Salad,\n Moon,\n ArrowRight,\n CheckCircle2,\n Weight,\n CalendarCheck,\n} from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { MetricsCard } from '../components/MetricsCard';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { MiniBar } from '../components/MiniBar';\nimport { LoadingView, Section } from '../components/StateViews';\nimport { EmptyState } from '../components/EmptyState';\nimport {\n Meter,\n ProgressRing,\n MacroBar,\n MacroLegend,\n IconChip,\n GOAL_TYPE_META,\n RECOVERY_META,\n WORKOUT_TYPE_META,\n computeGoalProgress,\n} from './_shared/visuals';\nimport { useMyBodyShield } from '../context';\nimport {\n useMybPrograms,\n useMybSessions,\n useMybGoals,\n useMybDailyMacros,\n useMybBodyMetrics,\n useMybRecoveryLogs,\n} from '../hooks';\nimport {\n formatNumber,\n formatRelativeTime,\n formatKcal,\n formatWeight,\n formatPercent,\n formatEnumLabel,\n} from '../utils/formatters';\n\n/** Shared easing for entrance / hover motion (smooth ease-out). */\nconst EASE_OUT: [number, number, number, number] = [0.16, 1, 0.3, 1];\n\nexport function DashboardPage() {\n const { navigateTo, currentUser } = useMyBodyShield();\n const reduceMotion = useReducedMotion();\n\n /** Staggered fade/rise entrance — one-shot, skipped under reduced motion. */\n const rise = (i: number) =>\n reduceMotion\n ? {}\n : {\n initial: { opacity: 0, y: 14 },\n whileInView: { opacity: 1, y: 0 },\n viewport: { once: true, amount: 0.15 },\n transition: { duration: 0.45, delay: Math.min(i, 8) * 0.05, ease: EASE_OUT },\n };\n\n /** Gentle hover lift for cards. */\n const lift = reduceMotion\n ? {}\n : { whileHover: { y: -3, transition: { duration: 0.2, ease: EASE_OUT } } };\n\n /** Hover lift + tap feedback for interactive cards. */\n const liftTap = reduceMotion\n ? {}\n : {\n whileHover: { y: -3, transition: { duration: 0.2, ease: EASE_OUT } },\n whileTap: { scale: 0.985 },\n };\n\n const programs = useMybPrograms({ status: 'ACTIVE', pagination: { limit: 50 } });\n const sessions = useMybSessions({ pagination: { limit: 20 } });\n const goals = useMybGoals({ status: 'ACTIVE', pagination: { limit: 50 } });\n const macros = useMybDailyMacros();\n const weightMetrics = useMybBodyMetrics({ type: 'WEIGHT', pagination: { limit: 30 } });\n const readiness = useMybRecoveryLogs('READINESS');\n\n const programRows = programs.data?.items ?? [];\n const sessionRows = sessions.data?.items ?? [];\n const goalRows = goals.data?.items ?? [];\n const weightRows = weightMetrics.data?.items ?? [];\n const readinessRows = readiness.data ?? [];\n\n const now = new Date();\n const weekAgo = now.getTime() - 7 * 24 * 60 * 60 * 1000;\n const sessionsThisWeek = sessionRows.filter((s) => {\n const ref = s.completedAt ?? s.startedAt ?? s.scheduledFor ?? s.createdAt;\n return ref ? new Date(ref).getTime() >= weekAgo : false;\n });\n const completedThisWeek = sessionsThisWeek.filter((s) => s.status === 'COMPLETED').length;\n const activeSession = sessionRows.find((s) => s.status === 'IN_PROGRESS');\n const upcomingSession = sessionRows\n .filter((s) => s.status === 'SCHEDULED' && s.scheduledFor)\n .sort((a, b) => new Date(a.scheduledFor!).getTime() - new Date(b.scheduledFor!).getTime())[0];\n\n const latestWeight = weightRows[0];\n const priorWeight = weightRows[1];\n const weightDelta =\n latestWeight && priorWeight ? latestWeight.value - priorWeight.value : undefined;\n\n const latestReadiness = readinessRows\n .slice()\n .sort((a, b) => new Date(b.loggedAt).getTime() - new Date(a.loggedAt).getTime())[0];\n\n const goalProgressAvg = useMemo(() => {\n if (goalRows.length === 0) return 0;\n const sum = goalRows.reduce((acc, g) => acc + computeGoalProgress(g), 0);\n return sum / goalRows.length;\n }, [goalRows]);\n\n const macroData = macros.data;\n const caloriePct = macroData?.calorieTarget\n ? (macroData.calories / macroData.calorieTarget) * 100\n : 0;\n\n const isInitialLoading =\n programs.isLoading && sessions.isLoading && goals.isLoading && macros.isLoading;\n\n if (isInitialLoading) {\n return (\n <PageLayout title=\"MyBodyShield\" titleGradient aurora>\n <LoadingView label=\"Loading your fitness overview…\" />\n </PageLayout>\n );\n }\n\n const greetingName = currentUser?.firstName || currentUser?.name || 'there';\n\n const kpiCards: { id: string; node: ReactNode }[] = [\n {\n id: 'programs',\n node: (\n <MetricsCard\n icon={<Dumbbell className=\"h-5 w-5\" />}\n value={formatNumber(programRows.length)}\n label=\"Active programs\"\n footer={\n <p className=\"text-xs text-text-tertiary\">\n <button\n type=\"button\"\n onClick={() => navigateTo('programs')}\n className=\"font-medium text-accent hover:underline\"\n >\n Manage programs\n </button>\n </p>\n }\n />\n ),\n },\n {\n id: 'sessions',\n node: (\n <MetricsCard\n icon={<Flame className=\"h-5 w-5\" />}\n value={formatNumber(completedThisWeek)}\n label=\"Sessions this week\"\n accent={activeSession ? 'warning' : undefined}\n footer={\n activeSession ? (\n <button\n type=\"button\"\n onClick={() => navigateTo(`train/${activeSession.id}`)}\n className=\"text-xs font-medium text-status-warning-text hover:underline\"\n >\n Resume live session →\n </button>\n ) : (\n <p className=\"text-xs text-text-tertiary\">\n <span className=\"tabular-nums text-text-secondary\">{sessionsThisWeek.length}</span>{' '}\n logged\n </p>\n )\n }\n />\n ),\n },\n {\n id: 'goals',\n node: (\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={formatNumber(goalRows.length)}\n label=\"Active goals\"\n footer={\n <div className=\"space-y-2\">\n <MiniBar value={goalProgressAvg} height={4} barClassName=\"bg-action-primary-bg\" />\n <p className=\"text-xs text-text-tertiary\">\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(goalProgressAvg)}\n </span>{' '}\n avg progress\n </p>\n </div>\n }\n />\n ),\n },\n {\n id: 'weight',\n node: (\n <MetricsCard\n icon={<Weight className=\"h-5 w-5\" />}\n value={latestWeight ? formatWeight(latestWeight.value) : '—'}\n label=\"Latest weight\"\n footer={\n weightDelta != null ? (\n <p className=\"text-xs text-text-tertiary\">\n <span\n className={\n weightDelta <= 0\n ? 'font-medium text-status-success-text'\n : 'font-medium text-text-secondary'\n }\n >\n {weightDelta > 0 ? '+' : ''}\n {weightDelta.toFixed(1)} kg\n </span>{' '}\n vs last\n </p>\n ) : (\n <button\n type=\"button\"\n onClick={() => navigateTo('progress')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n Log a measurement →\n </button>\n )\n }\n />\n ),\n },\n {\n id: 'recovery',\n node: (\n <MetricsCard\n icon={<Moon className=\"h-5 w-5\" />}\n value={latestReadiness ? `${latestReadiness.score}` : '—'}\n label=\"Recovery readiness\"\n accent={\n latestReadiness\n ? latestReadiness.score >= 70\n ? 'success'\n : latestReadiness.score >= 40\n ? 'warning'\n : 'error'\n : undefined\n }\n footer={\n latestReadiness ? (\n <p className=\"text-xs text-text-tertiary\">\n {formatRelativeTime(latestReadiness.loggedAt)}\n </p>\n ) : (\n <button\n type=\"button\"\n onClick={() => navigateTo('recovery')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n Log recovery →\n </button>\n )\n }\n />\n ),\n },\n ];\n\n return (\n <PageLayout\n title=\"MyBodyShield\"\n titleGradient\n aurora\n description={`Welcome back, ${greetingName} — your training, nutrition, progress & recovery control room.`}\n >\n {/* KPI grid */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\">\n {kpiCards.map((card, i) => (\n <motion.div\n key={card.id}\n className=\"group relative rounded-2xl transition-shadow duration-300 hover:shadow-float\"\n {...rise(i)}\n {...lift}\n >\n {/* Emerald top-edge accent — brightens on hover */}\n <span\n aria-hidden\n 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\"\n />\n {card.node}\n </motion.div>\n ))}\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Today's nutrition */}\n <motion.div className=\"lg:col-span-2\" {...rise(0)}>\n <GlassCard treatment=\"glass\" className=\"h-full p-6\">\n <div className=\"mb-4 flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h2 className=\"text-base font-semibold text-text-primary\">\n Today&apos;s nutrition\n </h2>\n <p className=\"mt-0.5 text-sm text-text-secondary\">\n Calories & macros logged against your active plan.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('nutrition')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n Nutrition <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {!macroData || (macroData.calorieTarget === 0 && macroData.calories === 0) ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Salad className=\"h-10 w-10\" />}\n title=\"No nutrition data yet\"\n description=\"Activate a nutrition plan and log meals to track your daily macros here.\"\n />\n ) : (\n <div className=\"flex flex-col gap-8 sm:flex-row sm:items-center\">\n {/* Calorie ring — the nutrition hero */}\n <div className=\"relative mx-auto flex shrink-0 items-center justify-center sm:mx-0\">\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-2 rounded-full opacity-70 blur-2xl\"\n style={{\n background:\n 'radial-gradient(circle, color-mix(in srgb, var(--color-action-primary-bg) 26%, transparent), transparent 70%)',\n }}\n />\n <ProgressRing value={caloriePct} size={188} stroke={16}>\n <span className=\"text-[11px] font-medium uppercase tracking-wide text-text-tertiary\">\n Calories\n </span>\n <span className=\"text-3xl font-bold tabular-nums text-text-primary\">\n {formatNumber(macroData.calories)}\n </span>\n <span className=\"mt-0.5 text-xs text-text-tertiary\">\n / {formatNumber(macroData.calorieTarget)} kcal\n </span>\n </ProgressRing>\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"space-y-2\">\n <MacroBar\n proteinG={macroData.proteinG}\n carbsG={macroData.carbsG}\n fatG={macroData.fatG}\n height={12}\n />\n <MacroLegend />\n </div>\n <div className=\"grid grid-cols-3 gap-3\">\n {(\n [\n ['Protein', macroData.proteinG, macroData.proteinTarget],\n ['Carbs', macroData.carbsG, macroData.carbsTarget],\n ['Fat', macroData.fatG, macroData.fatTarget],\n ] as const\n ).map(([label, val, target]) => {\n const pct = target ? (val / target) * 100 : 0;\n return (\n <div\n key={label}\n className=\"rounded-2xl bg-bg-sunken/60 p-3 ring-1 ring-inset ring-border-seam/40 transition-shadow hover:shadow-float\"\n >\n <div className=\"flex items-center justify-between gap-1\">\n <p className=\"text-xs font-medium text-text-tertiary\">{label}</p>\n <span className=\"text-[11px] tabular-nums text-text-tertiary\">\n {formatPercent(pct)}\n </span>\n </div>\n <p className=\"mt-1 text-sm font-semibold tabular-nums text-text-primary\">\n {formatNumber(val)}\n <span className=\"text-xs font-normal text-text-tertiary\">\n {' '}\n / {formatNumber(target)} g\n </span>\n </p>\n <Meter value={pct} height={5} className=\"mt-2\" />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n )}\n </GlassCard>\n </motion.div>\n\n {/* Next up */}\n <motion.div {...rise(1)}>\n <GlassCard treatment=\"glass\" className=\"h-full p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">Next up</h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('train')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n Train <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {activeSession ? (\n <motion.button\n type=\"button\"\n onClick={() => navigateTo(`train/${activeSession.id}`)}\n 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\"\n {...liftTap}\n >\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={activeSession.status} />\n </div>\n <p className=\"mt-2 text-sm font-medium text-text-primary\">\n Live workout in progress\n </p>\n <p className=\"mt-0.5 text-xs text-text-tertiary\">\n Started {formatRelativeTime(activeSession.startedAt)}\n </p>\n </motion.button>\n ) : upcomingSession ? (\n <motion.button\n type=\"button\"\n onClick={() => navigateTo(`train/${upcomingSession.id}`)}\n 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\"\n {...liftTap}\n >\n <div className=\"flex items-center gap-2\">\n <IconChip icon={<CalendarCheck className=\"h-4 w-4\" />} />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Scheduled session</p>\n <p className=\"text-xs text-text-tertiary\">\n {formatRelativeTime(upcomingSession.scheduledFor)}\n </p>\n </div>\n </div>\n </motion.button>\n ) : (\n <div className=\"flex flex-col items-center justify-center rounded-2xl border border-dashed border-border-seam py-8 text-center\">\n <span className=\"flex size-11 items-center justify-center rounded-full bg-[var(--color-accent-soft)]\">\n <Flame className=\"h-5 w-5 text-accent\" />\n </span>\n <p className=\"mt-3 text-sm font-medium text-text-primary\">No session scheduled</p>\n <button\n type=\"button\"\n onClick={() => navigateTo('train')}\n className=\"mt-1 text-xs font-medium text-accent hover:underline\"\n >\n Start a workout\n </button>\n </div>\n )}\n </GlassCard>\n </motion.div>\n </div>\n\n {/* Active goals */}\n <Section\n title=\"Active goals\"\n description=\"Your current targets across training, nutrition and body composition.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('goals')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n All goals <ArrowRight className=\"h-4 w-4\" />\n </button>\n }\n >\n {goalRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Target className=\"h-10 w-10\" />}\n title=\"No active goals\"\n description=\"Set a goal to give your training and nutrition a clear target to work toward.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {goalRows.slice(0, 6).map((g, i) => {\n const pct = computeGoalProgress(g);\n const meta = GOAL_TYPE_META[g.type];\n const Icon = meta.icon;\n return (\n <motion.button\n key={g.id}\n type=\"button\"\n onClick={() => navigateTo('goals')}\n className=\"text-left\"\n {...rise(i)}\n {...liftTap}\n >\n <GlassCard\n treatment=\"plain\"\n className=\"h-full p-4 transition-shadow hover:shadow-float\"\n >\n <div className=\"flex items-start gap-3\">\n <IconChip icon={<Icon className=\"h-4 w-4\" />} tint={meta.tint} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-text-primary\">\n {g.title}\n </p>\n <p className=\"text-xs text-text-tertiary\">{formatEnumLabel(g.type)}</p>\n </div>\n </div>\n <div className=\"mt-3 space-y-1.5\">\n <Meter value={pct} />\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"tabular-nums text-text-secondary\">\n {formatNumber(g.currentValue)}\n {g.unit ? ` ${g.unit}` : ''} / {formatNumber(g.targetValue)}\n {g.unit ? ` ${g.unit}` : ''}\n </span>\n <span className=\"tabular-nums text-text-tertiary\">\n {formatPercent(pct)}\n </span>\n </div>\n </div>\n </GlassCard>\n </motion.button>\n );\n })}\n </div>\n )}\n </Section>\n\n {/* Recent sessions */}\n <Section\n title=\"Recent sessions\"\n description=\"Your latest logged and scheduled workouts.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('train')}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-accent hover:underline\"\n >\n All sessions <ArrowRight className=\"h-4 w-4\" />\n </button>\n }\n >\n {sessionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Flame className=\"h-10 w-10\" />}\n title=\"No sessions yet\"\n description=\"Start a workout session to begin logging sets and tracking your training.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {sessionRows.slice(0, 6).map((s, i) => {\n const meta = WORKOUT_TYPE_META.STRENGTH;\n const Icon = s.status === 'COMPLETED' ? CheckCircle2 : meta.icon;\n return (\n <motion.button\n key={s.id}\n type=\"button\"\n onClick={() => navigateTo(`train/${s.id}`)}\n className=\"text-left\"\n {...rise(i)}\n {...liftTap}\n >\n <GlassCard treatment=\"plain\" className=\"p-4 transition-shadow hover:shadow-float\">\n <div className=\"flex items-center justify-between gap-2\">\n <IconChip icon={<Icon className=\"h-4 w-4\" />} tint={meta.tint} />\n <StatusBadge status={s.status} />\n </div>\n <p className=\"mt-3 text-sm font-medium text-text-primary\">\n {s.caloriesBurned > 0\n ? `${formatNumber(s.caloriesBurned)} kcal burned`\n : 'Workout session'}\n </p>\n <p className=\"mt-0.5 text-xs text-text-tertiary\">\n {formatRelativeTime(s.completedAt ?? s.startedAt ?? s.createdAt)}\n </p>\n </GlassCard>\n </motion.button>\n );\n })}\n </div>\n )}\n </Section>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA4DA,IAAM,IAA6C;CAAC;CAAM;CAAG;CAAK;CAAE;AAEpE,SAAgB,IAAgB;CAC9B,IAAM,EAAE,eAAY,mBAAgB,GAAiB,EAC/C,IAAe,GAAkB,EAGjC,KAAQ,MACZ,IACI,EAAE,GACF;EACE,SAAS;GAAE,SAAS;GAAG,GAAG;GAAI;EAC9B,aAAa;GAAE,SAAS;GAAG,GAAG;GAAG;EACjC,UAAU;GAAE,MAAM;GAAM,QAAQ;GAAM;EACtC,YAAY;GAAE,UAAU;GAAM,OAAO,KAAK,IAAI,GAAG,EAAE,GAAG;GAAM,MAAM;GAAU;EAC7E,EAGD,IAAO,IACT,EAAE,GACF,EAAE,YAAY;EAAE,GAAG;EAAI,YAAY;GAAE,UAAU;GAAK,MAAM;GAAU;EAAE,EAAE,EAGtE,IAAU,IACZ,EAAE,GACF;EACE,YAAY;GAAE,GAAG;GAAI,YAAY;IAAE,UAAU;IAAK,MAAM;IAAU;GAAE;EACpE,UAAU,EAAE,OAAO,MAAO;EAC3B,EAEC,IAAW,EAAe;EAAE,QAAQ;EAAU,YAAY,EAAE,OAAO,IAAI;EAAE,CAAC,EAC1E,IAAW,EAAe,EAAE,YAAY,EAAE,OAAO,IAAI,EAAE,CAAC,EACxD,IAAQ,EAAY;EAAE,QAAQ;EAAU,YAAY,EAAE,OAAO,IAAI;EAAE,CAAC,EACpE,IAAS,GAAmB,EAC5B,IAAgB,EAAkB;EAAE,MAAM;EAAU,YAAY,EAAE,OAAO,IAAI;EAAE,CAAC,EAChF,KAAY,EAAmB,YAAY,EAE3C,KAAc,EAAS,MAAM,SAAS,EAAE,EACxC,IAAc,EAAS,MAAM,SAAS,EAAE,EACxC,IAAW,EAAM,MAAM,SAAS,EAAE,EAClC,IAAa,EAAc,MAAM,SAAS,EAAE,EAC5C,KAAgB,GAAU,QAAQ,EAAE,EAGpC,sBADM,IAAI,MAAM,EACF,SAAS,GAAG,QAAc,KAAK,KAC7C,IAAmB,EAAY,QAAQ,MAAM;EACjD,IAAM,IAAM,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE;AAChE,SAAO,IAAM,IAAI,KAAK,EAAI,CAAC,SAAS,IAAI,KAAU;GAClD,EACI,KAAoB,EAAiB,QAAQ,MAAM,EAAE,WAAW,YAAY,CAAC,QAC7E,IAAgB,EAAY,MAAM,MAAM,EAAE,WAAW,cAAc,EACnE,IAAkB,EACrB,QAAQ,MAAM,EAAE,WAAW,eAAe,EAAE,aAAa,CACzD,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,aAAc,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,aAAc,CAAC,SAAS,CAAC,CAAC,IAEvF,IAAe,EAAW,IAC1B,IAAc,EAAW,IACzB,IACJ,KAAgB,IAAc,EAAa,QAAQ,EAAY,QAAQ,KAAA,GAEnE,IAAkB,GACrB,OAAO,CACP,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,IAE7E,IAAkB,QAClB,EAAS,WAAW,IAAU,IACtB,EAAS,QAAQ,GAAK,MAAM,IAAM,EAAoB,EAAE,EAAE,EAAE,GAC3D,EAAS,QACrB,CAAC,EAAS,CAAC,EAER,IAAY,EAAO,MACnB,KAAa,GAAW,gBACzB,EAAU,WAAW,EAAU,gBAAiB,MACjD;AAKJ,KAFE,EAAS,aAAa,EAAS,aAAa,EAAM,aAAa,EAAO,UAGtE,QACE,kBAAC,GAAD;EAAY,OAAM;EAAe,eAAA;EAAc,QAAA;YAC7C,kBAAC,IAAD,EAAa,OAAM,kCAAmC,CAAA;EAC3C,CAAA;CAIjB,IAAM,KAAe,GAAa,aAAa,GAAa,QAAQ,SAE9D,KAA8C;EAClD;GACE,IAAI;GACJ,MACE,kBAAC,GAAD;IACE,MAAM,kBAAC,IAAD,EAAU,WAAU,WAAY,CAAA;IACtC,OAAO,EAAa,GAAY,OAAO;IACvC,OAAM;IACN,QACE,kBAAC,KAAD;KAAG,WAAU;eACX,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAW,WAAW;MACrC,WAAU;gBACX;MAEQ,CAAA;KACP,CAAA;IAEN,CAAA;GAEL;EACD;GACE,IAAI;GACJ,MACE,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;IACnC,OAAO,EAAa,GAAkB;IACtC,OAAM;IACN,QAAQ,IAAgB,YAAY,KAAA;IACpC,QACE,IACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,SAAS,EAAc,KAAK;KACtD,WAAU;eACX;KAEQ,CAAA,GAET,kBAAC,KAAD;KAAG,WAAU;eAAb;MACE,kBAAC,QAAD;OAAM,WAAU;iBAAoC,EAAiB;OAAc,CAAA;MAAC;MAAI;MAEtF;;IAGR,CAAA;GAEL;EACD;GACE,IAAI;GACJ,MACE,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;IACpC,OAAO,EAAa,EAAS,OAAO;IACpC,OAAM;IACN,QACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAS,OAAO;MAAiB,QAAQ;MAAG,cAAa;MAAyB,CAAA,EAClF,kBAAC,KAAD;MAAG,WAAU;gBAAb;OACE,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAc,EAAgB;QAC1B,CAAA;OAAC;OAAI;OAEV;QACA;;IAER,CAAA;GAEL;EACD;GACE,IAAI;GACJ,MACE,kBAAC,GAAD;IACE,MAAM,kBAAC,IAAD,EAAQ,WAAU,WAAY,CAAA;IACpC,OAAO,IAAe,EAAa,EAAa,MAAM,GAAG;IACzD,OAAM;IACN,QACE,KAAe,OAeb,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,WAAW;KACrC,WAAU;eACX;KAEQ,CAAA,GApBT,kBAAC,KAAD;KAAG,WAAU;eAAb;MACE,kBAAC,QAAD;OACE,WACE,KAAe,IACX,yCACA;iBAJR;QAOG,IAAc,IAAI,MAAM;QACxB,EAAY,QAAQ,EAAE;QAAC;QACnB;;MAAC;MAAI;MAEV;;IAWR,CAAA;GAEL;EACD;GACE,IAAI;GACJ,MACE,kBAAC,GAAD;IACE,MAAM,kBAAC,IAAD,EAAM,WAAU,WAAY,CAAA;IAClC,OAAO,IAAkB,GAAG,EAAgB,UAAU;IACtD,OAAM;IACN,QACE,IACI,EAAgB,SAAS,KACvB,YACA,EAAgB,SAAS,KACvB,YACA,UACJ,KAAA;IAEN,QACE,IACE,kBAAC,KAAD;KAAG,WAAU;eACV,EAAmB,EAAgB,SAAS;KAC3C,CAAA,GAEJ,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,WAAW;KACrC,WAAU;eACX;KAEQ,CAAA;IAGb,CAAA;GAEL;EACF;AAED,QACE,kBAAC,GAAD;EACE,OAAM;EACN,eAAA;EACA,QAAA;EACA,aAAa,iBAAiB,GAAa;YAJ7C;GAOE,kBAAC,OAAD;IAAK,WAAU;cACZ,GAAS,KAAK,GAAM,MACnB,kBAAC,EAAO,KAAR;KAEE,WAAU;KACV,GAAI,EAAK,EAAE;KACX,GAAI;eAJN,CAOE,kBAAC,QAAD;MACE,eAAA;MACA,WAAU;MACV,CAAA,EACD,EAAK,KACK;OAXN,EAAK,GAWC,CACb;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,EAAO,KAAR;KAAY,WAAU;KAAgB,GAAI,EAAK,EAAE;eAC/C,kBAAC,GAAD;MAAW,WAAU;MAAQ,WAAU;gBAAvC,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAA4C;QAErD,CAAA,EACL,kBAAC,KAAD;QAAG,WAAU;kBAAqC;QAE9C,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAW,YAAY;QACtC,WAAU;kBAHZ,CAIC,cACW,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CACrC;UACL;UACL,CAAC,KAAc,EAAU,kBAAkB,KAAK,EAAU,aAAa,IACtE,kBAAC,GAAD;OACE,cAAa;OACb,MAAM,kBAAC,IAAD,EAAO,WAAU,aAAc,CAAA;OACrC,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CAEE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SACE,eAAA;SACA,WAAU;SACV,OAAO,EACL,YACE,iHACH;SACD,CAAA,EACF,kBAAC,IAAD;SAAc,OAAO;SAAY,MAAM;SAAK,QAAQ;mBAApD;UACE,kBAAC,QAAD;WAAM,WAAU;qBAAqE;WAE9E,CAAA;UACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAa,EAAU,SAAS;WAC5B,CAAA;UACP,kBAAC,QAAD;WAAM,WAAU;qBAAhB;YAAoD;YAC/C,EAAa,EAAU,cAAc;YAAC;YACpC;;UACM;WACX;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,IAAD;UACE,UAAU,EAAU;UACpB,QAAQ,EAAU;UAClB,MAAM,EAAU;UAChB,QAAQ;UACR,CAAA,EACF,kBAAC,IAAD,EAAe,CAAA,CACX;YACN,kBAAC,OAAD;SAAK,WAAU;mBAEX;UACE;WAAC;WAAW,EAAU;WAAU,EAAU;WAAc;UACxD;WAAC;WAAS,EAAU;WAAQ,EAAU;WAAY;UAClD;WAAC;WAAO,EAAU;WAAM,EAAU;WAAU;UAC7C,CACD,KAAK,CAAC,GAAO,GAAK,OAAY;UAC9B,IAAM,IAAM,IAAU,IAAM,IAAU,MAAM;AAC5C,iBACE,kBAAC,OAAD;WAEE,WAAU;qBAFZ;YAIE,kBAAC,OAAD;aAAK,WAAU;uBAAf,CACE,kBAAC,KAAD;cAAG,WAAU;wBAA0C;cAAU,CAAA,EACjE,kBAAC,QAAD;cAAM,WAAU;wBACb,EAAc,EAAI;cACd,CAAA,CACH;;YACN,kBAAC,KAAD;aAAG,WAAU;uBAAb,CACG,EAAa,EAAI,EAClB,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACG;eAAI;eACF,EAAa,EAAO;eAAC;eACnB;gBACL;;YACJ,kBAAC,GAAD;aAAO,OAAO;aAAK,QAAQ;aAAG,WAAU;aAAS,CAAA;YAC7C;aAjBC,EAiBD;WAER;SACE,CAAA,CACF;UACF;SAEE;;KACD,CAAA,EAGb,kBAAC,EAAO,KAAR;KAAY,GAAI,EAAK,EAAE;eACrB,kBAAC,GAAD;MAAW,WAAU;MAAQ,WAAU;gBAAvC,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAA4C;QAAY,CAAA,EACtE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAW,QAAQ;QAClC,WAAU;kBAHZ,CAIC,UACO,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CACjC;UACL;UACL,IACC,kBAAC,EAAO,QAAR;OACE,MAAK;OACL,eAAe,EAAW,SAAS,EAAc,KAAK;OACtD,WAAU;OACV,GAAI;iBAJN;QAME,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,GAAD,EAAa,QAAQ,EAAc,QAAU,CAAA;SACzC,CAAA;QACN,kBAAC,KAAD;SAAG,WAAU;mBAA6C;SAEtD,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;mBAAb,CAAiD,YACtC,EAAmB,EAAc,UAAU,CAClD;;QACU;WACd,IACF,kBAAC,EAAO,QAAR;OACE,MAAK;OACL,eAAe,EAAW,SAAS,EAAgB,KAAK;OACxD,WAAU;OACV,GAAI;iBAEJ,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAU,MAAM,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAI,CAAA,EACzD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAwC;SAAqB,CAAA,EAC1E,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAmB,EAAgB,aAAa;SAC/C,CAAA,CACA,EAAA,CAAA,CACF;;OACQ,CAAA,GAEhB,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,QAAD;SAAM,WAAU;mBACd,kBAAC,GAAD,EAAO,WAAU,uBAAwB,CAAA;SACpC,CAAA;QACP,kBAAC,KAAD;SAAG,WAAU;mBAA6C;SAAwB,CAAA;QAClF,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,EAAW,QAAQ;SAClC,WAAU;mBACX;SAEQ,CAAA;QACL;SAEE;;KACD,CAAA,CACT;;GAGN,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,QACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,QAAQ;KAClC,WAAU;eAHZ,CAIC,cACW,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CACrC;;cAGV,EAAS,WAAW,IACnB,kBAAC,GAAD;KACE,cAAa;KACb,MAAM,kBAAC,GAAD,EAAQ,WAAU,aAAc,CAAA;KACtC,OAAM;KACN,aAAY;KACZ,CAAA,GAEF,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,MAAM;MAClC,IAAM,IAAM,EAAoB,EAAE,EAC5B,IAAO,GAAe,EAAE,OACxB,IAAO,EAAK;AAClB,aACE,kBAAC,EAAO,QAAR;OAEE,MAAK;OACL,eAAe,EAAW,QAAQ;OAClC,WAAU;OACV,GAAI,EAAK,EAAE;OACX,GAAI;iBAEJ,kBAAC,GAAD;QACE,WAAU;QACV,WAAU;kBAFZ,CAIE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAU,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;UAAE,MAAM,EAAK;UAAQ,CAAA,EACjE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAE;WACD,CAAA,EACJ,kBAAC,KAAD;WAAG,WAAU;qBAA8B,GAAgB,EAAE,KAAK;WAAK,CAAA,CACnE;YACF;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAO,OAAO,GAAO,CAAA,EACrB,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB;YACG,EAAa,EAAE,aAAa;YAC5B,EAAE,OAAO,IAAI,EAAE,SAAS;YAAG;YAAI,EAAa,EAAE,YAAY;YAC1D,EAAE,OAAO,IAAI,EAAE,SAAS;YACpB;cACP,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAc,EAAI;WACd,CAAA,CACH;YACF;WACI;;OACE,EAlCT,EAAE,GAkCO;OAElB;KACE,CAAA;IAEA,CAAA;GAGV,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,QACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAW,QAAQ;KAClC,WAAU;eAHZ,CAIC,iBACc,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CACxC;;cAGV,EAAY,WAAW,IACtB,kBAAC,GAAD;KACE,cAAa;KACb,MAAM,kBAAC,GAAD,EAAO,WAAU,aAAc,CAAA;KACrC,OAAM;KACN,aAAY;KACZ,CAAA,GAEF,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAY,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,MAAM;MACrC,IAAM,IAAO,GAAkB,UACzB,IAAO,EAAE,WAAW,cAAc,KAAe,EAAK;AAC5D,aACE,kBAAC,EAAO,QAAR;OAEE,MAAK;OACL,eAAe,EAAW,SAAS,EAAE,KAAK;OAC1C,WAAU;OACV,GAAI,EAAK,EAAE;OACX,GAAI;iBAEJ,kBAAC,GAAD;QAAW,WAAU;QAAQ,WAAU;kBAAvC;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAU,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;WAAE,MAAM,EAAK;WAAQ,CAAA,EACjE,kBAAC,GAAD,EAAa,QAAQ,EAAE,QAAU,CAAA,CAC7B;;SACN,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAE,iBAAiB,IAChB,GAAG,EAAa,EAAE,eAAe,CAAC,gBAClC;UACF,CAAA;SACJ,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU;UAC9D,CAAA;SACM;;OACE,EArBT,EAAE,GAqBO;OAElB;KACE,CAAA;IAEA,CAAA;GACC"}
@@ -2,7 +2,7 @@ import { cn as e } from "../../utils/cn.js";
2
2
  import { Activity as t, BedDouble as n, Brain as r, Dumbbell as i, Flower2 as a, Gauge as o, Heart as s, HeartPulse as c, Moon as l, Percent as u, Ruler as d, Smile as f, Sparkles as p, StretchHorizontal as m, TrendingDown as h, TrendingUp as g, Waves as _, Weight as v, Zap as y } from "lucide-react";
3
3
  import { jsx as b, jsxs as x } from "react/jsx-runtime";
4
4
  //#region src/mybodyshield/pages/_shared/visuals.tsx
5
- var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, className: i }) => {
5
+ var S = ({ value: t, color: n = "var(--color-action-primary-bg)", height: r = 8, className: i }) => {
6
6
  let a = Math.max(0, Math.min(100, t));
7
7
  return /* @__PURE__ */ b("div", {
8
8
  className: e("w-full overflow-hidden rounded-full bg-bg-sunken", i),
@@ -19,7 +19,7 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
19
19
  }
20
20
  })
21
21
  });
22
- }, C = ({ value: t, size: n = 96, stroke: r = 9, color: i = "var(--color-accent-teal)", trackColor: a = "var(--color-bg-sunken)", children: o, className: s }) => {
22
+ }, C = ({ value: t, size: n = 96, stroke: r = 9, color: i = "var(--color-action-primary-bg)", trackColor: a = "var(--color-bg-sunken)", children: o, className: s }) => {
23
23
  let c = Math.max(0, Math.min(100, t)), l = (n - r) / 2, u = 2 * Math.PI * l, d = u - c / 100 * u;
24
24
  return /* @__PURE__ */ x("div", {
25
25
  className: e("relative inline-flex items-center justify-center", s),
@@ -56,7 +56,7 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
56
56
  })]
57
57
  });
58
58
  }, w = {
59
- protein: "var(--color-accent-teal)",
59
+ protein: "var(--color-action-primary-bg)",
60
60
  carbs: "var(--color-status-warning-text)",
61
61
  fat: "var(--color-accent-primary)"
62
62
  }, T = ({ proteinG: t, carbsG: n, fatG: r, height: i = 8, className: a }) => {
@@ -95,7 +95,13 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
95
95
  children: e
96
96
  })]
97
97
  }, e))
98
- }), D = {
98
+ });
99
+ function D(e, t) {
100
+ return new Proxy(e, { get(e, n) {
101
+ return e[n] ?? e[t];
102
+ } });
103
+ }
104
+ var O = D({
99
105
  STRENGTH: {
100
106
  icon: i,
101
107
  tint: "var(--color-accent-primary)"
@@ -110,28 +116,28 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
110
116
  },
111
117
  MOBILITY: {
112
118
  icon: m,
113
- tint: "var(--color-accent-teal)"
119
+ tint: "var(--color-action-primary-bg)"
114
120
  },
115
121
  YOGA: {
116
122
  icon: a,
117
- tint: "var(--color-accent-teal)"
123
+ tint: "var(--color-action-primary-bg)"
118
124
  },
119
125
  RECOVERY: {
120
126
  icon: l,
121
127
  tint: "var(--color-status-success-text)"
122
128
  }
123
- }, O = {
129
+ }, "STRENGTH"), k = D({
124
130
  CHEST: { tint: "var(--color-accent-primary)" },
125
- BACK: { tint: "var(--color-accent-teal)" },
131
+ BACK: { tint: "var(--color-action-primary-bg)" },
126
132
  LEGS: { tint: "var(--color-status-warning-text)" },
127
133
  SHOULDERS: { tint: "var(--color-status-error-text)" },
128
134
  ARMS: { tint: "var(--color-accent-primary)" },
129
135
  CORE: { tint: "var(--color-status-success-text)" },
130
136
  FULL_BODY: { tint: "var(--color-text-secondary)" }
131
- }, k = {
137
+ }, "FULL_BODY"), A = D({
132
138
  WEIGHT_LOSS: {
133
139
  icon: h,
134
- tint: "var(--color-accent-teal)"
140
+ tint: "var(--color-action-primary-bg)"
135
141
  },
136
142
  MUSCLE_GAIN: {
137
143
  icon: i,
@@ -147,13 +153,13 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
147
153
  },
148
154
  MOBILITY: {
149
155
  icon: m,
150
- tint: "var(--color-accent-teal)"
156
+ tint: "var(--color-action-primary-bg)"
151
157
  },
152
158
  GENERAL_FITNESS: {
153
159
  icon: p,
154
160
  tint: "var(--color-text-secondary)"
155
161
  }
156
- }, A = {
162
+ }, "GENERAL_FITNESS"), j = D({
157
163
  WEIGHT: {
158
164
  icon: v,
159
165
  tint: "var(--color-accent-primary)",
@@ -171,30 +177,30 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
171
177
  },
172
178
  WAIST: {
173
179
  icon: d,
174
- tint: "var(--color-accent-teal)",
180
+ tint: "var(--color-action-primary-bg)",
175
181
  unit: "cm"
176
182
  },
177
183
  CHEST: {
178
184
  icon: d,
179
- tint: "var(--color-accent-teal)",
185
+ tint: "var(--color-action-primary-bg)",
180
186
  unit: "cm"
181
187
  },
182
188
  HIPS: {
183
189
  icon: d,
184
- tint: "var(--color-accent-teal)",
190
+ tint: "var(--color-action-primary-bg)",
185
191
  unit: "cm"
186
192
  },
187
193
  ARM: {
188
194
  icon: d,
189
- tint: "var(--color-accent-teal)",
195
+ tint: "var(--color-action-primary-bg)",
190
196
  unit: "cm"
191
197
  },
192
198
  THIGH: {
193
199
  icon: d,
194
- tint: "var(--color-accent-teal)",
200
+ tint: "var(--color-action-primary-bg)",
195
201
  unit: "cm"
196
202
  }
197
- }, j = {
203
+ }, "WEIGHT"), M = D({
198
204
  SLEEP: {
199
205
  icon: n,
200
206
  tint: "var(--color-accent-primary)",
@@ -217,17 +223,17 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
217
223
  },
218
224
  MOOD: {
219
225
  icon: f,
220
- tint: "var(--color-accent-teal)",
226
+ tint: "var(--color-action-primary-bg)",
221
227
  label: "Mood"
222
228
  }
223
- }, M = ({ icon: t, tint: n = "var(--color-accent-teal)", className: r }) => /* @__PURE__ */ b("span", {
229
+ }, "READINESS"), N = ({ icon: t, tint: n = "var(--color-action-primary-bg)", className: r }) => /* @__PURE__ */ b("span", {
224
230
  className: e("flex size-9 shrink-0 items-center justify-center rounded-lg", r),
225
231
  style: {
226
232
  backgroundColor: `color-mix(in srgb, ${n} 16%, transparent)`,
227
233
  color: n
228
234
  },
229
235
  children: t
230
- }), N = ({ delta: t, unit: n = "", goodDirection: r = "up" }) => {
236
+ }), P = ({ delta: t, unit: n = "", goodDirection: r = "up" }) => {
231
237
  if (!Number.isFinite(t) || t === 0) return /* @__PURE__ */ x("span", {
232
238
  className: "text-xs text-text-tertiary",
233
239
  children: ["±0", n]
@@ -243,13 +249,13 @@ var S = ({ value: t, color: n = "var(--color-accent-teal)", height: r = 8, class
243
249
  ]
244
250
  });
245
251
  };
246
- function P(e) {
252
+ function F(e) {
247
253
  let t = e.targetValue - e.baselineValue;
248
254
  if (t === 0) return e.currentValue >= e.targetValue ? 100 : 0;
249
255
  let n = (e.currentValue - e.baselineValue) / t * 100;
250
256
  return Math.max(0, Math.min(100, n));
251
257
  }
252
258
  //#endregion
253
- export { k as GOAL_TYPE_META, M as IconChip, A as METRIC_META, O as MUSCLE_META, T as MacroBar, E as MacroLegend, S as Meter, C as ProgressRing, j as RECOVERY_META, N as TrendPill, D as WORKOUT_TYPE_META, P as computeGoalProgress };
259
+ export { A as GOAL_TYPE_META, N as IconChip, w as MACRO_HUE, j as METRIC_META, k as MUSCLE_META, T as MacroBar, E as MacroLegend, S as Meter, C as ProgressRing, M as RECOVERY_META, P as TrendPill, O as WORKOUT_TYPE_META, F as computeGoalProgress };
254
260
 
255
261
  //# sourceMappingURL=visuals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"visuals.js","names":[],"sources":["../../../../src/mybodyshield/pages/_shared/visuals.tsx"],"sourcesContent":["/**\n * Shared fitness-domain visual helpers.\n * @module mybodyshield/pages/_shared\n *\n * Token-driven (no raw colors) SVG/CSS visual primitives + domain icon/tint\n * maps reused across the MyBodyShield pages. Everything reads fe-libs semantic\n * tokens so light/dark themes and custom themes work automatically.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport {\n Dumbbell,\n HeartPulse,\n Timer,\n Activity,\n StretchHorizontal,\n Flower2,\n Moon,\n Weight,\n Ruler,\n Percent,\n Heart,\n TrendingDown,\n TrendingUp,\n Zap,\n Waves,\n Target,\n Sparkles,\n Brain,\n BedDouble,\n Gauge,\n Smile,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n MybBodyMetricType,\n MybGoalType,\n MybMuscleGroup,\n MybRecoveryMetric,\n MybWorkoutType,\n} from '../../types';\n\n// ============================================================================\n// Meter — a horizontal progress bar with a token-driven fill\n// ============================================================================\n\nexport const Meter: FC<{\n /** 0–100 percentage. */\n value: number;\n /** CSS color for the fill (default: accent-teal). */\n color?: string;\n height?: number;\n className?: string;\n}> = ({ value, color = 'var(--color-accent-teal)', height = 8, className }) => {\n const pct = Math.max(0, Math.min(100, value));\n return (\n <div\n className={cn('w-full overflow-hidden rounded-full bg-bg-sunken', className)}\n style={{ height }}\n role=\"progressbar\"\n aria-valuenow={Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className=\"h-full rounded-full transition-[width] duration-500 ease-out\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n </div>\n );\n};\n\n// ============================================================================\n// ProgressRing — a circular progress indicator (goal progress, readiness)\n// ============================================================================\n\nexport const ProgressRing: FC<{\n value: number;\n size?: number;\n stroke?: number;\n color?: string;\n trackColor?: string;\n children?: ReactNode;\n className?: string;\n}> = ({\n value,\n size = 96,\n stroke = 9,\n color = 'var(--color-accent-teal)',\n trackColor = 'var(--color-bg-sunken)',\n children,\n className,\n}) => {\n const pct = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const offset = c - (pct / 100) * c;\n return (\n <div\n className={cn('relative inline-flex items-center justify-center', className)}\n style={{ width: size, height: size }}\n >\n <svg width={size} height={size} className=\"-rotate-90\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={trackColor}\n strokeWidth={stroke}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={color}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={offset}\n className=\"transition-[stroke-dashoffset] duration-700 ease-out\"\n />\n </svg>\n {children != null && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">{children}</div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// MacroBar — a stacked protein/carbs/fat bar (grams → proportion)\n// ============================================================================\n\nexport const MACRO_HUE = {\n protein: 'var(--color-accent-teal)',\n carbs: 'var(--color-status-warning-text)',\n fat: 'var(--color-accent-primary)',\n} as const;\n\nexport const MacroBar: FC<{\n proteinG: number;\n carbsG: number;\n fatG: number;\n height?: number;\n className?: string;\n}> = ({ proteinG, carbsG, fatG, height = 8, className }) => {\n const total = Math.max(1, proteinG + carbsG + fatG);\n const seg = (g: number) => `${(g / total) * 100}%`;\n return (\n <div\n className={cn('flex w-full overflow-hidden rounded-full bg-bg-sunken', className)}\n style={{ height }}\n >\n <div style={{ width: seg(proteinG), backgroundColor: MACRO_HUE.protein }} />\n <div style={{ width: seg(carbsG), backgroundColor: MACRO_HUE.carbs }} />\n <div style={{ width: seg(fatG), backgroundColor: MACRO_HUE.fat }} />\n </div>\n );\n};\n\nexport const MacroLegend: FC<{ className?: string }> = ({ className }) => (\n <div className={cn('flex flex-wrap items-center gap-3 text-xs text-text-tertiary', className)}>\n {(['protein', 'carbs', 'fat'] as const).map((k) => (\n <span key={k} className=\"inline-flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full\" style={{ backgroundColor: MACRO_HUE[k] }} />\n <span className=\"capitalize\">{k}</span>\n </span>\n ))}\n </div>\n);\n\n// ============================================================================\n// Domain icon + tint maps (semantic tokens only)\n// ============================================================================\n\nexport const WORKOUT_TYPE_META: Record<MybWorkoutType, { icon: typeof Dumbbell; tint: string }> = {\n STRENGTH: { icon: Dumbbell, tint: 'var(--color-accent-primary)' },\n CARDIO: { icon: HeartPulse, tint: 'var(--color-status-warning-text)' },\n HIIT: { icon: Zap, tint: 'var(--color-status-error-text)' },\n MOBILITY: { icon: StretchHorizontal, tint: 'var(--color-accent-teal)' },\n YOGA: { icon: Flower2, tint: 'var(--color-accent-teal)' },\n RECOVERY: { icon: Moon, tint: 'var(--color-status-success-text)' },\n};\n\nexport const MUSCLE_META: Record<MybMuscleGroup, { tint: string }> = {\n CHEST: { tint: 'var(--color-accent-primary)' },\n BACK: { tint: 'var(--color-accent-teal)' },\n LEGS: { tint: 'var(--color-status-warning-text)' },\n SHOULDERS: { tint: 'var(--color-status-error-text)' },\n ARMS: { tint: 'var(--color-accent-primary)' },\n CORE: { tint: 'var(--color-status-success-text)' },\n FULL_BODY: { tint: 'var(--color-text-secondary)' },\n};\n\nexport const GOAL_TYPE_META: Record<MybGoalType, { icon: typeof Target; tint: string }> = {\n WEIGHT_LOSS: { icon: TrendingDown, tint: 'var(--color-accent-teal)' },\n MUSCLE_GAIN: { icon: Dumbbell, tint: 'var(--color-accent-primary)' },\n STRENGTH: { icon: Weight, tint: 'var(--color-status-error-text)' },\n ENDURANCE: { icon: Activity, tint: 'var(--color-status-warning-text)' },\n MOBILITY: { icon: StretchHorizontal, tint: 'var(--color-accent-teal)' },\n GENERAL_FITNESS: { icon: Sparkles, tint: 'var(--color-text-secondary)' },\n};\n\nexport const METRIC_META: Record<\n MybBodyMetricType,\n { icon: typeof Weight; tint: string; unit: string }\n> = {\n WEIGHT: { icon: Weight, tint: 'var(--color-accent-primary)', unit: 'kg' },\n BODY_FAT: { icon: Percent, tint: 'var(--color-status-warning-text)', unit: '%' },\n RESTING_HEART_RATE: { icon: Heart, tint: 'var(--color-status-error-text)', unit: 'bpm' },\n WAIST: { icon: Ruler, tint: 'var(--color-accent-teal)', unit: 'cm' },\n CHEST: { icon: Ruler, tint: 'var(--color-accent-teal)', unit: 'cm' },\n HIPS: { icon: Ruler, tint: 'var(--color-accent-teal)', unit: 'cm' },\n ARM: { icon: Ruler, tint: 'var(--color-accent-teal)', unit: 'cm' },\n THIGH: { icon: Ruler, tint: 'var(--color-accent-teal)', unit: 'cm' },\n};\n\nexport const RECOVERY_META: Record<\n MybRecoveryMetric,\n { icon: typeof Gauge; tint: string; label: string }\n> = {\n SLEEP: { icon: BedDouble, tint: 'var(--color-accent-primary)', label: 'Sleep' },\n READINESS: { icon: Gauge, tint: 'var(--color-status-success-text)', label: 'Readiness' },\n SORENESS: { icon: Waves, tint: 'var(--color-status-warning-text)', label: 'Soreness' },\n STRESS: { icon: Brain, tint: 'var(--color-status-error-text)', label: 'Stress' },\n MOOD: { icon: Smile, tint: 'var(--color-accent-teal)', label: 'Mood' },\n};\n\n// ============================================================================\n// Small helpers\n// ============================================================================\n\n/** Circular icon chip with a soft tinted background. */\nexport const IconChip: FC<{ icon: ReactNode; tint?: string; className?: string }> = ({\n icon,\n tint = 'var(--color-accent-teal)',\n className,\n}) => (\n <span\n className={cn('flex size-9 shrink-0 items-center justify-center rounded-lg', className)}\n style={{ backgroundColor: `color-mix(in srgb, ${tint} 16%, transparent)`, color: tint }}\n >\n {icon}\n </span>\n);\n\n/** A small trend delta pill (up/down/flat) with semantic color. */\nexport const TrendPill: FC<{ delta: number; unit?: string; goodDirection?: 'up' | 'down' }> = ({\n delta,\n unit = '',\n goodDirection = 'up',\n}) => {\n if (!Number.isFinite(delta) || delta === 0) {\n return <span className=\"text-xs text-text-tertiary\">±0{unit}</span>;\n }\n const up = delta > 0;\n const good = goodDirection === 'up' ? up : !up;\n const Icon = up ? TrendingUp : TrendingDown;\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 text-xs font-medium tabular-nums',\n good ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {up ? '+' : ''}\n {delta.toFixed(1)}\n {unit}\n </span>\n );\n};\n\n/** Compute a goal's completion percentage from baseline → target → current. */\nexport function computeGoalProgress(goal: {\n baselineValue: number;\n targetValue: number;\n currentValue: number;\n}): number {\n const span = goal.targetValue - goal.baselineValue;\n if (span === 0) return goal.currentValue >= goal.targetValue ? 100 : 0;\n const done = ((goal.currentValue - goal.baselineValue) / span) * 100;\n return Math.max(0, Math.min(100, done));\n}\n\nexport { Timer };\n"],"mappings":";;;;AA8CA,IAAa,KAOP,EAAE,UAAO,WAAQ,4BAA4B,YAAS,GAAG,mBAAgB;CAC7E,IAAM,IAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAM,CAAC;AAC7C,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,oDAAoD,EAAU;EAC5E,OAAO,EAAE,WAAQ;EACjB,MAAK;EACL,iBAAe,KAAK,MAAM,EAAI;EAC9B,iBAAe;EACf,iBAAe;YAEf,kBAAC,OAAD;GACE,WAAU;GACV,OAAO;IAAE,OAAO,GAAG,EAAI;IAAI,iBAAiB;IAAO;GACnD,CAAA;EACE,CAAA;GAQG,KAQP,EACJ,UACA,UAAO,IACP,YAAS,GACT,WAAQ,4BACR,gBAAa,0BACb,aACA,mBACI;CACJ,IAAM,IAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAM,CAAC,EACvC,KAAK,IAAO,KAAU,GACtB,IAAI,IAAI,KAAK,KAAK,GAClB,IAAS,IAAK,IAAM,MAAO;AACjC,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,oDAAoD,EAAU;EAC5E,OAAO;GAAE,OAAO;GAAM,QAAQ;GAAM;YAFtC,CAIE,kBAAC,OAAD;GAAK,OAAO;GAAM,QAAQ;GAAM,WAAU;aAA1C,CACE,kBAAC,UAAD;IACE,IAAI,IAAO;IACX,IAAI,IAAO;IACR;IACH,MAAK;IACL,QAAQ;IACR,aAAa;IACb,CAAA,EACF,kBAAC,UAAD;IACE,IAAI,IAAO;IACX,IAAI,IAAO;IACR;IACH,MAAK;IACL,QAAQ;IACR,aAAa;IACb,eAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,WAAU;IACV,CAAA,CACE;MACL,KAAY,QACX,kBAAC,OAAD;GAAK,WAAU;GAA8D;GAAe,CAAA,CAE1F;;GAQG,IAAY;CACvB,SAAS;CACT,OAAO;CACP,KAAK;CACN,EAEY,KAMP,EAAE,aAAU,WAAQ,SAAM,YAAS,GAAG,mBAAgB;CAC1D,IAAM,IAAQ,KAAK,IAAI,GAAG,IAAW,IAAS,EAAK,EAC7C,KAAO,MAAc,GAAI,IAAI,IAAS,IAAI;AAChD,QACE,kBAAC,OAAD;EACE,WAAW,EAAG,yDAAyD,EAAU;EACjF,OAAO,EAAE,WAAQ;YAFnB;GAIE,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO,EAAI,EAAS;IAAE,iBAAiB,EAAU;IAAS,EAAI,CAAA;GAC5E,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO,EAAI,EAAO;IAAE,iBAAiB,EAAU;IAAO,EAAI,CAAA;GACxE,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO,EAAI,EAAK;IAAE,iBAAiB,EAAU;IAAK,EAAI,CAAA;GAChE;;GAIG,KAA2C,EAAE,mBACxD,kBAAC,OAAD;CAAK,WAAW,EAAG,gEAAgE,EAAU;WACzF;EAAC;EAAW;EAAS;EAAM,CAAW,KAAK,MAC3C,kBAAC,QAAD;EAAc,WAAU;YAAxB,CACE,kBAAC,QAAD;GAAM,WAAU;GAAsB,OAAO,EAAE,iBAAiB,EAAU,IAAI;GAAI,CAAA,EAClF,kBAAC,QAAD;GAAM,WAAU;aAAc;GAAS,CAAA,CAClC;IAHI,EAGJ,CACP;CACE,CAAA,EAOK,IAAqF;CAChG,UAAU;EAAE,MAAM;EAAU,MAAM;EAA+B;CACjE,QAAQ;EAAE,MAAM;EAAY,MAAM;EAAoC;CACtE,MAAM;EAAE,MAAM;EAAK,MAAM;EAAkC;CAC3D,UAAU;EAAE,MAAM;EAAmB,MAAM;EAA4B;CACvE,MAAM;EAAE,MAAM;EAAS,MAAM;EAA4B;CACzD,UAAU;EAAE,MAAM;EAAM,MAAM;EAAoC;CACnE,EAEY,IAAwD;CACnE,OAAO,EAAE,MAAM,+BAA+B;CAC9C,MAAM,EAAE,MAAM,4BAA4B;CAC1C,MAAM,EAAE,MAAM,oCAAoC;CAClD,WAAW,EAAE,MAAM,kCAAkC;CACrD,MAAM,EAAE,MAAM,+BAA+B;CAC7C,MAAM,EAAE,MAAM,oCAAoC;CAClD,WAAW,EAAE,MAAM,+BAA+B;CACnD,EAEY,IAA6E;CACxF,aAAa;EAAE,MAAM;EAAc,MAAM;EAA4B;CACrE,aAAa;EAAE,MAAM;EAAU,MAAM;EAA+B;CACpE,UAAU;EAAE,MAAM;EAAQ,MAAM;EAAkC;CAClE,WAAW;EAAE,MAAM;EAAU,MAAM;EAAoC;CACvE,UAAU;EAAE,MAAM;EAAmB,MAAM;EAA4B;CACvE,iBAAiB;EAAE,MAAM;EAAU,MAAM;EAA+B;CACzE,EAEY,IAGT;CACF,QAAQ;EAAE,MAAM;EAAQ,MAAM;EAA+B,MAAM;EAAM;CACzE,UAAU;EAAE,MAAM;EAAS,MAAM;EAAoC,MAAM;EAAK;CAChF,oBAAoB;EAAE,MAAM;EAAO,MAAM;EAAkC,MAAM;EAAO;CACxF,OAAO;EAAE,MAAM;EAAO,MAAM;EAA4B,MAAM;EAAM;CACpE,OAAO;EAAE,MAAM;EAAO,MAAM;EAA4B,MAAM;EAAM;CACpE,MAAM;EAAE,MAAM;EAAO,MAAM;EAA4B,MAAM;EAAM;CACnE,KAAK;EAAE,MAAM;EAAO,MAAM;EAA4B,MAAM;EAAM;CAClE,OAAO;EAAE,MAAM;EAAO,MAAM;EAA4B,MAAM;EAAM;CACrE,EAEY,IAGT;CACF,OAAO;EAAE,MAAM;EAAW,MAAM;EAA+B,OAAO;EAAS;CAC/E,WAAW;EAAE,MAAM;EAAO,MAAM;EAAoC,OAAO;EAAa;CACxF,UAAU;EAAE,MAAM;EAAO,MAAM;EAAoC,OAAO;EAAY;CACtF,QAAQ;EAAE,MAAM;EAAO,MAAM;EAAkC,OAAO;EAAU;CAChF,MAAM;EAAE,MAAM;EAAO,MAAM;EAA4B,OAAO;EAAQ;CACvE,EAOY,KAAwE,EACnF,SACA,UAAO,4BACP,mBAEA,kBAAC,QAAD;CACE,WAAW,EAAG,+DAA+D,EAAU;CACvF,OAAO;EAAE,iBAAiB,sBAAsB,EAAK;EAAqB,OAAO;EAAM;WAEtF;CACI,CAAA,EAII,KAAkF,EAC7F,UACA,UAAO,IACP,mBAAgB,WACZ;AACJ,KAAI,CAAC,OAAO,SAAS,EAAM,IAAI,MAAU,EACvC,QAAO,kBAAC,QAAD;EAAM,WAAU;YAAhB,CAA6C,MAAG,EAAY;;CAErE,IAAM,IAAK,IAAQ,GACb,IAAO,MAAkB,OAAO,IAAK,CAAC,GACtC,IAAO,IAAK,IAAa;AAC/B,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mEACA,IAAO,6BAA6B,yBACrC;YAJH;GAME,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;GAC/B,IAAK,MAAM;GACX,EAAM,QAAQ,EAAE;GAChB;GACI;;;AAKX,SAAgB,EAAoB,GAIzB;CACT,IAAM,IAAO,EAAK,cAAc,EAAK;AACrC,KAAI,MAAS,EAAG,QAAO,EAAK,gBAAgB,EAAK,cAAc,MAAM;CACrE,IAAM,KAAS,EAAK,eAAe,EAAK,iBAAiB,IAAQ;AACjE,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAK,CAAC"}
1
+ {"version":3,"file":"visuals.js","names":[],"sources":["../../../../src/mybodyshield/pages/_shared/visuals.tsx"],"sourcesContent":["/**\n * Shared fitness-domain visual helpers.\n * @module mybodyshield/pages/_shared\n *\n * Token-driven (no raw colors) SVG/CSS visual primitives + domain icon/tint\n * maps reused across the MyBodyShield pages. Everything reads fe-libs semantic\n * tokens so light/dark themes and custom themes work automatically.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport {\n Dumbbell,\n HeartPulse,\n Timer,\n Activity,\n StretchHorizontal,\n Flower2,\n Moon,\n Weight,\n Ruler,\n Percent,\n Heart,\n TrendingDown,\n TrendingUp,\n Zap,\n Waves,\n Target,\n Sparkles,\n Brain,\n BedDouble,\n Gauge,\n Smile,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n MybBodyMetricType,\n MybGoalType,\n MybMuscleGroup,\n MybRecoveryMetric,\n MybWorkoutType,\n} from '../../types';\n\n// ============================================================================\n// Meter — a horizontal progress bar with a token-driven fill\n// ============================================================================\n\nexport const Meter: FC<{\n /** 0–100 percentage. */\n value: number;\n /** CSS color for the fill (default: brand emerald). */\n color?: string;\n height?: number;\n className?: string;\n}> = ({ value, color = 'var(--color-action-primary-bg)', height = 8, className }) => {\n const pct = Math.max(0, Math.min(100, value));\n return (\n <div\n className={cn('w-full overflow-hidden rounded-full bg-bg-sunken', className)}\n style={{ height }}\n role=\"progressbar\"\n aria-valuenow={Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className=\"h-full rounded-full transition-[width] duration-500 ease-out\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n </div>\n );\n};\n\n// ============================================================================\n// ProgressRing — a circular progress indicator (goal progress, readiness)\n// ============================================================================\n\nexport const ProgressRing: FC<{\n value: number;\n size?: number;\n stroke?: number;\n color?: string;\n trackColor?: string;\n children?: ReactNode;\n className?: string;\n}> = ({\n value,\n size = 96,\n stroke = 9,\n color = 'var(--color-action-primary-bg)',\n trackColor = 'var(--color-bg-sunken)',\n children,\n className,\n}) => {\n const pct = Math.max(0, Math.min(100, value));\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n const offset = c - (pct / 100) * c;\n return (\n <div\n className={cn('relative inline-flex items-center justify-center', className)}\n style={{ width: size, height: size }}\n >\n <svg width={size} height={size} className=\"-rotate-90\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={trackColor}\n strokeWidth={stroke}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={color}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={offset}\n className=\"transition-[stroke-dashoffset] duration-700 ease-out\"\n />\n </svg>\n {children != null && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">{children}</div>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// MacroBar — a stacked protein/carbs/fat bar (grams → proportion)\n// ============================================================================\n\nexport const MACRO_HUE = {\n protein: 'var(--color-action-primary-bg)',\n carbs: 'var(--color-status-warning-text)',\n fat: 'var(--color-accent-primary)',\n} as const;\n\nexport const MacroBar: FC<{\n proteinG: number;\n carbsG: number;\n fatG: number;\n height?: number;\n className?: string;\n}> = ({ proteinG, carbsG, fatG, height = 8, className }) => {\n const total = Math.max(1, proteinG + carbsG + fatG);\n const seg = (g: number) => `${(g / total) * 100}%`;\n return (\n <div\n className={cn('flex w-full overflow-hidden rounded-full bg-bg-sunken', className)}\n style={{ height }}\n >\n <div style={{ width: seg(proteinG), backgroundColor: MACRO_HUE.protein }} />\n <div style={{ width: seg(carbsG), backgroundColor: MACRO_HUE.carbs }} />\n <div style={{ width: seg(fatG), backgroundColor: MACRO_HUE.fat }} />\n </div>\n );\n};\n\nexport const MacroLegend: FC<{ className?: string }> = ({ className }) => (\n <div className={cn('flex flex-wrap items-center gap-3 text-xs text-text-tertiary', className)}>\n {(['protein', 'carbs', 'fat'] as const).map((k) => (\n <span key={k} className=\"inline-flex items-center gap-1.5\">\n <span className=\"size-2 rounded-full\" style={{ backgroundColor: MACRO_HUE[k] }} />\n <span className=\"capitalize\">{k}</span>\n </span>\n ))}\n </div>\n);\n\n// ============================================================================\n// Domain icon + tint maps (semantic tokens only)\n// ============================================================================\n\n/**\n * Wrap an enum→meta map so an unknown server enum value (svc stores enums as\n * TEXT, so a value outside the client union is plausible) resolves to a safe\n * fallback entry instead of `undefined` — accessing `.icon`/`.tint`/`.label` on\n * `undefined` would otherwise crash the whole page.\n */\nfunction metaWithFallback<K extends string, V>(\n source: Record<K, V>,\n fallback: NoInfer<K>\n): Record<K, V> {\n return new Proxy(source, {\n get(target, prop: string) {\n return (target as Record<string, V>)[prop] ?? target[fallback];\n },\n }) as Record<K, V>;\n}\n\nconst WORKOUT_TYPE_META_SOURCE: Record<MybWorkoutType, { icon: typeof Dumbbell; tint: string }> = {\n STRENGTH: { icon: Dumbbell, tint: 'var(--color-accent-primary)' },\n CARDIO: { icon: HeartPulse, tint: 'var(--color-status-warning-text)' },\n HIIT: { icon: Zap, tint: 'var(--color-status-error-text)' },\n MOBILITY: { icon: StretchHorizontal, tint: 'var(--color-action-primary-bg)' },\n YOGA: { icon: Flower2, tint: 'var(--color-action-primary-bg)' },\n RECOVERY: { icon: Moon, tint: 'var(--color-status-success-text)' },\n};\nexport const WORKOUT_TYPE_META = metaWithFallback(WORKOUT_TYPE_META_SOURCE, 'STRENGTH');\n\nconst MUSCLE_META_SOURCE: Record<MybMuscleGroup, { tint: string }> = {\n CHEST: { tint: 'var(--color-accent-primary)' },\n BACK: { tint: 'var(--color-action-primary-bg)' },\n LEGS: { tint: 'var(--color-status-warning-text)' },\n SHOULDERS: { tint: 'var(--color-status-error-text)' },\n ARMS: { tint: 'var(--color-accent-primary)' },\n CORE: { tint: 'var(--color-status-success-text)' },\n FULL_BODY: { tint: 'var(--color-text-secondary)' },\n};\nexport const MUSCLE_META = metaWithFallback(MUSCLE_META_SOURCE, 'FULL_BODY');\n\nconst GOAL_TYPE_META_SOURCE: Record<MybGoalType, { icon: typeof Target; tint: string }> = {\n WEIGHT_LOSS: { icon: TrendingDown, tint: 'var(--color-action-primary-bg)' },\n MUSCLE_GAIN: { icon: Dumbbell, tint: 'var(--color-accent-primary)' },\n STRENGTH: { icon: Weight, tint: 'var(--color-status-error-text)' },\n ENDURANCE: { icon: Activity, tint: 'var(--color-status-warning-text)' },\n MOBILITY: { icon: StretchHorizontal, tint: 'var(--color-action-primary-bg)' },\n GENERAL_FITNESS: { icon: Sparkles, tint: 'var(--color-text-secondary)' },\n};\nexport const GOAL_TYPE_META = metaWithFallback(GOAL_TYPE_META_SOURCE, 'GENERAL_FITNESS');\n\nconst METRIC_META_SOURCE: Record<\n MybBodyMetricType,\n { icon: typeof Weight; tint: string; unit: string }\n> = {\n WEIGHT: { icon: Weight, tint: 'var(--color-accent-primary)', unit: 'kg' },\n BODY_FAT: { icon: Percent, tint: 'var(--color-status-warning-text)', unit: '%' },\n RESTING_HEART_RATE: { icon: Heart, tint: 'var(--color-status-error-text)', unit: 'bpm' },\n WAIST: { icon: Ruler, tint: 'var(--color-action-primary-bg)', unit: 'cm' },\n CHEST: { icon: Ruler, tint: 'var(--color-action-primary-bg)', unit: 'cm' },\n HIPS: { icon: Ruler, tint: 'var(--color-action-primary-bg)', unit: 'cm' },\n ARM: { icon: Ruler, tint: 'var(--color-action-primary-bg)', unit: 'cm' },\n THIGH: { icon: Ruler, tint: 'var(--color-action-primary-bg)', unit: 'cm' },\n};\nexport const METRIC_META = metaWithFallback(METRIC_META_SOURCE, 'WEIGHT');\n\nconst RECOVERY_META_SOURCE: Record<\n MybRecoveryMetric,\n { icon: typeof Gauge; tint: string; label: string }\n> = {\n SLEEP: { icon: BedDouble, tint: 'var(--color-accent-primary)', label: 'Sleep' },\n READINESS: { icon: Gauge, tint: 'var(--color-status-success-text)', label: 'Readiness' },\n SORENESS: { icon: Waves, tint: 'var(--color-status-warning-text)', label: 'Soreness' },\n STRESS: { icon: Brain, tint: 'var(--color-status-error-text)', label: 'Stress' },\n MOOD: { icon: Smile, tint: 'var(--color-action-primary-bg)', label: 'Mood' },\n};\nexport const RECOVERY_META = metaWithFallback(RECOVERY_META_SOURCE, 'READINESS');\n\n// ============================================================================\n// Small helpers\n// ============================================================================\n\n/** Circular icon chip with a soft tinted background. */\nexport const IconChip: FC<{ icon: ReactNode; tint?: string; className?: string }> = ({\n icon,\n tint = 'var(--color-action-primary-bg)',\n className,\n}) => (\n <span\n className={cn('flex size-9 shrink-0 items-center justify-center rounded-lg', className)}\n style={{ backgroundColor: `color-mix(in srgb, ${tint} 16%, transparent)`, color: tint }}\n >\n {icon}\n </span>\n);\n\n/** A small trend delta pill (up/down/flat) with semantic color. */\nexport const TrendPill: FC<{ delta: number; unit?: string; goodDirection?: 'up' | 'down' }> = ({\n delta,\n unit = '',\n goodDirection = 'up',\n}) => {\n if (!Number.isFinite(delta) || delta === 0) {\n return <span className=\"text-xs text-text-tertiary\">±0{unit}</span>;\n }\n const up = delta > 0;\n const good = goodDirection === 'up' ? up : !up;\n const Icon = up ? TrendingUp : TrendingDown;\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 text-xs font-medium tabular-nums',\n good ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {up ? '+' : ''}\n {delta.toFixed(1)}\n {unit}\n </span>\n );\n};\n\n/** Compute a goal's completion percentage from baseline → target → current. */\nexport function computeGoalProgress(goal: {\n baselineValue: number;\n targetValue: number;\n currentValue: number;\n}): number {\n const span = goal.targetValue - goal.baselineValue;\n if (span === 0) return goal.currentValue >= goal.targetValue ? 100 : 0;\n const done = ((goal.currentValue - goal.baselineValue) / span) * 100;\n return Math.max(0, Math.min(100, done));\n}\n\nexport { Timer };\n"],"mappings":"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"}