Back to buttons
"use client";

import * as React from "react";
import type { ComponentPropsWithoutRef } from "react";
import { motion, type Variants } from "motion/react";
import Link from "next/link";
import type { Route } from "next";
import type { UrlObject } from "url";
import { cn } from "@/lib/utils";

type ButtonVariant = "default" | "secondary" | "outline";
type Href = Route | UrlObject;

const MotionLink = motion.create(Link);

type BaseProps = {
  children: React.ReactNode;
  variant?: ButtonVariant;
  className?: string;
  /** Soft glow that blooms behind the button on hover. */
  glow?: boolean;
  /** Corner marker size: px as a number, or a Tailwind size class like `"size-4"`. */
  size?: number | string;
  /** Distance in px the markers sit outside the button's edge. */
  offset?: number;
  /** How far in px the markers spread out on hover. */
  hoverOffset?: number;
};

type ButtonProps = BaseProps &
  Omit<ComponentPropsWithoutRef<typeof motion.button>, "children"> & {
    as?: "button";
    href?: never;
  };

type AnchorProps = BaseProps &
  Omit<ComponentPropsWithoutRef<typeof motion.a>, "href" | "children"> & {
    as: "link";
    href: Href;
  };

export type FrameButtonProps = ButtonProps | AnchorProps;

const VARIANTS: Record<ButtonVariant, string> = {
  // Graded dark surface: dark outer hairline, faint inner ring, top highlight, soft drop, plus the shared press.
  default: "border-transparent text-neutral-50 hover:brightness-110 active:brightness-95 bg-linear-to-b from-[#353535] to-[#272727] shadow-[0_0_0_1px_rgb(0_0_0/0.9),inset_0_0_0_1px_rgb(255_255_255/0.06),inset_0_1px_0_rgb(255_255_255/0.14),0_1px_2px_rgb(0_0_0/0.25),0_4px_12px_-4px_rgb(0_0_0/0.4)] active:shadow-[0_0_0_1px_rgb(0_0_0/0.9),inset_0_0_0_1px_rgb(255_255_255/0.05),inset_0_1px_0_rgb(255_255_255/0.08),0_0_1px_rgb(0_0_0/0.2),0_1px_3px_-2px_rgb(0_0_0/0.3)]",
  secondary:
    "border-border bg-secondary text-secondary-foreground shadow-[0_1px_2px_rgb(0_0_0/0.05),0_2px_6px_-3px_rgb(0_0_0/0.07),inset_0_-1px_0_rgb(0_0_0/0.03)] dark:shadow-[0_1px_2px_rgb(0_0_0/0.4),inset_0_1px_0_rgb(255_255_255/0.05)] hover:border-foreground hover:bg-foreground hover:text-background",
  outline: "border-border bg-transparent text-foreground hover:bg-foreground/5 shadow-[0_1px_2px_rgb(0_0_0/0.05),0_2px_6px_-3px_rgb(0_0_0/0.07),inset_0_-1px_0_rgb(0_0_0/0.03)] dark:shadow-[0_1px_2px_rgb(0_0_0/0.4),inset_0_1px_0_rgb(255_255_255/0.05)]",
};

const SPRING = { type: "spring", stiffness: 380, damping: 24 } as const;

// Diagonal light band that sweeps across the face on hover.
const sweepVariants: Variants = {
  rest: { x: "-120%", transition: { duration: 0 } },
  hover: { x: "320%", transition: { duration: 0.9, ease: [0.4, 0, 0.2, 1] } },
  tap: { x: "320%" },
};

const glowVariants: Variants = {
  rest: { opacity: 0, scale: 0.9 },
  hover: { opacity: 0.35, scale: 1.08 },
  tap: { opacity: 0.5, scale: 1 },
};

export function FrameButton({
  children,
  className,
  variant = "default",
  glow = false,
  size = 14,
  offset = 6,
  hoverOffset = 5,
  ...props
}: FrameButtonProps) {
  const classes = cn(
    "group/frame relative inline-flex cursor-pointer items-center justify-center border px-8 py-3.5 text-xs font-medium tracking-[0.22em] uppercase no-underline outline-none select-none",
    // Press eases in fast; release springs back on the slower base curve.
    "transition-[scale,filter,box-shadow,background-color,border-color,color] duration-300 ease-[cubic-bezier(0.34,1.35,0.64,1)] active:scale-[0.97] active:duration-100 active:ease-out motion-reduce:active:scale-100",
    "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-4 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",
    VARIANTS[variant],
    className,
  );

  const content = (
    <>
      {glow ? (
        <motion.span
          aria-hidden
          variants={glowVariants}
          transition={SPRING}
          className="pointer-events-none absolute inset-0 -z-10 bg-foreground blur-2xl"
        />
      ) : null}
      <span
        aria-hidden
        className="pointer-events-none absolute inset-0 overflow-hidden"
      >
        <motion.span
          variants={sweepVariants}
          className="absolute inset-y-0 left-0 w-1/3 -skew-x-12 bg-linear-to-r from-transparent via-current/15 to-transparent"
        />
      </span>
      <span className="relative inline-flex items-center gap-2">
        {children}
      </span>
      <FrameMarkers size={size} offset={offset} hoverOffset={hoverOffset} />
    </>
  );

  const motionProps = {
    initial: "rest",
    animate: "rest",
    whileHover: "hover",
    whileTap: "tap",
    whileFocus: "hover",
  } as const;

  if (props.as === "link") {
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    const { as, href, ...anchorProps } = props;
    return (
      <MotionLink
        href={href}
        className={classes}
        {...motionProps}
        {...anchorProps}
      >
        {content}
      </MotionLink>
    );
  }

  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  const { as, type = "button", ...buttonProps } = props;
  return (
    <motion.button
      type={type}
      className={classes}
      {...motionProps}
      {...buttonProps}
    >
      {content}
    </motion.button>
  );
}

