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 + {alt} + ); +} + +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: