diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index ef0a97c..93355f1 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -9,6 +9,7 @@ const config = { remotePatterns: [ { protocol: "https", hostname: "pbs.twimg.com" }, { protocol: "https", hostname: "abs.twimg.com" }, + { protocol: "https", hostname: "r2.better-t-stack.dev" }, ], }, outputFileTracingExcludes: { diff --git a/apps/web/public/icon/better-auth.svg b/apps/web/public/icon/better-auth.svg deleted file mode 100644 index 6d00383..0000000 --- a/apps/web/public/icon/better-auth.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/biome.svg b/apps/web/public/icon/biome.svg deleted file mode 100644 index 05fa79c..0000000 --- a/apps/web/public/icon/biome.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/icon/bun.svg b/apps/web/public/icon/bun.svg deleted file mode 100644 index 02a55d5..0000000 --- a/apps/web/public/icon/bun.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/convex.svg b/apps/web/public/icon/convex.svg deleted file mode 100644 index 8622c4c..0000000 --- a/apps/web/public/icon/convex.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/icon/docker.svg b/apps/web/public/icon/docker.svg deleted file mode 100644 index 2e0703d..0000000 --- a/apps/web/public/icon/docker.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/icon/drizzle-light.svg b/apps/web/public/icon/drizzle-light.svg deleted file mode 100644 index 1d7ced1..0000000 --- a/apps/web/public/icon/drizzle-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/icon/drizzle.svg b/apps/web/public/icon/drizzle.svg deleted file mode 100644 index 8596582..0000000 --- a/apps/web/public/icon/drizzle.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/elysia.svg b/apps/web/public/icon/elysia.svg deleted file mode 100644 index 0497dcc..0000000 --- a/apps/web/public/icon/elysia.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/expo.svg b/apps/web/public/icon/expo.svg deleted file mode 100644 index 07df455..0000000 --- a/apps/web/public/icon/expo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/icon/express-light.svg b/apps/web/public/icon/express-light.svg deleted file mode 100644 index 4dc0362..0000000 --- a/apps/web/public/icon/express-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/icon/express.svg b/apps/web/public/icon/express.svg deleted file mode 100644 index 0ee1e44..0000000 --- a/apps/web/public/icon/express.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/fastify.svg b/apps/web/public/icon/fastify.svg deleted file mode 100644 index 51728e5..0000000 --- a/apps/web/public/icon/fastify.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/icon/git.svg b/apps/web/public/icon/git.svg deleted file mode 100644 index 4e5fe8e..0000000 --- a/apps/web/public/icon/git.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/icon/hono.svg b/apps/web/public/icon/hono.svg deleted file mode 100644 index 9fffa74..0000000 --- a/apps/web/public/icon/hono.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/mongodb.svg b/apps/web/public/icon/mongodb.svg deleted file mode 100644 index 5999461..0000000 --- a/apps/web/public/icon/mongodb.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/mongoose.svg b/apps/web/public/icon/mongoose.svg deleted file mode 100644 index f84bcc2..0000000 --- a/apps/web/public/icon/mongoose.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/icon/mysql.svg b/apps/web/public/icon/mysql.svg deleted file mode 100644 index cafe01c..0000000 --- a/apps/web/public/icon/mysql.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/icon/neon.svg b/apps/web/public/icon/neon.svg deleted file mode 100644 index ddc31f9..0000000 --- a/apps/web/public/icon/neon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/nextjs.svg b/apps/web/public/icon/nextjs.svg deleted file mode 100644 index e2da0ad..0000000 --- a/apps/web/public/icon/nextjs.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/icon/node.svg b/apps/web/public/icon/node.svg deleted file mode 100644 index d92d02b..0000000 --- a/apps/web/public/icon/node.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/nuxt.svg b/apps/web/public/icon/nuxt.svg deleted file mode 100644 index 81b2e6f..0000000 --- a/apps/web/public/icon/nuxt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/icon/orpc.svg b/apps/web/public/icon/orpc.svg deleted file mode 100644 index 74e4801..0000000 --- a/apps/web/public/icon/orpc.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/icon/pnpm.svg b/apps/web/public/icon/pnpm.svg deleted file mode 100644 index 18b08ef..0000000 --- a/apps/web/public/icon/pnpm.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/postgres.svg b/apps/web/public/icon/postgres.svg deleted file mode 100644 index 916884c..0000000 --- a/apps/web/public/icon/postgres.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/prisma-light.svg b/apps/web/public/icon/prisma-light.svg deleted file mode 100644 index 3210efa..0000000 --- a/apps/web/public/icon/prisma-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/web/public/icon/prisma.svg b/apps/web/public/icon/prisma.svg deleted file mode 100644 index ceffb2f..0000000 --- a/apps/web/public/icon/prisma.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/react-router.svg b/apps/web/public/icon/react-router.svg deleted file mode 100644 index 7782575..0000000 --- a/apps/web/public/icon/react-router.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/icon/solid.svg b/apps/web/public/icon/solid.svg deleted file mode 100644 index dd92ac8..0000000 --- a/apps/web/public/icon/solid.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/sqlite.svg b/apps/web/public/icon/sqlite.svg deleted file mode 100644 index 7e21294..0000000 --- a/apps/web/public/icon/sqlite.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/icon/starlight.svg b/apps/web/public/icon/starlight.svg deleted file mode 100644 index 1d9c277..0000000 --- a/apps/web/public/icon/starlight.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/icon/supabase.svg b/apps/web/public/icon/supabase.svg deleted file mode 100644 index 574f67e..0000000 --- a/apps/web/public/icon/supabase.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/icon/svelte.svg b/apps/web/public/icon/svelte.svg deleted file mode 100644 index 2c0cd42..0000000 --- a/apps/web/public/icon/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/tanstack.svg b/apps/web/public/icon/tanstack.svg deleted file mode 100644 index 2216a59..0000000 --- a/apps/web/public/icon/tanstack.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/tauri.svg b/apps/web/public/icon/tauri.svg deleted file mode 100644 index e054c5c..0000000 --- a/apps/web/public/icon/tauri.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/trpc.svg b/apps/web/public/icon/trpc.svg deleted file mode 100644 index 150908c..0000000 --- a/apps/web/public/icon/trpc.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/turborepo.svg b/apps/web/public/icon/turborepo.svg deleted file mode 100644 index 0cebcb4..0000000 --- a/apps/web/public/icon/turborepo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/turso.svg b/apps/web/public/icon/turso.svg deleted file mode 100644 index 67939d7..0000000 --- a/apps/web/public/icon/turso.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/public/icon/ultracite.svg b/apps/web/public/icon/ultracite.svg deleted file mode 100644 index bc64ca7..0000000 --- a/apps/web/public/icon/ultracite.svg +++ /dev/null @@ -1,19 +0,0 @@ - -Ultracite - - - - - - - - - diff --git a/apps/web/public/icon/workers.svg b/apps/web/public/icon/workers.svg deleted file mode 100644 index 0eb6672..0000000 --- a/apps/web/public/icon/workers.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/apps/web/public/image.jpg b/apps/web/public/image.jpg deleted file mode 100644 index 4435c7d..0000000 Binary files a/apps/web/public/image.jpg and /dev/null differ diff --git a/apps/web/src/app/(home)/_components/FeatureCard.tsx b/apps/web/src/app/(home)/_components/FeatureCard.tsx index 0b62826..4fc1f08 100644 --- a/apps/web/src/app/(home)/_components/FeatureCard.tsx +++ b/apps/web/src/app/(home)/_components/FeatureCard.tsx @@ -3,7 +3,7 @@ import { motion } from "motion/react"; import Image from "next/image"; import { useTheme } from "next-themes"; -import { useEffect, useState } from "react"; + import { ScrollArea } from "@/components/ui/scroll-area"; import { cn } from "@/lib/utils"; @@ -29,44 +29,46 @@ function TechIcon({ name: string; className?: string; }) { - const [mounted, setMounted] = useState(false); const { theme } = useTheme(); - useEffect(() => { - setMounted(true); - }, []); - - if (mounted && icon.startsWith("/icon/")) { - if ( - theme === "light" && - (icon.includes("drizzle") || - icon.includes("prisma") || - icon.includes("express")) - ) { - icon = icon.replace(".svg", "-light.svg"); - } + // If no icon, return empty + if (!icon) return null; + // If it's an emoji or text icon, render as span + if (!icon.startsWith("https://")) { return ( - {`${name} + + {icon} + ); } + // Handle light theme variants + let iconSrc = icon; + if ( + theme === "light" && + (icon.includes("drizzle") || + icon.includes("prisma") || + icon.includes("express")) + ) { + iconSrc = icon.replace(".svg", "-light.svg"); + } + + // Render as image return ( - - {icon} - + {`${name} ); } diff --git a/apps/web/src/app/(home)/_components/footer.tsx b/apps/web/src/app/(home)/_components/footer.tsx index e00a776..bfa4651 100644 --- a/apps/web/src/app/(home)/_components/footer.tsx +++ b/apps/web/src/app/(home)/_components/footer.tsx @@ -1,5 +1,7 @@ import { Github } from "lucide-react"; +import Image from "next/image"; import Link from "next/link"; +import npmIcon from "@/public/icon/npm.svg"; const Footer = () => { return ( @@ -26,18 +28,10 @@ const Footer = () => { - - NPM - - + NPM diff --git a/apps/web/src/app/(home)/_components/stack-builder.tsx b/apps/web/src/app/(home)/_components/stack-builder.tsx index a09a903..f3df09b 100644 --- a/apps/web/src/app/(home)/_components/stack-builder.tsx +++ b/apps/web/src/app/(home)/_components/stack-builder.tsx @@ -138,39 +138,37 @@ function TechIcon({ name: string; className?: string; }) { - const [mounted, setMounted] = useState(false); const { theme } = useTheme(); - useEffect(() => { - setMounted(true); - }, []); - - if (mounted && icon.startsWith("/icon/")) { - if ( - theme === "light" && - (icon.includes("drizzle") || - icon.includes("prisma") || - icon.includes("express")) - ) { - icon = icon.replace(".svg", "-light.svg"); - } + if (!icon) return null; + if (!icon.startsWith("https://")) { return ( - {`${name} + + {icon} + ); } + let iconSrc = icon; + if ( + theme === "light" && + (icon.includes("drizzle") || + icon.includes("prisma") || + icon.includes("express")) + ) { + iconSrc = icon.replace(".svg", "-light.svg"); + } + return ( - - {icon} - + {`${name} ); } @@ -1202,12 +1200,7 @@ const StackBuilder = () => { )} {tech.name} @@ -1236,9 +1229,7 @@ const StackBuilder = () => { getBadgeColors(category), )} > - {tech.icon !== "" && ( - - )} + {tech.name} , ); diff --git a/apps/web/src/app/(home)/analytics/page.tsx b/apps/web/src/app/(home)/analytics/page.tsx index 28b5113..66af6a4 100644 --- a/apps/web/src/app/(home)/analytics/page.tsx +++ b/apps/web/src/app/(home)/analytics/page.tsx @@ -24,7 +24,7 @@ import { ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart"; -import discordLogo from "@/public/icon/discord.svg"; +import discordIcon from "@/public/icon/discord.svg"; import Footer from "../_components/footer"; interface AggregatedAnalyticsData { @@ -650,7 +650,7 @@ export default function AnalyticsPage() {
discord diff --git a/apps/web/src/lib/constant.ts b/apps/web/src/lib/constant.ts index d68a7f4..9ae592f 100644 --- a/apps/web/src/lib/constant.ts +++ b/apps/web/src/lib/constant.ts @@ -1,5 +1,7 @@ import type { TechCategory } from "./types"; +export const ICON_BASE_URL = "https://r2.better-t-stack.dev/icons"; + export const TECH_OPTIONS: Record< TechCategory, { @@ -17,7 +19,7 @@ export const TECH_OPTIONS: Record< id: "trpc", name: "tRPC", description: "End-to-end typesafe APIs", - icon: "/icon/trpc.svg", + icon: `${ICON_BASE_URL}/trpc.svg`, color: "from-blue-500 to-blue-700", default: true, }, @@ -25,7 +27,7 @@ export const TECH_OPTIONS: Record< id: "orpc", name: "oRPC", description: "Typesafe APIs Made Simple", - icon: "/icon/orpc.svg", + icon: `${ICON_BASE_URL}/orpc.svg`, color: "from-indigo-400 to-indigo-600", }, { @@ -41,7 +43,7 @@ export const TECH_OPTIONS: Record< id: "tanstack-router", name: "TanStack Router", description: "Modern type-safe router for React", - icon: "/icon/tanstack.svg", + icon: `${ICON_BASE_URL}/tanstack.svg`, color: "from-blue-400 to-blue-600", default: true, }, @@ -49,7 +51,7 @@ export const TECH_OPTIONS: Record< id: "react-router", name: "React Router", description: "Declarative routing for React", - icon: "/icon/react-router.svg", + icon: `${ICON_BASE_URL}/react-router.svg`, color: "from-cyan-400 to-cyan-600", default: false, }, @@ -58,7 +60,7 @@ export const TECH_OPTIONS: Record< name: "TanStack Start (vite)", description: "Full-stack React and Solid framework powered by TanStack Router", - icon: "/icon/tanstack.svg", + icon: `${ICON_BASE_URL}/tanstack.svg`, color: "from-purple-400 to-purple-600", default: false, }, @@ -66,7 +68,7 @@ export const TECH_OPTIONS: Record< id: "next", name: "Next.js", description: "React framework with hybrid rendering", - icon: "/icon/nextjs.svg", + icon: `${ICON_BASE_URL}/nextjs.svg`, color: "from-gray-700 to-black", default: false, }, @@ -74,7 +76,7 @@ export const TECH_OPTIONS: Record< id: "nuxt", name: "Nuxt", description: "Vue full-stack framework (SSR, SSG, hybrid)", - icon: "/icon/nuxt.svg", + icon: `${ICON_BASE_URL}/nuxt.svg`, color: "from-green-400 to-green-700", default: false, }, @@ -82,7 +84,7 @@ export const TECH_OPTIONS: Record< id: "svelte", name: "Svelte", description: "Cybernetically enhanced web apps", - icon: "/icon/svelte.svg", + icon: `${ICON_BASE_URL}/svelte.svg`, color: "from-orange-500 to-orange-700", default: false, }, @@ -90,7 +92,7 @@ export const TECH_OPTIONS: Record< id: "solid", name: "Solid", description: "Simple and performant reactivity for building UIs", - icon: "/icon/solid.svg", + icon: `${ICON_BASE_URL}/solid.svg`, color: "from-blue-600 to-blue-800", default: false, }, @@ -108,7 +110,7 @@ export const TECH_OPTIONS: Record< id: "native-nativewind", name: "React Native + NativeWind", description: "Expo with NativeWind (Tailwind)", - icon: "/icon/expo.svg", + icon: `${ICON_BASE_URL}/expo.svg`, color: "from-purple-400 to-purple-600", className: "invert-0 dark:invert", default: false, @@ -117,7 +119,7 @@ export const TECH_OPTIONS: Record< id: "native-unistyles", name: "React Native + Unistyles", description: "Expo with Unistyles", - icon: "/icon/expo.svg", + icon: `${ICON_BASE_URL}/expo.svg`, color: "from-pink-400 to-pink-600", className: "invert-0 dark:invert", default: false, @@ -136,7 +138,7 @@ export const TECH_OPTIONS: Record< id: "bun", name: "Bun", description: "Fast JavaScript runtime & toolkit", - icon: "/icon/bun.svg", + icon: `${ICON_BASE_URL}/bun.svg`, color: "from-amber-400 to-amber-600", default: true, }, @@ -144,14 +146,14 @@ export const TECH_OPTIONS: Record< id: "node", name: "Node.js", description: "JavaScript runtime environment", - icon: "/icon/node.svg", + icon: `${ICON_BASE_URL}/node.svg`, color: "from-green-400 to-green-600", }, { id: "workers", name: "Cloudflare Workers", description: "Serverless runtime for the edge", - icon: "/icon/workers.svg", + icon: `${ICON_BASE_URL}/workers.svg`, color: "from-orange-400 to-orange-600", }, { @@ -167,7 +169,7 @@ export const TECH_OPTIONS: Record< id: "hono", name: "Hono", description: "Ultrafast web framework", - icon: "/icon/hono.svg", + icon: `${ICON_BASE_URL}/hono.svg`, color: "from-blue-500 to-blue-700", default: true, }, @@ -175,35 +177,35 @@ export const TECH_OPTIONS: Record< id: "next", name: "Next.js", description: "App Router and API Routes", - icon: "/icon/nextjs.svg", + icon: `${ICON_BASE_URL}/nextjs.svg`, color: "from-gray-700 to-black", }, { id: "elysia", name: "Elysia", description: "TypeScript web framework", - icon: "/icon/elysia.svg", + icon: `${ICON_BASE_URL}/elysia.svg`, color: "from-purple-500 to-purple-700", }, { id: "express", name: "Express", description: "Popular Node.js framework", - icon: "/icon/express.svg", + icon: `${ICON_BASE_URL}/express.svg`, color: "from-gray-500 to-gray-700", }, { id: "fastify", name: "Fastify", description: "Fast, low-overhead web framework for Node.js", - icon: "/icon/fastify.svg", + icon: `${ICON_BASE_URL}/fastify.svg`, color: "from-gray-500 to-gray-700", }, { id: "convex", name: "Convex", description: "Reactive backend-as-a-service", - icon: "/icon/convex.svg", + icon: `${ICON_BASE_URL}/convex.svg`, color: "from-pink-500 to-pink-700", }, { @@ -219,7 +221,7 @@ export const TECH_OPTIONS: Record< id: "sqlite", name: "SQLite", description: "File-based SQL database", - icon: "/icon/sqlite.svg", + icon: `${ICON_BASE_URL}/sqlite.svg`, color: "from-blue-400 to-cyan-500", default: true, }, @@ -227,21 +229,21 @@ export const TECH_OPTIONS: Record< id: "postgres", name: "PostgreSQL", description: "Advanced SQL database", - icon: "/icon/postgres.svg", + icon: `${ICON_BASE_URL}/postgres.svg`, color: "from-indigo-400 to-indigo-600", }, { id: "mysql", name: "MySQL", description: "Popular relational database", - icon: "/icon/mysql.svg", + icon: `${ICON_BASE_URL}/mysql.svg`, color: "from-blue-500 to-blue-700", }, { id: "mongodb", name: "MongoDB", description: "NoSQL document database", - icon: "/icon/mongodb.svg", + icon: `${ICON_BASE_URL}/mongodb.svg`, color: "from-green-400 to-green-600", }, { @@ -257,7 +259,7 @@ export const TECH_OPTIONS: Record< id: "drizzle", name: "Drizzle", description: "TypeScript ORM", - icon: "/icon/drizzle.svg", + icon: `${ICON_BASE_URL}/drizzle.svg`, color: "from-cyan-400 to-cyan-600", default: true, }, @@ -265,14 +267,14 @@ export const TECH_OPTIONS: Record< id: "prisma", name: "Prisma", description: "Next-gen ORM", - icon: "/icon/prisma.svg", + icon: `${ICON_BASE_URL}/prisma.svg`, color: "from-purple-400 to-purple-600", }, { id: "mongoose", name: "Mongoose", description: "Elegant object modeling tool", - icon: "/icon/mongoose.svg", + icon: `${ICON_BASE_URL}/mongoose.svg`, color: "from-blue-400 to-blue-600", }, { @@ -288,49 +290,49 @@ export const TECH_OPTIONS: Record< id: "turso", name: "Turso", description: "SQLite cloud database powered by libSQL", - icon: "/icon/turso.svg", + icon: `${ICON_BASE_URL}/turso.svg`, color: "from-pink-400 to-pink-600", }, { id: "d1", name: "Cloudflare D1", description: "Serverless SQLite database on Cloudflare Workers", - icon: "/icon/workers.svg", + icon: `${ICON_BASE_URL}/workers.svg`, color: "from-orange-400 to-orange-600", }, { id: "neon", name: "Neon Postgres", description: "Serverless PostgreSQL with Neon", - icon: "/icon/neon.svg", + icon: `${ICON_BASE_URL}/neon.svg`, color: "from-blue-400 to-blue-600", }, { id: "prisma-postgres", name: "Prisma PostgreSQL", description: "Set up PostgreSQL with Prisma", - icon: "/icon/prisma.svg", + icon: `${ICON_BASE_URL}/prisma.svg`, color: "from-indigo-400 to-indigo-600", }, { id: "mongodb-atlas", name: "MongoDB Atlas", description: "Cloud MongoDB setup with Atlas", - icon: "/icon/mongodb.svg", + icon: `${ICON_BASE_URL}/mongodb.svg`, color: "from-green-400 to-green-600", }, { id: "supabase", name: "Supabase", description: "Local Supabase stack (requires Docker)", - icon: "/icon/supabase.svg", + icon: `${ICON_BASE_URL}/supabase.svg`, color: "from-emerald-400 to-emerald-600", }, { id: "docker", name: "Docker", description: "Local database with Docker Compose", - icon: "/icon/docker.svg", + icon: `${ICON_BASE_URL}/docker.svg`, color: "from-blue-500 to-blue-700", }, { @@ -347,7 +349,7 @@ export const TECH_OPTIONS: Record< id: "workers", name: "Cloudflare Workers", description: "Deploy to Cloudflare Workers", - icon: "/icon/workers.svg", + icon: `${ICON_BASE_URL}/workers.svg`, color: "from-orange-400 to-orange-600", }, { @@ -364,7 +366,7 @@ export const TECH_OPTIONS: Record< id: "true", name: "Better Auth", description: "Simple authentication", - icon: "/icon/better-auth.svg", + icon: `${ICON_BASE_URL}/better-auth.svg`, color: "from-green-400 to-green-600", default: true, }, @@ -381,7 +383,7 @@ export const TECH_OPTIONS: Record< id: "npm", name: "npm", description: "Default package manager", - icon: "/icon/npm.svg", + icon: `${ICON_BASE_URL}/npm.svg`, color: "from-red-500 to-red-700", className: "invert-0 dark:invert", }, @@ -389,14 +391,14 @@ export const TECH_OPTIONS: Record< id: "pnpm", name: "pnpm", description: "Fast, disk space efficient", - icon: "/icon/pnpm.svg", + icon: `${ICON_BASE_URL}/pnpm.svg`, color: "from-orange-500 to-orange-700", }, { id: "bun", name: "bun", description: "All-in-one toolkit", - icon: "/icon/bun.svg", + icon: `${ICON_BASE_URL}/bun.svg`, color: "from-amber-500 to-amber-700", default: true, }, @@ -414,7 +416,7 @@ export const TECH_OPTIONS: Record< id: "tauri", name: "Tauri", description: "Build native desktop apps", - icon: "/icon/tauri.svg", + icon: `${ICON_BASE_URL}/tauri.svg`, color: "from-amber-500 to-amber-700", default: false, }, @@ -422,7 +424,7 @@ export const TECH_OPTIONS: Record< id: "starlight", name: "Starlight", description: "Build stellar docs with astro", - icon: "/icon/starlight.svg", + icon: `${ICON_BASE_URL}/starlight.svg`, color: "from-teal-500 to-teal-700", default: false, }, @@ -430,7 +432,7 @@ export const TECH_OPTIONS: Record< id: "biome", name: "Biome", description: "Format, lint, and more", - icon: "/icon/biome.svg", + icon: `${ICON_BASE_URL}/biome.svg`, color: "from-green-500 to-green-700", default: false, }, @@ -446,7 +448,7 @@ export const TECH_OPTIONS: Record< id: "ultracite", name: "Ultracite", description: "Biome preset with AI integration", - icon: "/icon/ultracite.svg", + icon: `${ICON_BASE_URL}/ultracite.svg`, color: "from-blue-500 to-blue-700", className: "invert-0 dark:invert", default: false, @@ -471,7 +473,7 @@ export const TECH_OPTIONS: Record< id: "turborepo", name: "Turborepo", description: "High-performance build system", - icon: "/icon/turborepo.svg", + icon: `${ICON_BASE_URL}/turborepo.svg`, color: "from-gray-400 to-gray-700", default: true, }, @@ -499,7 +501,7 @@ export const TECH_OPTIONS: Record< id: "true", name: "Git", description: "Initialize Git repository", - icon: "/icon/git.svg", + icon: `${ICON_BASE_URL}/git.svg`, color: "from-gray-500 to-gray-700", default: true, },