interface FrameMarkersProps {
  className?: string;
  size?: number | string;
  offset?: number;
  hoverOffset?: number;
}

const MARKERS = [
  { key: "tl", x: -1, y: -1, className: "border-t-[1.5px] border-l-[1.5px]" },
  { key: "tr", x: 1, y: -1, className: "border-t-[1.5px] border-r-[1.5px]" },
  { key: "bl", x: -1, y: 1, className: "border-b-[1.5px] border-l-[1.5px]" },
  { key: "br", x: 1, y: 1, className: "border-b-[1.5px] border-r-[1.5px]" },
] as const;

const markerVariants: Variants = {
  rest: { x: 0, y: 0 },
  hover: ({ x, y, spread }: { x: number; y: number; spread: number }) => ({
    x: x * spread,
    y: y * spread,
  }),
  // Lock on: snap in tight against the button's edge.
  tap: ({ x, y, offset }: { x: number; y: number; offset: number }) => ({
    x: -x * (offset - 1),
    y: -y * (offset - 1),
  }),
};

/**
 * Four corner brackets around the nearest `motion` parent. They follow its
 * `rest` / `hover` / `tap` variants, so the parent needs those states set.
 */
export function FrameMarkers({
  className,
  size = 14,
  offset = 6,
  hoverOffset = 5,
}: FrameMarkersProps) {
  const sizeClass = typeof size === "string" ? size : undefined;
  const sizeStyle =
    typeof size === "number" ? { width: size, height: size } : {};

  return (
    <>
      {MARKERS.map((marker) => (
        <motion.span
          key={marker.key}
          aria-hidden
          custom={{ x: marker.x, y: marker.y, spread: hoverOffset, offset }}
          variants={markerVariants}
          transition={SPRING}
          className={cn(
            "pointer-events-none absolute border-foreground/35 transition-colors duration-300 group-hover/frame:border-foreground group-focus-visible/frame:border-foreground",
            marker.className,
            sizeClass,
            className,
          )}
          style={{
            ...sizeStyle,
            [marker.y < 0 ? "top" : "bottom"]: -offset,
            [marker.x < 0 ? "left" : "right"]: -offset,
          }}
        />
      ))}
    </>
  );
}

FrameButton

By jay sharma

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

About FrameButton

FrameButton is an animated React and Tailwind CSS button by jay sharma. 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/frame-button.tsx

import { FrameButton } from "@/components/evil-buttons/frame-button";

export function ButtonDemo() {
  return <FrameButton>Get Started</FrameButton>;
}

components/evil-buttons/frame-button.tsx

"use client";

import * as React from "react";
import type { ComponentPropsWithoutRef } from "react";
import { motion, type Variants } from "motion/react";
import Link from "next/link";
import type { Route } from "next";
import type { UrlObject } from "url";
import { cn } from "@/lib/utils";

type ButtonVariant = "default" | "secondary" | "outline";
type Href = Route | UrlObject;

const MotionLink = motion.create(Link);

type BaseProps = {
  children: React.ReactNode;
  variant?: ButtonVariant;
  className?: string;
  /** Soft glow that blooms behind the button on hover. */
  glow?: boolean;
  /** Corner marker size: px as a number, or a Tailwind size class like `"size-4"`. */
  size?: number | string;
  /** Distance in px the markers sit outside the button's edge. */
  offset?: number;
  /** How far in px the markers spread out on hover. */
  hoverOffset?: number;
};

type ButtonProps = BaseProps &
  Omit<ComponentPropsWithoutRef<typeof motion.button>, "children"> & {
    as?: "button";
    href?: never;
  };

type AnchorProps = BaseProps &
  Omit<ComponentPropsWithoutRef<typeof motion.a>, "href" | "children"> & {
    as: "link";
    href: Href;
  };

export type FrameButtonProps = ButtonProps | AnchorProps;

