diff --git a/app/components/CommunityNetwork.tsx b/app/components/CommunityNetwork.tsx new file mode 100644 index 00000000..b6beb80c --- /dev/null +++ b/app/components/CommunityNetwork.tsx @@ -0,0 +1,105 @@ +"use client"; + +import Image from "next/image"; +import { ArrowUpRight } from "lucide-react"; +import { motion, useReducedMotion } from "motion/react"; +import { cn } from "@/lib/utils"; + +type Outpost = { + key: string; + callsign: string; + title: string; + desc: string; + href: string; + live?: boolean; +}; + +/** + * 首页"社区网络"版块:三个生态前哨(monitor / mc / openInvest)做成全宽波段, + * 滚动进入视口时错峰升起,hover 时墨色从左漫过整条(反色 wipe)。 + * reduced-motion 时跳过入场动画,直接渲染最终可见状态。 + */ +export function CommunityNetwork({ + label, + outposts, +}: { + label: string; + outposts: Outpost[]; +}) { + const reduce = useReducedMotion(); + const animate = !reduce; + + return ( +
+
+ + {label} +
+ + +
+ ); +} diff --git a/app/components/Hero.tsx b/app/components/Hero.tsx index 413a914b..c1363604 100644 --- a/app/components/Hero.tsx +++ b/app/components/Hero.tsx @@ -2,6 +2,7 @@ import Link from "next/link"; import { Suspense } from "react"; import { getTranslations } from "next-intl/server"; import ZoteroFeedLazy from "@/app/components/ZoteroFeedLazy"; +import { CommunityNetwork } from "@/app/components/CommunityNetwork"; import { Contribute } from "@/app/components/Contribute"; import { ShareLink } from "@/app/components/ShareLink"; import Image from "next/image"; @@ -41,6 +42,31 @@ export async function Hero() { }, ]; + const communitySites = [ + { + key: "monitor", + callsign: "Live Ops", + title: t("community.monitor.title"), + desc: t("community.monitor.desc"), + href: "https://monitor.involutionhell.com/", + live: true, + }, + { + key: "mc", + callsign: "Game Node", + title: t("community.mc.title"), + desc: t("community.mc.desc"), + href: "https://mc.involutionhell.com/", + }, + { + key: "invest", + callsign: "AI Lab", + title: t("community.invest.title"), + desc: t("community.invest.desc"), + href: "https://openinvest.involutionhell.com/", + }, + ]; + return (
@@ -120,6 +146,12 @@ export async function Hero() {
+ {/* Community Network - IH 生态站点(滚动揭示 + 反色 wipe,见 CommunityNetwork) */} + + {/* Top-level directories - Grid with shared borders */}
diff --git a/messages/en.json b/messages/en.json index afb37cdd..343896ed 100644 --- a/messages/en.json +++ b/messages/en.json @@ -37,6 +37,21 @@ "title": "Community Posts", "desc": "Articles written by community members — published instantly, no PR review needed. Topics range from dev notes to technical deep-dives." } + }, + "community": { + "label": "Community Network · Our Ecosystem", + "monitor": { + "title": "Server Status", + "desc": "Live health, load & cert monitoring for every service — guarded by Ailumao." + }, + "mc": { + "title": "Minecraft Server", + "desc": "Our self-hosted MC survival server. Hop in and build together." + }, + "invest": { + "title": "openInvest", + "desc": "Open-source experiment — a multi-asset AI committee for research. Not investment advice." + } } }, "footer": { diff --git a/messages/zh.json b/messages/zh.json index 8190779a..223a0956 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -37,6 +37,21 @@ "title": "群友创作", "desc": "群友随手写的文章,不用等 PR review,发完即在。选题自由,从踩坑记录到技术思考都有。" } + }, + "community": { + "label": "社区网络 · 我们的生态", + "monitor": { + "title": "服务器状态", + "desc": "实时监控全部服务健康、负载与证书,由艾露猫看守。" + }, + "mc": { + "title": "Minecraft 服务器", + "desc": "内卷地狱自建 MC 生存服,加入一起联机开荒。" + }, + "invest": { + "title": "openInvest", + "desc": "开源实验项目:多资产 AI 投资委员会,4 角色辩论。仅供研究,非投资建议。" + } } }, "footer": { diff --git a/public/friends/ailumao.png b/public/friends/ailumao.png new file mode 100644 index 00000000..1cb1d32c Binary files /dev/null and b/public/friends/ailumao.png differ