blob: 23e3ab6dc7f2606fdf954710e97f2b654a64c5a0 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
"use client";
import { INTEGRATIONS, DOCS_URL } from "@/lib/constants";
import { ArrowUpRight } from "lucide-react";
import { INTEGRATION_ICONS, INTEGRATION_COLORS } from "@/components/icons/IntegrationLogos";
import { BlurFade } from "@/components/ui/blur-fade";
import { Marquee } from "@/components/ui/marquee";
export default function Integrations() {
const firstRow = INTEGRATIONS.slice(0, 5);
const secondRow = INTEGRATIONS.slice(5);
return (
<section id="integrations" className="py-20 sm:py-28 bg-[var(--card-bg)] overflow-hidden">
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<BlurFade delay={0.1} inView>
<div className="text-center mb-16">
<h2 className="text-3xl font-bold sm:text-4xl">
Works with your stack
</h2>
<p className="mt-3 text-[var(--muted)] text-lg max-w-2xl mx-auto">
Burr integrates with the tools and frameworks you already use. No
lock-in, no wrappers.
</p>
</div>
</BlurFade>
{/* Marquee rows */}
<div className="relative">
<div className="pointer-events-none absolute inset-y-0 left-0 z-10 w-24 bg-gradient-to-r from-[var(--card-bg)] to-transparent" />
<div className="pointer-events-none absolute inset-y-0 right-0 z-10 w-24 bg-gradient-to-l from-[var(--card-bg)] to-transparent" />
<Marquee pauseOnHover className="[--duration:30s] [--gap:1.5rem] mb-4">
{firstRow.map((integration) => (
<IntegrationCard key={integration.name} integration={integration} />
))}
</Marquee>
<Marquee pauseOnHover reverse className="[--duration:30s] [--gap:1.5rem]">
{secondRow.map((integration) => (
<IntegrationCard key={integration.name} integration={integration} />
))}
</Marquee>
</div>
<BlurFade delay={0.3} inView>
<div className="mt-12 text-center">
<a
href={DOCS_URL}
className="inline-flex items-center gap-1.5 text-sm font-medium text-[#7B2FBE] hover:text-[#9B5FDE] transition-colors"
>
View all integrations
<ArrowUpRight className="h-4 w-4" />
</a>
</div>
</BlurFade>
</div>
</section>
);
}
function IntegrationCard({
integration,
}: {
integration: (typeof INTEGRATIONS)[number];
}) {
const Icon = INTEGRATION_ICONS[integration.name];
const color = INTEGRATION_COLORS[integration.name];
return (
<div className="flex items-center gap-4 rounded-2xl border border-[var(--card-border)] bg-[var(--bg)] px-6 py-5 w-[260px] shrink-0 hover:border-[#7B2FBE]/20 hover:shadow-lg transition-all duration-300">
<div
className="flex h-12 w-12 shrink-0 items-center justify-center rounded-xl"
style={{ backgroundColor: `${color}15` }}
>
{Icon && <Icon className="h-6 w-6" style={{ color }} />}
</div>
<div>
<h3 className="font-semibold">{integration.name}</h3>
<span className="text-xs text-[var(--muted)]">
{integration.category}
</span>
</div>
</div>
);
}