11<template >
22 <!-- Hero(始终深色,营造科技感) -->
3- <section class =" relative isolate overflow-hidden bg-slate-950 text-white" >
3+ <section class =" relative isolate overflow-hidden bg-slate-950 text-white" @mousemove = " onHeroMove " >
44 <!-- 极光光晕 -->
55 <div class =" pointer-events-none absolute inset-0 -z-10" >
66 <div class =" absolute -top-40 left-1/4 h-[28rem] w-[28rem] rounded-full bg-brand-600/30 blur-[120px] animate-blob" ></div >
99 </div >
1010 <!-- 网格 -->
1111 <div class =" pointer-events-none absolute inset-0 -z-10 bg-[linear-gradient(to_right,rgba(255,255,255,.05)_1px,transparent_1px),linear-gradient(to_bottom,rgba(255,255,255,.05)_1px,transparent_1px)] bg-[size:44px_44px] [mask-image:radial-gradient(ellipse_at_50%_30%,black,transparent_70%)]" ></div >
12+ <!-- 鼠标跟随光斑 -->
13+ <div ref =" spot" class =" spotlight-bg pointer-events-none absolute inset-0 -z-10" ></div >
1214
13- <div class =" max-w-6xl mx-auto px-5 pt-24 pb-28 grid lg:grid-cols-2 gap-14 items-center" >
15+ <div class =" max-w-6xl mx-auto px-5 pt-24 pb-20 grid lg:grid-cols-2 gap-14 items-center" >
1416 <div >
1517 <RouterLink v-if =" latestRelease " :to =" ` /release/${latestRelease .version } ` "
1618 class="inline-flex items-center gap-2 rounded-full border border-white/15 bg-white/5 px-3.5 py-1.5 text-sm text-slate-200 backdrop-blur hover:border-brand-400 /60 transition-colors">
2426
2527 <h1 class =" mt-7 text-[3rem] leading-[1.05] sm:text-[4.25rem] font-extrabold tracking-tight" >
2628 <span class =" text-white" >{{ t('hero.title1') }}</span ><br />
27- <span class =" bg-gradient-to-r from-brand-300 via-violet-300 to-cyan -300 bg-clip-text text-transparent" >{{ t('hero.title2') }}</span >
29+ <span class =" animate-gradient bg-gradient-to-r from-brand-300 via-cyan-300 via- violet-300 to-brand -300 bg-clip-text text-transparent drop-shadow-[0_2px_20px_rgba(129,140,248,.35)] " >{{ t('hero.title2') }}</span >
2830 </h1 >
2931 <p class =" mt-6 max-w-lg text-lg text-slate-300/90 leading-relaxed" >{{ t('hero.subtitle') }}</p >
3032
3840 {{ t('hero.github') }}
3941 </a >
4042 </div >
43+
44+ <!-- 数据指标 -->
45+ <div class =" mt-12 grid grid-cols-4 gap-4 max-w-lg" >
46+ <div v-for =" s in stats" :key =" s.label" >
47+ <div class =" text-2xl sm:text-3xl font-extrabold bg-gradient-to-br from-white to-slate-400 bg-clip-text text-transparent" >{{ s.value }}</div >
48+ <div class =" mt-1 text-xs text-slate-400" >{{ s.label }}</div >
49+ </div >
50+ </div >
4151 </div >
4252
4353 <div class =" lg:pl-4" >
6171 </div >
6272 <div class =" grid sm:grid-cols-2 lg:grid-cols-3 gap-5" >
6373 <div v-for =" f in features" :key =" f.key"
64- class =" group relative p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-white dark:bg-white/[.03] hover:-translate-y-1 hover:shadow-soft dark:hover:bg-white/[.06] transition-all duration-300" >
65- <div class =" w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/15 to-violet-500/15 text-brand-600 dark:text-brand-300 flex items-center justify-center ring-1 ring-brand-500/20" v-html =" f.icon" ></div >
66- <h3 class =" mt-4 font-semibold text-lg text-slate-900 dark:text-white" >{{ t(`features.items.${f.key}.title`) }}</h3 >
67- <p class =" mt-2 text-slate-600 dark:text-slate-400 leading-relaxed" >{{ t(`features.items.${f.key}.desc`) }}</p >
74+ class =" spotlight-card group p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-white dark:bg-white/[.03] hover:-translate-y-1 transition-all duration-300"
75+ @mousemove =" onCardMove" >
76+ <div class =" relative z-10" >
77+ <div class =" w-11 h-11 rounded-xl bg-gradient-to-br from-brand-500/15 to-violet-500/15 text-brand-600 dark:text-brand-300 flex items-center justify-center ring-1 ring-brand-500/20" v-html =" f.icon" ></div >
78+ <h3 class =" mt-4 font-semibold text-lg text-slate-900 dark:text-white" >{{ t(`features.items.${f.key}.title`) }}</h3 >
79+ <p class =" mt-2 text-slate-600 dark:text-slate-400 leading-relaxed" >{{ t(`features.items.${f.key}.desc`) }}</p >
80+ </div >
6881 </div >
6982 </div >
7083 </section >
7184</template >
7285
7386<script setup lang="ts">
87+ import {computed , ref } from ' vue'
7488import {useI18n } from ' vue-i18n'
7589import CodeWindow from ' ../components/CodeWindow.vue'
7690import {latestRelease } from ' ../content/releases'
@@ -80,6 +94,28 @@ const {t} = useI18n()
8094const langArr = [' Python' , ' Rust' , ' Go' , ' JavaScript' , ' TypeScript' , ' Java' , ' C' , ' C++' , ' Ruby' , ' PHP' , ' Kotlin' , ' Swift' ]
8195const marquee = [... langArr , ... langArr ]
8296
97+ const stats = computed (() => [
98+ {value: t (' stats.languages' ), label: t (' stats.languagesLabel' )},
99+ {value: t (' stats.workbenches' ), label: t (' stats.workbenchesLabel' )},
100+ {value: t (' stats.platforms' ), label: t (' stats.platformsLabel' )},
101+ {value: t (' stats.open' ), label: t (' stats.openLabel' )}
102+ ])
103+
104+ // 鼠标跟随光效(仅客户端事件触发)
105+ const spot = ref <HTMLElement | null >(null )
106+ const onHeroMove = (e : MouseEvent ) => {
107+ const el = e .currentTarget as HTMLElement
108+ const r = el .getBoundingClientRect ()
109+ spot .value ?.style .setProperty (' --mx' , ` ${e .clientX - r .left }px ` )
110+ spot .value ?.style .setProperty (' --my' , ` ${e .clientY - r .top }px ` )
111+ }
112+ const onCardMove = (e : MouseEvent ) => {
113+ const el = e .currentTarget as HTMLElement
114+ const r = el .getBoundingClientRect ()
115+ el .style .setProperty (' --mx' , ` ${e .clientX - r .left }px ` )
116+ el .style .setProperty (' --my' , ` ${e .clientY - r .top }px ` )
117+ }
118+
83119const i = (path : string ) =>
84120 ` <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">${path }</svg> `
85121
0 commit comments