'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 (
{item.description}
Have a tool you’d like to integrate?
Request tools