@lark-apaas/coding-steering 0.1.22 → 0.1.23-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/coding-steering",
3
- "version": "0.1.22",
3
+ "version": "0.1.23-beta.0",
4
4
  "description": "Stack-specific steering content for miaoda-coding templates",
5
5
  "type": "module",
6
6
  "files": [
@@ -9,7 +9,7 @@ metadata:
9
9
 
10
10
  # Animated video
11
11
 
12
- Create an animated video or motion design piece rendered as an HTML page. Build a timeline-based animation with smooth transitions. Design frame-by-frame sequences with playback controls (play/pause, scrubber). Focus on visual storytelling with the Anthropic brand palette. Export-ready at a fixed aspect ratio (16:9 or 9:16). If you need to know the position of an element (eg to move a cursor or character between elements) use refs to grab the position.
12
+ Create an animated video or motion design piece rendered as an HTML page. Build a timeline-based animation with smooth transitions. Design frame-by-frame sequences with playback controls (play/pause, scrubber). Focus on visual storytelling. Export-ready at a fixed aspect ratio (16:9 or 9:16). If you need to know the position of an element (eg to move a cursor or character between elements) use refs to grab the position.
13
13
 
14
14
  START by calling `copy_starter_component` with `kind: "animations.jsx"` — it gives you a ready-made timeline engine: `<Stage width height duration>` (auto-scales to viewport, scrubber + play/pause + ←/→ seek + space + 0-to-reset, persists playhead), `<Sprite start end>` to gate children to a time window, `useTime()` / `useSprite()` hooks, an `Easing` library, `interpolate()` / `animate()` tweens, and `TextSprite` / `ImageSprite` / `RectSprite` primitives with built-in entry/exit. Read the file after copying and build YOUR scenes by composing Sprites inside a Stage; only fall back to Popmotion (https://sf3-scmcdn-cn.feishucdn.com/obj/feishu-static/miaoda/coding-unpkg-sdk/popmotion@11.0.5/dist/popmotion.min.js) if the starter genuinely can't do what you need.
15
15
 
@@ -48,7 +48,7 @@ metadata:
48
48
 
49
49
  5. **编写 ECharts 代码。** 挂载模式和 API 约束见下方技术参考。
50
50
 
51
- 6. **自检。** 截图检查结果。按文末清单验证。然后回到视觉编码步骤:渲染出来的图表是否真的表达了你想表达的信息?颜色编码与仪表盘其他部分是否一致?
51
+ 6. **自检。** 按文末清单验证渲染结果。然后回到视觉编码步骤:渲染出来的图表是否真的表达了你想表达的信息?颜色编码与仪表盘其他部分是否一致?
52
52
 
53
53
  ## 图表类型映射
54
54
 
@@ -77,6 +77,44 @@ metadata:
77
77
  - **表达覆盖**:把用户需求拆成需要被回答的信息关系;每个被承诺的关系都要有对应的图表、表格、矩阵或文字证据承载。不要用少量通用指标和默认图表替代所有分析任务。
78
78
  - **小容器防崩**:小尺寸图表优先用 bar / line / number strip。饼图、雷达图、词云和外部标签很容易挤压重叠;空间不足时换图表类型,而不是缩小到不可读。
79
79
 
80
+ ## 窄屏适配
81
+
82
+ 图表出现在报表或看板中时,移动端(≤768px)的容器宽度可能压到 300px 以下。盲目把桌面端图表原样塞进窄容器,会导致 axis label 堆叠、legend 遮盖绘图区、饼图标签溢出。以下是在窄屏容器中保证可读性的规则:
83
+
84
+ ### 布局容器
85
+
86
+ 报表中承载图表的网格必须在窄屏时折叠为单列。写多列网格时,用 `auto-fit` + `minmax()` 让浏览器自动折叠,或配合 `@media` 断点显式切换:
87
+
88
+ ```css
89
+ /* 自动折叠:每列最小 320px,不够就换行 */
90
+ .chart-grid {
91
+ display: grid;
92
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
93
+ gap: 16px;
94
+ }
95
+
96
+ /* 或显式断点 */
97
+ @media (max-width: 768px) {
98
+ .chart-grid { grid-template-columns: 1fr; }
99
+ }
100
+ ```
101
+
102
+ 不要写死 `grid-template-columns: 1.2fr 2fr` 而不提供窄屏回退——390px 视口下,1.2fr 只有 146px,放不下任何图表。
103
+
104
+ ### ECharts option 适配
105
+
106
+ 在窄容器(宽度 <400px)中调整 ECharts option:
107
+
108
+ - **legend**:改为 `orient: 'horizontal'` + `type: 'scroll'`,放在图表底部(`bottom: 0`),不要放在侧面挤占绘图区。
109
+ - **grid**:增大 `left` / `right` 留白到 `'12%'` 以上,防止 axis label 被裁切。
110
+ - **x 轴 label**:长文本加 `axisLabel: { rotate: 30, interval: 0 }` 或截断 formatter;分类超过 8 个时用 `interval: 'auto'` 让 ECharts 自动跳标签。
111
+ - **tooltip**:窄屏下 tooltip 容易超出视口,设 `confine: true`。
112
+ - **图表类型降级**:桌面端的并排双图在移动端改为上下堆叠;桌面端的 Pie 在容器宽度 <250px 时考虑改为横向 Bar。
113
+
114
+ ### 容器尺寸监听
115
+
116
+ 用 `ResizeObserver` 而非 `window.resize` 监听图表容器(见下方「技术参考 · 挂载」的封装代码)。当网格从双列折叠为单列时,window 尺寸不变但容器变宽,`resize` 事件不触发,图表不会重绘。
117
+
80
118
  ## 技术参考
81
119
 
82
120
  ### 加载 ECharts
@@ -94,23 +132,24 @@ metadata:
94
132
  <script>
95
133
  const chart = echarts.init(document.getElementById('chart'));
96
134
  chart.setOption({ /* ... */ });
97
- window.addEventListener('resize', () => chart.resize());
135
+ new ResizeObserver(() => chart.resize()).observe(document.getElementById('chart'));
98
136
  </script>
99
137
  ```
100
138
 
101
139
  ### 挂载——React 封装
102
140
 
103
- 定义一次,复用。**不要**添加 echarts-for-react
141
+ 定义一次,复用。**不要**添加 echarts-for-react。用 `ResizeObserver` 而非 `window.resize` 监听容器尺寸变化(见「窄屏适配」说明)。
104
142
 
105
143
  ```jsx
106
144
  function EChart({ option, style }) {
107
145
  const ref = React.useRef(null);
108
146
  React.useEffect(() => {
109
- const chart = echarts.init(ref.current);
147
+ const el = ref.current;
148
+ const chart = echarts.init(el);
110
149
  chart.setOption(option);
111
- const onResize = () => chart.resize();
112
- window.addEventListener('resize', onResize);
113
- return () => { chart.dispose(); window.removeEventListener('resize', onResize); };
150
+ const ro = new ResizeObserver(() => chart.resize());
151
+ ro.observe(el);
152
+ return () => { ro.disconnect(); chart.dispose(); };
114
153
  }, [option]);
115
154
  return <div ref={ref} style={{ width: '100%', minHeight: 300, ...style }} />;
116
155
  }
@@ -152,6 +191,8 @@ Object.assign(window, { EChart });
152
191
  | 17 | 双 Y 轴零点未对齐 | 匹配 `\|min\| / max` 比例 |
153
192
  | 18 | 图表 series 或容器使用阴影/发光效果 | 移除 `shadowBlur`、`shadowColor`、容器 `box-shadow`,改用线宽、透明度、注释或面积大小表达层级 |
154
193
  | 19 | 图表或标签挤压、重叠、被容器裁切 | 增大容器、减少标签、改用 tooltip / inside label,或换成更稳的图表类型 |
194
+ | 20 | 图表容器的父级网格在窄屏(≤768px)下没有折叠为单列 | 用 `auto-fit + minmax(320px, 1fr)` 或 `@media` 断点,保证每个图表容器至少 320px 宽 |
195
+ | 21 | 使用 `window.addEventListener('resize', ...)` 监听图表尺寸 | 改用 `ResizeObserver`——网格列折叠时 window 尺寸不变但容器变宽,`resize` 事件不触发 |
155
196
 
156
197
  ### 不建议
157
198
 
@@ -1,15 +1,15 @@
1
1
  ---
2
- name: data-report
3
- description: "数据驱动的报表与看板设计。从数据分析到报表规划、信息层级组织,适用于用户有数据文件或明确指标,需要产出结构化数据报表的场景。图表绘制部分由 charts skill 承担。触发词:数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data report, dashboard report, analytics report"
2
+ name: data-viz
3
+ description: "数据可视化设计。从数据分析到版面规划、信息层级组织,适用于用户有数据文件或明确指标,需要产出结构化报表、看板或可视化页面的场景。图表绘制部分由 charts skill 承担。触发词:数据可视化, 数据报表, 数据看板, 数据分析报表, BI, 经营报表, 指标看板, 周报, 月报, 数据大盘, KPI, 报表设计, data visualization, data report, dashboard report, analytics report"
4
4
  metadata:
5
5
  display-names:
6
- zh-CN: 数据看板
7
- en-US: Data Dashboard
6
+ zh-CN: 数据可视化
7
+ en-US: Data Visualization
8
8
  ---
9
9
 
10
- # 数据报表
10
+ # 数据可视化
11
11
 
12
- 你是数据报表设计者。你的工作是把原始数据变成一份读者能直接用来做判断的报表——不只是画几张图,而是回答"这份数据在说什么、读者应该关注什么"。
12
+ 你是数据可视化设计者。你的工作是把原始数据变成一份读者能直接用来做判断的可视化页面——不只是画几张图,而是回答"这份数据在说什么、读者应该关注什么"。
13
13
 
14
14
  报表的价值不在图表数量,而在信息层级:读者能在 5 秒内抓到主要结论,30 秒内理解支撑证据,需要时能下钻到明细。
15
15
 
@@ -19,7 +19,9 @@ metadata:
19
19
 
20
20
  布局必须比普通上下堆叠更丰富。先根据数据任务选择版式骨架,再写代码:监控型、复盘型、诊断型、对比型、明细型、汇报型可以有完全不同的扫描路径。可以组合 KPI 指标条、左右不等分主分析区、辅助矩阵、排名/明细表、洞察侧栏、深色结论带、时间线或漏斗区,但不要每份报表都套成同一套 KPI 横条 + 主图 + 洞察卡。不要把每个章节都做成同宽标题加一张满宽卡片;核心模块占更大面积,支撑模块用不同宽度、密度和位置服务它。
21
21
 
22
- 报表不是产品原型。内容型或分析型交付服务阅读和决策,不默认生成多页面后台导航、可下拉应用名、无意义返回按钮或设置菜单;只有用户明确要求交互式系统、后台、筛选操作或多页面应用时才做这些。标题、范围、口径、结论、图表、洞察和明细都是可用的信息部件,不是每份报表都必须同时出现的固定章节。
22
+ 报表不是产品原型。内容型或分析型交付服务阅读和决策,不默认生成多页面后台导航、可下拉应用名、无意义返回按钮或设置菜单。标题、范围、口径、结论、图表、洞察和明细都是可用的信息部件,不是每份报表都必须同时出现的固定章节。
23
+
24
+ 看板中的筛选器、标签页切换(如"今日/近7天/近30天"、"库存量/库存金额"、"30天/90天")、下拉选择等控件如果出现在页面上,必须用 JavaScript 实现真实的切换逻辑——点击后切换数据视图、过滤图表或改变显示内容。不实现功能的控件不得使用 `<button>`、`cursor:pointer` 或 active/hover 样式暗示可点击;纯标注用 `<span>` 或静态文字呈现。
23
25
 
24
26
  不要让页面全是文字,也不要把所有章节都做成同一种"结论 + 指标 + 图表 + 洞察"结构。长材料先判断每段内容在当前报表里的作用:它是在给背景、定义口径、证明结论、展示变化、比较对象、解释异常、列明细,还是提出行动。每段只选择最适合的表达方式,可以是短结论、关键数字、对比、时间顺序、表格、矩阵、引用、图表、注释或截图。重要内容不能被塞进附录或角落;如果一个章节是汇报目标的核心,就给它相称的版面面积和区别于其他章节的版式处理。
25
27
 
@@ -50,6 +52,13 @@ metadata:
50
52
 
51
53
  产出:维度-指标清单,以及一句话叙事重点。
52
54
 
55
+ **数据忠实度约束。** 在此步完成后,明确标注哪些指标可以直接从源数据计算、哪些缺少必要数据(如历史期、目标值、预算基线)。后续步骤中:
56
+
57
+ - 可直接计算的指标:使用真实值。
58
+ - 源数据不含的派生指标(同比/环比变化率、完成率、差额等需要两期或多源数据而只有单期的):不编造数值,用"—"占位或省略该指标。
59
+ - 超出数据时间范围的外推值:不补齐,图表只覆盖数据实际跨度。
60
+ - 确需补充示例数据时:必须在页面上用视觉标记(虚线边框、"示例数据"标签、灰色斜体)明确区分。
61
+
53
62
  ### 3. 报表规划
54
63
 
55
64
  在写代码之前,先确定报表由哪些组件构成:
@@ -59,7 +68,7 @@ metadata:
59
68
  - **候选部件**:标题 / 范围 / 口径、摘要、KPI、主图表、辅助图表、文字洞察、明细表、时间线、矩阵、截图或注释都只是候选。需要哪个用哪个,不要为了"完整"把它们凑齐。
60
69
  - **核心承载**:只给真正承载核心问题的模块更大面积。核心可能是一张趋势图、一张排名表、一段异常解释、一个流程漏斗,也可能是一组明细,不固定。
61
70
  - **版式差异**:为不同信息角色安排不同形态,例如紧凑指标条、宽图、窄侧栏、表格区、注释带、对比矩阵或分段背景。避免每个章节都重复同一张满宽白卡。
62
- - **布局骨架**:明确每个模块的相对面积和扫描路径,例如 `1.2fr 2fr`、`1fr 1.6fr`、`repeat(4,1fr)`、`auto 1fr` 等混合栅格;移动端再自然折叠。
71
+ - **布局骨架**:明确每个模块的相对面积和扫描路径,例如 `1.2fr 2fr`、`1fr 1.6fr`、`repeat(4,1fr)`、`auto 1fr` 等混合栅格。多列网格必须提供窄屏回退(`auto-fit + minmax()` 或 `@media` 断点),不要写死 fr 比例而不处理移动端——详见下方「移动端适配」。
63
72
 
64
73
  组件取舍由读者任务、数据复杂度和材料内容决定。
65
74
 
@@ -84,12 +93,53 @@ metadata:
84
93
  - 表格用于精确查数和比较对象,不要把长表伪装成密集柱状图。
85
94
  - KPI 用于概览,不要把每个字段都做成指标卡。
86
95
  - 没有真实依据时不编造结论;可写"待补充口径"或使用中性描述。
96
+ - 页面中每个数值必须可溯源:源数据直读、或从源数据可验证计算得出。缺少计算所需数据时(如同比需要上期数据但只有本期),用"—"占位或省略,不编造。
97
+ - 所有视觉上暗示可交互的控件(标签页、筛选器、按钮、下拉、日期切换)必须绑定真实 JS 逻辑。不实现切换功能就不画成可点击样式。
87
98
 
88
99
  产出:完整报表页面。
89
100
 
101
+ ### 5.5 移动端适配
102
+
103
+ 报表在桌面端的复杂网格不会自动适配移动端。写完桌面布局后,必须为 ≤768px 视口补充响应式处理:
104
+
105
+ **页面基础**:HTML 必须包含 `<meta name="viewport" content="width=device-width, initial-scale=1">`,否则移动浏览器用 980px 默认视口渲染再缩小,所有字都变成蚊子大小。
106
+
107
+ **模块折叠策略**:
108
+
109
+ - **KPI 指标条**:桌面端横排 4 个时,移动端折叠为 2×2 网格。用 `repeat(auto-fit, minmax(160px, 1fr))` 自动处理,或 `@media (max-width: 768px)` 显式切到两列。
110
+ - **主分析区(左右不等分)**:`1.2fr 2fr` 或 `auto 1fr` 这类侧栏 + 主区布局,移动端必须折叠为单列——侧栏内容移到主区上方或下方。
111
+ - **并列图表**:两图并排在移动端改为上下堆叠,每个图表独占一行。图表容器的窄屏处理由 charts skill 的「窄屏适配」规则覆盖。
112
+ - **明细表格**:宽表在窄屏下加 `overflow-x: auto` 让表格可横向滚动,不要压缩列宽到不可读。
113
+ - **洞察侧栏 / 注释带**:移动端折叠到对应图表下方,不要浮动遮盖内容。
114
+
115
+ **断点写法**(二选一):
116
+
117
+ ```css
118
+ /* 方式 A:auto-fit 自动折叠 */
119
+ .report-grid {
120
+ display: grid;
121
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
122
+ gap: 16px;
123
+ }
124
+
125
+ /* 方式 B:显式断点 */
126
+ .report-layout {
127
+ display: grid;
128
+ grid-template-columns: 1.2fr 2fr;
129
+ gap: 24px;
130
+ }
131
+ @media (max-width: 768px) {
132
+ .report-layout {
133
+ grid-template-columns: 1fr;
134
+ }
135
+ }
136
+ ```
137
+
138
+ **字号底线**:移动端正文不低于 14px,KPI 数字不低于 20px,图表标题不低于 13px。
139
+
90
140
  ### 6. 自检
91
141
 
92
- 截图检查结果,验证以下几点:
142
+ 检查渲染结果,验证以下几点:
93
143
 
94
144
  - 报表是否回答了步骤 1 确定的核心问题。
95
145
  - 信息层级是否清晰(读者能在 5 秒内抓到主要结论)。
@@ -101,5 +151,11 @@ metadata:
101
151
  - 文字洞察是否与图表数据互相支撑。
102
152
  - 图表部分是否通过了 charts skill 的自检清单。
103
153
  - 口径和单位是否全报表一致。
154
+ - 页面中展示的每个数值是否可溯源到用户提供的数据;同比/环比/完成率等派生指标是否有对应的基准数据支撑,没有的是否已用"—"占位而非编造。
155
+ - 所有视觉上可点击的控件(标签页、筛选器、按钮、下拉)是否都绑定了真实 JS 逻辑,点击后确实切换数据或视图;没有功能的元素是否已改为静态文字样式。
156
+ - HTML 是否包含 `<meta name="viewport" content="width=device-width, initial-scale=1">`。
157
+ - 多列网格是否提供了窄屏回退(`auto-fit + minmax()` 或 `@media` 断点),在 390px 视口下是否折叠为单列且无横向滚动。
158
+ - 宽表格是否有 `overflow-x: auto` 容器包裹。
159
+ - 移动端字号是否达到底线(正文 ≥14px、KPI 数字 ≥20px、图表标题 ≥13px)。
104
160
 
105
161
  产出:确认或修正。
@@ -1,10 +1,27 @@
1
1
  ---
2
2
  name: interactive-prototype
3
- description: Working app with real interactions
3
+ description: 创建具备真实交互的可运行应用原型。触发词:interactive prototype, 交互原型, 可交互原型, 动态原型, 原型演示, 交互演示, working app
4
4
  metadata:
5
5
  display-names:
6
6
  zh-CN: 交互原型
7
7
  en-US: Interactive Prototype
8
8
  ---
9
9
 
10
- Create a fully interactive prototype with realistic state management and transitions. Use React useState/useEffect for dynamic behavior. Include hover states, click interactions, form validation, animated transitions, and multi-step navigation flows. It should feel like a real working app, not a static mockup.
10
+ # 交互原型
11
+
12
+ 创建一个完全可交互的原型,具备真实的状态管理和页面切换。用 React 的 useState/useEffect 实现动态行为。包含悬停状态、点击交互、表单验证、动画过渡和多步导航流程。用起来要像真正能运行的应用,而不是静态效果图。
13
+
14
+ ## 响应式适配
15
+
16
+ 先判断 brief 的目标场景,走不同策略:
17
+
18
+ **面向终端用户的产品**(官网、营销页、C 端应用、展示型页面)——必须适配移动端。用 `@media (max-width: 768px)` 做断点,375px 宽度下无水平滚动、无内容不可读、无元素互相遮挡:
19
+
20
+ - **侧边栏**:窄屏默认收起,汉堡按钮切换;展开时 `position: fixed` + 半透明遮罩覆盖内容,不挤压主区域。
21
+ - **顶部导航**:导航项超出视口宽度时折叠为汉堡菜单,不允许换行堆叠或水平溢出。
22
+ - **网格与卡片**:用 CSS Grid `auto-fit` / `minmax()` 或 Flexbox `flex-wrap`,窄屏自动堆叠为单列;卡片内数字和文字不因容器变窄而截断。
23
+ - **固定定位元素**:浮动按钮、悬浮面板等 `position: fixed/absolute` 元素用 `right: 16px` 等安全边距约束在视口内,不允许超出屏幕边缘。
24
+
25
+ **面向桌面的场景**(管理后台、内部工具、数据密集型仪表盘)——不需要重排为移动端布局,但必须设 `min-width`(通常 1024px–1200px),窄于此宽度时整体水平滚动,而不是让布局被挤压变形。
26
+
27
+ brief 未指明时默认按终端用户产品处理。
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: make-a-deck
2
+ name: slide-deck
3
3
  description: 当用户要求制作演示文稿 / PPT / PPTX / pitch deck / slides / keynote / 路演材料时使用——即供演讲者现场演示、固定画幅 16:9 的自包含 HTML deck。
4
4
  metadata:
5
5
  display-names:
@@ -7,7 +7,7 @@ metadata:
7
7
  en-US: Slide Deck
8
8
  ---
9
9
 
10
- # Make a deck
10
+ # Slide deck
11
11
 
12
12
  把演示 deck 做成一个自包含的 HTML 单页。
13
13
 
@@ -43,7 +43,7 @@ deck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**
43
43
 
44
44
  ### 两个细节保持静态幻灯片可直接编辑
45
45
 
46
- 两个细节确保静态幻灯片可被直接编辑:每段文字都放在自己的叶子元素中(把 "Revenue" 放在 `<h2>` 内单独的 `<span>` 里,而不是写成 `<h2>Revenue <span class="sub">2025</span></h2>` 这样文本和子元素混在同一父节点的形式),重复结构要逐一写出而非生成——三条 `<li>` 直接写在标记里,而不是从数组渲染一个 `<li>` 三次。重复正是重点所在;它让用户能编辑第二条而不影响第一条。
46
+ 两个细节确保静态幻灯片可被直接编辑:每段文字都放在自己的叶子元素中(把 "Revenue" 放在 `<h2>` 内单独的 `<span>` 里,而不是写成 `<h2>Revenue <span class="sub">Q3</span></h2>` 这样文本和子元素混在同一父节点的形式),重复结构要逐一写出而非生成——三条 `<li>` 直接写在标记里,而不是从数组渲染一个 `<li>` 三次。重复正是重点所在;它让用户能编辑第二条而不影响第一条。
47
47
 
48
48
  ## 幻灯片设计与构图
49
49
 
@@ -80,6 +80,8 @@ deck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**
80
80
 
81
81
  - **图表与数据可视化。** 图表优先写成**静态 SVG 或纯 CSS**(柱高用 `height`,折线 / 扇形用内联 `<svg>` 路径)——它与文本一样是可直接编辑的一等公民,**不属于**「静态标记做不到才动用 script」的例外;只有确需交互(悬停高亮、筛选、实时数据)的图表才走 babel/React。数字之间只要存在能被眼睛读出的关系(趋势、占比、对比、分布),就转成图表,而不是原样铺成文字。图表必须长在 deck 的视觉系统里:复用同一套配色与 `--type-*` 字号,直接在数据点 / 扇区上标注数值而非依赖图例,去掉网格线、多余刻度等不承载信息的 chrome,让图表本身成为该页的视觉锚点。
82
82
 
83
+ - **时间线布局。** 时间线的点与连接线必须共享同一个定位上下文,连接线必须穿过每个节点圆点的圆心。判据:把任意一个节点的内容区高度改成两倍,点和线仍然对齐——如果会错位,说明两者的垂直基准不统一。把点和线放在独立的绝对定位层里分别偏移是最常见的错位根因,不要这样做。
84
+
83
85
  - **动效。** 动效服务于叙事——引导视线、分层揭示信息、平滑衔接页面——而不是炫技或填空。默认克制,始终以不干扰阅读为底线。deck 动效的形态是**翻到该页时播放一次的入场 / 分步揭示**,不做环境循环——无限循环的装饰动画会持续争夺注意力。实现用 CSS 动画(幻灯片保持可直编的静态 HTML),两条契约(细节见 deck-stage.js 头部 Authoring guidance):
84
86
  - 动画门控在 `[data-deck-active]` 与 `prefers-reduced-motion: no-preference` 上——组件在激活页维护该属性,翻页即触发;需要 JS 编排时监听组件的 `slidechange` 事件。
85
87
  - 基础样式写**可见的最终态**,隐藏态只进 `@keyframes` 的 `from`——缩略图栏、reduced-motion 等场景只渲染静态基础态、从不播动画,把 `opacity: 0` 写在基础规则上,会导致这些场景全成空白。
@@ -98,8 +100,8 @@ deck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**
98
100
 
99
101
  幻灯片标题一般有以下几种结构类型:
100
102
 
101
- - **主题式**:名词短语,告诉听众这页讲什么(如「市场格局」「团队结构」「六大常见威胁」)
102
- - **论点式**:短陈述句,直接给出该页结论(如「亚洲是我们最大的市场」「弱密码是最常被利用的入口」)
103
+ - 简短的教科书式标题(如 市场调研、用户增长概览、团队架构;英文标题习惯全部大写)
104
+ - 行动式标题,更接近短句(如"亚洲是我们最大的市场……"、"……但东欧的增长潜力最高")
103
105
 
104
106
  选定合适的标题结构后,始终保持一致。
105
107
 
@@ -107,8 +109,8 @@ deck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**
107
109
 
108
110
  避免以下常见的 "AI 味"——它们会暴露这个 deck 是 AI 生成的:
109
111
 
110
- - "宣判式"的标题和要点总结,过度戏剧化/简化,无缘由地制造张力(经典的 "It's not X. It's Y."),使用强祈使句,过度重新包装概念,或刻意悬念、故作洞察。
111
- - 类似 "The magic moment" 这样的标题
112
+ - "宣判式"的标题和要点总结,过度戏剧化/简化,无缘由地制造张力(经典的"不是 X,而是 Y"),使用强祈使句,过度重新包装概念,或刻意悬念、故作洞察。
113
+ - 类似"奇迹时刻"这样的标题
112
114
  - 总之,AI 倾向于把标题写成演讲者的金句,而非引导听众进入该页内容的**标题**——必须避免!
113
115
 
114
116
  ## 规划步骤
@@ -124,7 +126,7 @@ deck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**
124
126
 
125
127
  ## 验证要点
126
128
 
127
- 审阅时,用幻灯片构图规则——而非网页布局直觉——来检查截图。底部留白是不是缺陷,用「留白 ≠ 空洞」的归属判据:内容自身完整、下方是无边框的整块呼吸空间,这是正确的幻灯片构图——不要出于网页直觉把 `flex-start` 改成 `center`;空白被元素边界圈占的,是被动空洞,按「视觉平衡」的出路修。
129
+ 审阅时,用幻灯片构图规则——而非网页布局直觉——来检查版面。底部留白是不是缺陷,用「留白 ≠ 空洞」的归属判据:内容自身完整、下方是无边框的整块呼吸空间,这是正确的幻灯片构图——不要出于网页直觉把 `flex-start` 改成 `center`;空白被元素边界圈占的,是被动空洞,按「视觉平衡」的出路修。
128
130
 
129
131
  逐页核对以下各项:
130
132
 
@@ -45,6 +45,23 @@ metadata:
45
45
 
46
46
  不要为了“丰富”而乱放装饰。变化应该来自内容关系和阅读任务,而不是从组件清单里凑满页面。
47
47
 
48
+ ## 移动端适配
49
+
50
+ 可视化报告的产物(长页报告、专题页、信息图)经常在手机上被打开和转发。桌面端的多列版式、满版图文和精细间距到了 390px 宽度上会挤碎。写完桌面布局后,必须为窄屏补充响应式处理:
51
+
52
+ **页面基础**:HTML 必须包含 `<meta name="viewport" content="width=device-width, initial-scale=1">`。
53
+
54
+ **版式折叠**:
55
+
56
+ - **多列章节**(并排图文、对比矩阵、左右证据栏):移动端折叠为单列堆叠。用 `auto-fit + minmax(320px, 1fr)` 自动折叠,或 `@media (max-width: 768px)` 显式切换。
57
+ - **满版主视觉 / 封面**:桌面端的固定高度大图在移动端改为 `aspect-ratio` 或 `min-height` + `max-height` 约束,避免图片撑满整屏看不到内容。
58
+ - **数字/指标区**:横排的 KPI 或关键数字在移动端折叠为 2 列或纵向排列,每个数字块至少 160px 宽。
59
+ - **图表**:图表容器的窄屏处理由 charts skill 的「窄屏适配」规则覆盖。
60
+ - **宽表格 / 时间线 / 矩阵**:加 `overflow-x: auto` 容器让内容可横向滚动,不要压缩到不可读。
61
+ - **大字标题**:桌面端 48px+ 的展示字体在移动端用 `clamp()` 或 `@media` 缩到合理范围(如 `clamp(24px, 6vw, 48px)`),避免单词撑出视口。
62
+
63
+ **字号底线**:移动端正文不低于 14px,标注 / 图注不低于 12px。
64
+
48
65
  ## 视觉原则
49
66
 
50
67
  - 优先清楚,其次好看。读者应该先理解结构,再感受到风格。
@@ -54,6 +71,7 @@ metadata:
54
71
  - 风格跟随内容、受众和品牌:可以正式、温和、技术、编辑化、品牌化或实验感,但不要从某个样例场景继承固定颜色、固定目录或固定组件。
55
72
  - 每份报告应有一个可解释的签名元素。签名元素要从用户主题、材料质感和阅读任务中生成,而不是复用固定手法;它可以是任何能组织内容、建立记忆点并保持一致性的视觉规则。
56
73
  - 真实素材优先:用户给的截图、logo、图片、图标、数据片段要优先使用。没有素材时,用清楚的占位结构和可替换文案。
74
+ - 数据忠实度:页面中展示的每个数值必须可溯源到用户提供的数据或可验证的计算过程。源数据不含的派生指标(同比/环比、完成率等缺少基准数据的)不编造——用"—"占位或省略。确需补充示例数据时,必须用视觉标记(虚线边框、"示例数据"标签、灰色斜体)明确区分。
57
75
  - 允许少量动效,但只用于进入、强调或引导阅读,不做干扰理解的持续动画。
58
76
  - 可以包含数字、图表和表格,但它们服务于报告叙事;不要为了“可视化”而把所有内容都做成图。
59
77
  - 深色区域可以用于封面、结论、行动区或整篇报告的主视觉;只要它服务主题气质和阅读体验,而不是作为无依据的装饰。
@@ -77,4 +95,8 @@ metadata:
77
95
  - 文字密度可读,没有小字堆叠。
78
96
  - 图标、线条、颜色和卡片样式属于同一套视觉语言。
79
97
  - 明暗选择能解释为什么适合这个主题;无论浅色还是暗色,都保证长文、图表和表格可读。
80
- - 事实性内容没有编造;不确定内容用中性描述或占位说明。
98
+ - 事实性内容没有编造;不确定内容用中性描述或占位说明。
99
+ - 页面中每个数值可溯源到用户提供的数据;缺少基准数据的派生指标(同比/环比/完成率等)没有编造数值,而是用"—"占位或省略。
100
+ - HTML 包含 `<meta name="viewport" content="width=device-width, initial-scale=1">`。
101
+ - 多列版式在 390px 视口下折叠为单列且无横向滚动;宽表格 / 矩阵有 `overflow-x: auto` 包裹。
102
+ - 移动端字号达到底线(正文 ≥14px、图注 ≥12px),大标题没有撑出视口。