const VARIANTS: Record<ButtonVariant, string> = {
  // Graded dark surface: dark outer hairline, faint inner ring, top highlight, soft drop, plus the shared press.
  default: "border-transparent text-neutral-50 hover:brightness-110 active:brightness-95 bg-linear-to-b from-[#353535] to-[#272727] shadow-[0_0_0_1px_rgb(0_0_0/0.9),inset_0_0_0_1px_rgb(255_255_255/0.06),inset_0_1px_0_rgb(255_255_255/0.14),0_1px_2px_rgb(0_0_0/0.25),0_4px_12px_-4px_rgb(0_0_0/0.4)] active:shadow-[0_0_0_1px_rgb(0_0_0/0.9),inset_0_0_0_1px_rgb(255_255_255/0.05),inset_0_1px_0_rgb(255_255_255/0.08),0_0_1px_rgb(0_0_0/0.2),0_1px_3px_-2px_rgb(0_0_0/0.3)]",
  secondary:
    "border-border bg-secondary text-secondary-foreground shadow-[0_1px_2px_rgb(0_0_0/0.05),0_2px_6px_-3px_rgb(0_0_0/0.07),inset_0_-1px_0_rgb(0_0_0/0.03)] dark:shadow-[0_1px_2px_rgb(0_0_0/0.4),inset_0_1px_0_rgb(255_255_255/0.05)] hover:border-foreground hover:bg-foreground hover:text-background",
  outline: "border-border bg-transparent text-foreground hover:bg-foreground/5 shadow-[0_1px_2px_rgb(0_0_0/0.05),0_2px_6px_-3px_rgb(0_0_0/0.07),inset_0_-1px_0_rgb(0_0_0/0.03)] dark:shadow-[0_1px_2px_rgb(0_0_0/0.4),inset_0_1px_0_rgb(255_255_255/0.05)]",
};

const SPRING = { type: "spring", stiffness: 380, damping: 24 } as const;

// Diagonal light band that sweeps across the face on hover.
const sweepVariants: Variants = {
  rest: { x: "-120%", transition: { duration: 0 } },
  hover: { x: "320%", transition: { duration: 0.9, ease: [0.4, 0, 0.2, 1] } },
  tap: { x: "320%" },
};

const glowVariants: Variants = {
  rest: { opacity: 0, scale: 0.9 },
  hover: { opacity: 0.35, scale: 1.08 },
  tap: { opacity: 0.5, scale: 1 },
};

export function FrameButton({
  children,
  className,
  variant = "default",
  glow = false,
  size = 14,
  offset = 6,
  hoverOffset = 5,
  ...props
}: FrameButtonProps) {
  const classes = cn(
    "group/frame relative inline-flex cursor-pointer items-center justify-center border px-8 py-3.5 text-xs font-medium tracking-[0.22em] uppercase no-underline outline-none select-none",
    // Press eases in fast; release springs back on the slower base curve.
    "transition-[scale,filter,box-shadow,background-color,border-color,color] duration-300 ease-[cubic-bezier(0.34,1.35,0.64,1)] active:scale-[0.97] active:duration-100 active:ease-out motion-reduce:active:scale-100",
    "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-4 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",
    VARIANTS[variant],
    className,
  );

  const content = (
    <>
      {glow ? (
        <motion.span
          aria-hidden
          variants={glowVariants}
          transition={SPRING}
          className="pointer-events-none absolute inset-0 -z-10 bg-foreground blur-2xl"
        />
      ) : null}
      <span
        aria-hidden
        className="pointer-events-none absolute inset-0 overflow-hidden"
      >
        <motion.span
          variants={sweepVariants}
          className="absolute inset-y-0 left-0 w-1/3 -skew-x-12 bg-linear-to-r from-transparent via-current/15 to-transparent"
        />
      </span>
      <span className="relative inline-flex items-center gap-2">
        {children}
      </span>
      <FrameMarkers size={size} offset={offset} hoverOffset={hoverOffset} />
    </>
  );

  const motionProps = {
    initial: "rest",
    animate: "rest",
    whileHover: "hover",
    whileTap: "tap",
    whileFocus: "hover",
  } as const;

  if (props.as === "link") {
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    const { as, href, ...anchorProps } = props;
    return (
      <MotionLink
        href={href}
        className={classes}
        {...motionProps}
        {...anchorProps}
      >
        {content}
      </MotionLink>
    );
  }

  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  const { as, type = "button", ...buttonProps } = props;
  return (
    <motion.button
      type={type}
      className={classes}
      {...motionProps}
      {...buttonProps}
    >
      {content}
    </motion.button>
  );
}

interface FrameMarkersProps {
  className?: string;
  size?: number | string;
  offset?: number;
  hoverOffset?: number;
}

const MARKERS = [
  { key: "tl", x: -1, y: -1, className: "border-t-[1.5px] border-l-[1.5px]" },
  { key: "tr", x: 1, y: -1, className: "border-t-[1.5px] border-r-[1.5px]" },
  { key: "bl", x: -1, y: 1, className: "border-b-[1.5px] border-l-[1.5px]" },
  { key: "br", x: 1, y: 1, className: "border-b-[1.5px] border-r-[1.5px]" },
] as const;

const markerVariants: Variants = {
  rest: { x: 0, y: 0 },
  hover: ({ x, y, spread }: { x: number; y: number; spread: number }) => ({
    x: x * spread,
    y: y * spread,
  }),
  // Lock on: snap in tight against the button's edge.
  tap: ({ x, y, offset }: { x: number; y: number; offset: number }) => ({
    x: -x * (offset - 1),
    y: -y * (offset - 1),
  }),
};

