diff --git a/app/apps/[slug]/page.tsx b/app/apps/[slug]/page.tsx index 280bbc5..a5f759b 100644 --- a/app/apps/[slug]/page.tsx +++ b/app/apps/[slug]/page.tsx @@ -15,19 +15,28 @@ export default async function AppDetailPage({ params }: { params: Promise<{ slug const appResources = await getApps(); const related = appResources.filter((i) => i.slug !== slug).slice(0, 3); return ( -
+
-
-
-
-
{app.icon}
-
-

{app.name}

-

{app.subtitle}

+
+
+
+
+
{app.icon}
+
+

{app.name}

+

{app.subtitle}

+
+
+
+ {app.tags.map((t) => {t})} +
+
+
+
+

下载提示

+

建议优先使用主线路,若下载慢可切换备用源或历史版本。

+
-
-
- {app.tags.map((t) => {t})}
@@ -46,31 +55,36 @@ export default async function AppDetailPage({ params }: { params: Promise<{ slug - - -
-

软件介绍

-

{app.description}

-

使用说明

-
    - {app.usage.map((u) =>
  • {u}
  • )} -
+
+
+ +
+

软件介绍

+

{app.description}

+

使用说明

+
    + {app.usage.map((u) =>
  • {u}
  • )} +
+
+
+ + + +
+
+ + + + + + +
- - - - - - - - - - -
-

相关推荐

- -
+
+

相关推荐

+ +
); diff --git a/app/apps/page.tsx b/app/apps/page.tsx index 7eeef1f..88ed11c 100644 --- a/app/apps/page.tsx +++ b/app/apps/page.tsx @@ -4,9 +4,14 @@ import { getApps } from "@/services/apps.service"; export default async function AppsPage() { const apps = await getApps(); return ( -
-

资源列表

-

支持搜索、分类筛选、排序与加载更多(本地 mock 过滤)。

+
+
+

Download Center

+

网盘资源下载站

+

+ 聚合热门工具、影视和学习资源,支持多渠道下载与版本回溯,快速定位你需要的资源。 +

+
); diff --git a/app/globals.css b/app/globals.css index 29c98d3..d86422d 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,11 +1,17 @@ @import "tailwindcss"; :root { - --background: #050816; - --foreground: #e6edf8; - --card: rgba(15, 23, 42, 0.56); - --card-border: rgba(148, 163, 184, 0.24); - --ring: rgba(56, 189, 248, 0.45); + --background: #060b19; + --background-soft: #0b1329; + --foreground: #e8eefc; + --muted: #94a3b8; + --card: rgba(11, 19, 41, 0.72); + --card-strong: rgba(15, 25, 50, 0.9); + --card-border: rgba(148, 163, 184, 0.26); + --ring: rgba(56, 189, 248, 0.38); + --accent: #22d3ee; + --accent-2: #818cf8; + --accent-3: #f472b6; } @theme inline { @@ -17,17 +23,40 @@ @media (prefers-color-scheme: dark) { :root { - --background: #020617; - --foreground: #e2e8f0; + --background: #050915; + --foreground: #e2e8f8; } } html.light { - --background: #f4f7ff; - --foreground: #111827; - --card: rgba(255, 255, 255, 0.74); - --card-border: rgba(148, 163, 184, 0.24); - --ring: rgba(14, 116, 144, 0.28); + --background: #f3f6ff; + --background-soft: #e9efff; + --foreground: #0f172a; + --muted: #475569; + --card: rgba(255, 255, 255, 0.84); + --card-strong: rgba(255, 255, 255, 0.96); + --card-border: rgba(148, 163, 184, 0.34); + --ring: rgba(14, 116, 144, 0.22); + --accent: #0891b2; + --accent-2: #4f46e5; + --accent-3: #db2777; +} + +@keyframes bg-shift { + 0% { background-position: 0% 0%, 100% 0%, 50% 0%; } + 50% { background-position: 10% 20%, 90% 16%, 50% 100%; } + 100% { background-position: 0% 0%, 100% 0%, 50% 0%; } +} + +@keyframes panel-glow { + 0% { box-shadow: 0 12px 30px rgba(15, 23, 42, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.06); } + 50% { box-shadow: 0 14px 34px rgba(34, 211, 238, 0.16), inset 0 1px 0 rgba(255, 255, 255, 0.08); } + 100% { box-shadow: 0 12px 30px rgba(15, 23, 42, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.06); } +} + +@keyframes neon-pulse { + 0%, 100% { box-shadow: 0 10px 24px rgba(34, 211, 238, 0.28); } + 50% { box-shadow: 0 14px 30px rgba(244, 114, 182, 0.3); } } body { @@ -35,9 +64,12 @@ body { color: var(--foreground); font-family: var(--font-geist-sans), Arial, sans-serif; background-image: - radial-gradient(circle at 10% -10%, rgba(34, 211, 238, 0.18), transparent 35%), - radial-gradient(circle at 90% 0%, rgba(139, 92, 246, 0.2), transparent 36%), - radial-gradient(circle at 50% 100%, rgba(59, 130, 246, 0.1), transparent 45%); + radial-gradient(1000px 440px at 10% -10%, rgba(34, 211, 238, 0.2), transparent 64%), + radial-gradient(900px 460px at 88% -16%, rgba(129, 140, 248, 0.22), transparent 60%), + linear-gradient(180deg, var(--background-soft), var(--background)); + background-size: 120% 120%, 120% 120%, 100% 100%; + animation: bg-shift 18s ease-in-out infinite; + min-height: 100vh; } * { @@ -45,48 +77,92 @@ body { } .card-glass { - @apply rounded-xl border p-3 backdrop-blur-xl transition duration-300; - background: var(--card); + @apply rounded-2xl border p-4 backdrop-blur-xl transition duration-300; + background: + linear-gradient(140deg, color-mix(in srgb, var(--accent) 10%, transparent), transparent 40%), + linear-gradient(320deg, color-mix(in srgb, var(--accent-2) 12%, transparent), transparent 50%), + var(--card); border-color: var(--card-border); - box-shadow: 0 20px 55px rgba(2, 8, 23, 0.32), inset 0 1px 0 rgba(255, 255, 255, 0.05); + animation: panel-glow 6s ease-in-out infinite; } .card-glass:hover { - box-shadow: 0 24px 62px rgba(2, 8, 23, 0.42), 0 0 0 1px rgba(125, 211, 252, 0.16); + box-shadow: 0 18px 42px rgba(34, 211, 238, 0.2); + transform: translateY(-3px) scale(1.01); } .pill { - @apply rounded-full border px-3.5 py-1.5 text-xs font-medium transition; - background: rgba(148, 163, 184, 0.12); + @apply rounded-full border px-3.5 py-1.5 text-xs font-medium transition duration-200; + background: rgba(148, 163, 184, 0.1); border-color: rgba(148, 163, 184, 0.24); } .pill-active { - @apply text-cyan-100; + @apply text-cyan-50; background: linear-gradient(135deg, rgba(6, 182, 212, 0.46), rgba(99, 102, 241, 0.42)); border-color: rgba(125, 211, 252, 0.5); } .cta-main { - @apply rounded-xl px-5 py-2.5 text-sm font-semibold text-slate-900 transition duration-300 hover:-translate-y-0.5; - background: linear-gradient(135deg, #22d3ee, #60a5fa 52%, #a78bfa); - box-shadow: 0 10px 28px rgba(56, 189, 248, 0.35), 0 0 0 1px rgba(255, 255, 255, 0.2) inset; + @apply rounded-xl px-4 py-2 text-sm font-semibold text-slate-950 transition duration-200; + background: linear-gradient(120deg, #67e8f9 0%, #a5b4fc 50%, #f9a8d4 100%); + box-shadow: 0 10px 24px rgba(34, 211, 238, 0.28); + animation: neon-pulse 3.8s ease-in-out infinite; +} + +.cta-main:hover { + transform: translateY(-2px) scale(1.015); + box-shadow: 0 14px 32px rgba(99, 102, 241, 0.4); } .cta-sub { - @apply rounded-xl border px-5 py-2.5 text-sm transition duration-300 hover:-translate-y-0.5; - background: rgba(15, 23, 42, 0.35); + @apply rounded-xl border px-4 py-2 text-sm transition duration-200; + background: linear-gradient(180deg, rgba(15, 23, 42, 0.32), rgba(15, 23, 42, 0.2)); +} + +.cta-sub:hover { + border-color: rgba(125, 211, 252, 0.45); + background: rgba(15, 23, 42, 0.4); } .section-title { - @apply text-lg font-semibold tracking-tight md:text-xl; + @apply text-xl font-semibold tracking-tight md:text-2xl; } .input-fancy { - @apply w-full rounded-2xl border bg-slate-950/30 px-4 py-3 text-sm outline-none transition placeholder:text-slate-400; + @apply w-full rounded-2xl border px-4 py-3 text-sm outline-none transition placeholder:text-slate-400; + background: rgba(15, 23, 42, 0.36); border-color: rgba(125, 211, 252, 0.2); } .input-fancy:focus { box-shadow: 0 0 0 4px var(--ring); } + +.panel { + @apply rounded-2xl border p-4 md:p-5; + background: + linear-gradient(145deg, color-mix(in srgb, var(--accent) 7%, transparent), transparent 48%), + linear-gradient(315deg, color-mix(in srgb, var(--accent-2) 9%, transparent), transparent 52%), + var(--card); + border-color: var(--card-border); + animation: panel-glow 7s ease-in-out infinite; +} + +.panel-strong { + @apply rounded-2xl border p-4 md:p-5; + background: + linear-gradient(140deg, color-mix(in srgb, var(--accent) 12%, transparent), transparent 42%), + linear-gradient(320deg, color-mix(in srgb, var(--accent-3) 12%, transparent), transparent 55%), + var(--card-strong); + border-color: var(--card-border); + animation: panel-glow 5.5s ease-in-out infinite; +} + +.text-muted { + color: var(--muted); +} + +a, button { + transition: all 0.22s ease; +} diff --git a/app/page.tsx b/app/page.tsx index d3c4fd4..c976c0f 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,5 +1,5 @@ import { categoryLabels } from "@/lib/mock-data"; -import { HeroSection, UnlockSection } from "@/components/sections"; +import { AppGrid, HeroSection, StatsPanel, UnlockSection } from "@/components/sections"; import { ScrollReveal } from "@/components/scroll-reveal"; import { getApps } from "@/services/apps.service"; import Link from "next/link"; @@ -7,15 +7,23 @@ import Link from "next/link"; export default async function Home() { const appResources = await getApps(); const latest = [...appResources].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)); - const featured = appResources.filter((a) => a.featured).slice(0, 4); + const featured = appResources.filter((a) => a.featured).slice(0, 6); return ( -
+
-
-
+ + + + +
+
+

热门分类

+ 按分类浏览 +
+
全部 {Object.values(categoryLabels).map((label) => ( {label} @@ -23,30 +31,44 @@ export default async function Home() {
+
+
+

精选资源推荐

+ 查看更多 +
+ +
+
-
+

最新更新

查看全部
-
+
+
+ 资源信息 + 版本 + 大小 + 更新日期 +
{latest.slice(0, 8).map((app) => ( -
- {app.icon} +
+ {app.icon}
-

{app.name}

+

{app.name}

{app.subtitle}

-
- {app.version} - {app.size} - {app.updatedAt} +
+ {app.version} + {app.size} + {app.updatedAt}
))} @@ -54,26 +76,29 @@ export default async function Home() {
diff --git a/components/app-detail.tsx b/components/app-detail.tsx index 6cb426f..2986f9c 100644 --- a/components/app-detail.tsx +++ b/components/app-detail.tsx @@ -8,10 +8,10 @@ import { TRACKING_EVENTS } from "@/lib/tracking-events"; export function AppMetaInfo({ app }: { app: AppResource }) { return (
-

版本

{app.version}

-

大小

{app.size}

-

更新日期

{app.updatedAt}

-

上传日期

{app.uploadedAt}

+

版本

{app.version}

+

大小

{app.size}

+

更新

{app.updatedAt}

+

上传

{app.uploadedAt}

); } @@ -19,15 +19,15 @@ export function AppMetaInfo({ app }: { app: AppResource }) { export function DownloadButtons({ app }: { app: AppResource }) { const { track } = useTrack(); return ( -
+
{app.channels.map((c) => ( track(TRACKING_EVENTS.downloadClick, { slug: app.slug, channel: c.name, sourceType: c.type, location: "detail" })} - className="rounded-2xl border border-cyan-300/20 bg-gradient-to-br from-cyan-400/15 to-violet-400/10 p-3 text-center text-sm transition hover:-translate-y-1 hover:shadow-[0_10px_30px_rgba(34,211,238,.22)]" + className="panel-strong text-center text-sm transition hover:border-cyan-300/40 hover:bg-cyan-400/10" > - {c.name} +

{c.name}

{c.hint &&

{c.hint}

}
))} @@ -37,10 +37,10 @@ export function DownloadButtons({ app }: { app: AppResource }) { export function VersionHistory({ app }: { app: AppResource }) { return ( -
-

历史版本

+
+

历史版本

{app.versionHistory.map((v) => ( -
+

{v.version}

{v.updatedAt} · {v.size}

下载此版本
@@ -51,8 +51,8 @@ export function VersionHistory({ app }: { app: AppResource }) { export function ChangelogTimeline({ app }: { app: AppResource }) { return ( -
-

更新日志

+
+

更新日志

{app.changelog.map((item) => (
@@ -67,8 +67,8 @@ export function ChangelogTimeline({ app }: { app: AppResource }) { export function QRCodeSection() { return ( -
-
+
+
二维码区域

关注公众号并发送关键词“下载”获取解锁码。

diff --git a/components/apps-explorer.tsx b/components/apps-explorer.tsx index 0608fb7..862b121 100644 --- a/components/apps-explorer.tsx +++ b/components/apps-explorer.tsx @@ -1,7 +1,8 @@ "use client"; import { useMemo, useState } from "react"; -import { AppGrid, CategoryTabs } from "@/components/sections"; +import Link from "next/link"; +import { CategoryTabs } from "@/components/sections"; import { AppResource } from "@/lib/types"; export function AppsExplorer({ apps }: { apps: AppResource[] }) { @@ -24,21 +25,29 @@ export function AppsExplorer({ apps }: { apps: AppResource[] }) { }, [apps, query, category, sort]); return ( -
-
- setQuery(e.target.value)} - /> +
+
+
+
+ setQuery(e.target.value)} + /> +
+
+ 已找到资源 + {filtered.length} +
+
-
- 排序: +
+ 排序方式: {[ - { id: "latest", label: "最新" }, - { id: "hot", label: "最热" }, - { id: "update", label: "更新日期" }, + { id: "latest", label: "最新上架" }, + { id: "hot", label: "热度优先" }, + { id: "update", label: "最近更新" }, ].map((s) => (
- + + {filtered.length > 0 ? ( +
+ {filtered.slice(0, count).map((app) => ( +
+
+ {app.icon} +
+
+ + {app.name} + + {app.version} +
+

{app.subtitle}

+
+ {app.tags.slice(0, 3).map((tag) => ( + {tag} + ))} +
+
+
+
+
+

更新

+

{app.updatedAt}

+
+
+

体积

+

{app.size}

+
+
+

下载

+

{app.downloads}

+
+
+
+ ))} +
+ ) : ( +
+

没有找到匹配资源,换个关键词试试。

+ +
+ )} + {count < filtered.length && ( - +
+ +
)}
); diff --git a/components/navbar.tsx b/components/navbar.tsx index 8731cc7..14aa793 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -1,48 +1,43 @@ "use client"; import Link from "next/link"; -import { motion } from "framer-motion"; import { ThemeToggle } from "@/components/theme-toggle"; -import { Search, Sparkles } from "lucide-react"; +import { Search } from "lucide-react"; import { HiddenEasterEggTrigger } from "@/components/hidden-easter-egg-trigger"; import { useAuth } from "@/components/auth-provider"; export function Navbar() { const { session, loginAs, logout } = useAuth(); return ( - -
-
+
+
+
- - - Download Nova + + D + Download Nova -
-
+
- + - + 登录 / 会员
- +
); } diff --git a/components/sections.tsx b/components/sections.tsx index 39fd6c1..f778162 100644 --- a/components/sections.tsx +++ b/components/sections.tsx @@ -42,18 +42,39 @@ export function CategoryTabs({ export function HeroSection() { const { track } = useTrack(); return ( - -

找软件,直接下载

-

每日更新,版本清晰,来源可查。

- -
- {hotKeywords.map((k) => ( - {k} - ))} -
-
- track(TRACKING_EVENTS.ctaClick, { position: "hero", target: "apps" })} className="cta-main">进入资源库 - track(TRACKING_EVENTS.ctaClick, { position: "hero", target: "unlock" })} className="cta-sub">输入解锁码 + +
+
+
+
+

Download Nova

+

网盘资源下载,一站直达

+

每日更新,版本清晰,渠道可查。热门软件、学习资料、影音资源快速下载。

+ +
+ {hotKeywords.map((k) => ( + {k} + ))} +
+
+ track(TRACKING_EVENTS.ctaClick, { position: "hero", target: "apps" })} className="cta-main">进入资源库 + track(TRACKING_EVENTS.ctaClick, { position: "hero", target: "unlock" })} className="cta-sub">输入解锁码 +
+
+
+
+

今日更新

+

27

+
+
+

可用资源

+

1,286

+
+
+

总下载量

+

8.4M

+
+
);