From a3ae3bfcfe974f118f24ae5507975b0f0a61d5f3 Mon Sep 17 00:00:00 2001 From: Kevin Satria D <130447401+kevinnsd1@users.noreply.github.com> Date: Wed, 20 May 2026 13:53:45 +0700 Subject: [PATCH] feat: implement project scaffolding with brutalist UI components and homepage routing --- package-lock.json | 60 +++++++++- package.json | 3 +- src/App.tsx | 39 +++++-- src/components/EventSection.tsx | 11 +- src/components/FeaturedEvents.tsx | 59 ++++++++++ src/components/Hero.tsx | 105 +++++++++++------ src/components/Navbar.tsx | 17 +-- src/index.css | 1 + src/pages/AllEvents.tsx | 182 ++++++++++++++++++++++++++++++ src/pages/Home.tsx | 13 +++ 10 files changed, 430 insertions(+), 60 deletions(-) create mode 100644 src/components/FeaturedEvents.tsx create mode 100644 src/pages/AllEvents.tsx create mode 100644 src/pages/Home.tsx diff --git a/package-lock.json b/package-lock.json index 6dbf237..31b00ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "lucide-react": "^0.475.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "react-router-dom": "^7.15.1" }, "devDependencies": { "@eslint/js": "^9.19.0", @@ -2259,6 +2260,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3454,6 +3468,44 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.1.tgz", + "integrity": "sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.15.1.tgz", + "integrity": "sha512-AzF62gjY6U9rkMq4RfP/r2EVtQ7DMfNMjyOp/flLTCrtRylLiK4wT4pSq6O8rOXZ2eXdZYJPEYe+ifomiv+Igg==", + "license": "MIT", + "dependencies": { + "react-router": "7.15.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3532,6 +3584,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index ffffbf8..0425926 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "dependencies": { "lucide-react": "^0.475.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "react-router-dom": "^7.15.1" }, "devDependencies": { "@eslint/js": "^9.19.0", diff --git a/src/App.tsx b/src/App.tsx index b093b29..2fce6f7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,20 +1,37 @@ +import { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom'; +import { useEffect } from 'react'; import Navbar from './components/Navbar'; -import Hero from './components/Hero'; -import EventSection from './components/EventSection'; import Footer from './components/Footer'; +import Home from './pages/Home'; +import AllEvents from './pages/AllEvents'; + +function ScrollToTop() { + const { pathname } = useLocation(); + + useEffect(() => { + window.scrollTo(0, 0); + }, [pathname]); + + return null; +} function App() { return ( -
- - -
- - -
+ + +
+ + +
+ + } /> + } /> + +
-
-
+
+ ); } diff --git a/src/components/EventSection.tsx b/src/components/EventSection.tsx index 76d3420..8b8defd 100644 --- a/src/components/EventSection.tsx +++ b/src/components/EventSection.tsx @@ -1,5 +1,6 @@ import EventCard from './EventCard'; import { ArrowRight } from 'lucide-react'; +import { Link } from 'react-router-dom'; const MOCK_EVENTS = [ { @@ -50,7 +51,7 @@ const MOCK_EVENTS = [ export default function EventSection() { return ( -
+
{/* Brutalist Section Header */} @@ -67,10 +68,10 @@ export default function EventSection() {

- + {/* Events Grid */} @@ -82,10 +83,10 @@ export default function EventSection() { {/* Mobile View All Button */}
- +
diff --git a/src/components/FeaturedEvents.tsx b/src/components/FeaturedEvents.tsx new file mode 100644 index 0000000..62760b2 --- /dev/null +++ b/src/components/FeaturedEvents.tsx @@ -0,0 +1,59 @@ +export default function FeaturedEvents() { + const FEATURED_BANNERS = [ + { + id: 1, + title: "AMBYAR FEST SUKABUMI", + image: "https://images.unsplash.com/photo-1540039155732-6761b54f6cce?q=80&w=1200&auto=format&fit=crop", + link: "#", + color: "bg-brutal-pink" + }, + { + id: 2, + title: "BREWDANZA CULTURE", + image: "https://images.unsplash.com/photo-1505373877841-8d25f7d46678?q=80&w=1200&auto=format&fit=crop", + link: "#", + color: "bg-brutal-blue" + } + ]; + + return ( +
+
+
+

+ OUR FEATURED EVENTS +

+
+ +
+ {FEATURED_BANNERS.map((banner) => ( + + {/* Brutalist Shadow Box */} +
+ + {/* Image Container */} +
+ {banner.title} + + {/* Text Overlay */} +
+

+ {banner.title} +

+
+
+
+ ))} +
+
+
+ ); +} diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index f4aef07..3a2b739 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -1,4 +1,6 @@ import { useState, useEffect } from "react"; +import { Link } from "react-router-dom"; +import { Search } from "lucide-react"; const SLIDES = [ { @@ -27,47 +29,82 @@ export default function Hero() { }, []); return ( -
- {/* Absolute light blue background block on the left */} -
- +
-
+
{/* Left Content */} -
-

- ACCESS - - THE GRID +
+ {/* Small Label */} +
+
+ + TICKETING MADE SIMPLE -

-

- Next-generation ticketing for the brutalist era. No hidden fees. - No scalpers. Just raw access. -

+
- +

+ Pesan Tiket Event Jadi Lebih Mudah +

+ +
+

+ Platform ticketing modern untuk konser, seminar, festival, dan + berbagai event lainnya dengan gaya neo-brutalism yang unik. +

+
+
+
+ + +
+ +
- {/* Right Content - Wide Video Container */} -
-
- {/* Render ALL iframes at once to keep them playing, just toggle opacity */} - {SLIDES.map((slide, idx) => ( -