/**
 * Four corner brackets around the nearest `motion` parent. They follow its
 * `rest` / `hover` / `tap` variants, so the parent needs those states set.
 */
export function FrameMarkers({
  className,
  size = 14,
  offset = 6,
  hoverOffset = 5,
}: FrameMarkersProps) {
  const sizeClass = typeof size === "string" ? size : undefined;
  const sizeStyle =
    typeof size === "number" ? { width: size, height: size } : {};

  return (
    <>
      {MARKERS.map((marker) => (
        <motion.span
          key={marker.key}
          aria-hidden
          custom={{ x: marker.x, y: marker.y, spread: hoverOffset, offset }}
          variants={markerVariants}
          transition={SPRING}
          className={cn(
            "pointer-events-none absolute border-foreground/35 transition-colors duration-300 group-hover/frame:border-foreground group-focus-visible/frame:border-foreground",
            marker.className,
            sizeClass,
            className,
          )}
          style={{
            ...sizeStyle,
            [marker.y < 0 ? "top" : "bottom"]: -offset,
            [marker.x < 0 ? "left" : "right"]: -offset,
          }}
        />
      ))}
    </>
  );
}

lib/utils.ts

import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"

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

demo.tsx

export { ButtonDemo as default } from "@/import-examples/frame-button";

CSS

