# V14.2 component contracts

## Contract schema

每个组件文档使用以下字段：`purpose`、`semanticElement`、`requiredProps`、`optionalProps`、`states`、`keyboard`、`responsive`、`motion`、`contentLimits`、`a11yAssertions`、`analytics/privacy`、`owner`、`reviewDate`。

## Header

`semanticElement=header+nav`; props `inverse`, `activePath`, `menuOpen`; states closed/open/keyboard-focus/no-js. Escape 关闭并还焦点，外部点击关闭，菜单内 Tab 不穿透。桌面完整 Logo 216–240 px，手机独立 H；当前页有 `aria-current` 和非颜色状态。禁止把 H 作为 CSS mask。

## GalleryFrame

`semanticElement=figure`; props `title`, `image`, `imageAlt`, `role`, `date`, `source`, `status`, `limitation`. 画框不超过一个主角；caption 缺字段时显示 review 状态。动画仅移动 frame/content/caption，H 静止；reduced-motion 立即显示。

## BlogCard

`semanticElement=article`; required `title/dek/author/date/readingTime/type/status/href`; title 最多两行视觉截断但完整文本可访问；卡片链接区域至少 44×44 px。空结果说明筛选条件并提供清除动作。

## ProofMetric

`semanticElement=section` + table fallback; required `value/definition/unit/period/sample/source/owner/limit`; `[00]` 只能是示意值。颜色不作为唯一编码，图表必须有文本摘要和数据表。

## DownloadCard

显示文件名、版本、格式、页数/大小、适用对象、SHA（若有）、权利状态和下载/查看动作。不可把“内部评审”写成“已获商用授权”；文件缺失时提供明确错误和联系入口。

## FormField

可见 label、必填说明、输入类型、错误/帮助文本和 `aria-describedby`；提交前显示隐私目的、保存期限、撤回方式。浏览器本地摘要不上传、不写日志；失败后保留已填内容。

## StatusBadge

状态词与图标/文字同时出现：concept、pilot、active、archived、rights-review。红色只作强调，不单独承载状态；状态变更写入内容/发布日志。
