RFC:基于 chartType 注释 + Markdown 表格的文档站卡片列表
背景
业务上需要展示「多列信息卡」式内容(如优秀文档站:主标题、站点 URL、简介、标签/亮点),版式上常见为 两列栅格、白底圆角、标签为彩色胶囊。
本仓库中,图表与部分结构化展示已统一为 HTML 注释(JSON)+ GFM 管道表格 的数据契约(见 parseTable.ts、docs/utils/chart-config.md)。descriptions 等类型将表头映射为字段、每行映射为一块 UI,但 未覆盖「双列卡片 + 标签行」 的版式需求。
本 RFC 约定:在不破坏现有注释与解析行为的前提下,用与现有图表 同一套作者写法 支持「卡片列表」;若实现,则新增独立 chartType,由 ChartRender(或 chart 插件)专门渲染。
目标
- 作者侧:与现有图表一致,在管道表上方写一行(或数组中一项)JSON 注释,包含
chartType与可选title等公共字段。 - 数据侧:一行 Markdown 表 = 一张卡片;表头列名可配置为固定语义字段(见下文「列契约」)或通过配置映射到列。
- 呈现侧:默认 桌面端两列 卡片网格式布局;窄屏 可降为单列;卡片内需展示标题、副标题/URL、正文、可换行的标签组。
- 可访问性:整体为文档型列表时,使用合适标题层级或
list/article语义(实现阶段再定,避免用「纯数据表」误导读屏,必要时role/aria与现有 chart 区一致由设计评审确认)。
非目标
- 不把 手写的 HTML
<table>作为本能力的主数据入口;主路径保持 GFM 表格(与现有一致,便于parseTable统一产chart节点)。 - 不在本 RFC 中规定具体像素级设计稿;仅规定 信息架构与数据契约。
- 不强制与某个图表库(ECharts)复用;UI 为静态卡片时可仅用 React + token/CSS。
建议命名
- chartType 取值(拟定):
docCards(或infoCards)。
命名需在实现前与 i18n、图类型切换器(若有)中展示文案一次对齐。
列契约(拟定)
在注释中不重复列举列名时,采用 约定表头(与 x/y 需匹配表头类似,可实现「宽松匹配」子 RFC 复用表头单位后缀规则):
配置扩展(可选,第二阶段):
columns或fieldMap:将注释中的逻辑名映射到实际表头(当作者想用自定义列名时)。cardColumns:每行卡片的列数,默认2;1用于全宽列表。
注释示例
单表、单种展示:
多配置并存(与现有多图数组一致):
多配置时对
docCards的列集与兄弟图表是否共用同一张表,需与现有多chartType对列子集/校验的行为保持一致(见parseTable中校验逻辑)。
与现有类型的关系
解析与渲染(实现指导)
- parseTable / chart 节点:
chartType === 'docCards'时参与图表节点生成;校验规则需定义「最少必需列」与失败时整表降级策略(与现有isChart行为对齐)。 - ChartRender(或
src/Plugins/chart下子模块):新分支渲染卡片容器;标签字符串 拆分为Tag或自绘胶囊,颜色可用哈希或行索引轮换,与主题 token 一致。 - 样式:优先使用
prefixCls+ CSS-in-JS/现有 chart 容器的边距,避免与 Slate 表格占位层z-index冲突(参考现有多图data-chart-box布局经验)。 - 国际化:若工具栏或空状态有 copy,在
src/I18n/locales.ts中增加键值。
兼容性
- 未使用
docCards的文档与现有表图行为不变。 - 新类型占用了新的
chartType字符串;不与现有pie、bar、descriptions等冲突。 - 回滚:仅移除
docCards分支与作者示例即可,解析器可保留「未知类型降级」的默认策略(以当前代码为准)。
测试用例建议
- 单表 +
docCards:表头带单位后缀时是否仍能匹配到「简介」等逻辑列(若复用列名匹配 RFC)。 - 无「亮点」列:卡片仅显示标题+简介,不抛错。
- 标签字符串含连续分隔符、首尾空白、中英文混合。
- 多
chartType数组里同时包含docCards时,与仅docCards的列校验一致。 - 小视口下布局为单列(或横向滚动不溢出),与现有 chart 容器的
minWidth行为不冲突。
开放问题
- 标签列是否允许多行 Markdown 或内联 HTML,还是纯文本?建议第一版仅纯文本 + 固定分隔符。
- 卡片主链接:整卡可点还是仅 URL 可点?涉及
pointer-events与编辑器内可编辑性。 - 是否需要与 链接卡片(
type: "card"注释 + Markdown 链接,见语法 skill)在视觉上统一;若统一,设计 token 是否从一处继承。
状态
- Implemented:v2.33.0 起以
chartType: "docCards"落地。实现细节:- 渲染:
src/Plugins/chart/DocCards/(DocCards.tsx+style.ts+utils.ts)。 - 解析降级:
src/MarkdownEditor/editor/parser/parse/parseTable.ts在chartType === 'docCards'时仅校验「主标题」最少必需列;命中失败整表降级为普通 Markdown 表格。 - 公共契约:
columns/dataSource/title与现有 chart 节点一致;cardColumns、fieldMap放在 chart config 的rest中(与groupBy、colorLegend等附加配置同位)。 - i18n:新增
docCards标签(中文「卡片列表」/英文「Card List」)。 - 单元测试:
src/Plugins/chart/__tests__/DocCards.test.tsx、src/MarkdownEditor/editor/parser/__tests__/parseTable.test.ts。 - 演示与文档:
docs/demos/markdown-doc-cards.tsx、docs/demos-pages/chart.md与docs/utils/chart-config.md。
- 渲染:
