From 5cee4908df1032f3655ba211e8091a9b3dfd7bf2 Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Sat, 15 Nov 2025 09:20:59 +0000 Subject: [PATCH] Create ETHOS Storefront widget for creator marketplace cgen-98180e31c0fa4bd0a27255c87f5a0fc9 --- client/components/EthosStorefrontWidget.tsx | 206 ++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 client/components/EthosStorefrontWidget.tsx diff --git a/client/components/EthosStorefrontWidget.tsx b/client/components/EthosStorefrontWidget.tsx new file mode 100644 index 00000000..d7e7b868 --- /dev/null +++ b/client/components/EthosStorefrontWidget.tsx @@ -0,0 +1,206 @@ +import { useState } from "react"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { Music, Toggle, ToggleLeft, ToggleRight, ExternalLink } from "lucide-react"; + +export interface EthosStorefrontData { + for_hire: boolean; + headline?: string; + bio?: string; + avatar_url?: string; + services: EthosService[]; + verified?: boolean; + profile_url?: string; +} + +export interface EthosService { + id: string; + name: string; + type: "track" | "sfx" | "service"; + price?: number; + currency?: string; + description?: string; +} + +interface EthosStorefrontWidgetProps { + data: EthosStorefrontData; + onToggleForHire?: (enabled: boolean) => void; + onEditProfile?: () => void; + accentColor?: "purple" | "blue" | "cyan" | "green" | "amber" | "red"; +} + +const colorMap = { + purple: { + bg: "bg-gradient-to-br from-purple-950/40 to-purple-900/20", + border: "border-purple-500/20", + accent: "bg-purple-600 hover:bg-purple-700", + text: "text-purple-300", + }, + blue: { + bg: "bg-gradient-to-br from-blue-950/40 to-blue-900/20", + border: "border-blue-500/20", + accent: "bg-blue-600 hover:bg-blue-700", + text: "text-blue-300", + }, + cyan: { + bg: "bg-gradient-to-br from-cyan-950/40 to-cyan-900/20", + border: "border-cyan-500/20", + accent: "bg-cyan-600 hover:bg-cyan-700", + text: "text-cyan-300", + }, + green: { + bg: "bg-gradient-to-br from-green-950/40 to-green-900/20", + border: "border-green-500/20", + accent: "bg-green-600 hover:bg-green-700", + text: "text-green-300", + }, + amber: { + bg: "bg-gradient-to-br from-amber-950/40 to-amber-900/20", + border: "border-amber-500/20", + accent: "bg-amber-600 hover:bg-amber-700", + text: "text-amber-300", + }, + red: { + bg: "bg-gradient-to-br from-red-950/40 to-red-900/20", + border: "border-red-500/20", + accent: "bg-red-600 hover:bg-red-700", + text: "text-red-300", + }, +}; + +export function EthosStorefrontWidget({ + data, + onToggleForHire, + onEditProfile, + accentColor = "purple", +}: EthosStorefrontWidgetProps) { + const [isForHire, setIsForHire] = useState(data.for_hire); + const colors = colorMap[accentColor]; + + const handleToggleForHire = async (enabled: boolean) => { + setIsForHire(enabled); + if (onToggleForHire) { + onToggleForHire(enabled); + } + }; + + return ( + + + + + My ETHOS Storefront + + Your marketplace presence for services and tracks + + + {/* Profile Header */} +
+ {data.avatar_url && ( + Profile + )} +
+ {data.headline && ( +

{data.headline}

+ )} + {data.bio && ( +

{data.bio}

+ )} + {data.verified && ( + ✓ Verified + )} +
+
+ + {/* For Hire Toggle */} +
+
+

Available for Work

+

Is your profile visible to clients?

+
+ +
+ + {/* Service Menu */} +
+

Service Menu

+ {data.services.length === 0 ? ( +

No services listed

+ ) : ( +
+ {data.services.map((service) => ( +
+
+
+

+ {service.name} +

+ + {service.type} + +
+ {service.price && ( +

+ ${service.price} +

+ )} +
+ {service.description && ( +

+ {service.description} +

+ )} +
+ ))} +
+ )} + +
+ + {/* Actions */} +
+ + +
+
+
+ ); +} + +export default EthosStorefrontWidget;