@burdenoff/microfe-mybodyshield 2026.705.1 → 2026.706.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/components/DataTable.js +8 -4
- package/dist/mybodyshield/components/DataTable.js.map +1 -1
- package/dist/mybodyshield/components/EvidenceUpload.js +92 -4
- package/dist/mybodyshield/components/EvidenceUpload.js.map +1 -0
- package/dist/mybodyshield/components/FileLink.js +35 -2
- package/dist/mybodyshield/components/FileLink.js.map +1 -0
- package/dist/mybodyshield/components/MybDiscussion.js +107 -6
- package/dist/mybodyshield/components/MybDiscussion.js.map +1 -0
- package/dist/mybodyshield/components/MybTags.js +148 -4
- package/dist/mybodyshield/components/MybTags.js.map +1 -0
- package/dist/mybodyshield/components/Pagination.js.map +1 -1
- package/dist/mybodyshield/components/UserSearchSelect.js +148 -0
- package/dist/mybodyshield/components/UserSearchSelect.js.map +1 -0
- package/dist/mybodyshield/components/index.js +1 -0
- package/dist/mybodyshield/hooks/index.js +1 -0
- package/dist/mybodyshield/hooks/useMyBodyShieldApi.js +47 -27
- package/dist/mybodyshield/hooks/useMyBodyShieldApi.js.map +1 -1
- package/dist/mybodyshield/hooks/useMybComments.js +44 -2
- package/dist/mybodyshield/hooks/useMybComments.js.map +1 -0
- package/dist/mybodyshield/hooks/useMybFiles.js +80 -3
- package/dist/mybodyshield/hooks/useMybFiles.js.map +1 -0
- package/dist/mybodyshield/hooks/useMybTags.js +88 -2
- package/dist/mybodyshield/hooks/useMybTags.js.map +1 -0
- package/dist/mybodyshield/hooks/useMybUsers.js +36 -0
- package/dist/mybodyshield/hooks/useMybUsers.js.map +1 -0
- package/dist/mybodyshield/pages/DashboardPage.js +444 -340
- package/dist/mybodyshield/pages/DashboardPage.js.map +1 -1
- package/dist/mybodyshield/pages/_shared/visuals.js +29 -23
- package/dist/mybodyshield/pages/_shared/visuals.js.map +1 -1
- package/dist/mybodyshield/pages/coaching/CoachingPage.js +272 -179
- package/dist/mybodyshield/pages/coaching/CoachingPage.js.map +1 -1
- package/dist/mybodyshield/pages/goals/GoalsPage.js +304 -257
- package/dist/mybodyshield/pages/goals/GoalsPage.js.map +1 -1
- package/dist/mybodyshield/pages/nutrition/NutritionPage.js +745 -504
- package/dist/mybodyshield/pages/nutrition/NutritionPage.js.map +1 -1
- package/dist/mybodyshield/pages/programs/ProgramDetailPage.js +688 -320
- 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 +447 -299
- 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 +380 -267
- package/dist/mybodyshield/pages/train/SessionDetailPage.js.map +1 -1
- package/dist/mybodyshield/pages/train/SessionsPage.js +111 -78
- 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 +2 -2
- 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} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\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 useMybLogMeal,\n useMybDeleteMeal,\n useOffsetPager,\n} from '../../hooks';\nimport type { MybMealType, MybGoalType, MybMealLog } 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}\n\nconst EMPTY_MEAL: MealForm = {\n name: '',\n mealType: 'BREAKFAST',\n calories: '',\n proteinG: '',\n carbsG: '',\n fatG: '',\n servings: '',\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\n // Local UI state -----------------------------------------------------------\n const [actionError, setActionError] = useState<string | null>(null);\n const [pendingDeleteId, setPendingDeleteId] = useState<string | 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 plan = activePlan.data ?? null;\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 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 await updatePlan.mutateAsync({\n id: plan.id,\n input: { name: planForm.name.trim(), ...shared },\n });\n } else {\n await createPlan.mutateAsync({ name: planForm.name.trim(), ...shared });\n }\n setPlanOpen(false);\n } catch (e) {\n setPlanErr(e instanceof Error ? e.message : 'Failed to save 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: '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 <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 <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>\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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"}
|