PersonalWebApplication/Client/src/index.css

220 lines
6.9 KiB
CSS
Raw Normal View History

/* ── Fonts (本地打包,离线/WSL 可用) ───────────────────────── */
@import '@fontsource-variable/fraunces/opsz.css';
@import '@fontsource-variable/fraunces/opsz-italic.css';
@import '@fontsource/hanken-grotesk/300.css';
@import '@fontsource/hanken-grotesk/400.css';
@import '@fontsource/hanken-grotesk/500.css';
@import '@fontsource/hanken-grotesk/600.css';
@import 'tailwindcss';
/* ── Design tokens暖调暗色编辑风──────────────────────────── */
@theme {
--color-bg: #17130f;
--color-surface: #221c16;
--color-text: #eae2d4;
--color-muted: #9b8f7e;
--color-accent: #c99a5b;
--color-accent-soft: #e0bd8a;
--color-line: #3a3027;
--font-display: 'Fraunces Variable', ui-serif, Georgia, serif;
--font-sans: 'Hanken Grotesk', system-ui, -apple-system, sans-serif;
}
/* ── Base ────────────────────────────────────────────────── */
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
body {
margin: 0;
min-height: 100svh;
background-color: var(--color-bg);
color: var(--color-text);
font-family: var(--font-sans);
font-weight: 400;
/* 隐藏系统光标,由 CursorFollower 接管(仅精确指针设备)*/
}
@media (pointer: fine) {
body.has-custom-cursor,
body.has-custom-cursor * {
cursor: none;
}
}
/* 选中文本配色 */
::selection {
background: var(--color-accent);
color: var(--color-bg);
}
/* 可见键盘焦点环 */
:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
}
/* ── 颗粒噪点(叠加在氛围面板上)─────────────────────────────── */
.grain::before {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
opacity: 0.06;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
mix-blend-mode: overlay;
}
/* ── 动态渐变 mesh缓慢漂移───────────────────────────────── */
@keyframes drift {
0% { transform: translate3d(-6%, -4%, 0) scale(1.15) rotate(0deg); }
50% { transform: translate3d(6%, 4%, 0) scale(1.25) rotate(8deg); }
100% { transform: translate3d(-6%, -4%, 0) scale(1.15) rotate(0deg); }
}
.mesh {
position: absolute;
inset: -25%;
background:
radial-gradient(40% 45% at 25% 30%, rgba(201, 154, 91, 0.45), transparent 70%),
radial-gradient(35% 40% at 75% 65%, rgba(140, 96, 64, 0.40), transparent 70%),
radial-gradient(45% 50% at 60% 20%, rgba(90, 70, 52, 0.40), transparent 70%);
filter: blur(40px);
animation: drift 26s ease-in-out infinite;
will-change: transform;
}
/* ── 标题下划线闪烁游标 ──────────────────────────────────────── */
@keyframes blink {
0%, 45% { opacity: 1; }
50%, 95% { opacity: 0; }
100% { opacity: 1; }
}
.cursor-bar {
animation: blink 1.15s steps(1, end) infinite;
}
/* 彩虹仿 joshwcomeau
一条横向流动的多色渐变首尾同色配合 200% 宽度做无缝平移
既可裁切到文字也可铺在装饰条上 */
@keyframes rainbow-pan {
to {
background-position: 200% center;
}
}
.rainbow-gradient {
background-image: linear-gradient(
90deg,
#ff5f6d,
#ffb13d,
#ffe14d,
#4ade80,
#38bdf8,
#a78bfa,
#f472b6,
#ff5f6d
);
background-size: 200% auto;
animation: rainbow-pan 6s linear infinite;
}
/* 把流动彩虹裁切进文字(始终显示彩虹色) */
.rainbow-text {
background-image: linear-gradient(
90deg,
#ff5f6d,
#ffb13d,
#ffe14d,
#4ade80,
#38bdf8,
#a78bfa,
#f472b6,
#ff5f6d
);
background-size: 200% auto;
-webkit-background-clip: text;
background-clip: text;
color: transparent;
animation: rainbow-pan 6s linear infinite;
}
/* 把彩虹裁进文字但不强制颜色默认用不透明文字色盖住
hover 时把文字色设为 transparentgroup-hover:text-transparent即露出彩虹 */
.rainbow-clip {
background-image: linear-gradient(
90deg,
#ff5f6d,
#ffb13d,
#ffe14d,
#4ade80,
#38bdf8,
#a78bfa,
#f472b6,
#ff5f6d
);
background-size: 200% auto;
-webkit-background-clip: text;
background-clip: text;
animation: rainbow-pan 6s linear infinite;
}
/* 整页彩虹极光背景玻璃栏透出的就是它
固定铺满视口置于所有内容之下多个彩色径向光斑缓慢漂移
再大幅模糊成柔和极光底色为暗色避免内容区透出时发灰 */
.aurora {
position: fixed;
inset: 0;
z-index: -10;
overflow: hidden;
background-color: var(--color-bg);
}
.aurora::before {
content: '';
position: absolute;
inset: -25%;
background:
radial-gradient(28% 30% at 18% 28%, rgba(255, 95, 109, 0.55), transparent 70%),
radial-gradient(26% 30% at 82% 26%, rgba(56, 189, 248, 0.50), transparent 70%),
radial-gradient(30% 34% at 72% 76%, rgba(167, 139, 250, 0.50), transparent 70%),
radial-gradient(28% 32% at 26% 80%, rgba(74, 222, 128, 0.45), transparent 70%),
radial-gradient(24% 28% at 50% 50%, rgba(255, 177, 61, 0.40), transparent 70%);
filter: blur(70px);
animation: drift 28s ease-in-out infinite;
will-change: transform;
}
/* 两侧液态玻璃竖栏
backdrop-filter 把背后的极光磨成柔光内侧一道高光边模拟玻璃厚度 */
.glass-rail {
background: rgba(255, 255, 255, 0.04);
backdrop-filter: blur(16px) saturate(140%);
-webkit-backdrop-filter: blur(16px) saturate(140%);
box-shadow: inset 0 0 60px rgba(255, 255, 255, 0.03);
}
/* 中间内容纸张:也带轻微玻璃感(压暗 + 模糊背后极光保证可读) */
.glass-sheet {
background: rgba(23, 19, 15, 0.82);
backdrop-filter: blur(22px) saturate(120%);
-webkit-backdrop-filter: blur(22px) saturate(120%);
}
/* ── reduced-motion 降级 ────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
.mesh,
.cursor-bar,
.rainbow-gradient,
.rainbow-text,
.rainbow-clip,
.aurora::before {
animation: none;
}
}