# Testimonials Section v3

> Four-card bento grid of success stories with company wordmarks, quotes, name and role, and Read story links.

A shadcn/ui block from the [@uiception](https://uiception.com) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/uiception/testimonials-section-v3).

- Page, with a live preview: https://shadcn.exchange/r/uiception/testimonials-section-v3
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/uiception/testimonials-section-v3-light-398039e6187410f6.png
- Registry item: https://uiception.com/r/testimonials-section-v3.json
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://uiception.com/r/testimonials-section-v3.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- Registry items: `button`

## Files

### `registry/new-york/blocks/testimonials-section-v3/page.tsx`

```tsx
import TestimonialsSectionV3 from "./components/testimonials-section-v3"

export default function Page() {
  return <TestimonialsSectionV3 />
}
```

### `registry/new-york/blocks/testimonials-section-v3/components/testimonials-section-v3.tsx`

```tsx
import TestimonialGrid from "./testimonial-grid"

export default function TestimonialsSectionV3() {
  return (
    <section className="py-4 md:py-6 lg:py-8">
      <div className="mx-auto max-w-6xl px-4">
        <h2 className="mb-8 text-4xl font-medium tracking-tighter sm:text-5xl md:mb-10 lg:mb-12">
          Explore Success Stories
        </h2>
        <TestimonialGrid />
      </div>
    </section>
  )
}
```

### `registry/new-york/blocks/testimonials-section-v3/components/testimonial-grid.tsx`

```tsx
import { cn } from "@/lib/utils"

import TestimonialCard from "./testimonial-card"
import { testimonials } from "../lib/testimonials-content"

const cellClassNames = [
  "sm:col-span-2 lg:col-span-1 lg:row-span-2 lg:col-start-1 lg:row-start-1",
  "lg:col-span-2 lg:col-start-2 lg:row-start-1",
  "sm:max-lg:col-span-1 lg:col-start-2 lg:row-start-2",
  "sm:max-lg:col-span-1 lg:col-start-3 lg:row-start-2",
] as const

export default function TestimonialGrid() {
  return (
    <ul className="m-0 grid list-none grid-cols-1 gap-3 p-0 sm:grid-cols-2 lg:grid-cols-[1.15fr_1fr_1fr] lg:grid-rows-[minmax(11.25rem,auto)_minmax(11.25rem,auto)] lg:items-stretch">
      {testimonials.map((testimonial, index) => (
        <li key={testimonial.id} className={cn("flex min-w-0", cellClassNames[index])}>
          <TestimonialCard testimonial={testimonial} />
        </li>
      ))}
    </ul>
  )
}
```

### `registry/new-york/blocks/testimonials-section-v3/components/testimonial-card.tsx`

```tsx
import Link from "next/link"
import { ArrowRight } from "lucide-react"

import { Button } from "@/components/ui/button"

import CompanyLogo from "./company-logo"
import type { Testimonial } from "../lib/testimonials-content"

export default function TestimonialCard({
  testimonial,
}: {
  testimonial: Testimonial
}) {
  return (
    <article className="flex min-h-full w-full flex-col gap-4 border border-border bg-muted p-5 dark:bg-background md:p-6">
      <CompanyLogo logo={testimonial.logo} />
      <blockquote className="flex-1 text-base leading-relaxed text-foreground">
        {testimonial.quote}
      </blockquote>
      <footer className="mt-auto flex flex-col gap-3">
        <div>
          <p className="font-medium">{testimonial.name}</p>
          <p className="text-sm text-muted-foreground">{testimonial.role}</p>
        </div>
        <Button variant="link" asChild className="h-auto w-fit px-0">
          <Link href={testimonial.storyHref}>
            Read story
            <ArrowRight />
          </Link>
        </Button>
      </footer>
    </article>
  )
}
```

### `registry/new-york/blocks/testimonials-section-v3/components/company-logo.tsx`

```tsx
import type { CompanyLogo } from "../lib/testimonials-content"

export default function CompanyLogo({ logo }: { logo: CompanyLogo }) {
  const Light = logo.light
  const Dark = logo.dark

  if (Dark) {
    return (
      <span className="inline-flex h-5 max-w-24 shrink-0 items-center justify-start md:h-6">
        <Light
          className="block h-full w-auto max-w-full dark:hidden"
          aria-label={logo.name}
        />
        <Dark
          className="hidden h-full w-auto max-w-full dark:block"
          aria-label={logo.name}
        />
      </span>
    )
  }

  return (
    <span className="inline-flex h-5 max-w-24 shrink-0 items-center justify-start md:h-6">
      <Light className="h-full w-auto max-w-full" aria-label={logo.name} />
    </span>
  )
}
```

### `registry/new-york/blocks/testimonials-section-v3/lib/testimonials-content.ts`

```ts
import type { ComponentType, SVGProps } from "react"

import { StripeWordmark } from "@/components/ui/svgs/stripeWordmark"
import { StripeWordmarkDark } from "@/components/ui/svgs/stripeWordmarkDark"
import { GithubWordmarkLight } from "@/components/ui/svgs/githubWordmarkLight"
import { GithubWordmarkDark } from "@/components/ui/svgs/githubWordmarkDark"
import { VercelWordmark } from "@/components/ui/svgs/vercelWordmark"
import { VercelWordmarkDark } from "@/components/ui/svgs/vercelWordmarkDark"
import { ConvexWordmarkLight } from "@/components/ui/svgs/convexWordmarkLight"
import { ConvexWordmarkDark } from "@/components/ui/svgs/convexWordmarkDark"

export type SvgComponent = ComponentType<SVGProps<SVGSVGElement>>

export type CompanyLogo = {
  name: string
  light: SvgComponent
  dark?: SvgComponent
}

export type Testimonial = {
  id: string
  quote: string
  name: string
  role: string
  storyHref: string
  logo: CompanyLogo
}

export const testimonials: Testimonial[] = [
  {
    id: "marcus-chen",
    quote:
      "We cut onboarding time in half. The API was straightforward and our team shipped the integration in a single sprint.",
    name: "Marcus Chen",
    role: "Head of Payments",
    storyHref: "#",
    logo: {
      name: "Stripe",
      light: StripeWordmark,
      dark: StripeWordmarkDark,
    },
  },
  {
    id: "david-park",
    quote:
      "Migration was painless. We moved our entire workflow over without downtime and the team picked it up immediately.",
    name: "David Park",
    role: "VP Engineering",
    storyHref: "#",
    logo: {
      name: "GitHub",
      light: GithubWordmarkLight,
      dark: GithubWordmarkDark,
    },
  },
  {
    id: "sarah-mitchell",
    quote:
      "Deploy previews changed how we ship. Every pull request gets a live URL and stakeholders review before anything hits production.",
    name: "Sarah Mitchell",
    role: "Director of Platform",
    storyHref: "#",
    logo: {
      name: "Vercel",
      light: VercelWordmark,
      dark: VercelWordmarkDark,
    },
  },
  {
    id: "jordan-ellis",
    quote:
      "Real-time sync across our stack changed how we build. Our agents finally have one source of truth they can trust.",
    name: "Jordan Ellis",
    role: "Staff Engineer",
    storyHref: "#",
    logo: {
      name: "Convex",
      light: ConvexWordmarkLight,
      dark: ConvexWordmarkDark,
    },
  },
]
```

### `components/ui/svgs/stripeWordmark.tsx`

```tsx
import type { SVGProps } from "react";

const StripeWordmark = (props: SVGProps<SVGSVGElement>) => (
  <svg {...props} viewBox="0 0 512 214">
    <path
      fill="#635bff"
      d="M512 110.08c0-36.409-17.636-65.138-51.342-65.138-33.85 0-54.33 28.73-54.33 64.854 0 42.808 24.179 64.426 58.88 64.426 16.925 0 29.725-3.84 39.396-9.244v-28.445c-9.67 4.836-20.764 7.823-34.844 7.823-13.796 0-26.027-4.836-27.591-21.618h69.547c0-1.85.284-9.245.284-12.658m-70.258-13.511c0-16.071 9.814-22.756 18.774-22.756 8.675 0 17.92 6.685 17.92 22.756zm-90.31-51.627c-13.939 0-22.899 6.542-27.876 11.094l-1.85-8.818h-31.288v165.83l35.555-7.537.143-40.249c5.12 3.698 12.657 8.96 25.173 8.96 25.458 0 48.64-20.48 48.64-65.564-.142-41.245-23.609-63.716-48.498-63.716m-8.534 97.991c-8.391 0-13.37-2.986-16.782-6.684l-.143-52.765c3.698-4.124 8.818-6.968 16.925-6.968 12.942 0 21.902 14.506 21.902 33.137 0 19.058-8.818 33.28-21.902 33.28M241.493 36.551l35.698-7.68V0l-35.698 7.538zm0 10.809h35.698v124.444h-35.698zm-38.257 10.524L200.96 47.36h-30.72v124.444h35.556V87.467c8.39-10.951 22.613-8.96 27.022-7.396V47.36c-4.551-1.707-21.191-4.836-29.582 10.524m-71.112-41.386-34.702 7.395-.142 113.92c0 21.05 15.787 36.551 36.836 36.551 11.662 0 20.195-2.133 24.888-4.693V140.8c-4.55 1.849-27.022 8.391-27.022-12.658V77.653h27.022V47.36h-27.022zM35.982 83.484c0-5.546 4.551-7.68 12.09-7.68 10.808 0 24.461 3.272 35.27 9.103V51.484c-11.804-4.693-23.466-6.542-35.27-6.542C19.2 44.942 0 60.018 0 85.192c0 39.252 54.044 32.995 54.044 49.92 0 6.541-5.688 8.675-13.653 8.675-11.804 0-26.88-4.836-38.827-11.378v33.849c13.227 5.689 26.596 8.106 38.827 8.106 29.582 0 49.92-14.648 49.92-40.106-.142-42.382-54.329-34.845-54.329-50.774"
    />
  </svg>
);

export { StripeWordmark };
```

### `components/ui/svgs/stripeWordmarkDark.tsx`

```tsx
import type { SVGProps } from "react";

const StripeWordmarkDark = (props: SVGProps<SVGSVGElement>) => (
  <svg {...props} viewBox="0 0 512 214">
    <path
      fill="#fff"
      d="M512 110.08c0-36.409-17.636-65.138-51.342-65.138-33.85 0-54.33 28.73-54.33 64.854 0 42.808 24.179 64.426 58.88 64.426 16.925 0 29.725-3.84 39.396-9.244v-28.445c-9.67 4.836-20.764 7.823-34.844 7.823-13.796 0-26.027-4.836-27.591-21.618h69.547c0-1.85.284-9.245.284-12.658m-70.258-13.511c0-16.071 9.814-22.756 18.774-22.756 8.675 0 17.92 6.685 17.92 22.756zm-90.31-51.627c-13.939 0-22.899 6.542-27.876 11.094l-1.85-8.818h-31.288v165.83l35.555-7.537.143-40.249c5.12 3.698 12.657 8.96 25.173 8.96 25.458 0 48.64-20.48 48.64-65.564-.142-41.245-23.609-63.716-48.498-63.716m-8.534 97.991c-8.391 0-13.37-2.986-16.782-6.684l-.143-52.765c3.698-4.124 8.818-6.968 16.925-6.968 12.942 0 21.902 14.506 21.902 33.137 0 19.058-8.818 33.28-21.902 33.28M241.493 36.551l35.698-7.68V0l-35.698 7.538zm0 10.809h35.698v124.444h-35.698zm-38.257 10.524L200.96 47.36h-30.72v124.444h35.556V87.467c8.39-10.951 22.613-8.96 27.022-7.396V47.36c-4.551-1.707-21.191-4.836-29.582 10.524m-71.112-41.386-34.702 7.395-.142 113.92c0 21.05 15.787 36.551 36.836 36.551 11.662 0 20.195-2.133 24.888-4.693V140.8c-4.55 1.849-27.022 8.391-27.022-12.658V77.653h27.022V47.36h-27.022zM35.982 83.484c0-5.546 4.551-7.68 12.09-7.68 10.808 0 24.461 3.272 35.27 9.103V51.484c-11.804-4.693-23.466-6.542-35.27-6.542C19.2 44.942 0 60.018 0 85.192c0 39.252 54.044 32.995 54.044 49.92 0 6.541-5.688 8.675-13.653 8.675-11.804 0-26.88-4.836-38.827-11.378v33.849c13.227 5.689 26.596 8.106 38.827 8.106 29.582 0 49.92-14.648 49.92-40.106-.142-42.382-54.329-34.845-54.329-50.774"
    />
  </svg>
);

export { StripeWordmarkDark };
```

### `components/ui/svgs/githubWordmarkLight.tsx`

```tsx
import type { SVGProps } from "react";

const GithubWordmarkLight = (props: SVGProps<SVGSVGElement>) => (
  <svg {...props} xmlSpace="preserve" viewBox="0 0 249.1 67.5">
    <path
      d="M103.4 55.9h-.1s0 .1.1 0m0 .1c-.5 0-1.8.3-3.2.3-4.4 0-5.9-2-5.9-4.6V34.2h8.9c.5 0 .9-.4.9-1.1v-9.5c0-.5-.4-.9-.9-.9h-8.9V10.9c0-.4-.3-.7-.8-.7h-12c-.5 0-.8.3-.8.7V23s-6.1 1.5-6.5 1.6-.7.5-.7.9v7.6c0 .6.4 1.1.9 1.1h6.2v18.3c0 13.6 9.5 15 16 15 3 0 6.5-.9 7.1-1.2.3-.1.5-.5.5-.9V57c0-.5-.4-.9-.8-1m132.1-12.3c0-10.1-4.1-11.4-8.4-11-3.3.2-6 1.9-6 1.9v19.6s2.7 1.9 6.8 2c5.8.2 7.6-1.8 7.6-12.5m13.6-.9c0 19.1-6.2 24.6-17 24.6-9.1 0-14.1-4.6-14.1-4.6s-.2 2.6-.5 2.9c-.2.3-.4.4-.8.4h-8.3c-.6 0-1.1-.4-1.1-.9l.1-62c0-.5.4-.9.9-.9h11.9c.5 0 .9.4.9.9l-.1 20.9s4.6-3 11.3-3h.1c6.8.1 16.7 2.6 16.7 21.7m-48.6-20.1h-11.7c-.6 0-.9.4-.9 1.1v30.3s-3.1 2.2-7.3 2.2-5.4-1.9-5.4-6.1V23.7c0-.5-.4-.9-.9-.9h-11.9c-.5 0-.9.4-.9.9v28.5c0 12.3 6.9 15.3 16.3 15.3 7.8 0 14.1-4.3 14.1-4.3s.3 2.2.4 2.5.5.5.9.5h7.5c.6 0 .9-.4.9-.9l.1-41.7c-.2-.5-.6-.9-1.2-.9m-132.2-.1H56.4c-.5 0-.9.5-.9 1.1v40.9c0 1.1.7 1.5 1.7 1.5h10.7c1.1 0 1.4-.5 1.4-1.5v-41c-.1-.5-.5-1-1-1M62.4 3.8c-4.3 0-7.7 3.4-7.7 7.7s3.4 7.7 7.7 7.7c4.2 0 7.6-3.4 7.6-7.7s-3.4-7.7-7.6-7.7m92-1.4h-11.8c-.5 0-.9.4-.9.9v22.8h-18.5V3.3c0-.5-.4-.9-.9-.9h-11.9c-.5 0-.9.4-.9.9v62c0 .5.5.9.9.9h11.9c.5 0 .9-.4.9-.9V38.8h18.5l-.1 26.5c0 .5.4.9.9.9h11.9c.5 0 .9-.4.9-.9v-62c0-.5-.4-.9-.9-.9M49.1 29.8v32c0 .2-.1.6-.3.7 0 0-7 5-18.5 5-13.8 0-30.3-4.3-30.3-33C0 5.9 14.4-.1 28.4 0c12.2 0 17.1 2.7 17.8 3.2.2.3.3.5.3.8l-2.3 9.9c0 .5-.5 1.1-1.1.9-2-.6-5-1.8-12.1-1.8-8.2 0-17 2.3-17 20.8s8.4 20.6 14.4 20.6c5.1 0 7-.6 7-.6V41.1h-8.2c-.6 0-1.1-.4-1.1-.9V29.8c0-.5.4-.9 1.1-.9h20.9c.6 0 1 .4 1 .9"
      style={{ fill: "#1b1f24" }}
    />
  </svg>
);

export { GithubWordmarkLight };
```

### `components/ui/svgs/githubWordmarkDark.tsx`

```tsx
import type { SVGProps } from "react";

const GithubWordmarkDark = (props: SVGProps<SVGSVGElement>) => (
  <svg {...props} xmlSpace="preserve" viewBox="0 0 249.1 67.5">
    <path
      d="M103.4 55.9h-.1s0 .1.1 0m0 .1c-.5 0-1.8.3-3.2.3-4.4 0-5.9-2-5.9-4.6V34.2h8.9c.5 0 .9-.4.9-1.1v-9.5c0-.5-.4-.9-.9-.9h-8.9V10.9c0-.4-.3-.7-.8-.7h-12c-.5 0-.8.3-.8.7V23s-6.1 1.5-6.5 1.6-.7.5-.7.9v7.6c0 .6.4 1.1.9 1.1h6.2v18.3c0 13.6 9.5 15 16 15 3 0 6.5-.9 7.1-1.2.3-.1.5-.5.5-.9V57c0-.5-.4-.9-.8-1m132.1-12.3c0-10.1-4.1-11.4-8.4-11-3.3.2-6 1.9-6 1.9v19.6s2.7 1.9 6.8 2c5.8.2 7.6-1.8 7.6-12.5m13.6-.9c0 19.1-6.2 24.6-17 24.6-9.1 0-14.1-4.6-14.1-4.6s-.2 2.6-.5 2.9c-.2.3-.4.4-.8.4h-8.3c-.6 0-1.1-.4-1.1-.9l.1-62c0-.5.4-.9.9-.9h11.9c.5 0 .9.4.9.9l-.1 20.9s4.6-3 11.3-3h.1c6.8.1 16.7 2.6 16.7 21.7m-48.6-20.1h-11.7c-.6 0-.9.4-.9 1.1v30.3s-3.1 2.2-7.3 2.2-5.4-1.9-5.4-6.1V23.7c0-.5-.4-.9-.9-.9h-11.9c-.5 0-.9.4-.9.9v28.5c0 12.3 6.9 15.3 16.3 15.3 7.8 0 14.1-4.3 14.1-4.3s.3 2.2.4 2.5.5.5.9.5h7.5c.6 0 .9-.4.9-.9l.1-41.7c-.2-.5-.6-.9-1.2-.9m-132.2-.1H56.4c-.5 0-.9.5-.9 1.1v40.9c0 1.1.7 1.5 1.7 1.5h10.7c1.1 0 1.4-.5 1.4-1.5v-41c-.1-.5-.5-1-1-1M62.4 3.8c-4.3 0-7.7 3.4-7.7 7.7s3.4 7.7 7.7 7.7c4.2 0 7.6-3.4 7.6-7.7s-3.4-7.7-7.6-7.7m92-1.4h-11.8c-.5 0-.9.4-.9.9v22.8h-18.5V3.3c0-.5-.4-.9-.9-.9h-11.9c-.5 0-.9.4-.9.9v62c0 .5.5.9.9.9h11.9c.5 0 .9-.4.9-.9V38.8h18.5l-.1 26.5c0 .5.4.9.9.9h11.9c.5 0 .9-.4.9-.9v-62c0-.5-.4-.9-.9-.9M49.1 29.8v32c0 .2-.1.6-.3.7 0 0-7 5-18.5 5-13.8 0-30.3-4.3-30.3-33C0 5.9 14.4-.1 28.4 0c12.2 0 17.1 2.7 17.8 3.2.2.3.3.5.3.8l-2.3 9.9c0 .5-.5 1.1-1.1.9-2-.6-5-1.8-12.1-1.8-8.2 0-17 2.3-17 20.8s8.4 20.6 14.4 20.6c5.1 0 7-.6 7-.6V41.1h-8.2c-.6 0-1.1-.4-1.1-.9V29.8c0-.5.4-.9 1.1-.9h20.9c.6 0 1 .4 1 .9"
      style={{ fill: "#fff" }}
    />
  </svg>
);

export { GithubWordmarkDark };
```

### `components/ui/svgs/vercelWordmark.tsx`

```tsx
import type { SVGProps } from "react";

const VercelWordmark = (props: SVGProps<SVGSVGElement>) => (
  <svg {...props} aria-label="Vercel logotype" viewBox="0 0 262 52">
    <path
      d="M59.8019 52L29.9019 0L0.00190544 52H59.8019ZM89.9593 49.6328L114.947 2.36365H104.139L86.9018 36.6921L69.6647 2.36365H58.8564L83.8442 49.6328H89.9593ZM260.25 2.36365V49.6329H251.302V2.36365H260.25ZM210.442 31.99C210.442 28.3062 211.211 25.0661 212.749 22.2699C214.287 19.4737 216.431 17.321 219.181 15.812C221.93 14.3029 225.146 13.5484 228.828 13.5484C232.09 13.5484 235.026 14.2585 237.636 15.6788C240.245 17.0991 242.319 19.2074 243.857 22.0036C245.395 24.7998 246.187 28.2174 246.234 32.2564V34.3202H219.88C220.066 37.2496 220.928 39.5576 222.466 41.2442C224.051 42.8864 226.171 43.7075 228.828 43.7075C230.505 43.7075 232.043 43.2637 233.441 42.376C234.839 41.4883 235.888 40.2899 236.587 38.7808L245.745 39.4466C244.626 42.7754 242.529 45.4385 239.453 47.4358C236.377 49.4331 232.835 50.4317 228.828 50.4317C225.146 50.4317 221.93 49.6772 219.181 48.1681C216.431 46.6591 214.287 44.5064 212.749 41.7102C211.211 38.914 210.442 35.6739 210.442 31.99ZM237.006 28.6612C236.68 25.7762 235.771 23.668 234.28 22.3365C232.789 20.9606 230.971 20.2726 228.828 20.2726C226.358 20.2726 224.354 21.0049 222.816 22.4696C221.278 23.9343 220.322 25.9982 219.95 28.6612H237.006ZM195.347 22.3365C196.838 23.5348 197.77 25.1993 198.143 27.3297L207.371 26.8637C207.044 24.1562 206.089 21.8039 204.505 19.8066C202.92 17.8093 200.869 16.278 198.353 15.2128C195.883 14.1032 193.157 13.5484 190.174 13.5484C186.492 13.5484 183.277 14.3029 180.527 15.812C177.777 17.321 175.634 19.4737 174.096 22.2699C172.558 25.0661 171.789 28.3062 171.789 31.99C171.789 35.6739 172.558 38.914 174.096 41.7102C175.634 44.5064 177.777 46.6591 180.527 48.1681C183.277 49.6772 186.492 50.4317 190.174 50.4317C193.25 50.4317 196.046 49.8769 198.563 48.7673C201.079 47.6133 203.13 45.9933 204.714 43.9072C206.299 41.8212 207.254 39.38 207.58 36.5838L198.283 36.1844C197.957 38.5367 197.048 40.3565 195.557 41.6436C194.065 42.8864 192.271 43.5078 190.174 43.5078C187.285 43.5078 185.048 42.5091 183.463 40.5118C181.879 38.5145 181.086 35.6739 181.086 31.99C181.086 28.3062 181.879 25.4656 183.463 23.4683C185.048 21.471 187.285 20.4723 190.174 20.4723C192.178 20.4723 193.902 21.0937 195.347 22.3365ZM149.955 14.3457H158.281L158.522 21.1369C159.113 19.2146 159.935 17.7218 160.988 16.6585C162.514 15.1166 164.642 14.3457 167.371 14.3457H170.771V21.6146H167.302C165.359 21.6146 163.763 21.8789 162.514 22.4075C161.311 22.9362 160.386 23.7732 159.739 24.9186C159.137 26.064 158.837 27.5178 158.837 29.2799V49.6328H149.955V14.3457ZM111.548 22.2699C110.01 25.0661 109.241 28.3062 109.241 31.99C109.241 35.6739 110.01 38.914 111.548 41.7102C113.086 44.5064 115.229 46.6591 117.979 48.1681C120.729 49.6772 123.944 50.4317 127.626 50.4317C131.634 50.4317 135.176 49.4331 138.252 47.4358C141.327 45.4385 143.425 42.7754 144.543 39.4466L135.385 38.7808C134.686 40.2899 133.638 41.4883 132.24 42.376C130.842 43.2637 129.304 43.7075 127.626 43.7075C124.97 43.7075 122.849 42.8864 121.265 41.2442C119.727 39.5576 118.865 37.2496 118.678 34.3202H145.032V32.2564C144.986 28.2174 144.194 24.7998 142.656 22.0036C141.118 19.2074 139.044 17.0991 136.434 15.6788C133.824 14.2585 130.888 13.5484 127.626 13.5484C123.944 13.5484 120.729 14.3029 117.979 15.812C115.229 17.321 113.086 19.4737 111.548 22.2699ZM133.079 22.3365C134.57 23.668 135.479 25.7762 135.805 28.6612H118.748C119.121 25.9982 120.076 23.9343 121.614 22.4696C123.152 21.0049 125.156 20.2726 127.626 20.2726C129.77 20.2726 131.587 20.9606 133.079 22.3365Z"
      fill="black"
    />
  </svg>
);

export { VercelWordmark };
```

### `components/ui/svgs/vercelWordmarkDark.tsx`

```tsx
import type { SVGProps } from "react";

const VercelWordmarkDark = (props: SVGProps<SVGSVGElement>) => (
  <svg {...props} aria-label="Vercel logotype" viewBox="0 0 262 52">
    <path
      d="M59.8019 52L29.9019 0L0.00190544 52H59.8019ZM89.9593 49.6328L114.947 2.36365H104.139L86.9018 36.6921L69.6647 2.36365H58.8564L83.8442 49.6328H89.9593ZM260.25 2.36365V49.6329H251.302V2.36365H260.25ZM210.442 31.99C210.442 28.3062 211.211 25.0661 212.749 22.2699C214.287 19.4737 216.431 17.321 219.181 15.812C221.93 14.3029 225.146 13.5484 228.828 13.5484C232.09 13.5484 235.026 14.2585 237.636 15.6788C240.245 17.0991 242.319 19.2074 243.857 22.0036C245.395 24.7998 246.187 28.2174 246.234 32.2564V34.3202H219.88C220.066 37.2496 220.928 39.5576 222.466 41.2442C224.051 42.8864 226.171 43.7075 228.828 43.7075C230.505 43.7075 232.043 43.2637 233.441 42.376C234.839 41.4883 235.888 40.2899 236.587 38.7808L245.745 39.4466C244.626 42.7754 242.529 45.4385 239.453 47.4358C236.377 49.4331 232.835 50.4317 228.828 50.4317C225.146 50.4317 221.93 49.6772 219.181 48.1681C216.431 46.6591 214.287 44.5064 212.749 41.7102C211.211 38.914 210.442 35.6739 210.442 31.99ZM237.006 28.6612C236.68 25.7762 235.771 23.668 234.28 22.3365C232.789 20.9606 230.971 20.2726 228.828 20.2726C226.358 20.2726 224.354 21.0049 222.816 22.4696C221.278 23.9343 220.322 25.9982 219.95 28.6612H237.006ZM195.347 22.3365C196.838 23.5348 197.77 25.1993 198.143 27.3297L207.371 26.8637C207.044 24.1562 206.089 21.8039 204.505 19.8066C202.92 17.8093 200.869 16.278 198.353 15.2128C195.883 14.1032 193.157 13.5484 190.174 13.5484C186.492 13.5484 183.277 14.3029 180.527 15.812C177.777 17.321 175.634 19.4737 174.096 22.2699C172.558 25.0661 171.789 28.3062 171.789 31.99C171.789 35.6739 172.558 38.914 174.096 41.7102C175.634 44.5064 177.777 46.6591 180.527 48.1681C183.277 49.6772 186.492 50.4317 190.174 50.4317C193.25 50.4317 196.046 49.8769 198.563 48.7673C201.079 47.6133 203.13 45.9933 204.714 43.9072C206.299 41.8212 207.254 39.38 207.58 36.5838L198.283 36.1844C197.957 38.5367 197.048 40.3565 195.557 41.6436C194.065 42.8864 192.271 43.5078 190.174 43.5078C187.285 43.5078 185.048 42.5091 183.463 40.5118C181.879 38.5145 181.086 35.6739 181.086 31.99C181.086 28.3062 181.879 25.4656 183.463 23.4683C185.048 21.471 187.285 20.4723 190.174 20.4723C192.178 20.4723 193.902 21.0937 195.347 22.3365ZM149.955 14.3457H158.281L158.522 21.1369C159.113 19.2146 159.935 17.7218 160.988 16.6585C162.514 15.1166 164.642 14.3457 167.371 14.3457H170.771V21.6146H167.302C165.359 21.6146 163.763 21.8789 162.514 22.4075C161.311 22.9362 160.386 23.7732 159.739 24.9186C159.137 26.064 158.837 27.5178 158.837 29.2799V49.6328H149.955V14.3457ZM111.548 22.2699C110.01 25.0661 109.241 28.3062 109.241 31.99C109.241 35.6739 110.01 38.914 111.548 41.7102C113.086 44.5064 115.229 46.6591 117.979 48.1681C120.729 49.6772 123.944 50.4317 127.626 50.4317C131.634 50.4317 135.176 49.4331 138.252 47.4358C141.327 45.4385 143.425 42.7754 144.543 39.4466L135.385 38.7808C134.686 40.2899 133.638 41.4883 132.24 42.376C130.842 43.2637 129.304 43.7075 127.626 43.7075C124.97 43.7075 122.849 42.8864 121.265 41.2442C119.727 39.5576 118.865 37.2496 118.678 34.3202H145.032V32.2564C144.986 28.2174 144.194 24.7998 142.656 22.0036C141.118 19.2074 139.044 17.0991 136.434 15.6788C133.824 14.2585 130.888 13.5484 127.626 13.5484C123.944 13.5484 120.729 14.3029 117.979 15.812C115.229 17.321 113.086 19.4737 111.548 22.2699ZM133.079 22.3365C134.57 23.668 135.479 25.7762 135.805 28.6612H118.748C119.121 25.9982 120.076 23.9343 121.614 22.4696C123.152 21.0049 125.156 20.2726 127.626 20.2726C129.77 20.2726 131.587 20.9606 133.079 22.3365Z"
      fill="white"
    />
  </svg>
);

export { VercelWordmarkDark };
```

### `components/ui/svgs/convexWordmarkLight.tsx`

```tsx
import type { SVGProps } from "react";

const ConvexWordmarkLight = (props: SVGProps<SVGSVGElement>) => (
  <svg
    {...props}
    xmlSpace="preserve"
    style={{
      fillRule: "evenodd",
      clipRule: "evenodd",
      strokeLinejoin: "round",
      strokeMiterlimit: "2",
    }}
    viewBox="0 0 600 150"
  >
    <path
      d="m512.51 75.13-22.19-29.38h25.72l45.39 59.77h-25.97l-10.09-13.37-10.09 13.37h-25.85l23.08-30.39ZM534.89 45.75h25.6l-19.65 26.17-13-16.77 7.05-9.4ZM159.9 98.9c-6.18-5.25-9.27-13.01-9.27-23.26 0-10.25 3.15-18.01 9.46-23.26 6.3-5.25 14.92-7.88 25.85-7.88 4.54 0 8.55.31 12.04.95 3.49.63 6.83 1.7 10.02 3.22V65.3c-4.96-2.35-10.59-3.53-16.89-3.53-5.55 0-9.65 1.05-12.29 3.15-2.65 2.1-3.97 5.67-3.97 10.72 0 4.88 1.3 8.41 3.91 10.59 2.6 2.19 6.72 3.28 12.36 3.28 5.97 0 11.64-1.39 17.02-4.16v17.4c-5.97 2.69-13.41 4.03-22.32 4.03-11.11 0-19.74-2.63-25.92-7.88ZM213.52 75.63c0-10.17 2.9-17.9 8.7-23.2 5.8-5.3 14.54-7.94 26.23-7.94 11.77 0 20.57 2.65 26.42 7.94 5.84 5.29 8.76 13.03 8.76 23.2 0 20.76-11.73 31.14-35.18 31.14-23.29.01-34.93-10.37-34.93-31.14Zm43.32 10.6c1.72-2.19 2.58-5.72 2.58-10.59 0-4.79-.86-8.3-2.58-10.53-1.72-2.23-4.52-3.34-8.39-3.34-3.78 0-6.52 1.12-8.2 3.34-1.68 2.23-2.52 5.74-2.52 10.53 0 4.88.84 8.41 2.52 10.59 1.68 2.19 4.41 3.28 8.2 3.28 3.87 0 6.66-1.1 8.39-3.28ZM289.15 45.75h22.19l.63 4.54c2.44-1.68 5.55-3.07 9.33-4.16 3.78-1.09 7.69-1.64 11.73-1.64 7.48 0 12.94 1.85 16.39 5.55 3.45 3.7 5.17 9.41 5.17 17.15v38.33h-23.7V69.58c0-2.69-.61-4.62-1.83-5.8-1.22-1.18-3.26-1.76-6.12-1.76-1.76 0-3.57.4-5.42 1.2-1.85.8-3.4 1.83-4.67 3.09v39.21h-23.7V45.75ZM354.66 45.75h24.71l11.35 35.05 11.35-35.05h24.71l-23.58 59.77h-24.97l-23.57-59.77Z"
      style={{ fill: "#111", fillRule: "nonzero" }}
    />
    <path
      d="M434.24 100.38c-7.12-5.34-10.45-14.61-10.45-24.62 0-9.75 2.65-17.78 8.7-23.33 6.05-5.55 15.27-7.94 26.91-7.94 10.71 0 19.13 2.48 25.28 7.44 6.14 4.96 9.22 11.73 9.22 20.3V82.7h-45.07c1.12 3.11 2.54 5.36 6.03 6.75 3.49 1.39 8.36 2.08 14.59 2.08 3.72 0 7.52-.29 11.38-.88 1.36-.21 3.6-.54 4.78-.79v14.53c-5.89 1.6-13.74 2.4-22.59 2.4-11.91-.01-21.66-1.07-28.78-6.41ZM469 69.84c0-2.96-3.41-9.33-10.26-9.33-6.18 0-10.26 6.27-10.26 9.33H469Z"
      style={{ fill: "#111", fillRule: "nonzero" }}
    />
    <path
      d="M100.22 100.4c13.1-1.43 25.45-8.29 32.25-19.74-3.22 28.32-34.73 46.22-60.45 35.23-2.37-1.01-4.41-2.69-5.81-4.85-5.78-8.92-7.68-20.27-4.95-30.57 7.8 13.23 23.66 21.34 38.96 19.93Z"
      style={{ fill: "#f3b01c", fillRule: "nonzero" }}
    />
    <path
      d="M60.78 72.16c-5.31 12.06-5.54 26.18.97 37.8C38.84 93.02 39.09 56.77 61.47 40c2.07-1.55 4.53-2.47 7.11-2.61 10.61-.55 21.39 3.48 28.95 10.99-15.36.15-30.32 9.82-36.75 23.78Z"
      style={{ fill: "#8d2676", fillRule: "nonzero" }}
    />
    <path
      d="M104.94 52.09c-7.75-10.62-19.88-17.85-33.17-18.07 25.69-11.46 57.29 7.12 60.73 34.59.32 2.55-.1 5.15-1.25 7.45-4.8 9.58-13.7 17.01-24.1 19.76 7.62-13.89 6.68-30.86-2.21-43.73Z"
      style={{ fill: "#ee342f", fillRule: "nonzero" }}
    />
  </svg>
);

export { ConvexWordmarkLight };
```

### `components/ui/svgs/convexWordmarkDark.tsx`

```tsx
import type { SVGProps } from "react";

const ConvexWordmarkDark = (props: SVGProps<SVGSVGElement>) => (
  <svg
    {...props}
    xmlSpace="preserve"
    style={{
      fillRule: "evenodd",
      clipRule: "evenodd",
      strokeLinejoin: "round",
      strokeMiterlimit: "2",
    }}
    viewBox="0 0 600 150"
  >
    <path
      d="m512.51 75.13-22.19-29.38h25.72l45.39 59.77h-25.97l-10.09-13.37-10.09 13.37h-25.85l23.08-30.39ZM534.89 45.75h25.6l-19.65 26.17-13-16.77 7.05-9.4ZM159.9 98.9c-6.18-5.25-9.27-13.01-9.27-23.26 0-10.25 3.15-18.01 9.46-23.26 6.3-5.25 14.92-7.88 25.85-7.88 4.54 0 8.55.31 12.04.95 3.49.63 6.83 1.7 10.02 3.22V65.3c-4.96-2.35-10.59-3.53-16.89-3.53-5.55 0-9.65 1.05-12.29 3.15-2.65 2.1-3.97 5.67-3.97 10.72 0 4.88 1.3 8.41 3.91 10.59 2.6 2.19 6.72 3.28 12.36 3.28 5.97 0 11.64-1.39 17.02-4.16v17.4c-5.97 2.69-13.41 4.03-22.32 4.03-11.11 0-19.74-2.63-25.92-7.88ZM213.52 75.63c0-10.17 2.9-17.9 8.7-23.2 5.8-5.3 14.54-7.94 26.23-7.94 11.77 0 20.57 2.65 26.42 7.94 5.84 5.29 8.76 13.03 8.76 23.2 0 20.76-11.73 31.14-35.18 31.14-23.29.01-34.93-10.37-34.93-31.14Zm43.32 10.6c1.72-2.19 2.58-5.72 2.58-10.59 0-4.79-.86-8.3-2.58-10.53-1.72-2.23-4.52-3.34-8.39-3.34-3.78 0-6.52 1.12-8.2 3.34-1.68 2.23-2.52 5.74-2.52 10.53 0 4.88.84 8.41 2.52 10.59 1.68 2.19 4.41 3.28 8.2 3.28 3.87 0 6.66-1.1 8.39-3.28ZM289.15 45.75h22.19l.63 4.54c2.44-1.68 5.55-3.07 9.33-4.16 3.78-1.09 7.69-1.64 11.73-1.64 7.48 0 12.94 1.85 16.39 5.55 3.45 3.7 5.17 9.41 5.17 17.15v38.33h-23.7V69.58c0-2.69-.61-4.62-1.83-5.8-1.22-1.18-3.26-1.76-6.12-1.76-1.76 0-3.57.4-5.42 1.2-1.85.8-3.4 1.83-4.67 3.09v39.21h-23.7V45.75ZM354.66 45.75h24.71l11.35 35.05 11.35-35.05h24.71l-23.58 59.77h-24.97l-23.57-59.77Z"
      style={{ fill: "#fff", fillRule: "nonzero" }}
    />
    <path
      d="M434.24 100.38c-7.12-5.34-10.45-14.61-10.45-24.62 0-9.75 2.65-17.78 8.7-23.33 6.05-5.55 15.27-7.94 26.91-7.94 10.71 0 19.13 2.48 25.28 7.44 6.14 4.96 9.22 11.73 9.22 20.3V82.7h-45.07c1.12 3.11 2.54 5.36 6.03 6.75 3.49 1.39 8.36 2.08 14.59 2.08 3.72 0 7.52-.29 11.38-.88 1.36-.21 3.6-.54 4.78-.79v14.53c-5.89 1.6-13.74 2.4-22.59 2.4-11.91-.01-21.66-1.07-28.78-6.41ZM469 69.84c0-2.96-3.41-9.33-10.26-9.33-6.18 0-10.26 6.27-10.26 9.33H469Z"
      style={{ fill: "#fff", fillRule: "nonzero" }}
    />
    <path
      d="M100.22 100.4c13.1-1.43 25.45-8.29 32.25-19.74-3.22 28.32-34.73 46.22-60.45 35.23-2.37-1.01-4.41-2.69-5.81-4.85-5.78-8.92-7.68-20.27-4.95-30.57 7.8 13.23 23.66 21.34 38.96 19.93Z"
      style={{ fill: "#f3b01c", fillRule: "nonzero" }}
    />
    <path
      d="M60.78 72.16c-5.31 12.06-5.54 26.18.97 37.8C38.84 93.02 39.09 56.77 61.47 40c2.07-1.55 4.53-2.47 7.11-2.61 10.61-.55 21.39 3.48 28.95 10.99-15.36.15-30.32 9.82-36.75 23.78Z"
      style={{ fill: "#8d2676", fillRule: "nonzero" }}
    />
    <path
      d="M104.94 52.09c-7.75-10.62-19.88-17.85-33.17-18.07 25.69-11.46 57.29 7.12 60.73 34.59.32 2.55-.1 5.15-1.25 7.45-4.8 9.58-13.7 17.01-24.1 19.76 7.62-13.89 6.68-30.86-2.21-43.73Z"
      style={{ fill: "#ee342f", fillRule: "nonzero" }}
    />
  </svg>
);

export { ConvexWordmarkDark };
```
