Components

Button

Displays a button or a component that looks like a button.

Installation

Cortexcn
pnpm dlx shadcn@latest add @cortexcn/button

Usage

import { Button, buttonVariants } from "@/components/button";

Examples

Variants and sizes

import { Button } from "@/components/button"export function ButtonVariantsAndSizes() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Button size="xs">Default</Button>        <Button size="xs" variant="secondary">          Secondary        </Button>        <Button size="xs" variant="outline">          Outline        </Button>        <Button size="xs" variant="ghost">          Ghost        </Button>        <Button size="xs" variant="destructive">          Destructive        </Button>        <Button size="xs" variant="link">          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="sm">Default</Button>        <Button size="sm" variant="secondary">          Secondary        </Button>        <Button size="sm" variant="outline">          Outline        </Button>        <Button size="sm" variant="ghost">          Ghost        </Button>        <Button size="sm" variant="destructive">          Destructive        </Button>        <Button size="sm" variant="link">          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button>Default</Button>        <Button variant="secondary">Secondary</Button>        <Button variant="outline">Outline</Button>        <Button variant="ghost">Ghost</Button>        <Button variant="destructive">Destructive</Button>        <Button variant="link">Link</Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="lg">Default</Button>        <Button size="lg" variant="secondary">          Secondary        </Button>        <Button size="lg" variant="outline">          Outline        </Button>        <Button size="lg" variant="ghost">          Ghost        </Button>        <Button size="lg" variant="destructive">          Destructive        </Button>        <Button size="lg" variant="link">          Link        </Button>      </div>    </div>  )}

Icon right

