Back to buttons
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cn } from "@/lib/utils";

type Color =
  | "default"
  | "blue"
  | "purple"
  | "pink"
  | "red"
  | "orange"
  | "yellow"
  | "green"
  | "teal"
  | "cyan"
  | "indigo"
  | "violet"
  | "rose"
  | "amber"
  | "lime"
  | "sky"
  | "slate"
  | "gray"
  | "zinc"
  | "neutral"
  | "stone"
  | "fuchsia"
  | "emerald";

type SizeVariant = "sm" | "default" | "lg";

export interface PopButtonProps
  extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  color?: Color;
  size?: SizeVariant;
  children: React.ReactNode;
  asChild?: boolean;
}

const PopButton = React.forwardRef<HTMLButtonElement, PopButtonProps>(
  (
    { className, color = "default", size = "default", children, asChild = false, ...props },
    ref,
  ) => {
    const Comp = asChild ? Slot : "button";

    const baseClasses =
      "font-pop inline-flex select-none transition-all items-center justify-center whitespace-nowrap rounded-xl ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 text-primary-foreground active:border-b-2 active:scale-y-95 border-x-2 border-t-2 border-b-4 origin-bottom";

    const colors: Record<Color, string> = {
      default:
        "bg-white hover:bg-gray-50 border-neutral-300 text-neutral-900 dark:bg-neutral-800 dark:hover:bg-neutral-700 dark:border-neutral-600 dark:text-neutral-100",
      blue: "bg-blue-500 hover:bg-blue-600 border-blue-800 text-white",
      purple: "bg-purple-500 hover:bg-purple-600 border-purple-800 text-white",
      pink: "bg-pink-500 hover:bg-pink-600 border-pink-800 text-white",
      red: "bg-red-500 hover:bg-red-600 border-red-800 text-white",
      orange: "bg-orange-500 hover:bg-orange-600 border-orange-800 text-white",
      yellow: "bg-yellow-500 hover:bg-yellow-600 border-yellow-800 text-white",
      green: "bg-green-500 hover:bg-green-600 border-green-800 text-white",
      teal: "bg-teal-500 hover:bg-teal-600 border-teal-800 text-white",
      cyan: "bg-cyan-500 hover:bg-cyan-600 border-cyan-800 text-white",
      indigo: "bg-indigo-500 hover:bg-indigo-600 border-indigo-800 text-white",
      violet: "bg-violet-500 hover:bg-violet-600 border-violet-800 text-white",
      rose: "bg-rose-500 hover:bg-rose-600 border-rose-800 text-white",
      amber: "bg-amber-500 hover:bg-amber-600 border-amber-800 text-white",
      lime: "bg-lime-500 hover:bg-lime-600 border-lime-800 text-white",
      sky: "bg-sky-500 hover:bg-sky-600 border-sky-800 text-white",
      slate: "bg-slate-500 hover:bg-slate-600 border-slate-800 text-white",
      gray: "bg-gray-500 hover:bg-gray-600 border-gray-800 text-white",
      zinc: "bg-zinc-500 hover:bg-zinc-600 border-zinc-800 text-white",
      neutral:
        "bg-neutral-500 hover:bg-neutral-600 border-neutral-800 text-white",
      stone: "bg-stone-500 hover:bg-stone-600 border-stone-800 text-white",
      fuchsia:
        "bg-fuchsia-500 hover:bg-fuchsia-600 border-fuchsia-800 text-white",
      emerald:
        "bg-emerald-500 hover:bg-emerald-600 border-emerald-800 text-white",
    };

    const sizes = {
      sm: "h-9 px-2 py-1 text-sm",
      default: "h-10 px-4 py-2",
      lg: "h-14 px-8 py-3 text-lg",
    };

    return (
      <Comp
        ref={ref}
        className={cn(
          baseClasses,
          colors[color],
          sizes[size],
          className,
        )}
        {...props}
      >
        {children}
      </Comp>
    );
  },
);

PopButton.displayName = "PopButton";

export { PopButton };

Pop Button Sizes

By tom

Try the interaction, copy the React source files, or download the complete example.

About Pop Button Sizes

Pop Button Sizes is an animated React and Tailwind CSS button by tom. Try the interaction, copy the React source, or download the example with creator credit.

Effects and categories
Hover effects, Animated
Using this example
Copy a TSX file or download the original source and standalone demo. Test keyboard focus, motion and contrast in your own project.

Usage, Tailwind and licensing questions

Read the source files

docs/pop-button/demo-sizes.tsx

import { PopButton } from "@/registry/spell-ui/pop-button";

export function Demo() {
  return (
    <div className="flex not-sm:flex-col flex-wrap items-center gap-4 font-semibold">
      <PopButton size="sm" color="violet">Small</PopButton>
      <PopButton size="default" color="violet">Default</PopButton>
      <PopButton size="lg" color="violet">Large</PopButton>
    </div>
  );
}

registry/spell-ui/pop-button.tsx

import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cn } from "@/lib/utils";

type Color =
  | "default"
  | "blue"
  | "purple"
  | "pink"
  | "red"
  | "orange"
  | "yellow"
  | "green"
  | "teal"
  | "cyan"
  | "indigo"
  | "violet"
  | "rose"
  | "amber"
  | "lime"
  | "sky"
  | "slate"
  | "gray"
  | "zinc"
  | "neutral"
  | "stone"
  | "fuchsia"
  | "emerald";

type SizeVariant = "sm" | "default" | "lg";

export interface PopButtonProps
  extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  color?: Color;
  size?: SizeVariant;
  children: React.ReactNode;
  asChild?: boolean;
}

const PopButton = React.forwardRef<HTMLButtonElement, PopButtonProps>(
  (
    { className, color = "default", size = "default", children, asChild = false, ...props },
    ref,
  ) => {
    const Comp = asChild ? Slot : "button";

    const baseClasses =
      "font-pop inline-flex select-none transition-all items-center justify-center whitespace-nowrap rounded-xl ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 text-primary-foreground active:border-b-2 active:scale-y-95 border-x-2 border-t-2 border-b-4 origin-bottom";

    const colors: Record<Color, string> = {
      default:
        "bg-white hover:bg-gray-50 border-neutral-300 text-neutral-900 dark:bg-neutral-800 dark:hover:bg-neutral-700 dark:border-neutral-600 dark:text-neutral-100",
      blue: "bg-blue-500 hover:bg-blue-600 border-blue-800 text-white",
      purple: "bg-purple-500 hover:bg-purple-600 border-purple-800 text-white",
      pink: "bg-pink-500 hover:bg-pink-600 border-pink-800 text-white",
      red: "bg-red-500 hover:bg-red-600 border-red-800 text-white",
      orange: "bg-orange-500 hover:bg-orange-600 border-orange-800 text-white",
      yellow: "bg-yellow-500 hover:bg-yellow-600 border-yellow-800 text-white",
      green: "bg-green-500 hover:bg-green-600 border-green-800 text-white",
      teal: "bg-teal-500 hover:bg-teal-600 border-teal-800 text-white",
      cyan: "bg-cyan-500 hover:bg-cyan-600 border-cyan-800 text-white",
      indigo: "bg-indigo-500 hover:bg-indigo-600 border-indigo-800 text-white",
      violet: "bg-violet-500 hover:bg-violet-600 border-violet-800 text-white",
      rose: "bg-rose-500 hover:bg-rose-600 border-rose-800 text-white",
      amber: "bg-amber-500 hover:bg-amber-600 border-amber-800 text-white",
      lime: "bg-lime-500 hover:bg-lime-600 border-lime-800 text-white",
      sky: "bg-sky-500 hover:bg-sky-600 border-sky-800 text-white",
      slate: "bg-slate-500 hover:bg-slate-600 border-slate-800 text-white",
      gray: "bg-gray-500 hover:bg-gray-600 border-gray-800 text-white",
      zinc: "bg-zinc-500 hover:bg-zinc-600 border-zinc-800 text-white",
      neutral:
        "bg-neutral-500 hover:bg-neutral-600 border-neutral-800 text-white",
      stone: "bg-stone-500 hover:bg-stone-600 border-stone-800 text-white",
      fuchsia:
        "bg-fuchsia-500 hover:bg-fuchsia-600 border-fuchsia-800 text-white",
      emerald:
        "bg-emerald-500 hover:bg-emerald-600 border-emerald-800 text-white",
    };

    const sizes = {
      sm: "h-9 px-2 py-1 text-sm",
      default: "h-10 px-4 py-2",
      lg: "h-14 px-8 py-3 text-lg",
    };

    return (
      <Comp
        ref={ref}
        className={cn(
          baseClasses,
          colors[color],
          sizes[size],
          className,
        )}
        {...props}
      >
        {children}
      </Comp>
    );
  },
);

PopButton.displayName = "PopButton";

export { PopButton };

lib/utils.ts

import type { Metadata } from "next";
import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
import { siteConfig } from "@/lib/config";

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}

export function absoluteUrl(path: string) {
  const base = process.env.NEXT_PUBLIC_APP_URL ?? siteConfig.url;
  return `${base.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
}

export function buildOgUrl(params?: { title?: string; description?: string }) {
  const url = new URL(absoluteUrl("/og"));
  if (params?.title) url.searchParams.set("title", params.title);
  if (params?.description) url.searchParams.set("description", params.description);
  return url.toString();
}

export function constructMetadata({
  title = siteConfig.name,
  description = siteConfig.description,
  image = absoluteUrl("/og"),
  ...props
}: {
  title?: string;
  description?: string;
  image?: string;
} & Partial<Metadata> = {}): Metadata {
  return {
    title,
    description,
    keywords: siteConfig.keywords,
    openGraph: {
      title,
      description,
      type: "website",
      url: siteConfig.url,
      siteName: siteConfig.name,
      images: [
        {
          url: image,
          width: 1200,
          height: 628,
          alt: title,
        },
      ],
    },
    twitter: {
      card: "summary_large_image",
      title,
      description,
      images: [image],
      creator: siteConfig.links.tom.replace("https://x.com/", "@"),
    },
    metadataBase: new URL(siteConfig.url),
    icons: "/icon.svg",
    ...props,
  };
}

lib/config.ts

export const siteConfig = {
  name: "Spell UI",
  url: "https://spell.sh",
  ogImage: "https://spell.sh/og",
  description:
    "Beautiful, sophisticated UI components designed for modern React and Tailwind CSS applications.",
  carbon: {
    // Setting serve to "" disables ads entirely.
    serve: "CWBDE53E",
    placement: "spellsh",
  },
  links: {
    tom: "https://x.com/sushidrip",
    x: "https://x.com/intent/follow?screen_name=sushidrip",
    discord: "https://discord.gg/CxzqwQ2EAa",
    github: "https://github.com/xxtomm/spell-ui",
    // instagram: "https://instagram.com/spellui/",
  },
  keywords: [
    "React",
    "Tailwind CSS",
    "Motion",
    "Landing Page",
    "Components",
    "Next.js",
  ],
};

export type SiteConfig = typeof siteConfig;

demo.tsx


export { Demo as default } from "@/docs/pop-button/demo-sizes";

CSS

/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
  :root, :host {
    --color-red-500: oklch(63.7% 0.237 25.331);
    --color-red-600: oklch(57.7% 0.245 27.325);
    --color-red-800: oklch(44.4% 0.177 26.899);
    --color-orange-500: oklch(70.5% 0.213 47.604);
    --color-orange-600: oklch(64.6% 0.222 41.116);
    --color-orange-800: oklch(47% 0.157 37.304);
    --color-amber-500: oklch(76.9% 0.188 70.08);
    --color-amber-600: oklch(66.6% 0.179 58.318);
    --color-amber-800: oklch(47.3% 0.137 46.201);
    --color-yellow-500: oklch(79.5% 0.184 86.047);
    --color-yellow-600: oklch(68.1% 0.162 75.834);
    --color-yellow-800: oklch(47.6% 0.114 61.907);
    --color-lime-500: oklch(76.8% 0.233 130.85);
    --color-lime-600: oklch(64.8% 0.2 131.684);
    --color-lime-800: oklch(45.3% 0.124 130.933);
    --color-green-500: oklch(72.3% 0.219 149.579);
    --color-green-600: oklch(62.7% 0.194 149.214);
    --color-green-800: oklch(44.8% 0.119 151.328);
    --color-emerald-500: oklch(69.6% 0.17 162.48);
    --color-emerald-600: oklch(59.6% 0.145 163.225);
    --color-emerald-800: oklch(43.2% 0.095 166.913);
    --color-teal-500: oklch(70.4% 0.14 182.503);
    --color-teal-600: oklch(60% 0.118 184.704);
    --color-teal-800: oklch(43.7% 0.078 188.216);
    --color-cyan-500: oklch(71.5% 0.143 215.221);
    --color-cyan-600: oklch(60.9% 0.126 221.723);
    --color-cyan-800: oklch(45% 0.085 224.283);
    --color-sky-500: oklch(68.5% 0.169 237.323);
    --color-sky-600: oklch(58.8% 0.158 241.966);
    --color-sky-800: oklch(44.3% 0.11 240.79);
    --color-blue-500: oklch(62.3% 0.214 259.815);
    --color-blue-600: oklch(54.6% 0.245 262.881);
    --color-blue-800: oklch(42.4% 0.199 265.638);
    --color-indigo-500: oklch(58.5% 0.233 277.117);
    --color-indigo-600: oklch(51.1% 0.262 276.966);
    --color-indigo-800: oklch(39.8% 0.195 277.366);
    --color-violet-500: oklch(60.6% 0.25 292.717);
    --color-violet-600: oklch(54.1% 0.281 293.009);
    --color-violet-800: oklch(43.2% 0.232 292.759);
    --color-purple-500: oklch(62.7% 0.265 303.9);
    --color-purple-600: oklch(55.8% 0.288 302.321);
    --color-purple-800: oklch(43.8% 0.218 303.724);
    --color-fuchsia-500: oklch(66.7% 0.295 322.15);
    --color-fuchsia-600: oklch(59.1% 0.293 322.896);
    --color-fuchsia-800: oklch(45.2% 0.211 324.591);
    --color-pink-500: oklch(65.6% 0.241 354.308);
    --color-pink-600: oklch(59.2% 0.249 0.584);
    --color-pink-800: oklch(45.9% 0.187 3.815);
    --color-rose-500: oklch(64.5% 0.246 16.439);
    --color-rose-600: oklch(58.6% 0.253 17.585);
    --color-rose-800: oklch(45.5% 0.188 13.697);
    --color-slate-500: oklch(55.4% 0.046 257.417);
    --color-slate-600: oklch(44.6% 0.043 257.281);
    --color-slate-800: oklch(27.9% 0.041 260.031);
    --color-gray-50: oklch(98.5% 0.002 247.839);
    --color-gray-500: oklch(55.1% 0.027 264.364);
    --color-gray-600: oklch(44.6% 0.03 256.802);
    --color-gray-800: oklch(27.8% 0.033 256.848);
    --color-zinc-500: oklch(55.2% 0.016 285.938);
    --color-zinc-600: oklch(44.2% 0.017 285.786);
    --color-zinc-800: oklch(27.4% 0.006 286.033);
    --color-neutral-100: oklch(97% 0 none);
    --color-neutral-200: oklch(92.2% 0 none);
    --color-neutral-300: oklch(87% 0 none);
    --color-neutral-500: oklch(55.6% 0 none);
    --color-neutral-600: oklch(43.9% 0 none);
    --color-neutral-700: oklch(37.1% 0 none);
    --color-neutral-800: oklch(26.9% 0 none);
    --color-neutral-900: oklch(20.5% 0 none);
    --color-stone-500: oklch(55.3% 0.013 58.071);
    --color-stone-600: oklch(44.4% 0.011 73.639);
    --color-stone-800: oklch(26.8% 0.007 34.298);
    --color-white: #fff;
    --spacing: 0.25rem;
    --text-sm: 0.875rem;
    --text-sm--line-height: calc(1.25 / 0.875);
    --text-lg: 1.125rem;
    --text-lg--line-height: calc(1.75 / 1.125);
    --font-weight-semibold: 600;
    --default-transition-duration: 150ms;
    --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
    --default-font-family: var(--font-geist-sans);
    --default-mono-font-family: var(--font-geist-mono);
  }
}
@layer base {
  *, ::after, ::before, ::backdrop, ::file-selector-button {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    border: 0 solid;
  }
  html, :host {
    line-height: 1.5;
    -webkit-text-size-adjust: 100%;
    tab-size: 4;
    font-family: var(--default-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
    font-feature-settings: var(--default-font-feature-settings, normal);
    font-variation-settings: var(--default-font-variation-settings, normal);
    -webkit-tap-highlight-color: transparent;
  }
  hr {
    height: 0;
    color: inherit;
    border-top-width: 1px;
  }
  abbr:where([title]) {
    -webkit-text-decoration: underline dotted;
    text-decoration: underline dotted;
  }
  h1, h2, h3, h4, h5, h6 {
    font-size: inherit;
    font-weight: inherit;
  }
  a {
    color: inherit;
    -webkit-text-decoration: inherit;
    text-decoration: inherit;
  }
  b, strong {
    font-weight: bolder;
  }
  code, kbd, samp, pre {
    font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
    font-feature-settings: var(--default-mono-font-feature-settings, normal);
    font-variation-settings: var(--default-mono-font-variation-settings, normal);
    font-size: 1em;
  }
  small {
    font-size: 80%;
  }
  sub, sup {
    font-size: 75%;
    line-height: 0;
    position: relative;
    vertical-align: baseline;
  }
  sub {
    bottom: -0.25em;
  }
  sup {
    top: -0.5em;
  }
  table {
    text-indent: 0;
    border-color: inherit;
    border-collapse: collapse;
  }
  :-moz-focusring:where(:not(iframe)) {
    outline: auto;
  }
  progress {
    vertical-align: baseline;
  }
  summary {
    display: list-item;
  }
  ol, ul, menu {
    list-style: none;
  }
  img, svg, video, canvas, audio, iframe, embed, object {
    display: block;
    vertical-align: middle;
  }
  img, video {
    max-width: 100%;
    height: auto;
  }
  button, input, select, optgroup, textarea, ::file-selector-button {
    font: inherit;
    font-feature-settings: inherit;
    font-variation-settings: inherit;
    letter-spacing: inherit;
    color: inherit;
    border-radius: 0;
    background-color: transparent;
    opacity: 1;
  }
  :where(select:is([multiple], [size])) optgroup {
    font-weight: bolder;
  }
  :where(select:is([multiple], [size])) optgroup option {
    padding-inline-start: 20px;
  }
  ::file-selector-button {
    margin-inline-end: 4px;
  }
  ::placeholder {
    opacity: 1;
  }
  @supports (not (-webkit-appearance: -apple-pay-button))  or (contain-intrinsic-size: 1px) {
    ::placeholder {
      color: currentcolor;
      @supports (color: color-mix(in lab, red, red)) {
        color: color-mix(in oklab, currentcolor 50%, transparent);
      }
    }
  }
  textarea {
    resize: vertical;
  }
  ::-webkit-search-decoration {
    -webkit-appearance: none;
  }
  ::-webkit-date-and-time-value {
    min-height: 1lh;
    text-align: inherit;
  }
  ::-webkit-datetime-edit {
    display: inline-flex;
  }
  ::-webkit-datetime-edit-fields-wrapper {
    padding: 0;
  }
  ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
    padding-block: 0;
  }
  ::-webkit-calendar-picker-indicator {
    line-height: 1;
  }
  :-moz-ui-invalid {
    box-shadow: none;
  }
  button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
    appearance: button;
  }
  ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
    height: auto;
  }
  [hidden]:where(:not([hidden="until-found"])) {
    display: none !important;
  }
}
@layer utilities {
  .flex {
    display: flex;
  }
  .inline-flex {
    display: inline-flex;
  }
  .h-9 {
    height: calc(var(--spacing) * 9);
  }
  .h-10 {
    height: calc(var(--spacing) * 10);
  }
  .h-14 {
    height: calc(var(--spacing) * 14);
  }
  .origin-bottom {
    transform-origin: bottom;
  }
  .flex-wrap {
    flex-wrap: wrap;
  }
  .items-center {
    align-items: center;
  }
  .justify-center {
    justify-content: center;
  }
  .gap-4 {
    gap: calc(var(--spacing) * 4);
  }
  .rounded-xl {
    border-radius: calc(var(--radius) + 4px);
  }
  .border-x-2 {
    border-inline-style: var(--tw-border-style);
    border-inline-width: 2px;
  }
  .border-t-2 {
    border-top-style: var(--tw-border-style);
    border-top-width: 2px;
  }
  .border-b-4 {
    border-bottom-style: var(--tw-border-style);
    border-bottom-width: 4px;
  }
  .border-amber-800 {
    border-color: var(--color-amber-800);
  }
  .border-blue-800 {
    border-color: var(--color-blue-800);
  }
  .border-cyan-800 {
    border-color: var(--color-cyan-800);
  }
  .border-emerald-800 {
    border-color: var(--color-emerald-800);
  }
  .border-fuchsia-800 {
    border-color: var(--color-fuchsia-800);
  }
  .border-gray-800 {
    border-color: var(--color-gray-800);
  }
  .border-green-800 {
    border-color: var(--color-green-800);
  }
  .border-indigo-800 {
    border-color: var(--color-indigo-800);
  }
  .border-lime-800 {
    border-color: var(--color-lime-800);
  }
  .border-neutral-300 {
    border-color: var(--color-neutral-300);
  }
  .border-neutral-800 {
    border-color: var(--color-neutral-800);
  }
  .border-orange-800 {
    border-color: var(--color-orange-800);
  }
  .border-pink-800 {
    border-color: var(--color-pink-800);
  }
  .border-purple-800 {
    border-color: var(--color-purple-800);
  }
  .border-red-800 {
    border-color: var(--color-red-800);
  }
  .border-rose-800 {
    border-color: var(--color-rose-800);
  }
  .border-sky-800 {
    border-color: var(--color-sky-800);
  }
  .border-slate-800 {
    border-color: var(--color-slate-800);
  }
  .border-stone-800 {
    border-color: var(--color-stone-800);
  }
  .border-teal-800 {
    border-color: var(--color-teal-800);
  }
  .border-violet-800 {
    border-color: var(--color-violet-800);
  }
  .border-yellow-800 {
    border-color: var(--color-yellow-800);
  }
  .border-zinc-800 {
    border-color: var(--color-zinc-800);
  }
  .bg-amber-500 {
    background-color: var(--color-amber-500);
  }
  .bg-blue-500 {
    background-color: var(--color-blue-500);
  }
  .bg-cyan-500 {
    background-color: var(--color-cyan-500);
  }
  .bg-emerald-500 {
    background-color: var(--color-emerald-500);
  }
  .bg-fuchsia-500 {
    background-color: var(--color-fuchsia-500);
  }
  .bg-gray-500 {
    background-color: var(--color-gray-500);
  }
  .bg-green-500 {
    background-color: var(--color-green-500);
  }
  .bg-indigo-500 {
    background-color: var(--color-indigo-500);
  }
  .bg-lime-500 {
    background-color: var(--color-lime-500);
  }
  .bg-neutral-500 {
    background-color: var(--color-neutral-500);
  }
  .bg-orange-500 {
    background-color: var(--color-orange-500);
  }
  .bg-pink-500 {
    background-color: var(--color-pink-500);
  }
  .bg-purple-500 {
    background-color: var(--color-purple-500);
  }
  .bg-red-500 {
    background-color: var(--color-red-500);
  }
  .bg-rose-500 {
    background-color: var(--color-rose-500);
  }
  .bg-sky-500 {
    background-color: var(--color-sky-500);
  }
  .bg-slate-500 {
    background-color: var(--color-slate-500);
  }
  .bg-stone-500 {
    background-color: var(--color-stone-500);
  }
  .bg-teal-500 {
    background-color: var(--color-teal-500);
  }
  .bg-violet-500 {
    background-color: var(--color-violet-500);
  }
  .bg-white {
    background-color: var(--color-white);
  }
  .bg-yellow-500 {
    background-color: var(--color-yellow-500);
  }
  .bg-zinc-500 {
    background-color: var(--color-zinc-500);
  }
  .px-2 {
    padding-inline: calc(var(--spacing) * 2);
  }
  .px-4 {
    padding-inline: calc(var(--spacing) * 4);
  }
  .px-8 {
    padding-inline: calc(var(--spacing) * 8);
  }
  .py-1 {
    padding-block: var(--spacing);
  }
  .py-2 {
    padding-block: calc(var(--spacing) * 2);
  }
  .py-3 {
    padding-block: calc(var(--spacing) * 3);
  }
  .font-pop {
    font-family: var(--font-dyna-puff);
  }
  .text-lg {
    font-size: var(--text-lg);
    line-height: var(--tw-leading, var(--text-lg--line-height));
  }
  .text-sm {
    font-size: var(--text-sm);
    line-height: var(--tw-leading, var(--text-sm--line-height));
  }
  .font-semibold {
    --tw-font-weight: var(--font-weight-semibold);
    font-weight: var(--font-weight-semibold);
  }
  .whitespace-nowrap {
    white-space: nowrap;
  }
  .text-neutral-900 {
    color: var(--color-neutral-900);
  }
  .text-primary-foreground {
    color: var(--primary-foreground);
  }
  .text-white {
    color: var(--color-white);
  }
  .ring-offset-background {
    --tw-ring-offset-color: var(--background);
  }
  .transition-all {
    transition-property: all;
    transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
    transition-duration: var(--tw-duration, var(--default-transition-duration));
  }
  .select-none {
    -webkit-user-select: none;
    user-select: none;
  }
  @media not (width >= 40rem) {
    .not-sm\:flex-col {
      flex-direction: column;
    }
  }
  @media (hover: hover) {
    .hover\:bg-amber-600:hover {
      background-color: var(--color-amber-600);
    }
    .hover\:bg-blue-600:hover {
      background-color: var(--color-blue-600);
    }
    .hover\:bg-cyan-600:hover {
      background-color: var(--color-cyan-600);
    }
    .hover\:bg-emerald-600:hover {
      background-color: var(--color-emerald-600);
    }
    .hover\:bg-fuchsia-600:hover {
      background-color: var(--color-fuchsia-600);
    }
    .hover\:bg-gray-50:hover {
      background-color: var(--color-gray-50);
    }
    .hover\:bg-gray-600:hover {
      background-color: var(--color-gray-600);
    }
    .hover\:bg-green-600:hover {
      background-color: var(--color-green-600);
    }
    .hover\:bg-indigo-600:hover {
      background-color: var(--color-indigo-600);
    }
    .hover\:bg-lime-600:hover {
      background-color: var(--color-lime-600);
    }
    .hover\:bg-neutral-600:hover {
      background-color: var(--color-neutral-600);
    }
    .hover\:bg-orange-600:hover {
      background-color: var(--color-orange-600);
    }
    .hover\:bg-pink-600:hover {
      background-color: var(--color-pink-600);
    }
    .hover\:bg-purple-600:hover {
      background-color: var(--color-purple-600);
    }
    .hover\:bg-red-600:hover {
      background-color: var(--color-red-600);
    }
    .hover\:bg-rose-600:hover {
      background-color: var(--color-rose-600);
    }
    .hover\:bg-sky-600:hover {
      background-color: var(--color-sky-600);
    }
    .hover\:bg-slate-600:hover {
      background-color: var(--color-slate-600);
    }
    .hover\:bg-stone-600:hover {
      background-color: var(--color-stone-600);
    }
    .hover\:bg-teal-600:hover {
      background-color: var(--color-teal-600);
    }
    .hover\:bg-violet-600:hover {
      background-color: var(--color-violet-600);
    }
    .hover\:bg-yellow-600:hover {
      background-color: var(--color-yellow-600);
    }
    .hover\:bg-zinc-600:hover {
      background-color: var(--color-zinc-600);
    }
  }
  .focus-visible\:ring-2:focus-visible {
    --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
    box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
  }
  .focus-visible\:ring-ring:focus-visible {
    --tw-ring-color: var(--ring);
  }
  .focus-visible\:ring-offset-2:focus-visible {
    --tw-ring-offset-width: 2px;
    --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  }
  .focus-visible\:outline-none:focus-visible {
    --tw-outline-style: none;
    outline-style: none;
  }
  .active\:scale-y-95:active {
    --tw-scale-y: 95%;
    scale: var(--tw-scale-x) var(--tw-scale-y);
  }
  .active\:border-b-2:active {
    border-bottom-style: var(--tw-border-style);
    border-bottom-width: 2px;
  }
  .disabled\:pointer-events-none:disabled {
    pointer-events: none;
  }
  .disabled\:opacity-50:disabled {
    opacity: 50%;
  }
  .dark\:border-neutral-600:where(.dark, .dark *) {
    border-color: var(--color-neutral-600);
  }
  .dark\:bg-neutral-800:where(.dark, .dark *) {
    background-color: var(--color-neutral-800);
  }
  .dark\:text-neutral-100:where(.dark, .dark *) {
    color: var(--color-neutral-100);
  }
  @media (hover: hover) {
    .dark\:hover\:bg-neutral-700:where(.dark, .dark *):hover {
      background-color: var(--color-neutral-700);
    }
  }
}
:root {
  --background: #fff;
  --foreground: #111;
  --primary: #171717;
  --primary-foreground: #fff;
  --secondary: #eee;
  --secondary-foreground: #171717;
  --muted: #eee;
  --muted-foreground: #666;
  --accent: #eee;
  --accent-foreground: #171717;
  --border: #ddd;
  --input: #ddd;
  --ring: #777;
  --destructive: #dc2626;
  --destructive-foreground: #fff;
  --popover: #fff;
  --popover-foreground: #111;
  --success: #15803d;
  --success-foreground: #fff;
  --radius: .625rem;
  --hairline: 1px;
}
.dark {
  --background: #090909;
  --foreground: #fafafa;
  --primary: #fafafa;
  --primary-foreground: #171717;
  --secondary: #262626;
  --secondary-foreground: #fafafa;
  --muted: #262626;
  --muted-foreground: #a3a3a3;
  --accent: #262626;
  --accent-foreground: #fafafa;
  --border: #333;
  --input: #333;
  --popover: #171717;
  --popover-foreground: #fafafa;
}
:root {
  --radius: 0.625rem;
  --background: oklch(1 0 0);
  --foreground: oklch(0.145 0 0);
  --card: oklch(1 0 0);
  --card-foreground: oklch(0.145 0 0);
  --popover: oklch(1 0 0);
  --popover-foreground: oklch(0.145 0 0);
  --primary: oklch(0.205 0 0);
  --primary-foreground: oklch(0.985 0 0);
  --secondary: oklch(0.97 0 0);
  --secondary-foreground: oklch(0.205 0 0);
  --muted: oklch(0.97 0 0);
  --muted-foreground: oklch(0.556 0 0);
  --accent: oklch(0.97 0 0);
  --accent-foreground: oklch(0.205 0 0);
  --destructive: oklch(0.577 0.245 27.325);
  --border: oklch(0.922 0 0);
  --input: oklch(0.922 0 0);
  --ring: oklch(0.708 0 0);
  --chart-1: oklch(0.646 0.222 41.116);
  --chart-2: oklch(0.6 0.118 184.704);
  --chart-3: oklch(0.398 0.07 227.392);
  --chart-4: oklch(0.828 0.189 84.429);
  --chart-5: oklch(0.769 0.188 70.08);
  --sidebar: oklch(1 0 0);
  --sidebar-foreground: oklch(0.145 0 0);
  --sidebar-primary: oklch(0.205 0 0);
  --sidebar-primary-foreground: oklch(0.985 0 0);
  --sidebar-accent: oklch(0.97 0 0);
  --sidebar-accent-foreground: oklch(0.205 0 0);
  --sidebar-border: oklch(0.922 0 0);
  --sidebar-ring: oklch(0.708 0 0);
  --rotating-border-color: var(--color-neutral-200);
}
.dark {
  --background: oklch(0.1149 0 0);
  --foreground: oklch(0.985 0 0);
  --card: oklch(0.205 0 0);
  --card-foreground: oklch(0.985 0 0);
  --popover: oklch(0.205 0 0);
  --popover-foreground: oklch(0.985 0 0);
  --primary: oklch(0.922 0 0);
  --primary-foreground: oklch(0.205 0 0);
  --secondary: oklch(22.213% 0.00003 271.152);
  --secondary-foreground: oklch(0.985 0 0);
  --muted: oklch(0.269 0 0);
  --muted-foreground: oklch(0.708 0 0);
  --accent: oklch(0.269 0 0);
  --accent-foreground: oklch(0.985 0 0);
  --destructive: oklch(0.704 0.191 22.216);
  --border: oklch(1 0 0 / 10%);
  --input: oklch(1 0 0 / 15%);
  --ring: oklch(0.556 0 0);
  --chart-1: oklch(0.488 0.243 264.376);
  --chart-2: oklch(0.696 0.17 162.48);
  --chart-3: oklch(0.769 0.188 70.08);
  --chart-4: oklch(0.627 0.265 303.9);
  --chart-5: oklch(0.645 0.246 16.439);
  --sidebar: oklch(0.1149 0 0);
  --sidebar-foreground: oklch(0.985 0 0);
  --sidebar-primary: oklch(0.488 0.243 264.376);
  --sidebar-primary-foreground: oklch(0.985 0 0);
  --sidebar-accent: oklch(0.269 0 0);
  --sidebar-accent-foreground: oklch(0.985 0 0);
  --sidebar-border: oklch(1 0 0 / 10%);
  --sidebar-ring: oklch(0.556 0 0);
  --rotating-border-color: var(--muted);
}
.dark .shiki, .dark .shiki span {
  color: var(--shiki-dark) !important;
  background-color: #0f0f0f !important;
}
@property --tw-border-style {
  syntax: "*";
  inherits: false;
  initial-value: solid;
}
@property --tw-font-weight {
  syntax: "*";
  inherits: false;
}
@property --tw-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}
@property --tw-shadow-color {
  syntax: "*";
  inherits: false;
}
@property --tw-shadow-alpha {
  syntax: "<percentage>";
  inherits: false;
  initial-value: 100%;
}
@property --tw-inset-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}
@property --tw-inset-shadow-color {
  syntax: "*";
  inherits: false;
}
@property --tw-inset-shadow-alpha {
  syntax: "<percentage>";
  inherits: false;
  initial-value: 100%;
}
@property --tw-ring-color {
  syntax: "*";
  inherits: false;
}
@property --tw-ring-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}
@property --tw-inset-ring-color {
  syntax: "*";
  inherits: false;
}
@property --tw-inset-ring-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}
@property --tw-ring-inset {
  syntax: "*";
  inherits: false;
}
@property --tw-ring-offset-width {
  syntax: "<length>";
  inherits: false;
  initial-value: 0px;
}
@property --tw-ring-offset-color {
  syntax: "*";
  inherits: false;
  initial-value: #fff;
}
@property --tw-ring-offset-shadow {
  syntax: "*";
  inherits: false;
  initial-value: 0 0 #0000;
}
@property --tw-scale-x {
  syntax: "*";
  inherits: false;
  initial-value: 1;
}
@property --tw-scale-y {
  syntax: "*";
  inherits: false;
  initial-value: 1;
}
@property --tw-scale-z {
  syntax: "*";
  inherits: false;
  initial-value: 1;
}
@layer properties {
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
    *, ::before, ::after, ::backdrop {
      --tw-border-style: solid;
      --tw-font-weight: initial;
      --tw-shadow: 0 0 #0000;
      --tw-shadow-color: initial;
      --tw-shadow-alpha: 100%;
      --tw-inset-shadow: 0 0 #0000;
      --tw-inset-shadow-color: initial;
      --tw-inset-shadow-alpha: 100%;
      --tw-ring-color: initial;
      --tw-ring-shadow: 0 0 #0000;
      --tw-inset-ring-color: initial;
      --tw-inset-ring-shadow: 0 0 #0000;
      --tw-ring-inset: initial;
      --tw-ring-offset-width: 0px;
      --tw-ring-offset-color: #fff;
      --tw-ring-offset-shadow: 0 0 #0000;
      --tw-scale-x: 1;
      --tw-scale-y: 1;
      --tw-scale-z: 1;
    }
  }
}