'use client'; import { useCallback, useLayoutEffect, useRef, useState } from 'react'; import { ArrowUpRight, ChartNoAxesCombined, FileChartColumn, Settings2, } from 'lucide-react'; import Image from 'next/image'; import Link from 'next/link'; import { cn } from '@/utils/cn'; const tabs = [ { icon: Settings2, label: 'Workflow', items: [ { name: 'Asana', logo: 'https://alignui.com/images/blocks/integrations-logo-asana.svg', description: 'Assign work, set priorities, and keep every project moving.', }, { name: 'Monday', logo: 'https://alignui.com/images/blocks/integrations-logo-monday.svg', description: 'Build custom boards, automate handoffs, and align your team.', }, { name: 'Notion', logo: 'https://alignui.com/images/blocks/integrations-logo-notion.svg', description: 'Document processes, share specs, and centralize context.', }, ], }, { icon: ChartNoAxesCombined, label: 'Growth', items: [ { name: 'Slack', logo: 'https://alignui.com/images/blocks/integrations-logo-slack.svg', description: 'Collaborate in real time, track updates, and keep teams connected.', }, { name: 'Linear', logo: 'https://alignui.com/images/blocks/integrations-logo-linear.svg', description: 'Streamline task management, track progress, and resolve issues.', }, { name: 'ClickUp', logo: 'https://alignui.com/images/blocks/integrations-logo-clickup.svg', description: 'Plan projects, track milestones, and manage workloads.', }, ], }, { icon: FileChartColumn, label: 'Reporting', items: [ { name: 'Zapier', logo: 'https://alignui.com/images/blocks/integrations-logo-zapier.svg', description: 'Connect your stack and push reporting data wherever it belongs.', }, { name: 'Mailchimp', logo: 'https://alignui.com/images/blocks/integrations-logo-mailchimp.svg', description: 'Measure campaign performance and sync audience insights.', }, { name: 'Zendesk', logo: 'https://alignui.com/images/blocks/integrations-logo-zendesk.svg', description: 'Track support volume, response times, and customer sentiment.', }, ], }, ]; function IntegrationTabs({ active, onChange, }: { active: number; onChange: (index: number) => void; }) { const tabRefs = useRef<(HTMLButtonElement | null)[]>([]); const [indicator, setIndicator] = useState({ left: 0, top: 0, width: 0, height: 0, }); const measure = useCallback(() => { const element = tabRefs.current[active]; if (!element) return; setIndicator({ left: element.offsetLeft, top: element.offsetTop, width: element.offsetWidth, height: element.offsetHeight, }); }, [active]); useLayoutEffect(() => { measure(); const observer = new ResizeObserver(measure); tabRefs.current.forEach((element) => { if (element) observer.observe(element); }); return () => observer.disconnect(); }, [measure]); return (
{tabs.map((tab, index) => ( ))}
); } export default function CategorizedWorkflowIntegrations() { const [active, setActive] = useState(1); const activeTab = tabs[active]; return (
Apps & Integrations

Essential integrations for
better workflows

{activeTab.items.map((item) => (
{item.name}

{item.name}

{item.description}

))}

Have a tool you’d like to integrate?

Request tools
); }