2023-09-03 08:45:12 +07:00
"use client" ;
2023-09-03 13:23:39 +07:00
import { useEffect } from "react" ;
2023-09-03 08:45:12 +07:00
import Link from "next/link" ;
import { motion } from "framer-motion" ;
import Button from "@/components/Button" ;
2023-09-03 14:45:00 +07:00
import Image from "next/legacy/image" ;
2023-09-03 08:45:12 +07:00
// images
2024-08-30 18:41:17 +07:00
import ReactChat1 from "@/public/projects/trivia/trivia1.png" ;
import ReactChat2 from "@/public/projects/trivia/trivia2.png" ;
import ReactChat3 from "@/public/projects/trivia/trivia3.png" ;
2024-08-31 19:41:14 +07:00
import ProjectAll from "@/public/img/projects.png" ;
2023-09-05 20:06:59 +07:00
// main project image
2024-08-30 18:41:17 +07:00
import Trivia from "@/public/projects/main-project/trivia.png" ;
2024-08-31 19:05:33 +07:00
import SakuSenyum from "@/public/projects/main-project/saku-senyum.png" ;
2023-12-16 11:29:56 +07:00
import LUDOang from "@/public/projects/main-project/ludo.png" ;
2023-09-05 20:06:59 +07:00
import ReactChatMain from "@/public/projects/main-project/react-chat.png" ;
import ReactTools from "@/public/projects/main-project/react-tools.png" ;
import AlephBot from "@/public/projects/main-project/aleph-bot.png" ;
import LPTK from "@/public/projects/lptk/lptk1.png" ;
import NUINO from "@/public/projects/ino/ino1.png" ;
2024-08-31 19:05:33 +07:00
2023-09-03 20:26:08 +07:00
import Hr from "@/components/Hr" ;
2023-09-06 12:29:16 +07:00
import FixedButon from "@/components/FixedButton" ;
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" ;
import { faChevronLeft } from "@fortawesome/free-solid-svg-icons" ;
2023-09-03 11:21:56 +07:00
2023-09-04 13:04:24 +07:00
const projects = [
2024-08-30 18:41:17 +07:00
{
title : "Generative Trivia" ,
desc : "Generative Trivia is a web application that I created using Gemini AI API to generate trivia questions and answers." ,
year : "2024" ,
2024-08-31 19:05:33 +07:00
tech : "NextJS, Typescript, Gemini AI API, Tailwind CSS, Shadcn UI, Firebase" ,
2024-08-30 18:41:17 +07:00
bg : Trivia ,
slug : "trivia" ,
} ,
2024-08-31 19:05:33 +07:00
{
title : "Saku Senyum" ,
desc : "A website for UMKM sales management. This project is a client project that I created as a Fullstack Developer." ,
year : "2024" ,
tech : "NextJS, Typescript, Tailwind CSS, Shadcn UI, Prisma, MySQL" ,
bg : SakuSenyum ,
slug : "saku-senyum" ,
} ,
2023-12-16 11:29:56 +07:00
{
title : "LUDOang" ,
desc : "LUDOang is a game created using python and pygame. This game is inspired by LUDO game." ,
year : "2023" ,
tech : "Python, Pygame, OpenGL" ,
bg : LUDOang ,
slug : "ludoang" ,
} ,
2023-09-04 13:04:24 +07:00
{
title : "React Chat WebApp" ,
2023-09-04 22:10:11 +07:00
desc : "My second React project. This project is a realtime chat webapp that I created using ReactJS, Firebase, and TailwindCSS." ,
2023-09-04 13:04:24 +07:00
year : "2023" ,
tech : "Javascript, React Js, Firebase, Daisy UI" ,
2023-09-05 20:06:59 +07:00
bg : ReactChatMain ,
2023-09-04 13:04:24 +07:00
slug : "react-chat" ,
} ,
{
title : "React Tools" ,
desc : "My first React project. contain three main tools: Todo List, Note, and Expense Tracker that usefull for daily activity" ,
year : "2023" ,
tech : "Javascript, React Js, TailwindCSS" ,
2023-09-05 20:06:59 +07:00
bg : ReactTools ,
2023-09-04 13:04:24 +07:00
slug : "react-tools" ,
} ,
{
title : "Aleph Discord Bot" ,
desc : "Discord bot that can search images on google and send the result to discord channel, with this bot you can search images on google without leaving discord." ,
year : "2023" ,
tech : "Python, Serp API, Discord.py" ,
2023-09-05 20:06:59 +07:00
bg : AlephBot ,
2023-09-04 13:04:24 +07:00
slug : "aleph-discord-bot" ,
} ,
{
title : "LPTK Cup 2023 Website" ,
desc : "LPTK Cup 2023 is a website for a competition that held by Universitas Negeri Malang. This is my second freelance project using Laravel." ,
year : "2023" ,
tech : "PHP, Laravel, Bootstrap, JQuery, MySQL" ,
2023-09-05 20:06:59 +07:00
bg : LPTK ,
2023-09-04 13:04:24 +07:00
slug : "lptk-cup-2023" ,
} ,
{
title : "NU INO Website" ,
desc : "My first freelance project. This project is a website for a School based on a JALAKAR curriculum. The website is built mainly using Laravel and Bootstrap." ,
year : "2023" ,
tech : "PHP, Laravel, Livewire, Bootstrap, JQuery, MySQL" ,
2023-09-05 20:06:59 +07:00
bg : NUINO ,
2023-09-04 13:04:24 +07:00
slug : "nu-ino-website" ,
} ,
] ;
2023-09-03 11:21:56 +07:00
2023-09-03 08:45:12 +07:00
export default function Page ( ) {
2023-09-03 13:23:39 +07:00
useEffect ( ( ) => {
window . scrollTo ( 0 , 0 ) ;
} , [ ] ) ;
2023-09-06 12:29:16 +07:00
const handleBack = ( ) => {
2023-09-06 16:39:25 +07:00
window . location . href = "/" ;
2023-09-06 12:29:16 +07:00
} ;
2023-09-03 08:45:12 +07:00
return (
< >
< main className = "overflow-hidden" >
2023-09-06 12:29:16 +07:00
< FixedButon onClick = { handleBack } >
< FontAwesomeIcon
icon = { faChevronLeft }
className = "text-black pr-10"
/ >
< / FixedButon >
2023-09-08 08:55:53 +07:00
< div className = "relative h-screen w-screen gap-4 p-10 flex justify-center items-center flex-col mb-10 overflow-hidden" >
2023-09-03 08:45:12 +07:00
< div className = "z-0 mb-48 md:mb-0 md:absolute top-1/4 md:right-[10%] md:-translate-y-16 " >
< motion.div
2023-09-03 13:23:39 +07:00
initial = { { scale : 1 } }
animate = { { scale : 1.6 } }
transition = { { duration : 1 , ease : "circOut" } }
2024-04-19 20:53:30 +07:00
className = "bg-slate-300 rounded-sm h-[400px] md:h-[600px] w-[80vw] md:w-[30vw] grayscale hover:grayscale-0 " >
2023-09-03 20:26:08 +07:00
< Image
src = { ProjectAll }
alt = "Alvalens"
layout = "fill"
objectFit = "cover"
placeholder = "blur"
/ >
< / motion.div >
2023-09-03 08:45:12 +07:00
< / div >
2023-09-03 20:26:08 +07:00
< div className = "z-10 w-full absolute md:w-auto md:left-[10%] top-[60%] md:top-1/3 col-span-2 flex flex-col justify-center items-start md:items-start text-start px-10 pt-4 backdrop-filter backdrop-blur-sm md:backdrop-blur-none md:backdrop-filter-none bg-gray-100 bg-opacity-50 md:bg-transparent md:pt-0" >
2023-09-08 08:47:28 +07:00
< h1 className = "md:bg-white bg-transparent lg:bg-transparent bg-opacity-50 md-px-0 text-black text-5xl md:text-8xl font-bold" >
2023-09-03 08:45:12 +07:00
My Projects
< / h1 >
2023-09-03 20:26:08 +07:00
< Hr / >
2023-09-04 22:10:11 +07:00
< p className = "title text-xl mt-4 tracking-wider text-gray-900 leading-[1.7rem] mb-5" >
2023-12-16 11:29:56 +07:00
List of my projects that I have done and { " " }
< span className = "bg-transparent md:bg-gray-100 bg-opacity-50 xl:bg-transparent" >
{ " " }
currently working on .
< / span >
2023-09-03 08:45:12 +07:00
< / p >
< motion.div
initial = { { opacity : 0 , y : 100 } }
animate = { { opacity : 1 , y : 0 } }
2023-09-03 13:23:39 +07:00
transition = { { duration : 0.5 , ease : "circOut" } }
2023-09-03 08:45:12 +07:00
onClick = { ( ) => {
window . scrollTo ( {
top : 1000 ,
behavior : "smooth" ,
} ) ;
} }
2023-09-08 08:55:53 +07:00
className = "mb-3" >
2023-09-03 08:45:12 +07:00
< Button variation = "primary" > Scroll Down < / Button >
< / motion.div >
< / div >
< / div >
< div className = "mt-10 flex flex-col justify-start items-center w-full pl-10 md:pl-32" >
< div className = "flex justify-center items-center flex-col my-5 self-start " >
< div className = "bg-gray-700 w-28 h-1 rounded-full mb-3 self-start" > < / div >
< div className = "bg-gray-700 w-28 h-1 rounded-full translate-x-12" > < / div >
< h1 className = "text-3xl font-bold mt-3" > Hightlight < / h1 >
< / div >
< / div >
< div className = "relative w-screen mx-auto container gap-4 px-10 grid grid-cols-1 md:grid-cols-2 mb-10" >
< div className = "flex justify-center items-start flex-col mb-5 " >
< div className = "images relative w-full aspect-square" >
2024-08-30 18:41:17 +07:00
< div className = "absolute top-28 left-10 h-[40%] aspect-video grayscale hover:grayscale-0 transition-all ease duration-300 hover:scale-150 z-10" >
2023-09-03 08:45:12 +07:00
< motion.div
initial = { { opacity : 0 , scale : 0.5 , x : 100 } }
whileInView = { {
opacity : 1 ,
scale : 1 ,
x : 0 ,
} }
2023-09-03 20:26:08 +07:00
className = "w-full h-full shadow-lg" >
2023-09-03 08:45:12 +07:00
< Image
2023-09-03 20:26:08 +07:00
src = { ReactChat1 }
2023-09-03 08:45:12 +07:00
alt = "Alvalens"
layout = "fill"
objectFit = "cover"
placeholder = "blur"
2024-08-30 18:41:17 +07:00
className = "rat"
2023-09-03 08:45:12 +07:00
/ >
< / motion.div >
< / div >
2024-08-30 18:41:17 +07:00
< div className = "absolute top-16 right-28 h-[30%] aspect-video grayscale hover:grayscale-0 transition-all ease duration-300 hover:scale-150" >
2023-09-03 08:45:12 +07:00
< motion.div
initial = { {
opacity : 0 ,
scale : 0.5 ,
x : - 100 ,
} }
whileInView = { {
opacity : 1 ,
scale : 1 ,
x : 0 ,
} }
2023-09-03 20:26:08 +07:00
transition = { { delay : 0.3 } }
className = "w-full h-full shadow-lg " >
2023-09-03 08:45:12 +07:00
< Image
2023-09-03 20:26:08 +07:00
src = { ReactChat3 }
2023-09-03 08:45:12 +07:00
alt = "Alvalens"
layout = "fill"
objectFit = "cover"
placeholder = "blur"
2023-09-03 20:26:08 +07:00
objectPosition = "0% 0%"
2023-09-03 08:45:12 +07:00
/ >
< / motion.div >
< / div >
2024-08-30 18:41:17 +07:00
< div className = "absolute bottom-16 right-20 h-[35%] aspect-video grayscale hover:grayscale-0 transition-all ease duration-300 hover:scale-150" >
2023-09-03 08:45:12 +07:00
< motion.div
initial = { {
opacity : 0 ,
scale : 0.5 ,
x : - 100 ,
} }
whileInView = { {
opacity : 1 ,
scale : 1 ,
x : 0 ,
} }
transition = { {
delay : 0.5 ,
} }
2023-09-03 20:26:08 +07:00
className = "w-full h-full shadow-lg" >
2023-09-03 08:45:12 +07:00
< Image
2023-09-03 20:26:08 +07:00
src = { ReactChat2 }
2023-09-03 08:45:12 +07:00
alt = "Alvalens"
layout = "fill"
objectFit = "cover"
placeholder = "blur"
/ >
< / motion.div >
< / div >
< / div >
< / div >
< motion.div
className = "flex justify-center items-start flex-col mb-5 md:px-10"
initial = { {
opacity : 0 ,
x : 200 ,
} }
whileInView = { {
opacity : 1 ,
x : 0 ,
} }
transition = { {
delay : 0.5 ,
2023-09-03 13:23:39 +07:00
2023-09-03 08:45:12 +07:00
type : "spring" ,
} } >
< h2 className = "text-2xl font-bold tracking-wider mb-3" >
2024-08-30 18:41:17 +07:00
Generative Trivia
2023-09-03 08:45:12 +07:00
< / h2 >
< p className = "text-gray-600 text-justify title text-lg" >
2024-08-30 18:41:17 +07:00
A generative trivia website built with Next . js ,
Firebase , NextAuth , Google OAuth , and TypeScript .
Users can generate trivia questions for predefined
school subjects and answer them with a unique
interactive input style . The application supports
user authentication with Google and stores data in
Firestore . You can see the source code of this
project on my github account or preview the project
by clicking the button below .
2023-09-03 20:26:08 +07:00
< / p > { " " }
< div className = "mt-3" >
< Button variation = "primary" >
2024-08-30 18:41:17 +07:00
< Link href = "projects/trivia" > More < / Link >
2023-09-03 20:26:08 +07:00
< / Button >
< Button variation = "secondary" >
2023-09-04 13:04:24 +07:00
< a
2024-08-30 18:41:17 +07:00
href = "https://generative-trivia.vercel.app/"
2023-09-04 13:04:24 +07:00
target = "_blank"
rel = "noopener noreferrer" >
Preview
< / a >
2023-09-03 20:26:08 +07:00
< / Button >
< / div >
2023-09-03 08:45:12 +07:00
< / motion.div >
< / div >
< div className = "mt-16 flex flex-col justify-start items-center w-full pl-10 md:pl-32" >
2023-09-08 08:55:53 +07:00
< div className = "flex justify-start items-start flex-col my-5 self-start " >
< Hr / >
2023-09-03 08:45:12 +07:00
< motion.h1
className = "text-3xl font-bold mt-3"
initial = { {
opacity : 0 ,
x : - 200 ,
} }
whileInView = { {
opacity : 1 ,
x : 0 ,
} }
transition = { {
delay : 0.7 ,
type : "spring" ,
} } >
Other Note Worthy Projects
< / motion.h1 >
< / div >
< / div >
< div className = "w-screen mx-auto container gap-4 px-10 grid grid-cols-1 md:grid-cols-2 mb-10 cursor-pointer" >
2023-09-04 13:04:24 +07:00
{ /* loop projeects data */ }
{ projects . map ( ( project , index ) => (
< Link href = { "projects/" + project . slug } key = { index } >
< motion.div
2023-09-04 22:10:11 +07:00
className = "z-10 relative flex justify-center items-start flex-col mb-5 md:px-10 w-full h-auto bg-gray-400 group/tes py-20 px-5 md:py-2 aspect-video "
2023-09-04 13:04:24 +07:00
initial = { {
opacity : 0 ,
x : - 200 ,
} }
whileInView = { {
opacity : 1 ,
x : 0 ,
} }
transition = { {
type : "spring" ,
} } >
2023-09-04 22:10:11 +07:00
{ " " }
{ /* Add relative here */ }
< Image
src = { project . bg . src }
alt = "Alvalens"
layout = "fill"
objectFit = "cover"
2023-09-05 20:06:59 +07:00
placeholder = "blur"
2023-09-04 22:10:11 +07:00
className = "bg-slate-950 opacity-10 group-hover/tes:opacity-100 transition-all ease duration-500"
2023-09-05 20:06:59 +07:00
blurDataURL = { project . bg . blurDataURL }
2023-09-04 22:10:11 +07:00
/ >
2023-09-04 13:04:24 +07:00
< div className = "absolute top-0 left-0 bg-gray-600 px-4 py-2" >
< h4 className = "text-white" >
{ project . year }
< / h4 >
< / div >
2023-09-04 22:10:11 +07:00
< div className = "transition-all ease duration-500 opacity-100 content text-center group-hover/tes:opacity-0 z-10" >
2023-09-04 13:04:24 +07:00
< h1 className = "text-3xl font-bold mb-3" >
{ project . title }
< / h1 >
< p > { project . desc } < / p >
< div className = "flex justify-center items-center flex-row mt-5 flex-wrap" >
{ project . tech
. split ( "," )
. map ( ( t , index ) => (
< span
key = { index }
className = "m-1 px-4 py-2 bg-gray-600 text-white " >
{ t }
< / span >
) ) }
< / div >
< / div >
< / motion.div >
< / Link >
) ) }
2023-09-03 08:45:12 +07:00
< / div >
{ /* view in archive btn */ }
< div className = "flex justify-center items-center flex-col my-5 self-start " >
2023-09-03 13:23:39 +07:00
< Button variation = "primary" >
< Link href = "projects/archive" > View In Archive < / Link >
< / Button >
2023-09-03 08:45:12 +07:00
< / div >
< / main >
< / >
) ;
}