/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
  :root, :host {
    --color-neutral-50: oklch(98.5% 0 none);
    --spacing: 0.25rem;
    --text-xs: 0.75rem;
    --text-xs--line-height: calc(1 / 0.75);
    --font-weight-medium: 500;
    --ease-out: cubic-bezier(0, 0, 0.2, 1);
    --blur-2xl: 40px;
    --default-transition-duration: 150ms;
    --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
    --default-font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
    --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 {
  .pointer-events-none {
    pointer-events: none;
  }
  .absolute {
    position: absolute;
  }
  .relative {
    position: relative;
  }
  .inset-0 {
    inset: 0px;
  }
  .inset-y-0 {
    inset-block: 0px;
  }
  .left-0 {
    left: 0px;
  }
  .-z-10 {
    z-index: calc(10 * -1);
  }
  .inline-flex {
    display: inline-flex;
  }
  .size-4 {
    width: calc(var(--spacing) * 4);
    height: calc(var(--spacing) * 4);
  }
  .w-1\/3 {
    width: calc(1 / 3 * 100%);
  }
  .-skew-x-12 {
    --tw-skew-x: skewX(calc(12deg * -1));
    transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
  }
  .cursor-pointer {
    cursor: pointer;
  }
  .items-center {
    align-items: center;
  }
  .justify-center {
    justify-content: center;
  }
  .gap-2 {
    gap: calc(var(--spacing) * 2);
  }
  .overflow-hidden {
    overflow: hidden;
  }
  .border {
    border-style: var(--tw-border-style);
    border-width: 1px;
  }
  .border-t-\[1\.5px\] {
    border-top-style: var(--tw-border-style);
    border-top-width: 1.5px;
  }
  .border-r-\[1\.5px\] {
    border-right-style: var(--tw-border-style);
    border-right-width: 1.5px;
  }
  .border-b-\[1\.5px\] {
    border-bottom-style: var(--tw-border-style);
    border-bottom-width: 1.5px;
  }
  .border-l-\[1\.5px\] {
    border-left-style: var(--tw-border-style);
    border-left-width: 1.5px;
  }
  .border-border {
    border-color: var(--border);
  }
  .border-foreground\/35 {
    border-color: var(--foreground);
    @supports (color: color-mix(in lab, red, red)) {
      border-color: color-mix(in oklab, var(--foreground) 35%, transparent);
    }
  }
  .border-transparent {
    border-color: transparent;
  }
  .bg-foreground {
    background-color: var(--foreground);
  }
  .bg-secondary {
    background-color: var(--secondary);
  }
  .bg-transparent {
    background-color: transparent;
  }
  .bg-linear-to-b {
    --tw-gradient-position: to bottom;
    @supports (background-image: linear-gradient(in lab, red, red)) {
      --tw-gradient-position: to bottom in oklab;
    }
    background-image: linear-gradient(var(--tw-gradient-stops));
  }
  .bg-linear-to-r {
    --tw-gradient-position: to right;
    @supports (background-image: linear-gradient(in lab, red, red)) {
      --tw-gradient-position: to right in oklab;
    }
    background-image: linear-gradient(var(--tw-gradient-stops));
  }
  .from-\[\#353535\] {
    --tw-gradient-from: #353535;
    --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
  }
  .from-transparent {
    --tw-gradient-from: transparent;
    --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
  }
  .via-current\/15 {
    --tw-gradient-via: currentcolor;
    @supports (color: color-mix(in lab, red, red)) {
      --tw-gradient-via: color-mix(in oklab, currentcolor 15%, transparent);
    }
    --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
    --tw-gradient-stops: var(--tw-gradient-via-stops);
  }
  .to-\[\#272727\] {
    --tw-gradient-to: #272727;
    --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
  }
  .to-transparent {
    --tw-gradient-to: transparent;
    --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
  }
  .px-8 {
    padding-inline: calc(var(--spacing) * 8);
  }
  .py-3\.5 {
    padding-block: calc(var(--spacing) * 3.5);
  }
  .text-xs {
    font-size: var(--text-xs);
    line-height: var(--tw-leading, var(--text-xs--line-height));
  }
  .font-medium {
    --tw-font-weight: var(--font-weight-medium);
    font-weight: var(--font-weight-medium);
  }
  .tracking-\[0\.22em\] {
    --tw-tracking: 0.22em;
    letter-spacing: 0.22em;
  }
  .text-foreground {
    color: var(--foreground);
  }
  .text-neutral-50 {
    color: var(--color-neutral-50);
  }
  .text-secondary-foreground {
    color: var(--secondary-foreground);
  }
  .uppercase {
    text-transform: uppercase;
  }
  .no-underline {
    text-decoration-line: none;
  }
  .shadow-\[0_0_0_1px_rgb\(0_0_0\/0\.9\)\,inset_0_0_0_1px_rgb\(255_255_255\/0\.06\)\,inset_0_1px_0_rgb\(255_255_255\/0\.14\)\,0_1px_2px_rgb\(0_0_0\/0\.25\)\,0_4px_12px_-4px_rgb\(0_0_0\/0\.4\)\] {
    --tw-shadow: 0 0 0 1px var(--tw-shadow-color, rgb(0 0 0/0.9)), inset 0 0 0 1px var(--tw-shadow-color, rgb(255 255 255/0.06)), inset 0 1px 0 var(--tw-shadow-color, rgb(255 255 255/0.14)), 0 1px 2px var(--tw-shadow-color, rgb(0 0 0/0.25)), 0 4px 12px -4px var(--tw-shadow-color, rgb(0 0 0/0.4));
    box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
  }
  .shadow-\[0_1px_2px_rgb\(0_0_0\/0\.05\)\,0_2px_6px_-3px_rgb\(0_0_0\/0\.07\)\,inset_0_-1px_0_rgb\(0_0_0\/0\.03\)\] {
    --tw-shadow: 0 1px 2px var(--tw-shadow-color, rgb(0 0 0/0.05)), 0 2px 6px -3px var(--tw-shadow-color, rgb(0 0 0/0.07)), inset 0 -1px 0 var(--tw-shadow-color, rgb(0 0 0/0.03));
    box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
  }
  .outline {
    outline-style: var(--tw-outline-style);
    outline-width: 1px;
  }
  .blur-2xl {
    --tw-blur: blur(var(--blur-2xl));
    filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
  }
  .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-\[scale\,filter\,box-shadow\,background-color\,border-color\,color\] {
    transition-property: scale,filter,box-shadow,background-color,border-color,color;
    transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
    transition-duration: var(--tw-duration, var(--default-transition-duration));
  }
  .transition-colors {
    transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
    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\.34\,1\.35\,0\.64\,1\)\] {
    --tw-ease: cubic-bezier(0.34,1.35,0.64,1);
    transition-timing-function: cubic-bezier(0.34,1.35,0.64,1);
  }
  .outline-none {
    --tw-outline-style: none;
    outline-style: none;
  }
  .select-none {
    -webkit-user-select: none;
    user-select: none;
  }
  @media (hover: hover) {
    .group-hover\/frame\:border-foreground:is(:where(.group\/frame):hover *) {
      border-color: var(--foreground);
    }
  }
  .group-focus-visible\/frame\:border-foreground:is(:where(.group\/frame):focus-visible *) {
    border-color: var(--foreground);
  }
  @media (hover: hover) {
    .hover\:border-foreground:hover {
      border-color: var(--foreground);
    }
    .hover\:bg-foreground:hover {
      background-color: var(--foreground);
    }
    .hover\:bg-foreground\/5:hover {
      background-color: var(--foreground);
    }
    @supports (color: color-mix(in lab, red, red)) {
      .hover\:bg-foreground\/5:hover {
        background-color: color-mix(in oklab, var(--foreground) 5%, transparent);
      }
    }
    .hover\:text-background:hover {
      color: var(--background);
    }
    .hover\:brightness-110:hover {
      --tw-brightness: brightness(110%);
      filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
    }
  }
  .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-4:focus-visible {
    --tw-ring-offset-width: 4px;
    --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);
  }
  .active\:scale-\[0\.97\]:active {
    scale: 0.97;
  }
  .active\:shadow-\[0_0_0_1px_rgb\(0_0_0\/0\.9\)\,inset_0_0_0_1px_rgb\(255_255_255\/0\.05\)\,inset_0_1px_0_rgb\(255_255_255\/0\.08\)\,0_0_1px_rgb\(0_0_0\/0\.2\)\,0_1px_3px_-2px_rgb\(0_0_0\/0\.3\)\]:active {
    --tw-shadow: 0 0 0 1px var(--tw-shadow-color, rgb(0 0 0/0.9)), inset 0 0 0 1px var(--tw-shadow-color, rgb(255 255 255/0.05)), inset 0 1px 0 var(--tw-shadow-color, rgb(255 255 255/0.08)), 0 0 1px var(--tw-shadow-color, rgb(0 0 0/0.2)), 0 1px 3px -2px var(--tw-shadow-color, rgb(0 0 0/0.3));
    box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
  }
  .active\:brightness-95:active {
    --tw-brightness: brightness(95%);
    filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
  }
  .active\:duration-100:active {
    --tw-duration: 100ms;
    transition-duration: 100ms;
  }
  .active\:ease-out:active {
    --tw-ease: var(--ease-out);
    transition-timing-function: var(--ease-out);
  }
  .disabled\:pointer-events-none:disabled {
    pointer-events: none;
  }
  .disabled\:opacity-50:disabled {
    opacity: 50%;
  }
  @media (prefers-reduced-motion: reduce) {
    .motion-reduce\:active\:scale-100:active {
      --tw-scale-x: 100%;
      --tw-scale-y: 100%;
      --tw-scale-z: 100%;
      scale: var(--tw-scale-x) var(--tw-scale-y);
    }
  }
  .dark\:shadow-\[0_1px_2px_rgb\(0_0_0\/0\.4\)\,inset_0_1px_0_rgb\(255_255_255\/0\.05\)\]:where(.dark, .dark *) {
    --tw-shadow: 0 1px 2px var(--tw-shadow-color, rgb(0 0 0/0.4)), inset 0 1px 0 var(--tw-shadow-color, rgb(255 255 255/0.05));
    box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
  }
}
: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 {
  --card: oklch(1 0 0);
  --muted: oklch(0.97 0 0);
  --muted-foreground: oklch(0.556 0 0);
  --border: oklch(0.922 0 0);
  --primary: oklch(0.205 0 0);
  --card-foreground: oklch(0.145 0 0);
  --popover: oklch(1 0 0);
  --popover-foreground: oklch(0.145 0 0);
  --primary-foreground: oklch(0.985 0 0);
  --secondary: oklch(0.97 0 0);
  --secondary-foreground: oklch(0.205 0 0);
  --accent: oklch(0.97 0 0);
  --accent-foreground: oklch(0.205 0 0);
  --destructive: oklch(0.577 0.245 27.325);
  --input: oklch(0.922 0 0);
  --ring: oklch(0.708 0 0);
  --chart-1: oklch(0.87 0 0);
  --chart-2: oklch(0.556 0 0);
  --chart-3: oklch(0.439 0 0);
  --chart-4: oklch(0.371 0 0);
  --chart-5: oklch(0.269 0 0);
  --radius: 0.625rem;
  --sidebar: oklch(0.985 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);
  --background: oklch(1 0 0);
  --foreground: oklch(0.145 0 0);
  --chrome: oklch(0.967 0 0);
  --brand: oklch(0.6 0.23 29);
  --chart-background: oklch(1 0 0);
  --chart-foreground: oklch(0.145 0.004 285);
  --chart-foreground-muted: oklch(0.55 0.014 260);
  --chart-line-primary: var(--chart-1);
  --chart-line-secondary: var(--chart-2);
  --chart-crosshair: oklch(0.4 0.1828 274.34);
  --chart-grid: oklch(0.9 0 0);
  --chart-brush-border: var(--chart-grid);
  --chart-tooltip-background: oklch(0.21 0.006 285 / 0.8);
  --chart-tooltip-foreground: oklch(0.985 0 0);
  --chart-tooltip-muted: oklch(0.65 0.01 260);
  --chart-marker-background: oklch(0.97 0.005 260);
  --chart-marker-border: oklch(0.85 0.01 260);
  --chart-marker-foreground: oklch(0.3 0.01 260);
  --chart-label: oklch(0.45 0.01 260);
  --chart-scale-01: oklch(0.98 0.003 106);
  --chart-scale-02: oklch(0.92 0.008 106);
  --chart-scale-03: oklch(0.82 0.015 106);
  --chart-scale-04: oklch(0.68 0.02 106);
  --chart-scale-05: oklch(0.55 0.025 106);
  --chart-scale-pattern-color: oklch(0.96 0.005 106);
}
.dark {
  --background: oklch(0.145 0 0);
  --foreground: oklch(0.985 0 0);
  --chrome: oklch(0.18 0 0);
  --card: oklch(0.205 0 0);
  --muted: oklch(0.269 0 0);
  --muted-foreground: oklch(0.708 0 0);
  --border: oklch(1 0 0 / 10%);
  --primary: oklch(0.922 0 0);
  --card-foreground: oklch(0.985 0 0);
  --popover: oklch(0.205 0 0);
  --popover-foreground: oklch(0.985 0 0);
  --primary-foreground: oklch(0.205 0 0);
  --secondary: oklch(0.269 0 0);
  --secondary-foreground: oklch(0.985 0 0);
  --accent: oklch(0.269 0 0);
  --accent-foreground: oklch(0.985 0 0);
  --destructive: oklch(0.704 0.191 22.216);
  --input: oklch(1 0 0 / 15%);
  --ring: oklch(0.556 0 0);
  --chart-1: oklch(0.87 0 0);
  --chart-2: oklch(0.556 0 0);
  --chart-3: oklch(0.439 0 0);
  --chart-4: oklch(0.371 0 0);
  --chart-5: oklch(0.269 0 0);
  --sidebar: oklch(0.205 0 0);
  --sidebar-foreground: oklch(0.985 0 0);
  --sidebar-primary: oklch(0.922 0 0);
  --sidebar-primary-foreground: oklch(0.205 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);
  --brand: oklch(0.66 0.23 32);
  --chart-background: oklch(0.145 0 0);
  --chart-foreground: oklch(0.45 0 0);
  --chart-foreground-muted: oklch(0.65 0.01 260);
  --chart-crosshair: oklch(0.45 0 0);
  --chart-grid: oklch(0.25 0 0);
  --chart-brush-border: var(--chart-grid);
  --chart-marker-background: oklch(0.25 0.01 260);
  --chart-marker-border: oklch(0.4 0.01 260);
  --chart-marker-foreground: oklch(0.9 0 0);
  --chart-label: oklch(0.75 0.01 260);
  --chart-scale-01: oklch(0.28 0.03 270);
  --chart-scale-02: oklch(0.38 0.04 270);
  --chart-scale-03: oklch(0.48 0.05 270);
  --chart-scale-04: oklch(0.58 0.06 270);
  --chart-scale-05: oklch(0.68 0.07 270);
  --chart-scale-pattern-color: oklch(0.145 0 0);
}
@keyframes docs-dot-swing {
  0%, 100% {
    transform: translateX(0) scale(1);
  }
  45% {
    transform: translateX(-6px) scale(0.7);
  }
}
@keyframes hell-flicker {
  0%, 100% {
    opacity: 1;
  }
  41% {
    opacity: 0.7;
  }
  43% {
    opacity: 1;
  }
  77% {
    opacity: 0.85;
  }
  78% {
    opacity: 1;
  }
}
@keyframes lights-off {
  0% {
    opacity: 0;
  }
  15% {
    opacity: 1;
  }
  30% {
    opacity: 0.2;
  }
  45% {
    opacity: 1;
  }
  60% {
    opacity: 0.5;
  }
  70%, 100% {
    opacity: 1;
  }
}
@keyframes lights-on {
  0% {
    opacity: 1;
  }
  20% {
    opacity: 0;
  }
  32% {
    opacity: 1;
  }
  50% {
    opacity: 0.1;
  }
  60% {
    opacity: 0.9;
  }
  75%, 100% {
    opacity: 0;
  }
}
@keyframes lights-fade {
  to {
    opacity: 0;
  }
}
@keyframes eyes-dim {
  from {
    opacity: 0;
  }
}
@keyframes eyes-open {
  from {
    opacity: 0;
    transform: scaleY(0.05);
  }
}
@keyframes eyes-blink {
  0%, 92%, 100% {
    transform: none;
  }
  95% {
    transform: scaleY(0.08);
  }
}
@keyframes crack-life {
  0% {
    opacity: 0;
    transform: scale(0.92);
  }
  4% {
    opacity: 1;
    transform: none;
  }
  80% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}
