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
+
+
+
+
+
+
+ );
+}
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) => (
-
- ))}
+
+
+
+ {SLIDES.map((slide, idx) => (
+
+ ))}
+
+
-
+ {/* Bottom detail for polaroid vibe */}
+
+
+
+ Live Event Previews
+
+
+
+ ON AIR
+
+
+ {/* Decorative squares from reference */}
+
+
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx
index c8a8634..5eaf0aa 100644
--- a/src/components/Navbar.tsx
+++ b/src/components/Navbar.tsx
@@ -1,4 +1,5 @@
import { Ticket } from "lucide-react";
+import { Link } from "react-router-dom";
export default function Navbar() {
return (
@@ -17,18 +18,18 @@ export default function Navbar() {
{/* Centered Navigation Links */}