diff --git a/apps/landing/public/hero.jpeg b/apps/landing/public/hero.jpeg
new file mode 100644
index 0000000..5e4ccd0
Binary files /dev/null and b/apps/landing/public/hero.jpeg differ
diff --git a/apps/landing/src/app/_components/hero.tsx b/apps/landing/src/app/_components/hero.tsx
new file mode 100644
index 0000000..863418c
--- /dev/null
+++ b/apps/landing/src/app/_components/hero.tsx
@@ -0,0 +1,153 @@
+'use client';
+
+import {
+ Button,
+ CodeIcon,
+ SparklesIcon,
+ UsersIcon,
+} from '@imphnen-frontend-service/shadcn-ui/atoms';
+import { motion } from 'framer-motion';
+import Image from 'next/image';
+import { useEffect, useState } from 'react';
+
+export function Hero() {
+ const [scrollY, setScrollY] = useState(0);
+
+ useEffect(() => {
+ const handleScroll = () => {
+ setScrollY(window.scrollY);
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ return (
+
+ {/* Background Elements */}
+
+
+
+ {/* Animated Gradient Orbs */}
+
+
+
+ {/* Grid Pattern */}
+
+
+
+
+
+
+
+
+ Komunitas Programmer Indonesia
+
+
+
+
+ Programmer Handal,
+
+ Tanpa Ribet
+
+
+
+ Temukan potensi programming Anda bersama komunitas yang
+ mendukung, tutorial interaktif, dan sumber daya berkualitas
+ tinggi.
+
+
+
+
+
+
+
+
+
+
+ {/* Decorative Elements */}
+
+
+
+
+
+
+
+ {/* Main Image */}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/landing/src/app/page.tsx b/apps/landing/src/app/page.tsx
index b52b60a..4bdfedc 100644
--- a/apps/landing/src/app/page.tsx
+++ b/apps/landing/src/app/page.tsx
@@ -1,10 +1,13 @@
import { Header } from './_components/header';
+import { Hero } from './_components/hero';
export default function Page() {
return (
-
+
+
+
);
}
diff --git a/libs/shadcn-ui/src/atoms/icons.tsx b/libs/shadcn-ui/src/atoms/icons.tsx
index f0ec41e..758c44f 100644
--- a/libs/shadcn-ui/src/atoms/icons.tsx
+++ b/libs/shadcn-ui/src/atoms/icons.tsx
@@ -1,3 +1,10 @@
-import { LuMenu as MenuIcon, LuX as XIcon } from 'react-icons/lu';
+import {
+ LuArrowDown as ArrowDownIcon,
+ LuCode as CodeIcon,
+ LuMenu as MenuIcon,
+ LuSparkles as SparklesIcon,
+ LuUsers as UsersIcon,
+ LuX as XIcon,
+} from 'react-icons/lu';
-export { MenuIcon, XIcon };
+export { ArrowDownIcon, CodeIcon, MenuIcon, SparklesIcon, UsersIcon, XIcon };
diff --git a/package-lock.json b/package-lock.json
index 1a8c457..f4e5e33 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
"@tanstack/react-table": "^8.21.2",
"axios": "^1.8.3",
"clsx": "^2.1.1",
+ "framer-motion": "^12.9.2",
"js-cookie": "^3.0.5",
"next": "~15.2.4",
"react": "^19.1.0",
@@ -19070,6 +19071,33 @@
"url": "https://github.com/sponsors/rawify"
}
},
+ "node_modules/framer-motion": {
+ "version": "12.9.2",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.9.2.tgz",
+ "integrity": "sha512-R0O3Jdqbfwywpm45obP+8sTgafmdEcUoShQTAV+rB5pi+Y1Px/FYL5qLLRe5tPtBdN1J4jos7M+xN2VV2oEAbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.9.1",
+ "motion-utils": "^12.8.3",
+ "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/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -24333,6 +24361,21 @@
"pathe": "^2.0.1"
}
},
+ "node_modules/motion-dom": {
+ "version": "12.9.1",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.9.1.tgz",
+ "integrity": "sha512-xqXEwRLDYDTzOgXobSoWtytRtGlf7zdkRfFbrrdP7eojaGQZ5Go4OOKtgnx7uF8sAkfr1ZjMvbCJSCIT2h6fkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.8.3"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.8.3",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.8.3.tgz",
+ "integrity": "sha512-GYVauZEbca8/zOhEiYOY9/uJeedYQld6co/GJFKOy//0c/4lDqk0zB549sBYqqV2iMuX+uHrY1E5zd8A2L+1Lw==",
+ "license": "MIT"
+ },
"node_modules/mrmime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
diff --git a/package.json b/package.json
index a02c205..49a3103 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
"@tanstack/react-table": "^8.21.2",
"axios": "^1.8.3",
"clsx": "^2.1.1",
+ "framer-motion": "^12.9.2",
"js-cookie": "^3.0.5",
"next": "~15.2.4",
"react": "^19.1.0",