@keyframes egg-wobble {
  0%, 84%, 100% {
    transform: none;
  }
  87% {
    transform: rotate(-14deg);
  }
  90% {
    transform: rotate(10deg);
  }
  93% {
    transform: rotate(-6deg);
  }
  96% {
    transform: rotate(3deg);
  }
}
@keyframes page-glitch {
  0% {
    transform: none;
    filter: none;
    clip-path: none;
  }
  12% {
    transform: translate(-6px, 2px) skewX(-2deg);
    filter: hue-rotate(90deg) saturate(3);
  }
  24% {
    transform: translate(5px, -1px);
    filter: invert(1) hue-rotate(180deg);
    clip-path: inset(18% 0 52% 0);
  }
  36% {
    transform: none;
    filter: contrast(2.2) saturate(0);
    clip-path: none;
  }
  48% {
    transform: translate(9px, 0) skewX(4deg);
    filter: hue-rotate(-60deg);
    clip-path: inset(0 0 70% 0);
  }
  60% {
    transform: translate(-3px, 3px);
    filter: none;
    clip-path: inset(40% 0 20% 0);
  }
  72% {
    transform: translate(2px, -4px) scaleY(1.02);
    filter: saturate(4) contrast(1.4);
    clip-path: none;
  }
  86% {
    transform: translate(-8px, 0);
    filter: invert(1);
    clip-path: inset(62% 0 8% 0);
  }
}
@keyframes glitch-label {
  0% {
    transform: translate(0, 0);
    opacity: 1;
  }
  33% {
    transform: translate(-4px, 2px);
    opacity: 0.6;
  }
  66% {
    transform: translate(5px, -2px);
    opacity: 1;
  }
}
@keyframes deleted-progress {
  from {
    width: 0;
  }
  to {
    width: 100%;
  }
}
@keyframes deleted-restore {
  0%, 70% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}
