{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "sheen",
  "type": "registry:ui",
  "title": "Sheen",
  "description": "A shimmer-sweep button. A white-silver light periodically crosses the face and brightens the rim, settling through a subtle neutral afterglow back to matte. Pure CSS, zero dependencies.",
  "dependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/default/buttons/sheen/sheen.tsx",
      "type": "registry:ui",
      "target": "components/crucible/sheen.tsx",
      "content": "import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface SheenProps extends React.ComponentPropsWithoutRef<\"button\"> {\n  /** Peak color of the light pass, at its brightest. Any CSS color. @default white */\n  color?: string;\n  /** Color the rim decays through as the pass lingers and fades. @default neutral-400 */\n  afterglowColor?: string;\n  /** Seconds between the start of each pass. @default 3.5 */\n  interval?: number;\n  /** Border radius in px. @default 10 */\n  radius?: number;\n  /** Freeze the animation, holding the current frame. @default false */\n  paused?: boolean;\n}\n\n/**\n * Sheen — a shimmer-sweep button on a brushed-metal cap. Pure CSS, zero\n * dependencies. The face is a machined metal plate — a fine brushed grain\n * over a vertical light-to-shadow gradient, capped by a crisp top rim\n * highlight — that reads dimensional at rest. A soft specular highlight\n * periodically crosses it: a blurred, chromatically dispersed ramp (warm\n * silver leading edge → white core → cool blue-white trail) that accelerates\n * through the middle of its travel, with a narrow micro-glint trailing a beat\n * behind, while the rim flashes and settles through a neutral afterglow back\n * to matte. Between passes a faint slow idle sheen drifts across the plate so\n * it never sits fully dead. Honors prefers-reduced-motion by freezing on a\n * designed static rim glow with the idle sheen pinned mid-plate.\n */\nexport function Sheen({\n  color = \"#ffffff\",\n  afterglowColor = \"#a3a3a3\",\n  interval = 3.5,\n  radius = 10,\n  paused = false,\n  className,\n  style,\n  disabled,\n  children,\n  ...rest\n}: SheenProps) {\n  return (\n    <button\n      data-crucible=\"sheen\"\n      className={cn(\n        \"relative isolate inline-flex items-center justify-center gap-2 overflow-hidden\",\n        \"bg-neutral-900 px-6 py-3 text-sm font-medium text-white\",\n        \"transition-colors duration-200 select-none\",\n        \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-neutral-950\",\n        \"focus-visible:ring-[color:var(--sheen-color)]\",\n        \"disabled:cursor-not-allowed disabled:opacity-50\",\n        className\n      )}\n      style={\n        {\n          \"--sheen-color\": color,\n          \"--sheen-afterglow\": afterglowColor,\n          \"--sheen-interval\": `${interval}s`,\n          \"--sheen-play\": paused ? \"paused\" : \"running\",\n          borderRadius: radius,\n          ...style,\n        } as React.CSSProperties\n      }\n      disabled={disabled}\n      {...rest}\n    >\n      <style>{`\n        @keyframes crucible-sheen-rim {\n          0%, 6%   { border-color: var(--sheen-rim-base); box-shadow: 0 0 0 0 transparent; }\n          9%       { border-color: var(--sheen-color); box-shadow: 0 0 16px 1px color-mix(in oklab, var(--sheen-color) 70%, transparent); }\n          22%      { border-color: var(--sheen-afterglow); box-shadow: 0 0 10px 0px color-mix(in oklab, var(--sheen-afterglow) 48%, transparent); }\n          32%, 100% { border-color: var(--sheen-rim-base); box-shadow: 0 0 0 0 transparent; }\n        }\n        @keyframes crucible-sheen-band {\n          /* Accelerates through the middle of its travel — never linear. */\n          0%, 6%   { transform: translateX(-220%) skewX(-18deg); animation-timing-function: cubic-bezier(0.65, 0, 0.35, 1); }\n          9.5%     { transform: translateX(420%) skewX(-18deg); }\n          100%     { transform: translateX(420%) skewX(-18deg); }\n        }\n        @keyframes crucible-sheen-glint {\n          /* Micro-glint trails the main pass by a beat. */\n          0%, 6.8% { transform: translateX(-360%) skewX(-18deg); animation-timing-function: cubic-bezier(0.65, 0, 0.35, 1); }\n          10.8%    { transform: translateX(1300%) skewX(-18deg); }\n          100%     { transform: translateX(1300%) skewX(-18deg); }\n        }\n        @keyframes crucible-sheen-idle {\n          /* Slow low-amplitude drift so the plate breathes between passes. */\n          0%   { transform: translateX(-7%); opacity: 0.45; }\n          50%  { transform: translateX(7%);  opacity: 0.95; }\n          100% { transform: translateX(-7%); opacity: 0.45; }\n        }\n        [data-crucible=\"sheen\"] {\n          --sheen-warm: color-mix(in oklab, var(--sheen-color) 82%, #f2d3a6);\n          --sheen-cool: color-mix(in oklab, var(--sheen-color) 82%, #b6cbff);\n          /* Idle matte rim color — the single border line is owned by the\n             .sheen-rim overlay so the flash never doubles a static border.\n             Hover tints this base; the flash cycle overrides it momentarily. */\n          --sheen-rim-base: rgba(255, 255, 255, 0.10);\n          /* A transparent border reserves the 1px border box (stable sizing)\n             without drawing a second edge under the animated rim. */\n          border: 1px solid transparent;\n          /* Machined metal cap: fine brushed grain over a top-lit vertical face\n             with a soft floor-bounce lift at the base. */\n          background-image:\n            repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.016) 0px, rgba(255, 255, 255, 0.016) 1px, rgba(0, 0, 0, 0.02) 1px, rgba(0, 0, 0, 0.02) 3px),\n            linear-gradient(180deg, rgba(255, 255, 255, 0.07) 0%, rgba(255, 255, 255, 0.012) 22%, rgba(0, 0, 0, 0.18) 62%, rgba(255, 255, 255, 0.028) 100%);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), inset 0 -1px 0 rgba(0, 0, 0, 0.38);\n          transition: border-color 200ms ease, background-color 200ms ease, box-shadow 200ms ease,\n            transform 120ms ease, filter 120ms ease;\n        }\n        [data-crucible=\"sheen\"]:hover:not(:disabled) {\n          --sheen-rim-base: color-mix(in oklab, var(--sheen-color) 45%, rgba(255, 255, 255, 0.10));\n          background-color: #222226;\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.16), inset 0 -1px 0 rgba(0, 0, 0, 0.38),\n            0 0 14px 0 color-mix(in oklab, var(--sheen-color) 24%, transparent);\n        }\n        [data-crucible=\"sheen\"]:active:not(:disabled) {\n          transform: scale(0.98);\n          filter: brightness(0.9);\n        }\n        [data-crucible=\"sheen\"] .sheen-rim {\n          animation: crucible-sheen-rim var(--sheen-interval) ease-out infinite;\n          animation-play-state: var(--sheen-play);\n        }\n        [data-crucible=\"sheen\"] .sheen-band {\n          animation: crucible-sheen-band var(--sheen-interval) linear infinite;\n          animation-play-state: var(--sheen-play);\n        }\n        [data-crucible=\"sheen\"] .sheen-glint {\n          animation: crucible-sheen-glint var(--sheen-interval) linear infinite;\n          animation-play-state: var(--sheen-play);\n        }\n        [data-crucible=\"sheen\"] .sheen-idle {\n          animation: crucible-sheen-idle calc(var(--sheen-interval) * 2) ease-in-out infinite;\n          animation-play-state: var(--sheen-play);\n        }\n        [data-crucible=\"sheen\"]:disabled .sheen-rim,\n        [data-crucible=\"sheen\"]:disabled .sheen-band,\n        [data-crucible=\"sheen\"]:disabled .sheen-glint,\n        [data-crucible=\"sheen\"]:disabled .sheen-idle {\n          animation-play-state: paused;\n        }\n        @media (prefers-reduced-motion: reduce) {\n          [data-crucible=\"sheen\"] .sheen-rim,\n          [data-crucible=\"sheen\"] .sheen-band,\n          [data-crucible=\"sheen\"] .sheen-glint,\n          [data-crucible=\"sheen\"] .sheen-idle {\n            animation: none;\n          }\n          [data-crucible=\"sheen\"] .sheen-rim {\n            box-shadow: 0 0 8px 0px color-mix(in oklab, var(--sheen-color) 30%, transparent);\n            border-color: color-mix(in oklab, var(--sheen-color) 35%, transparent);\n          }\n          /* Pin the idle sheen to a legible resting pose rather than hiding it. */\n          [data-crucible=\"sheen\"] .sheen-idle {\n            transform: translateX(0%);\n            opacity: 0.7;\n          }\n          [data-crucible=\"sheen\"] .sheen-band,\n          [data-crucible=\"sheen\"] .sheen-glint {\n            display: none;\n          }\n        }\n      `}</style>\n\n      {/* Idle sheen: a broad, faint soft-light highlight that slowly drifts\n          across the plate so it has life between passes. */}\n      <span\n        aria-hidden\n        className=\"sheen-idle pointer-events-none absolute inset-0 rounded-[inherit] will-change-transform\"\n        style={{\n          background:\n            \"radial-gradient(140% 160% at 32% -30%, color-mix(in oklab, var(--sheen-color) 12%, transparent), transparent 58%)\",\n          mixBlendMode: \"soft-light\",\n        }}\n      />\n\n      {/* Rim: idle matte border that flashes and cools on every pass. */}\n      <span\n        aria-hidden\n        className=\"sheen-rim pointer-events-none absolute inset-0 rounded-[inherit] border border-transparent\"\n      />\n\n      {/* Sweep: a soft specular ramp — warm-silver leading edge, narrow white\n          core, cool blue-white trail — that crosses the face, with a thinner\n          micro-glint trailing it. */}\n      <span\n        aria-hidden\n        className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-[inherit]\"\n      >\n        <span\n          className=\"sheen-band absolute top-1/2 left-0 h-[220%] w-1/3 -translate-y-1/2 will-change-transform\"\n          style={{\n            background: [\n              \"linear-gradient(90deg\",\n              \"transparent 0%\",\n              \"color-mix(in oklab, var(--sheen-warm) 8%, transparent) 26%\",\n              \"color-mix(in oklab, var(--sheen-warm) 26%, transparent) 42%\",\n              \"color-mix(in oklab, var(--sheen-color) 92%, white) 49.5%\",\n              \"color-mix(in oklab, var(--sheen-color) 92%, white) 50.5%\",\n              \"color-mix(in oklab, var(--sheen-cool) 26%, transparent) 58%\",\n              \"color-mix(in oklab, var(--sheen-cool) 8%, transparent) 74%\",\n              \"transparent 100%)\",\n            ].join(\", \"),\n            filter: \"blur(3px)\",\n            mixBlendMode: \"soft-light\",\n            opacity: 0.95,\n          }}\n        />\n        <span\n          className=\"sheen-band absolute top-1/2 left-0 h-[220%] w-1/3 -translate-y-1/2 will-change-transform\"\n          style={{\n            background:\n              \"linear-gradient(90deg, transparent 0%, transparent 40%, color-mix(in oklab, var(--sheen-color) 80%, white) 50%, transparent 60%, transparent 100%)\",\n            filter: \"blur(2px)\",\n            mixBlendMode: \"screen\",\n            opacity: 0.55,\n          }}\n        />\n        <span\n          className=\"sheen-glint absolute top-1/2 left-0 h-[220%] w-[9%] -translate-y-1/2 will-change-transform\"\n          style={{\n            background:\n              \"linear-gradient(90deg, transparent, color-mix(in oklab, var(--sheen-cool) 65%, white) 50%, transparent)\",\n            filter: \"blur(1.5px)\",\n            mixBlendMode: \"screen\",\n            opacity: 0.35,\n          }}\n        />\n      </span>\n\n      <span className=\"relative z-10\">{children}</span>\n    </button>\n  );\n}\n"
    }
  ]
}