/** * OmniMotion — 极光按钮 / AuroraButton (React 18+ · 纯 CSS 版本) * 用法: 立即开始 */ import { useEffect } from "react"; const KEYFRAMES = ` @keyframes mk-aurora-sweep { 0% { transform: translate3d(-120%, 0, 0) skewX(-18deg); opacity: 0; } 18% { opacity: 0.85; } 100% { transform: translate3d(220%, 0, 0) skewX(-18deg); opacity: 0; } } .mk-aurora { position: relative; overflow: hidden; isolation: isolate; } .mk-aurora__glow { position: absolute; inset: 0; pointer-events: none; background: linear-gradient(100deg, transparent 34%, rgba(255, 255, 255, 0.42) 50%, transparent 66%); transform: translate3d(-120%, 0, 0) skewX(-18deg); } .mk-aurora:hover .mk-aurora__glow { animation: mk-aurora-sweep 2.6s cubic-bezier(0.2, 0.8, 0.2, 1) infinite; } @media (prefers-reduced-motion: reduce) { .mk-aurora__glow { animation: none !important; } } `; const VARIANTS = { solid: { background: "var(--mk-primary)", color: "var(--mk-primary-foreground)" }, outline: { background: "transparent", color: "var(--mk-primary)" }, }; const SIZES = { sm: { height: 36, fontSize: 13 }, md: { height: 44, fontSize: 15 }, lg: { height: 52, fontSize: 16 }, }; export default function AuroraButton({ variant = "solid", size = "md", loading = false, disabled = false, onClick, children, }) { useEffect(() => { if (document.getElementById("mk-aurora-css")) return; const tag = document.createElement("style"); tag.id = "mk-aurora-css"; tag.textContent = KEYFRAMES; document.head.appendChild(tag); }, []); const tone = VARIANTS[variant] || VARIANTS.solid; const box = SIZES[size] || SIZES.md; const inert = loading || disabled; return ( ); }