diff --git a/package-lock.json b/package-lock.json
index e688a22..38c68e3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
"clsx": "^2.1.1",
"geist": "^1.4.2",
"lucide-react": "^0.513.0",
+ "motion": "^12.23.16",
"next": "15.3.3",
"next-sitemap": "^4.2.3",
"next-themes": "^0.4.6",
@@ -3713,6 +3714,32 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/framer-motion": {
+ "version": "12.23.16",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.16.tgz",
+ "integrity": "sha512-N81A8hiHqVsexOzI3wzkibyLURW1nEJsZaRuctPhG4AdbbciYu+bKJq9I2lQFzAO4Bx3h4swI6pBbF/Hu7f7BA==",
+ "dependencies": {
+ "motion-dom": "^12.23.12",
+ "motion-utils": "^12.23.6",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -4995,6 +5022,44 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/motion": {
+ "version": "12.23.16",
+ "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.16.tgz",
+ "integrity": "sha512-8vVuxZgcfGZm4kgSqFgGrhQ+6034y4UuEsqCX8s7UYeoQ+NO3R9LV5AyDlVr2Mb7xvS7ZM5s/XkTurWbWQ+UHA==",
+ "dependencies": {
+ "framer-motion": "^12.23.16",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.23.12",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz",
+ "integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==",
+ "dependencies": {
+ "motion-utils": "^12.23.6"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.23.6",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
+ "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
diff --git a/package.json b/package.json
index 7bbe2e0..8527266 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"clsx": "^2.1.1",
"geist": "^1.4.2",
"lucide-react": "^0.513.0",
+ "motion": "^12.23.16",
"next": "15.3.3",
"next-sitemap": "^4.2.3",
"next-themes": "^0.4.6",
diff --git a/src/components/home/hero.tsx b/src/components/home/hero.tsx
index 82fb23a..ac09009 100644
--- a/src/components/home/hero.tsx
+++ b/src/components/home/hero.tsx
@@ -4,6 +4,9 @@ import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { ArrowRight, Github, Copy, Eye, Code2, Zap } from "lucide-react";
import { APP_CONFIG } from "@/lib/constants";
+import { WritingText } from "../ui/texts/writing";
+import { HighlightText } from "../ui/texts/highlight";
+import { GradientText } from "../ui/texts/gradient";
interface HeroProps {
activePattern?: string | null;
@@ -59,18 +62,11 @@ export default function Hero({ theme }: HeroProps) {
className={`font-medium transition-colors duration-300 ${isPatternDark ? "text-white" : "text-gray-900 dark:text-gray-50"
}`}
>
- Craft Beautiful
+