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

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>
);
}