:root{font-family:Inter,system-ui,sans-serif;font-size:16px;color:#fafafa;background:#0a0a0a;line-height:1.6;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}html{scroll-behavior:smooth}*{box-sizing:border-box}body{margin:0;overflow-x:hidden;background-color:#0a0a0a;background-image:linear-gradient(to right,rgba(255,255,255,.03) 1px,transparent 1px),linear-gradient(to bottom,rgba(255,255,255,.03) 1px,transparent 1px);background-size:64px 64px;animation:grid-drift 50s linear infinite}@keyframes grid-drift{0%{background-position:0 0}to{background-position:64px 64px}}body:after{content:"";position:fixed;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;background:radial-gradient(55% 38% at 50% -2%,rgba(255,255,255,.07),transparent 70%)}.font-display{font-family:Space Grotesk,sans-serif}.font-mono{font-family:JetBrains Mono,monospace}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;pointer-events:none;opacity:.03;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}a{position:relative;text-decoration:none;color:inherit}a.link-underline:after{content:"";position:absolute;left:0;bottom:-2px;width:0;height:1px;background:currentColor;transition:width .3s ease}a.link-underline:hover:after{width:100%}::selection{background:#fafafa;color:#0a0a0a}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:#0a0a0a}::-webkit-scrollbar-thumb{background:#262626}::-webkit-scrollbar-thumb:hover{background:#525252}.text-sheen{background:linear-gradient(100deg,#fafafa,#fafafa 35%,#8f8f8f,#fafafa 65%,#fafafa);background-size:220% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:sheen 7s ease-in-out infinite}@keyframes sheen{0%{background-position:160% 0}to{background-position:-60% 0}}@keyframes nudge{0%,to{transform:translateY(0);opacity:.5}50%{transform:translateY(5px);opacity:1}}.animate-nudge{animation:nudge 1.8s ease-in-out infinite}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
