"use client";
import { motion } from "motion/react";
import * as React from "react";
import { cn } from "@/lib/utils";
const controlCornerClassName =
"rounded-lg supports-[corner-shape:squircle]:corner-squircle supports-[corner-shape:squircle]:rounded-[11px]";
const componentThemeClassName =
"[--ic-background:#ffffff] [--ic-foreground:#111111] [--ic-primary:#111111] [--ic-secondary:#646b75] [--ic-surface-border:#e9edf2] [--ic-border:#e3e7ec] [--ic-card:#ffffff] [--ic-card-foreground:#111111] [--ic-muted:#f5f7fa] [--ic-muted-foreground:#6d7480] [--ic-accent:#f3f5f8] [--color-accent:var(--ic-accent)] [--color-accent-foreground:var(--ic-accent-foreground)] [--ic-accent-foreground:#111111] [--ic-input:#e3e7ec] [--ic-ring:rgba(17,17,17,0.16)] [--ic-destructive:#dc2626] [--ic-paper:#fcfcfd] [--ic-popover-foreground:#111111] [--ic-brand:#0ea5e9] [--ic-brand-soft:#bae6fd] [--ic-shadow-soft:0_18px_38px_-24px_rgba(15,23,42,0.35)] [--ic-chart-1:oklch(0.52_0.19_254)] [--ic-chart-2:oklch(0.74_0.11_232)] [--ic-chart-3:oklch(0.42_0.16_262)] [--ic-chart-4:oklch(0.84_0.07_228)] [--ic-chart-5:oklch(0.62_0.14_240)] [--color-background:var(--ic-background)] [--color-foreground:var(--ic-foreground)] [--color-primary:var(--ic-primary)] [--color-secondary:var(--ic-secondary)] [--color-border:var(--ic-border)] [--color-card:var(--ic-card)] [--color-card-foreground:var(--ic-card-foreground)] [--color-muted:var(--ic-muted)] [--color-muted-foreground:var(--ic-muted-foreground)] [--color-accent:var(--ic-accent)] [--color-accent-foreground:var(--ic-accent-foreground)] [--color-input:var(--ic-input)] [--color-ring:var(--ic-ring)] [--color-destructive:var(--ic-destructive)] [--color-paper:var(--ic-paper)] [--color-popover-foreground:var(--ic-popover-foreground)] [--color-brand:var(--ic-brand)] [--color-brand-soft:var(--ic-brand-soft)] [--color-chart-1:var(--ic-chart-1)] [--color-chart-2:var(--ic-chart-2)] [--color-chart-3:var(--ic-chart-3)] [--color-chart-4:var(--ic-chart-4)] [--color-chart-5:var(--ic-chart-5)] dark:[--ic-background:#111111] dark:[--ic-foreground:#f6f3ec] dark:[--ic-primary:#f6f3ec] dark:[--ic-secondary:#cbc6bb] dark:[--ic-surface-border:#2a2a25] dark:[--ic-border:#2b2a25] dark:[--ic-card:#111111] dark:[--ic-card-foreground:#f6f3ec] dark:[--ic-muted:#171716] dark:[--ic-muted-foreground:#9a958a] dark:[--ic-accent:#1a1a18] [--color-accent:var(--ic-accent)] [--color-accent-foreground:var(--ic-accent-foreground)] dark:[--ic-accent-foreground:#f6f3ec] dark:[--ic-input:#2b2a25] dark:[--ic-ring:rgba(246,243,236,0.18)] dark:[--ic-destructive:#f87171] dark:[--ic-paper:#171716] dark:[--ic-popover-foreground:#f6f3ec] dark:[--ic-brand:#38bdf8] dark:[--ic-brand-soft:#0c4a6e] dark:[--ic-shadow-soft:0_20px_44px_-28px_rgba(0,0,0,0.6)] dark:[--ic-chart-1:oklch(0.68_0.17_250)] dark:[--ic-chart-2:oklch(0.82_0.09_225)] dark:[--ic-chart-3:oklch(0.58_0.15_260)] dark:[--ic-chart-4:oklch(0.75_0.12_235)] dark:[--ic-chart-5:oklch(0.88_0.06_220)]";
const FILL_DURATION = 0.5;
const FILL_EASE = [0.16, 1, 0.3, 1] as const;
type ButtonHTMLAttributesForMotion = Omit<
React.ButtonHTMLAttributes<HTMLButtonElement>,
| "onAnimationEnd"
| "onAnimationIteration"
| "onAnimationStart"
| "onDrag"
| "onDragEnd"
| "onDragEnter"
| "onDragExit"
| "onDragLeave"
| "onDragOver"
| "onDragStart"
| "onDrop"
>;
function getCoverDiameter(width: number, height: number, x: number, y: number) {
return Math.ceil(
2 *
Math.max(
Math.hypot(x, y),
Math.hypot(width - x, y),
Math.hypot(x, height - y),
Math.hypot(width - x, height - y)
)
);
}
function assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {
if (typeof ref === "function") {
ref(value);
return;
}
if (ref) {
ref.current = value;
}
}
function hasTextContent(node: React.ReactNode): boolean {
if (typeof node === "string" || typeof node === "number") {
return String(node).trim().length > 0;
}
if (Array.isArray(node)) {
return node.some(hasTextContent);
}
if (React.isValidElement<{ children?: React.ReactNode }>(node)) {
return hasTextContent(node.props.children);
}
return false;
}
type RadialButtonProps = ButtonHTMLAttributesForMotion & {
children?: React.ReactNode;
loading?: boolean;
};
const RadialButton = React.forwardRef<HTMLButtonElement, RadialButtonProps>(
(
{
children,
className,
disabled = false,
loading = false,
type = "button",
onBlur,
onClick,
onFocus,
onKeyDown,
onKeyUp,
onPointerCancel,
onPointerDown,
onPointerEnter,
onPointerLeave,
onPointerUp,
...props
},
ref
) => {
const buttonRef = React.useRef<HTMLButtonElement>(null);
const isDisabled = Boolean(disabled || loading);
const [hovered, setHovered] = React.useState(false);
const [isPressed, setIsPressed] = React.useState(false);
const [origin, setOrigin] = React.useState({ x: 0, y: 0 });
const [coverSize, setCoverSize] = React.useState(0);
const ariaLabel = props["aria-label"];
const ariaLabelledBy = props["aria-labelledby"];
React.useEffect(() => {
if (process.env.NODE_ENV === "production") {
return;
}
if (
hasTextContent(children) ||
ariaLabel?.trim() ||
ariaLabelledBy?.trim()
) {
return;
}
console.warn(
"RadialButton: provide visible label text or aria-label / aria-labelledby so the control has an accessible name."
);
}, [ariaLabel, ariaLabelledBy, children]);
const updateOrigin = React.useCallback((x: number, y: number) => {
const node = buttonRef.current;
if (!node) return;
const rect = node.getBoundingClientRect();
setOrigin({ x, y });
setCoverSize(getCoverDiameter(rect.width, rect.height, x, y));
}, []);
const updateOriginFromPointer = React.useCallback(
(event: React.PointerEvent<HTMLButtonElement>) => {
const rect = event.currentTarget.getBoundingClientRect();
updateOrigin(event.clientX - rect.left, event.clientY - rect.top);
},
[updateOrigin]
);
const updateOriginFromCenter = React.useCallback(() => {
const node = buttonRef.current;
if (!node) return;
const rect = node.getBoundingClientRect();
updateOrigin(rect.width / 2, rect.height / 2);
}, [updateOrigin]);
const showFill = !isDisabled && (hovered || isPressed);
React.useLayoutEffect(() => {
const node = buttonRef.current;
if (!(node && showFill)) return;
const measure = () => {
const rect = node.getBoundingClientRect();
setCoverSize(
getCoverDiameter(rect.width, rect.height, origin.x, origin.y)
);
};
measure();
const observer = new ResizeObserver(measure);
observer.observe(node);
const fonts = document.fonts;
if (fonts?.ready) {
fonts.ready.then(measure).catch(() => undefined);
}
return () => observer.disconnect();
}, [showFill, origin.x, origin.y]);
const fillTransition = { duration: FILL_DURATION, ease: FILL_EASE };
const setMergedRef = React.useCallback(
(node: HTMLButtonElement | null) => {
buttonRef.current = node;
assignRef(ref, node);
},
[ref]
);
return (
<motion.button
{...props}
aria-busy={loading || undefined}
className={cn(
componentThemeClassName,
controlCornerClassName,
"relative inline-flex h-12 cursor-pointer touch-manipulation select-none items-center justify-center overflow-hidden px-8 font-medium text-[15px] tracking-[-0.02em]",
"border-[0.5px] border-border bg-card text-card-foreground",
"dark:bg-muted dark:text-foreground",
"transition-[color] duration-300 ease-[cubic-bezier(0.16,1,0.3,1)]",
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
"disabled:pointer-events-none disabled:opacity-50",
showFill && "text-background dark:text-neutral-950",
className
)}
data-pressed={isPressed ? "true" : "false"}
disabled={isDisabled}
onBlur={(event) => {
onBlur?.(event);
setIsPressed(false);
if (!event.defaultPrevented) {
setHovered(false);
}
}}
onClick={onClick}
onFocus={(event) => {
onFocus?.(event);
if (isDisabled || event.defaultPrevented) return;
if (event.currentTarget.matches(":focus-visible")) {
updateOriginFromCenter();
setHovered(true);
}
}}
onKeyDown={(event) => {
onKeyDown?.(event);
if (
event.defaultPrevented ||
isDisabled ||
event.repeat ||
(event.key !== " " && event.key !== "Enter")
) {
return;
}
if (event.key === " ") {
event.preventDefault();
}
updateOriginFromCenter();
setIsPressed(true);
setHovered(true);
}}
onKeyUp={(event) => {
onKeyUp?.(event);
if (event.key === " " || event.key === "Enter") {
setIsPressed(false);
if (!event.currentTarget.matches(":focus-visible")) {
setHovered(false);
}
}
}}
onPointerCancel={(event) => {
onPointerCancel?.(event);
setIsPressed(false);
}}
onPointerDown={(event) => {
onPointerDown?.(event);
if (event.defaultPrevented || isDisabled || event.button !== 0) {
return;
}
updateOriginFromPointer(event);
setIsPressed(true);
setHovered(true);
}}
onPointerEnter={(event) => {
onPointerEnter?.(event);
if (isDisabled || event.defaultPrevented) return;
updateOriginFromPointer(event);
setHovered(true);
}}
onPointerLeave={(event) => {
onPointerLeave?.(event);
setHovered(false);
setIsPressed(false);
}}
onPointerUp={(event) => {
onPointerUp?.(event);
setIsPressed(false);
}}
ref={setMergedRef}
type={type}
whileTap={isDisabled ? undefined : { scale: 0.96 }}
>
<motion.span
animate={{ scale: showFill && coverSize > 0 ? 1 : 0 }}
aria-hidden
className="pointer-events-none absolute -translate-x-1/2 -translate-y-1/2 rounded-full bg-foreground dark:bg-neutral-50"
initial={false}
style={{
height: coverSize,
left: origin.x,
top: origin.y,
width: coverSize,
}}
transition={fillTransition}
/>
<span className="relative z-10 inline-flex items-center justify-center gap-2">
{children}
</span>
</motion.button>
);
}
);
RadialButton.displayName = "RadialButton";
export { RadialButton };
export type { RadialButtonProps };
Radial Button
Try the interaction, copy the React source files, or download the complete example.
About Radial Button
Radial Button is an animated React and Tailwind CSS button by Edwin Vakayil. 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
import-examples/radial-button.tsx
import {RadialButton} from "@/registry/radial-button";export default function Demo(){return <RadialButton>Hover me</RadialButton>}registry/radial-button.tsx
"use client";
import { motion } from "motion/react";
import * as React from "react";
import { cn } from "@/lib/utils";
const controlCornerClassName =
"rounded-lg supports-[corner-shape:squircle]:corner-squircle supports-[corner-shape:squircle]:rounded-[11px]";
const componentThemeClassName =
"[--ic-background:#ffffff] [--ic-foreground:#111111] [--ic-primary:#111111] [--ic-secondary:#646b75] [--ic-surface-border:#e9edf2] [--ic-border:#e3e7ec] [--ic-card:#ffffff] [--ic-card-foreground:#111111] [--ic-muted:#f5f7fa] [--ic-muted-foreground:#6d7480] [--ic-accent:#f3f5f8] [--color-accent:var(--ic-accent)] [--color-accent-foreground:var(--ic-accent-foreground)] [--ic-accent-foreground:#111111] [--ic-input:#e3e7ec] [--ic-ring:rgba(17,17,17,0.16)] [--ic-destructive:#dc2626] [--ic-paper:#fcfcfd] [--ic-popover-foreground:#111111] [--ic-brand:#0ea5e9] [--ic-brand-soft:#bae6fd] [--ic-shadow-soft:0_18px_38px_-24px_rgba(15,23,42,0.35)] [--ic-chart-1:oklch(0.52_0.19_254)] [--ic-chart-2:oklch(0.74_0.11_232)] [--ic-chart-3:oklch(0.42_0.16_262)] [--ic-chart-4:oklch(0.84_0.07_228)] [--ic-chart-5:oklch(0.62_0.14_240)] [--color-background:var(--ic-background)] [--color-foreground:var(--ic-foreground)] [--color-primary:var(--ic-primary)] [--color-secondary:var(--ic-secondary)] [--color-border:var(--ic-border)] [--color-card:var(--ic-card)] [--color-card-foreground:var(--ic-card-foreground)] [--color-muted:var(--ic-muted)] [--color-muted-foreground:var(--ic-muted-foreground)] [--color-accent:var(--ic-accent)] [--color-accent-foreground:var(--ic-accent-foreground)] [--color-input:var(--ic-input)] [--color-ring:var(--ic-ring)] [--color-destructive:var(--ic-destructive)] [--color-paper:var(--ic-paper)] [--color-popover-foreground:var(--ic-popover-foreground)] [--color-brand:var(--ic-brand)] [--color-brand-soft:var(--ic-brand-soft)] [--color-chart-1:var(--ic-chart-1)] [--color-chart-2:var(--ic-chart-2)] [--color-chart-3:var(--ic-chart-3)] [--color-chart-4:var(--ic-chart-4)] [--color-chart-5:var(--ic-chart-5)] dark:[--ic-background:#111111] dark:[--ic-foreground:#f6f3ec] dark:[--ic-primary:#f6f3ec] dark:[--ic-secondary:#cbc6bb] dark:[--ic-surface-border:#2a2a25] dark:[--ic-border:#2b2a25] dark:[--ic-card:#111111] dark:[--ic-card-foreground:#f6f3ec] dark:[--ic-muted:#171716] dark:[--ic-muted-foreground:#9a958a] dark:[--ic-accent:#1a1a18] [--color-accent:var(--ic-accent)] [--color-accent-foreground:var(--ic-accent-foreground)] dark:[--ic-accent-foreground:#f6f3ec] dark:[--ic-input:#2b2a25] dark:[--ic-ring:rgba(246,243,236,0.18)] dark:[--ic-destructive:#f87171] dark:[--ic-paper:#171716] dark:[--ic-popover-foreground:#f6f3ec] dark:[--ic-brand:#38bdf8] dark:[--ic-brand-soft:#0c4a6e] dark:[--ic-shadow-soft:0_20px_44px_-28px_rgba(0,0,0,0.6)] dark:[--ic-chart-1:oklch(0.68_0.17_250)] dark:[--ic-chart-2:oklch(0.82_0.09_225)] dark:[--ic-chart-3:oklch(0.58_0.15_260)] dark:[--ic-chart-4:oklch(0.75_0.12_235)] dark:[--ic-chart-5:oklch(0.88_0.06_220)]";
const FILL_DURATION = 0.5;
const FILL_EASE = [0.16, 1, 0.3, 1] as const;
type ButtonHTMLAttributesForMotion = Omit<
React.ButtonHTMLAttributes<HTMLButtonElement>,
| "onAnimationEnd"
| "onAnimationIteration"
| "onAnimationStart"
| "onDrag"
| "onDragEnd"
| "onDragEnter"
| "onDragExit"
| "onDragLeave"
| "onDragOver"
| "onDragStart"
| "onDrop"
>;
function getCoverDiameter(width: number, height: number, x: number, y: number) {
return Math.ceil(
2 *
Math.max(
Math.hypot(x, y),
Math.hypot(width - x, y),
Math.hypot(x, height - y),
Math.hypot(width - x, height - y)
)
);
}
function assignRef<T>(ref: React.ForwardedRef<T>, value: T | null) {
if (typeof ref === "function") {
ref(value);
return;
}
if (ref) {
ref.current = value;
}
}
function hasTextContent(node: React.ReactNode): boolean {
if (typeof node === "string" || typeof node === "number") {
return String(node).trim().length > 0;
}
if (Array.isArray(node)) {
return node.some(hasTextContent);
}
if (React.isValidElement<{ children?: React.ReactNode }>(node)) {
return hasTextContent(node.props.children);
}
return false;
}
type RadialButtonProps = ButtonHTMLAttributesForMotion & {
children?: React.ReactNode;
loading?: boolean;
};
const RadialButton = React.forwardRef<HTMLButtonElement, RadialButtonProps>(
(
{
children,
className,
disabled = false,
loading = false,
type = "button",
onBlur,
onClick,
onFocus,
onKeyDown,
onKeyUp,
onPointerCancel,
onPointerDown,
onPointerEnter,
onPointerLeave,
onPointerUp,
...props
},
ref
) => {
const buttonRef = React.useRef<HTMLButtonElement>(null);
const isDisabled = Boolean(disabled || loading);
const [hovered, setHovered] = React.useState(false);
const [isPressed, setIsPressed] = React.useState(false);
const [origin, setOrigin] = React.useState({ x: 0, y: 0 });
const [coverSize, setCoverSize] = React.useState(0);
const ariaLabel = props["aria-label"];
const ariaLabelledBy = props["aria-labelledby"];
React.useEffect(() => {
if (process.env.NODE_ENV === "production") {
return;
}
if (
hasTextContent(children) ||
ariaLabel?.trim() ||
ariaLabelledBy?.trim()
) {
return;
}
console.warn(
"RadialButton: provide visible label text or aria-label / aria-labelledby so the control has an accessible name."
);
}, [ariaLabel, ariaLabelledBy, children]);
const updateOrigin = React.useCallback((x: number, y: number) => {
const node = buttonRef.current;
if (!node) return;
const rect = node.getBoundingClientRect();
setOrigin({ x, y });
setCoverSize(getCoverDiameter(rect.width, rect.height, x, y));
}, []);
const updateOriginFromPointer = React.useCallback(
(event: React.PointerEvent<HTMLButtonElement>) => {
const rect = event.currentTarget.getBoundingClientRect();
updateOrigin(event.clientX - rect.left, event.clientY - rect.top);
},
[updateOrigin]
);
const updateOriginFromCenter = React.useCallback(() => {
const node = buttonRef.current;
if (!node) return;
const rect = node.getBoundingClientRect();
updateOrigin(rect.width / 2, rect.height / 2);
}, [updateOrigin]);
const showFill = !isDisabled && (hovered || isPressed);
React.useLayoutEffect(() => {
const node = buttonRef.current;
if (!(node && showFill)) return;
const measure = () => {
const rect = node.getBoundingClientRect();
setCoverSize(
getCoverDiameter(rect.width, rect.height, origin.x, origin.y)
);
};
measure();
const observer = new ResizeObserver(measure);
observer.observe(node);
const fonts = document.fonts;
if (fonts?.ready) {
fonts.ready.then(measure).catch(() => undefined);
}
return () => observer.disconnect();
}, [showFill, origin.x, origin.y]);
const fillTransition = { duration: FILL_DURATION, ease: FILL_EASE };
const setMergedRef = React.useCallback(
(node: HTMLButtonElement | null) => {
buttonRef.current = node;
assignRef(ref, node);
},
[ref]
);
return (
<motion.button
{...props}
aria-busy={loading || undefined}
className={cn(
componentThemeClassName,
controlCornerClassName,
"relative inline-flex h-12 cursor-pointer touch-manipulation select-none items-center justify-center overflow-hidden px-8 font-medium text-[15px] tracking-[-0.02em]",
"border-[0.5px] border-border bg-card text-card-foreground",
"dark:bg-muted dark:text-foreground",
"transition-[color] duration-300 ease-[cubic-bezier(0.16,1,0.3,1)]",
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
"disabled:pointer-events-none disabled:opacity-50",
showFill && "text-background dark:text-neutral-950",
className
)}
data-pressed={isPressed ? "true" : "false"}
disabled={isDisabled}
onBlur={(event) => {
onBlur?.(event);
setIsPressed(false);
if (!event.defaultPrevented) {
setHovered(false);
}
}}
onClick={onClick}
onFocus={(event) => {
onFocus?.(event);
if (isDisabled || event.defaultPrevented) return;
if (event.currentTarget.matches(":focus-visible")) {
updateOriginFromCenter();
setHovered(true);
}
}}
onKeyDown={(event) => {
onKeyDown?.(event);
if (
event.defaultPrevented ||
isDisabled ||
event.repeat ||
(event.key !== " " && event.key !== "Enter")
) {
return;
}
if (event.key === " ") {
event.preventDefault();
}
updateOriginFromCenter();
setIsPressed(true);
setHovered(true);
}}
onKeyUp={(event) => {
onKeyUp?.(event);
if (event.key === " " || event.key === "Enter") {
setIsPressed(false);
if (!event.currentTarget.matches(":focus-visible")) {
setHovered(false);
}
}
}}
onPointerCancel={(event) => {
onPointerCancel?.(event);
setIsPressed(false);
}}
onPointerDown={(event) => {
onPointerDown?.(event);
if (event.defaultPrevented || isDisabled || event.button !== 0) {
return;
}
updateOriginFromPointer(event);
setIsPressed(true);
setHovered(true);
}}
onPointerEnter={(event) => {
onPointerEnter?.(event);
if (isDisabled || event.defaultPrevented) return;
updateOriginFromPointer(event);
setHovered(true);
}}
onPointerLeave={(event) => {
onPointerLeave?.(event);
setHovered(false);
setIsPressed(false);
}}
onPointerUp={(event) => {
onPointerUp?.(event);
setIsPressed(false);
}}
ref={setMergedRef}
type={type}
whileTap={isDisabled ? undefined : { scale: 0.96 }}
>
<motion.span
animate={{ scale: showFill && coverSize > 0 ? 1 : 0 }}
aria-hidden
className="pointer-events-none absolute -translate-x-1/2 -translate-y-1/2 rounded-full bg-foreground dark:bg-neutral-50"
initial={false}
style={{
height: coverSize,
left: origin.x,
top: origin.y,
width: coverSize,
}}
transition={fillTransition}
/>
<span className="relative z-10 inline-flex items-center justify-center gap-2">
{children}
</span>
</motion.button>
);
}
);
RadialButton.displayName = "RadialButton";
export { RadialButton };
export type { RadialButtonProps };
lib/utils.ts
import type { ClassValue } from "clsx";
import { clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
demo.tsx
export { default as default } from "@/import-examples/radial-button";CSS
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
:root, :host {
--font-sans: -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-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
--color-neutral-50: oklch(98.5% 0 none);
--color-neutral-950: oklch(14.5% 0 none);
--spacing: 0.25rem;
--font-weight-medium: 500;
--default-transition-duration: 150ms;
--default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
--default-font-family: var(--font-sans);
--default-mono-font-family: var(--font-mono);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-primary: var(--primary);
--color-secondary: var(--secondary);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-destructive: var(--destructive);
--color-popover-foreground: var(--popover-foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
}
}
@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 {
.pointer-events-none {
pointer-events: none;
}
.visible {
visibility: visible;
}
.absolute {
position: absolute;
}
.relative {
position: relative;
}
.z-10 {
z-index: 10;
}
.inline-flex {
display: inline-flex;
}
.h-12 {
height: calc(var(--spacing) * 12);
}
.-translate-x-1\/2 {
--tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
translate: var(--tw-translate-x) var(--tw-translate-y);
}
.-translate-y-1\/2 {
--tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
translate: var(--tw-translate-x) var(--tw-translate-y);
}
.cursor-pointer {
cursor: pointer;
}
.touch-manipulation {
touch-action: manipulation;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}
.gap-2 {
gap: calc(var(--spacing) * 2);
}
.overflow-hidden {
overflow: hidden;
}
.rounded-full {
border-radius: calc(infinity * 1px);
}
.rounded-lg {
border-radius: var(--radius);
}
.border-\[0\.5px\] {
border-style: var(--tw-border-style);
border-width: 0.5px;
}
.border-border {
border-color: var(--border);
}
.bg-card {
background-color: var(--card);
}
.bg-foreground {
background-color: var(--foreground);
}
.px-8 {
padding-inline: calc(var(--spacing) * 8);
}
.text-\[15px\] {
font-size: 15px;
}
.font-medium {
--tw-font-weight: var(--font-weight-medium);
font-weight: var(--font-weight-medium);
}
.tracking-\[-0\.02em\] {
--tw-tracking: -0.02em;
letter-spacing: -0.02em;
}
.text-background {
color: var(--background);
}
.text-card-foreground {
color: var(--card-foreground);
}
.transition {
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
transition-duration: var(--tw-duration, var(--default-transition-duration));
}
.transition-\[color\] {
transition-property: color;
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
transition-duration: var(--tw-duration, var(--default-transition-duration));
}
.duration-300 {
--tw-duration: 300ms;
transition-duration: 300ms;
}
.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\] {
--tw-ease: cubic-bezier(0.16,1,0.3,1);
transition-timing-function: cubic-bezier(0.16,1,0.3,1);
}
.select-none {
-webkit-user-select: none;
user-select: none;
}
.\[--color-accent-foreground\:var\(--ic-accent-foreground\)\] {
--color-accent-foreground: var(--ic-accent-foreground);
}
.\[--color-accent\:var\(--ic-accent\)\] {
--color-accent: var(--ic-accent);
}
.\[--color-background\:var\(--ic-background\)\] {
--color-background: var(--ic-background);
}
.\[--color-border\:var\(--ic-border\)\] {
--color-border: var(--ic-border);
}
.\[--color-brand-soft\:var\(--ic-brand-soft\)\] {
--color-brand-soft: var(--ic-brand-soft);
}
.\[--color-brand\:var\(--ic-brand\)\] {
--color-brand: var(--ic-brand);
}
.\[--color-card-foreground\:var\(--ic-card-foreground\)\] {
--color-card-foreground: var(--ic-card-foreground);
}
.\[--color-card\:var\(--ic-card\)\] {
--color-card: var(--ic-card);
}
.\[--color-chart-1\:var\(--ic-chart-1\)\] {
--color-chart-1: var(--ic-chart-1);
}
.\[--color-chart-2\:var\(--ic-chart-2\)\] {
--color-chart-2: var(--ic-chart-2);
}
.\[--color-chart-3\:var\(--ic-chart-3\)\] {
--color-chart-3: var(--ic-chart-3);
}
.\[--color-chart-4\:var\(--ic-chart-4\)\] {
--color-chart-4: var(--ic-chart-4);
}
.\[--color-chart-5\:var\(--ic-chart-5\)\] {
--color-chart-5: var(--ic-chart-5);
}
.\[--color-destructive\:var\(--ic-destructive\)\] {
--color-destructive: var(--ic-destructive);
}
.\[--color-foreground\:var\(--ic-foreground\)\] {
--color-foreground: var(--ic-foreground);
}
.\[--color-input\:var\(--ic-input\)\] {
--color-input: var(--ic-input);
}
.\[--color-muted-foreground\:var\(--ic-muted-foreground\)\] {
--color-muted-foreground: var(--ic-muted-foreground);
}
.\[--color-muted\:var\(--ic-muted\)\] {
--color-muted: var(--ic-muted);
}
.\[--color-paper\:var\(--ic-paper\)\] {
--color-paper: var(--ic-paper);
}
.\[--color-popover-foreground\:var\(--ic-popover-foreground\)\] {
--color-popover-foreground: var(--ic-popover-foreground);
}
.\[--color-primary\:var\(--ic-primary\)\] {
--color-primary: var(--ic-primary);
}
.\[--color-ring\:var\(--ic-ring\)\] {
--color-ring: var(--ic-ring);
}
.\[--color-secondary\:var\(--ic-secondary\)\] {
--color-secondary: var(--ic-secondary);
}
.\[--ic-accent-foreground\:\#111111\] {
--ic-accent-foreground: #111111;
}
.\[--ic-accent\:\#f3f5f8\] {
--ic-accent: #f3f5f8;
}
.\[--ic-background\:\#ffffff\] {
--ic-background: #ffffff;
}
.\[--ic-border\:\#e3e7ec\] {
--ic-border: #e3e7ec;
}
.\[--ic-brand-soft\:\#bae6fd\] {
--ic-brand-soft: #bae6fd;
}
.\[--ic-brand\:\#0ea5e9\] {
--ic-brand: #0ea5e9;
}
.\[--ic-card-foreground\:\#111111\] {
--ic-card-foreground: #111111;
}
.\[--ic-card\:\#ffffff\] {
--ic-card: #ffffff;
}
.\[--ic-chart-1\:oklch\(0\.52_0\.19_254\)\] {
--ic-chart-1: oklch(0.52 0.19 254);
}
.\[--ic-chart-2\:oklch\(0\.74_0\.11_232\)\] {
--ic-chart-2: oklch(0.74 0.11 232);
}
.\[--ic-chart-3\:oklch\(0\.42_0\.16_262\)\] {
--ic-chart-3: oklch(0.42 0.16 262);
}
.\[--ic-chart-4\:oklch\(0\.84_0\.07_228\)\] {
--ic-chart-4: oklch(0.84 0.07 228);
}
.\[--ic-chart-5\:oklch\(0\.62_0\.14_240\)\] {
--ic-chart-5: oklch(0.62 0.14 240);
}
.\[--ic-destructive\:\#dc2626\] {
--ic-destructive: #dc2626;
}
.\[--ic-foreground\:\#111111\] {
--ic-foreground: #111111;
}
.\[--ic-input\:\#e3e7ec\] {
--ic-input: #e3e7ec;
}
.\[--ic-muted-foreground\:\#6d7480\] {
--ic-muted-foreground: #6d7480;
}
.\[--ic-muted\:\#f5f7fa\] {
--ic-muted: #f5f7fa;
}
.\[--ic-paper\:\#fcfcfd\] {
--ic-paper: #fcfcfd;
}
.\[--ic-popover-foreground\:\#111111\] {
--ic-popover-foreground: #111111;
}
.\[--ic-primary\:\#111111\] {
--ic-primary: #111111;
}
.\[--ic-ring\:rgba\(17\,17\,17\,0\.16\)\] {
--ic-ring: rgba(17,17,17,0.16);
}
.\[--ic-secondary\:\#646b75\] {
--ic-secondary: #646b75;
}
.\[--ic-shadow-soft\:0_18px_38px_-24px_rgba\(15\,23\,42\,0\.35\)\] {
--ic-shadow-soft: 0 18px 38px -24px rgba(15,23,42,0.35);
}
.\[--ic-surface-border\:\#e9edf2\] {
--ic-surface-border: #e9edf2;
}
.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\:ring-offset-background:focus-visible {
--tw-ring-offset-color: var(--background);
}
.focus-visible\:outline-none:focus-visible {
--tw-outline-style: none;
outline-style: none;
}
.disabled\:pointer-events-none:disabled {
pointer-events: none;
}
.disabled\:opacity-50:disabled {
opacity: 50%;
}
@supports (corner-shape:squircle) {
.supports-\[corner-shape\:squircle\]\:rounded-\[11px\] {
border-radius: 11px;
}
}
.dark\:bg-muted:where(.dark, .dark *) {
background-color: var(--muted);
}
.dark\:bg-neutral-50:where(.dark, .dark *) {
background-color: var(--color-neutral-50);
}
.dark\:text-foreground:where(.dark, .dark *) {
color: var(--foreground);
}
.dark\:text-neutral-950:where(.dark, .dark *) {
color: var(--color-neutral-950);
}
.dark\:\[--ic-accent-foreground\:\#f6f3ec\]:where(.dark, .dark *) {
--ic-accent-foreground: #f6f3ec;
}
.dark\:\[--ic-accent\:\#1a1a18\]:where(.dark, .dark *) {
--ic-accent: #1a1a18;
}
.dark\:\[--ic-background\:\#111111\]:where(.dark, .dark *) {
--ic-background: #111111;
}
.dark\:\[--ic-border\:\#2b2a25\]:where(.dark, .dark *) {
--ic-border: #2b2a25;
}
.dark\:\[--ic-brand-soft\:\#0c4a6e\]:where(.dark, .dark *) {
--ic-brand-soft: #0c4a6e;
}
.dark\:\[--ic-brand\:\#38bdf8\]:where(.dark, .dark *) {
--ic-brand: #38bdf8;
}
.dark\:\[--ic-card-foreground\:\#f6f3ec\]:where(.dark, .dark *) {
--ic-card-foreground: #f6f3ec;
}
.dark\:\[--ic-card\:\#111111\]:where(.dark, .dark *) {
--ic-card: #111111;
}
.dark\:\[--ic-chart-1\:oklch\(0\.68_0\.17_250\)\]:where(.dark, .dark *) {
--ic-chart-1: oklch(0.68 0.17 250);
}
.dark\:\[--ic-chart-2\:oklch\(0\.82_0\.09_225\)\]:where(.dark, .dark *) {
--ic-chart-2: oklch(0.82 0.09 225);
}
.dark\:\[--ic-chart-3\:oklch\(0\.58_0\.15_260\)\]:where(.dark, .dark *) {
--ic-chart-3: oklch(0.58 0.15 260);
}
.dark\:\[--ic-chart-4\:oklch\(0\.75_0\.12_235\)\]:where(.dark, .dark *) {
--ic-chart-4: oklch(0.75 0.12 235);
}
.dark\:\[--ic-chart-5\:oklch\(0\.88_0\.06_220\)\]:where(.dark, .dark *) {
--ic-chart-5: oklch(0.88 0.06 220);
}
.dark\:\[--ic-destructive\:\#f87171\]:where(.dark, .dark *) {
--ic-destructive: #f87171;
}
.dark\:\[--ic-foreground\:\#f6f3ec\]:where(.dark, .dark *) {
--ic-foreground: #f6f3ec;
}
.dark\:\[--ic-input\:\#2b2a25\]:where(.dark, .dark *) {
--ic-input: #2b2a25;
}
.dark\:\[--ic-muted-foreground\:\#9a958a\]:where(.dark, .dark *) {
--ic-muted-foreground: #9a958a;
}
.dark\:\[--ic-muted\:\#171716\]:where(.dark, .dark *) {
--ic-muted: #171716;
}
.dark\:\[--ic-paper\:\#171716\]:where(.dark, .dark *) {
--ic-paper: #171716;
}
.dark\:\[--ic-popover-foreground\:\#f6f3ec\]:where(.dark, .dark *) {
--ic-popover-foreground: #f6f3ec;
}
.dark\:\[--ic-primary\:\#f6f3ec\]:where(.dark, .dark *) {
--ic-primary: #f6f3ec;
}
.dark\:\[--ic-ring\:rgba\(246\,243\,236\,0\.18\)\]:where(.dark, .dark *) {
--ic-ring: rgba(246,243,236,0.18);
}
.dark\:\[--ic-secondary\:\#cbc6bb\]:where(.dark, .dark *) {
--ic-secondary: #cbc6bb;
}
.dark\:\[--ic-shadow-soft\:0_20px_44px_-28px_rgba\(0\,0\,0\,0\.6\)\]:where(.dark, .dark *) {
--ic-shadow-soft: 0 20px 44px -28px rgba(0,0,0,0.6);
}
.dark\:\[--ic-surface-border\:\#2a2a25\]:where(.dark, .dark *) {
--ic-surface-border: #2a2a25;
}
}
: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 {
--header-height-mobile: 3.5rem;
--header-height-desktop: 3.5rem;
--nav-stack-height-mobile: var(--header-height-mobile);
--nav-stack-height-desktop: var(--header-height-desktop);
--background: #ffffff;
--foreground: #111111;
--primary: #111111;
--primary-foreground: #ffffff;
--secondary: #646b75;
--secondary-foreground: #ffffff;
--surface-border: #e9edf2;
--border: #e3e7ec;
--card: #ffffff;
--card-foreground: #111111;
--muted: #f5f7fa;
--muted-foreground: #6d7480;
--accent: #f3f5f8;
--accent-foreground: #111111;
--input: #e3e7ec;
--ring: rgba(17, 17, 17, 0.16);
--destructive: #dc2626;
--accent-pro: #0ea5e9;
--sidebar-accent: #f5f7fa;
--sidebar-accent-foreground: #111111;
--separator-dash: rgb(227 231 236 / 1);
--selection-bg: #cfeeff;
--selection-fg: #0f172a;
--nav-menu-surface: #f4f4f5;
--nav-menu-item-hover: #e4e4e7;
--shadow-card: inset 0 1px 0 rgb(255 255 255 / 88%), inset 0 -1px 0 rgb(0 0 0 / 5%), 0 1px
1px rgb(0 0 0 / 3%), 0 8px 24px rgb(0 0 0 / 4%);
--radius: 0.4rem;
}
.dark {
--background: #111111;
--foreground: #f6f3ec;
--secondary-bg: #171716;
--secondary: #cbc6bb;
--secondary-foreground: #111111;
--primary: #f6f3ec;
--primary-foreground: #111111;
--surface-border: #2a2a25;
--border: #2b2a25;
--card: #111111;
--card-foreground: #f6f3ec;
--muted: #171716;
--muted-foreground: #9a958a;
--accent: #1a1a18;
--accent-foreground: #f6f3ec;
--input: #2b2a25;
--ring: rgba(246, 243, 236, 0.18);
--destructive: #f87171;
--accent-pro: #38bdf8;
--sidebar-accent: #262626;
--sidebar-accent-foreground: #fff;
--separator-dash: rgb(92 91 84 / 1);
--selection-bg: #cfeeff;
--selection-fg: #0f172a;
--nav-menu-surface: #1a1a1c;
--nav-menu-item-hover: #262628;
}
.dark .hero-brush-underline::after {
background: #16a34a;
}
@keyframes status-blink {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.28;
transform: scale(0.82);
}
}
@keyframes iconiq-accordion-down {
from {
height: 0;
}
to {
height: var(--radix-accordion-content-height);
}
}
@keyframes iconiq-accordion-up {
from {
height: var(--radix-accordion-content-height);
}
to {
height: 0;
}
}
.dark main .text-neutral-500 {
color: rgb(163 163 163);
}
.dark main .text-neutral-600 {
color: rgb(212 212 212);
}
.dark main .text-neutral-700 {
color: rgb(230 230 230);
}
.dark main .text-neutral-800 {
color: rgb(245 245 245);
}
.dark main .text-neutral-900 {
color: rgb(255 255 255);
}
.dark main .text-neutral-400 {
color: rgb(163 163 163);
}
.dark main code {
color: rgb(212 212 212);
}
.dark main code.rounded, .dark main code.rounded-md, .dark main code[class*="bg-neutral-200"], .dark main code[class*="bg-neutral-50"] {
background-color: rgb(38 38 38);
color: rgb(230 230 230);
}
.dark code.rounded, .dark code.rounded-md, .dark code[class*="bg-neutral-200"] {
background-color: rgb(38 38 38);
color: rgb(230 230 230);
}
.dark code[class*="bg-amber-200"] {
background-color: rgb(69 69 40);
color: rgb(253 253 230);
}
.dark main a.text-neutral-700 {
color: rgb(230 230 230);
}
.dark main a:hover {
color: rgb(255 255 255);
}
.dark html[data-route-split-docs] [data-code-block] .shiki, .dark html[data-route-split-docs] [data-code-block] .shiki span {
color: var(--shiki-dark) !important;
}
@property --tw-translate-x {
syntax: "*";
inherits: false;
initial-value: 0;
}
@property --tw-translate-y {
syntax: "*";
inherits: false;
initial-value: 0;
}
@property --tw-translate-z {
syntax: "*";
inherits: false;
initial-value: 0;
}
@property --tw-border-style {
syntax: "*";
inherits: false;
initial-value: solid;
}
@property --tw-font-weight {
syntax: "*";
inherits: false;
}
@property --tw-tracking {
syntax: "*";
inherits: false;
}
@property --tw-duration {
syntax: "*";
inherits: false;
}
@property --tw-ease {
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;
}
@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-translate-x: 0;
--tw-translate-y: 0;
--tw-translate-z: 0;
--tw-border-style: solid;
--tw-font-weight: initial;
--tw-tracking: initial;
--tw-duration: initial;
--tw-ease: 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;
}
}
}