Spaces:
Running
Running
| @tailwind base; | |
| @tailwind components; | |
| @tailwind utilities; | |
| @layer base { | |
| /* 暗色控制台体系:原生控件(select 弹层/滚动条/checkbox)跟随暗色 */ | |
| :root { | |
| color-scheme: dark; | |
| } | |
| html, | |
| body, | |
| #root { | |
| min-height: 100%; | |
| } | |
| select option { | |
| background-color: #12151c; | |
| color: #edeff4; | |
| } | |
| body { | |
| @apply bg-surface text-ink font-sans; | |
| font-feature-settings: "cv05" 1, "ss01" 1; | |
| } | |
| ::selection { | |
| background: rgba(237, 239, 244, 0.2); | |
| color: #ffffff; | |
| } | |
| } | |
| @layer utilities { | |
| .focus-ring { | |
| @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:ring-offset-2 focus-visible:ring-offset-[#0C0E13]; | |
| } | |
| /* 历史命名保留:与 .focus-ring 一致 */ | |
| .focus-ring-dark { | |
| @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:ring-offset-2 focus-visible:ring-offset-[#0C0E13]; | |
| } | |
| .text-balance { | |
| text-wrap: balance; | |
| } | |
| .openvuln-scrollbar { | |
| scrollbar-width: thin; | |
| scrollbar-color: rgba(237, 239, 244, 0.28) transparent; | |
| } | |
| .openvuln-scrollbar::-webkit-scrollbar { | |
| width: 6px; | |
| } | |
| .openvuln-scrollbar::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| .openvuln-scrollbar::-webkit-scrollbar-thumb { | |
| border-radius: 999px; | |
| background: rgba(237, 239, 244, 0.28); | |
| } | |
| .openvuln-scrollbar::-webkit-scrollbar-thumb:hover { | |
| background: rgba(237, 239, 244, 0.42); | |
| } | |
| } | |
| @layer components { | |
| .openvuln-title { | |
| color: #edeff4; | |
| letter-spacing: -0.02em; | |
| } | |
| /* 大字报标题:第一行空心描边(hover 时微微填充) */ | |
| .openvuln-outline { | |
| color: transparent; | |
| -webkit-text-stroke: 1.5px rgba(237, 239, 244, 0.56); | |
| transition: color 500ms cubic-bezier(0.22, 1, 0.36, 1); | |
| } | |
| h1:hover .openvuln-outline { | |
| color: rgba(237, 239, 244, 0.12); | |
| } | |
| @supports not ((-webkit-text-stroke: 1px white)) { | |
| .openvuln-outline { | |
| color: rgba(237, 239, 244, 0.56); | |
| } | |
| } | |
| /* 大字报标题整行印刷式抬升入场 */ | |
| .ov-line-mask { | |
| display: block; | |
| overflow: hidden; | |
| padding-bottom: 0.12em; | |
| } | |
| .ov-line { | |
| display: block; | |
| transform: translateY(112%); | |
| animation: ov-line-up 850ms cubic-bezier(0.19, 1, 0.22, 1) forwards; | |
| } | |
| .openvuln-title-mark { | |
| position: relative; | |
| display: inline-block; | |
| -webkit-text-stroke: 0; | |
| } | |
| .openvuln-title-comma { | |
| display: inline-block; | |
| margin-left: 4px; | |
| } | |
| .openvuln-title-period { | |
| width: 0.1em; | |
| height: 0.1em; | |
| margin-left: 0.1em; | |
| border-radius: 999px; | |
| background: rgba(237, 239, 244, 0.88); | |
| } | |
| @keyframes ov-line-up { | |
| to { | |
| transform: translateY(0); | |
| } | |
| } | |
| /* 滚动进入视口的克制上浮 */ | |
| .ov-reveal { | |
| opacity: 0; | |
| transform: translateY(14px); | |
| transition: | |
| opacity 420ms cubic-bezier(0.22, 1, 0.36, 1), | |
| transform 420ms cubic-bezier(0.22, 1, 0.36, 1); | |
| } | |
| .ov-reveal.ov-in { | |
| opacity: 1; | |
| transform: none; | |
| } | |
| /* 顶栏导航的下划线扫入 */ | |
| .ov-navlink { | |
| position: relative; | |
| } | |
| .ov-navlink::after { | |
| content: ""; | |
| position: absolute; | |
| left: 0; | |
| right: 0; | |
| bottom: -4px; | |
| height: 1px; | |
| background: #edeff4; | |
| transform: scaleX(0); | |
| transform-origin: left; | |
| transition: transform 260ms cubic-bezier(0.22, 1, 0.36, 1); | |
| } | |
| .ov-navlink:hover::after, | |
| .ov-navlink:focus-visible::after { | |
| transform: scaleX(1); | |
| } | |
| /* 大字报标题:第二行实心,带极轻的金属纵向光泽 */ | |
| .openvuln-solid { | |
| background: linear-gradient(180deg, #ffffff 0%, #eceef2 52%, #c2c8d2 100%); | |
| background-clip: text; | |
| -webkit-background-clip: text; | |
| color: transparent; | |
| } | |
| /* 极淡的顶部纵深,用于扫描进度页 */ | |
| .openvuln-glow { | |
| background: radial-gradient(ellipse 52% 30% at 50% 0%, rgba(237, 239, 244, 0.04), transparent 70%); | |
| } | |
| .openvuln-brand { | |
| animation: openvuln-enter 700ms cubic-bezier(0.22, 1, 0.36, 1) both; | |
| } | |
| .openvuln-composer { | |
| animation: openvuln-enter 760ms 90ms cubic-bezier(0.22, 1, 0.36, 1) both; | |
| } | |
| .openvuln-panel { | |
| border: 1px solid #232833; | |
| border-radius: 16px; | |
| background: #12151c; | |
| box-shadow: 0 20px 48px -24px rgba(0, 0, 0, 0.6); | |
| } | |
| /* hero 背景视频:原生暗色线网动画,向下淡入页面底色 */ | |
| .openvuln-hero-video { | |
| position: absolute; | |
| inset: 0 0 auto 0; | |
| z-index: -10; | |
| height: 720px; | |
| overflow: hidden; | |
| pointer-events: none; | |
| } | |
| .openvuln-hero-video video { | |
| height: 100%; | |
| width: 100%; | |
| object-fit: cover; | |
| } | |
| .openvuln-hero-video::after { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| background: linear-gradient( | |
| to bottom, | |
| rgba(12, 14, 19, 0.38) 0%, | |
| rgba(12, 14, 19, 0.18) 34%, | |
| rgba(12, 14, 19, 0.55) 62%, | |
| rgba(12, 14, 19, 0.94) 86%, | |
| #0c0e13 100% | |
| ); | |
| } | |
| } | |
| @keyframes openvuln-enter { | |
| from { | |
| opacity: 0; | |
| transform: translateY(12px) scale(0.99); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0) scale(1); | |
| } | |
| } | |
| @keyframes live-scan-sweep { | |
| from { | |
| transform: translateX(-105%); | |
| } | |
| to { | |
| transform: translateX(305%); | |
| } | |
| } | |
| .live-scan-sweep { | |
| animation: live-scan-sweep 2.4s ease-in-out infinite; | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| .openvuln-brand, | |
| .openvuln-composer { | |
| animation: none; | |
| } | |
| .live-scan-sweep { | |
| animation: none; | |
| transform: translateX(200%); | |
| } | |
| .openvuln-hero-video video { | |
| display: none; | |
| } | |
| .ov-line { | |
| animation: none; | |
| transform: none; | |
| } | |
| .ov-reveal { | |
| opacity: 1; | |
| transform: none; | |
| transition: none; | |
| } | |
| .ov-navlink::after { | |
| transition: none; | |
| } | |
| } | |
| body.openvuln-running { | |
| overflow: hidden; | |
| background: #0c0e13; | |
| } | |
| body.openvuln-running .app-shell-chrome { | |
| display: none; | |
| } | |