From ba5287add87f1de2faa7106ac0cff786d1d7bfd1 Mon Sep 17 00:00:00 2001
From: iye <1713042409@qq.com>
Date: Tue, 12 May 2026 09:30:51 +0800
Subject: [PATCH] feat(theme): apply CYBER STAR design system (purple palette +
Megrim/Audiowide/Cinzel/Inter fonts + ambient bg)
---
src/app/globals.css | 274 +++++++++++++++++++++++++++++++++++++++++---
src/app/layout.tsx | 44 +++++--
src/app/page.tsx | 137 ++++++++++++----------
3 files changed, 370 insertions(+), 85 deletions(-)
diff --git a/src/app/globals.css b/src/app/globals.css
index a2dc41e..df9660b 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,26 +1,266 @@
@import "tailwindcss";
+/* ════════════════════════════════════════════════════════════
+ CYBER STAR · 设计令牌(Tailwind v4 @theme)
+ 将所有 token 暴露为 Tailwind 工具类
+ ════════════════════════════════════════════════════════════ */
+@theme {
+ /* ── 背景层级(偏紫调深色) ── */
+ --color-deepest: #08051a;
+ --color-deep: #0d0a24;
+ --color-base: #13102e;
+ --color-surface: #1a1638;
+ --color-elevated: #221d4a;
+ --color-card: #1e1840;
+
+ /* ── 主调紫 · Royal Violet ── */
+ --color-purple-100: #ede9fe;
+ --color-purple-200: #ddd6fe;
+ --color-purple-300: #c4b5fd;
+ --color-purple-400: #a78bfa;
+ --color-purple-500: #8b5cf6;
+ --color-purple-600: #7c3aed;
+ --color-purple-700: #6d28d9;
+ --color-purple-800: #5b21b6;
+
+ /* ── 辅助蓝青(仅用于点缀光效) ── */
+ --color-blue-300: #93b8ff;
+ --color-blue-500: #2d7fff;
+ --color-cyan-400: #38d9f5;
+
+ /* ── 强调色 ── */
+ --color-magenta: #d946ef;
+ --color-pink-400: #f472b6;
+ --color-pink-500: #ec4899;
+ --color-gold-400: #fcd34d;
+ --color-silver: #c4ccd8;
+ --color-bronze: #cd7f32;
+
+ /* ── 字体(变量注入自 next/font) ── */
+ --font-logo: var(--font-megrim), "Cinzel", serif;
+ --font-display: var(--font-audiowide), "Audiowide", sans-serif;
+ --font-label: var(--font-cinzel), "Cinzel", serif;
+ --font-body: var(--font-inter), -apple-system, "Source Han Sans SC",
+ "PingFang SC", "Microsoft YaHei", sans-serif;
+
+ /* ── 自定义动画 ── */
+ --animate-pulse-glow: pulse-glow 2.4s ease-in-out infinite;
+ --animate-float: float 3s ease-in-out infinite;
+ --animate-spin-slow: spin-slow 20s linear infinite;
+}
+
+/* ════════════════════════════════════════════════════════════
+ 非 Tailwind 化的 CSS 变量(复杂值 / 渐变 / 阴影)
+ ════════════════════════════════════════════════════════════ */
:root {
- --background: #ffffff;
- --foreground: #171717;
+ --grad-hero: radial-gradient(
+ ellipse at 70% 40%,
+ #2a1f5c 0%,
+ #13102e 45%,
+ #08051a 100%
+ );
+ --grad-purple: linear-gradient(
+ 135deg,
+ #6d28d9 0%,
+ #8b5cf6 55%,
+ #a78bfa 100%
+ );
+ --grad-purple-deep: linear-gradient(160deg, #5b21b6 0%, #7c3aed 100%);
+ --grad-violet-glow: radial-gradient(
+ circle,
+ rgba(139, 92, 246, 0.4) 0%,
+ transparent 65%
+ );
+ --grad-card: linear-gradient(155deg, #221d4a 0%, #1a1638 100%);
+ --grad-shine: linear-gradient(
+ 105deg,
+ transparent 40%,
+ rgba(255, 255, 255, 0.06) 50%,
+ transparent 60%
+ );
+
+ --shadow-purple: 0 0 24px rgba(139, 92, 246, 0.5),
+ 0 0 60px rgba(139, 92, 246, 0.18);
+ --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.65),
+ inset 0 1px 0 rgba(255, 255, 255, 0.06);
+ --shadow-glow: 0 0 40px rgba(196, 181, 253, 0.25);
+
+ --border-subtle: rgba(255, 255, 255, 0.08);
+ --border-default: rgba(255, 255, 255, 0.14);
+ --border-purple: rgba(139, 92, 246, 0.55);
+ --border-glow: rgba(196, 181, 253, 0.65);
}
-@theme inline {
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --font-sans: var(--font-geist-sans);
- --font-mono: var(--font-geist-mono);
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --background: #0a0a0a;
- --foreground: #ededed;
- }
+/* ════════════════════════════════════════════════════════════
+ 全局基础样式
+ ════════════════════════════════════════════════════════════ */
+html {
+ background: var(--color-deepest);
+ color: #fff;
+ font-family: var(--font-body);
+ line-height: 1.6;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
}
body {
- background: var(--background);
- color: var(--foreground);
- font-family: Arial, Helvetica, sans-serif;
+ background: var(--color-deepest);
+ min-height: 100vh;
+ position: relative;
+ overflow-x: hidden;
+}
+
+/* ── 氛围装饰层 1 · 紫雾环境光 ── */
+body::before {
+ content: "";
+ position: fixed;
+ inset: 0;
+ background:
+ radial-gradient(
+ ellipse at 20% 10%,
+ rgba(139, 92, 246, 0.12) 0%,
+ transparent 40%
+ ),
+ radial-gradient(
+ ellipse at 80% 70%,
+ rgba(217, 70, 239, 0.08) 0%,
+ transparent 45%
+ );
+ pointer-events: none;
+ z-index: 0;
+}
+
+/* ── 氛围装饰层 2 · 星点粒子背景 ── */
+body::after {
+ content: "";
+ position: fixed;
+ inset: 0;
+ background-image:
+ radial-gradient(1px 1px at 23% 17%, rgba(255, 255, 255, 0.6), transparent),
+ radial-gradient(1px 1px at 67% 41%, rgba(196, 181, 253, 0.5), transparent),
+ radial-gradient(1.5px 1.5px at 89% 23%, rgba(255, 255, 255, 0.4), transparent),
+ radial-gradient(1px 1px at 12% 78%, rgba(196, 181, 253, 0.4), transparent),
+ radial-gradient(1px 1px at 45% 89%, rgba(255, 255, 255, 0.5), transparent),
+ radial-gradient(1.5px 1.5px at 78% 11%, rgba(255, 255, 255, 0.3), transparent),
+ radial-gradient(1px 1px at 33% 53%, rgba(196, 181, 253, 0.35), transparent),
+ radial-gradient(1px 1px at 91% 88%, rgba(255, 255, 255, 0.4), transparent);
+ pointer-events: none;
+ z-index: 0;
+}
+
+/* 页面内容须高于装饰层 */
+body > * {
+ position: relative;
+ z-index: 1;
+}
+
+/* ── 选中文字 ── */
+::selection {
+ background: rgba(139, 92, 246, 0.4);
+ color: #fff;
+}
+
+/* ── 自定义滚动条 ── */
+::-webkit-scrollbar {
+ width: 10px;
+ height: 10px;
+}
+::-webkit-scrollbar-track {
+ background: var(--color-deep);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--color-elevated);
+ border-radius: 5px;
+ border: 2px solid var(--color-deep);
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--color-purple-700);
+}
+
+/* ════════════════════════════════════════════════════════════
+ 动画 keyframes
+ ════════════════════════════════════════════════════════════ */
+@keyframes pulse-glow {
+ 0%,
+ 100% {
+ box-shadow: 0 0 12px rgba(139, 92, 246, 0.45);
+ }
+ 50% {
+ box-shadow:
+ 0 0 32px rgba(139, 92, 246, 0.85),
+ 0 0 64px rgba(139, 92, 246, 0.35);
+ }
+}
+
+@keyframes float {
+ 0%,
+ 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-6px);
+ }
+}
+
+@keyframes spin-slow {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes fade-in-up {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes shine-sweep {
+ 0% {
+ transform: translateX(-100%);
+ }
+ 100% {
+ transform: translateX(100%);
+ }
+}
+
+/* ════════════════════════════════════════════════════════════
+ 工具类(在 Tailwind 之外的、需要特殊渲染的)
+ ════════════════════════════════════════════════════════════ */
+.glow-text-purple {
+ text-shadow:
+ 0 0 16px rgba(196, 181, 253, 0.55),
+ 0 0 32px rgba(139, 92, 246, 0.35);
+}
+.glow-text-cyan {
+ text-shadow:
+ 0 0 12px rgba(56, 217, 245, 0.5);
+}
+
+.bg-grad-hero {
+ background: var(--grad-hero);
+}
+.bg-grad-purple {
+ background: var(--grad-purple);
+}
+.bg-grad-card {
+ background: var(--grad-card);
+}
+
+.shadow-purple-glow {
+ box-shadow: var(--shadow-purple);
+}
+.shadow-card {
+ box-shadow: var(--shadow-card);
+}
+
+.border-purple-glow {
+ border-color: var(--border-purple);
}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 976eb90..a21e39e 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,20 +1,44 @@
import type { Metadata } from "next";
-import { Geist, Geist_Mono } from "next/font/google";
+import { Megrim, Audiowide, Cinzel, Inter } from "next/font/google";
import "./globals.css";
-const geistSans = Geist({
- variable: "--font-geist-sans",
+const megrim = Megrim({
+ weight: "400",
subsets: ["latin"],
+ variable: "--font-megrim",
+ display: "swap",
});
-const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
+const audiowide = Audiowide({
+ weight: "400",
subsets: ["latin"],
+ variable: "--font-audiowide",
+ display: "swap",
+});
+
+const cinzel = Cinzel({
+ weight: ["400", "500", "600", "700"],
+ subsets: ["latin"],
+ variable: "--font-cinzel",
+ display: "swap",
+});
+
+const inter = Inter({
+ subsets: ["latin"],
+ variable: "--font-inter",
+ display: "swap",
});
export const metadata: Metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ title: "CYBER ✦ STAR · 虚拟偶像 Top12 出道企划",
+ description:
+ "35 位虚拟偶像候选人,由你投票决出最终出道 Top12。Cyber Star · Virtual Idol Debut Project.",
+ keywords: ["虚拟偶像", "出道", "投票", "Top12", "Cyber Star", "Virtual Idol"],
+ openGraph: {
+ title: "CYBER ✦ STAR",
+ description: "虚拟偶像 Top12 出道企划",
+ type: "website",
+ },
};
export default function RootLayout({
@@ -24,10 +48,10 @@ export default function RootLayout({
}>) {
return (
-
{children}
+ {children}
);
}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 3f36f7c..888cdeb 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,65 +1,86 @@
-import Image from "next/image";
-
export default function Home() {
return (
-
-
-
-
-
- To get started, edit the page.tsx file.
-
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
+
+ {/* Logo */}
+
+ Cyber
+
+ ✦
+
+ Star
+
+
+ {/* Subtitle */}
+
+ Virtual Idol Debut Project
+
+
+ 虚拟偶像 Top12 出道企划
+
+
+ {/* Status badge */}
+
+
+
+ Phase 2 · Theme Ready
+
+
+
+ {/* Theme verification swatches */}
+
+ {[
+ { name: "purple-300", className: "bg-purple-300" },
+ { name: "purple-500", className: "bg-purple-500" },
+ { name: "purple-700", className: "bg-purple-700" },
+ { name: "magenta", className: "bg-magenta" },
+ { name: "pink-400", className: "bg-pink-400" },
+ { name: "cyan-400", className: "bg-cyan-400" },
+ ].map((c) => (
+
+ ))}
+
+
+ {/* Font verification */}
+
+
+
+ Logo Font · Megrim
+
+
Cyber Star
+
+
+
+ Display Font · Audiowide
+
+
VOTE 2026
+
+
+
+ Label Font · Cinzel
+
+
+ DEBUT PROJECT
-
+
+
+
+ Phase 3 → Layout + Navigation 即将开始
+
+
);
}