diff --git a/apps/docs/components/DocsCoverLogo.tsx b/apps/docs/components/DocsCoverLogo.tsx
index eebc87c0092..8ae457c4d49 100644
--- a/apps/docs/components/DocsCoverLogo.tsx
+++ b/apps/docs/components/DocsCoverLogo.tsx
@@ -1,6 +1,6 @@
'use client'
-import { domAnimation, LazyMotion, m } from 'framer-motion'
+import { domAnimation, LazyMotion, m } from 'motion/react'
import React, { type ComponentPropsWithoutRef } from 'react'
const DocsCoverLogo = ({ className, ...props }: ComponentPropsWithoutRef<'div'>) => {
diff --git a/apps/docs/components/Navigation/NavigationMenu/GlobalMobileMenu.tsx b/apps/docs/components/Navigation/NavigationMenu/GlobalMobileMenu.tsx
index 903373a09b3..4ec6d344e26 100644
--- a/apps/docs/components/Navigation/NavigationMenu/GlobalMobileMenu.tsx
+++ b/apps/docs/components/Navigation/NavigationMenu/GlobalMobileMenu.tsx
@@ -1,7 +1,7 @@
import { getCustomContent } from '~/lib/custom-content/getCustomContent'
import { useIsLoggedIn, useIsUserLoading } from 'common'
-import { AnimatePresence, domAnimation, LazyMotion, m } from 'framer-motion'
import { X } from 'lucide-react'
+import { AnimatePresence, domAnimation, LazyMotion, m } from 'motion/react'
import Image from 'next/image'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 2dbce4280e0..b462b63e47a 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -74,7 +74,6 @@
"config": "workspace:*",
"dev-tools": "workspace:*",
"eslint-config-supabase": "workspace:*",
- "framer-motion": "^11.18.2",
"github-slugger": "^2.0.0",
"graphql": "^16.10.0",
"graphql-validation-complexity": "^0.4.2",
@@ -99,6 +98,7 @@
"mdast-util-to-string": "^3.1.1",
"micromark-extension-gfm": "^2.0.3",
"micromark-extension-mdxjs": "^1.0.0",
+ "motion": "catalog:",
"next": "^15.5.24",
"next-mdx-remote-client": "^1.1.7",
"next-plugin-yaml": "^1.0.1",
diff --git a/apps/learn/components/command.tsx b/apps/learn/components/command.tsx
index fdc4064c4fa..dd33a367816 100644
--- a/apps/learn/components/command.tsx
+++ b/apps/learn/components/command.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { Tabs, TabsContent, TabsList, TabsTrigger } from 'ui'
import { CommandCopyButton } from './command-copy-button'
diff --git a/apps/learn/package.json b/apps/learn/package.json
index 4ad5ea1b9ce..393896cc20e 100644
--- a/apps/learn/package.json
+++ b/apps/learn/package.json
@@ -19,9 +19,9 @@
},
"dependencies": {
"common": "workspace:*",
- "framer-motion": "^11.18.2",
"jotai": "^2.8.0",
"lucide-react": "*",
+ "motion": "catalog:",
"next": "catalog:",
"next-themes": "catalog:",
"react": "catalog:",
diff --git a/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx b/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx
index 5e096526974..355dc3c134d 100644
--- a/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx
+++ b/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { Eye, MoreVertical, Trash } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { createPortal } from 'react-dom'
import {
Button,
diff --git a/apps/studio/components/grid/components/header/Header.tsx b/apps/studio/components/grid/components/header/Header.tsx
index ea341a6c4fa..ea8fc957635 100644
--- a/apps/studio/components/grid/components/header/Header.tsx
+++ b/apps/studio/components/grid/components/header/Header.tsx
@@ -1,7 +1,7 @@
import { keepPreviousData } from '@tanstack/react-query'
import { useBreakpoint, useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { ChevronDown, Trash } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { ReactNode, useEffect, useRef, useState } from 'react'
import { toast } from 'sonner'
import {
diff --git a/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx b/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx
index ad6ed5b11c3..26ee45f7a66 100644
--- a/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx
+++ b/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx
@@ -1,6 +1,6 @@
import { IS_PLATFORM } from 'common'
-import { motion } from 'framer-motion'
import { MoreVertical } from 'lucide-react'
+import { motion } from 'motion/react'
import {
Button,
DropdownMenu,
diff --git a/apps/studio/components/interfaces/App/GitHubConfigDriftBanner.tsx b/apps/studio/components/interfaces/App/GitHubConfigDriftBanner.tsx
index 88b11d93818..82d716b4748 100644
--- a/apps/studio/components/interfaces/App/GitHubConfigDriftBanner.tsx
+++ b/apps/studio/components/interfaces/App/GitHubConfigDriftBanner.tsx
@@ -1,5 +1,5 @@
import { useParams } from 'common'
-import { AnimatePresence } from 'framer-motion'
+import { AnimatePresence } from 'motion/react'
import Link from 'next/link'
import { HeaderBanner } from '../Organization/HeaderBanner'
diff --git a/apps/studio/components/interfaces/AuditLogs/AuditLogsSelectionHeader.tsx b/apps/studio/components/interfaces/AuditLogs/AuditLogsSelectionHeader.tsx
index 1a490671513..30db3672ca6 100644
--- a/apps/studio/components/interfaces/AuditLogs/AuditLogsSelectionHeader.tsx
+++ b/apps/studio/components/interfaces/AuditLogs/AuditLogsSelectionHeader.tsx
@@ -1,6 +1,6 @@
import type { Table } from '@tanstack/react-table'
-import { AnimatePresence, motion } from 'framer-motion'
import { Copy, X } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { toast } from 'sonner'
import { copyToClipboard } from 'ui'
diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx
index 6ba73ea4962..cdf6e10e485 100644
--- a/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx
+++ b/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { CardContent, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui'
import { Admonition } from 'ui-patterns/Admonition'
diff --git a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.test.tsx b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.test.tsx
index 8c268801283..4353ea49a46 100644
--- a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.test.tsx
+++ b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.test.tsx
@@ -13,7 +13,7 @@ import {
import { customRender } from '@/tests/lib/custom-render'
import { addAPIMock } from '@/tests/lib/msw'
-// FormMessage animates via framer-motion, which relies on the Web Animations API.
+// FormMessage animates via Motion, which relies on the Web Animations API.
mockAnimationsApi()
vi.mock('@/lib/constants', async (importOriginal) => {
diff --git a/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx b/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx
index c65e3ed9847..30910105e64 100644
--- a/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx
+++ b/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx
@@ -1,5 +1,5 @@
-import { motion } from 'framer-motion'
import { CircleDotDashed, GitMerge, X } from 'lucide-react'
+import { motion } from 'motion/react'
import { useEffect, useRef } from 'react'
import { Button, Card, CardContent, CardHeader, CardTitle } from 'ui'
diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx
index bbfcd09a7c6..461fa0d43b7 100644
--- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx
+++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx
@@ -139,7 +139,7 @@ vi.mock('common', async (importOriginal) => {
return { ...actual, useParams: () => ({ ref: 'project-ref' }) }
})
-vi.mock('framer-motion', () => ({
+vi.mock('motion/react', () => ({
AnimatePresence: ({ children }: PropsWithChildren) => children,
motion: { div: ({ children }: PropsWithChildren) =>
{children}
},
}))
diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx
index 88d57dedf69..3714612ae6e 100644
--- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx
+++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx
@@ -1,8 +1,8 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { Loader2 } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { RefObject, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'
import { useForm, useWatch } from 'react-hook-form'
import { toast } from 'sonner'
diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx
index f45cc9c68a4..ac680505521 100644
--- a/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx
@@ -1,7 +1,7 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect, useRef, useState, type ReactNode } from 'react'
import { useForm, useWatch } from 'react-hook-form'
import { CloudProvider } from 'shared-data'
diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx
index 92955865826..b349d2adad9 100644
--- a/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { RotateCcw } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { DialogSection, WarningIcon } from 'ui'
interface DiskMangementRestartRequiredSectionProps {
diff --git a/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx
index fe0548e246c..274ccc460f3 100644
--- a/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx
@@ -1,5 +1,5 @@
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect } from 'react'
import { UseFormReturn, useWatch } from 'react-hook-form'
import {
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx b/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx
index 61b1e5bc135..c4e4b004d97 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { ChevronRight } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui'
import { formatCurrency } from '@/lib/helpers'
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx
index 302830f12a3..aa4a7a79e5d 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { ReactNode } from 'react'
import { UseFormReturn, useWatch } from 'react-hook-form'
import { COMPUTE_BASELINE_IOPS, COMPUTE_MAX_IOPS } from 'shared-data'
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx
index 053b28352e9..4fded1fac11 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx
@@ -1,5 +1,5 @@
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect, useState } from 'react'
import { Card, CardContent } from 'ui'
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx
index dcd2ae660e1..d504f6e8f14 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx
@@ -1,5 +1,5 @@
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { Alert, AlertDescription, AlertTitle, InfoIcon } from 'ui'
import { BillingChangeBadge } from './BillingChangeBadge'
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx
index 8f5950d4d25..7d4dc6cecea 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx
@@ -1,7 +1,7 @@
import MotionNumber from '@number-flow/react'
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { Info } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useTheme } from 'next-themes'
import { useMemo } from 'react'
import { UseFormReturn, useWatch } from 'react-hook-form'
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx
index ab237f10b8e..687c1cc854d 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { ReactNode } from 'react'
import { UseFormReturn, useWatch } from 'react-hook-form'
import { Admonition } from 'ui-patterns/Admonition'
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/FormMessage.tsx b/apps/studio/components/interfaces/DiskManagement/ui/FormMessage.tsx
index 81cb935bfbd..5f85dcdf746 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/FormMessage.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/FormMessage.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { Admonition } from 'ui-patterns/Admonition'
interface FormMessageProps {
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx b/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx
index 0ce27960ff8..95c2cec6f2b 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { cn } from 'ui'
import { Admonition } from 'ui-patterns/Admonition'
import { type AdmonitionProps } from 'ui-patterns/Admonition/Admonition.types'
diff --git a/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx
index 867315fea75..cacfa03ca8a 100644
--- a/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx
+++ b/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { AlertDescription, AlertTitle, buttonVariants, cn } from 'ui'
import { Admonition } from 'ui-patterns/Admonition'
diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx
index 2d9d4dea79a..3e4e79cfc40 100644
--- a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx
+++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { useEffect, useState } from 'react'
import { UseFormReturn, useWatch } from 'react-hook-form'
import {
diff --git a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.test.tsx b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.test.tsx
index 426e516a4d8..25a2a547042 100644
--- a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.test.tsx
+++ b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.test.tsx
@@ -18,7 +18,7 @@ vi.mock('../Landing/Integrations.constants', () => ({
],
}))
-vi.mock('framer-motion', async (importOriginal) => {
+vi.mock('motion/react', async (importOriginal) => {
const actual = (await importOriginal()) as any
return {
...actual,
diff --git a/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx b/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx
index 105b7ac30e4..2095c3f07fd 100644
--- a/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx
+++ b/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { useEffect, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx
index 0a9d4f65061..1f31885a926 100644
--- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx
+++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx
@@ -1,7 +1,7 @@
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { IS_PLATFORM, useFlag, useParams } from 'common'
-import { AnimatePresence } from 'framer-motion'
import { AlertCircle, RotateCw, Timer } from 'lucide-react'
+import { AnimatePresence } from 'motion/react'
import { useMemo, useRef, useState } from 'react'
import { toast } from 'sonner'
import {
diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx
index f962d84bfa6..4c08161246d 100644
--- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx
+++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx
@@ -1,6 +1,5 @@
import { components } from 'api-types'
import dayjs from 'dayjs'
-import { motion } from 'framer-motion'
import {
CircleArrowDown,
CircleArrowUp,
@@ -12,6 +11,7 @@ import {
Timer,
Trash2,
} from 'lucide-react'
+import { motion } from 'motion/react'
import {
Badge,
Button,
diff --git a/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx b/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx
index e12e7734fbe..bd702294714 100644
--- a/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx
+++ b/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx
@@ -1,6 +1,6 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { Axiom, Datadog, Grafana, Last9, Otlp, Sentry } from 'icons'
import { BracesIcon, Cloud, Server } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx
index 8193eba8a86..a97f34d8aac 100644
--- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx
+++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx
@@ -1,5 +1,5 @@
-import { motion, type Variants } from 'framer-motion'
import { Check } from 'lucide-react'
+import { motion, type Variants } from 'motion/react'
import { PricingInformation } from 'shared-data'
import { Button, cn } from 'ui'
diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx
index f10474ccab3..045f1f77ce3 100644
--- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx
+++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx
@@ -1,6 +1,6 @@
-import { motion, type Variants } from 'framer-motion'
import { isArray } from 'lodash'
import { Check } from 'lucide-react'
+import { motion, type Variants } from 'motion/react'
import type { PricingInformation } from 'shared-data'
import { Button, cn } from 'ui'
import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.tsx
index bc97fa672d5..7dcbffb6fb3 100644
--- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.tsx
+++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { useRouter } from 'next/router'
import { plans as subscriptionsPlans } from 'shared-data/plans'
diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.utils.ts b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.utils.ts
index cc1d4e294a8..bb6c751ccd3 100644
--- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.utils.ts
+++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCards.utils.ts
@@ -1,4 +1,4 @@
-import type { Variants } from 'framer-motion'
+import type { Variants } from 'motion/react'
const CARD_VARIANTS: Variants = {
hidden: { opacity: 0, y: 8 },
diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdatePanelShell.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdatePanelShell.tsx
index 329269f2bd3..142f1089bfb 100644
--- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdatePanelShell.tsx
+++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdatePanelShell.tsx
@@ -1,5 +1,5 @@
-import { motion } from 'framer-motion'
import { ArrowLeft, ExternalLink } from 'lucide-react'
+import { motion } from 'motion/react'
import type { ReactNode } from 'react'
import { Button } from 'ui'
diff --git a/apps/studio/components/interfaces/Organization/HeaderBanner.tsx b/apps/studio/components/interfaces/Organization/HeaderBanner.tsx
index 9e8b25208ab..332c837239d 100644
--- a/apps/studio/components/interfaces/Organization/HeaderBanner.tsx
+++ b/apps/studio/components/interfaces/Organization/HeaderBanner.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { XIcon } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import type { ReactNode } from 'react'
import { Button, cn, CriticalIcon, WarningIcon } from 'ui'
diff --git a/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx b/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx
index 29afd32fecf..5bc69ac4b59 100644
--- a/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx
+++ b/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx
@@ -1,5 +1,5 @@
-import { motion } from 'framer-motion'
import { MousePointer2 } from 'lucide-react'
+import { motion } from 'motion/react'
import { useEffect, useState } from 'react'
export const AnimatedCursors = () => {
diff --git a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx
index 932d2ca5fe6..249b8c8b448 100644
--- a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx
+++ b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx
@@ -1,7 +1,7 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { PermissionAction } from '@supabase/shared-types/out/constants'
-import { AnimatePresence, motion } from 'framer-motion'
import { Loader2 } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useState } from 'react'
import { useForm, useWatch } from 'react-hook-form'
import { toast } from 'sonner'
diff --git a/apps/studio/components/interfaces/Sidebar.tsx b/apps/studio/components/interfaces/Sidebar.tsx
index ec7b8db062b..b64a41b823e 100644
--- a/apps/studio/components/interfaces/Sidebar.tsx
+++ b/apps/studio/components/interfaces/Sidebar.tsx
@@ -1,8 +1,8 @@
import { LOCAL_STORAGE_KEYS, useFlag, useIsMFAEnabled, useParams } from 'common'
-import { AnimatePresence, motion, MotionProps } from 'framer-motion'
import { Home } from 'icons'
import { isUndefined } from 'lodash'
import { Blocks, Boxes, ChartArea, PanelLeftDashed, Receipt, Settings, Users } from 'lucide-react'
+import { AnimatePresence, motion, MotionProps } from 'motion/react'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { ComponentProps, ComponentPropsWithoutRef, FC, ReactNode, useEffect } from 'react'
diff --git a/apps/studio/components/interfaces/SignIn/SignUpForm.tsx b/apps/studio/components/interfaces/SignIn/SignUpForm.tsx
index 9b9ae4cfcb7..8dda979e629 100644
--- a/apps/studio/components/interfaces/SignIn/SignUpForm.tsx
+++ b/apps/studio/components/interfaces/SignIn/SignUpForm.tsx
@@ -1,7 +1,7 @@
import HCaptcha from '@hcaptcha/react-hcaptcha'
import { zodResolver } from '@hookform/resolvers/zod'
-import { motion } from 'framer-motion'
import { Eye, EyeOff } from 'lucide-react'
+import { motion } from 'motion/react'
import { useRouter } from 'next/router'
import { parseAsString, useQueryStates } from 'nuqs'
import { useRef, useState } from 'react'
diff --git a/apps/studio/components/interfaces/Storage/BucketFilePickerDialog/BucketFilePickerColumn.tsx b/apps/studio/components/interfaces/Storage/BucketFilePickerDialog/BucketFilePickerColumn.tsx
index 632268ac572..9b0f7e770f8 100644
--- a/apps/studio/components/interfaces/Storage/BucketFilePickerDialog/BucketFilePickerColumn.tsx
+++ b/apps/studio/components/interfaces/Storage/BucketFilePickerDialog/BucketFilePickerColumn.tsx
@@ -2,9 +2,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'
import { useDebounce } from '@uidotdev/usehooks'
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { compact, get, sum, uniqBy } from 'lodash'
import { Upload } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { DragEventHandler, useCallback, useMemo, useRef, useState } from 'react'
import { toast } from 'sonner'
import { Checkbox, cn } from 'ui'
diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/BucketVersioningFields.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/BucketVersioningFields.tsx
index 544ce50c1a1..97f715ca14b 100644
--- a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/BucketVersioningFields.tsx
+++ b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/BucketVersioningFields.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence } from 'framer-motion'
+import { AnimatePresence } from 'motion/react'
import { useWatch, type UseFormReturn } from 'react-hook-form'
import { Badge, DialogSection, DialogSectionSeparator, FormControl, FormField, Switch } from 'ui'
import { Admonition } from 'ui-patterns/Admonition'
diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/LifecyclePolicySection.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/LifecyclePolicySection.tsx
index b83642aa73f..ebf38c9b389 100644
--- a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/LifecyclePolicySection.tsx
+++ b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketVersioningFields/LifecyclePolicySection.tsx
@@ -1,5 +1,5 @@
import { useParams } from 'common'
-import { AnimatePresence } from 'framer-motion'
+import { AnimatePresence } from 'motion/react'
import { useEffect, useRef } from 'react'
import type { UseFormReturn } from 'react-hook-form'
import {
diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx
index a023d1a0088..ebbe8262e91 100644
--- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx
+++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx
@@ -1,7 +1,7 @@
import { PermissionAction } from '@supabase/shared-types/out/constants'
-import { AnimatePresence, motion } from 'framer-motion'
import { get, noop, sum, uniqBy } from 'lodash'
import { ChevronsDown, ChevronsUp, Copy, Eye, FolderPlus, Upload } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { toast } from 'sonner'
import {
diff --git a/apps/studio/components/interfaces/Support/AIAssistantOption.tsx b/apps/studio/components/interfaces/Support/AIAssistantOption.tsx
index 1357c2268fd..1e7df2683f5 100644
--- a/apps/studio/components/interfaces/Support/AIAssistantOption.tsx
+++ b/apps/studio/components/interfaces/Support/AIAssistantOption.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { MessageSquare } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { useCallback, useEffect, useState } from 'react'
import { AiIconAnimation, Button } from 'ui'
diff --git a/apps/studio/components/interfaces/Support/DiscordCTACard.tsx b/apps/studio/components/interfaces/Support/DiscordCTACard.tsx
index bc9d1a6167f..6beb6ffecb1 100644
--- a/apps/studio/components/interfaces/Support/DiscordCTACard.tsx
+++ b/apps/studio/components/interfaces/Support/DiscordCTACard.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import router from 'next/router'
import { useEffect, useState } from 'react'
diff --git a/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx b/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx
index 52ab0dee0f6..cae79d7d889 100644
--- a/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx
+++ b/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { ExternalLink } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { Button } from 'ui'
import { Admonition } from 'ui-patterns/Admonition'
diff --git a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx
index f38379ae4f1..016686c0572 100644
--- a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx
+++ b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx
@@ -1,8 +1,8 @@
// End of third-party imports
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { Check, ChevronsUpDown, ExternalLink } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import type { UseFormReturn } from 'react-hook-form'
import { toast } from 'sonner'
diff --git a/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.constants.tsx b/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.constants.tsx
index bfac9c16336..aa7947cb73f 100644
--- a/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.constants.tsx
+++ b/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.constants.tsx
@@ -1,5 +1,5 @@
-import { motion } from 'framer-motion'
import { MessageSquare, NotebookText } from 'lucide-react'
+import { motion } from 'motion/react'
import { type ComponentType, type PropsWithChildren } from 'react'
import { cn } from 'ui'
import { InnerSideBarFilters, InnerSideBarFilterSearchInput } from 'ui-patterns/InnerSideMenu'
diff --git a/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.tsx b/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.tsx
index 970c86cc7b1..4270f9a652f 100644
--- a/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.tsx
+++ b/apps/studio/components/layouts/ExplorerLayout/ExplorerLayout.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion } from 'framer-motion'
import { Home, MessageCirclePlus, NotebookText, Plus, SquareCode } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { ComponentProps, ReactNode, useEffect, useEffectEvent, useState } from 'react'
import {
cn,
diff --git a/apps/studio/components/layouts/ExplorerLayout/ExplorerNavHome.tsx b/apps/studio/components/layouts/ExplorerLayout/ExplorerNavHome.tsx
index 3e42cbcda54..1bc68aa29ce 100644
--- a/apps/studio/components/layouts/ExplorerLayout/ExplorerNavHome.tsx
+++ b/apps/studio/components/layouts/ExplorerLayout/ExplorerNavHome.tsx
@@ -1,6 +1,6 @@
import { useParams } from 'common'
-import { motion } from 'framer-motion'
import { ChevronRight, Plus, SquareCode } from 'lucide-react'
+import { motion } from 'motion/react'
import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
import {
diff --git a/apps/studio/components/layouts/InterstitialLayout.tsx b/apps/studio/components/layouts/InterstitialLayout.tsx
index a2b54fbc78b..b3eab9435b9 100644
--- a/apps/studio/components/layouts/InterstitialLayout.tsx
+++ b/apps/studio/components/layouts/InterstitialLayout.tsx
@@ -1,5 +1,5 @@
-import { motion, useReducedMotion } from 'framer-motion'
import { ArrowRightLeft } from 'lucide-react'
+import { motion, useReducedMotion } from 'motion/react'
import type { PropsWithChildren, ReactNode } from 'react'
import { Card, CardContent, CardHeader, cn } from 'ui'
diff --git a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx
index da5b728cf82..2646a52a052 100644
--- a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx
+++ b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx
@@ -1,6 +1,6 @@
import { useParams, useViewport } from 'common'
-import { AnimatePresence } from 'framer-motion'
import { Menu, Search, X } from 'lucide-react'
+import { AnimatePresence } from 'motion/react'
import { useRef } from 'react'
import { Button, cn, KeyboardShortcut } from 'ui'
diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx
index 2b423b72b5b..be7363171f1 100644
--- a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx
+++ b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx
@@ -1,8 +1,8 @@
import { useDebounce } from '@uidotdev/usehooks'
import { LOCAL_STORAGE_KEYS, useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { toPng } from 'html-to-image'
import { Camera, CircleCheck, Image as ImageIcon, Upload, X } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useRouter } from 'next/router'
import { ChangeEvent, useEffect, useRef, useState } from 'react'
import { toast } from 'sonner'
diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx
index 6668e5a79b9..0aede59b03d 100644
--- a/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx
+++ b/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx
@@ -1,7 +1,7 @@
import { useParams } from 'common'
import dayjs from 'dayjs'
-import { AnimatePresence, motion } from 'framer-motion'
import { ChevronLeft } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { ReactNode, useMemo } from 'react'
diff --git a/apps/studio/components/layouts/ProjectLayout/index.test.tsx b/apps/studio/components/layouts/ProjectLayout/index.test.tsx
index f2603a560d3..b2606bd21e0 100644
--- a/apps/studio/components/layouts/ProjectLayout/index.test.tsx
+++ b/apps/studio/components/layouts/ProjectLayout/index.test.tsx
@@ -88,7 +88,7 @@ vi.mock('common', () => ({
useFlag: () => false,
}))
-vi.mock('framer-motion', () => ({
+vi.mock('motion/react', () => ({
AnimatePresence: ({ children }: { children: ReactNode }) => <>{children}>,
motion: {
div: ({ children, ...props }: any) => {children}
,
diff --git a/apps/studio/components/layouts/ProjectLayout/index.tsx b/apps/studio/components/layouts/ProjectLayout/index.tsx
index 2a432a54e51..53317d665e0 100644
--- a/apps/studio/components/layouts/ProjectLayout/index.tsx
+++ b/apps/studio/components/layouts/ProjectLayout/index.tsx
@@ -1,6 +1,6 @@
import { LOCAL_STORAGE_KEYS, mergeRefs, useFlag, useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { XIcon } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Head from 'next/head'
import { useRouter } from 'next/router'
import {
diff --git a/apps/studio/components/layouts/ProjectNeedsSecuring/ProjectNeedsSecuring.tsx b/apps/studio/components/layouts/ProjectNeedsSecuring/ProjectNeedsSecuring.tsx
index b3b96dc883b..97c3512d029 100644
--- a/apps/studio/components/layouts/ProjectNeedsSecuring/ProjectNeedsSecuring.tsx
+++ b/apps/studio/components/layouts/ProjectNeedsSecuring/ProjectNeedsSecuring.tsx
@@ -1,5 +1,5 @@
import { LOCAL_STORAGE_KEYS, useFlag, useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { useRouter } from 'next/router'
import { PropsWithChildren, useMemo } from 'react'
diff --git a/apps/studio/components/layouts/Tabs/RecentItems.tsx b/apps/studio/components/layouts/Tabs/RecentItems.tsx
index f2649b32f3b..6d86cb15509 100644
--- a/apps/studio/components/layouts/Tabs/RecentItems.tsx
+++ b/apps/studio/components/layouts/Tabs/RecentItems.tsx
@@ -1,6 +1,6 @@
import { useParams } from 'common'
import dayjs from 'dayjs'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { useEditorType } from '../editors/EditorsLayout.hooks'
diff --git a/apps/studio/components/layouts/Tabs/SortableTab.tsx b/apps/studio/components/layouts/Tabs/SortableTab.tsx
index 9d437c76491..af604094d36 100644
--- a/apps/studio/components/layouts/Tabs/SortableTab.tsx
+++ b/apps/studio/components/layouts/Tabs/SortableTab.tsx
@@ -1,7 +1,7 @@
import { useSortable } from '@dnd-kit/sortable'
import { CSS } from '@dnd-kit/utilities'
-import { AnimatePresence, motion } from 'framer-motion'
import { X } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useMemo, type KeyboardEvent } from 'react'
import { cn, TabsTrigger } from 'ui'
diff --git a/apps/studio/components/layouts/Tabs/TabPreview.tsx b/apps/studio/components/layouts/Tabs/TabPreview.tsx
index ef5825f49ba..373f07cefce 100644
--- a/apps/studio/components/layouts/Tabs/TabPreview.tsx
+++ b/apps/studio/components/layouts/Tabs/TabPreview.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { EntityTypeIcon } from '@/components/ui/EntityTypeIcon'
import { useTabsStateSnapshot } from '@/state/tabs'
diff --git a/apps/studio/components/layouts/Tabs/Tabs.tsx b/apps/studio/components/layouts/Tabs/Tabs.tsx
index 36839849c4c..830b64d2683 100644
--- a/apps/studio/components/layouts/Tabs/Tabs.tsx
+++ b/apps/studio/components/layouts/Tabs/Tabs.tsx
@@ -8,8 +8,8 @@ import {
} from '@dnd-kit/core'
import { horizontalListSortingStrategy, SortableContext } from '@dnd-kit/sortable'
import { useParams } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { Plus, X } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useRouter } from 'next/router'
import { ReactNode, useState } from 'react'
import {
diff --git a/apps/studio/components/ui/AIAssistantPanel/AssistantChat.tsx b/apps/studio/components/ui/AIAssistantPanel/AssistantChat.tsx
index e00a3da892c..7c396f12c5d 100644
--- a/apps/studio/components/ui/AIAssistantPanel/AssistantChat.tsx
+++ b/apps/studio/components/ui/AIAssistantPanel/AssistantChat.tsx
@@ -3,8 +3,8 @@ import { useChat } from '@ai-sdk/react'
import { lastAssistantMessageIsCompleteWithApprovalResponses } from 'ai'
import { LOCAL_STORAGE_KEYS, useFlag } from 'common'
import { useParams, useSearchParamsShallow } from 'common/hooks'
-import { AnimatePresence, motion, useReducedMotion } from 'framer-motion'
import { Eraser, Pencil, X } from 'lucide-react'
+import { AnimatePresence, motion, useReducedMotion } from 'motion/react'
import { Fragment, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'
import { Button, cn, KeyboardShortcut } from 'ui'
import { Admonition } from 'ui-patterns/Admonition'
diff --git a/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx b/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx
index 0c3a2d1600b..b0991cbab34 100644
--- a/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx
+++ b/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx
@@ -1,6 +1,6 @@
import { useBreakpoint } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { ArrowUp, Loader2, Square } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { ChangeEvent, FormEvent, forwardRef, KeyboardEvent, memo, ReactNode, useRef } from 'react'
import { Button, cn, ExpandingTextArea } from 'ui'
@@ -56,7 +56,7 @@ export interface FormProps {
submitLabel?: string
/**
* An additional action shown beside the main submit button, transitioned in/out with
- * framer-motion. Pass undefined to hide it (e.g. when the input doesn't match its condition).
+ * Motion. Pass undefined to hide it (e.g. when the input doesn't match its condition).
*/
secondaryAction?: {
label: string
diff --git a/apps/studio/components/ui/AIEditor/index.tsx b/apps/studio/components/ui/AIEditor/index.tsx
index b9b8cb8ec23..81dad4f113e 100644
--- a/apps/studio/components/ui/AIEditor/index.tsx
+++ b/apps/studio/components/ui/AIEditor/index.tsx
@@ -1,6 +1,6 @@
import { Monaco, OnMount } from '@monaco-editor/react'
-import { AnimatePresence, motion } from 'framer-motion'
import type { editor as monacoEditor } from 'monaco-editor'
+import { AnimatePresence, motion } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { toast } from 'sonner'
import { KeyboardShortcut } from 'ui'
diff --git a/apps/studio/components/ui/BannerStack/BannerStack.tsx b/apps/studio/components/ui/BannerStack/BannerStack.tsx
index 28420784fe6..9ff52a91ed5 100644
--- a/apps/studio/components/ui/BannerStack/BannerStack.tsx
+++ b/apps/studio/components/ui/BannerStack/BannerStack.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion, useReducedMotion } from 'framer-motion'
+import { AnimatePresence, motion, useReducedMotion } from 'motion/react'
import { useState } from 'react'
import { useBannerStack } from './BannerStackProvider'
diff --git a/apps/studio/components/ui/BannerStack/Banners/BannerExplorer.tsx b/apps/studio/components/ui/BannerStack/Banners/BannerExplorer.tsx
index 212efb9b3bc..13b17cbd6df 100644
--- a/apps/studio/components/ui/BannerStack/Banners/BannerExplorer.tsx
+++ b/apps/studio/components/ui/BannerStack/Banners/BannerExplorer.tsx
@@ -1,5 +1,5 @@
import { LOCAL_STORAGE_KEYS } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect } from 'react'
import { Badge, Button } from 'ui'
diff --git a/apps/studio/components/ui/FeatureBanner.tsx b/apps/studio/components/ui/FeatureBanner.tsx
index b6f0550b82d..7e37e670b99 100644
--- a/apps/studio/components/ui/FeatureBanner.tsx
+++ b/apps/studio/components/ui/FeatureBanner.tsx
@@ -1,6 +1,6 @@
import { useParams } from 'common/hooks'
-import { HTMLMotionProps, motion } from 'framer-motion'
import { X } from 'lucide-react'
+import { HTMLMotionProps, motion } from 'motion/react'
import { ReactNode } from 'react'
import { Button, cn } from 'ui'
diff --git a/apps/studio/components/ui/FileExplorerAndEditor/index.tsx b/apps/studio/components/ui/FileExplorerAndEditor/index.tsx
index c9a5cbebd1c..baeff77050b 100644
--- a/apps/studio/components/ui/FileExplorerAndEditor/index.tsx
+++ b/apps/studio/components/ui/FileExplorerAndEditor/index.tsx
@@ -1,6 +1,6 @@
import { IS_PLATFORM } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { Plus } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useCallback, useEffect, useState } from 'react'
import { toast } from 'sonner'
import { Button, cn, flattenTree, INodeRendererProps, TreeView } from 'ui'
diff --git a/apps/studio/components/ui/FormSectionCollapse.tsx b/apps/studio/components/ui/FormSectionCollapse.tsx
index 9bf0a6818cc..8897c591545 100644
--- a/apps/studio/components/ui/FormSectionCollapse.tsx
+++ b/apps/studio/components/ui/FormSectionCollapse.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import type { ReactNode } from 'react'
/** Wrap the parent in `` to avoid animating on first paint. */
diff --git a/apps/studio/package.json b/apps/studio/package.json
index 0ef65f11522..a5bb605aec5 100644
--- a/apps/studio/package.json
+++ b/apps/studio/package.json
@@ -112,7 +112,6 @@
"dev-tools": "workspace:*",
"effect": "4.0.0-rc.112",
"file-saver": "^2.0.5",
- "framer-motion": "^11.18.2",
"fuse.js": "^7.4.0",
"generate-password-browser": "^1.1.0",
"gqlmin": "^0.3.1",
@@ -131,6 +130,7 @@
"markdown-table": "^3.0.3",
"mime-db": "^1.53.0",
"monaco-editor": "catalog:",
+ "motion": "catalog:",
"next": "catalog:",
"next-themes": "catalog:",
"nuqs": "2.7.1",
diff --git a/apps/ui-library/components/command.tsx b/apps/ui-library/components/command.tsx
index 53f3cedda0f..bcff7921870 100644
--- a/apps/ui-library/components/command.tsx
+++ b/apps/ui-library/components/command.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { Tabs, TabsContent, TabsList, TabsTrigger } from 'ui'
import { CommandCopyButton } from './command-copy-button'
diff --git a/apps/ui-library/package.json b/apps/ui-library/package.json
index 92bce342e9a..9cd476c5932 100644
--- a/apps/ui-library/package.json
+++ b/apps/ui-library/package.json
@@ -37,11 +37,11 @@
"common": "workspace:*",
"common-tags": "^1.8.2",
"eslint-config-supabase": "workspace:*",
- "framer-motion": "^11.18.2",
"icons": "workspace:*",
"jotai": "^2.8.0",
"lucide-react": "*",
"monaco-editor": "catalog:",
+ "motion": "catalog:",
"next": "catalog:",
"next-themes": "catalog:",
"openai": "^5.9.0",
diff --git a/apps/www/app/(home)/_components/CommunitySectionV2.tsx b/apps/www/app/(home)/_components/CommunitySectionV2.tsx
index 8f86731d8e7..59630241557 100644
--- a/apps/www/app/(home)/_components/CommunitySectionV2.tsx
+++ b/apps/www/app/(home)/_components/CommunitySectionV2.tsx
@@ -1,6 +1,6 @@
'use client'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { useEffect, useState } from 'react'
import { topTweets } from 'shared-data/tweets'
diff --git a/apps/www/app/(home)/_components/CustomerStoriesSection.tsx b/apps/www/app/(home)/_components/CustomerStoriesSection.tsx
index a06c3b8eb21..807be7f322d 100644
--- a/apps/www/app/(home)/_components/CustomerStoriesSection.tsx
+++ b/apps/www/app/(home)/_components/CustomerStoriesSection.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Link from 'next/link'
import { useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(home)/_components/DashboardFeaturesSection.tsx b/apps/www/app/(home)/_components/DashboardFeaturesSection.tsx
index dca41fefd6f..a1088508cd5 100644
--- a/apps/www/app/(home)/_components/DashboardFeaturesSection.tsx
+++ b/apps/www/app/(home)/_components/DashboardFeaturesSection.tsx
@@ -1,7 +1,7 @@
'use client'
import BrowserFrame from '~/components/BrowserFrame'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useTheme } from 'next-themes'
import React, { useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(home)/_components/FrameworksSectionClient.tsx b/apps/www/app/(home)/_components/FrameworksSectionClient.tsx
index 608b7eccd52..085359d6d5f 100644
--- a/apps/www/app/(home)/_components/FrameworksSectionClient.tsx
+++ b/apps/www/app/(home)/_components/FrameworksSectionClient.tsx
@@ -1,6 +1,6 @@
'use client'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(home)/_components/OpenSourceSection.tsx b/apps/www/app/(home)/_components/OpenSourceSection.tsx
index 4271c8a3276..9502ea15b51 100644
--- a/apps/www/app/(home)/_components/OpenSourceSection.tsx
+++ b/apps/www/app/(home)/_components/OpenSourceSection.tsx
@@ -2,7 +2,7 @@
import staticContent from '.generated/staticContent/_index.json'
import { useSendTelemetryEvent } from '~/lib/telemetry'
-import { useInView } from 'framer-motion'
+import { useInView } from 'motion/react'
import Link from 'next/link'
import { useRef } from 'react'
import { Button } from 'ui'
diff --git a/apps/www/app/(products)/auth/_components/ApiSectionClient.tsx b/apps/www/app/(products)/auth/_components/ApiSectionClient.tsx
index ad30e36cbee..73fdf8aa75f 100644
--- a/apps/www/app/(products)/auth/_components/ApiSectionClient.tsx
+++ b/apps/www/app/(products)/auth/_components/ApiSectionClient.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { ChevronDown, Globe, KeyRound, LogIn, UserPlus } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/auth/_components/FeaturesSection.tsx b/apps/www/app/(products)/auth/_components/FeaturesSection.tsx
index 83f66e8b78b..8c7939a9af6 100644
--- a/apps/www/app/(products)/auth/_components/FeaturesSection.tsx
+++ b/apps/www/app/(products)/auth/_components/FeaturesSection.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion } from 'framer-motion'
import { Link as LinkIcon } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Image from 'next/image'
import { useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/auth/_components/RLSSectionClient.tsx b/apps/www/app/(products)/auth/_components/RLSSectionClient.tsx
index af4d867dce3..cacdc70648f 100644
--- a/apps/www/app/(products)/auth/_components/RLSSectionClient.tsx
+++ b/apps/www/app/(products)/auth/_components/RLSSectionClient.tsx
@@ -1,7 +1,7 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/compute/_components/ComputeVisual.tsx b/apps/www/app/(products)/compute/_components/ComputeVisual.tsx
index c2f4922c572..7944b815b9b 100644
--- a/apps/www/app/(products)/compute/_components/ComputeVisual.tsx
+++ b/apps/www/app/(products)/compute/_components/ComputeVisual.tsx
@@ -1,10 +1,10 @@
'use client'
import SectionContainerWithCn from 'components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useReducedMotion } from 'framer-motion'
import { Database } from 'icons'
import type { LucideIcon } from 'lucide-react'
import { Bot, User } from 'lucide-react'
+import { AnimatePresence, motion, useReducedMotion } from 'motion/react'
import { useCallback, useEffect, useId, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/compute/_components/DeploySection.tsx b/apps/www/app/(products)/compute/_components/DeploySection.tsx
index 3c2aadb192b..f53420e461f 100644
--- a/apps/www/app/(products)/compute/_components/DeploySection.tsx
+++ b/apps/www/app/(products)/compute/_components/DeploySection.tsx
@@ -1,7 +1,7 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView, useReducedMotion } from 'framer-motion'
+import { AnimatePresence, motion, useInView, useReducedMotion } from 'motion/react'
import Link from 'next/link'
import { useEffect, useRef, useState } from 'react'
import { Button } from 'ui'
diff --git a/apps/www/app/(products)/database/_components/ApiSectionClient.tsx b/apps/www/app/(products)/database/_components/ApiSectionClient.tsx
index 10ffae261a4..d29e163cfec 100644
--- a/apps/www/app/(products)/database/_components/ApiSectionClient.tsx
+++ b/apps/www/app/(products)/database/_components/ApiSectionClient.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { ArrowDownUp, ChevronDown, Filter, Plus, Search } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/database/_components/FeaturesSection.tsx b/apps/www/app/(products)/database/_components/FeaturesSection.tsx
index d85dc3ee53a..3d35d695383 100644
--- a/apps/www/app/(products)/database/_components/FeaturesSection.tsx
+++ b/apps/www/app/(products)/database/_components/FeaturesSection.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion } from 'framer-motion'
import { Key } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/database/_components/SqlEditorSection.tsx b/apps/www/app/(products)/database/_components/SqlEditorSection.tsx
index fe8683b4008..80ad0406932 100644
--- a/apps/www/app/(products)/database/_components/SqlEditorSection.tsx
+++ b/apps/www/app/(products)/database/_components/SqlEditorSection.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { Code, FileDown, Heart, MousePointerClick } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/database/_components/TableEditorSection.tsx b/apps/www/app/(products)/database/_components/TableEditorSection.tsx
index af733dc5fc6..9efbc0d0f3a 100644
--- a/apps/www/app/(products)/database/_components/TableEditorSection.tsx
+++ b/apps/www/app/(products)/database/_components/TableEditorSection.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { FileDown, Link2, Table, TableProperties } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/database/_components/VisualDemo.tsx b/apps/www/app/(products)/database/_components/VisualDemo.tsx
index db2e18f1105..bf140f64b33 100644
--- a/apps/www/app/(products)/database/_components/VisualDemo.tsx
+++ b/apps/www/app/(products)/database/_components/VisualDemo.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion } from 'framer-motion'
import { ChevronDown, Filter, Key, List } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect, useRef, useState } from 'react'
import { Button } from 'ui'
diff --git a/apps/www/app/(products)/edge-functions/_components/CTASection.tsx b/apps/www/app/(products)/edge-functions/_components/CTASection.tsx
index a13b23887ec..9d5800ae9cc 100644
--- a/apps/www/app/(products)/edge-functions/_components/CTASection.tsx
+++ b/apps/www/app/(products)/edge-functions/_components/CTASection.tsx
@@ -1,7 +1,7 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useEffect, useRef, useState } from 'react'
import { Button } from 'ui'
diff --git a/apps/www/app/(products)/edge-functions/_components/IntegratesSectionClient.tsx b/apps/www/app/(products)/edge-functions/_components/IntegratesSectionClient.tsx
index 56dddfac327..1744e5c6318 100644
--- a/apps/www/app/(products)/edge-functions/_components/IntegratesSectionClient.tsx
+++ b/apps/www/app/(products)/edge-functions/_components/IntegratesSectionClient.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { Database, HardDrive, Shield, Webhook, Zap } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/realtime/_components/ApiSectionClient.tsx b/apps/www/app/(products)/realtime/_components/ApiSectionClient.tsx
index 86a16180b91..763daa5af99 100644
--- a/apps/www/app/(products)/realtime/_components/ApiSectionClient.tsx
+++ b/apps/www/app/(products)/realtime/_components/ApiSectionClient.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { Database, Radio, Users } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/realtime/_components/FeaturesSection.tsx b/apps/www/app/(products)/realtime/_components/FeaturesSection.tsx
index 1f31b8f6938..412d814243c 100644
--- a/apps/www/app/(products)/realtime/_components/FeaturesSection.tsx
+++ b/apps/www/app/(products)/realtime/_components/FeaturesSection.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { motion } from 'framer-motion'
import { Key } from 'lucide-react'
+import { motion } from 'motion/react'
import { useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/storage/_components/ApiSectionClient.tsx b/apps/www/app/(products)/storage/_components/ApiSectionClient.tsx
index 3809e5106b8..bcf2e9a1972 100644
--- a/apps/www/app/(products)/storage/_components/ApiSectionClient.tsx
+++ b/apps/www/app/(products)/storage/_components/ApiSectionClient.tsx
@@ -1,8 +1,8 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { ArrowRightLeft, ChevronDown, Download, List, Upload } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/(products)/storage/_components/PermissionsSectionClient.tsx b/apps/www/app/(products)/storage/_components/PermissionsSectionClient.tsx
index 57af15fd110..7562daa5999 100644
--- a/apps/www/app/(products)/storage/_components/PermissionsSectionClient.tsx
+++ b/apps/www/app/(products)/storage/_components/PermissionsSectionClient.tsx
@@ -1,7 +1,7 @@
'use client'
import SectionContainerWithCn from '~/components/Layouts/SectionContainerWithCn'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/app/blog/BlogHero.tsx b/apps/www/app/blog/BlogHero.tsx
index 4f63439d718..2c00ad20c00 100644
--- a/apps/www/app/blog/BlogHero.tsx
+++ b/apps/www/app/blog/BlogHero.tsx
@@ -1,7 +1,7 @@
'use client'
import FeaturedThumb from 'components/Blog/FeaturedThumb'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Image from 'next/image'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
diff --git a/apps/www/app/partners/catalog/[slug]/PartnerCatalogDetail.tsx b/apps/www/app/partners/catalog/[slug]/PartnerCatalogDetail.tsx
index f98bf9969a0..577520bf67a 100644
--- a/apps/www/app/partners/catalog/[slug]/PartnerCatalogDetail.tsx
+++ b/apps/www/app/partners/catalog/[slug]/PartnerCatalogDetail.tsx
@@ -6,8 +6,8 @@ import { CH } from '@code-hike/mdx/components'
import DefaultLayout from '~/components/Layouts/Default'
import { type ListingDetail, type Partner } from '~/types/partners'
import { useBreakpoint } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { ArrowUpRight, ChevronLeft, ExternalLink } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import type { SerializeResult as MDXRemoteSerializeResult } from 'next-mdx-remote-client'
import { MDXClient } from 'next-mdx-remote-client/csr'
import Image from 'next/image'
diff --git a/apps/www/app/state-of-startups/StateOfStartups2026Content.tsx b/apps/www/app/state-of-startups/StateOfStartups2026Content.tsx
index 892f97c71b3..cf1b72c0e6a 100644
--- a/apps/www/app/state-of-startups/StateOfStartups2026Content.tsx
+++ b/apps/www/app/state-of-startups/StateOfStartups2026Content.tsx
@@ -3,7 +3,7 @@
import DefaultLayout from '~/components/Layouts/Default'
import pageData from '~/data/surveys/state-of-startups-2026'
import { useSendTelemetryEvent } from '~/lib/telemetry'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { forwardRef, useEffect, useRef, useState, type RefObject } from 'react'
import { Button, cn } from 'ui'
diff --git a/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx b/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx
index 3ddf412a970..b0b4cb4ca3c 100644
--- a/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx
+++ b/apps/www/app/state-of-startups/components/StateOfStartupsAuroraHeader.tsx
@@ -1,6 +1,6 @@
'use client'
-import { useReducedMotion } from 'framer-motion'
+import { useReducedMotion } from 'motion/react'
import { useTheme } from 'next-themes'
import { useEffect, useState } from 'react'
import UnicornScene from 'unicornstudio-react/next'
diff --git a/apps/www/app/state-of-startups/components/SurveyChart.tsx b/apps/www/app/state-of-startups/components/SurveyChart.tsx
index 6d7d7311e27..e749985d911 100644
--- a/apps/www/app/state-of-startups/components/SurveyChart.tsx
+++ b/apps/www/app/state-of-startups/components/SurveyChart.tsx
@@ -1,7 +1,7 @@
'use client'
import CodeBlock from '~/components/CodeBlock/CodeBlock'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { useMemo, useState } from 'react'
import { Button } from 'ui'
diff --git a/apps/www/app/state-of-startups/components/YearToggle.tsx b/apps/www/app/state-of-startups/components/YearToggle.tsx
index 5aa2955f4df..ec6279ddc6c 100644
--- a/apps/www/app/state-of-startups/components/YearToggle.tsx
+++ b/apps/www/app/state-of-startups/components/YearToggle.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { cn } from 'ui'
import { SURVEY_YEARS, useYear, type SurveyYear } from './year-context'
diff --git a/apps/www/app/state-of-startups/register/RegisterContent.tsx b/apps/www/app/state-of-startups/register/RegisterContent.tsx
index e02aee634c0..2d25368c32c 100644
--- a/apps/www/app/state-of-startups/register/RegisterContent.tsx
+++ b/apps/www/app/state-of-startups/register/RegisterContent.tsx
@@ -1,7 +1,7 @@
'use client'
-import { motion, useReducedMotion } from 'framer-motion'
import { ArrowRight } from 'lucide-react'
+import { motion, useReducedMotion } from 'motion/react'
import dynamic from 'next/dynamic'
import Image from 'next/image'
import Link from 'next/link'
diff --git a/apps/www/components/AIDemo/DotGrid.tsx b/apps/www/components/AIDemo/DotGrid.tsx
index bbcc267198f..4a0662c41c0 100644
--- a/apps/www/components/AIDemo/DotGrid.tsx
+++ b/apps/www/components/AIDemo/DotGrid.tsx
@@ -1,5 +1,5 @@
+import { motion } from 'motion/react'
import React from 'react'
-import { motion } from 'framer-motion'
interface DotGridProps {
rows: number
diff --git a/apps/www/components/AIDemo/Panel.tsx b/apps/www/components/AIDemo/Panel.tsx
index 613384a2ce1..5899eb96627 100644
--- a/apps/www/components/AIDemo/Panel.tsx
+++ b/apps/www/components/AIDemo/Panel.tsx
@@ -1,5 +1,5 @@
// components/AIDemoPanel.tsx
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Image from 'next/image'
import errorGif from 'public/images/ai/error.gif'
import { useEffect, useRef, useState } from 'react'
diff --git a/apps/www/components/AIDemo/SqlSnippet.tsx b/apps/www/components/AIDemo/SqlSnippet.tsx
index f096ee9cae8..2e6025ab733 100644
--- a/apps/www/components/AIDemo/SqlSnippet.tsx
+++ b/apps/www/components/AIDemo/SqlSnippet.tsx
@@ -1,5 +1,5 @@
-import { motion } from 'framer-motion'
import { Code, DatabaseIcon, Play } from 'lucide-react'
+import { motion } from 'motion/react'
import { useEffect, useState } from 'react'
import { Bar, BarChart, CartesianGrid, XAxis } from 'recharts'
import { Button, ChartContainer, ChartTooltip, ChartTooltipContent, cn, SQL_ICON } from 'ui'
diff --git a/apps/www/components/Blog/BlogFilters.tsx b/apps/www/components/Blog/BlogFilters.tsx
index c330e5cbc7b..b91ec5108c7 100644
--- a/apps/www/components/Blog/BlogFilters.tsx
+++ b/apps/www/components/Blog/BlogFilters.tsx
@@ -3,9 +3,9 @@
import { type BlogView } from 'app/blog/blog-view'
import { useBreakpoint } from 'common'
import BlogViewToggle from 'components/Blog/BlogViewToggle'
-import { motion } from 'framer-motion'
import { startCase } from 'lib/helpers'
import { ChevronDown, X as CloseIcon, Search } from 'lucide-react'
+import { motion } from 'motion/react'
import Link from 'next/link'
import { usePathname, useRouter, useSearchParams } from 'next/navigation'
import { useCallback, useEffect, useState } from 'react'
diff --git a/apps/www/components/Blog/BlogViewToggle.tsx b/apps/www/components/Blog/BlogViewToggle.tsx
index 770e03beb1c..f293f33b564 100644
--- a/apps/www/components/Blog/BlogViewToggle.tsx
+++ b/apps/www/components/Blog/BlogViewToggle.tsx
@@ -1,8 +1,8 @@
'use client'
import { setBlogViewCookie, type BlogView } from 'app/blog/blog-view'
-import { motion } from 'framer-motion'
import { AlignJustify, Grid } from 'lucide-react'
+import { motion } from 'motion/react'
import { cn } from 'ui'
export default function BlogViewToggle({
diff --git a/apps/www/components/CustomerStories/CustomersFilters.tsx b/apps/www/components/CustomerStories/CustomersFilters.tsx
index bc08d9a439a..21cbc1ec368 100644
--- a/apps/www/components/CustomerStories/CustomersFilters.tsx
+++ b/apps/www/components/CustomerStories/CustomersFilters.tsx
@@ -2,9 +2,9 @@
import type PostTypes from '~/types/post'
import { useBreakpoint } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { startCase } from 'lib/helpers'
import { ChevronDown, X as CloseIcon } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useRouter } from 'next/compat/router'
import { usePathname } from 'next/navigation'
import { useEffect, useState } from 'react'
diff --git a/apps/www/components/EnterpriseFormQuotes.tsx b/apps/www/components/EnterpriseFormQuotes.tsx
index 3d1e1e548cc..f34da4bc2e5 100644
--- a/apps/www/components/EnterpriseFormQuotes.tsx
+++ b/apps/www/components/EnterpriseFormQuotes.tsx
@@ -1,4 +1,4 @@
-import { AnimatePresence, motion, useAnimation } from 'framer-motion'
+import { AnimatePresence, motion, useAnimation } from 'motion/react'
import { useEffect, useState, type ReactNode } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/components/Events/EventsFilters.tsx b/apps/www/components/Events/EventsFilters.tsx
index fb852432e89..e23bd3044f8 100644
--- a/apps/www/components/Events/EventsFilters.tsx
+++ b/apps/www/components/Events/EventsFilters.tsx
@@ -1,7 +1,7 @@
import { useBreakpoint } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
import { startCase } from 'lib/helpers'
import { ChevronDown, X as CloseIcon, Search } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useRouter } from 'next/compat/router'
import Link from 'next/link'
import { useSearchParams } from 'next/navigation'
diff --git a/apps/www/components/Hero/HeroFrameworks.tsx b/apps/www/components/Hero/HeroFrameworks.tsx
index f6b50c7b4b9..4fa476f0b21 100644
--- a/apps/www/components/Hero/HeroFrameworks.tsx
+++ b/apps/www/components/Hero/HeroFrameworks.tsx
@@ -1,10 +1,11 @@
+import { EASE_IN, EASE_OUT } from '~/lib/animations'
+import { useSendTelemetryEvent } from '~/lib/telemetry'
import { useBreakpoint } from 'common'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { useState } from 'react'
import { cn } from 'ui'
-import { EASE_IN, EASE_OUT } from '~/lib/animations'
-import { useSendTelemetryEvent } from '~/lib/telemetry'
+
import SectionContainer from '../Layouts/SectionContainer'
type Framework = {
diff --git a/apps/www/components/ImageGrid.tsx b/apps/www/components/ImageGrid.tsx
index 73fd6e500a9..30339f1c4c3 100644
--- a/apps/www/components/ImageGrid.tsx
+++ b/apps/www/components/ImageGrid.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Image from 'next/image'
import Link from 'next/link'
import { cn } from 'ui'
diff --git a/apps/www/components/LaunchWeek/11/Releases/BuildStage.tsx b/apps/www/components/LaunchWeek/11/Releases/BuildStage.tsx
index b2141cda262..a6fb69f96ad 100644
--- a/apps/www/components/LaunchWeek/11/Releases/BuildStage.tsx
+++ b/apps/www/components/LaunchWeek/11/Releases/BuildStage.tsx
@@ -1,6 +1,6 @@
import { buildDays as days } from '~/components/LaunchWeek/11/Releases/data'
import SectionContainer from '~/components/Layouts/SectionContainer'
-import { motion, useInView } from 'framer-motion'
+import { motion, useInView } from 'motion/react'
import React, { FC } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/components/LaunchWeek/11/Releases/components/AdventCard.tsx b/apps/www/components/LaunchWeek/11/Releases/components/AdventCard.tsx
index 04abca107f9..65a91123c17 100644
--- a/apps/www/components/LaunchWeek/11/Releases/components/AdventCard.tsx
+++ b/apps/www/components/LaunchWeek/11/Releases/components/AdventCard.tsx
@@ -1,10 +1,10 @@
-import React, { useEffect, useRef, useState } from 'react'
+import { useBreakpoint } from 'common'
+import { motion } from 'motion/react'
import Link from 'next/link'
-import { motion } from 'framer-motion'
-import Tilt from 'vanilla-tilt'
+import React, { useEffect, useRef, useState } from 'react'
import { useWindowSize } from 'react-use'
import { cn } from 'ui'
-import { useBreakpoint } from 'common'
+import Tilt from 'vanilla-tilt'
import { AdventDay } from '../data'
import { AdventLink } from '../data/lw11_build_stage'
diff --git a/apps/www/components/LaunchWeek/12/Releases/BuildStage.tsx b/apps/www/components/LaunchWeek/12/Releases/BuildStage.tsx
index 34f870bb40e..edc63d1c0df 100644
--- a/apps/www/components/LaunchWeek/12/Releases/BuildStage.tsx
+++ b/apps/www/components/LaunchWeek/12/Releases/BuildStage.tsx
@@ -1,6 +1,6 @@
import { buildDays as days } from '~/components/LaunchWeek/12/Releases/data'
import SectionContainer from '~/components/Layouts/SectionContainer'
-import { motion, useInView } from 'framer-motion'
+import { motion, useInView } from 'motion/react'
import React, { FC } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/components/LaunchWeek/12/Releases/components/BuildCard.tsx b/apps/www/components/LaunchWeek/12/Releases/components/BuildCard.tsx
index 9d872e9a0ef..20bea6cd4f4 100644
--- a/apps/www/components/LaunchWeek/12/Releases/components/BuildCard.tsx
+++ b/apps/www/components/LaunchWeek/12/Releases/components/BuildCard.tsx
@@ -1,10 +1,10 @@
-import React, { useEffect, useRef, useState } from 'react'
+import { useBreakpoint } from 'common'
+import { motion } from 'motion/react'
import Link from 'next/link'
-import { motion } from 'framer-motion'
-import Tilt from 'vanilla-tilt'
+import React, { useEffect, useRef, useState } from 'react'
import { useWindowSize } from 'react-use'
import { cn } from 'ui'
-import { useBreakpoint } from 'common'
+import Tilt from 'vanilla-tilt'
import { AdventDay } from '../data'
import { AdventLink } from '../data/lw12_build_stage'
diff --git a/apps/www/components/LaunchWeek/13/Releases/BuildStage.tsx b/apps/www/components/LaunchWeek/13/Releases/BuildStage.tsx
index f9c3cfa539d..39c48db8f4f 100644
--- a/apps/www/components/LaunchWeek/13/Releases/BuildStage.tsx
+++ b/apps/www/components/LaunchWeek/13/Releases/BuildStage.tsx
@@ -1,6 +1,6 @@
import { buildDays as days } from '~/components/LaunchWeek/13/Releases/data'
import SectionContainer from '~/components/Layouts/SectionContainer'
-import { motion, useInView } from 'framer-motion'
+import { motion, useInView } from 'motion/react'
import React, { FC } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/components/LaunchWeek/13/Releases/components/BuildCard.tsx b/apps/www/components/LaunchWeek/13/Releases/components/BuildCard.tsx
index b62d411201d..adccfee0526 100644
--- a/apps/www/components/LaunchWeek/13/Releases/components/BuildCard.tsx
+++ b/apps/www/components/LaunchWeek/13/Releases/components/BuildCard.tsx
@@ -1,10 +1,10 @@
-import React, { useEffect, useRef, useState } from 'react'
+import { useBreakpoint } from 'common'
+import { motion } from 'motion/react'
import Link from 'next/link'
-import { motion } from 'framer-motion'
-import Tilt from 'vanilla-tilt'
+import React, { useEffect, useRef, useState } from 'react'
import { useWindowSize } from 'react-use'
import { cn } from 'ui'
-import { useBreakpoint } from 'common'
+import Tilt from 'vanilla-tilt'
import { AdventDay } from '../data'
import { AdventLink } from '../data/lw13_build_stage'
diff --git a/apps/www/components/LaunchWeek/14/Releases/BuildStage.tsx b/apps/www/components/LaunchWeek/14/Releases/BuildStage.tsx
index b2fbe8e20fd..69b85a43c55 100644
--- a/apps/www/components/LaunchWeek/14/Releases/BuildStage.tsx
+++ b/apps/www/components/LaunchWeek/14/Releases/BuildStage.tsx
@@ -1,6 +1,6 @@
import { buildDays as days } from '~/components/LaunchWeek/14/Releases/data'
import SectionContainer from '~/components/Layouts/SectionContainer'
-import { motion, useInView } from 'framer-motion'
+import { motion, useInView } from 'motion/react'
import React, { FC } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/components/LaunchWeek/14/Releases/components/BuildCard.tsx b/apps/www/components/LaunchWeek/14/Releases/components/BuildCard.tsx
index b4be1dc409f..4cf8bf54d95 100644
--- a/apps/www/components/LaunchWeek/14/Releases/components/BuildCard.tsx
+++ b/apps/www/components/LaunchWeek/14/Releases/components/BuildCard.tsx
@@ -1,10 +1,10 @@
-import React, { useEffect, useRef, useState } from 'react'
+import { useBreakpoint } from 'common'
+import { motion } from 'motion/react'
import Link from 'next/link'
-import { motion } from 'framer-motion'
-import Tilt from 'vanilla-tilt'
+import React, { useEffect, useRef, useState } from 'react'
import { useWindowSize } from 'react-use'
import { cn } from 'ui'
-import { useBreakpoint } from 'common'
+import Tilt from 'vanilla-tilt'
import { AdventDay } from '../data'
import { AdventLink } from '../data/lw14_build_stage'
diff --git a/apps/www/components/LaunchWeek/15/LW15BuildStage.tsx b/apps/www/components/LaunchWeek/15/LW15BuildStage.tsx
index 333d7bdce07..392ad0dad04 100644
--- a/apps/www/components/LaunchWeek/15/LW15BuildStage.tsx
+++ b/apps/www/components/LaunchWeek/15/LW15BuildStage.tsx
@@ -1,10 +1,9 @@
-import React, { FC } from 'react'
-import Link from 'next/link'
-import { motion, useInView } from 'framer-motion'
-import { cn } from 'ui'
-
import { buildDays as days } from 'components/LaunchWeek/15/data'
import SectionContainer from 'components/Layouts/SectionContainer'
+import { motion, useInView } from 'motion/react'
+import Link from 'next/link'
+import React, { FC } from 'react'
+import { cn } from 'ui'
const LW15BuildStage: FC = () => {
const ref = React.useRef(null)
diff --git a/apps/www/components/LaunchWeek/15/LW15Hackathon.tsx b/apps/www/components/LaunchWeek/15/LW15Hackathon.tsx
index a0e7eaafdc0..18544726518 100644
--- a/apps/www/components/LaunchWeek/15/LW15Hackathon.tsx
+++ b/apps/www/components/LaunchWeek/15/LW15Hackathon.tsx
@@ -1,6 +1,6 @@
import SectionContainer from 'components/Layouts/SectionContainer'
-import { motion, useInView } from 'framer-motion'
import { DEFAULT_EASE } from 'lib/animations'
+import { motion, useInView } from 'motion/react'
import Image from 'next/image'
import Link from 'next/link'
import React, { FC } from 'react'
diff --git a/apps/www/components/LaunchWeek/15/LW15Meetups.tsx b/apps/www/components/LaunchWeek/15/LW15Meetups.tsx
index c14b489d869..7f097098138 100644
--- a/apps/www/components/LaunchWeek/15/LW15Meetups.tsx
+++ b/apps/www/components/LaunchWeek/15/LW15Meetups.tsx
@@ -1,12 +1,13 @@
-import React, { PropsWithChildren, useState, useRef, useCallback, useEffect } from 'react'
-import { cn } from 'ui'
-import Image from 'next/image'
-import Link from 'next/link'
-import { motion, useInView } from 'framer-motion'
-import { FifteenSVG, LWSVG } from './lw15.components'
+import { LumaEvent } from 'app/api-v2/luma-events/route'
import SectionContainer from 'components/Layouts/SectionContainer'
import { DEFAULT_EASE } from 'lib/animations'
-import { LumaEvent } from 'app/api-v2/luma-events/route'
+import { motion, useInView } from 'motion/react'
+import Image from 'next/image'
+import Link from 'next/link'
+import React, { PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react'
+import { cn } from 'ui'
+
+import { FifteenSVG, LWSVG } from './lw15.components'
interface Props {
className?: string
diff --git a/apps/www/components/LaunchWeek/7/BlogLinks.tsx b/apps/www/components/LaunchWeek/7/BlogLinks.tsx
index e3e78bd5d85..35241aaba7d 100644
--- a/apps/www/components/LaunchWeek/7/BlogLinks.tsx
+++ b/apps/www/components/LaunchWeek/7/BlogLinks.tsx
@@ -1,7 +1,7 @@
'use client'
import days from '~/components/LaunchWeek/7/lw7_days'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Image from 'next/image'
import Link from 'next/link'
import React from 'react'
diff --git a/apps/www/components/LaunchWeek/7/LW7BgGraphic.tsx b/apps/www/components/LaunchWeek/7/LW7BgGraphic.tsx
index ca1bd8a9298..e4a2390a50e 100644
--- a/apps/www/components/LaunchWeek/7/LW7BgGraphic.tsx
+++ b/apps/www/components/LaunchWeek/7/LW7BgGraphic.tsx
@@ -1,6 +1,7 @@
-import { motion, useScroll, useTransform } from 'framer-motion'
-import Image from 'next/image'
import { useBreakpoint } from 'common/hooks/useBreakpoint'
+import { motion, useScroll, useTransform } from 'motion/react'
+import Image from 'next/image'
+
import styles from './lw7-bg-graphic.module.css'
export default function LW7BgGraphic() {
diff --git a/apps/www/components/LaunchWeek/7/LaunchSection/LaunchWeekLogoHeader.tsx b/apps/www/components/LaunchWeek/7/LaunchSection/LaunchWeekLogoHeader.tsx
index 7c16bd8b40e..3310747e641 100644
--- a/apps/www/components/LaunchWeek/7/LaunchSection/LaunchWeekLogoHeader.tsx
+++ b/apps/www/components/LaunchWeek/7/LaunchSection/LaunchWeekLogoHeader.tsx
@@ -1,7 +1,7 @@
import classNames from 'classnames'
-import Image from 'next/image'
-import { motion } from 'framer-motion'
import { useBreakpoint } from 'common/hooks/useBreakpoint'
+import { motion } from 'motion/react'
+import Image from 'next/image'
export function LaunchWeekLogoHeader() {
const isMobile = useBreakpoint(640)
diff --git a/apps/www/components/LaunchWeek/7/LaunchWeekPrizeCard.tsx b/apps/www/components/LaunchWeek/7/LaunchWeekPrizeCard.tsx
index 79e630df958..47ae9b31735 100644
--- a/apps/www/components/LaunchWeek/7/LaunchWeekPrizeCard.tsx
+++ b/apps/www/components/LaunchWeek/7/LaunchWeekPrizeCard.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Image from 'next/image'
import React from 'react'
diff --git a/apps/www/components/LaunchWeek/7/LaunchWeekPrizeSection.tsx b/apps/www/components/LaunchWeek/7/LaunchWeekPrizeSection.tsx
index 8087b96e367..718a88c3d37 100644
--- a/apps/www/components/LaunchWeek/7/LaunchWeekPrizeSection.tsx
+++ b/apps/www/components/LaunchWeek/7/LaunchWeekPrizeSection.tsx
@@ -1,7 +1,8 @@
+import { motion } from 'motion/react'
import React from 'react'
+
import LabelBadge from './LabelBadge'
import LaunchWeekPrizeCard from './LaunchWeekPrizeCard'
-import { motion } from 'framer-motion'
export default function LaunchWeekPrizeSection({
className,
diff --git a/apps/www/components/LaunchWeek/7/Releases/Day5.tsx b/apps/www/components/LaunchWeek/7/Releases/Day5.tsx
index 7de82e27489..40f15aa2d42 100644
--- a/apps/www/components/LaunchWeek/7/Releases/Day5.tsx
+++ b/apps/www/components/LaunchWeek/7/Releases/Day5.tsx
@@ -1,7 +1,11 @@
-import React from 'react'
-import Image from 'next/image'
-import { motion } from 'framer-motion'
+import { opacityVariant4, scaleOpacityVariant2 } from '.'
+import { WeekDayProps } from '~/components/LaunchWeek/7/lw7_days'
import { useBreakpoint } from 'common/hooks/useBreakpoint'
+import { motion } from 'motion/react'
+import Image from 'next/image'
+import Link from 'next/link'
+import React from 'react'
+
import {
ArrowTopRightSvg,
CartTitle,
@@ -10,12 +14,7 @@ import {
SectionButtons,
StyledArticleBadge,
} from './components'
-
-import { WeekDayProps } from '~/components/LaunchWeek/7/lw7_days'
-import { opacityVariant4, scaleOpacityVariant2 } from '.'
-
import styles from './day5.module.css'
-import Link from 'next/link'
const getDay5Motion = (index: number) => {
switch (index) {
diff --git a/apps/www/components/LaunchWeek/7/Releases/index.tsx b/apps/www/components/LaunchWeek/7/Releases/index.tsx
index ff934000b3f..50ca97f4973 100644
--- a/apps/www/components/LaunchWeek/7/Releases/index.tsx
+++ b/apps/www/components/LaunchWeek/7/Releases/index.tsx
@@ -1,7 +1,7 @@
import days, { endOfLW7, WeekDayProps } from '~/components/LaunchWeek/7/lw7_days'
import SectionContainer from '~/components/Layouts/SectionContainer'
import { useBreakpoint } from 'common/hooks/useBreakpoint'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Image from 'next/image'
import { useEffect } from 'react'
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from 'ui'
diff --git a/apps/www/components/LaunchWeek/8/LaunchWeekPrizeCard.tsx b/apps/www/components/LaunchWeek/8/LaunchWeekPrizeCard.tsx
index 0f49cdeb121..00e59482a65 100644
--- a/apps/www/components/LaunchWeek/8/LaunchWeekPrizeCard.tsx
+++ b/apps/www/components/LaunchWeek/8/LaunchWeekPrizeCard.tsx
@@ -1,4 +1,4 @@
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Image from 'next/image'
import React from 'react'
import { cn } from 'ui'
diff --git a/apps/www/components/LaunchWeek/X/Releases/BuildStage.tsx b/apps/www/components/LaunchWeek/X/Releases/BuildStage.tsx
index 7963d675e79..e1c3c99965f 100644
--- a/apps/www/components/LaunchWeek/X/Releases/BuildStage.tsx
+++ b/apps/www/components/LaunchWeek/X/Releases/BuildStage.tsx
@@ -1,11 +1,11 @@
-import React, { FC } from 'react'
import { buildDays as days } from '~/components/LaunchWeek/X/Releases/data'
-
import SectionContainer from '~/components/Layouts/SectionContainer'
-import AdventCard from './components/AdventCard'
-import { motion, useInView } from 'framer-motion'
+import { motion, useInView } from 'motion/react'
+import React, { FC } from 'react'
import { cn } from 'ui'
+import AdventCard from './components/AdventCard'
+
const BuildStage: FC = () => {
const ref = React.useRef(null)
const isInView = useInView(ref, { margin: '-25%', once: true })
diff --git a/apps/www/components/LaunchWeek/X/Releases/components/AdventCard.tsx b/apps/www/components/LaunchWeek/X/Releases/components/AdventCard.tsx
index 7802c0a4b45..79832101281 100644
--- a/apps/www/components/LaunchWeek/X/Releases/components/AdventCard.tsx
+++ b/apps/www/components/LaunchWeek/X/Releases/components/AdventCard.tsx
@@ -1,10 +1,10 @@
-import React, { useEffect, useRef, useState } from 'react'
+import { useBreakpoint } from 'common'
+import { motion } from 'motion/react'
import Link from 'next/link'
-import { motion } from 'framer-motion'
-import Tilt from 'vanilla-tilt'
+import React, { useEffect, useRef, useState } from 'react'
import { useWindowSize } from 'react-use'
import { cn } from 'ui'
-import { useBreakpoint } from 'common'
+import Tilt from 'vanilla-tilt'
import { AdventDay } from '../data'
import { AdventLink } from '../data/lwx_advent_days'
diff --git a/apps/www/components/MagnifiedProducts.tsx b/apps/www/components/MagnifiedProducts.tsx
index 685dabbcc10..1d2c6b7afd8 100644
--- a/apps/www/components/MagnifiedProducts.tsx
+++ b/apps/www/components/MagnifiedProducts.tsx
@@ -1,18 +1,15 @@
-import { useRef } from 'react'
-import Link from 'next/link'
+import { DEFAULT_TRANSITION } from '~/lib/animations'
+import { useBreakpoint } from 'common'
import {
- MotionValue,
motion,
+ MotionValue,
useInView,
useMotionValue,
useSpring,
useTransform,
-} from 'framer-motion'
-import { useBreakpoint } from 'common'
-import { Products } from './Sections/ProductsCta'
-import { cn } from 'ui'
-
-import { DEFAULT_TRANSITION } from '~/lib/animations'
+} from 'motion/react'
+import Link from 'next/link'
+import { useRef } from 'react'
import {
PRODUCT_MODULES,
PRODUCT_MODULES_NAMES,
@@ -21,6 +18,9 @@ import {
PRODUCT_SHORTNAMES,
products as PRODUCTS,
} from 'shared-data/products'
+import { cn } from 'ui'
+
+import { Products } from './Sections/ProductsCta'
function MagnifiedProducts({ currentProduct }: { currentProduct: Products | string }) {
let mouseX = useMotionValue(Infinity)
diff --git a/apps/www/components/Nav/MobileMenu.tsx b/apps/www/components/Nav/MobileMenu.tsx
index 1898ac58d1b..58dc3c6bf37 100644
--- a/apps/www/components/Nav/MobileMenu.tsx
+++ b/apps/www/components/Nav/MobileMenu.tsx
@@ -2,8 +2,8 @@
import { type Menu } from '~/data/nav'
import { useIsLoggedIn, useIsUserLoading } from 'common'
-import { AnimatePresence, domAnimation, LazyMotion, m } from 'framer-motion'
import { ChevronRight } from 'lucide-react'
+import { AnimatePresence, domAnimation, LazyMotion, m } from 'motion/react'
import Link from 'next/link'
import { useEffect } from 'react'
import type { Dispatch, SetStateAction } from 'react'
diff --git a/apps/www/components/Nav/SolutionsDropdown.tsx b/apps/www/components/Nav/SolutionsDropdown.tsx
index 2bb7fc0c930..8491cfe8be8 100644
--- a/apps/www/components/Nav/SolutionsDropdown.tsx
+++ b/apps/www/components/Nav/SolutionsDropdown.tsx
@@ -1,7 +1,7 @@
import { useBreakpoint, useReducedMotion } from 'common'
import { navData as DevelopersData } from 'data/Solutions'
-import { AnimatePresence, motion } from 'framer-motion'
import { ArrowLeftRight, ChevronRight } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Link from 'next/link'
import { useState } from 'react'
import { useMedia } from 'react-use'
diff --git a/apps/www/components/OpenSource/OSSHero.tsx b/apps/www/components/OpenSource/OSSHero.tsx
index 16d5dad67db..d08a6fbfef7 100644
--- a/apps/www/components/OpenSource/OSSHero.tsx
+++ b/apps/www/components/OpenSource/OSSHero.tsx
@@ -1,5 +1,5 @@
import { useBreakpoint } from 'common'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { useTheme } from 'next-themes'
import React from 'react'
import { useWindowSize } from 'react-use'
diff --git a/apps/www/components/OpenSource/RepoCard.tsx b/apps/www/components/OpenSource/RepoCard.tsx
index 85eb2cc2a26..9cfab2ed617 100644
--- a/apps/www/components/OpenSource/RepoCard.tsx
+++ b/apps/www/components/OpenSource/RepoCard.tsx
@@ -1,9 +1,8 @@
-import { motion } from 'framer-motion'
-import { Star } from 'lucide-react'
-import Link from 'next/link'
-
import Panel from '~/components/Panel'
import { useSendTelemetryEvent } from '~/lib/telemetry'
+import { Star } from 'lucide-react'
+import { motion } from 'motion/react'
+import Link from 'next/link'
const RepoCard = ({ repo, activeTab, index }: { repo: any; activeTab: number; index: number }) => {
const sendTelemetryEvent = useSendTelemetryEvent()
diff --git a/apps/www/components/OpenSource/Repos.tsx b/apps/www/components/OpenSource/Repos.tsx
index 6027a2f9127..3b1e5b9ed28 100644
--- a/apps/www/components/OpenSource/Repos.tsx
+++ b/apps/www/components/OpenSource/Repos.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence } from 'framer-motion'
import { Pencil, Users, Users2 } from 'lucide-react'
+import { AnimatePresence } from 'motion/react'
import Link from 'next/link'
import React, { useEffect, useState } from 'react'
import { Swiper, SwiperSlide } from 'swiper/react'
diff --git a/apps/www/components/Panel/Panel.tsx b/apps/www/components/Panel/Panel.tsx
index ad3bddf340b..5a3531b877a 100644
--- a/apps/www/components/Panel/Panel.tsx
+++ b/apps/www/components/Panel/Panel.tsx
@@ -1,7 +1,7 @@
'use client'
import { detectBrowser, isBrowser } from 'common'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import React, { PropsWithChildren, useEffect, useRef } from 'react'
import { cn } from 'ui'
diff --git a/apps/www/components/Pricing/CostControlAnimation.tsx b/apps/www/components/Pricing/CostControlAnimation.tsx
index 7e247cc7466..5498811dfd5 100644
--- a/apps/www/components/Pricing/CostControlAnimation.tsx
+++ b/apps/www/components/Pricing/CostControlAnimation.tsx
@@ -1,8 +1,8 @@
'use client'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import React, { FC, useRef, useState } from 'react'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
-import { Switch, cn } from 'ui'
+import { cn, Switch } from 'ui'
interface Props {
className?: string
diff --git a/apps/www/components/Products/Functions/CI.tsx b/apps/www/components/Products/Functions/CI.tsx
index a2c546e92f8..ee51728eeaf 100644
--- a/apps/www/components/Products/Functions/CI.tsx
+++ b/apps/www/components/Products/Functions/CI.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { useEffect, useState } from 'react'
const CODE_LINES = [
diff --git a/apps/www/components/Products/Functions/LocalDXImage.tsx b/apps/www/components/Products/Functions/LocalDXImage.tsx
index bc01d4a5ee2..9accd4227f6 100644
--- a/apps/www/components/Products/Functions/LocalDXImage.tsx
+++ b/apps/www/components/Products/Functions/LocalDXImage.tsx
@@ -1,7 +1,7 @@
'use client'
-import { AnimatePresence, motion } from 'framer-motion'
import { Check, Copy } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import Image from 'next/image'
import { useEffect, useRef, useState } from 'react'
import CopyToClipboard from 'react-copy-to-clipboard'
diff --git a/apps/www/components/Products/Functions/NpmEcosystem.tsx b/apps/www/components/Products/Functions/NpmEcosystem.tsx
index 4557551de6d..67dc33a46ae 100644
--- a/apps/www/components/Products/Functions/NpmEcosystem.tsx
+++ b/apps/www/components/Products/Functions/NpmEcosystem.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
const npmList = [
'fetch',
diff --git a/apps/www/components/Products/Functions/ParityImage.tsx b/apps/www/components/Products/Functions/ParityImage.tsx
index 6b9417247cc..cb32cdb6e8e 100644
--- a/apps/www/components/Products/Functions/ParityImage.tsx
+++ b/apps/www/components/Products/Functions/ParityImage.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import Image from 'next/image'
import { cn } from 'ui'
diff --git a/apps/www/components/Products/Functions/QueryLogs.tsx b/apps/www/components/Products/Functions/QueryLogs.tsx
index f00c6bcf7c8..4718c0effa8 100644
--- a/apps/www/components/Products/Functions/QueryLogs.tsx
+++ b/apps/www/components/Products/Functions/QueryLogs.tsx
@@ -1,6 +1,6 @@
import dayjs from 'dayjs'
-import { AnimatePresence, motion } from 'framer-motion'
import { AlertCircle, Info } from 'lucide-react'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect, useState } from 'react'
import { useInterval } from 'react-use'
import { cn } from 'ui'
diff --git a/apps/www/components/Products/Functions/RealtimeLogs.tsx b/apps/www/components/Products/Functions/RealtimeLogs.tsx
index 66500433799..133f604c30a 100644
--- a/apps/www/components/Products/Functions/RealtimeLogs.tsx
+++ b/apps/www/components/Products/Functions/RealtimeLogs.tsx
@@ -1,5 +1,5 @@
import dayjs from 'dayjs'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { FC, useEffect, useState } from 'react'
import { useInterval } from 'react-use'
import { Badge, cn } from 'ui'
diff --git a/apps/www/components/Products/VectorAI/CustomersVisual.tsx b/apps/www/components/Products/VectorAI/CustomersVisual.tsx
index 4e731029508..d2d48e4a51d 100644
--- a/apps/www/components/Products/VectorAI/CustomersVisual.tsx
+++ b/apps/www/components/Products/VectorAI/CustomersVisual.tsx
@@ -1,5 +1,5 @@
import { DEFAULT_EASE } from '~/lib/animations'
-import { m } from 'framer-motion'
+import { m } from 'motion/react'
import React from 'react'
const CustomersVisual = () => {
diff --git a/apps/www/components/Products/VectorAI/IntegrationsImage.tsx b/apps/www/components/Products/VectorAI/IntegrationsImage.tsx
index b3341becd10..dadd737fe1d 100644
--- a/apps/www/components/Products/VectorAI/IntegrationsImage.tsx
+++ b/apps/www/components/Products/VectorAI/IntegrationsImage.tsx
@@ -1,9 +1,9 @@
-import React, { useRef } from 'react'
-import Image from 'next/image'
-import { useTheme } from 'next-themes'
-import { LazyMotion, domAnimation, m, useInView } from 'framer-motion'
-import { INITIAL_BOTTOM, getAnimation } from '~/lib/animations'
+import { getAnimation, INITIAL_BOTTOM } from '~/lib/animations'
import { useBreakpoint } from 'common'
+import { domAnimation, LazyMotion, m, useInView } from 'motion/react'
+import { useTheme } from 'next-themes'
+import Image from 'next/image'
+import React, { useRef } from 'react'
const IntegrationsImage = () => {
const ref = useRef(null)
diff --git a/apps/www/components/Products/VectorAI/OpenAIImage.tsx b/apps/www/components/Products/VectorAI/OpenAIImage.tsx
index 62cba18db9d..368fc86d23e 100644
--- a/apps/www/components/Products/VectorAI/OpenAIImage.tsx
+++ b/apps/www/components/Products/VectorAI/OpenAIImage.tsx
@@ -1,7 +1,7 @@
+import { domAnimation, LazyMotion, m, useInView } from 'motion/react'
+import { useTheme } from 'next-themes'
import Image from 'next/image'
import React from 'react'
-import { useTheme } from 'next-themes'
-import { LazyMotion, domAnimation, m, useInView } from 'framer-motion'
const OpenAIImage = ({ isHovered }: { isHovered: boolean }) => {
const { resolvedTheme } = useTheme()
diff --git a/apps/www/components/Products/VectorAI/PGvectorImg.tsx b/apps/www/components/Products/VectorAI/PGvectorImg.tsx
index c7f21fdea3c..8d6cfc46590 100644
--- a/apps/www/components/Products/VectorAI/PGvectorImg.tsx
+++ b/apps/www/components/Products/VectorAI/PGvectorImg.tsx
@@ -1,5 +1,5 @@
import { DEFAULT_EASE } from '~/lib/animations'
-import { domAnimation, LazyMotion, m } from 'framer-motion'
+import { domAnimation, LazyMotion, m } from 'motion/react'
import { useTheme } from 'next-themes'
import React, { useEffect, useRef } from 'react'
diff --git a/apps/www/components/Sections/CustomerQuotesSection.tsx b/apps/www/components/Sections/CustomerQuotesSection.tsx
index 746258b53d7..4e606e8d7d8 100644
--- a/apps/www/components/Sections/CustomerQuotesSection.tsx
+++ b/apps/www/components/Sections/CustomerQuotesSection.tsx
@@ -1,8 +1,8 @@
import SectionContainer from '~/components/Layouts/SectionContainer'
import CustomersVisual from '~/components/Products/VectorAI/CustomersVisual'
import { getAnimation, INITIAL_BOTTOM } from '~/lib/animations'
-import { domAnimation, LazyMotion, m, useInView } from 'framer-motion'
import { ArrowUpRight } from 'lucide-react'
+import { domAnimation, LazyMotion, m, useInView } from 'motion/react'
import { useTheme } from 'next-themes'
import Image from 'next/image'
import Link from 'next/link'
diff --git a/apps/www/components/Sections/FeaturesSection.tsx b/apps/www/components/Sections/FeaturesSection.tsx
index 7951da6102e..a34f72b75c3 100644
--- a/apps/www/components/Sections/FeaturesSection.tsx
+++ b/apps/www/components/Sections/FeaturesSection.tsx
@@ -1,7 +1,7 @@
import SectionContainer from '~/components/Layouts/SectionContainer'
import { getAnimation, INITIAL_BOTTOM } from '~/lib/animations'
-import { domAnimation, LazyMotion, m, useInView } from 'framer-motion'
import { ArrowUpRight } from 'lucide-react'
+import { domAnimation, LazyMotion, m, useInView } from 'motion/react'
import Link from 'next/link'
import { ReactNode, useRef } from 'react'
import ReactMarkdown from 'react-markdown'
diff --git a/apps/www/components/Sections/HighlightCards.tsx b/apps/www/components/Sections/HighlightCards.tsx
index 554ecd93462..07093b7d8b5 100644
--- a/apps/www/components/Sections/HighlightCards.tsx
+++ b/apps/www/components/Sections/HighlightCards.tsx
@@ -1,7 +1,7 @@
import SectionContainer from '~/components/Layouts/SectionContainer'
import Panel from '~/components/Panel'
import { getAnimation, INITIAL_BOTTOM } from '~/lib/animations'
-import { domAnimation, LazyMotion, m, useInView } from 'framer-motion'
+import { domAnimation, LazyMotion, m, useInView } from 'motion/react'
import React, { useRef, useState } from 'react'
interface Highlight {
diff --git a/apps/www/components/Sections/TimedAccordionPanels.tsx b/apps/www/components/Sections/TimedAccordionPanels.tsx
index 15e1c5973a8..1278b4fd884 100644
--- a/apps/www/components/Sections/TimedAccordionPanels.tsx
+++ b/apps/www/components/Sections/TimedAccordionPanels.tsx
@@ -1,7 +1,7 @@
import 'swiper/css'
import { useBreakpoint } from 'common'
-import { domAnimation, LazyMotion, m, useAnimation, useInView } from 'framer-motion'
+import { domAnimation, LazyMotion, m, useAnimation, useInView } from 'motion/react'
import React, { useEffect, useRef, useState } from 'react'
import { Swiper, SwiperSlide } from 'swiper/react'
import { cn } from 'ui'
diff --git a/apps/www/components/Sections/TimedAccordionSection.tsx b/apps/www/components/Sections/TimedAccordionSection.tsx
index acffd19388b..8c28a556883 100644
--- a/apps/www/components/Sections/TimedAccordionSection.tsx
+++ b/apps/www/components/Sections/TimedAccordionSection.tsx
@@ -1,7 +1,7 @@
import 'swiper/css'
import { useBreakpoint } from 'common'
-import { domAnimation, LazyMotion, m, useAnimation, useInView } from 'framer-motion'
+import { domAnimation, LazyMotion, m, useAnimation, useInView } from 'motion/react'
import React, { useEffect, useRef, useState, type ReactNode } from 'react'
import { Swiper, SwiperSlide } from 'swiper/react'
import { cn } from 'ui'
diff --git a/apps/www/components/Sections/TimedTabsSection.tsx b/apps/www/components/Sections/TimedTabsSection.tsx
index ef700dec426..0f250979622 100644
--- a/apps/www/components/Sections/TimedTabsSection.tsx
+++ b/apps/www/components/Sections/TimedTabsSection.tsx
@@ -2,8 +2,8 @@ import 'swiper/css'
import CodeBlock from '~/components/CodeBlock/CodeBlock'
import SectionContainer from '~/components/Layouts/SectionContainer'
-import { AnimatePresence, motion, useAnimation } from 'framer-motion'
import { ArrowUpRight } from 'lucide-react'
+import { AnimatePresence, motion, useAnimation } from 'motion/react'
import Image from 'next/image'
import Link from 'next/link'
import { useEffect, useState, type ReactNode } from 'react'
diff --git a/apps/www/components/Sections/UseCasesSection.tsx b/apps/www/components/Sections/UseCasesSection.tsx
index 1bf2ca9b202..14f1be19873 100644
--- a/apps/www/components/Sections/UseCasesSection.tsx
+++ b/apps/www/components/Sections/UseCasesSection.tsx
@@ -1,8 +1,8 @@
import SectionContainer from '~/components/Layouts/SectionContainer'
import Panel from '~/components/Panel'
import { getAnimation, INITIAL_BOTTOM } from '~/lib/animations'
-import { domAnimation, LazyMotion, m, useInView } from 'framer-motion'
import { ArrowUpRight } from 'lucide-react'
+import { domAnimation, LazyMotion, m, useInView } from 'motion/react'
import Link from 'next/link'
import { ReactNode, useRef } from 'react'
import { Button } from 'ui'
diff --git a/apps/www/components/SurveyResults/SurveyChart.tsx b/apps/www/components/SurveyResults/SurveyChart.tsx
index 4dbb2435996..715b0346136 100644
--- a/apps/www/components/SurveyResults/SurveyChart.tsx
+++ b/apps/www/components/SurveyResults/SurveyChart.tsx
@@ -2,8 +2,8 @@
import { createClient } from '@supabase/supabase-js'
import CodeBlock from '~/components/CodeBlock/CodeBlock'
-import { motion } from 'framer-motion'
import { ChevronsUpDown } from 'lucide-react'
+import { motion } from 'motion/react'
import { useCallback, useEffect, useRef, useState } from 'react'
import {
Button,
diff --git a/apps/www/components/TabsWithHighlights.tsx b/apps/www/components/TabsWithHighlights.tsx
index 17ac3ddf7a0..7e300602d8b 100644
--- a/apps/www/components/TabsWithHighlights.tsx
+++ b/apps/www/components/TabsWithHighlights.tsx
@@ -1,5 +1,5 @@
-import { AnimatePresence, motion, useInView } from 'framer-motion'
import { Check } from 'lucide-react'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import { useTheme } from 'next-themes'
import Link from 'next/link'
import React, { useRef, useState } from 'react'
diff --git a/apps/www/components/UsersGrowthChart.tsx b/apps/www/components/UsersGrowthChart.tsx
index af92bc2139c..8551890c9e1 100644
--- a/apps/www/components/UsersGrowthChart.tsx
+++ b/apps/www/components/UsersGrowthChart.tsx
@@ -1,5 +1,5 @@
import { companyStats } from '~/data/company-stats'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { FC, useEffect, useMemo, useState } from 'react'
import { useMedia } from 'react-use'
import { AnimatedCounter, Badge, cn } from 'ui'
diff --git a/apps/www/components/Wrapped/AnimatedGridBackground.tsx b/apps/www/components/Wrapped/AnimatedGridBackground.tsx
index c6455ca32c8..59a9e6fc527 100644
--- a/apps/www/components/Wrapped/AnimatedGridBackground.tsx
+++ b/apps/www/components/Wrapped/AnimatedGridBackground.tsx
@@ -1,7 +1,8 @@
'use client'
-import { motion, useInView } from 'framer-motion'
-import { useState, useEffect, useCallback, useMemo, useRef } from 'react'
+import { motion, useInView } from 'motion/react'
+import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+
import { Dots, Stripes } from './Visuals'
const STAGGER_DELAY = 0.05
diff --git a/apps/www/components/Wrapped/Pages/Home.tsx b/apps/www/components/Wrapped/Pages/Home.tsx
index 2be854ea4cc..d2f9ce05c5d 100644
--- a/apps/www/components/Wrapped/Pages/Home.tsx
+++ b/apps/www/components/Wrapped/Pages/Home.tsx
@@ -1,9 +1,10 @@
'use client'
-import { AnimatePresence, motion } from 'framer-motion'
+import { useBreakpoint } from 'common'
+import { AnimatePresence, motion } from 'motion/react'
import { useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
-import { useBreakpoint } from 'common'
+
import { AnimatedGridBackground } from '../AnimatedGridBackground'
const stats = [
diff --git a/apps/www/components/Wrapped/Pages/Intro.tsx b/apps/www/components/Wrapped/Pages/Intro.tsx
index cf28e509f4e..d3fefbc258a 100644
--- a/apps/www/components/Wrapped/Pages/Intro.tsx
+++ b/apps/www/components/Wrapped/Pages/Intro.tsx
@@ -1,11 +1,12 @@
'use client'
import * as Scrollytelling from '@bsmnt/scrollytelling'
-import { useRef, useState, useEffect } from 'react'
-import { motion, AnimatePresence, useInView } from 'framer-motion'
-import { Dots, Stripes } from '../Visuals'
+import { AnimatePresence, motion, useInView } from 'motion/react'
+import { useEffect, useRef, useState } from 'react'
import { cn } from 'ui'
+import { Dots, Stripes } from '../Visuals'
+
const titles = [
'Thank you to our community.',
'You created more Supabase databases in 2025 than in all previous years combined.',
diff --git a/apps/www/components/Wrapped/Pages/SupabaseSelect.tsx b/apps/www/components/Wrapped/Pages/SupabaseSelect.tsx
index 749237160db..7d4930210a1 100644
--- a/apps/www/components/Wrapped/Pages/SupabaseSelect.tsx
+++ b/apps/www/components/Wrapped/Pages/SupabaseSelect.tsx
@@ -1,8 +1,9 @@
'use client'
-import { AnimatePresence, motion, useInView } from 'framer-motion'
+import { AnimatePresence, motion, useInView } from 'motion/react'
import Image from 'next/image'
import { useCallback, useEffect, useRef, useState } from 'react'
+
import { AnimatedGridBackground } from '../AnimatedGridBackground'
// All available images from Supabase Select event
diff --git a/apps/www/package.json b/apps/www/package.json
index 3c2dd50222f..e7c007f6106 100644
--- a/apps/www/package.json
+++ b/apps/www/package.json
@@ -56,7 +56,6 @@
"dayjs": "^1.11.12",
"dev-tools": "workspace:*",
"eslint-config-supabase": "workspace:*",
- "framer-motion": "^11.18.2",
"globby": "^13.2.2",
"gray-matter": "^4.0.3",
"gsap": "^3.13.0",
@@ -72,6 +71,7 @@
"mdast-util-to-markdown": "^1.5.0",
"micromark-extension-gfm": "^2.0.3",
"micromark-extension-mdxjs": "^1.0.1",
+ "motion": "catalog:",
"next": "^15.5.24",
"next-mdx-remote-client": "^1.1.7",
"next-seo": "^6.5.0",
diff --git a/apps/www/pages/assistant.tsx b/apps/www/pages/assistant.tsx
index 024e834e94b..3c3f22d355b 100644
--- a/apps/www/pages/assistant.tsx
+++ b/apps/www/pages/assistant.tsx
@@ -2,7 +2,7 @@ import DotGrid from '~/components/AIDemo/DotGrid'
import { AIDemoPanel } from '~/components/AIDemo/Panel'
import { SqlSnippet } from '~/components/AIDemo/SqlSnippet'
import { useIsLoggedIn, useIsUserLoading } from 'common'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { NextSeo } from 'next-seo'
import dynamic from 'next/dynamic'
import Link from 'next/link'
diff --git a/apps/www/pages/customers.tsx b/apps/www/pages/customers.tsx
index 3cb92c9dcb1..ae080c63a65 100644
--- a/apps/www/pages/customers.tsx
+++ b/apps/www/pages/customers.tsx
@@ -4,7 +4,7 @@ import { getSortedPosts } from '~/lib/posts'
import { generateRss } from '~/lib/rss'
import styles from '~/styles/customers.module.css'
import type PostTypes from '~/types/post'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { NextSeo } from 'next-seo'
import Head from 'next/head'
import Link from 'next/link'
diff --git a/apps/www/pages/features.tsx b/apps/www/pages/features.tsx
index c7c892e89e3..e07032d1ca5 100644
--- a/apps/www/pages/features.tsx
+++ b/apps/www/pages/features.tsx
@@ -1,6 +1,6 @@
-import { motion } from 'framer-motion'
import { debounce } from 'lib/helpers'
import { LayoutGrid, Search, Table2 } from 'lucide-react'
+import { motion } from 'motion/react'
import { NextSeo } from 'next-seo'
import { useRouter } from 'next/compat/router'
import Head from 'next/head'
diff --git a/apps/www/pages/state-of-startups-2025.tsx b/apps/www/pages/state-of-startups-2025.tsx
index 1a34e53bee8..0ae9d8b838d 100644
--- a/apps/www/pages/state-of-startups-2025.tsx
+++ b/apps/www/pages/state-of-startups-2025.tsx
@@ -5,7 +5,7 @@ import { SurveyChapterSection } from '~/components/SurveyResults/SurveyChapterSe
import { SurveySectionBreak } from '~/components/SurveyResults/SurveySectionBreak'
import pageData from '~/data/surveys/state-of-startups-2025'
import { useSendTelemetryEvent } from '~/lib/telemetry'
-import { motion } from 'framer-motion'
+import { motion } from 'motion/react'
import { NextSeo } from 'next-seo'
import Link from 'next/link'
import { forwardRef, useEffect, useRef, useState } from 'react'
diff --git a/packages/ui-patterns/package.json b/packages/ui-patterns/package.json
index 47ad8e52f2b..c7a22c82323 100644
--- a/packages/ui-patterns/package.json
+++ b/packages/ui-patterns/package.json
@@ -766,7 +766,6 @@
"common": "workspace:*",
"common-tags": "^1.8.2",
"dayjs": "^1.11.13",
- "framer-motion": "^11.18.2",
"github-slugger": "^2.0.0",
"highlightjs-curl": "^1.3.0",
"icons": "workspace:*",
@@ -777,6 +776,7 @@
"mdast-jsx": "^0.1.1",
"mermaid": "^11.12.1",
"monaco-editor": "*",
+ "motion": "catalog:",
"next-themes": "catalog:",
"openai": "^4.75.1",
"prism-react-renderer": "^2.3.1",
diff --git a/packages/ui-patterns/src/FilterBar/FilterBar.tsx b/packages/ui-patterns/src/FilterBar/FilterBar.tsx
index 84cc0753af7..5bc4791b30c 100644
--- a/packages/ui-patterns/src/FilterBar/FilterBar.tsx
+++ b/packages/ui-patterns/src/FilterBar/FilterBar.tsx
@@ -1,7 +1,7 @@
'use client'
-import { motion } from 'framer-motion'
import { Search } from 'lucide-react'
+import { motion } from 'motion/react'
import React, { forwardRef } from 'react'
import { cn } from 'ui'
diff --git a/packages/ui-patterns/src/SqlToRest/syntax-highlighter/framer-features.ts b/packages/ui-patterns/src/SqlToRest/syntax-highlighter/framer-features.ts
index e0013ea7cd5..3feb81ce3bd 100644
--- a/packages/ui-patterns/src/SqlToRest/syntax-highlighter/framer-features.ts
+++ b/packages/ui-patterns/src/SqlToRest/syntax-highlighter/framer-features.ts
@@ -1,3 +1,3 @@
-import { domMax } from 'framer-motion'
+import { domMax } from 'motion/react'
export default domMax
diff --git a/packages/ui-patterns/src/SqlToRest/syntax-highlighter/transform-renderer.tsx b/packages/ui-patterns/src/SqlToRest/syntax-highlighter/transform-renderer.tsx
index 3dac2d54b1f..0bdec6b311a 100644
--- a/packages/ui-patterns/src/SqlToRest/syntax-highlighter/transform-renderer.tsx
+++ b/packages/ui-patterns/src/SqlToRest/syntax-highlighter/transform-renderer.tsx
@@ -1,4 +1,4 @@
-import { LazyMotion, m } from 'framer-motion'
+import { LazyMotion, m } from 'motion/react'
import React, { PropsWithChildren } from 'react'
import { createElement, SyntaxHighlighterProps } from 'react-syntax-highlighter'
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 7f1db51b2d8..b18c4c7e003 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -22,10 +22,10 @@
"cmdk": "^1.1.1",
"color": "^4.2.3",
"date-fns": "^2.30.0",
- "framer-motion": "^11.18.2",
"input-otp": "^1.4.2",
"lodash": "catalog:",
"lucide-react": "^0.436.0",
+ "motion": "catalog:",
"prop-types": "^15.7.2",
"radix-ui": "catalog:",
"react": "catalog:",
diff --git a/packages/ui/src/components/AnimatedCounter/AnimatedCounter.tsx b/packages/ui/src/components/AnimatedCounter/AnimatedCounter.tsx
index b50199fbcb2..0fe178f7df0 100644
--- a/packages/ui/src/components/AnimatedCounter/AnimatedCounter.tsx
+++ b/packages/ui/src/components/AnimatedCounter/AnimatedCounter.tsx
@@ -1,6 +1,6 @@
'use client'
-import { animate, motion, useInView, useMotionValue, useTransform } from 'framer-motion'
+import { animate, motion, useInView, useMotionValue, useTransform } from 'motion/react'
import { FC, useEffect, useRef } from 'react'
import { cn } from '../../lib/utils/cn'
diff --git a/packages/ui/src/components/shadcn/ui/form.tsx b/packages/ui/src/components/shadcn/ui/form.tsx
index f1bfd096cbb..0accbb37719 100644
--- a/packages/ui/src/components/shadcn/ui/form.tsx
+++ b/packages/ui/src/components/shadcn/ui/form.tsx
@@ -1,6 +1,6 @@
'use client'
-import { AnimatePresence, motion } from 'framer-motion'
+import { AnimatePresence, motion } from 'motion/react'
import { Label as LabelPrimitive, Slot as SlotPrimitive } from 'radix-ui'
import * as React from 'react'
import {
diff --git a/packages/ui/src/layout/ai-icon-animation/ai-icon-animation.tsx b/packages/ui/src/layout/ai-icon-animation/ai-icon-animation.tsx
index c4bbbf51ca6..0d73ebefab1 100644
--- a/packages/ui/src/layout/ai-icon-animation/ai-icon-animation.tsx
+++ b/packages/ui/src/layout/ai-icon-animation/ai-icon-animation.tsx
@@ -1,6 +1,6 @@
'use client'
-import { motion, useMotionValue, useSpring } from 'framer-motion'
+import { motion, useMotionValue, useSpring } from 'motion/react'
import { memo, useRef, useState } from 'react'
import { cn } from '../../lib/utils'
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index daa119338a4..417869d4686 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -63,6 +63,9 @@ catalogs:
cn:
specifier: ^0.4.0
version: 0.4.0
+ motion:
+ specifier: ^11.18.2
+ version: 11.18.2
next:
specifier: ^16.3.6
version: 16.3.6
@@ -416,9 +419,6 @@ importers:
eslint-config-supabase:
specifier: workspace:*
version: link:../../packages/eslint-config-supabase
- framer-motion:
- specifier: ^11.18.2
- version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
github-slugger:
specifier: ^2.0.0
version: 2.0.0
@@ -491,6 +491,9 @@ importers:
micromark-extension-mdxjs:
specifier: ^1.0.0
version: 1.0.1
+ motion:
+ specifier: 'catalog:'
+ version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next:
specifier: ^15.5.24
version: 15.5.25(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(@types/node@22.13.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4)
@@ -841,15 +844,15 @@ importers:
common:
specifier: workspace:*
version: link:../../packages/common
- framer-motion:
- specifier: ^11.18.2
- version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
jotai:
specifier: ^2.8.0
version: 2.8.1(@types/react@19.2.14)(react@19.2.6)
lucide-react:
specifier: '*'
version: 0.511.0(react@19.2.6)
+ motion:
+ specifier: 'catalog:'
+ version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next:
specifier: 'catalog:'
version: 16.3.6(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4)
@@ -1212,9 +1215,6 @@ importers:
file-saver:
specifier: ^2.0.5
version: 2.0.5
- framer-motion:
- specifier: ^11.18.2
- version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
fuse.js:
specifier: ^7.4.0
version: 7.4.0
@@ -1269,6 +1269,9 @@ importers:
monaco-editor:
specifier: 0.52.2
version: 0.52.2
+ motion:
+ specifier: 'catalog:'
+ version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next:
specifier: 'catalog:'
version: 16.3.6(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4)
@@ -1600,9 +1603,6 @@ importers:
eslint-config-supabase:
specifier: workspace:*
version: link:../../packages/eslint-config-supabase
- framer-motion:
- specifier: ^11.18.2
- version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
icons:
specifier: workspace:*
version: link:../../packages/icons
@@ -1615,6 +1615,9 @@ importers:
monaco-editor:
specifier: 0.52.2
version: 0.52.2
+ motion:
+ specifier: 'catalog:'
+ version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next:
specifier: 'catalog:'
version: 16.3.6(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4)
@@ -1904,9 +1907,6 @@ importers:
eslint-config-supabase:
specifier: workspace:*
version: link:../../packages/eslint-config-supabase
- framer-motion:
- specifier: ^11.18.2
- version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
globby:
specifier: ^13.2.2
version: 13.2.2
@@ -1952,6 +1952,9 @@ importers:
micromark-extension-mdxjs:
specifier: ^1.0.1
version: 1.0.1
+ motion:
+ specifier: 'catalog:'
+ version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next:
specifier: ^15.5.24
version: 15.5.25(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(@types/node@24.19.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4)
@@ -2748,9 +2751,6 @@ importers:
date-fns:
specifier: ^2.30.0
version: 2.30.0
- framer-motion:
- specifier: ^11.18.2
- version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
input-otp:
specifier: ^1.4.2
version: 1.4.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -2760,6 +2760,9 @@ importers:
lucide-react:
specifier: ^0.436.0
version: 0.436.0(react@19.2.6)
+ motion:
+ specifier: 'catalog:'
+ version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
prop-types:
specifier: ^15.7.2
version: 15.8.1
@@ -2890,9 +2893,6 @@ importers:
dayjs:
specifier: ^1.11.13
version: 1.11.13
- framer-motion:
- specifier: ^11.18.2
- version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
github-slugger:
specifier: ^2.0.0
version: 2.0.0
@@ -2923,6 +2923,9 @@ importers:
monaco-editor:
specifier: 0.52.2
version: 0.52.2
+ motion:
+ specifier: 'catalog:'
+ version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
next:
specifier: 'catalog:'
version: 16.3.6(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@playwright/test@1.59.1)(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4)
@@ -14896,6 +14899,20 @@ packages:
motion-utils@12.9.4:
resolution: {integrity: sha512-BW3I65zeM76CMsfh3kHid9ansEJk9Qvl+K5cu4DVHKGsI52n76OJ4z2CUJUV+Mn3uEP9k1JJA3tClG0ggSrRcg==}
+ motion@11.18.2:
+ resolution: {integrity: sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg==}
+ 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
+
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
@@ -33544,6 +33561,15 @@ snapshots:
motion-utils@12.9.4: {}
+ motion@11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6):
+ dependencies:
+ framer-motion: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@emotion/is-prop-valid': 1.4.0
+ react: 19.2.6
+ react-dom: 19.2.6(react@19.2.6)
+
mri@1.2.0: {}
mrmime@2.0.1: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index f3fd62613ac..e918b6a3279 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -38,6 +38,7 @@ catalog:
lodash: ^4.18.1
lodash-es: ^4.18.1
monaco-editor: 0.52.2
+ motion: ^11.18.2
next: ^16.3.6
next-themes: ^0.4.6
postcss: ^8.5.18