diff --git a/package-lock.json b/package-lock.json
index f63e2af..a71b9d4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -25,6 +25,7 @@
"framer-motion": "10.16.4",
"howler": "2.2.4",
"js-confetti": "0.12.0",
+ "motion": "12.23.12",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hotkeys-hook": "3.2.1",
@@ -20732,6 +20733,74 @@
"node": ">=0.10.0"
}
},
+ "node_modules/motion": {
+ "version": "12.23.12",
+ "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.12.tgz",
+ "integrity": "sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==",
+ "license": "MIT",
+ "dependencies": {
+ "framer-motion": "^12.23.12",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.23.12",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz",
+ "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.23.6"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.23.6",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
+ "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==",
+ "license": "MIT"
+ },
+ "node_modules/motion/node_modules/framer-motion": {
+ "version": "12.23.12",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz",
+ "integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.23.12",
+ "motion-utils": "^12.23.6",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/mrmime": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
diff --git a/package.json b/package.json
index f68f5f4..7f6e7ae 100644
--- a/package.json
+++ b/package.json
@@ -41,6 +41,7 @@
"framer-motion": "10.16.4",
"howler": "2.2.4",
"js-confetti": "0.12.0",
+ "motion": "12.23.12",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hotkeys-hook": "3.2.1",
diff --git a/src/components/buttons/unselect/unselect.tsx b/src/components/buttons/unselect/unselect.tsx
index 8934128..978d02b 100644
--- a/src/components/buttons/unselect/unselect.tsx
+++ b/src/components/buttons/unselect/unselect.tsx
@@ -1,6 +1,6 @@
import { useCallback } from 'react';
import { BiUndo, BiTrash } from 'react-icons/bi/index';
-import { AnimatePresence, motion } from 'framer-motion';
+import { AnimatePresence, motion } from 'motion/react';
import { useHotkeys } from 'react-hotkeys-hook';
import { Tooltip } from '@/components/tooltip';
diff --git a/src/components/categories/categories.tsx b/src/components/categories/categories.tsx
index ffe4173..8e2f558 100644
--- a/src/components/categories/categories.tsx
+++ b/src/components/categories/categories.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence } from 'framer-motion';
+import { AnimatePresence } from 'motion/react';
import { Category } from './category';
import { Donate } from './donate';
diff --git a/src/components/modal/modal.tsx b/src/components/modal/modal.tsx
index c4cf8b5..311915f 100644
--- a/src/components/modal/modal.tsx
+++ b/src/components/modal/modal.tsx
@@ -1,5 +1,5 @@
import { useEffect } from 'react';
-import { AnimatePresence, motion } from 'framer-motion';
+import { AnimatePresence, motion } from 'motion/react';
import { IoClose } from 'react-icons/io5/index';
import FocusTrap from 'focus-trap-react';
diff --git a/src/components/modals/breathing/exercise/exercise.tsx b/src/components/modals/breathing/exercise/exercise.tsx
index 3920b27..9ecd8b4 100644
--- a/src/components/modals/breathing/exercise/exercise.tsx
+++ b/src/components/modals/breathing/exercise/exercise.tsx
@@ -1,5 +1,5 @@
import { useState, useEffect, useMemo, useCallback } from 'react';
-import { motion } from 'framer-motion';
+import { motion } from 'motion/react';
import { padNumber } from '@/helpers/number';
diff --git a/src/components/snackbar/snackbar.tsx b/src/components/snackbar/snackbar.tsx
index 819623e..c48e952 100644
--- a/src/components/snackbar/snackbar.tsx
+++ b/src/components/snackbar/snackbar.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion';
+import { motion } from 'motion/react';
import { mix, fade, slideY } from '@/lib/motion';
diff --git a/src/components/sounds/sound/favorite/favorite.tsx b/src/components/sounds/sound/favorite/favorite.tsx
index 580bb72..6eabd1d 100644
--- a/src/components/sounds/sound/favorite/favorite.tsx
+++ b/src/components/sounds/sound/favorite/favorite.tsx
@@ -1,5 +1,5 @@
import { BiHeart, BiSolidHeart } from 'react-icons/bi/index';
-import { AnimatePresence, motion } from 'framer-motion';
+import { AnimatePresence, motion } from 'motion/react';
import { useSoundStore } from '@/stores/sound';
import { cn } from '@/helpers/styles';
diff --git a/src/components/sounds/sounds.tsx b/src/components/sounds/sounds.tsx
index b32baac..3274899 100644
--- a/src/components/sounds/sounds.tsx
+++ b/src/components/sounds/sounds.tsx
@@ -1,5 +1,5 @@
import { useState, useMemo, useCallback, useRef, useEffect } from 'react';
-import { AnimatePresence, motion } from 'framer-motion';
+import { AnimatePresence, motion } from 'motion/react';
import { Sound } from './sound';
import { useLocalStorage } from '@/hooks/use-local-storage';
diff --git a/src/components/toolbar/menu/menu.tsx b/src/components/toolbar/menu/menu.tsx
index a04b596..33d8f51 100644
--- a/src/components/toolbar/menu/menu.tsx
+++ b/src/components/toolbar/menu/menu.tsx
@@ -2,7 +2,7 @@ import { useState, useMemo, useCallback } from 'react';
import { IoMenu, IoClose } from 'react-icons/io5/index';
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
import { useHotkeys } from 'react-hotkeys-hook';
-import { AnimatePresence, motion } from 'framer-motion';
+import { AnimatePresence, motion } from 'motion/react';
import {
ShuffleItem,
diff --git a/src/components/toolbar/scroll-to-top/scroll-to-top.tsx b/src/components/toolbar/scroll-to-top/scroll-to-top.tsx
index 4757f90..0aec2ee 100644
--- a/src/components/toolbar/scroll-to-top/scroll-to-top.tsx
+++ b/src/components/toolbar/scroll-to-top/scroll-to-top.tsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from 'react';
import { BiUpArrowAlt } from 'react-icons/bi/index';
-import { motion, AnimatePresence } from 'framer-motion';
+import { motion } from 'motion/react';
import { mix, fade, slideY } from '@/lib/motion';
@@ -30,22 +30,20 @@ export function ScrollToTop() {
const variants = mix(fade(), slideY(10, 0));
return (
-
- {isVisible ? (
-
-
-
- ) : (
-
- )}
-
+
+
+
);
}
diff --git a/src/components/tooltip/tooltip.tsx b/src/components/tooltip/tooltip.tsx
index a7e88b7..7b9e25f 100644
--- a/src/components/tooltip/tooltip.tsx
+++ b/src/components/tooltip/tooltip.tsx
@@ -1,5 +1,5 @@
import { useState } from 'react';
-import { motion, AnimatePresence } from 'framer-motion';
+import { motion, AnimatePresence } from 'motion/react';
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
import { slideX, slideY, mix, fade } from '@/lib/motion';
diff --git a/src/contexts/snackbar.tsx b/src/contexts/snackbar.tsx
index 886c8c9..4e9117d 100644
--- a/src/contexts/snackbar.tsx
+++ b/src/contexts/snackbar.tsx
@@ -5,7 +5,7 @@ import {
useRef,
useContext,
} from 'react';
-import { AnimatePresence } from 'framer-motion';
+import { AnimatePresence } from 'motion/react';
import { Snackbar } from '@/components/snackbar';