Skip to content

Commit 21be169

Browse files
committed
feat(docs): hero 再升级科技感——流光标题、鼠标光斑、卡片光晕、数据指标带
- 标题流光渐变动画;hero 鼠标跟随光斑、特性卡光标跟随渐变描边/光晕 - 新增数据指标带(语言/工作台/平台/开源),渐变数字 - stats 文案纳入 i18n 中英双语
1 parent 3848c2a commit 21be169

3 files changed

Lines changed: 97 additions & 8 deletions

File tree

docs/src/i18n.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ const messages = {
3737
macNote: 'Apple Silicon 与 Intel',
3838
allVersions: '查看全部历史版本与安装包'
3939
},
40+
stats: {
41+
languages: '数十种', languagesLabel: '支持语言',
42+
workbenches: '6', workbenchesLabel: '核心工作台',
43+
platforms: '2', platformsLabel: '跨平台支持',
44+
open: '100%', openLabel: '开源免费'
45+
},
4046
releaseList: {title: '发布日志', intro: '每个版本的更新内容如下,点击查看详情。'},
4147
footer: {download: '下载', releases: '发布日志'}
4248
},
@@ -73,6 +79,12 @@ const messages = {
7379
macNote: 'Apple Silicon & Intel',
7480
allVersions: 'Browse all releases and installers'
7581
},
82+
stats: {
83+
languages: 'Dozens', languagesLabel: 'Languages',
84+
workbenches: '6', workbenchesLabel: 'Workbenches',
85+
platforms: '2', platformsLabel: 'Platforms',
86+
open: '100%', openLabel: 'Open source'
87+
},
7688
releaseList: {title: 'Releases', intro: 'Update notes for each version. Click to view details.'},
7789
footer: {download: 'Download', releases: 'Releases'}
7890
}

docs/src/pages/Home.vue

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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>
@@ -9,8 +9,10 @@
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">
@@ -24,7 +26,7 @@
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

@@ -38,6 +40,14 @@
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">
@@ -61,16 +71,20 @@
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'
7488
import {useI18n} from 'vue-i18n'
7589
import CodeWindow from '../components/CodeWindow.vue'
7690
import {latestRelease} from '../content/releases'
@@ -80,6 +94,28 @@ const {t} = useI18n()
8094
const langArr = ['Python', 'Rust', 'Go', 'JavaScript', 'TypeScript', 'Java', 'C', 'C++', 'Ruby', 'PHP', 'Kotlin', 'Swift']
8195
const 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+
83119
const 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

docs/src/styles/main.css

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,49 @@ body {
6363
@property --a { syntax: '<angle>'; initial-value: 0deg; inherits: false; }
6464
@keyframes spin-border { to { --a: 360deg; } }
6565

66+
/* 标题流光渐变 */
67+
@keyframes gradient-move { to { background-position: 200% center; } }
68+
.animate-gradient {
69+
background-size: 200% auto;
70+
animation: gradient-move 6s linear infinite;
71+
}
72+
73+
/* 鼠标跟随光斑(hero):由 JS 设置 --mx/--my */
74+
.spotlight-bg {
75+
background: radial-gradient(600px circle at var(--mx, 50%) var(--my, 0%), rgba(99, 102, 241, .18), transparent 60%);
76+
transition: background .15s ease-out;
77+
}
78+
79+
/* 光晕跟随卡片:hover 时跟随光标的渐变描边 */
80+
.spotlight-card { position: relative; }
81+
.spotlight-card::before {
82+
content: '';
83+
position: absolute;
84+
inset: 0;
85+
border-radius: inherit;
86+
padding: 1px;
87+
background: radial-gradient(260px circle at var(--mx, 50%) var(--my, 50%), rgba(129, 140, 248, .8), transparent 60%);
88+
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
89+
-webkit-mask-composite: xor;
90+
mask-composite: exclude;
91+
opacity: 0;
92+
transition: opacity .3s;
93+
}
94+
.spotlight-card:hover::before { opacity: 1; }
95+
.spotlight-card::after {
96+
content: '';
97+
position: absolute;
98+
inset: 0;
99+
border-radius: inherit;
100+
background: radial-gradient(240px circle at var(--mx, 50%) var(--my, 50%), rgba(99, 102, 241, .12), transparent 60%);
101+
opacity: 0;
102+
transition: opacity .3s;
103+
pointer-events: none;
104+
}
105+
.spotlight-card:hover::after { opacity: 1; }
106+
66107
@media (prefers-reduced-motion: reduce) {
67-
.animate-blob, .animate-float, .animate-spin-slow, .animate-marquee, .shimmer::after, .glow-border::before {
108+
.animate-blob, .animate-float, .animate-spin-slow, .animate-marquee, .animate-gradient, .shimmer::after, .glow-border::before {
68109
animation: none !important;
69110
}
70111
}

0 commit comments

Comments
 (0)