diff --git a/apps/web/app/events/create/page.tsx b/apps/web/app/events/create/page.tsx
index 653c53b9..d2ca1997 100644
--- a/apps/web/app/events/create/page.tsx
+++ b/apps/web/app/events/create/page.tsx
@@ -1,5 +1,5 @@
import CreateEventForm from "@/components/events/create-event-form";
-import { Camera } from "lucide-react";
+import { Camera } from "@/components/ui/icons";
export default function CreateEventPage() {
return (
diff --git a/apps/web/app/help/[category]/[slug]/client-sidebar.tsx b/apps/web/app/help/[category]/[slug]/client-sidebar.tsx
index 62b53f18..fe73cb5b 100644
--- a/apps/web/app/help/[category]/[slug]/client-sidebar.tsx
+++ b/apps/web/app/help/[category]/[slug]/client-sidebar.tsx
@@ -2,7 +2,7 @@
import { useState } from "react";
import Link from "next/link";
-import { ChevronDown, ChevronUp } from "lucide-react";
+import { ChevronDown, ChevronUp } from "@/components/ui/icons";
import type { Article } from "../../data";
interface ClientSidebarProps {
diff --git a/apps/web/components/events/TicketModal.tsx b/apps/web/components/events/TicketModal.tsx
index b49b664f..4014195e 100644
--- a/apps/web/components/events/TicketModal.tsx
+++ b/apps/web/components/events/TicketModal.tsx
@@ -4,7 +4,7 @@ import React, { useState, useEffect, useRef } from "react";
import { motion, AnimatePresence } from "framer-motion";
import { QRCodeSVG } from "qrcode.react";
import { toast } from "sonner";
-import { X, Minus, Plus, Ticket, ArrowRight, CheckCircle2, Gift } from "lucide-react";
+import { X, Minus, Plus, Ticket, ArrowRight, CheckCircle2, Gift } from "@/components/ui/icons";
import Image from "next/image";
import { Button } from "@/components/ui/button";
diff --git a/apps/web/components/ui/icons.tsx b/apps/web/components/ui/icons.tsx
new file mode 100644
index 00000000..ef8b22f5
--- /dev/null
+++ b/apps/web/components/ui/icons.tsx
@@ -0,0 +1,59 @@
+interface IconProps {
+ size?: number;
+ className?: string;
+}
+
+function Icon({ src, alt, size = 24, className }: IconProps & { src: string; alt: string }) {
+ return (
+ // eslint-disable-next-line @next/next/no-img-element
+
+ );
+}
+
+export function ChevronDown(props: IconProps) {
+ return ;
+}
+
+export function ChevronUp(props: IconProps) {
+ return ;
+}
+
+export function Camera(props: IconProps) {
+ return ;
+}
+
+export function CheckCircle2(props: IconProps) {
+ return ;
+}
+
+export function Home(props: IconProps) {
+ return ;
+}
+
+export function ExternalLink(props: IconProps) {
+ return ;
+}
+
+export function X(props: IconProps) {
+ return ;
+}
+
+export function Minus(props: IconProps) {
+ return ;
+}
+
+export function Plus(props: IconProps) {
+ return ;
+}
+
+export function Ticket(props: IconProps) {
+ return ;
+}
+
+export function ArrowRight(props: IconProps) {
+ return ;
+}
+
+export function Gift(props: IconProps) {
+ return ;
+}
diff --git a/apps/web/lib/prisma.ts b/apps/web/lib/prisma.ts
index 67979b2d..f78e501b 100644
--- a/apps/web/lib/prisma.ts
+++ b/apps/web/lib/prisma.ts
@@ -2,10 +2,14 @@ import { PrismaClient } from "@prisma/client";
const globalForPrisma = global as unknown as { prisma: PrismaClient };
-// If we are in the GitHub CI pipeline, return a dummy object so the build doesn't crash.
-// Otherwise, boot up the real Prisma Client.
-export const prisma =
- globalForPrisma.prisma ||
- (process.env.CI ? ({} as PrismaClient) : new PrismaClient());
+function createPrismaClient(): PrismaClient {
+ // Skip real instantiation when there's no database (CI builds, static generation)
+ if (!process.env.DATABASE_URL) {
+ return {} as PrismaClient;
+ }
+ return new PrismaClient();
+}
-if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
\ No newline at end of file
+export const prisma = globalForPrisma.prisma || createPrismaClient();
+
+if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
diff --git a/apps/web/package.json b/apps/web/package.json
index 8c8ded28..258841db 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -17,7 +17,6 @@
"framer-motion": "^12.26.2",
"jsonwebtoken": "^9.0.3",
"leaflet": "^1.9.4",
- "lucide-react": "^0.575.0",
"next": "16.1.3",
"nprogress": "^0.2.0",
"qrcode.react": "^4.2.0",
diff --git a/apps/web/public/icons/check-circle.svg b/apps/web/public/icons/check-circle.svg
new file mode 100644
index 00000000..72a76130
--- /dev/null
+++ b/apps/web/public/icons/check-circle.svg
@@ -0,0 +1 @@
+
diff --git a/apps/web/public/icons/chevron-down.svg b/apps/web/public/icons/chevron-down.svg
new file mode 100644
index 00000000..52573dfb
--- /dev/null
+++ b/apps/web/public/icons/chevron-down.svg
@@ -0,0 +1 @@
+
diff --git a/apps/web/public/icons/chevron-up.svg b/apps/web/public/icons/chevron-up.svg
new file mode 100644
index 00000000..57776076
--- /dev/null
+++ b/apps/web/public/icons/chevron-up.svg
@@ -0,0 +1 @@
+
diff --git a/apps/web/public/icons/close.svg b/apps/web/public/icons/close.svg
new file mode 100644
index 00000000..491b86bf
--- /dev/null
+++ b/apps/web/public/icons/close.svg
@@ -0,0 +1 @@
+
diff --git a/apps/web/public/icons/external-link.svg b/apps/web/public/icons/external-link.svg
new file mode 100644
index 00000000..328d5409
--- /dev/null
+++ b/apps/web/public/icons/external-link.svg
@@ -0,0 +1 @@
+
diff --git a/apps/web/public/icons/gift.svg b/apps/web/public/icons/gift.svg
new file mode 100644
index 00000000..71bdbdc1
--- /dev/null
+++ b/apps/web/public/icons/gift.svg
@@ -0,0 +1 @@
+
diff --git a/apps/web/public/icons/minus.svg b/apps/web/public/icons/minus.svg
new file mode 100644
index 00000000..19d74b0f
--- /dev/null
+++ b/apps/web/public/icons/minus.svg
@@ -0,0 +1 @@
+
diff --git a/apps/web/public/icons/plus.svg b/apps/web/public/icons/plus.svg
new file mode 100644
index 00000000..6a334be5
--- /dev/null
+++ b/apps/web/public/icons/plus.svg
@@ -0,0 +1 @@
+
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 445cdb32..c400b6f0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -66,9 +66,6 @@ importers:
leaflet:
specifier: ^1.9.4
version: 1.9.4
- lucide-react:
- specifier: ^0.575.0
- version: 0.575.0(react@19.2.3)
next:
specifier: 16.1.3
version: 16.1.3(@babel/core@7.28.6)(@opentelemetry/api@1.4.1)(@playwright/test@1.58.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -2940,11 +2937,6 @@ packages:
resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==}
engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'}
- lucide-react@0.575.0:
- resolution: {integrity: sha512-VuXgKZrk0uiDlWjGGXmKV6MSk9Yy4l10qgVvzGn2AWBx1Ylt0iBexKOAoA6I7JO3m+M9oeovJd3yYENfkUbOeg==}
- peerDependencies:
- react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
-
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -6238,7 +6230,7 @@ snapshots:
eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@2.6.1))
@@ -6271,7 +6263,7 @@ snapshots:
tinyglobby: 0.2.15
unrs-resolver: 1.11.1
optionalDependencies:
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
transitivePeerDependencies:
- supports-color
@@ -6286,7 +6278,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -7213,10 +7205,6 @@ snapshots:
lru.min@1.1.4: {}
- lucide-react@0.575.0(react@19.2.3):
- dependencies:
- react: 19.2.3
-
lz-string@1.5.0: {}
magic-string@0.30.21: