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 };
About Pop Button
Pop Button 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.tsx
import { PopButton } from "@/registry/spell-ui/pop-button";
export function Demo() {
return (
<div className="flex items-center justify-center">
<PopButton className="font-semibold">
Button
</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";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;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
.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 (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;
}
}
}