You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.4 KiB
154 lines
5.4 KiB
import React from "react";
|
|
|
|
interface AboutMarkdownSectionProps {
|
|
content: string;
|
|
title?: string;
|
|
locale?: string;
|
|
ctaHref?: string;
|
|
ctaLabel?: string;
|
|
fullHeight?: boolean;
|
|
}
|
|
|
|
export function AboutMarkdownSection({
|
|
content,
|
|
title,
|
|
locale = "zh-CN",
|
|
ctaHref,
|
|
ctaLabel,
|
|
fullHeight = false,
|
|
}: AboutMarkdownSectionProps) {
|
|
if (!content) {
|
|
return null;
|
|
}
|
|
|
|
const isEnglish = locale === "en";
|
|
const defaultTitle = isEnglish ? "About Henggan" : "关于衡感智能";
|
|
const defaultCtaLabel = isEnglish ? "Download Solution" : "下载了解方案";
|
|
const coreKeyword = isEnglish ? "Core Positioning:" : "核心定位";
|
|
|
|
const rawParagraphs = content
|
|
.split(/\r?\n+/)
|
|
.map((paragraph) => paragraph.trim())
|
|
.filter(Boolean);
|
|
|
|
const paragraphs = rawParagraphs.filter(
|
|
(paragraph, index) => rawParagraphs.indexOf(paragraph) === index,
|
|
);
|
|
|
|
if (paragraphs.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
const [headline, ...rest] = paragraphs;
|
|
const coreIndex = rest.findIndex((item) => item.startsWith(coreKeyword));
|
|
|
|
let coreLine: string | undefined;
|
|
let coreDescription: string | undefined;
|
|
|
|
if (coreIndex >= 0) {
|
|
// 提取核心定位行
|
|
coreLine = rest[coreIndex];
|
|
|
|
// 提取核心定位后面的描述文本(如果有的话)
|
|
if (coreIndex + 1 < rest.length) {
|
|
const nextParagraph = rest[coreIndex + 1];
|
|
if (nextParagraph && !nextParagraph.startsWith(coreKeyword)) {
|
|
coreDescription = nextParagraph;
|
|
// 移除核心定位行和描述文本
|
|
rest.splice(coreIndex, 2);
|
|
} else {
|
|
// 只移除核心定位行
|
|
rest.splice(coreIndex, 1);
|
|
}
|
|
} else {
|
|
// 只移除核心定位行
|
|
rest.splice(coreIndex, 1);
|
|
}
|
|
}
|
|
|
|
// 如果没有找到描述文本,使用默认的
|
|
if (!coreDescription) {
|
|
coreDescription = isEnglish
|
|
? "Through the synergy of AI perception, intelligent hardware, and digital twins, urban structures can have continuously evolving self-defense capabilities, building an integrated safety decision-making closed loop."
|
|
: "通过 AI 感知、智能硬件与数字孪生协同,让城市结构具备持续演化的自我防御能力,构建一体化的安全决策闭环。";
|
|
}
|
|
|
|
const heightClass = fullHeight
|
|
? "min-h-[calc(100vh-4rem)] md:min-h-[calc(100vh-6rem)]"
|
|
: "";
|
|
|
|
return (
|
|
<section className={`relative overflow-hidden bg-[#f5f7fb] py-16 text-[#0f1f39] md:py-20 ${heightClass}`}>
|
|
<div className="absolute inset-0">
|
|
<div className="pointer-events-none absolute inset-x-0 top-0 h-[320px] bg-gradient-to-b from-white via-[#f5f7fb] to-transparent opacity-60" />
|
|
<div className="pointer-events-none absolute left-[-120px] top-[-140px] h-[360px] w-[360px] rounded-full bg-[radial-gradient(circle,rgba(17,138,244,0.14)_0%,rgba(17,138,244,0)_70%)] blur-3xl opacity-70" />
|
|
</div>
|
|
|
|
<div className="relative mx-auto w-full max-w-5xl px-4 md:px-6">
|
|
<div className="max-w-3xl">
|
|
<p className="text-xs font-semibold uppercase tracking-[0.46em] text-[#118af4]">
|
|
{title ?? defaultTitle}
|
|
</p>
|
|
<h2 className="mt-4 text-3xl font-semibold leading-tight md:text-[38px] text-[#0f1f39]">
|
|
{headline}
|
|
</h2>
|
|
</div>
|
|
|
|
<div className="mt-8 grid gap-6 md:grid-cols-[1.1fr_0.9fr] md:items-start md:gap-10">
|
|
<div className="space-y-5 text-sm leading-relaxed text-[#4b5565] md:text-base md:leading-loose">
|
|
{rest.map((paragraph, index) => (
|
|
<p key={index}>{paragraph}</p>
|
|
))}
|
|
</div>
|
|
|
|
{coreLine && (
|
|
<div className="rounded-3xl border border-[rgba(17,138,244,0.12)] bg-white/95 p-6 shadow-[0_18px_42px_rgba(17,138,244,0.08)]">
|
|
<span className="inline-flex items-center rounded-full bg-[#118af4]/10 px-3.5 py-1 text-[11px] font-semibold uppercase tracking-[0.24em] text-[#118af4]">
|
|
Vision
|
|
</span>
|
|
<p className="mt-4 text-lg font-medium leading-relaxed text-[#0f1f39] md:text-xl">
|
|
{coreLine}
|
|
</p>
|
|
{coreDescription && (
|
|
<p className="mt-3 text-sm text-[#4b5565]">
|
|
{coreDescription}
|
|
</p>
|
|
)}
|
|
</div>
|
|
)}
|
|
</div>
|
|
|
|
{ctaHref && (
|
|
<div className="mt-10 flex flex-wrap items-center gap-4">
|
|
<a
|
|
href={ctaHref}
|
|
download
|
|
className="inline-flex items-center gap-2 rounded-full border border-[#118af4] bg-[#118af4] px-6 py-2 text-sm font-medium tracking-[0.16em] text-white transition-colors hover:bg-[#0d6efd] hover:border-[#0d6efd]"
|
|
>
|
|
<span>{ctaLabel ?? defaultCtaLabel}</span>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
className="h-4 w-4"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
strokeWidth="1.5"
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
d="M12 4v12m0 0l-4-4m4 4 4-4M4 20h16"
|
|
/>
|
|
</svg>
|
|
</a>
|
|
<span className="text-xs uppercase tracking-[0.28em] text-[#118af4]/70">
|
|
AI City Safety Initiative
|
|
</span>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|
|
|
|
|
|
|