MSList/components/ServerCard.tsx
mei d26b82ed7d refactor(servers): 优化服务器描述格式和布局
- 修改了服务器描述的 CSS 样式,使其具有更好的可读性和排版
- 更新了多个服务器的描述文本,统一格式为换行显示
- 调整了部分服务器的版本范围和类型信息
2025-02-04 20:27:06 +08:00

159 lines
5.5 KiB
TypeScript

import Image from "next/image";
import { Github, PanelsTopLeft, Podcast, Server } from "lucide-react";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faBlog, faBook } from '@fortawesome/free-solid-svg-icons';
import { faDiscord, faQq, faTelegram } from '@fortawesome/free-brands-svg-icons';
interface Server {
name: string;
description: string;
version_type: string;
version_range?: string;
image?: string;
links?: {
downloads?: string[];
"icon-GitHub"?: string;
"icon-website"?: string;
"icon-blog"?: string;
"icon-wiki"?: string;
"icon-discord"?: string;
"icon-QQ"?: string;
"icon-telegram"?: string;
"icon-shequ"?: string;
};
}
interface ServerProps {
server: Server;
theme: string;
}
export default function ServerCard({ server, theme }: ServerProps) {
return (
<div
className={`rounded-lg shadow-lg overflow-hidden ${theme === "dark" ? "bg-gray-800" : "bg-white"
}`}
>
<div className="p-4">
<div className="flex items-center mb-4">
<Image
src={server.image || "/placeholder.svg"}
alt={server.name}
width={64}
height={64}
className="rounded-full"
/>
<div className="ml-4">
<h2 className="text-xl font-semibold">{server.name}</h2>
<p className="text-sm text-gray-500">{server.version_type}</p>
</div>
</div>
<p className="text-sm mb-4 whitespace-pre-wrap leading-tight">{server.description}</p>
<p className="text-sm mb-2">: {server.version_range || "无"}</p>
<div className="flex flex-wrap gap-2 mb-4">
{Array.isArray(server.links?.downloads) &&
server.links.downloads.length > 0 ? (
server.links.downloads.map((link, index) => (
<a
key={index}
href={link}
target="_blank"
rel="noopener noreferrer"
className={`text-sm px-2 py-1 rounded ${theme === "dark"
? "bg-blue-600 hover:bg-blue-700"
: "bg-blue-100 hover:bg-blue-200"
}`}
>
{index + 1}
</a>
))
) : (
<p className="text-sm text-gray-500"></p>
)}
</div>
<div className="flex gap-4">
{server.links?.["icon-GitHub"] && (
<a
href={server.links["icon-GitHub"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<Github className="w-6 h-6" />
</a>
)}
{server.links?.["icon-website"] && (
<a
href={server.links["icon-website"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<FontAwesomeIcon icon={faBlog} className="w-6 h-6" />
</a>
)}
{server.links?.["icon-blog"] && (
<a
href={server.links["icon-blog"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<PanelsTopLeft className="w-6 h-6" />
</a>
)}
{server.links?.["icon-discord"] && (
<a
href={server.links["icon-discord"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<FontAwesomeIcon icon={faDiscord} className="w-6 h-6" />
</a>
)}
{server.links?.["icon-wiki"] && (
<a
href={server.links["icon-wiki"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<FontAwesomeIcon icon={faBook} className="w-6 h-6" />
</a>
)}
{server.links?.["icon-QQ"] && (
<a
href={server.links["icon-QQ"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<FontAwesomeIcon icon={faQq} className="w-6 h-6" />
</a>
)}
{server.links?.["icon-telegram"] && (
<a
href={server.links["icon-telegram"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<FontAwesomeIcon icon={faTelegram} className="w-6 h-6" />
</a>
)}
{server.links?.["icon-shequ"] && (
<a
href={server.links["icon-shequ"]}
target="_blank"
rel="noopener noreferrer"
className="text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
>
<Podcast className="w-6 h-6" />
</a>
)}
</div>
</div>
</div>
);
}