@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.
- package/dist/_virtual/__vite-optional-peer-dep_@emotion/is-prop-valid_framer-motion.js +10 -0
- package/dist/_virtual/__vite-optional-peer-dep_@emotion/is-prop-valid_framer-motion.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.js +5 -5
- package/dist/mybodyshield/pages/DashboardPage.js +422 -323
- package/dist/mybodyshield/pages/DashboardPage.js.map +1 -1
- package/dist/mybodyshield/pages/_shared/visuals.js +16 -16
- package/dist/mybodyshield/pages/_shared/visuals.js.map +1 -1
- package/dist/mybodyshield/pages/coaching/CoachingPage.js +235 -166
- package/dist/mybodyshield/pages/coaching/CoachingPage.js.map +1 -1
- package/dist/mybodyshield/pages/goals/GoalsPage.js +304 -249
- package/dist/mybodyshield/pages/goals/GoalsPage.js.map +1 -1
- package/dist/mybodyshield/pages/nutrition/NutritionPage.js +700 -533
- package/dist/mybodyshield/pages/nutrition/NutritionPage.js.map +1 -1
- package/dist/mybodyshield/pages/programs/ProgramDetailPage.js +518 -454
- package/dist/mybodyshield/pages/programs/ProgramDetailPage.js.map +1 -1
- package/dist/mybodyshield/pages/programs/ProgramsPage.js +282 -234
- package/dist/mybodyshield/pages/programs/ProgramsPage.js.map +1 -1
- package/dist/mybodyshield/pages/progress/ProgressPage.js +422 -311
- package/dist/mybodyshield/pages/progress/ProgressPage.js.map +1 -1
- package/dist/mybodyshield/pages/recovery/RecoveryPage.js +335 -246
- package/dist/mybodyshield/pages/recovery/RecoveryPage.js.map +1 -1
- package/dist/mybodyshield/pages/train/SessionDetailPage.js +395 -302
- package/dist/mybodyshield/pages/train/SessionDetailPage.js.map +1 -1
- package/dist/mybodyshield/pages/train/SessionsPage.js +111 -75
- package/dist/mybodyshield/pages/train/SessionsPage.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.js +63 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.js +55 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.js +62 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js +22 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/utils.js +13 -0
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/utils.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js +8 -0
- package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js +8 -0
- package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js +12 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js +19 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js +8 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js +17 -0
- package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js +8 -0
- package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js +8 -0
- package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js +10 -0
- package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/events/event-info.js +13 -0
- package/dist/node_modules/framer-motion/dist/es/events/event-info.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js +260 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js +24 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js +61 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/focus.js +29 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/focus.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/hover.js +22 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/hover.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js +140 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js +44 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/press.js +28 -0
- package/dist/node_modules/framer-motion/dist/es/gestures/press.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js +41 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js +27 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js +11 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js +53 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js +17 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js +15 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js +63 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js +11 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js +15 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js +48 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js +26 -0
- package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/index.js +72 -0
- package/dist/node_modules/framer-motion/dist/es/motion/index.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js +6 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js +23 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js +60 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js +52 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js +9 -0
- package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js +12 -0
- package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js +15 -0
- package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js +9 -0
- package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js +10 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js +23 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js +21 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js +9 -0
- package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js +13 -0
- package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js +28 -0
- package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js +11 -0
- package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js +32 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js +28 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js +13 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js +10 -0
- package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/distance.js +10 -0
- package/dist/node_modules/framer-motion/dist/es/utils/distance.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js +6 -0
- package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js +6 -0
- package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js +8 -0
- package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/use-composed-ref.js +27 -0
- package/dist/node_modules/framer-motion/dist/es/utils/use-composed-ref.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js +11 -0
- package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js +9 -0
- package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js +109 -0
- package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js +131 -0
- package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js +86 -0
- package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js +30 -0
- package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js +12 -0
- package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js +34 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js +24 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js +168 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js +11 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js +18 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js +11 -0
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js +47 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js +59 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js +28 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js +23 -0
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js +63 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js +69 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js +20 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js +38 -0
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js +24 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js +20 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js +27 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js +29 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js +7 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js +21 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js +18 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js +13 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js +37 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js +21 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js +26 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js +11 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js +19 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js +32 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js +7 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/order.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/order.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js +34 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js +17 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js +12 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js +13 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/hover.js +38 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/hover.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js +38 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js +23 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js +30 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js +18 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js +27 -0
- package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js +41 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js +45 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js +32 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js +31 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js +20 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js +30 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js +24 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js +586 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/state.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/state.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js +53 -0
- package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js +19 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js +21 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js +20 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/Feature.js +11 -0
- package/dist/node_modules/motion-dom/dist/es/render/Feature.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js +206 -0
- package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js +30 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js +58 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js +37 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js +30 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js +38 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js +13 -0
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/store.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/render/store.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js +42 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js +24 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js +30 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js +17 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js +12 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js +16 -0
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js +137 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js +21 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js +24 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js +23 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js +13 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js +22 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js +22 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js +12 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js +39 -0
- package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js +24 -0
- package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/resize/index.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/resize/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/stats/buffer.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/stats/buffer.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/border-radius.js +11 -0
- package/dist/node_modules/motion-dom/dist/es/utils/border-radius.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/delay.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/utils/delay.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js +35 -0
- package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js +32 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js +54 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js +16 -0
- package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js +11 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js +7 -0
- package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/index.js +94 -0
- package/dist/node_modules/motion-dom/dist/es/value/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/auto.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/auto.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js +21 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js +23 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js +17 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js +17 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js +18 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js +28 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js +54 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js +16 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js +18 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/int.js +10 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/int.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js +26 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js +66 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js +34 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js +17 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/test.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/test.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js +14 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js +8 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js +6 -0
- package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js +15 -0
- package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js +9 -0
- package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/array.js +12 -0
- package/dist/node_modules/motion-utils/dist/es/array.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/clamp.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/clamp.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js +7 -0
- package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/back.js +9 -0
- package/dist/node_modules/motion-utils/dist/es/easing/back.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/circ.js +8 -0
- package/dist/node_modules/motion-utils/dist/es/easing/circ.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js +20 -0
- package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/ease.js +7 -0
- package/dist/node_modules/motion-utils/dist/es/easing/ease.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js +33 -0
- package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/errors.js +12 -0
- package/dist/node_modules/motion-utils/dist/es/errors.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/format-error-message.js +8 -0
- package/dist/node_modules/motion-utils/dist/es/format-error-message.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/global-config.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/global-config.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/is-object.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/is-object.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/memo.js +10 -0
- package/dist/node_modules/motion-utils/dist/es/memo.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/noop.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/noop.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/pipe.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/pipe.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/progress.js +9 -0
- package/dist/node_modules/motion-utils/dist/es/progress.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/subscription-manager.js +28 -0
- package/dist/node_modules/motion-utils/dist/es/subscription-manager.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/time-conversion.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/time-conversion.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js +6 -0
- package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/warn-once.js +10 -0
- package/dist/node_modules/motion-utils/dist/es/warn-once.js.map +1 -0
- package/dist/node_modules/recharts/es6/cartesian/Area.js +435 -0
- package/dist/node_modules/recharts/es6/cartesian/Area.js.map +1 -0
- package/dist/node_modules/recharts/es6/chart/{LineChart.js → AreaChart.js} +5 -5
- package/dist/node_modules/recharts/es6/chart/{LineChart.js.map → AreaChart.js.map} +1 -1
- package/package.json +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Line.js +0 -473
- package/dist/node_modules/recharts/es6/cartesian/Line.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NutritionPage.js","names":[],"sources":["../../../../src/mybodyshield/pages/nutrition/NutritionPage.tsx"],"sourcesContent":["/**\n * Nutrition — plans, meal logging and daily macro targets.\n * @module mybodyshield/pages/nutrition\n *\n * Three tabs, all wired to the real `myb*` nutrition contract (no mock data):\n * - Today: daily macro roll-up (calories ring + macro bar + per-macro meters)\n * and the meals logged today, with inline \"Log meal\".\n * - Plan: the member's active nutrition plan (targets, dates, notes) with\n * create / edit-targets dialogs.\n * - Meals: the full meal log, filterable by meal type, offset-paginated.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react';\nimport {\n Flame,\n ClipboardList,\n UtensilsCrossed,\n Salad,\n Plus,\n Trash2,\n Pencil,\n Beef,\n Wheat,\n Droplet,\n Star,\n CheckCircle2,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Switch,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n Tabs,\n type TabItem,\n StatusBadge,\n MetricsCard,\n DataTable,\n type Column,\n FilterTabs,\n type FilterOption,\n Pagination,\n EmptyState,\n LoadingView,\n ErrorView,\n Section,\n} from '../../components';\nimport {\n useMybDailyMacros,\n useMybActiveNutritionPlan,\n useMybMeals,\n useMybCreateNutritionPlan,\n useMybUpdateNutritionPlan,\n useMybActivateNutritionPlan,\n useMybLogMeal,\n useMybDeleteMeal,\n useOffsetPager,\n} from '../../hooks';\nimport type { MybMealType, MybGoalType, MybMealLog, MybNutritionPlan } from '../../types';\nimport {\n formatKcal,\n formatGrams,\n formatNumber,\n formatDate,\n formatRelativeTime,\n formatEnumLabel,\n} from '../../utils/formatters';\nimport { Meter, ProgressRing, MacroBar, MacroLegend } from '../_shared/visuals';\n\n// ---------------------------------------------------------------------------\n// Constants & helpers\n// ---------------------------------------------------------------------------\n\ntype NutritionTab = 'today' | 'plan' | 'meals';\ntype MealFilterValue = 'ALL' | MybMealType;\n\nconst PAGE_SIZE = 25;\n\nconst MEAL_TYPES: MybMealType[] = ['BREAKFAST', 'LUNCH', 'DINNER', 'SNACK'];\nconst GOAL_TYPES: MybGoalType[] = [\n 'WEIGHT_LOSS',\n 'MUSCLE_GAIN',\n 'STRENGTH',\n 'ENDURANCE',\n 'MOBILITY',\n 'GENERAL_FITNESS',\n];\n\nconst TAB_ITEMS: TabItem<NutritionTab>[] = [\n { value: 'today', label: 'Today', icon: <Flame className=\"h-4 w-4\" /> },\n { value: 'plan', label: 'Plan', icon: <ClipboardList className=\"h-4 w-4\" /> },\n { value: 'meals', label: 'Meals', icon: <UtensilsCrossed className=\"h-4 w-4\" /> },\n];\n\nconst MEAL_FILTER_OPTIONS: FilterOption<MealFilterValue>[] = [\n { value: 'ALL', label: 'All' },\n ...MEAL_TYPES.map((t) => ({ value: t, label: formatEnumLabel(t) })),\n];\n\n/** Parse a numeric text field: empty → undefined, else the finite number. */\nconst numOrUndef = (raw: string): number | undefined => {\n const t = raw.trim();\n if (!t) return undefined;\n const n = Number(t);\n return Number.isFinite(n) ? n : undefined;\n};\n\n/** Render a positive number back into a text-input value ('' for 0/unset). */\nconst numToStr = (n: number | null | undefined): string => (n ? String(n) : '');\n\n/** ISO DateTime → yyyy-mm-dd for a native date input ('' when absent/invalid). */\nconst toDateInput = (iso: string | null | undefined): string => {\n if (!iso) return '';\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? '' : d.toISOString().slice(0, 10);\n};\n\n/** yyyy-mm-dd date-input value → ISO string (undefined when empty). */\nconst fromDateInput = (v: string): string | undefined =>\n v ? new Date(v).toISOString() : undefined;\n\ninterface MealForm {\n name: string;\n mealType: MybMealType;\n calories: string;\n proteinG: string;\n carbsG: string;\n fatG: string;\n servings: string;\n isFavorite: boolean;\n}\n\nconst EMPTY_MEAL: MealForm = {\n name: '',\n mealType: 'BREAKFAST',\n calories: '',\n proteinG: '',\n carbsG: '',\n fatG: '',\n servings: '',\n isFavorite: false,\n};\n\ninterface PlanForm {\n name: string;\n goalType: MybGoalType;\n calorieTarget: string;\n proteinTarget: string;\n carbsTarget: string;\n fatTarget: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\nconst EMPTY_PLAN: PlanForm = {\n name: '',\n goalType: 'GENERAL_FITNESS',\n calorieTarget: '',\n proteinTarget: '',\n carbsTarget: '',\n fatTarget: '',\n startDate: '',\n endDate: '',\n notes: '',\n};\n\n// ---------------------------------------------------------------------------\n// Page\n// ---------------------------------------------------------------------------\n\nexport function NutritionPage() {\n const [tab, setTab] = useState<NutritionTab>('today');\n\n // Data ---------------------------------------------------------------------\n const macros = useMybDailyMacros();\n const activePlan = useMybActiveNutritionPlan();\n const todayMealsQuery = useMybMeals({});\n\n const [mealFilter, setMealFilter] = useState<MealFilterValue>('ALL');\n const pager = useOffsetPager(PAGE_SIZE);\n const mealsQuery = useMybMeals({\n mealType: mealFilter === 'ALL' ? undefined : mealFilter,\n pagination: { limit: PAGE_SIZE, offset: pager.offset },\n });\n\n // Mutations ----------------------------------------------------------------\n const logMeal = useMybLogMeal();\n const deleteMeal = useMybDeleteMeal();\n const createPlan = useMybCreateNutritionPlan();\n const updatePlan = useMybUpdateNutritionPlan();\n const activatePlan = useMybActivateNutritionPlan();\n\n // Local UI state -----------------------------------------------------------\n const [actionError, setActionError] = useState<string | null>(null);\n const [pendingDeleteId, setPendingDeleteId] = useState<string | null>(null);\n\n // A just-created plan is NOT auto-activated by the backend, so it won't show\n // up via `useMybActiveNutritionPlan`. Hold it here so we can display it and\n // offer to activate it. Cleared once it becomes the active plan.\n const [shownPlanOverride, setShownPlanOverride] = useState<MybNutritionPlan | null>(null);\n\n const [mealOpen, setMealOpen] = useState(false);\n const [mealForm, setMealForm] = useState<MealForm>(EMPTY_MEAL);\n const [mealErr, setMealErr] = useState<string | null>(null);\n\n const [planOpen, setPlanOpen] = useState(false);\n const [planMode, setPlanMode] = useState<'create' | 'edit'>('create');\n const [planForm, setPlanForm] = useState<PlanForm>(EMPTY_PLAN);\n const [planErr, setPlanErr] = useState<string | null>(null);\n\n const activePlanData = activePlan.data ?? null;\n // The plan surfaced in the Plan tab: a freshly created (not-yet-active) plan\n // takes precedence over the active one so the member can act on it.\n const plan = shownPlanOverride ?? activePlanData;\n\n // Derived: meals logged today (client-side filter on loggedAt) --------------\n const todayMeals = useMemo(() => {\n const rows = todayMealsQuery.data?.items ?? [];\n const todayKey = new Date().toDateString();\n return rows\n .filter((m) => {\n const d = new Date(m.loggedAt);\n return !Number.isNaN(d.getTime()) && d.toDateString() === todayKey;\n })\n .sort((a, b) => new Date(b.loggedAt).getTime() - new Date(a.loggedAt).getTime());\n }, [todayMealsQuery.data]);\n\n const mealRows = mealsQuery.data?.items ?? [];\n\n // Handlers -----------------------------------------------------------------\n const onMealFilterChange = (v: MealFilterValue) => {\n setMealFilter(v);\n pager.reset();\n };\n\n const openLogMeal = () => {\n setMealForm(EMPTY_MEAL);\n setMealErr(null);\n setMealOpen(true);\n };\n\n const openCreatePlan = () => {\n setPlanMode('create');\n setPlanForm(EMPTY_PLAN);\n setPlanErr(null);\n setPlanOpen(true);\n };\n\n const openEditPlan = () => {\n if (!plan) return;\n setPlanMode('edit');\n setPlanForm({\n name: plan.name,\n goalType: plan.goalType,\n calorieTarget: numToStr(plan.calorieTarget),\n proteinTarget: numToStr(plan.proteinTarget),\n carbsTarget: numToStr(plan.carbsTarget),\n fatTarget: numToStr(plan.fatTarget),\n startDate: toDateInput(plan.startDate),\n endDate: toDateInput(plan.endDate),\n notes: plan.notes ?? '',\n });\n setPlanErr(null);\n setPlanOpen(true);\n };\n\n const submitMeal = async () => {\n if (!mealForm.name.trim()) {\n setMealErr('Meal name is required.');\n return;\n }\n setMealErr(null);\n try {\n await logMeal.mutateAsync({\n name: mealForm.name.trim(),\n mealType: mealForm.mealType,\n calories: numOrUndef(mealForm.calories),\n proteinG: numOrUndef(mealForm.proteinG),\n carbsG: numOrUndef(mealForm.carbsG),\n fatG: numOrUndef(mealForm.fatG),\n servings: numOrUndef(mealForm.servings),\n isFavorite: mealForm.isFavorite,\n planId: plan?.id ?? undefined,\n loggedAt: new Date().toISOString(),\n });\n setMealOpen(false);\n setMealForm(EMPTY_MEAL);\n } catch (e) {\n setMealErr(e instanceof Error ? e.message : 'Failed to log meal.');\n }\n };\n\n const submitPlan = async () => {\n if (!planForm.name.trim()) {\n setPlanErr('Plan name is required.');\n return;\n }\n setPlanErr(null);\n const shared = {\n goalType: planForm.goalType,\n calorieTarget: numOrUndef(planForm.calorieTarget),\n proteinTarget: numOrUndef(planForm.proteinTarget),\n carbsTarget: numOrUndef(planForm.carbsTarget),\n fatTarget: numOrUndef(planForm.fatTarget),\n startDate: fromDateInput(planForm.startDate),\n endDate: fromDateInput(planForm.endDate),\n notes: planForm.notes.trim() || undefined,\n };\n try {\n if (planMode === 'edit' && plan) {\n const updated = await updatePlan.mutateAsync({\n id: plan.id,\n input: { name: planForm.name.trim(), ...shared },\n });\n // Keep a held (not-yet-active) plan in sync with its edits.\n setShownPlanOverride((prev) => (prev && prev.id === updated.id ? updated : prev));\n } else {\n // Create does NOT auto-activate — surface the new plan and offer to\n // activate it from the Plan tab.\n const created = await createPlan.mutateAsync({ name: planForm.name.trim(), ...shared });\n setShownPlanOverride(created);\n setTab('plan');\n }\n setPlanOpen(false);\n } catch (e) {\n setPlanErr(e instanceof Error ? e.message : 'Failed to save plan.');\n }\n };\n\n const handleActivatePlan = async (id: string) => {\n setActionError(null);\n try {\n await activatePlan.mutateAsync(id);\n // Once active, drop the override so we track the refetched active plan.\n setShownPlanOverride(null);\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Failed to activate plan.');\n }\n };\n\n const handleDeleteMeal = async (id: string) => {\n if (!window.confirm('Delete this meal log? This cannot be undone.')) return;\n setPendingDeleteId(id);\n setActionError(null);\n try {\n await deleteMeal.mutateAsync(id);\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Failed to delete meal.');\n } finally {\n setPendingDeleteId(null);\n }\n };\n\n const planPending = planMode === 'edit' ? updatePlan.isPending : createPlan.isPending;\n\n // Meals-tab table columns --------------------------------------------------\n const mealColumns: Column<MybMealLog>[] = [\n {\n key: 'favorite',\n header: '',\n sortValue: (row) => (row.isFavorite ? 1 : 0),\n render: (row) => (\n <span className=\"inline-flex\" title={row.isFavorite ? 'Favorite meal' : 'Not a favorite'}>\n <Star\n className={`h-4 w-4 ${\n row.isFavorite ? 'fill-current text-accent' : 'text-text-tertiary'\n }`}\n />\n <span className=\"sr-only\">{row.isFavorite ? 'Favorite' : 'Not favorite'}</span>\n </span>\n ),\n },\n {\n key: 'name',\n header: 'Meal',\n render: (row) => <span className=\"font-medium text-text-primary\">{row.name}</span>,\n },\n {\n key: 'mealType',\n header: 'Type',\n render: (row) => <StatusBadge status={row.mealType} />,\n },\n {\n key: 'calories',\n header: 'Calories',\n align: 'right',\n sortValue: (row) => row.calories,\n render: (row) => <span className=\"tabular-nums\">{formatKcal(row.calories)}</span>,\n },\n {\n key: 'proteinG',\n header: 'Protein',\n align: 'right',\n hideOnMobile: true,\n sortValue: (row) => row.proteinG,\n render: (row) => (\n <span className=\"tabular-nums text-text-secondary\">{formatGrams(row.proteinG)}</span>\n ),\n },\n {\n key: 'carbsG',\n header: 'Carbs',\n align: 'right',\n hideOnMobile: true,\n sortValue: (row) => row.carbsG,\n render: (row) => (\n <span className=\"tabular-nums text-text-secondary\">{formatGrams(row.carbsG)}</span>\n ),\n },\n {\n key: 'fatG',\n header: 'Fat',\n align: 'right',\n hideOnMobile: true,\n sortValue: (row) => row.fatG,\n render: (row) => (\n <span className=\"tabular-nums text-text-secondary\">{formatGrams(row.fatG)}</span>\n ),\n },\n {\n key: 'servings',\n header: 'Servings',\n align: 'right',\n sortValue: (row) => row.servings,\n render: (row) => <span className=\"tabular-nums\">{formatNumber(row.servings)}</span>,\n },\n {\n key: 'loggedAt',\n header: 'Logged',\n hideOnMobile: true,\n sortValue: (row) => new Date(row.loggedAt).getTime(),\n render: (row) => (\n <span className=\"text-text-secondary\">{formatRelativeTime(row.loggedAt)}</span>\n ),\n },\n {\n key: 'actions',\n header: '',\n align: 'right',\n render: (row) => (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => handleDeleteMeal(row.id)}\n disabled={pendingDeleteId === row.id}\n aria-label=\"Delete meal\"\n >\n <Trash2 className=\"h-4 w-4 text-status-error-text\" />\n </Button>\n ),\n },\n ];\n\n // Per-tab header actions ---------------------------------------------------\n const actions =\n tab === 'today' ? (\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n ) : tab === 'plan' ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {plan && (\n <Button variant=\"outline\" onClick={openEditPlan}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit targets\n </Button>\n )}\n <Button onClick={openCreatePlan}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Create plan\n </Button>\n </div>\n ) : undefined;\n\n // -------------------------------------------------------------------------\n // Tab renderers\n // -------------------------------------------------------------------------\n\n const renderTodayTab = () => {\n if (macros.isLoading) return <LoadingView label=\"Loading today's nutrition…\" />;\n if (macros.isError) {\n return (\n <ErrorView message=\"We couldn't load your daily macros.\" onRetry={() => macros.refetch()} />\n );\n }\n const macroData = macros.data;\n if (!macroData) return <LoadingView label=\"Loading today's nutrition…\" />;\n\n const hasTarget = macroData.calorieTarget > 0;\n const hasConsumption = macroData.calories > 0 || todayMeals.length > 0;\n if (!hasTarget && !hasConsumption) {\n return (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Salad className=\"h-10 w-10\" />}\n title=\"No nutrition tracked yet\"\n description=\"Activate a nutrition plan or log your first meal to start tracking daily macros.\"\n action={\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n }\n />\n );\n }\n\n const caloriePct = macroData.calorieTarget\n ? (macroData.calories / macroData.calorieTarget) * 100\n : 0;\n\n return (\n <div className=\"space-y-6\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-base font-semibold text-text-primary\">Today's macros</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 <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 value={target ? (val / target) * 100 : 0} height={4} className=\"mt-2\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n </GlassCard>\n\n <Section title=\"Today's meals\" description=\"Everything you've logged today.\">\n {todayMealsQuery.isLoading ? (\n <LoadingView label=\"Loading meals…\" />\n ) : todayMealsQuery.isError ? (\n <ErrorView\n message=\"We couldn't load today's meals.\"\n onRetry={() => todayMealsQuery.refetch()}\n />\n ) : todayMeals.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Salad className=\"h-10 w-10\" />}\n title=\"No meals logged today\"\n description=\"Use “Log meal” to record what you've eaten and keep your macros current.\"\n action={\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n }\n />\n ) : (\n <GlassCard treatment=\"plain\" className=\"divide-y divide-border-seam/60 px-4\">\n {todayMeals.map((m) => (\n <div key={m.id} className=\"flex items-center gap-3 py-3\">\n <StatusBadge status={m.mealType} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{m.name}</p>\n <p className=\"text-xs text-text-tertiary\">\n {formatGrams(m.proteinG)} P · {formatGrams(m.carbsG)} C ·{' '}\n {formatGrams(m.fatG)} F · {formatNumber(m.servings)} serving\n {m.servings === 1 ? '' : 's'}\n </p>\n </div>\n <span className=\"shrink-0 text-sm font-semibold tabular-nums text-text-primary\">\n {formatKcal(m.calories)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => handleDeleteMeal(m.id)}\n disabled={pendingDeleteId === m.id}\n aria-label=\"Delete meal\"\n className=\"shrink-0\"\n >\n <Trash2 className=\"h-4 w-4 text-status-error-text\" />\n </Button>\n </div>\n ))}\n </GlassCard>\n )}\n </Section>\n </div>\n );\n };\n\n const renderPlanTab = () => {\n if (activePlan.isLoading) return <LoadingView label=\"Loading your nutrition plan…\" />;\n if (activePlan.isError) {\n return (\n <ErrorView\n message=\"We couldn't load your active nutrition plan.\"\n onRetry={() => activePlan.refetch()}\n />\n );\n }\n if (!plan) {\n return (\n <EmptyState\n illustration=\"empty-data\"\n icon={<ClipboardList className=\"h-10 w-10\" />}\n title=\"No active nutrition plan\"\n description=\"Create a nutrition plan to set your daily calorie and macro targets.\"\n action={\n <Button onClick={openCreatePlan}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Create plan\n </Button>\n }\n />\n );\n }\n\n const planStats: { icon: ReactNode; label: string; value: string }[] = [\n {\n icon: <Flame className=\"h-5 w-5\" />,\n label: 'Calorie target',\n value: plan.calorieTarget ? `${formatNumber(plan.calorieTarget)} kcal` : '—',\n },\n {\n icon: <Beef className=\"h-5 w-5\" />,\n label: 'Protein target',\n value: plan.proteinTarget ? formatGrams(plan.proteinTarget) : '—',\n },\n {\n icon: <Wheat className=\"h-5 w-5\" />,\n label: 'Carbs target',\n value: plan.carbsTarget ? formatGrams(plan.carbsTarget) : '—',\n },\n {\n icon: <Droplet className=\"h-5 w-5\" />,\n label: 'Fat target',\n value: plan.fatTarget ? formatGrams(plan.fatTarget) : '—',\n },\n ];\n\n return (\n <div className=\"space-y-6\">\n {!plan.isActive && (\n <div className=\"flex flex-wrap items-center justify-between gap-3 rounded-xl border border-border-seam bg-bg-sunken/60 px-4 py-3\">\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">\n This plan isn't active yet\n </p>\n <p className=\"text-xs text-text-secondary\">\n Activate it to track today's macros against these targets.\n </p>\n </div>\n <Button onClick={() => handleActivatePlan(plan.id)} disabled={activatePlan.isPending}>\n <CheckCircle2 className=\"mr-1.5 h-4 w-4\" />\n {activatePlan.isPending ? 'Activating…' : 'Activate this plan'}\n </Button>\n </div>\n )}\n\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{plan.name}</h2>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n {plan.isActive ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2.5 py-0.5 text-xs font-medium text-status-success-text\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" /> Active\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n Inactive\n </span>\n )}\n <StatusBadge status={plan.goalType} />\n {(plan.startDate || plan.endDate) && (\n <span className=\"text-sm text-text-secondary\">\n {formatDate(plan.startDate)} – {formatDate(plan.endDate)}\n </span>\n )}\n </div>\n </div>\n <Button variant=\"outline\" onClick={openEditPlan}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit targets\n </Button>\n </div>\n </GlassCard>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {planStats.map((s) => (\n <MetricsCard key={s.label} icon={s.icon} value={s.value} label={s.label} />\n ))}\n </div>\n\n {plan.notes && (\n <Section title=\"Notes\">\n <GlassCard treatment=\"plain\" className=\"p-4\">\n <p className=\"whitespace-pre-wrap text-sm text-text-secondary\">{plan.notes}</p>\n </GlassCard>\n </Section>\n )}\n </div>\n );\n };\n\n const renderMealsTab = () => {\n if (mealsQuery.isLoading) return <LoadingView label=\"Loading meal log…\" />;\n if (mealsQuery.isError) {\n return (\n <ErrorView message=\"We couldn't load your meal log.\" onRetry={() => mealsQuery.refetch()} />\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <FilterTabs\n options={MEAL_FILTER_OPTIONS}\n value={mealFilter}\n onChange={onMealFilterChange}\n />\n {mealRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<UtensilsCrossed className=\"h-10 w-10\" />}\n title={mealFilter === 'ALL' ? 'No meals logged yet' : 'No meals for this filter'}\n description={\n mealFilter === 'ALL'\n ? 'Log meals from the Today tab to build up your nutrition history.'\n : 'Try a different meal type, or log a meal to get started.'\n }\n action={\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={mealColumns}\n rows={mealRows}\n rowKey={(row) => row.id}\n defaultSort={{ key: 'loggedAt', dir: 'desc' }}\n />\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={mealRows.length}\n hasMore={mealsQuery.data?.pageInfo?.hasMore ?? false}\n onPageChange={(t) => pager.onPageChange(t)}\n />\n </>\n )}\n </div>\n );\n };\n\n // -------------------------------------------------------------------------\n return (\n <PageLayout\n title=\"Nutrition\"\n description=\"Plans, meal logging and daily macro targets.\"\n actions={actions}\n >\n <Tabs items={TAB_ITEMS} value={tab} onChange={setTab} className=\"mb-6\" />\n\n {actionError && (\n <div className=\"mb-4 rounded-lg border border-status-error-text/40 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text\">\n {actionError}\n </div>\n )}\n\n {tab === 'today' && renderTodayTab()}\n {tab === 'plan' && renderPlanTab()}\n {tab === 'meals' && renderMealsTab()}\n\n {/* Log-meal dialog ---------------------------------------------------- */}\n <ResponsiveDialog open={mealOpen} onOpenChange={setMealOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Log a meal</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record what you ate to update today's macros.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {mealErr && (\n <div className=\"rounded-lg border border-status-error-text/40 bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {mealErr}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-name\">Name</Label>\n <Input\n id=\"meal-name\"\n value={mealForm.name}\n onChange={(e) => setMealForm({ ...mealForm, name: e.target.value })}\n placeholder=\"Grilled chicken salad\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-type\">Meal type</Label>\n <Select\n value={mealForm.mealType}\n onValueChange={(v) =>\n // v is constrained to MEAL_TYPES rendered below.\n setMealForm({ ...mealForm, mealType: v as MybMealType })\n }\n >\n <SelectTrigger id=\"meal-type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {MEAL_TYPES.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-servings\">Servings</Label>\n <Input\n id=\"meal-servings\"\n type=\"number\"\n min={0}\n step=\"0.5\"\n value={mealForm.servings}\n onChange={(e) => setMealForm({ ...mealForm, servings: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-calories\">Calories (kcal)</Label>\n <Input\n id=\"meal-calories\"\n type=\"number\"\n min={0}\n value={mealForm.calories}\n onChange={(e) => setMealForm({ ...mealForm, calories: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-protein\">Protein (g)</Label>\n <Input\n id=\"meal-protein\"\n type=\"number\"\n min={0}\n value={mealForm.proteinG}\n onChange={(e) => setMealForm({ ...mealForm, proteinG: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-carbs\">Carbs (g)</Label>\n <Input\n id=\"meal-carbs\"\n type=\"number\"\n min={0}\n value={mealForm.carbsG}\n onChange={(e) => setMealForm({ ...mealForm, carbsG: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-fat\">Fat (g)</Label>\n <Input\n id=\"meal-fat\"\n type=\"number\"\n min={0}\n value={mealForm.fatG}\n onChange={(e) => setMealForm({ ...mealForm, fatG: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n </div>\n <div className=\"flex items-center justify-between gap-4 rounded-xl bg-bg-sunken/60 p-3\">\n <div className=\"min-w-0\">\n <Label htmlFor=\"meal-favorite\" className=\"cursor-pointer\">\n Favorite\n </Label>\n <p className=\"text-xs text-text-tertiary\">Save for quick re-log</p>\n </div>\n <Switch\n id=\"meal-favorite\"\n checked={mealForm.isFavorite}\n onCheckedChange={(v) => setMealForm({ ...mealForm, isFavorite: v })}\n />\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setMealOpen(false)}\n disabled={logMeal.isPending}\n >\n Cancel\n </Button>\n <Button onClick={submitMeal} disabled={logMeal.isPending}>\n {logMeal.isPending ? 'Logging…' : 'Log meal'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Create / edit plan dialog ----------------------------------------- */}\n <ResponsiveDialog open={planOpen} onOpenChange={setPlanOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {planMode === 'edit' ? 'Edit nutrition targets' : 'Create nutrition plan'}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {planMode === 'edit'\n ? 'Update your calorie and macro targets for this plan.'\n : 'Set your daily calorie and macro targets.'}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {planErr && (\n <div className=\"rounded-lg border border-status-error-text/40 bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {planErr}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-name\">Name</Label>\n <Input\n id=\"plan-name\"\n value={planForm.name}\n onChange={(e) => setPlanForm({ ...planForm, name: e.target.value })}\n placeholder=\"Lean bulk — Q3\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-goal\">Goal type</Label>\n <Select\n value={planForm.goalType}\n onValueChange={(v) =>\n // v is constrained to GOAL_TYPES rendered below.\n setPlanForm({ ...planForm, goalType: v as MybGoalType })\n }\n >\n <SelectTrigger id=\"plan-goal\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {GOAL_TYPES.map((g) => (\n <SelectItem key={g} value={g}>\n {formatEnumLabel(g)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-calories\">Calorie target (kcal)</Label>\n <Input\n id=\"plan-calories\"\n type=\"number\"\n min={0}\n value={planForm.calorieTarget}\n onChange={(e) => setPlanForm({ ...planForm, calorieTarget: e.target.value })}\n placeholder=\"2400\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-protein\">Protein target (g)</Label>\n <Input\n id=\"plan-protein\"\n type=\"number\"\n min={0}\n value={planForm.proteinTarget}\n onChange={(e) => setPlanForm({ ...planForm, proteinTarget: e.target.value })}\n placeholder=\"180\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-carbs\">Carbs target (g)</Label>\n <Input\n id=\"plan-carbs\"\n type=\"number\"\n min={0}\n value={planForm.carbsTarget}\n onChange={(e) => setPlanForm({ ...planForm, carbsTarget: e.target.value })}\n placeholder=\"250\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-fat\">Fat target (g)</Label>\n <Input\n id=\"plan-fat\"\n type=\"number\"\n min={0}\n value={planForm.fatTarget}\n onChange={(e) => setPlanForm({ ...planForm, fatTarget: e.target.value })}\n placeholder=\"70\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-start\">Start date</Label>\n <Input\n id=\"plan-start\"\n type=\"date\"\n value={planForm.startDate}\n onChange={(e) => setPlanForm({ ...planForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-end\">End date</Label>\n <Input\n id=\"plan-end\"\n type=\"date\"\n value={planForm.endDate}\n onChange={(e) => setPlanForm({ ...planForm, endDate: e.target.value })}\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-notes\">Notes</Label>\n <Textarea\n id=\"plan-notes\"\n value={planForm.notes}\n onChange={(e) => setPlanForm({ ...planForm, notes: e.target.value })}\n placeholder=\"Coaching notes, refeed schedule, supplements…\"\n rows={3}\n />\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setPlanOpen(false)} disabled={planPending}>\n Cancel\n </Button>\n <Button onClick={submitPlan} disabled={planPending}>\n {planPending ? 'Saving…' : planMode === 'edit' ? 'Save targets' : 'Create plan'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NutritionPage.js","names":[],"sources":["../../../../src/mybodyshield/pages/nutrition/NutritionPage.tsx"],"sourcesContent":["/**\n * Nutrition — plans, meal logging and daily macro targets.\n * @module mybodyshield/pages/nutrition\n *\n * Three tabs, all wired to the real `myb*` nutrition contract (no mock data):\n * - Today: daily macro roll-up (calories ring + macro bar + per-macro meters)\n * and the meals logged today, with inline \"Log meal\".\n * - Plan: the member's active nutrition plan (targets, dates, notes) with\n * create / edit-targets dialogs.\n * - Meals: the full meal log, filterable by meal type, offset-paginated.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react';\nimport { motion, useReducedMotion, type Variants } from 'framer-motion';\nimport {\n Flame,\n ClipboardList,\n UtensilsCrossed,\n Salad,\n Plus,\n Trash2,\n Pencil,\n Beef,\n Wheat,\n Droplet,\n Star,\n Calendar,\n CheckCircle2,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Switch,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n Tabs,\n type TabItem,\n StatusBadge,\n DataTable,\n type Column,\n FilterTabs,\n type FilterOption,\n Pagination,\n EmptyState,\n LoadingView,\n ErrorView,\n Section,\n} from '../../components';\nimport {\n useMybDailyMacros,\n useMybActiveNutritionPlan,\n useMybMeals,\n useMybCreateNutritionPlan,\n useMybUpdateNutritionPlan,\n useMybActivateNutritionPlan,\n useMybLogMeal,\n useMybDeleteMeal,\n useOffsetPager,\n} from '../../hooks';\nimport type { MybMealType, MybGoalType, MybMealLog, MybNutritionPlan } from '../../types';\nimport {\n formatKcal,\n formatGrams,\n formatNumber,\n formatDate,\n formatRelativeTime,\n formatEnumLabel,\n} from '../../utils/formatters';\nimport { Meter, ProgressRing, MacroBar, IconChip, MACRO_HUE } from '../_shared/visuals';\n\n// ---------------------------------------------------------------------------\n// Constants & helpers\n// ---------------------------------------------------------------------------\n\ntype NutritionTab = 'today' | 'plan' | 'meals';\ntype MealFilterValue = 'ALL' | MybMealType;\n\nconst PAGE_SIZE = 25;\n\nconst MEAL_TYPES: MybMealType[] = ['BREAKFAST', 'LUNCH', 'DINNER', 'SNACK'];\nconst GOAL_TYPES: MybGoalType[] = [\n 'WEIGHT_LOSS',\n 'MUSCLE_GAIN',\n 'STRENGTH',\n 'ENDURANCE',\n 'MOBILITY',\n 'GENERAL_FITNESS',\n];\n\nconst TAB_ITEMS: TabItem<NutritionTab>[] = [\n { value: 'today', label: 'Today', icon: <Flame className=\"h-4 w-4\" /> },\n { value: 'plan', label: 'Plan', icon: <ClipboardList className=\"h-4 w-4\" /> },\n { value: 'meals', label: 'Meals', icon: <UtensilsCrossed className=\"h-4 w-4\" /> },\n];\n\nconst MEAL_FILTER_OPTIONS: FilterOption<MealFilterValue>[] = [\n { value: 'ALL', label: 'All' },\n ...MEAL_TYPES.map((t) => ({ value: t, label: formatEnumLabel(t) })),\n];\n\n/** Parse a numeric text field: empty → undefined, else the finite number. */\nconst numOrUndef = (raw: string): number | undefined => {\n const t = raw.trim();\n if (!t) return undefined;\n const n = Number(t);\n return Number.isFinite(n) ? n : undefined;\n};\n\n/** Render a positive number back into a text-input value ('' for 0/unset). */\nconst numToStr = (n: number | null | undefined): string => (n ? String(n) : '');\n\n/** ISO DateTime → yyyy-mm-dd for a native date input ('' when absent/invalid). */\nconst toDateInput = (iso: string | null | undefined): string => {\n if (!iso) return '';\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? '' : d.toISOString().slice(0, 10);\n};\n\n/** yyyy-mm-dd date-input value → ISO string (undefined when empty). */\nconst fromDateInput = (v: string): string | undefined =>\n v ? new Date(v).toISOString() : undefined;\n\ninterface MealForm {\n name: string;\n mealType: MybMealType;\n calories: string;\n proteinG: string;\n carbsG: string;\n fatG: string;\n servings: string;\n isFavorite: boolean;\n}\n\nconst EMPTY_MEAL: MealForm = {\n name: '',\n mealType: 'BREAKFAST',\n calories: '',\n proteinG: '',\n carbsG: '',\n fatG: '',\n servings: '',\n isFavorite: false,\n};\n\ninterface PlanForm {\n name: string;\n goalType: MybGoalType;\n calorieTarget: string;\n proteinTarget: string;\n carbsTarget: string;\n fatTarget: string;\n startDate: string;\n endDate: string;\n notes: string;\n}\n\nconst EMPTY_PLAN: PlanForm = {\n name: '',\n goalType: 'GENERAL_FITNESS',\n calorieTarget: '',\n proteinTarget: '',\n carbsTarget: '',\n fatTarget: '',\n startDate: '',\n endDate: '',\n notes: '',\n};\n\n// ---------------------------------------------------------------------------\n// Page\n// ---------------------------------------------------------------------------\n\nexport function NutritionPage() {\n const [tab, setTab] = useState<NutritionTab>('today');\n const reduceMotion = useReducedMotion();\n\n // Data ---------------------------------------------------------------------\n const macros = useMybDailyMacros();\n const activePlan = useMybActiveNutritionPlan();\n const todayMealsQuery = useMybMeals({});\n\n const [mealFilter, setMealFilter] = useState<MealFilterValue>('ALL');\n const pager = useOffsetPager(PAGE_SIZE);\n const mealsQuery = useMybMeals({\n mealType: mealFilter === 'ALL' ? undefined : mealFilter,\n pagination: { limit: PAGE_SIZE, offset: pager.offset },\n });\n\n // Mutations ----------------------------------------------------------------\n const logMeal = useMybLogMeal();\n const deleteMeal = useMybDeleteMeal();\n const createPlan = useMybCreateNutritionPlan();\n const updatePlan = useMybUpdateNutritionPlan();\n const activatePlan = useMybActivateNutritionPlan();\n\n // Local UI state -----------------------------------------------------------\n const [actionError, setActionError] = useState<string | null>(null);\n const [pendingDeleteId, setPendingDeleteId] = useState<string | null>(null);\n\n // A just-created plan is NOT auto-activated by the backend, so it won't show\n // up via `useMybActiveNutritionPlan`. Hold it here so we can display it and\n // offer to activate it. Cleared once it becomes the active plan.\n const [shownPlanOverride, setShownPlanOverride] = useState<MybNutritionPlan | null>(null);\n\n const [mealOpen, setMealOpen] = useState(false);\n const [mealForm, setMealForm] = useState<MealForm>(EMPTY_MEAL);\n const [mealErr, setMealErr] = useState<string | null>(null);\n\n const [planOpen, setPlanOpen] = useState(false);\n const [planMode, setPlanMode] = useState<'create' | 'edit'>('create');\n const [planForm, setPlanForm] = useState<PlanForm>(EMPTY_PLAN);\n const [planErr, setPlanErr] = useState<string | null>(null);\n\n const activePlanData = activePlan.data ?? null;\n // The plan surfaced in the Plan tab: a freshly created (not-yet-active) plan\n // takes precedence over the active one so the member can act on it.\n const plan = shownPlanOverride ?? activePlanData;\n\n // Derived: meals logged today (client-side filter on loggedAt) --------------\n const todayMeals = useMemo(() => {\n const rows = todayMealsQuery.data?.items ?? [];\n const todayKey = new Date().toDateString();\n return rows\n .filter((m) => {\n const d = new Date(m.loggedAt);\n return !Number.isNaN(d.getTime()) && d.toDateString() === todayKey;\n })\n .sort((a, b) => new Date(b.loggedAt).getTime() - new Date(a.loggedAt).getTime());\n }, [todayMealsQuery.data]);\n\n const mealRows = mealsQuery.data?.items ?? [];\n\n // Handlers -----------------------------------------------------------------\n const onMealFilterChange = (v: MealFilterValue) => {\n setMealFilter(v);\n pager.reset();\n };\n\n const openLogMeal = () => {\n setMealForm(EMPTY_MEAL);\n setMealErr(null);\n setMealOpen(true);\n };\n\n const openCreatePlan = () => {\n setPlanMode('create');\n setPlanForm(EMPTY_PLAN);\n setPlanErr(null);\n setPlanOpen(true);\n };\n\n const openEditPlan = () => {\n if (!plan) return;\n setPlanMode('edit');\n setPlanForm({\n name: plan.name,\n goalType: plan.goalType,\n calorieTarget: numToStr(plan.calorieTarget),\n proteinTarget: numToStr(plan.proteinTarget),\n carbsTarget: numToStr(plan.carbsTarget),\n fatTarget: numToStr(plan.fatTarget),\n startDate: toDateInput(plan.startDate),\n endDate: toDateInput(plan.endDate),\n notes: plan.notes ?? '',\n });\n setPlanErr(null);\n setPlanOpen(true);\n };\n\n const submitMeal = async () => {\n if (!mealForm.name.trim()) {\n setMealErr('Meal name is required.');\n return;\n }\n setMealErr(null);\n try {\n await logMeal.mutateAsync({\n name: mealForm.name.trim(),\n mealType: mealForm.mealType,\n calories: numOrUndef(mealForm.calories),\n proteinG: numOrUndef(mealForm.proteinG),\n carbsG: numOrUndef(mealForm.carbsG),\n fatG: numOrUndef(mealForm.fatG),\n servings: numOrUndef(mealForm.servings),\n isFavorite: mealForm.isFavorite,\n planId: plan?.id ?? undefined,\n loggedAt: new Date().toISOString(),\n });\n setMealOpen(false);\n setMealForm(EMPTY_MEAL);\n } catch (e) {\n setMealErr(e instanceof Error ? e.message : 'Failed to log meal.');\n }\n };\n\n const submitPlan = async () => {\n if (!planForm.name.trim()) {\n setPlanErr('Plan name is required.');\n return;\n }\n setPlanErr(null);\n const shared = {\n goalType: planForm.goalType,\n calorieTarget: numOrUndef(planForm.calorieTarget),\n proteinTarget: numOrUndef(planForm.proteinTarget),\n carbsTarget: numOrUndef(planForm.carbsTarget),\n fatTarget: numOrUndef(planForm.fatTarget),\n startDate: fromDateInput(planForm.startDate),\n endDate: fromDateInput(planForm.endDate),\n notes: planForm.notes.trim() || undefined,\n };\n try {\n if (planMode === 'edit' && plan) {\n const updated = await updatePlan.mutateAsync({\n id: plan.id,\n input: { name: planForm.name.trim(), ...shared },\n });\n // Keep a held (not-yet-active) plan in sync with its edits.\n setShownPlanOverride((prev) => (prev && prev.id === updated.id ? updated : prev));\n } else {\n // Create does NOT auto-activate — surface the new plan and offer to\n // activate it from the Plan tab.\n const created = await createPlan.mutateAsync({ name: planForm.name.trim(), ...shared });\n setShownPlanOverride(created);\n setTab('plan');\n }\n setPlanOpen(false);\n } catch (e) {\n setPlanErr(e instanceof Error ? e.message : 'Failed to save plan.');\n }\n };\n\n const handleActivatePlan = async (id: string) => {\n setActionError(null);\n try {\n await activatePlan.mutateAsync(id);\n // Once active, drop the override so we track the refetched active plan.\n setShownPlanOverride(null);\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Failed to activate plan.');\n }\n };\n\n const handleDeleteMeal = async (id: string) => {\n if (!window.confirm('Delete this meal log? This cannot be undone.')) return;\n setPendingDeleteId(id);\n setActionError(null);\n try {\n await deleteMeal.mutateAsync(id);\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'Failed to delete meal.');\n } finally {\n setPendingDeleteId(null);\n }\n };\n\n const planPending = planMode === 'edit' ? updatePlan.isPending : createPlan.isPending;\n\n // Motion — subtle staggered entrance / tab-switch. Respects reduced motion:\n // when set, transforms collapse to a single-shot fade and stagger is disabled.\n const listVariants: Variants = {\n hidden: {},\n show: {\n transition: {\n staggerChildren: reduceMotion ? 0 : 0.06,\n delayChildren: reduceMotion ? 0 : 0.03,\n },\n },\n };\n const itemVariants: Variants = {\n hidden: reduceMotion ? { opacity: 0 } : { opacity: 0, y: 14 },\n show: {\n opacity: 1,\n y: 0,\n transition: { duration: reduceMotion ? 0.2 : 0.45, ease: 'easeOut' },\n },\n };\n\n // Meals-tab table columns --------------------------------------------------\n const mealColumns: Column<MybMealLog>[] = [\n {\n key: 'favorite',\n header: <Star className=\"h-3.5 w-3.5 text-action-primary-bg\" aria-hidden=\"true\" />,\n align: 'center',\n sortValue: (row) => (row.isFavorite ? 1 : 0),\n render: (row) => (\n <span className=\"inline-flex\" title={row.isFavorite ? 'Favorite meal' : 'Not a favorite'}>\n <Star\n className={`h-4 w-4 transition-colors ${\n row.isFavorite ? 'fill-current text-action-primary-bg' : 'text-text-tertiary'\n }`}\n />\n <span className=\"sr-only\">{row.isFavorite ? 'Favorite' : 'Not favorite'}</span>\n </span>\n ),\n },\n {\n key: 'name',\n header: 'Meal',\n render: (row) => <span className=\"font-medium text-text-primary\">{row.name}</span>,\n },\n {\n key: 'mealType',\n header: 'Type',\n render: (row) => <StatusBadge status={row.mealType} />,\n },\n {\n key: 'calories',\n header: 'Calories',\n align: 'right',\n sortValue: (row) => row.calories,\n render: (row) => (\n <span className=\"font-semibold tabular-nums text-text-primary\">\n {formatKcal(row.calories)}\n </span>\n ),\n },\n {\n key: 'proteinG',\n header: 'Protein',\n align: 'right',\n hideOnMobile: true,\n sortValue: (row) => row.proteinG,\n render: (row) => (\n <span className=\"tabular-nums text-text-secondary\">{formatGrams(row.proteinG)}</span>\n ),\n },\n {\n key: 'carbsG',\n header: 'Carbs',\n align: 'right',\n hideOnMobile: true,\n sortValue: (row) => row.carbsG,\n render: (row) => (\n <span className=\"tabular-nums text-text-secondary\">{formatGrams(row.carbsG)}</span>\n ),\n },\n {\n key: 'fatG',\n header: 'Fat',\n align: 'right',\n hideOnMobile: true,\n sortValue: (row) => row.fatG,\n render: (row) => (\n <span className=\"tabular-nums text-text-secondary\">{formatGrams(row.fatG)}</span>\n ),\n },\n {\n key: 'servings',\n header: 'Servings',\n align: 'right',\n sortValue: (row) => row.servings,\n render: (row) => <span className=\"tabular-nums\">{formatNumber(row.servings)}</span>,\n },\n {\n key: 'loggedAt',\n header: 'Logged',\n hideOnMobile: true,\n sortValue: (row) => new Date(row.loggedAt).getTime(),\n render: (row) => (\n <span className=\"text-text-secondary\">{formatRelativeTime(row.loggedAt)}</span>\n ),\n },\n {\n key: 'actions',\n header: '',\n align: 'right',\n render: (row) => (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => handleDeleteMeal(row.id)}\n disabled={pendingDeleteId === row.id}\n aria-label=\"Delete meal\"\n >\n <Trash2 className=\"h-4 w-4 text-status-error-text\" />\n </Button>\n ),\n },\n ];\n\n // Per-tab header actions ---------------------------------------------------\n const actions =\n tab === 'plan' ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {plan && (\n <Button variant=\"outline\" onClick={openEditPlan}>\n <Pencil className=\"mr-1.5 h-4 w-4\" /> Edit targets\n </Button>\n )}\n <Button onClick={openCreatePlan}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Create plan\n </Button>\n </div>\n ) : (\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n );\n\n // -------------------------------------------------------------------------\n // Tab renderers\n // -------------------------------------------------------------------------\n\n const renderTodayTab = () => {\n if (macros.isLoading) return <LoadingView label=\"Loading today's nutrition…\" />;\n if (macros.isError) {\n return (\n <ErrorView message=\"We couldn't load your daily macros.\" onRetry={() => macros.refetch()} />\n );\n }\n const macroData = macros.data;\n if (!macroData) return <LoadingView label=\"Loading today's nutrition…\" />;\n\n const hasTarget = macroData.calorieTarget > 0;\n const hasConsumption = macroData.calories > 0 || todayMeals.length > 0;\n if (!hasTarget && !hasConsumption) {\n return (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Salad className=\"h-10 w-10\" />}\n title=\"No nutrition tracked yet\"\n description=\"Activate a nutrition plan or log your first meal to start tracking daily macros.\"\n action={\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n }\n />\n );\n }\n\n const caloriePct = macroData.calorieTarget\n ? (macroData.calories / macroData.calorieTarget) * 100\n : 0;\n const pctFull = Math.round(Math.max(0, Math.min(100, caloriePct)));\n const macroTiles = [\n {\n label: 'Protein',\n value: macroData.proteinG,\n target: macroData.proteinTarget,\n color: MACRO_HUE.protein,\n },\n {\n label: 'Carbs',\n value: macroData.carbsG,\n target: macroData.carbsTarget,\n color: MACRO_HUE.carbs,\n },\n { label: 'Fat', value: macroData.fatG, target: macroData.fatTarget, color: MACRO_HUE.fat },\n ];\n\n return (\n <motion.div initial=\"hidden\" animate=\"show\" variants={listVariants} className=\"space-y-6\">\n {/* Hero — calorie ring + stacked macro bar + % of target ------------- */}\n <motion.div variants={itemVariants}>\n <GlassCard treatment=\"glass\" glow className=\"p-6 sm:p-7\">\n <div className=\"mb-5\">\n <h2 className=\"text-base font-semibold text-text-primary\">Today's macros</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 <div className=\"flex flex-col items-center gap-6 sm:flex-row sm:items-center sm:gap-8\">\n <div className=\"relative flex shrink-0 items-center justify-center\">\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-3 rounded-full blur-2xl\"\n style={{\n background:\n 'radial-gradient(circle, color-mix(in srgb, var(--color-action-primary-bg) 30%, transparent), transparent 68%)',\n }}\n />\n <ProgressRing value={caloriePct} size={168} stroke={14} className=\"relative\">\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 w-full flex-1 flex-col gap-4\">\n <MacroBar\n proteinG={macroData.proteinG}\n carbsG={macroData.carbsG}\n fatG={macroData.fatG}\n height={12}\n />\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-stretch\">\n <div className=\"flex-1 space-y-2.5\">\n {macroTiles.map((t) => (\n <div key={t.label} className=\"flex items-center justify-between gap-3\">\n <span className=\"inline-flex items-center gap-2 text-sm text-text-secondary\">\n <span\n className=\"h-2.5 w-2.5 rounded-full\"\n style={{ backgroundColor: t.color }}\n />\n {t.label}\n </span>\n <span className=\"text-sm font-semibold tabular-nums text-text-primary\">\n {formatGrams(t.value)}\n </span>\n </div>\n ))}\n </div>\n <div\n className=\"flex flex-col justify-center rounded-2xl px-4 py-3 sm:min-w-[9rem]\"\n style={{\n backgroundColor:\n 'color-mix(in srgb, var(--color-action-primary-bg) 12%, transparent)',\n }}\n >\n <span className=\"text-xs font-medium text-text-tertiary\">Calorie ring</span>\n <span className=\"text-2xl font-bold tabular-nums text-action-primary-bg\">\n {pctFull}%\n </span>\n <span className=\"text-xs text-text-secondary\">of daily target</span>\n </div>\n </div>\n </div>\n </div>\n </GlassCard>\n </motion.div>\n\n {/* Per-macro meter tiles -------------------------------------------- */}\n <motion.div\n variants={listVariants}\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-3 sm:gap-4\"\n >\n {macroTiles.map((t) => (\n <motion.div key={t.label} variants={itemVariants}>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"inline-flex items-center gap-2 text-sm font-medium text-text-primary\">\n <span\n className=\"h-2.5 w-2.5 rounded-full\"\n style={{ backgroundColor: t.color }}\n />\n {t.label}\n </span>\n <span className=\"text-sm tabular-nums text-text-secondary\">\n <span className=\"font-semibold text-text-primary\">{formatNumber(t.value)}</span>{' '}\n / {formatNumber(t.target)} g\n </span>\n </div>\n <Meter\n value={t.target ? (t.value / t.target) * 100 : 0}\n color={t.color}\n height={8}\n className=\"mt-3\"\n />\n </GlassCard>\n </motion.div>\n ))}\n </motion.div>\n\n {/* Today's meals ---------------------------------------------------- */}\n <motion.div variants={itemVariants}>\n <Section title=\"Today's meals\" description=\"Everything you've logged today.\">\n {todayMealsQuery.isLoading ? (\n <LoadingView label=\"Loading meals…\" />\n ) : todayMealsQuery.isError ? (\n <ErrorView\n message=\"We couldn't load today's meals.\"\n onRetry={() => todayMealsQuery.refetch()}\n />\n ) : todayMeals.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Salad className=\"h-10 w-10\" />}\n title=\"No meals logged today\"\n description=\"Use “Log meal” to record what you've eaten and keep your macros current.\"\n action={\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n }\n />\n ) : (\n <GlassCard treatment=\"plain\" className=\"divide-y divide-border-seam/60 px-2 sm:px-3\">\n {todayMeals.map((m) => (\n <div\n key={m.id}\n className=\"flex items-center gap-3 rounded-xl px-2 py-3 transition-colors hover:bg-bg-sunken/40\"\n >\n <StatusBadge status={m.mealType} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{m.name}</p>\n {m.isFavorite && (\n <Star\n className=\"h-3.5 w-3.5 shrink-0 fill-current text-action-primary-bg\"\n aria-label=\"Favorite meal\"\n />\n )}\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {formatGrams(m.proteinG)} P · {formatGrams(m.carbsG)} C ·{' '}\n {formatGrams(m.fatG)} F · {formatNumber(m.servings)} serving\n {m.servings === 1 ? '' : 's'}\n </p>\n </div>\n <span className=\"shrink-0 text-sm font-semibold tabular-nums text-text-primary\">\n {formatKcal(m.calories)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => handleDeleteMeal(m.id)}\n disabled={pendingDeleteId === m.id}\n aria-label=\"Delete meal\"\n className=\"shrink-0\"\n >\n <Trash2 className=\"h-4 w-4 text-status-error-text\" />\n </Button>\n </div>\n ))}\n </GlassCard>\n )}\n </Section>\n </motion.div>\n </motion.div>\n );\n };\n\n const renderPlanTab = () => {\n if (activePlan.isLoading) return <LoadingView label=\"Loading your nutrition plan…\" />;\n if (activePlan.isError) {\n return (\n <ErrorView\n message=\"We couldn't load your active nutrition plan.\"\n onRetry={() => activePlan.refetch()}\n />\n );\n }\n if (!plan) {\n return (\n <EmptyState\n illustration=\"empty-data\"\n icon={<ClipboardList className=\"h-10 w-10\" />}\n title=\"No active nutrition plan\"\n description=\"Create a nutrition plan to set your daily calorie and macro targets.\"\n action={\n <Button onClick={openCreatePlan}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Create plan\n </Button>\n }\n />\n );\n }\n\n const planStats: { icon: ReactNode; label: string; value: string; tint: string }[] = [\n {\n icon: <Flame className=\"h-5 w-5\" />,\n label: 'Calorie target',\n value: plan.calorieTarget ? `${formatNumber(plan.calorieTarget)} kcal` : '—',\n tint: 'var(--color-action-primary-bg)',\n },\n {\n icon: <Beef className=\"h-5 w-5\" />,\n label: 'Protein target',\n value: plan.proteinTarget ? formatGrams(plan.proteinTarget) : '—',\n tint: MACRO_HUE.protein,\n },\n {\n icon: <Wheat className=\"h-5 w-5\" />,\n label: 'Carbs target',\n value: plan.carbsTarget ? formatGrams(plan.carbsTarget) : '—',\n tint: MACRO_HUE.carbs,\n },\n {\n icon: <Droplet className=\"h-5 w-5\" />,\n label: 'Fat target',\n value: plan.fatTarget ? formatGrams(plan.fatTarget) : '—',\n tint: MACRO_HUE.fat,\n },\n ];\n\n return (\n <motion.div initial=\"hidden\" animate=\"show\" variants={listVariants} className=\"space-y-6\">\n {!plan.isActive && (\n <motion.div\n variants={itemVariants}\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-2xl border p-4\"\n style={{\n borderColor: 'color-mix(in srgb, var(--color-action-primary-bg) 32%, transparent)',\n backgroundColor: 'color-mix(in srgb, var(--color-action-primary-bg) 8%, transparent)',\n }}\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n <IconChip icon={<CheckCircle2 className=\"h-5 w-5\" />} />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">\n This plan isn't active yet\n </p>\n <p className=\"text-xs text-text-secondary\">\n Activate it to track today's macros against these targets.\n </p>\n </div>\n </div>\n <Button onClick={() => handleActivatePlan(plan.id)} disabled={activatePlan.isPending}>\n <CheckCircle2 className=\"mr-1.5 h-4 w-4\" />\n {activatePlan.isPending ? 'Activating…' : 'Activate this plan'}\n </Button>\n </motion.div>\n )}\n\n <motion.div variants={itemVariants}>\n <GlassCard treatment=\"glass\" glow className=\"relative overflow-hidden p-6 sm:p-7\">\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0\"\n style={{\n background:\n 'radial-gradient(120% 120% at 0% 0%, color-mix(in srgb, var(--color-action-primary-bg) 13%, transparent), transparent 55%)',\n }}\n />\n <div className=\"relative flex flex-wrap items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-action-primary-bg\">\n {plan.isActive ? 'Active plan' : 'Nutrition plan'}\n </p>\n <div className=\"mt-1.5 flex flex-wrap items-baseline gap-x-2 gap-y-1\">\n <h2 className=\"text-2xl font-bold text-text-primary\">{plan.name}</h2>\n {plan.calorieTarget > 0 && (\n <span className=\"text-lg font-semibold tabular-nums text-text-tertiary\">\n {formatNumber(plan.calorieTarget)} kcal\n </span>\n )}\n {plan.isActive ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2.5 py-0.5 text-xs font-medium text-status-success-text\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" /> Active\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n Inactive\n </span>\n )}\n </div>\n {(plan.startDate || plan.endDate) && (\n <p className=\"mt-2 inline-flex items-center gap-1.5 text-sm text-text-secondary\">\n <Calendar className=\"h-4 w-4 text-text-tertiary\" />\n {formatDate(plan.startDate)} – {formatDate(plan.endDate)}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <span className=\"text-sm text-text-tertiary\">Goal</span>\n <StatusBadge status={plan.goalType} />\n </div>\n </div>\n\n <motion.div\n variants={listVariants}\n className=\"relative mt-6 grid grid-cols-2 gap-3 sm:gap-4 lg:grid-cols-4\"\n >\n {planStats.map((s) => (\n <motion.div\n key={s.label}\n variants={itemVariants}\n className=\"rounded-2xl border border-border-seam bg-bg-sunken/40 p-4 transition-shadow duration-200 hover:shadow-elevation-2\"\n >\n <IconChip icon={s.icon} tint={s.tint} />\n <p className=\"mt-3 text-xs text-text-tertiary\">{s.label}</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">{s.value}</p>\n </motion.div>\n ))}\n </motion.div>\n </GlassCard>\n </motion.div>\n\n {plan.notes && (\n <motion.div variants={itemVariants}>\n <Section title=\"Notes\">\n <GlassCard treatment=\"plain\" className=\"p-4\">\n <p className=\"whitespace-pre-wrap text-sm text-text-secondary\">{plan.notes}</p>\n </GlassCard>\n </Section>\n </motion.div>\n )}\n </motion.div>\n );\n };\n\n const renderMealsTab = () => {\n if (mealsQuery.isLoading) return <LoadingView label=\"Loading meal log…\" />;\n if (mealsQuery.isError) {\n return (\n <ErrorView message=\"We couldn't load your meal log.\" onRetry={() => mealsQuery.refetch()} />\n );\n }\n\n return (\n <motion.div initial=\"hidden\" animate=\"show\" variants={listVariants} className=\"space-y-4\">\n <motion.div variants={itemVariants}>\n <FilterTabs\n options={MEAL_FILTER_OPTIONS}\n value={mealFilter}\n onChange={onMealFilterChange}\n />\n </motion.div>\n {mealRows.length === 0 ? (\n <motion.div variants={itemVariants}>\n <EmptyState\n illustration=\"empty-data\"\n icon={<UtensilsCrossed className=\"h-10 w-10\" />}\n title={mealFilter === 'ALL' ? 'No meals logged yet' : 'No meals for this filter'}\n description={\n mealFilter === 'ALL'\n ? 'Log meals from the Today tab to build up your nutrition history.'\n : 'Try a different meal type, or log a meal to get started.'\n }\n action={\n <Button onClick={openLogMeal}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Log meal\n </Button>\n }\n />\n </motion.div>\n ) : (\n <>\n <motion.div variants={itemVariants}>\n <DataTable\n columns={mealColumns}\n rows={mealRows}\n rowKey={(row) => row.id}\n defaultSort={{ key: 'loggedAt', dir: 'desc' }}\n />\n </motion.div>\n <motion.div variants={itemVariants}>\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={mealRows.length}\n hasMore={mealsQuery.data?.pageInfo?.hasMore ?? false}\n onPageChange={(t) => pager.onPageChange(t)}\n />\n </motion.div>\n </>\n )}\n </motion.div>\n );\n };\n\n // -------------------------------------------------------------------------\n return (\n <PageLayout\n title=\"Nutrition\"\n description=\"Plans, meal logging and daily macro targets.\"\n actions={actions}\n >\n <Tabs items={TAB_ITEMS} value={tab} onChange={setTab} className=\"mb-6\" />\n\n {actionError && (\n <div className=\"mb-4 rounded-lg border border-status-error-text/40 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text\">\n {actionError}\n </div>\n )}\n\n {tab === 'today' && renderTodayTab()}\n {tab === 'plan' && renderPlanTab()}\n {tab === 'meals' && renderMealsTab()}\n\n {/* Log-meal dialog ---------------------------------------------------- */}\n <ResponsiveDialog open={mealOpen} onOpenChange={setMealOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Log a meal</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record what you ate to update today's macros.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {mealErr && (\n <div className=\"rounded-lg border border-status-error-text/40 bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {mealErr}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-name\">Name</Label>\n <Input\n id=\"meal-name\"\n value={mealForm.name}\n onChange={(e) => setMealForm({ ...mealForm, name: e.target.value })}\n placeholder=\"Grilled chicken salad\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-type\">Meal type</Label>\n <Select\n value={mealForm.mealType}\n onValueChange={(v) =>\n // v is constrained to MEAL_TYPES rendered below.\n setMealForm({ ...mealForm, mealType: v as MybMealType })\n }\n >\n <SelectTrigger id=\"meal-type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {MEAL_TYPES.map((t) => (\n <SelectItem key={t} value={t}>\n {formatEnumLabel(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-servings\">Servings</Label>\n <Input\n id=\"meal-servings\"\n type=\"number\"\n min={0}\n step=\"0.5\"\n value={mealForm.servings}\n onChange={(e) => setMealForm({ ...mealForm, servings: e.target.value })}\n placeholder=\"1\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-calories\">Calories (kcal)</Label>\n <Input\n id=\"meal-calories\"\n type=\"number\"\n min={0}\n value={mealForm.calories}\n onChange={(e) => setMealForm({ ...mealForm, calories: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-protein\">Protein (g)</Label>\n <Input\n id=\"meal-protein\"\n type=\"number\"\n min={0}\n value={mealForm.proteinG}\n onChange={(e) => setMealForm({ ...mealForm, proteinG: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-carbs\">Carbs (g)</Label>\n <Input\n id=\"meal-carbs\"\n type=\"number\"\n min={0}\n value={mealForm.carbsG}\n onChange={(e) => setMealForm({ ...mealForm, carbsG: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"meal-fat\">Fat (g)</Label>\n <Input\n id=\"meal-fat\"\n type=\"number\"\n min={0}\n value={mealForm.fatG}\n onChange={(e) => setMealForm({ ...mealForm, fatG: e.target.value })}\n placeholder=\"0\"\n />\n </div>\n </div>\n <div className=\"flex items-center justify-between gap-4 rounded-xl bg-bg-sunken/60 p-3\">\n <div className=\"min-w-0\">\n <Label htmlFor=\"meal-favorite\" className=\"cursor-pointer\">\n Favorite\n </Label>\n <p className=\"text-xs text-text-tertiary\">Save for quick re-log</p>\n </div>\n <Switch\n id=\"meal-favorite\"\n checked={mealForm.isFavorite}\n onCheckedChange={(v) => setMealForm({ ...mealForm, isFavorite: v })}\n />\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setMealOpen(false)}\n disabled={logMeal.isPending}\n >\n Cancel\n </Button>\n <Button onClick={submitMeal} disabled={logMeal.isPending}>\n {logMeal.isPending ? 'Logging…' : 'Log meal'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Create / edit plan dialog ----------------------------------------- */}\n <ResponsiveDialog open={planOpen} onOpenChange={setPlanOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {planMode === 'edit' ? 'Edit nutrition targets' : 'Create nutrition plan'}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {planMode === 'edit'\n ? 'Update your calorie and macro targets for this plan.'\n : 'Set your daily calorie and macro targets.'}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {planErr && (\n <div className=\"rounded-lg border border-status-error-text/40 bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {planErr}\n </div>\n )}\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-name\">Name</Label>\n <Input\n id=\"plan-name\"\n value={planForm.name}\n onChange={(e) => setPlanForm({ ...planForm, name: e.target.value })}\n placeholder=\"Lean bulk — Q3\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-goal\">Goal type</Label>\n <Select\n value={planForm.goalType}\n onValueChange={(v) =>\n // v is constrained to GOAL_TYPES rendered below.\n setPlanForm({ ...planForm, goalType: v as MybGoalType })\n }\n >\n <SelectTrigger id=\"plan-goal\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {GOAL_TYPES.map((g) => (\n <SelectItem key={g} value={g}>\n {formatEnumLabel(g)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-calories\">Calorie target (kcal)</Label>\n <Input\n id=\"plan-calories\"\n type=\"number\"\n min={0}\n value={planForm.calorieTarget}\n onChange={(e) => setPlanForm({ ...planForm, calorieTarget: e.target.value })}\n placeholder=\"2400\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-protein\">Protein target (g)</Label>\n <Input\n id=\"plan-protein\"\n type=\"number\"\n min={0}\n value={planForm.proteinTarget}\n onChange={(e) => setPlanForm({ ...planForm, proteinTarget: e.target.value })}\n placeholder=\"180\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-carbs\">Carbs target (g)</Label>\n <Input\n id=\"plan-carbs\"\n type=\"number\"\n min={0}\n value={planForm.carbsTarget}\n onChange={(e) => setPlanForm({ ...planForm, carbsTarget: e.target.value })}\n placeholder=\"250\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-fat\">Fat target (g)</Label>\n <Input\n id=\"plan-fat\"\n type=\"number\"\n min={0}\n value={planForm.fatTarget}\n onChange={(e) => setPlanForm({ ...planForm, fatTarget: e.target.value })}\n placeholder=\"70\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-start\">Start date</Label>\n <Input\n id=\"plan-start\"\n type=\"date\"\n value={planForm.startDate}\n onChange={(e) => setPlanForm({ ...planForm, startDate: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-end\">End date</Label>\n <Input\n id=\"plan-end\"\n type=\"date\"\n value={planForm.endDate}\n onChange={(e) => setPlanForm({ ...planForm, endDate: e.target.value })}\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"plan-notes\">Notes</Label>\n <Textarea\n id=\"plan-notes\"\n value={planForm.notes}\n onChange={(e) => setPlanForm({ ...planForm, notes: e.target.value })}\n placeholder=\"Coaching notes, refeed schedule, supplements…\"\n rows={3}\n />\n </div>\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setPlanOpen(false)} disabled={planPending}>\n Cancel\n </Button>\n <Button onClick={submitPlan} disabled={planPending}>\n {planPending ? 'Saving…' : planMode === 'edit' ? 'Save targets' : 'Create plan'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|