Files
cms-website/themes/pilot-minimal/src/components/SeoHead.astro
T
浅念 1cd309d56d feat(theme): pilot-minimal 骨架与布局组件
Plan 4 Task 3:
- themes/pilot-minimal 入 workspace(astro ^5.18 纯静态;依赖仅 astro)
- theme.manifest:contracts isThemeManifest 守卫通过——key=pilot-minimal/
  七模板条目(home/page/product-list/product-detail/news-list/news-detail/
  not-found);brand 刻意不入 requiredSiteConfig(恒可能 {},Task 1 移交契约)
- load-render-data:全主题唯一取数入口(五禁纪律结构保证,JSDoc 钉死)——
  SF_BUILD_INPUT 六文件、缺文件/形状破裂明确错误不静默空、同目录缓存单例、
  name 空→'Untitled Site'/brand 缺席→{}、编码 slug 原样贯穿(源码令牌扫描
  禁 percent-decode)
- 布局/组件:BaseLayout/SeoHead(title/desc/canonical/og)/SiteHeader(导航
  路由缺席容忍隐藏)/SiteFooter/RichText(信任链:清洗+重写后直出)/
  ResponsiveMedia/Breadcrumbs/ProductCard/NewsCard/Pagination(V1 禁用态)/
  NotFound + tokens.css(75rem/系统字体/4-8-16-24-48/中性色+单 accent)
- 根 test 链并入主题(vitest 3 + astro getViteConfig,Container API 组件
  渲染测试);typecheck 四段变五段;.astro/ 入 gitignore

354 根测试 + 16 主题测试全绿。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-22 08:38:00 +08:00

26 lines
923 B
Plaintext

---
// SEO 头(title/description/canonical/og)。description 缺席时省略对应标签
// (不渲染空 content 的 meta——Task 6 门禁③按"有则合规"检查)。
import type { SiteConfig } from '../lib/load-render-data'
import { canonicalUrl, pageTitle, type PageMeta } from '../lib/ui'
interface Props {
site: SiteConfig
page: PageMeta
}
const { site, page } = Astro.props
const title = pageTitle(site, page)
const url = canonicalUrl(site, page.path)
const description = page.description ?? ''
---
<title>{title}</title>
{description !== '' && <meta name="description" content={description} />}
<link rel="canonical" href={url} />
<meta property="og:title" content={title} />
{description !== '' && <meta property="og:description" content={description} />}
<meta property="og:url" content={url} />
<meta property="og:type" content="website" />
<meta property="og:site_name" content={site.name} />