@keyframes creeper-swell {
  0% {
    transform: scale(0.3) translateY(40px);
    opacity: 0;
    filter: none;
  }
  20% {
    transform: scale(1);
    opacity: 1;
  }
  45%, 65%, 85% {
    filter: brightness(3) saturate(0);
  }
  55%, 75% {
    filter: none;
  }
  100% {
    transform: scale(1.35);
    filter: brightness(4) saturate(0);
  }
}
@keyframes creeper-flash {
  from {
    opacity: 0.85;
  }
  to {
    opacity: 0;
  }
}
@property --tw-rotate-x {
  syntax: "*";
  inherits: false;
}
@property --tw-rotate-y {
  syntax: "*";
  inherits: false;
}
@property --tw-rotate-z {
  syntax: "*";
  inherits: false;
}
@property --tw-skew-x {
  syntax: "*";
  inherits: false;
}
@property --tw-skew-y {
  syntax: "*";
  inherits: false;
}
@property --tw-border-style {
  syntax: "*";
  inherits: false;
  initial-value: solid;
}
@property --tw-gradient-position {
  syntax: "*";
  inherits: false;
}
@property --tw-gradient-from {
  syntax: "<color>";
  inherits: false;
  initial-value: #0000;
}
@property --tw-gradient-via {
  syntax: "<color>";
  inherits: false;
  initial-value: #0000;
}
@property --tw-gradient-to {
  syntax: "<color>";
  inherits: false;
  initial-value: #0000;
}
@property --tw-gradient-stops {
  syntax: "*";
  inherits: false;
}
@property --tw-gradient-via-stops {
  syntax: "*";
  inherits: false;
}
@property --tw-gradient-from-position {
  syntax: "<length-percentage>";
  inherits: false;
  initial-value: 0%;
}
@property --tw-gradient-via-position {
  syntax: "<length-percentage>";
  inherits: false;
  initial-value: 50%;
}
@property --tw-gradient-to-position {
  syntax: "<length-percentage>";
  inherits: false;
  initial-value: 100%;
}
@property --tw-font-weight {
  syntax: "*";
  inherits: false;
}
@property --tw-tracking {
  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-outline-style {
  syntax: "*";
  inherits: false;
  initial-value: solid;
}
@property --tw-blur {
  syntax: "*";
  inherits: false;
}
@property --tw-brightness {
  syntax: "*";
  inherits: false;
}
@property --tw-contrast {
  syntax: "*";
  inherits: false;
}
@property --tw-grayscale {
  syntax: "*";
  inherits: false;
}
@property --tw-hue-rotate {
  syntax: "*";
  inherits: false;
}
@property --tw-invert {
  syntax: "*";
  inherits: false;
}
@property --tw-opacity {
  syntax: "*";
  inherits: false;
}
@property --tw-saturate {
  syntax: "*";
  inherits: false;
}
@property --tw-sepia {
  syntax: "*";
  inherits: false;
}
@property --tw-drop-shadow {
  syntax: "*";
  inherits: false;
}
@property --tw-drop-shadow-color {
  syntax: "*";
  inherits: false;
}
@property --tw-drop-shadow-alpha {
  syntax: "<percentage>";
  inherits: false;
  initial-value: 100%;
}
@property --tw-drop-shadow-size {
  syntax: "*";
  inherits: false;
}
@property --tw-duration {
  syntax: "*";
  inherits: false;
}
@property --tw-ease {
  syntax: "*";
  inherits: false;
}
@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-rotate-x: initial;
      --tw-rotate-y: initial;
      --tw-rotate-z: initial;
      --tw-skew-x: initial;
      --tw-skew-y: initial;
      --tw-border-style: solid;
      --tw-gradient-position: initial;
      --tw-gradient-from: #0000;
      --tw-gradient-via: #0000;
      --tw-gradient-to: #0000;
      --tw-gradient-stops: initial;
      --tw-gradient-via-stops: initial;
      --tw-gradient-from-position: 0%;
      --tw-gradient-via-position: 50%;
      --tw-gradient-to-position: 100%;
      --tw-font-weight: initial;
      --tw-tracking: 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-outline-style: solid;
      --tw-blur: initial;
      --tw-brightness: initial;
      --tw-contrast: initial;
      --tw-grayscale: initial;
      --tw-hue-rotate: initial;
      --tw-invert: initial;
      --tw-opacity: initial;
      --tw-saturate: initial;
      --tw-sepia: initial;
      --tw-drop-shadow: initial;
      --tw-drop-shadow-color: initial;
      --tw-drop-shadow-alpha: 100%;
      --tw-drop-shadow-size: initial;
      --tw-duration: initial;
      --tw-ease: initial;
      --tw-scale-x: 1;
      --tw-scale-y: 1;
      --tw-scale-z: 1;
    }
  }
}