Initial commit of Vellum, an event photo product for guest uploads, host moderation, and original-quality galleries.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-07 19:36:14 -04:00
co-authored by Cursor
commit 27e2f196eb
149 changed files with 13847 additions and 0 deletions
@@ -0,0 +1,46 @@
"use client";
import type { ReactNode } from "react";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
export type EventWorkspaceTab = {
id: string;
label: string;
content: ReactNode;
};
export function EventWorkspace({
heading,
tabs,
}: {
heading: ReactNode;
tabs: EventWorkspaceTab[];
}) {
const initial = tabs[0]?.id ?? "photos";
return (
<div className="reveal flex flex-col gap-6 sm:gap-8">
{heading}
{tabs.length === 0 ? null : (
<Tabs defaultValue={initial} className="gap-5">
<TabsList className="sticky top-[calc(3.5rem+env(safe-area-inset-top))] z-30 h-11 w-full max-w-full justify-start overflow-x-auto bg-muted/90 backdrop-blur-md sm:top-[calc(4rem+env(safe-area-inset-top))] sm:h-10">
{tabs.map((tab) => (
<TabsTrigger
key={tab.id}
value={tab.id}
className="tap-target flex-none px-3"
>
{tab.label}
</TabsTrigger>
))}
</TabsList>
{tabs.map((tab) => (
<TabsContent key={tab.id} value={tab.id} className="flex flex-col gap-4">
{tab.content}
</TabsContent>
))}
</Tabs>
)}
</div>
);
}