import { Suspense } from "react"; import { ArrowUpRight, CheckCircle, FileCode, GitBranch, GitPullRequest, Github, Upload, Zap, } from "lucide-react"; import type { Metadata } from "next"; import { getAllCategories, getCategoryCounts, getIconCount } from "@/lib/icons"; import { SidebarShell } from "@/components/layout/sidebar-shell"; import { SubmitForm } from "@/components/submit/submit-form"; export const metadata: Metadata = { title: "Submit an Icon - Add Your Brand SVG", description: "Every brand deserves a place. Submit your brand SVG icon to theSVG, the open-source brand icon library. No gatekeeping, community-driven.", openGraph: { title: "Submit an Icon | theSVG", description: "Submit your brand SVG to the open-source icon library.", siteName: "theSVG", }, alternates: { canonical: "https://thesvg.org/submit" }, }; export default function SubmitPage() { const categories = getAllCategories(); const categoryCounts = getCategoryCounts(); const iconCount = getIconCount(); return (
{/* Two-column layout */}
{/* Left column - Info */}
{/* Hero header with gradient */}
{iconCount.toLocaleString()}+ icons and growing

Submit an Icon

Every brand deserves a place. No gatekeeping. Drop your SVG, fill in the details, and submit directly via GitHub.

{/* Decorative blob */}
{/* Quick steps - horizontal */}

How it works

} title="Fork the repo" description="Fork github.com/GLINCKER/thesvg and clone locally." accent="from-blue-500/10 to-blue-500/5 dark:from-blue-500/10 dark:to-blue-500/5" iconColor="text-blue-500" /> } title="Add your SVGs" description="Place files in public/icons/{slug}/ with proper naming." accent="from-emerald-500/10 to-emerald-500/5 dark:from-emerald-500/10 dark:to-emerald-500/5" iconColor="text-emerald-500" /> } title="Update icons.json" description="Add your entry to src/data/icons.json." accent="from-purple-500/10 to-purple-500/5 dark:from-purple-500/10 dark:to-purple-500/5" iconColor="text-purple-500" /> } title="Open a PR" description="Run pnpm validate, then open a pull request." accent="from-orange-500/10 to-orange-500/5 dark:from-orange-500/10 dark:to-orange-500/5" iconColor="text-orange-500" />
{/* SVG Requirements */}

SVG Requirements

    {[ "Valid SVG/XML markup", "Under 50KB file size", "No embedded scripts or external references", "viewBox attribute present", "Gradients and multi-color SVGs welcome", "You have the right to redistribute the icon", ].map((req) => (
  • {req}
  • ))}
{/* GitHub links */} {/* Schema example */}

Icon Entry Schema

                  {`{
  "slug": "your-brand",
  "title": "Your Brand",
  "aliases": [],
  "hex": "FF5733",
  "categories": ["Software"],
  "variants": {
    "default": "/icons/your-brand/default.svg",
    "mono": "/icons/your-brand/mono.svg",
    "dark": "/icons/your-brand/dark.svg"
  },
  "license": "MIT",
  "url": "https://yourbrand.com"
}`}
                
{/* Right column - Form (sticky) */}

Quick Submit

Drop your SVG to validate and submit via GitHub

); } function Step({ number, icon, title, description, accent, iconColor, }: { number: number; icon: React.ReactNode; title: string; description: string; accent: string; iconColor: string; }) { return (
{icon}

#{number} {title}

{description}

); }