43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import { site } from "@/content/site";
|
||
|
||
type Report = (typeof site.intelligentReport.reports)[number];
|
||
|
||
type SkillExampleContentProps = {
|
||
report: Report;
|
||
};
|
||
|
||
/**
|
||
* 示例报告内容渲染 — 卡片弹窗与详情页「示例报告」tab 共用同一套结构与样式。
|
||
* 外层(overlay/dialog/footer)由各自调用方自行包裹。
|
||
*/
|
||
export function SkillExampleContent({ report }: SkillExampleContentProps) {
|
||
return (
|
||
<div className="report-example-content">
|
||
<header className="report-example-content__header flex flex-col gap-3">
|
||
<p className="type-mono-caps-label text-body">{report.audience}</p>
|
||
<h3 className="report-example-content__title type-display-lg text-balance text-ink">
|
||
{report.example.title}
|
||
</h3>
|
||
<p className="type-mono-caption text-body">{report.example.meta}</p>
|
||
</header>
|
||
<div className="report-example-content__body">
|
||
{report.example.sections.map((sec) => (
|
||
<section key={sec.heading} className="report-example-section">
|
||
<h4 className="type-caption-strong text-ink">{sec.heading}</h4>
|
||
{"body" in sec && sec.body ? (
|
||
<p className="type-body-md text-body">{sec.body}</p>
|
||
) : null}
|
||
{"bullets" in sec && sec.bullets ? (
|
||
<ul className="report-example-list">
|
||
{sec.bullets.map((item) => (
|
||
<li key={item}>{item}</li>
|
||
))}
|
||
</ul>
|
||
) : null}
|
||
</section>
|
||
))}
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|