Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions apps/app/public/colosseum-logo-white.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
126 changes: 79 additions & 47 deletions apps/app/src/components/custom-ui/hero-3d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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 }
}
Expand All @@ -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 (
<Link
key={`${logo.name}-${index ?? ''}`}
href={logo.href}
target="_blank"
rel="noopener noreferrer"
className="group flex-shrink-0"
>
<div
className={cn(
"h-8 px-4 flex items-center justify-center rounded-[2px] transition-all duration-300 min-w-[140px]",
logo.name === "colosseum"
? "bg-[#1C2123] dark:bg-[#D8DDDF] group-hover:opacity-90"
: "bg-muted/50 group-hover:bg-muted"
)}
>
<div
className={cn(
"transition-all duration-300",
logoSize.className,
logo.name === "colosseum"
? "[background-color:var(--background)] dark:[background-color:var(--background)]"
: "opacity-70 group-hover:opacity-100 [background-color:var(--foreground)]"
)}
style={getMaskStyle(logo.src)}
/>
<Image
src={logo.src}
alt={`${logo.name} logo`}
width={logoSize.width}
height={logoSize.height}
className="sr-only"
/>
</div>
</Link>
)
}

export function SupportedBySection() {
const prefersReduced = useReducedMotion()
const [isMounted, setIsMounted] = React.useState(false)
Expand All @@ -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 (
<motion.section
className="mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8 py-8 sm:py-16"
initial="hidden"
animate={isMounted ? "visible" : "hidden"}
variants={fadeUp}
>
<div className="flex flex-col items-start space-y-4">
<HighlighterText>SUPPORTED BY</HighlighterText>
<div className="flex flex-wrap gap-3">
{SUPPORTED_BY_LOGOS.map((logo) => {
const logoSize = getLogoSize(logo.name)
return (
<Link
key={logo.name}
href={logo.href}
target="_blank"
rel="noopener noreferrer"
className="group"
>
<div
className={cn(
"h-8 px-4 flex items-center justify-center rounded-[2px] transition-all duration-300",
"bg-muted/50",
"group-hover:bg-muted"
)}
>
<div
className={cn(
"transition-all duration-300",
logoSize.className,
"opacity-70 group-hover:opacity-100",
"[background-color:var(--foreground)]"
)}
style={getMaskStyle(logo.src)}
/>
<Image
src={logo.src}
alt={`${logo.name} logo`}
width={logoSize.width}
height={logoSize.height}
className="sr-only"
/>
</div>
</Link>
)
})}
<>
<motion.section
className="mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8 py-8 sm:py-16"
initial="hidden"
animate={isMounted ? "visible" : "hidden"}
variants={fadeUp}
>
<div className="flex flex-col items-start space-y-4">
<HighlighterText>SUPPORTED BY</HighlighterText>

{/* Desktop: flex-wrap layout */}
<div className="hidden md:flex flex-wrap gap-3">
{SUPPORTED_BY_LOGOS.map((logo) => renderLogo(logo))}
</div>
</div>
</motion.section>

{/* Mobile: auto-scrolling carousel - full width to edge */}
<div className="md:hidden w-screen overflow-x-scroll scrollbar-hide -mt-4">
<div
className="flex gap-3"
style={{
width: 'max-content',
animation: prefersReduced ? 'none' : 'scroll-carousel 25s linear infinite',
animationFillMode: 'both',
}}
>
{duplicatedLogos.map((logo, index) => renderLogo(logo, index))}
</div>
</div>
</motion.section>
</>
)
}

Expand Down
57 changes: 44 additions & 13 deletions apps/app/src/components/custom-ui/mcp-example-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<HTMLDivElement> {
className?: string
Expand All @@ -26,6 +27,7 @@ export default function McpExampleCard({
}: McpExampleCardProps) {
const [selectedTool, setSelectedTool] = useState<ToolFromMcpServerWithStats | null>(null)
const [showToolModal, setShowToolModal] = useState(false)
const [toolDescriptionDrawer, setToolDescriptionDrawer] = useState<{ toolName: string; description: string } | null>(null)
const [data, setData] = useState<{
serverId: string
origin?: string
Expand Down Expand Up @@ -189,34 +191,47 @@ export default function McpExampleCard({
displayTools.map((tool) => (
<div
key={tool.id}
className="flex items-center justify-between gap-4 p-4 pr-6 md:pr-4 rounded-[2px] bg-muted-2"
className="flex flex-col md:flex-row md:items-center md:justify-between gap-3 md:gap-4 p-4 pr-6 md:pr-4 rounded-[2px] bg-muted-2"
>
{/* Left: Name + Info Icon */}
{/* Mobile: First line - Tool name + Info Icon */}
{/* Desktop: Left - Name + Info Icon */}
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
<h4 className="font-mono text-sm font-medium text-foreground">{tool.name}</h4>
{tool.description && (
<Tooltip>
<TooltipTrigger asChild>
<>
{/* Desktop: Tooltip */}
<Tooltip>
<TooltipTrigger asChild>
<Info className="hidden md:block h-4 w-4 text-muted-foreground opacity-60 cursor-help" />
</TooltipTrigger>
<TooltipContent>
<p className="max-w-xs">{tool.description}</p>
</TooltipContent>
</Tooltip>
{/* Mobile: Clickable button to open drawer */}
<button
type="button"
onClick={() => setToolDescriptionDrawer({ toolName: tool.name, description: tool.description })}
className="md:hidden"
>
<Info className="h-4 w-4 text-muted-foreground opacity-60" />
</TooltipTrigger>
<TooltipContent>
<p className="max-w-xs">{tool.description}</p>
</TooltipContent>
</Tooltip>
</button>
</>
)}
</div>
</div>

{/* Right: Price + RUN Button */}
<div className="flex items-center gap-2 shrink-0">
{/* Mobile: Second line - Price (1/4) + RUN Button (3/4) */}
{/* Desktop: Right - Price + RUN Button */}
<div className="flex items-center gap-2 md:shrink-0 w-full md:w-auto">
{tool.paymentHint && tool.paymentPriceUSD && (
<HighlighterText variant="blue" className="h-8 py-0 flex items-center text-sm">${tool.paymentPriceUSD}</HighlighterText>
<HighlighterText variant="blue" className="h-8 py-0 flex items-center justify-center text-sm w-[25%] md:w-auto shrink-0">${tool.paymentPriceUSD}</HighlighterText>
)}
<Button
variant="customTallAccent"
size="sm"
className="h-8 rounded-[2px]"
className="h-8 rounded-[2px] w-[75%] md:w-auto md:flex-none"
onClick={() => openToolModal(tool)}
>
RUN
Expand Down Expand Up @@ -281,6 +296,22 @@ export default function McpExampleCard({
url={data?.origin}
/>
)}

{/* Tool Description Drawer (Mobile only) */}
<Drawer open={!!toolDescriptionDrawer} onOpenChange={(open) => !open && setToolDescriptionDrawer(null)}>
<DrawerContent className="max-h-[85vh] bg-background border-border">
<DrawerHeader>
<DrawerTitle className="text-foreground text-left font-mono">
{toolDescriptionDrawer?.toolName}
</DrawerTitle>
</DrawerHeader>
<div className="px-4 pb-16 overflow-y-auto">
<p className="text-base text-muted-foreground">
{toolDescriptionDrawer?.description}
</p>
</div>
</DrawerContent>
</Drawer>
</>
)
}
Expand Down
Loading