@burdenoff/microfe-mybodyshield 2026.705.2 → 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 (566) 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/pages/DashboardPage.js +422 -323
  5. package/dist/mybodyshield/pages/DashboardPage.js.map +1 -1
  6. package/dist/mybodyshield/pages/_shared/visuals.js +16 -16
  7. package/dist/mybodyshield/pages/_shared/visuals.js.map +1 -1
  8. package/dist/mybodyshield/pages/coaching/CoachingPage.js +235 -166
  9. package/dist/mybodyshield/pages/coaching/CoachingPage.js.map +1 -1
  10. package/dist/mybodyshield/pages/goals/GoalsPage.js +304 -249
  11. package/dist/mybodyshield/pages/goals/GoalsPage.js.map +1 -1
  12. package/dist/mybodyshield/pages/nutrition/NutritionPage.js +700 -533
  13. package/dist/mybodyshield/pages/nutrition/NutritionPage.js.map +1 -1
  14. package/dist/mybodyshield/pages/programs/ProgramDetailPage.js +518 -454
  15. package/dist/mybodyshield/pages/programs/ProgramDetailPage.js.map +1 -1
  16. package/dist/mybodyshield/pages/programs/ProgramsPage.js +282 -234
  17. package/dist/mybodyshield/pages/programs/ProgramsPage.js.map +1 -1
  18. package/dist/mybodyshield/pages/progress/ProgressPage.js +422 -311
  19. package/dist/mybodyshield/pages/progress/ProgressPage.js.map +1 -1
  20. package/dist/mybodyshield/pages/recovery/RecoveryPage.js +335 -246
  21. package/dist/mybodyshield/pages/recovery/RecoveryPage.js.map +1 -1
  22. package/dist/mybodyshield/pages/train/SessionDetailPage.js +395 -302
  23. package/dist/mybodyshield/pages/train/SessionDetailPage.js.map +1 -1
  24. package/dist/mybodyshield/pages/train/SessionsPage.js +111 -75
  25. package/dist/mybodyshield/pages/train/SessionsPage.js.map +1 -1
  26. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.js +63 -0
  27. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.js.map +1 -0
  28. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.js +55 -0
  29. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.js.map +1 -0
  30. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.js +62 -0
  31. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.js.map +1 -0
  32. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js +22 -0
  33. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js.map +1 -0
  34. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/utils.js +13 -0
  35. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/utils.js.map +1 -0
  36. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js +8 -0
  37. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js.map +1 -0
  38. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js +8 -0
  39. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js.map +1 -0
  40. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js +12 -0
  41. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js.map +1 -0
  42. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js +19 -0
  43. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js.map +1 -0
  44. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js +8 -0
  45. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js.map +1 -0
  46. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js +17 -0
  47. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js.map +1 -0
  48. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js +8 -0
  49. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js.map +1 -0
  50. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js +8 -0
  51. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js.map +1 -0
  52. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js +10 -0
  53. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js.map +1 -0
  54. package/dist/node_modules/framer-motion/dist/es/events/event-info.js +13 -0
  55. package/dist/node_modules/framer-motion/dist/es/events/event-info.js.map +1 -0
  56. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js +260 -0
  57. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js.map +1 -0
  58. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js +24 -0
  59. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js.map +1 -0
  60. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js +61 -0
  61. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js.map +1 -0
  62. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js +29 -0
  63. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js.map +1 -0
  64. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js +22 -0
  65. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js.map +1 -0
  66. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js +140 -0
  67. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js.map +1 -0
  68. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js +44 -0
  69. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js.map +1 -0
  70. package/dist/node_modules/framer-motion/dist/es/gestures/press.js +28 -0
  71. package/dist/node_modules/framer-motion/dist/es/gestures/press.js.map +1 -0
  72. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js +41 -0
  73. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js.map +1 -0
  74. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js +27 -0
  75. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js.map +1 -0
  76. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js +11 -0
  77. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js.map +1 -0
  78. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js +53 -0
  79. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js.map +1 -0
  80. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js +17 -0
  81. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js.map +1 -0
  82. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js +15 -0
  83. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js.map +1 -0
  84. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js +63 -0
  85. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js.map +1 -0
  86. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js +11 -0
  87. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js.map +1 -0
  88. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js +15 -0
  89. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js.map +1 -0
  90. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js +48 -0
  91. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js.map +1 -0
  92. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js +26 -0
  93. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js.map +1 -0
  94. package/dist/node_modules/framer-motion/dist/es/motion/index.js +72 -0
  95. package/dist/node_modules/framer-motion/dist/es/motion/index.js.map +1 -0
  96. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js +6 -0
  97. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js.map +1 -0
  98. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js +23 -0
  99. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js.map +1 -0
  100. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js +60 -0
  101. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js.map +1 -0
  102. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js +52 -0
  103. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js.map +1 -0
  104. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js +9 -0
  105. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js.map +1 -0
  106. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js +12 -0
  107. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js.map +1 -0
  108. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js +15 -0
  109. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js.map +1 -0
  110. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js +9 -0
  111. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js.map +1 -0
  112. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js +10 -0
  113. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js.map +1 -0
  114. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js +23 -0
  115. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js.map +1 -0
  116. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js +21 -0
  117. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js.map +1 -0
  118. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js +9 -0
  119. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js.map +1 -0
  120. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js +13 -0
  121. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js.map +1 -0
  122. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js +28 -0
  123. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js.map +1 -0
  124. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js +11 -0
  125. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js.map +1 -0
  126. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js +32 -0
  127. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js.map +1 -0
  128. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js +28 -0
  129. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js.map +1 -0
  130. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js +13 -0
  131. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js.map +1 -0
  132. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js +10 -0
  133. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js.map +1 -0
  134. package/dist/node_modules/framer-motion/dist/es/utils/distance.js +10 -0
  135. package/dist/node_modules/framer-motion/dist/es/utils/distance.js.map +1 -0
  136. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js +6 -0
  137. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js.map +1 -0
  138. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js +6 -0
  139. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js.map +1 -0
  140. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js +8 -0
  141. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js.map +1 -0
  142. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
  143. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
  144. package/dist/node_modules/framer-motion/dist/es/utils/use-composed-ref.js +27 -0
  145. package/dist/node_modules/framer-motion/dist/es/utils/use-composed-ref.js.map +1 -0
  146. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js +11 -0
  147. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js.map +1 -0
  148. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js +9 -0
  149. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js.map +1 -0
  150. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js +109 -0
  151. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js.map +1 -0
  152. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js +131 -0
  153. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js.map +1 -0
  154. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js +86 -0
  155. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js.map +1 -0
  156. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js +30 -0
  157. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js.map +1 -0
  158. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js +12 -0
  159. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js.map +1 -0
  160. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js +15 -0
  161. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js.map +1 -0
  162. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js +34 -0
  163. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js.map +1 -0
  164. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js +24 -0
  165. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js.map +1 -0
  166. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js +168 -0
  167. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js.map +1 -0
  168. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js +11 -0
  169. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js.map +1 -0
  170. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js +18 -0
  171. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js.map +1 -0
  172. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js +8 -0
  173. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js.map +1 -0
  174. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js +11 -0
  175. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js.map +1 -0
  176. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js +47 -0
  177. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js.map +1 -0
  178. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js +59 -0
  179. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js.map +1 -0
  180. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js +28 -0
  181. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js.map +1 -0
  182. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js +23 -0
  183. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js.map +1 -0
  184. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js +63 -0
  185. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js.map +1 -0
  186. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js +69 -0
  187. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js.map +1 -0
  188. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js +10 -0
  189. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js.map +1 -0
  190. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js +10 -0
  191. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js.map +1 -0
  192. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js +14 -0
  193. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js.map +1 -0
  194. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js +8 -0
  195. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js.map +1 -0
  196. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js +8 -0
  197. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js.map +1 -0
  198. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js +9 -0
  199. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js.map +1 -0
  200. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js +20 -0
  201. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js.map +1 -0
  202. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js +38 -0
  203. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js.map +1 -0
  204. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js +6 -0
  205. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js.map +1 -0
  206. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js +9 -0
  207. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js.map +1 -0
  208. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js +24 -0
  209. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js.map +1 -0
  210. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js +9 -0
  211. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js.map +1 -0
  212. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js +20 -0
  213. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js.map +1 -0
  214. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js +27 -0
  215. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js.map +1 -0
  216. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js +29 -0
  217. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js.map +1 -0
  218. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js +10 -0
  219. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js.map +1 -0
  220. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js +7 -0
  221. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js.map +1 -0
  222. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js +9 -0
  223. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js.map +1 -0
  224. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js +21 -0
  225. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js.map +1 -0
  226. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js +8 -0
  227. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js.map +1 -0
  228. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js +18 -0
  229. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js.map +1 -0
  230. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js +15 -0
  231. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js.map +1 -0
  232. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js +6 -0
  233. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js.map +1 -0
  234. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js +13 -0
  235. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js.map +1 -0
  236. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js +37 -0
  237. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js.map +1 -0
  238. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js +21 -0
  239. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js.map +1 -0
  240. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js +26 -0
  241. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js.map +1 -0
  242. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js +11 -0
  243. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js.map +1 -0
  244. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js +10 -0
  245. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js.map +1 -0
  246. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js +10 -0
  247. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js.map +1 -0
  248. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js +10 -0
  249. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js.map +1 -0
  250. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js +19 -0
  251. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js.map +1 -0
  252. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js +8 -0
  253. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js.map +1 -0
  254. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js +32 -0
  255. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js.map +1 -0
  256. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js +8 -0
  257. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js.map +1 -0
  258. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js +7 -0
  259. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js.map +1 -0
  260. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js +15 -0
  261. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js.map +1 -0
  262. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js +34 -0
  263. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js.map +1 -0
  264. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js +17 -0
  265. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js.map +1 -0
  266. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js +12 -0
  267. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js.map +1 -0
  268. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js +13 -0
  269. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js.map +1 -0
  270. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js +38 -0
  271. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js.map +1 -0
  272. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js +38 -0
  273. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js.map +1 -0
  274. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js +23 -0
  275. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js.map +1 -0
  276. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js +30 -0
  277. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js.map +1 -0
  278. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js +6 -0
  279. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js.map +1 -0
  280. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js +6 -0
  281. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js.map +1 -0
  282. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js +6 -0
  283. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js.map +1 -0
  284. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js +18 -0
  285. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js.map +1 -0
  286. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js +27 -0
  287. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js.map +1 -0
  288. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js +41 -0
  289. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js.map +1 -0
  290. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js +14 -0
  291. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js.map +1 -0
  292. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js +45 -0
  293. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js.map +1 -0
  294. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js +32 -0
  295. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js.map +1 -0
  296. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js +31 -0
  297. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js.map +1 -0
  298. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js +20 -0
  299. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js.map +1 -0
  300. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js +30 -0
  301. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js.map +1 -0
  302. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js +15 -0
  303. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js.map +1 -0
  304. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js +24 -0
  305. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js.map +1 -0
  306. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js +586 -0
  307. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js.map +1 -0
  308. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js +9 -0
  309. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js.map +1 -0
  310. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js +53 -0
  311. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js.map +1 -0
  312. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js +15 -0
  313. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js.map +1 -0
  314. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js +15 -0
  315. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js.map +1 -0
  316. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js +19 -0
  317. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js.map +1 -0
  318. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js +14 -0
  319. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js.map +1 -0
  320. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js +6 -0
  321. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js.map +1 -0
  322. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js +8 -0
  323. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js.map +1 -0
  324. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js +21 -0
  325. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js.map +1 -0
  326. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js +20 -0
  327. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js.map +1 -0
  328. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js +14 -0
  329. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js.map +1 -0
  330. package/dist/node_modules/motion-dom/dist/es/render/Feature.js +11 -0
  331. package/dist/node_modules/motion-dom/dist/es/render/Feature.js.map +1 -0
  332. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js +206 -0
  333. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js.map +1 -0
  334. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js +30 -0
  335. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js.map +1 -0
  336. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js +6 -0
  337. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js.map +1 -0
  338. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js +58 -0
  339. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js.map +1 -0
  340. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js +9 -0
  341. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js.map +1 -0
  342. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js +8 -0
  343. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js.map +1 -0
  344. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js +37 -0
  345. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js.map +1 -0
  346. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js +30 -0
  347. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js.map +1 -0
  348. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js +38 -0
  349. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js.map +1 -0
  350. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js +10 -0
  351. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js.map +1 -0
  352. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js +13 -0
  353. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js.map +1 -0
  354. package/dist/node_modules/motion-dom/dist/es/render/store.js +6 -0
  355. package/dist/node_modules/motion-dom/dist/es/render/store.js.map +1 -0
  356. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js +42 -0
  357. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js.map +1 -0
  358. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js +24 -0
  359. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js.map +1 -0
  360. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js +30 -0
  361. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js.map +1 -0
  362. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js +6 -0
  363. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js.map +1 -0
  364. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js +17 -0
  365. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js.map +1 -0
  366. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js +12 -0
  367. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js.map +1 -0
  368. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js +16 -0
  369. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js.map +1 -0
  370. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js +137 -0
  371. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js.map +1 -0
  372. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js +21 -0
  373. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js.map +1 -0
  374. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js +8 -0
  375. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js.map +1 -0
  376. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js +14 -0
  377. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js.map +1 -0
  378. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js +10 -0
  379. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js.map +1 -0
  380. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js +6 -0
  381. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js.map +1 -0
  382. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js +8 -0
  383. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js.map +1 -0
  384. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js +15 -0
  385. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js.map +1 -0
  386. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js +24 -0
  387. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js.map +1 -0
  388. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js +23 -0
  389. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js.map +1 -0
  390. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js +13 -0
  391. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js.map +1 -0
  392. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js +6 -0
  393. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js.map +1 -0
  394. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js +10 -0
  395. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js.map +1 -0
  396. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js +22 -0
  397. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js.map +1 -0
  398. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js +22 -0
  399. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js.map +1 -0
  400. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js +12 -0
  401. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js.map +1 -0
  402. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js +14 -0
  403. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js.map +1 -0
  404. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js +39 -0
  405. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js.map +1 -0
  406. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js +24 -0
  407. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js.map +1 -0
  408. package/dist/node_modules/motion-dom/dist/es/resize/index.js +10 -0
  409. package/dist/node_modules/motion-dom/dist/es/resize/index.js.map +1 -0
  410. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js +9 -0
  411. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js.map +1 -0
  412. package/dist/node_modules/motion-dom/dist/es/utils/border-radius.js +11 -0
  413. package/dist/node_modules/motion-dom/dist/es/utils/border-radius.js.map +1 -0
  414. package/dist/node_modules/motion-dom/dist/es/utils/delay.js +14 -0
  415. package/dist/node_modules/motion-dom/dist/es/utils/delay.js.map +1 -0
  416. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js +35 -0
  417. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js.map +1 -0
  418. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js +9 -0
  419. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js.map +1 -0
  420. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js +9 -0
  421. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js.map +1 -0
  422. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js +9 -0
  423. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js.map +1 -0
  424. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js +32 -0
  425. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js.map +1 -0
  426. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js +54 -0
  427. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js.map +1 -0
  428. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js +8 -0
  429. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js.map +1 -0
  430. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js +10 -0
  431. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js.map +1 -0
  432. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js +6 -0
  433. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js.map +1 -0
  434. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js +9 -0
  435. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js.map +1 -0
  436. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js +16 -0
  437. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js.map +1 -0
  438. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js +6 -0
  439. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js.map +1 -0
  440. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js +14 -0
  441. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js.map +1 -0
  442. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js +11 -0
  443. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js.map +1 -0
  444. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js +7 -0
  445. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js.map +1 -0
  446. package/dist/node_modules/motion-dom/dist/es/value/index.js +94 -0
  447. package/dist/node_modules/motion-dom/dist/es/value/index.js.map +1 -0
  448. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js +9 -0
  449. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js.map +1 -0
  450. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js +21 -0
  451. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js.map +1 -0
  452. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js +23 -0
  453. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js.map +1 -0
  454. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js +14 -0
  455. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js.map +1 -0
  456. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js +17 -0
  457. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js.map +1 -0
  458. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js +17 -0
  459. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js.map +1 -0
  460. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js +18 -0
  461. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js.map +1 -0
  462. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js +28 -0
  463. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js.map +1 -0
  464. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js +54 -0
  465. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js.map +1 -0
  466. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js +16 -0
  467. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js.map +1 -0
  468. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js +18 -0
  469. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js.map +1 -0
  470. package/dist/node_modules/motion-dom/dist/es/value/types/int.js +10 -0
  471. package/dist/node_modules/motion-dom/dist/es/value/types/int.js.map +1 -0
  472. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js +26 -0
  473. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js.map +1 -0
  474. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js +66 -0
  475. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js.map +1 -0
  476. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js +34 -0
  477. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js.map +1 -0
  478. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js +17 -0
  479. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js.map +1 -0
  480. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js +14 -0
  481. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js.map +1 -0
  482. package/dist/node_modules/motion-dom/dist/es/value/types/test.js +6 -0
  483. package/dist/node_modules/motion-dom/dist/es/value/types/test.js.map +1 -0
  484. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js +14 -0
  485. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js.map +1 -0
  486. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js +6 -0
  487. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js.map +1 -0
  488. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js +14 -0
  489. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js.map +1 -0
  490. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js +6 -0
  491. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js.map +1 -0
  492. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js +6 -0
  493. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js.map +1 -0
  494. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js +8 -0
  495. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js.map +1 -0
  496. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js +6 -0
  497. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js.map +1 -0
  498. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js +6 -0
  499. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js.map +1 -0
  500. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js +6 -0
  501. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js.map +1 -0
  502. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js +9 -0
  503. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js.map +1 -0
  504. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js +15 -0
  505. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js.map +1 -0
  506. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js +9 -0
  507. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js.map +1 -0
  508. package/dist/node_modules/motion-utils/dist/es/array.js +12 -0
  509. package/dist/node_modules/motion-utils/dist/es/array.js.map +1 -0
  510. package/dist/node_modules/motion-utils/dist/es/clamp.js +6 -0
  511. package/dist/node_modules/motion-utils/dist/es/clamp.js.map +1 -0
  512. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js +7 -0
  513. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js.map +1 -0
  514. package/dist/node_modules/motion-utils/dist/es/easing/back.js +9 -0
  515. package/dist/node_modules/motion-utils/dist/es/easing/back.js.map +1 -0
  516. package/dist/node_modules/motion-utils/dist/es/easing/circ.js +8 -0
  517. package/dist/node_modules/motion-utils/dist/es/easing/circ.js.map +1 -0
  518. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js +20 -0
  519. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js.map +1 -0
  520. package/dist/node_modules/motion-utils/dist/es/easing/ease.js +7 -0
  521. package/dist/node_modules/motion-utils/dist/es/easing/ease.js.map +1 -0
  522. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js +6 -0
  523. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js.map +1 -0
  524. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js +6 -0
  525. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js.map +1 -0
  526. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js +6 -0
  527. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js.map +1 -0
  528. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js +6 -0
  529. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js.map +1 -0
  530. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js +33 -0
  531. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js.map +1 -0
  532. package/dist/node_modules/motion-utils/dist/es/errors.js +12 -0
  533. package/dist/node_modules/motion-utils/dist/es/errors.js.map +1 -0
  534. package/dist/node_modules/motion-utils/dist/es/format-error-message.js +8 -0
  535. package/dist/node_modules/motion-utils/dist/es/format-error-message.js.map +1 -0
  536. package/dist/node_modules/motion-utils/dist/es/global-config.js +6 -0
  537. package/dist/node_modules/motion-utils/dist/es/global-config.js.map +1 -0
  538. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js +6 -0
  539. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js.map +1 -0
  540. package/dist/node_modules/motion-utils/dist/es/is-object.js +6 -0
  541. package/dist/node_modules/motion-utils/dist/es/is-object.js.map +1 -0
  542. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js +6 -0
  543. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js.map +1 -0
  544. package/dist/node_modules/motion-utils/dist/es/memo.js +10 -0
  545. package/dist/node_modules/motion-utils/dist/es/memo.js.map +1 -0
  546. package/dist/node_modules/motion-utils/dist/es/noop.js +6 -0
  547. package/dist/node_modules/motion-utils/dist/es/noop.js.map +1 -0
  548. package/dist/node_modules/motion-utils/dist/es/pipe.js +6 -0
  549. package/dist/node_modules/motion-utils/dist/es/pipe.js.map +1 -0
  550. package/dist/node_modules/motion-utils/dist/es/progress.js +9 -0
  551. package/dist/node_modules/motion-utils/dist/es/progress.js.map +1 -0
  552. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js +28 -0
  553. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js.map +1 -0
  554. package/dist/node_modules/motion-utils/dist/es/time-conversion.js +6 -0
  555. package/dist/node_modules/motion-utils/dist/es/time-conversion.js.map +1 -0
  556. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js +6 -0
  557. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js.map +1 -0
  558. package/dist/node_modules/motion-utils/dist/es/warn-once.js +10 -0
  559. package/dist/node_modules/motion-utils/dist/es/warn-once.js.map +1 -0
  560. package/dist/node_modules/recharts/es6/cartesian/Area.js +435 -0
  561. package/dist/node_modules/recharts/es6/cartesian/Area.js.map +1 -0
  562. package/dist/node_modules/recharts/es6/chart/{LineChart.js → AreaChart.js} +5 -5
  563. package/dist/node_modules/recharts/es6/chart/{LineChart.js.map → AreaChart.js.map} +1 -1
  564. package/package.json +1 -1
  565. package/dist/node_modules/recharts/es6/cartesian/Line.js +0 -473
  566. 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 <button\n key={g.id}\n type=\"button\"\n onClick={() => navigateTo('goals')}\n className=\"text-left\"\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} 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\">\n {formatPercent(pct)}\n </span>\n </div>\n </div>\n </GlassCard>\n </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) => {\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":"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"}
