├── .gitignore ├── LICENSE ├── README.md ├── app ├── favicon.ico ├── globals.css ├── layout.tsx └── page.tsx ├── components.json ├── components ├── call-to-action.tsx ├── community.tsx ├── features.tsx ├── footer.tsx ├── header.tsx ├── hero.tsx ├── learning-resources.tsx ├── simple-theme-toggle.tsx ├── testimonials.tsx ├── theme-provider.tsx ├── theme-toggle.tsx └── ui │ ├── accordion.tsx │ ├── alert-dialog.tsx │ ├── alert.tsx │ ├── aspect-ratio.tsx │ ├── avatar.tsx │ ├── badge.tsx │ ├── breadcrumb.tsx │ ├── button.tsx │ ├── calendar.tsx │ ├── card.tsx │ ├── carousel.tsx │ ├── chart.tsx │ ├── checkbox.tsx │ ├── collapsible.tsx │ ├── command.tsx │ ├── context-menu.tsx │ ├── counter.tsx │ ├── dialog.tsx │ ├── drawer.tsx │ ├── dropdown-menu.tsx │ ├── form.tsx │ ├── hover-card.tsx │ ├── input-otp.tsx │ ├── input.tsx │ ├── label.tsx │ ├── menubar.tsx │ ├── navigation-menu.tsx │ ├── pagination.tsx │ ├── popover.tsx │ ├── progress.tsx │ ├── radio-group.tsx │ ├── resizable.tsx │ ├── scroll-area.tsx │ ├── select.tsx │ ├── separator.tsx │ ├── sheet.tsx │ ├── sidebar.tsx │ ├── skeleton.tsx │ ├── slider.tsx │ ├── sonner.tsx │ ├── switch.tsx │ ├── table.tsx │ ├── tabs.tsx │ ├── textarea.tsx │ ├── toast.tsx │ ├── toaster.tsx │ ├── toggle-group.tsx │ ├── toggle.tsx │ ├── tooltip.tsx │ ├── use-mobile.tsx │ └── use-toast.ts ├── hooks ├── use-mobile.tsx └── use-toast.ts ├── lib └── utils.ts ├── next.config.mjs ├── package.json ├── pnpm-lock.yaml ├── postcss.config.mjs ├── public ├── hero.jpeg ├── logo.png ├── placeholder-logo.png ├── placeholder-logo.svg ├── placeholder-user.jpg ├── placeholder.jpg └── placeholder.svg ├── styles └── globals.css ├── tailwind.config.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # next.js 7 | /.next/ 8 | /out/ 9 | 10 | # production 11 | /build 12 | 13 | # debug 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | .pnpm-debug.log* 18 | 19 | # env files 20 | .env* 21 | 22 | # vercel 23 | .vercel 24 | 25 | # typescript 26 | *.tsbuildinfo 27 | next-env.d.ts -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 superXdev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # IMPHNEN Landing Page 2 | 3 | Welcome to your IMPHNEN Landing Page project built with Next.js! 4 | 5 | ## Description 6 | 7 | This project is a modern framework based on Next.js, designed to help build high-performance and SEO-friendly web applications. Use this project as a starting point to develop dynamic and responsive web applications. 8 | 9 | ## Key Features 10 | 11 | - Automatic routing 12 | - Server-side rendering (SSR) and static site generation (SSG) 13 | - API Routes for simple backend functionality 14 | - Full support for React Hooks and functional components 15 | 16 | ## Installation 17 | 18 | Make sure you have Node.js (version 12 or higher) installed on your system. 19 | 20 | 1. Clone the repository: 21 | ``` 22 | git clone https://github.com/superXdev/imphnen-landing.git 23 | ``` 24 | 2. Navigate to the project directory: 25 | ``` 26 | cd project-name 27 | ``` 28 | 3. Install dependencies: 29 | ``` 30 | npm install 31 | ``` 32 | 4. Start the development server: 33 | ``` 34 | npm run dev 35 | ``` 36 | 37 | ## Contributions 38 | 39 | Contributions are welcome! Please fork the repository, create a new feature branch, and submit a pull request. 40 | 41 | ## License 42 | 43 | This project is licensed under the MIT License. See the [LICENSE](./LICENSE) file for more details. 44 | 45 | Happy coding! 46 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/superXdev/imphnen-landing/d0f45184b5b5276d8bc49c279f2e81450c30b62d/app/favicon.ico -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | :root { 7 | --background: 0 0% 100%; 8 | --foreground: 222.2 84% 4.9%; 9 | --card: 0 0% 100%; 10 | --card-foreground: 222.2 84% 4.9%; 11 | --popover: 0 0% 100%; 12 | --popover-foreground: 222.2 84% 4.9%; 13 | --primary: 221.2 83.2% 53.3%; 14 | --primary-foreground: 210 40% 98%; 15 | --secondary: 210 40% 96.1%; 16 | --secondary-foreground: 222.2 47.4% 11.2%; 17 | --muted: 210 40% 96.1%; 18 | --muted-foreground: 215.4 16.3% 46.9%; 19 | --accent: 210 40% 96.1%; 20 | --accent-foreground: 222.2 47.4% 11.2%; 21 | --destructive: 0 84.2% 60.2%; 22 | --destructive-foreground: 210 40% 98%; 23 | --border: 214.3 31.8% 91.4%; 24 | --input: 214.3 31.8% 91.4%; 25 | --ring: 221.2 83.2% 53.3%; 26 | --radius: 0.75rem; 27 | } 28 | 29 | .dark { 30 | --background: 222.2 84% 4.9%; 31 | --foreground: 210 40% 98%; 32 | --card: 222.2 84% 4.9%; 33 | --card-foreground: 210 40% 98%; 34 | --popover: 222.2 84% 4.9%; 35 | --popover-foreground: 210 40% 98%; 36 | --primary: 217.2 91.2% 59.8%; 37 | --primary-foreground: 210 40% 98%; 38 | --secondary: 217.2 32.6% 17.5%; 39 | --secondary-foreground: 210 40% 98%; 40 | --muted: 217.2 32.6% 17.5%; 41 | --muted-foreground: 215 20.2% 65.1%; 42 | --accent: 217.2 32.6% 17.5%; 43 | --accent-foreground: 210 40% 98%; 44 | --destructive: 0 62.8% 30.6%; 45 | --destructive-foreground: 210 40% 98%; 46 | --border: 217.2 32.6% 17.5%; 47 | --input: 217.2 32.6% 17.5%; 48 | --ring: 224.3 76.3% 48%; 49 | } 50 | } 51 | 52 | @layer base { 53 | * { 54 | @apply border-border; 55 | } 56 | body { 57 | @apply bg-background text-foreground; 58 | font-feature-settings: "rlig" 1, "calt" 1; 59 | } 60 | } 61 | 62 | @keyframes float { 63 | 0% { 64 | transform: translateY(0px); 65 | } 66 | 50% { 67 | transform: translateY(-10px); 68 | } 69 | 100% { 70 | transform: translateY(0px); 71 | } 72 | } 73 | 74 | .animate-float { 75 | animation: float 3s ease-in-out infinite; 76 | } 77 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type React from "react"; 2 | import type { Metadata } from "next"; 3 | import { Inter } from "next/font/google"; 4 | import "./globals.css"; 5 | import { ThemeProvider } from "@/components/theme-provider"; 6 | 7 | const inter = Inter({ subsets: ["latin"] }); 8 | 9 | export const metadata: Metadata = { 10 | title: "IMPHNEN - Ingin Menjadi Programmer Handal?", 11 | description: "Komunitas belajar programming untuk semua level", 12 | }; 13 | 14 | export default function RootLayout({ 15 | children, 16 | }: Readonly<{ 17 | children: React.ReactNode; 18 | }>) { 19 | return ( 20 | 21 | 22 | 28 | {children} 29 | 30 | 31 | 32 | ); 33 | } 34 | 35 | import "./globals.css"; 36 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import Header from "@/components/header" 2 | import Hero from "@/components/hero" 3 | import Features from "@/components/features" 4 | import Community from "@/components/community" 5 | import LearningResources from "@/components/learning-resources" 6 | import Testimonials from "@/components/testimonials" 7 | import CallToAction from "@/components/call-to-action" 8 | import Footer from "@/components/footer" 9 | 10 | export default function Home() { 11 | return ( 12 |
13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |
24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } -------------------------------------------------------------------------------- /components/call-to-action.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useRef } from "react"; 4 | import { useInView } from "framer-motion"; 5 | import { Button } from "@/components/ui/button"; 6 | import { motion } from "framer-motion"; 7 | 8 | export default function CallToAction() { 9 | const ref = useRef(null); 10 | const isInView = useInView(ref, { once: true, amount: 0.2 }); 11 | 12 | return ( 13 |
14 | {/* Background Elements */} 15 |
16 |
17 |
18 |
19 | 20 |
21 | 27 |
28 |
29 | 30 |
31 |

32 | Siap Menjadi{" "} 33 | 34 | Programmer Handal? 35 | 36 |

37 |

38 | Bergabunglah dengan komunitas IMPHNEN sekarang dan mulai 39 | perjalanan programming mu dengan cara yang menyenangkan! 40 |

41 | 42 |
43 | 49 | 56 |
57 |
58 | 59 | {/* Decorative Elements */} 60 |
61 |
62 |
63 | 64 |
65 |
66 | ); 67 | } 68 | -------------------------------------------------------------------------------- /components/community.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useRef } from "react" 4 | import { useInView } from "framer-motion" 5 | import { Button } from "@/components/ui/button" 6 | import Counter from "@/components/ui/counter" 7 | import { Facebook, MessageCircle } from "lucide-react" 8 | import Image from "next/image" 9 | import { motion } from "framer-motion" 10 | 11 | export default function Community() { 12 | const ref = useRef(null) 13 | const isInView = useInView(ref, { once: true, amount: 0.2 }) 14 | 15 | const communities = [ 16 | { 17 | icon: , 18 | iconBg: "bg-blue-100 dark:bg-blue-900", 19 | title: "Facebook Group", 20 | description: "Bergabunglah dengan grup Facebook kami untuk diskusi santai dan berbagi artikel menarik.", 21 | buttonText: "Gabung Sekarang", 22 | buttonLink: "#", 23 | }, 24 | { 25 | icon: Instagram, 26 | iconBg: "bg-blue-100 dark:bg-blue-900", 27 | title: "Instagram", 28 | description: "Ikuti kami di Instagram untuk tips programming, konten inspiratif, dan info event terbaru.", 29 | buttonText: "Follow Kami", 30 | buttonLink: "#", 31 | }, 32 | { 33 | icon: , 34 | iconBg: "bg-blue-100 dark:bg-blue-900", 35 | title: "Discord Server", 36 | description: "Diskusikan langsung dengan sesama programmer dan dapatkan bantuan langsung dari para ahli.", 37 | buttonText: "Join Server", 38 | buttonLink: "#", 39 | }, 40 | ] 41 | 42 | const containerVariants = { 43 | hidden: { opacity: 0 }, 44 | visible: { 45 | opacity: 1, 46 | transition: { 47 | staggerChildren: 0.1, 48 | }, 49 | }, 50 | } 51 | 52 | const itemVariants = { 53 | hidden: { y: 20, opacity: 0 }, 54 | visible: { 55 | y: 0, 56 | opacity: 1, 57 | transition: { duration: 0.5 }, 58 | }, 59 | } 60 | 61 | return ( 62 |
63 | {/* Background Elements */} 64 |
65 |
66 |
67 |
68 | 69 |
70 |
71 | 77 |

78 | Komunitas{" "} 79 | Kami 80 |

81 |

82 | Bergabunglah dengan ribuan programmer Indonesia yang saling membantu dan berbagi pengalaman. 83 |

84 |
85 |
86 | 87 | 93 | {communities.map((community, index) => ( 94 | 99 |
100 | 101 |
102 |
105 | {community.icon} 106 |
107 |

{community.title}

108 |

{community.description}

109 | 115 |
116 | 117 |
118 | 119 | ))} 120 | 121 | 122 | {/* Community Stats */} 123 | 129 |
130 |
131 | {isInView && } 132 |
133 |
Member Aktif
134 |
135 |
136 |
137 | {isInView && } 138 |
139 |
Event Bulanan
140 |
141 |
142 |
143 | {isInView && } 144 |
145 |
Mentor Profesional
146 |
147 |
148 |
149 | {isInView && } 150 |
151 |
Diskusi Mingguan
152 |
153 |
154 |
155 |
156 | ) 157 | } 158 | -------------------------------------------------------------------------------- /components/features.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useRef } from "react" 4 | import { useInView } from "framer-motion" 5 | import { BookOpen, Code, Laptop, Users } from "lucide-react" 6 | import { motion } from "framer-motion" 7 | 8 | export default function Features() { 9 | const ref = useRef(null) 10 | const isInView = useInView(ref, { once: true, amount: 0.2 }) 11 | 12 | const features = [ 13 | { 14 | icon: , 15 | title: "Belajar Tanpa Koding", 16 | description: "Pelajari konsep programming dengan cara yang mudah dipahami tanpa harus menulis kode yang rumit.", 17 | }, 18 | { 19 | icon: , 20 | title: "Komunitas Supportif", 21 | description: "Bergabunglah dengan komunitas programmer Indonesia yang siap membantu dan berbagi pengalaman.", 22 | }, 23 | { 24 | icon: , 25 | title: "Tutorial Interaktif", 26 | description: "Akses tutorial interaktif yang membuat konsep programming lebih mudah untuk dipahami.", 27 | }, 28 | { 29 | icon: , 30 | title: "Proyek Praktis", 31 | description: "Terapkan pengetahuan Anda dalam proyek nyata dengan panduan langkah demi langkah.", 32 | }, 33 | ] 34 | 35 | const containerVariants = { 36 | hidden: { opacity: 0 }, 37 | visible: { 38 | opacity: 1, 39 | transition: { 40 | staggerChildren: 0.1, 41 | }, 42 | }, 43 | } 44 | 45 | const itemVariants = { 46 | hidden: { y: 20, opacity: 0 }, 47 | visible: { 48 | y: 0, 49 | opacity: 1, 50 | transition: { duration: 0.5 }, 51 | }, 52 | } 53 | 54 | return ( 55 |
56 | {/* Background Elements */} 57 |
58 |
59 |
60 |
61 | 62 |
63 |
64 | 70 |
71 | Fitur Unggulan 72 |
73 |

74 | Belajar programming dengan{" "} 75 | 76 | cara yang lebih baik 77 | 78 |

79 |

80 | IMPHNEN hadir dengan berbagai fitur untuk membantu kamu menjadi programmer handal tanpa harus pusing 81 | dengan coding. 82 |

83 |
84 |
85 | 86 | 92 | {features.map((feature, index) => ( 93 | 98 |
99 | 100 |
101 |
102 | {feature.icon} 103 |
104 |

{feature.title}

105 |

{feature.description}

106 |
107 | 108 |
109 | 110 | ))} 111 | 112 |
113 |
114 | ) 115 | } 116 | -------------------------------------------------------------------------------- /components/header.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useState, useEffect } from "react"; 4 | import { Button } from "@/components/ui/button"; 5 | import { SimpleThemeToggle } from "@/components/simple-theme-toggle"; 6 | import { Menu, X } from "lucide-react"; 7 | import Image from "next/image"; 8 | import Link from "next/link"; 9 | import { cn } from "@/lib/utils"; 10 | 11 | export default function Header() { 12 | const [isScrolled, setIsScrolled] = useState(false); 13 | const [mobileMenuOpen, setMobileMenuOpen] = useState(false); 14 | 15 | useEffect(() => { 16 | const handleScroll = () => { 17 | setIsScrolled(window.scrollY > 10); 18 | }; 19 | window.addEventListener("scroll", handleScroll); 20 | return () => window.removeEventListener("scroll", handleScroll); 21 | }, []); 22 | 23 | return ( 24 |
32 |
33 |
34 |
35 | IMPHNEN Logo 42 |
43 |
44 | 45 | {/* Desktop Navigation */} 46 | 84 | 85 |
86 | 87 | 90 | 91 | {/* Mobile Menu Button */} 92 | 104 |
105 |
106 | 107 | {/* Mobile Menu */} 108 | {mobileMenuOpen && ( 109 |
110 | 143 |
144 | )} 145 |
146 | ); 147 | } 148 | -------------------------------------------------------------------------------- /components/hero.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useEffect, useState, useRef } from "react"; 4 | import Image from "next/image"; 5 | import { Button } from "@/components/ui/button"; 6 | import Counter from "@/components/ui/counter" 7 | import { Clock, Code, School, Sparkles, Users } from "lucide-react"; 8 | import { motion , useInView} from "framer-motion"; 9 | 10 | export default function Hero() { 11 | const [scrollY, setScrollY] = useState(0); 12 | const ref = useRef(null); 13 | 14 | const isInView = useInView(ref, { once: true }); 15 | 16 | useEffect(() => { 17 | const handleScroll = () => { 18 | setScrollY(window.scrollY); 19 | }; 20 | 21 | 22 | window.addEventListener("scroll", handleScroll); 23 | return () => window.removeEventListener("scroll", handleScroll); 24 | }, []); 25 | 26 | return ( 27 |
28 | {/* Background Elements */} 29 |
30 |
31 | 32 | {/* Animated Gradient Orbs */} 33 |
42 |
51 | 52 | {/* Grid Pattern */} 53 |
54 |
55 | 56 |
57 |
58 | 64 |
65 | 66 | Komunitas Programmer Indonesia 67 |
68 | 69 |
70 |

71 | Programmer Handal,
72 | 73 | Tanpa Ribet 74 | 75 |

76 |

77 | Temukan potensi programming Anda bersama komunitas yang 78 | mendukung, tutorial interaktif, dan sumber daya 79 | berkualitas tinggi. 80 |

81 |
82 | 83 |
84 | 85 | 91 | 92 | 100 |
101 | 102 |
103 |
104 |
105 | {isInView && } 106 |
107 |
108 | 109 | Member 110 |
111 |
112 |
113 |
114 |
115 | {isInView && } 116 |
117 |
118 | 119 | Tutorial 120 |
121 |
122 |
123 |
124 |
125 | 24/7 126 |
127 |
128 | 129 | Yapping 130 |
131 |
132 |
133 |
134 | 135 | 141 |
142 | {/* Decorative Elements */} 143 |
144 | 145 |
146 |
147 | 148 |
149 | 150 | {/* Main Image */} 151 |
152 |
153 | IMPHNEN Programming Community 160 |
161 |
162 | 163 |
164 |
165 |
166 | ); 167 | } 168 | -------------------------------------------------------------------------------- /components/learning-resources.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useRef } from "react" 4 | import { useInView } from "framer-motion" 5 | import { Button } from "@/components/ui/button" 6 | import { BookOpen, Code, Share2, Video } from "lucide-react" 7 | import { motion } from "framer-motion" 8 | 9 | export default function LearningResources() { 10 | const ref = useRef(null) 11 | const isInView = useInView(ref, { once: true, amount: 0.2 }) 12 | 13 | const resources = [ 14 | { 15 | icon: