"use client"; import Image from "next/image"; import type React from "react"; interface Integration { name: string; icon: string; } const INTEGRATIONS: Integration[] = [ // Search { name: "Tavily", icon: "/connectors/tavily.svg" }, { name: "Elasticsearch", icon: "/connectors/elasticsearch.svg" }, { name: "Baidu Search", icon: "/connectors/baidu-search.svg" }, { name: "SearXNG", icon: "/connectors/searxng.svg" }, // Communication { name: "Slack", icon: "/connectors/slack.svg" }, { name: "Discord", icon: "/connectors/discord.svg" }, { name: "Gmail", icon: "/connectors/google-gmail.svg" }, { name: "Microsoft Teams", icon: "/connectors/microsoft-teams.svg" }, // Project Management { name: "Linear", icon: "/connectors/linear.svg" }, { name: "Jira", icon: "/connectors/jira.svg" }, { name: "ClickUp", icon: "/connectors/clickup.svg" }, { name: "Airtable", icon: "/connectors/airtable.svg" }, // Documentation & Knowledge { name: "Confluence", icon: "/connectors/confluence.svg" }, { name: "Notion", icon: "/connectors/notion.svg" }, { name: "BookStack", icon: "/connectors/bookstack.svg" }, { name: "Obsidian", icon: "/connectors/obsidian.svg" }, // Cloud Storage { name: "Google Drive", icon: "/connectors/google-drive.svg" }, // Development { name: "GitHub", icon: "/connectors/github.svg" }, // Productivity { name: "Google Calendar", icon: "/connectors/google-calendar.svg" }, { name: "Luma", icon: "/connectors/luma.svg" }, // Media { name: "YouTube", icon: "/connectors/youtube.svg" }, // Search { name: "Linkup", icon: "/connectors/linkup.svg" }, // Meetings { name: "Circleback", icon: "/connectors/circleback.svg" }, // AI { name: "MCP", icon: "/connectors/modelcontextprotocol.svg" }, ]; // 5 vertical columns — 23 icons spread across categories const COLUMNS: number[][] = [ [2, 5, 10, 0, 21, 11], [1, 7, 20, 17], [13, 6, 23, 4, 16], [12, 8, 15, 18], [3, 9, 14, 22, 19], ]; // Different scroll speeds per column for organic feel (seconds) const SCROLL_DURATIONS = [26, 32, 22, 30, 28]; function IntegrationCard({ integration }: { integration: Integration }) { return (
{integration.name}
); } function ScrollingColumn({ cards, scrollUp, duration, colIndex, isEdge, isEdgeAdjacent, }: { cards: number[]; scrollUp: boolean; duration: number; colIndex: number; isEdge: boolean; isEdgeAdjacent: boolean; }) { // Edge columns get a heavy vertical mask; edge-adjacent columns get a lighter one to smooth the transition const columnMask = isEdge ? { maskImage: "linear-gradient(to bottom, transparent 0%, transparent 20%, black 40%, black 60%, transparent 80%, transparent 100%)", WebkitMaskImage: "linear-gradient(to bottom, transparent 0%, transparent 20%, black 40%, black 60%, transparent 80%, transparent 100%)", } : isEdgeAdjacent ? { maskImage: "linear-gradient(to bottom, transparent 0%, transparent 10%, black 30%, black 70%, transparent 90%, transparent 100%)", WebkitMaskImage: "linear-gradient(to bottom, transparent 0%, transparent 10%, black 30%, black 70%, transparent 90%, transparent 100%)", } : {}; const cardSet = cards.map((integrationIndex, i) => ( )); return (
{/* Outer div has NO gap — each inner copy uses pb matching the gap so both halves are identical in height → seamless -50% loop */}
{cardSet}
{cardSet}
); } export default function ExternalIntegrations() { return (
{/* Heading */}

Integrate with your
team's most important tools

{/* Scrolling columns container — masked at edges so the page background shows through seamlessly */}
{/* 5 scrolling columns */}
{COLUMNS.map((column, colIndex) => ( ))}
); }