1cd309d56d
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>
45 lines
1.3 KiB
Plaintext
45 lines
1.3 KiB
Plaintext
---
|
||
// 页面骨架(spec §9.3 首批公共组件)。
|
||
// 数据经 Props 注入(site + page meta)——本组件不直接调 loadRenderData;
|
||
// 页面层取数后下传(单一入口纪律的组件侧配合:布局对数据来源保持无感)。
|
||
import SeoHead from '../components/SeoHead.astro'
|
||
import SiteFooter from '../components/SiteFooter.astro'
|
||
import SiteHeader from '../components/SiteHeader.astro'
|
||
import type { RenderData } from '../lib/load-render-data'
|
||
import type { PageMeta } from '../lib/ui'
|
||
import '../styles/tokens.css'
|
||
|
||
interface Props {
|
||
/** 渲染数据(loadRenderData() 的返回值——页面层负责调用) */
|
||
data: Pick<RenderData, 'site' | 'routes'>
|
||
page: PageMeta
|
||
}
|
||
|
||
const { data, page } = Astro.props
|
||
---
|
||
|
||
<!doctype html>
|
||
<html lang={data.site.locale}>
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<SeoHead site={data.site} page={page} />
|
||
</head>
|
||
<body>
|
||
<SiteHeader site={data.site} routes={data.routes} />
|
||
<main class="site-main">
|
||
<div class="site-container">
|
||
<slot />
|
||
</div>
|
||
</main>
|
||
<SiteFooter site={data.site} />
|
||
</body>
|
||
</html>
|
||
|
||
<style>
|
||
.site-main {
|
||
min-height: 60vh;
|
||
padding-block: var(--space-4);
|
||
}
|
||
</style>
|