import { Button } from "@/components/button"import { ArrowRightIcon } from "lucide-react"export function ButtonIconRight() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Button size="xs">          Default{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="xs" variant="secondary">          Secondary{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="xs" variant="outline">          Outline{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="xs" variant="ghost">          Ghost{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="xs" variant="destructive">          Destructive{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="xs" variant="link">          Link{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="sm">          Default          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="sm" variant="secondary">          Secondary{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="sm" variant="outline">          Outline{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="sm" variant="ghost">          Ghost{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="sm" variant="destructive">          Destructive{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="sm" variant="link">          Link{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button>          Default{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button variant="secondary">          Secondary{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button variant="outline">          Outline{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button variant="ghost">          Ghost{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button variant="destructive">          Destructive{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button variant="link">          Link{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="lg">          Default{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="lg" variant="secondary">          Secondary{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="lg" variant="outline">          Outline{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="lg" variant="ghost">          Ghost{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="lg" variant="destructive">          Destructive{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>        <Button size="lg" variant="link">          Link{" "}          <ArrowRightIcon data-icon="inline-end" />        </Button>      </div>    </div>  )}

Icon left

import { Button } from "@/components/button"import { ArrowLeftCircleIcon } from "lucide-react"export function ButtonIconLeft() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Button size="xs">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Default        </Button>        <Button size="xs" variant="secondary">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Secondary        </Button>        <Button size="xs" variant="outline">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Outline        </Button>        <Button size="xs" variant="ghost">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Ghost        </Button>        <Button size="xs" variant="destructive">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Destructive        </Button>        <Button size="xs" variant="link">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="sm">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Default        </Button>        <Button size="sm" variant="secondary">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Secondary        </Button>        <Button size="sm" variant="outline">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Outline        </Button>        <Button size="sm" variant="ghost">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Ghost        </Button>        <Button size="sm" variant="destructive">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Destructive        </Button>        <Button size="sm" variant="link">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button>          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Default        </Button>        <Button variant="secondary">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Secondary        </Button>        <Button variant="outline">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Outline        </Button>        <Button variant="ghost">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Ghost        </Button>        <Button variant="destructive">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Destructive        </Button>        <Button variant="link">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="lg">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Default        </Button>        <Button size="lg" variant="secondary">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Secondary        </Button>        <Button size="lg" variant="outline">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Outline        </Button>        <Button size="lg" variant="ghost">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Ghost        </Button>        <Button size="lg" variant="destructive">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Destructive        </Button>        <Button size="lg" variant="link">          <ArrowLeftCircleIcon data-icon="inline-start" />{" "}          Link        </Button>      </div>    </div>  )}

Icon only

import { Button } from "@/components/button"import { ArrowRightIcon } from "lucide-react"export function ButtonIconOnly() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Button size="icon-xs">          <ArrowRightIcon />        </Button>        <Button size="icon-xs" variant="secondary">          <ArrowRightIcon />        </Button>        <Button size="icon-xs" variant="outline">          <ArrowRightIcon />        </Button>        <Button size="icon-xs" variant="ghost">          <ArrowRightIcon />        </Button>        <Button size="icon-xs" variant="destructive">          <ArrowRightIcon />        </Button>        <Button size="icon-xs" variant="link">          <ArrowRightIcon />        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="icon-sm">          <ArrowRightIcon />        </Button>        <Button size="icon-sm" variant="secondary">          <ArrowRightIcon />        </Button>        <Button size="icon-sm" variant="outline">          <ArrowRightIcon />        </Button>        <Button size="icon-sm" variant="ghost">          <ArrowRightIcon />        </Button>        <Button size="icon-sm" variant="destructive">          <ArrowRightIcon />        </Button>        <Button size="icon-sm" variant="link">          <ArrowRightIcon />        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="icon">          <ArrowRightIcon />        </Button>        <Button size="icon" variant="secondary">          <ArrowRightIcon />        </Button>        <Button size="icon" variant="outline">          <ArrowRightIcon />        </Button>        <Button size="icon" variant="ghost">          <ArrowRightIcon />        </Button>        <Button size="icon" variant="destructive">          <ArrowRightIcon />        </Button>        <Button size="icon" variant="link">          <ArrowRightIcon />        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="icon-lg">          <ArrowRightIcon />        </Button>        <Button size="icon-lg" variant="secondary">          <ArrowRightIcon />        </Button>        <Button size="icon-lg" variant="outline">          <ArrowRightIcon />        </Button>        <Button size="icon-lg" variant="ghost">          <ArrowRightIcon />        </Button>        <Button size="icon-lg" variant="destructive">          <ArrowRightIcon />        </Button>        <Button size="icon-lg" variant="link">          <ArrowRightIcon />        </Button>      </div>    </div>  )}

Invalid states

import { Button } from "@/components/button"export function ButtonInvalidStates() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Button size="xs" aria-invalid="true">          Default        </Button>        <Button size="xs" variant="secondary" aria-invalid="true">          Secondary        </Button>        <Button size="xs" variant="outline" aria-invalid="true">          Outline        </Button>        <Button size="xs" variant="ghost" aria-invalid="true">          Ghost        </Button>        <Button size="xs" variant="destructive" aria-invalid="true">          Destructive        </Button>        <Button size="xs" variant="link" aria-invalid="true">          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="sm" aria-invalid="true">          Default        </Button>        <Button size="sm" variant="secondary" aria-invalid="true">          Secondary        </Button>        <Button size="sm" variant="outline" aria-invalid="true">          Outline        </Button>        <Button size="sm" variant="ghost" aria-invalid="true">          Ghost        </Button>        <Button size="sm" variant="destructive" aria-invalid="true">          Destructive        </Button>        <Button size="sm" variant="link" aria-invalid="true">          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button aria-invalid="true">Default</Button>        <Button variant="secondary" aria-invalid="true">          Secondary        </Button>        <Button variant="outline" aria-invalid="true">          Outline        </Button>        <Button variant="ghost" aria-invalid="true">          Ghost        </Button>        <Button variant="destructive" aria-invalid="true">          Destructive        </Button>        <Button variant="link" aria-invalid="true">          Link        </Button>      </div>      <div className="flex flex-wrap items-center gap-2">        <Button size="lg" aria-invalid="true">          Default        </Button>        <Button size="lg" variant="secondary" aria-invalid="true">          Secondary        </Button>        <Button size="lg" variant="outline" aria-invalid="true">          Outline        </Button>        <Button size="lg" variant="ghost" aria-invalid="true">          Ghost        </Button>        <Button size="lg" variant="destructive" aria-invalid="true">          Destructive        </Button>        <Button size="lg" variant="link" aria-invalid="true">          Link        </Button>      </div>    </div>  )}

Examples

import { Button } from "@/components/button"import { ArrowRightIcon } from "lucide-react"export function ButtonExamples() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-4">        <div className="flex items-center gap-2">          <Button variant="outline">Cancel</Button>          <Button>            Submit{" "}            <ArrowRightIcon data-icon="inline-end" />          </Button>        </div>        <div className="flex items-center gap-2">          <Button variant="destructive">Delete</Button>          <Button size="icon">            <ArrowRightIcon data-icon="inline-end" />          </Button>        </div>      </div>    </div>  )}

Adapted from the shadcn/ui Button (MIT).