diff --git a/apps/app/public/colosseum-logo-white.svg b/apps/app/public/colosseum-logo-white.svg new file mode 100644 index 0000000..a513aa3 --- /dev/null +++ b/apps/app/public/colosseum-logo-white.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/app/src/components/custom-ui/hero-3d.tsx b/apps/app/src/components/custom-ui/hero-3d.tsx index 6925319..b6fd91e 100644 --- a/apps/app/src/components/custom-ui/hero-3d.tsx +++ b/apps/app/src/components/custom-ui/hero-3d.tsx @@ -15,6 +15,11 @@ import { import { easeOut } from "motion" const SUPPORTED_BY_LOGOS = [ + { + name: "colosseum", + href: "https://blog.colosseum.com/announcing-colosseums-accelerator-cohort-4/", + src: "/colosseum-logo-white.svg", + }, { name: "coinbase", href: "https://www.coinbase.com/developer-platform/discover/launches/summer-builder-grants", @@ -48,6 +53,8 @@ const getLogoSize = (name: string) => { return { className: "h-6 w-[60px]", width: 60, height: 24 } case "ethglobal": return { className: "h-5 w-[90px]", width: 80, height: 20 } + case "colosseum": + return { className: "h-6 w-[120px]", width: 120, height: 24 } default: return { className: "h-12 w-[160px]", width: 160, height: 64 } } @@ -64,6 +71,46 @@ const getMaskStyle = (src: string): React.CSSProperties => ({ WebkitMaskPosition: "center", }) +const renderLogo = (logo: typeof SUPPORTED_BY_LOGOS[number], index?: number) => { + const logoSize = getLogoSize(logo.name) + return ( + +
+
+ {`${logo.name} +
+ + ) +} + export function SupportedBySection() { const prefersReduced = useReducedMotion() const [isMounted, setIsMounted] = React.useState(false) @@ -84,56 +131,41 @@ export function SupportedBySection() { [prefersReduced] ) + // Duplicate logos for seamless infinite scroll (exactly 2 copies for -50% animation) + const duplicatedLogos = [...SUPPORTED_BY_LOGOS, ...SUPPORTED_BY_LOGOS] + return ( - -
- SUPPORTED BY -
- {SUPPORTED_BY_LOGOS.map((logo) => { - const logoSize = getLogoSize(logo.name) - return ( - -
-
- {`${logo.name} -
- - ) - })} + <> + +
+ SUPPORTED BY + + {/* Desktop: flex-wrap layout */} +
+ {SUPPORTED_BY_LOGOS.map((logo) => renderLogo(logo))} +
+
+
+ + {/* Mobile: auto-scrolling carousel - full width to edge */} +
+
+ {duplicatedLogos.map((logo, index) => renderLogo(logo, index))}
- + ) } diff --git a/apps/app/src/components/custom-ui/mcp-example-card.tsx b/apps/app/src/components/custom-ui/mcp-example-card.tsx index 394fdc7..654a1a7 100644 --- a/apps/app/src/components/custom-ui/mcp-example-card.tsx +++ b/apps/app/src/components/custom-ui/mcp-example-card.tsx @@ -13,6 +13,7 @@ import { Spinner } from "@/components/ui/spinner" import Image from "next/image" import { toast } from "sonner" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" +import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription } from "@/components/ui/drawer" interface McpExampleCardProps extends React.HTMLAttributes { className?: string @@ -26,6 +27,7 @@ export default function McpExampleCard({ }: McpExampleCardProps) { const [selectedTool, setSelectedTool] = useState(null) const [showToolModal, setShowToolModal] = useState(false) + const [toolDescriptionDrawer, setToolDescriptionDrawer] = useState<{ toolName: string; description: string } | null>(null) const [data, setData] = useState<{ serverId: string origin?: string @@ -189,34 +191,47 @@ export default function McpExampleCard({ displayTools.map((tool) => (
- {/* Left: Name + Info Icon */} + {/* Mobile: First line - Tool name + Info Icon */} + {/* Desktop: Left - Name + Info Icon */}

{tool.name}

{tool.description && ( - - + <> + {/* Desktop: Tooltip */} + + + + + +

{tool.description}

+
+
+ {/* Mobile: Clickable button to open drawer */} + + )}
- {/* Right: Price + RUN Button */} -
+ {/* Mobile: Second line - Price (1/4) + RUN Button (3/4) */} + {/* Desktop: Right - Price + RUN Button */} +
{tool.paymentHint && tool.paymentPriceUSD && ( - ${tool.paymentPriceUSD} + ${tool.paymentPriceUSD} )}