e30e75b5d4
Changesets / Create Version PR (push) Has been cancelled
Deploy Shadcn Registry / Deploy Production (push) Has been cancelled
Template Metrics / LOC + Bundle Size (push) Has been cancelled
Code Quality / Oxlint + Oxfmt (push) Has been cancelled
Code Quality / Template Sync (push) Has been cancelled
Code Quality / Build Changed Packages (push) Has been cancelled
Code Quality / Test Changed Packages (push) Has been cancelled
Deploy Expo Example / Deploy Production (push) Has been cancelled
Deploy Ink Example / Deploy Production (push) Has been cancelled
Python Tests / pytest (assistant-stream, 3.10) (push) Has been cancelled
Python Tests / pytest (assistant-stream, 3.12) (push) Has been cancelled
Python Tests / pytest (assistant-ui-sync-server-api, 3.10) (push) Has been cancelled
Python Tests / pytest (assistant-ui-sync-server-api, 3.12) (push) Has been cancelled
92 lines
2.2 KiB
TypeScript
92 lines
2.2 KiB
TypeScript
"use client";
|
|
|
|
import { cn } from "@/lib/utils";
|
|
import { useMediaQuery } from "@/hooks/use-media-query";
|
|
import Image from "next/image";
|
|
import Link from "next/link";
|
|
|
|
const LOGOS = [
|
|
{
|
|
src: "/icons/cust/langchain.svg",
|
|
alt: "Langchain",
|
|
height: "h-7",
|
|
href: "https://langchain.com?ref=assistant-ui",
|
|
},
|
|
{
|
|
src: "/icons/cust/athenaintel.png",
|
|
alt: "Athena Intelligence",
|
|
height: "h-11",
|
|
href: "https://athenaintelligence.ai?ref=assistant-ui",
|
|
},
|
|
{
|
|
src: "/icons/cust/browseruse.svg",
|
|
alt: "Browseruse",
|
|
height: "h-6",
|
|
href: "https://browser-use.com/?ref=assistant-ui",
|
|
},
|
|
{
|
|
src: "/icons/cust/stack.svg",
|
|
alt: "Stack",
|
|
height: "h-5",
|
|
href: "https://stack-ai.com?ref=assistant-ui",
|
|
},
|
|
{
|
|
src: "/icons/cust/mastra.svg",
|
|
alt: "Mastra",
|
|
height: "h-7",
|
|
href: "https://mastra.ai?ref=assistant-ui",
|
|
},
|
|
] as const;
|
|
|
|
function LogoList() {
|
|
return (
|
|
<>
|
|
{LOGOS.map((logo) => (
|
|
<Link
|
|
key={logo.alt}
|
|
href={logo.href}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
<Image
|
|
src={logo.src}
|
|
alt={logo.alt}
|
|
width={100}
|
|
height={44}
|
|
className={cn(
|
|
"w-auto shrink-0 opacity-40 invert transition-opacity hover:opacity-100 dark:invert-0",
|
|
logo.height,
|
|
)}
|
|
/>
|
|
</Link>
|
|
))}
|
|
</>
|
|
);
|
|
}
|
|
|
|
export function TrustedBy() {
|
|
const isMobile = useMediaQuery("(max-width: 1080px)");
|
|
|
|
return (
|
|
<section className="flex flex-col items-center gap-4">
|
|
{isMobile ? (
|
|
<div className="flex w-full gap-(--gap) overflow-hidden [--duration:20s] [--gap:3rem]">
|
|
{Array.from({ length: 4 }).map((_, i) => (
|
|
<div
|
|
key={i}
|
|
className="animate-marquee flex shrink-0 items-center justify-around gap-(--gap)"
|
|
>
|
|
<LogoList />
|
|
</div>
|
|
))}
|
|
</div>
|
|
) : (
|
|
<div className="flex w-full items-center justify-around">
|
|
<LogoList />
|
|
</div>
|
|
)}
|
|
<p className="text-muted-foreground text-sm">and teams everywhere</p>
|
|
</section>
|
|
);
|
|
}
|