@@ -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 }) => {
@@ -116,11 +116,11 @@ var O = D({
116
116
  },
117
117
  MOBILITY: {
118
118
  icon: m,
119
- tint: "var(--color-accent-teal)"
119
+ tint: "var(--color-action-primary-bg)"
120
120
  },
121
121
  YOGA: {
122
122
  icon: a,
123
- tint: "var(--color-accent-teal)"
123
+ tint: "var(--color-action-primary-bg)"
124
124
  },
125
125
  RECOVERY: {
126
126
  icon: l,
@@ -128,7 +128,7 @@ var O = D({
128
128
  }
129
129
  }, "STRENGTH"), k = D({
130
130
  CHEST: { tint: "var(--color-accent-primary)" },
131
- BACK: { tint: "var(--color-accent-teal)" },
131
+ BACK: { tint: "var(--color-action-primary-bg)" },
132
132
  LEGS: { tint: "var(--color-status-warning-text)" },
133
133
  SHOULDERS: { tint: "var(--color-status-error-text)" },
134
134
  ARMS: { tint: "var(--color-accent-primary)" },
@@ -137,7 +137,7 @@ var O = D({
137
137
  }, "FULL_BODY"), A = D({
138
138
  WEIGHT_LOSS: {
139
139
  icon: h,
140
- tint: "var(--color-accent-teal)"
140
+ tint: "var(--color-action-primary-bg)"
141
141
  },
142
142
  MUSCLE_GAIN: {
143
143
  icon: i,
@@ -153,7 +153,7 @@ var O = D({
153
153
  },
154
154
  MOBILITY: {
155
155
  icon: m,
156
- tint: "var(--color-accent-teal)"
156
+ tint: "var(--color-action-primary-bg)"
157
157
  },
158
158
  GENERAL_FITNESS: {
159
159
  icon: p,
@@ -177,27 +177,27 @@ var O = D({
177
177
  },
178
178
  WAIST: {
179
179
  icon: d,
180
- tint: "var(--color-accent-teal)",
180
+ tint: "var(--color-action-primary-bg)",
181
181
  unit: "cm"
182
182
  },
183
183
  CHEST: {
184
184
  icon: d,
185
- tint: "var(--color-accent-teal)",
185
+ tint: "var(--color-action-primary-bg)",
186
186
  unit: "cm"
187
187
  },
188
188
  HIPS: {
189
189
  icon: d,
190
- tint: "var(--color-accent-teal)",
190
+ tint: "var(--color-action-primary-bg)",
191
191
  unit: "cm"
192
192
  },
193
193
  ARM: {
194
194
  icon: d,
195
- tint: "var(--color-accent-teal)",
195
+ tint: "var(--color-action-primary-bg)",
196
196
  unit: "cm"
197
197
  },
198
198
  THIGH: {
199
199
  icon: d,
200
- tint: "var(--color-accent-teal)",
200
+ tint: "var(--color-action-primary-bg)",
201
201
  unit: "cm"
202
202
  }
203
203
  }, "WEIGHT"), M = D({
@@ -223,10 +223,10 @@ var O = D({
223
223
  },
224
224
  MOOD: {
225
225
  icon: f,
226
- tint: "var(--color-accent-teal)",
226
+ tint: "var(--color-action-primary-bg)",
227
227
  label: "Mood"
228
228
  }
229
- }, "READINESS"), N = ({ 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", {
230
230
  className: e("flex size-9 shrink-0 items-center justify-center rounded-lg", r),
231
231
  style: {
232
232
  backgroundColor: `color-mix(in srgb, ${n} 16%, transparent)`,
@@ -256,6 +256,6 @@ function F(e) {
256
256
  return Math.max(0, Math.min(100, n));
257
257
  }
258
258
  //#endregion
259
- export { A as GOAL_TYPE_META, N as IconChip, 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 };
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 };
260
260
 
261
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\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-accent-teal)' },\n YOGA: { icon: Flower2, tint: 'var(--color-accent-teal)' },\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-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};\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-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};\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-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};\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-accent-teal)', 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-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":"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"}
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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"}