@amaster.ai/pi-lark 0.1.2-beta.44 → 0.1.2-beta.46

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.
Files changed (130) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +23 -12
  3. package/skills/lark-apps/creative-design/agents/assets/vision-probe.png +0 -0
  4. package/skills/lark-apps/creative-design/agents/fork-verifier-agent.md +71 -0
  5. package/skills/lark-apps/creative-design/agents/vision-probe-agent.md +41 -0
  6. package/skills/lark-apps/creative-design/assets/index.html +27 -0
  7. package/skills/lark-apps/creative-design/creative-design.md +239 -0
  8. package/skills/lark-apps/creative-design/references/aily.md +39 -0
  9. package/skills/lark-apps/creative-design/references/animated-video.md +34 -0
  10. package/skills/lark-apps/creative-design/references/charts.md +165 -0
  11. package/skills/lark-apps/creative-design/references/claude.md +36 -0
  12. package/skills/lark-apps/creative-design/references/codex.md +32 -0
  13. package/skills/lark-apps/creative-design/references/data-report.md +108 -0
  14. package/skills/lark-apps/creative-design/references/frontend-design.md +71 -0
  15. package/skills/lark-apps/creative-design/references/hi-fi-design.md +32 -0
  16. package/skills/lark-apps/creative-design/references/interactive-prototype.md +24 -0
  17. package/skills/lark-apps/creative-design/references/make-a-deck.md +133 -0
  18. package/skills/lark-apps/creative-design/references/visual-exposure.md +82 -0
  19. package/skills/lark-apps/creative-design/references/wireframe.md +14 -0
  20. package/skills/lark-apps/creative-design/starter-components/android-frame.jsx +188 -0
  21. package/skills/lark-apps/creative-design/starter-components/animations.jsx +773 -0
  22. package/skills/lark-apps/creative-design/starter-components/browser-window.jsx +122 -0
  23. package/skills/lark-apps/creative-design/starter-components/deck-stage.js +2483 -0
  24. package/skills/lark-apps/creative-design/starter-components/design-canvas.jsx +1432 -0
  25. package/skills/lark-apps/creative-design/starter-components/ios-frame.jsx +270 -0
  26. package/skills/lark-apps/creative-design/starter-components/macos-window.jsx +197 -0
  27. package/skills/lark-apps/creative-design/starter-components/tweaks-panel.jsx +752 -0
  28. package/skills/lark-apps/references/lark-apps-automation.md +80 -2
  29. package/skills/lark-apps/references/lark-apps-cloud-dev.md +0 -1
  30. package/skills/lark-apps/references/lark-apps-create.md +1 -2
  31. package/skills/lark-apps/references/lark-apps-db.md +1 -1
  32. package/skills/lark-apps/references/lark-apps-env-pull.md +1 -1
  33. package/skills/lark-apps/references/lark-apps-file.md +2 -2
  34. package/skills/lark-apps/references/lark-apps-git-credential.md +1 -1
  35. package/skills/lark-apps/references/lark-apps-html-publish.md +4 -8
  36. package/skills/lark-apps/references/lark-apps-init.md +1 -1
  37. package/skills/lark-apps/references/lark-apps-list.md +1 -1
  38. package/skills/lark-apps/references/lark-apps-local-dev.md +54 -11
  39. package/skills/lark-apps/references/lark-apps-openapi-key.md +1 -1
  40. package/skills/lark-apps/references/lark-apps-release-create.md +2 -2
  41. package/skills/lark-apps/references/lark-apps-release-get.md +3 -3
  42. package/skills/lark-base/SKILL.md +4 -6
  43. package/skills/lark-base/references/lark-base-cell-value.md +3 -3
  44. package/skills/lark-base/references/lark-base-field-create.md +4 -0
  45. package/skills/lark-base/references/lark-base-field-json.md +4 -4
  46. package/skills/lark-base/references/lark-base-field-update.md +17 -1
  47. package/skills/lark-base/references/lark-base-form-submit.md +16 -7
  48. package/skills/lark-base/references/lark-base-record-batch-create.md +12 -10
  49. package/skills/lark-base/references/lark-base-record-batch-update.md +11 -9
  50. package/skills/lark-base/references/lark-base-record-upsert.md +1 -1
  51. package/skills/lark-calendar/references/lark-calendar-create.md +1 -0
  52. package/skills/lark-calendar/references/lark-calendar-update.md +3 -0
  53. package/skills/lark-doc/references/lark-doc-fetch.md +10 -2
  54. package/skills/lark-doc/references/lark-doc-whiteboard.md +9 -8
  55. package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +41 -0
  56. package/skills/lark-doc/references/lark-doc-xml.md +4 -3
  57. package/skills/lark-drive/SKILL.md +4 -1
  58. package/skills/lark-drive/references/lark-drive-comment-location.md +2 -2
  59. package/skills/lark-drive/references/lark-drive-search.md +1 -0
  60. package/skills/lark-drive/references/lark-drive-upload.md +1 -0
  61. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md +273 -0
  62. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md +202 -0
  63. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md +231 -0
  64. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md +248 -0
  65. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md +174 -0
  66. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md +202 -0
  67. package/skills/lark-drive/references/lark-drive-workflow.md +5 -4
  68. package/skills/lark-event/SKILL.md +1 -0
  69. package/skills/lark-event/references/lark-event-application.md +38 -0
  70. package/skills/lark-im/SKILL.md +1 -1
  71. package/skills/lark-im/references/card/card-2.0-schema.md +1 -1
  72. package/skills/lark-im/references/card/lark-im-card-style.md +4 -4
  73. package/skills/lark-im/references/card/resource/icons.md +14 -0
  74. package/skills/lark-im/references/lark-im-flag-list.md +8 -7
  75. package/skills/lark-okr/SKILL.md +71 -26
  76. package/skills/lark-okr/references/lark-okr-batch-create.md +19 -18
  77. package/skills/lark-okr/references/lark-okr-create.md +173 -0
  78. package/skills/lark-okr/references/lark-okr-cycle-list.md +17 -7
  79. package/skills/lark-okr/references/lark-okr-entities.md +1 -0
  80. package/skills/lark-okr/references/lark-okr-indicator-update.md +3 -1
  81. package/skills/lark-okr/references/lark-okr-indicators.md +61 -12
  82. package/skills/lark-okr/references/lark-okr-progress-list.md +21 -9
  83. package/skills/lark-slides/SKILL.md +104 -47
  84. package/skills/lark-slides/references/asset-planning.md +6 -4
  85. package/skills/lark-slides/references/iconpark.md +2 -2
  86. package/skills/lark-slides/references/lark-slides-create.md +2 -3
  87. package/skills/lark-slides/references/lark-slides-history.md +132 -0
  88. package/skills/lark-slides/references/lark-slides-media-upload.md +1 -2
  89. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +7 -11
  90. package/skills/lark-slides/references/lark-slides-replace-slide.md +0 -3
  91. package/skills/lark-slides/references/lark-slides-screenshot.md +4 -4
  92. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +219 -0
  93. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +6 -5
  94. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +2 -2
  95. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +2 -3
  96. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +65 -30
  97. package/skills/lark-slides/references/planning-layer.md +11 -10
  98. package/skills/lark-slides/references/slides_chart_demo.xml +1416 -1
  99. package/skills/lark-slides/references/slides_xml_schema_definition.xml +1 -45
  100. package/skills/lark-slides/references/troubleshooting.md +25 -7
  101. package/skills/lark-slides/references/validation-checklist.md +53 -16
  102. package/skills/lark-slides/references/visual-planning.md +25 -22
  103. package/skills/lark-slides/references/xml-schema-quick-ref.md +243 -46
  104. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +1054 -78
  105. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +957 -150
  106. package/skills/lark-task/SKILL.md +7 -0
  107. package/skills/lark-task/references/lark-task-complete.md +6 -2
  108. package/skills/lark-task/references/lark-task-update.md +6 -2
  109. package/skills/lark-whiteboard/SKILL.md +13 -12
  110. package/skills/lark-whiteboard/elements/layout.md +1 -1
  111. package/skills/lark-whiteboard/elements/schema.md +2 -2
  112. package/skills/lark-whiteboard/references/{lark-whiteboard-query.md → lark-whiteboard-export.md} +15 -15
  113. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +3 -3
  114. package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +7 -17
  115. package/skills/lark-whiteboard/routes/dsl.md +3 -3
  116. package/skills/lark-whiteboard/routes/mermaid.md +2 -2
  117. package/skills/lark-whiteboard/routes/svg-edit.md +4 -4
  118. package/skills/lark-whiteboard/routes/svg.md +11 -6
  119. package/skills/lark-whiteboard/scenes/bar-chart.md +1 -1
  120. package/skills/lark-whiteboard/scenes/fishbone.md +1 -1
  121. package/skills/lark-whiteboard/scenes/flywheel.md +1 -1
  122. package/skills/lark-whiteboard/scenes/line-chart.md +1 -1
  123. package/skills/lark-whiteboard/scenes/treemap.md +1 -1
  124. package/skills/lark-wiki/SKILL.md +1 -0
  125. package/skills/lark-slides/references/examples.md +0 -91
  126. package/skills/lark-slides/references/lark-slides-whiteboard.md +0 -331
  127. package/skills/lark-slides/references/lark-slides-xml-get.md +0 -100
  128. package/skills/lark-slides/references/slide-templates.md +0 -201
  129. package/skills/lark-slides/references/slides_demo.xml +0 -226
  130. package/skills/lark-slides/references/xml-format-guide.md +0 -433
@@ -0,0 +1,133 @@
1
+ ---
2
+ name: make-a-deck
3
+ metadata:
4
+ display-names:
5
+ zh-CN: 幻灯片制作
6
+ en-US: Slide Deck
7
+ description: 当用户要求制作演示文稿 / PPT / PPTX / pitch deck / slides / keynote / 路演材料时使用——即供演讲者现场演示、固定画幅 16:9 的自包含 HTML deck。
8
+ ---
9
+
10
+ # Make a deck
11
+
12
+ 把演示 deck 做成一个自包含的 HTML 单页。
13
+
14
+ 进入这个角色:你是一名演示设计师(presentation designer)。你为演讲者制作用于现场演示的幻灯片 deck——HTML 只是你的输出介质,但你的设计思维与为董事会准备材料的咨询顾问、分析师或高管完全一致:清晰、叙事流畅、后排也能看清。你不是在做网站。
15
+
16
+ 每张幻灯片既是版式设计的练习,也是文案写作的练习。动手前先写大纲;好的大纲本身就是一次讲故事和叙事结构的练习。
17
+
18
+ ## 动手前先问
19
+
20
+ - 如果用户没有说明视觉风格、也没提供 design system:能从主题、材料或场景推断出一个有把握的方向就直接定(与 [`../creative-design.md`](../creative-design.md)「默认美学指令」一致),推不出再用提问工具问。无论推断还是问来,绝不要落到一个通用模板设计!
21
+
22
+ ## 构建准备与技术契约
23
+
24
+ ### deck-stage 组件
25
+
26
+ 以 1920×1080(16:9)为基准构建。**绝不**手写 stage/缩放/翻页的脚手架——先调用 `copy_starter_component` 并传入 `kind: "deck-stage.js"`,然后将 deck HTML 写成 `<deck-stage width="1920" height="1080">`,每张幻灯片对应一个 `<section data-label="…">` 子元素。该组件负责:
27
+
28
+ - letterbox 缩放
29
+ - 键盘 + 触控翻页
30
+ - speaker-notes 的 postMessage 协议
31
+ - `data-screen-label` / `data-miaoda-validate` 标记
32
+ - print-to-PDF(每张幻灯片一页)
33
+
34
+ 用 `<script src="deck-stage.js"></script>` 加载它——它是 vanilla JS,不是 JSX。(该组件支持 `noscale` 属性来禁用 shadow-DOM 缩放,供外部 PPTX 导出或截图工具拿到原始尺寸的几何信息;本 skill 内无需也没有工具去调用它。)
35
+
36
+ deck-stage 组件会对每个 slotted 子元素做绝对定位——**绝不**在幻灯片 `<section>` 元素上自行设置 position/inset/width/height。
37
+
38
+ ### 把幻灯片内容写成静态 HTML,而不是 React
39
+
40
+ 幻灯片内容应写成静态 HTML,而非 React 或脚本生成的 DOM。当幻灯片正文是 `<deck-stage>` 内的纯标记时,用户可以在编辑模式下直接点击任意标题或段落进行修改——编辑器会立即将改动 splice 回源文件。而如果同样的内容通过 `<script type="text/babel">` 块、React 组件或遍历 JS 数组来渲染,这条直编路径就断了:每次微调都要绕一趟聊天消息才能到你手里,用户体验更慢,也更难让他们自己打磨 deck。因此,凡是静态页面能表达的——文本、布局、背景、图片——都直接在 HTML 里写字面元素并用 CSS 设置样式。只在幻灯片确实需要静态标记无法实现的行为时(交互式图表、实时 demo、真实状态管理),才使用 babel/React 或额外的 `<script>`。同样的渲染结果,静态 HTML 版本**始终优先于**动态版本,因为静态版本可被直接编辑。Tweaks 面板(`tweaks-panel.jsx`)是固定例外:它是幻灯片旁边的控制面板,不是幻灯片内容,因此仍需包含它——它的 `<script type="text/babel">` 标签不会让幻灯片本身变得更难直接编辑,因为编辑器会独立地将每个静态幻灯片元素路由到 splice 路径。
41
+
42
+ ### 两个细节保持静态幻灯片可直接编辑
43
+
44
+ 两个细节确保静态幻灯片可被直接编辑:每段文字都放在自己的叶子元素中(把 "Revenue" 放在 `<h2>` 内单独的 `<span>` 里,而不是写成 `<h2>Revenue <span class="sub">2025</span></h2>` 这样文本和子元素混在同一父节点的形式),重复结构要逐一写出而非生成——三条 `<li>` 直接写在标记里,而不是从数组渲染一个 `<li>` 三次。重复正是重点所在;它让用户能编辑第二条而不影响第一条。
45
+
46
+ ## 幻灯片设计与构图
47
+
48
+ 先定方向:动手前先调用 `frontend-design` skill 立视觉方向框架,再结合主题、受众、场景提炼视觉关键词,用它们决定配色、字体、图片类型和页面节奏;frontend-design 的通用设计规则与本 skill 的 deck / 构图规则冲突时,以本 skill 为准。保持清晰的层级与一致的视觉系统。
49
+
50
+ ### 构图原则
51
+
52
+ - **留白 ≠ 空洞。** 判据是空白的**归属**:属于页面的空白(页边距、分组间隙、无边框的呼吸空间)是构图资产;被某个元素圈占的空白——边框、底色或阴影划出的范围远大于其内容——是未完成的构图,读者会把它读成「这里本来该有东西」。元素的边界应由内容撑出来,而不是由要填的空间决定;画布填不满时,把空间留在元素**之间**,或按「视觉平衡」的出路增密。
53
+
54
+ - **视觉锚点。** 每页要能回答:视线第一眼落在哪里,为什么是那里。锚点可以是一个大数字、一张图表、一句大字陈述,也可以是并列结构中被刻意加重的一项。所有元素等面积、等字号、等色彩权重的页面,是把第一落点交给了随机——那不是中性,是没做构图决策。
55
+
56
+ - **视觉平衡。** 视觉重量要在整幅画布上分布均衡,不要全压在画幅一角。内容撑不满画布时,出路必须**增加信息或提升信息的形式**——放大锚点、文字转表格 / 图表 / 对比、与相邻页合并都属此类;任何只消耗面积而不增加信息的手段(拉高容器、均匀放大字号、堆装饰)都不是出路,只是把空洞摊得更开。
57
+
58
+ - **平行性。** 平行性很重要:章节标题页外观必须一致;重复出现的文字元素必须在相同位置;以此类推。
59
+
60
+ - **版式节奏。** 与平行性互为对偶:平行性守住不变的东西,节奏经营变化的东西。每页先为内容选对形式——最适合表格、图表、引用或图片的内容就转成那个形式,而不是原样铺成文字(文字堆砌是最常见的失误);内容单薄则按「视觉平衡」的出路增密或合并。逐页的形式选择连起来就是 deck 的节奏:节奏跟随叙事结构——章节转折、重点页、过渡页各有形态——而不是机械交替;节奏也需要对比才成立——全图、大数字、图表、引用、不同背景色、纯文字,原型库要够开阔,页页同一骨架无节奏可言,那不叫一致,叫单调。用版式和可视化把画布用满不是「填充性内容」;凭空编造数据和板块才是。
61
+
62
+ ### 素材与工艺
63
+
64
+ - **字号与单位。** 使用大号字体(标题至少 48px)。当用户指定具体字号时,默认他们说的是**磅(points)**(PowerPoint/Keynote 的单位)而非像素——用 `px = pt × 1.333` 换算。所以"把标题设成 36pt" → 在 CSS 里设成约 48px。
65
+
66
+ - **素材来源。** 除非用户要求,绝不使用 emoji。使用 design system / 品牌中的图标、用户提供的图片,或图片生成工具产出的图片。
67
+
68
+ - **图片呈现。** 务必先查看图片,再决定最佳展示方式。
69
+ - 满版图片可用 aspect-fill;
70
+ - 截图必须 aspect-fit,且极少在其上叠加内容;
71
+ - 透明或 aspect-fit 的图片应置于对比色背景之上。
72
+
73
+ 在图片上叠加文字时,参照品牌惯常做法:根据你在其他地方看到的样式,酌情使用卡片、保护渐变或模糊效果。
74
+
75
+ - **图表与数据可视化。** 图表优先写成**静态 SVG 或纯 CSS**(柱高用 `height`,折线 / 扇形用内联 `<svg>` 路径)——它与文本一样是可直接编辑的一等公民,**不属于**「静态标记做不到才动用 script」的例外;只有确需交互(悬停高亮、筛选、实时数据)的图表才走 babel/React。数字之间只要存在能被眼睛读出的关系(趋势、占比、对比、分布),就转成图表,而不是原样铺成文字。图表必须长在 deck 的视觉系统里:复用同一套配色与 `--type-*` 字号,直接在数据点 / 扇区上标注数值而非依赖图例,去掉网格线、多余刻度等不承载信息的 chrome,让图表本身成为该页的视觉锚点。
76
+
77
+ - **动效。** 动效服务于叙事——引导视线、分层揭示信息、平滑衔接页面——而不是炫技或填空。默认克制,始终以不干扰阅读为底线。deck 动效的形态是**翻到该页时播放一次的入场 / 分步揭示**,不做环境循环——无限循环的装饰动画会持续争夺注意力。实现用 CSS 动画(幻灯片保持可直编的静态 HTML),两条契约(细节见 deck-stage.js 头部 Authoring guidance):
78
+ - 动画门控在 `[data-deck-active]` 与 `prefers-reduced-motion: no-preference` 上——组件在激活页维护该属性,翻页即触发;需要 JS 编排时监听组件的 `slidechange` 事件。**注意:`data-deck-active` 加在 slide 的 `<section>` 元素本身上,且只存在于当前激活页**——因此后代形式 `[data-deck-active] .fade-up` 天然只命中当前页内的元素,**不需要再按页类限定选择器**;每页不同的编排用不同的动画类 / delay 变量放在元素上表达。确需按页限定时,属性和页类是同一个元素,必须连写不能加空格:`section.s1[data-deck-active] h1` ✅,`[data-deck-active] .s1 h1` ❌(`.s1` 就是 slide 自己,后代组合器永远匹配不到,动画整页失效)。
79
+ - 基础样式写**可见的最终态**,隐藏态只进 `@keyframes` 的 `from`——缩略图栏、reduced-motion 等场景只渲染静态基础态、从不播动画,把 `opacity: 0` 写在基础规则上,会导致这些场景全成空白。
80
+ - 分步揭示 / 逐项渐入:delay 作为内联变量放在元素上、规则里统一引用——`<div class="card-in" style="--d:.15s">` + `animation: fadeUp .5s both; animation-delay: var(--d, 0s)`,不要按元素序号硬编码选择器。`both` 不可省:它让带 delay 的元素在等待期停在 `from` 的隐藏态;省掉会先以终态闪现、再跳回隐藏重播一遍。
81
+
82
+ - **结构件。** 编号、眉标、分隔线、标签只在编码内容里真实存在的信息(真实序列、导航、分类)时才用,不为“显得设计过”而加;纯装饰或只是复述已有信息的结构件一律去掉。
83
+
84
+ ## 幻灯片写作指南
85
+
86
+ ### 仅凭标题就应能讲清整个故事
87
+
88
+ 通常来说,仅靠幻灯片标题就应能让人了解 deck 的整体故事和内容(类似书籍的目录)。
89
+
90
+ 幻灯片标题一般有以下几种结构类型:
91
+
92
+ - 简短的教科书式标题,全部大写(如 Market Research、Engagement Overview、Team Structure)
93
+ - 行动式标题,更接近短句(如 "Asia is our largest market…."、"...but Eastern Europe has the highest potential for growth")
94
+
95
+ 选定合适的标题结构后,始终保持一致。
96
+
97
+ ### 避免暴露 AI 生成痕迹的 “AI 味”
98
+
99
+ 避免以下常见的 “AI 味”——它们会暴露这个 deck 是 AI 生成的:
100
+
101
+ - AI 倾向于写出"宣判式"的标题和要点总结,过度戏剧化/简化,无缘由地制造张力(经典的 "It's not X. It's Y."),使用强祈使句,过度重新包装概念,或刻意悬念、故作洞察。
102
+ - 类似 "The magic moment" 这样的标题
103
+ - 总之,AI 倾向于把标题写成演讲者的金句,而非引导听众进入该页内容的**标题**——必须避免!
104
+
105
+ ## 规划步骤
106
+
107
+ 在常规规划之外,务必完成以下步骤:
108
+
109
+ 1. 受众、品牌风格推不出且承重时先提问;能从主题和材料推断的,带着假设直接进入大纲。
110
+ 2. 把用户给定的硬性规格当作约束而非建议:页数/张数范围、画幅比例、逐页大纲、必须包含的模块(对比表格、预算明细、备注区等)在大纲阶段就纳入规划——给了页数区间就按区间中段规划标题序列,宁可精炼合并、不要注水凑页;给了逐页大纲就按大纲一一对应。构建完成后逐条对照自查。
111
+ 3. 写出完整的标题序列。选择**一种**语法风格(例如短主题名词短语或简短陈述句),确保适合内容,并用该风格写出每一个标题。回头通读一遍,判断一个人**仅凭标题**能否跟上整个演示的脉络。标题应像书的章节——用直白的语言告诉读者接下来是什么。审阅这些标题并按需修订。将它们写入 scratchpad.md 文件。
112
+ 4. 在 scratchpad.md 里为每张幻灯片标注**版式原型**(全图 / 大数字 / 图表 / 表格 / 引用 / 多栏卡片 / 纯文字……)与**视觉锚点**(这页视线的第一落点)。通读这一列,检查节奏是否跟随叙事结构:原型的重复要么是内容使然(如成组的数据页),要么就是没做选择;写不出锚点的页,是内容撑不起一页的信号——回大纲合并或换形式增密。
113
+ 5. 在写任何幻灯片**之前**,先在 `<head>` 的一个 `<style>` 块中将字号体系和间距定义为 CSS custom properties——这会锁定适合投影的尺寸,防止不自觉退回网页密度。在 1920×1080 下,合理的起始体系为:`:root { --type-title: 64px; --type-subtitle: 44px; --type-body: 34px; --type-small: 28px; --pad-top: 100px; --pad-bottom: 80px; --pad-x: 100px; --gap-title: 52px; --gap-item: 28px; }`。在 1280×720 下,按 ~0.67 缩放。所有地方都引用这些变量——每个 font-size 都用 `--type-*` 变量,每个 padding/gap 都用 `--pad-*` 或 `--gap-*` 变量,通过 inline style 或 class 规则中的 `var(…)` 引用。将它们保持为 CSS(而非 JS 常量),意味着用户只需改一个数字——直接在 style 块中改,或通过绑定到同一变量的 Tweaks 滑块改——就能重新调整整个 deck 的尺寸,而幻灯片标记仍然是静态 HTML,不需要脚本来计算尺寸。显式的 `--pad-bottom` 为每张幻灯片底部预留呼吸空间;那个留白是结构性的,不是空的。网页默认值(body 14-16px、padding 48-72px)对幻灯片太小;如果数值让你觉得不够大方,那就是还不够。如果你用了小于 24px 的尺寸,你的校验器(validator)会抛出错误。
114
+ 6. 构建幻灯片,牢记每张幻灯片既是设计练习也是文案练习。在版式、文字内容和语调方面给予每张幻灯片应有的关注。遵循上述原则,确保每张幻灯片能独立成立;一个只看这一页的人,应当无需其他上下文就能理解其高层含义。
115
+
116
+ ## 验证要点
117
+
118
+ 审阅时,用幻灯片构图规则——而非网页布局直觉——来检查截图。底部留白是不是缺陷,用「留白 ≠ 空洞」的归属判据:内容自身完整、下方是无边框的整块呼吸空间,这是正确的幻灯片构图——不要出于网页直觉把 `flex-start` 改成 `center`;空白被元素边界圈占的,是被动空洞,按「视觉平衡」的出路修。
119
+
120
+ 还需验证:
121
+
122
+ - 页数/张数、画幅比例与用户给定的硬性规格一致;用户点名要求的模块(对比表格、预算明细、备注区等)逐条在场
123
+ - 字号是否匹配你的 `--type-*` 体系(而非网页密度)
124
+ - 幻灯片边距是否匹配你的 `--pad-*` 值(而非网页紧凑间距)
125
+ - 标题在各幻灯片间的平行性
126
+ - 没有使用 accent-border 卡片或 takeaway box
127
+ - 没有内容被画幅边缘裁切、显示不全
128
+ - 没有元素相互压叠、遮挡到读不清
129
+ - 没有被动空洞:边框 / 底色圈出的范围与其内容相称
130
+ - 页面视觉重量在画布上分布均衡,没有大片区域读成「缺了东西」
131
+ - 每页能指出视觉锚点;版式原型的重复经得起「内容使然还是没做选择」的追问
132
+ - 带动效的元素在缩略图栏和打印视图下完整可见(基础样式即最终态,隐藏态只在 keyframes 的 `from` 里)
133
+ - 实际翻页确认入场动画会播放;逐条检查动画选择器——凡按页限定的,`data-deck-active` 与页选择器必须连写(`section.s1[data-deck-active] h1`),写成后代形式(`[data-deck-active] .s1 h1`)该页动效全部失效
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: visual-exposure
3
+ metadata:
4
+ display-names:
5
+ zh-CN: 可视化报告
6
+ en-US: Visual Report
7
+ description: 用于制作可视化报告、专题视觉页、信息图、视觉长图、概念可视化、产品能力曝光、方案亮点展示等内容型 HTML 视觉作品。适合用户想把材料、数据或观点组织成可阅读、可展示、可传播的视觉化表达,但不希望做成 PPT、传统 dashboard 或纯 ECharts 图表的场景。触发词:可视化报告, 视觉报告, 可视化曝光, 视觉化曝光, 信息图, 长图, infographic, 视觉表达, 概念可视化, 亮点展示, 能力曝光
8
+ available-agents:
9
+ - CreativeDesign
10
+ ---
11
+
12
+ # 可视化报告与专题表达
13
+
14
+ 创建内容驱动的 HTML 视觉作品。它可以是一页长报告、专题视觉页、视觉长图、信息图、画布式设计稿,或带少量轻交互的浏览型报告;具体形态由用户目标、材料体量和阅读场景决定,不预设固定模板。
15
+
16
+ ## 工作方式
17
+
18
+ 1. 先读用户材料,提取主题、受众、阅读场景、核心结论、必须出现的事实和可省略的细节。
19
+ 2. 判断报告目的:汇报、解释、披露、说服、传播、留档,还是做视觉方向探索。
20
+ 3. 选择交付形态:长页报告、专题页、视觉长图、单屏摘要、画布式多方案、图文混排报告、偏打印感的正式报告等。不要把所有需求压成同一种版式。
21
+ 4. 按材料逻辑组织内容,而不是套固定目录、固定模块或固定视觉模板。参考样式只能启发表达方式,不能替代对当前材料的判断。
22
+ 5. 把材料拆成具体阅读任务:这一段要让读者完成什么判断、理解什么关系、记住什么事实、比较什么差异、追踪什么过程、相信什么证据。不要把这些任务名直接变成目录或模块标题。
23
+ 6. 为每个阅读任务现场生成合适的组件、视觉和布局:先说明这段内容需要什么表达方式,再落成具体 UI / 图形 / 排版 / 图表 / 截图 / 文字组合。可以创造新的结构和视觉隐喻,不受现有组件名限制;避免所有章节共享同一套组件组合。
24
+ 7. 先写风格 brief:主题隐喻、受众姿态、材料语言、配色逻辑和签名元素。财务报告可以像正式报告册,员工调研可以像组织研究档案,产品上市总结可以像品牌战报;这些只是启发,必须从用户材料里推导。
25
+ 8. 建立版式系统:画幅、栅格、字号层级、颜色、图标/线条语言、强调方式和章节节奏。版式系统必须说明不同章节如何变化,而不是所有章节都用同一种上下结构。
26
+ 9. 产出单个 HTML 文档。用户需求明确时直接做;只有主题、素材或交付形态完全无法判断时,才问少量必要问题。
27
+
28
+ ## 内容组织
29
+
30
+ 本 skill 中出现的报告形态、表达方式、组件和版式都只是示意,不是必须参考的清单。最重要的是根据用户需求和材料内容,生成一个能把报告讲清楚的结构:读者为什么要看、先看什么、如何理解关系、证据在哪里、最后形成什么判断,都应在结构里自然成立。
31
+
32
+ 可视化报告不是把图表排满,也不是把文字切成很多卡片。每个信息块都要服务当前材料里的一个真实阅读动作:让读者确认对象、抓住重点、理解关系、比较差异、定位证据、看到过程、识别风险或形成下一步判断。把这些阅读动作翻译成本次需求专属的视觉结构,而不是复用固定模块名。
33
+
34
+ 允许为当前需求重新发明表达结构:可以合并、拆分、放大、弱化、横向展开、纵向叙事、图文化、表格化、截图化或做成完全不同的布局。只要它能更清楚地解释报告内容,就优先于任何示例组件或常见版式。
35
+
36
+ 如果材料很长,先压缩成报告叙事,不要把原文完整铺上去。需要精确查数时使用表格或附录;需要快速传播时使用摘要和视觉重点;需要正式汇报时保留章节编号、图表标题和口径说明。
37
+
38
+ 不要把关键内容压成角落里的附录片段。用户明确要求展示的部分,应按报告目标给足版面权重,并选择合适的信息结构承载。
39
+
40
+ ## 版式策略
41
+
42
+ 可视化报告要像一份经过编辑设计的专题,而不是由同款卡片拼起来的长页面。先决定阅读节奏,再落组件:
43
+
44
+ - 根据材料的展开方式设计版式:它可能需要连续叙事、密集证据、空间关系、过程推进、对照判断、沉浸式主视觉、正式报告册,或完全不同的结构。先为当前需求命名一个版式概念,再确定栅格、密度、视觉重心和章节变化。
45
+ - 版式变化来自内容关系,不来自凑组件。关键段落可以被放大、拆页、满版化、图文化或变成精确表格;次要段落可以压缩、并列、收进注释或弱化。
46
+ - 每个章节的结构可以不同,但要属于同一套视觉系统。变化要能解释:为什么这里适合宽图、那里适合密集表格、另一处适合分段叙事。
47
+
48
+ 不要为了“丰富”而乱放装饰。变化应该来自内容关系和阅读任务,而不是从组件清单里凑满页面。
49
+
50
+ ## 视觉原则
51
+
52
+ - 优先清楚,其次好看。读者应该先理解结构,再感受到风格。
53
+ - 明暗主题由需求、品牌、素材、受众和阅读场景决定;浅色、暗色、中性或局部深色都可以。选择后要保证对比度、可读性和信息层级,并能解释为什么适合当前主题。
54
+ - 默认平面化处理:内容区优先使用细边框、分隔线、浅底色、色块、表格斑马纹、编号和标签建立层级;不要给章节、卡片、图表容器加各种 `box-shadow`。
55
+ - 少用装饰性渐变、发光、玻璃拟态。视觉效果要帮助分组、强调或引导视线。
56
+ - 风格跟随内容、受众和品牌:可以正式、温和、技术、编辑化、品牌化或实验感,但不要从某个样例场景继承固定颜色、固定目录或固定组件。
57
+ - 每份报告应有一个可解释的签名元素。签名元素要从用户主题、材料质感和阅读任务中生成,而不是复用固定手法;它可以是任何能组织内容、建立记忆点并保持一致性的视觉规则。
58
+ - 真实素材优先:用户给的截图、logo、图片、图标、数据片段要优先使用。没有素材时,用清楚的占位结构和可替换文案。
59
+ - 允许少量动效,但只用于进入、强调或引导阅读,不做干扰理解的持续动画。
60
+ - 可以包含数字、图表和表格,但它们服务于报告叙事;不要为了“可视化”而把所有内容都做成图。
61
+ - 深色区域可以用于封面、结论、行动区或整篇报告的主视觉;只要它服务主题气质和阅读体验,而不是作为无依据的装饰。
62
+
63
+ ## 画布与交付
64
+
65
+ - 多方案、设计稿、方向探索:使用 `design-canvas.jsx`,每个方向一个 `<DCArtboard>`。
66
+ - 单一可视化报告、视觉长图或专题视觉稿:做成完整 HTML 页面,保持明确画幅、节奏和层级。
67
+ - 如果用户要“设计稿”,优先走画布式交付;如果用户要“可直接展示/传播”,可以做成完整页面式视觉作品。
68
+ - 所有文字应直接写在 HTML 中,便于用户后续编辑。
69
+
70
+ ## 检查清单
71
+
72
+ - 交付形态匹配用户需求:长页报告、专题页、长图、画布设计稿或单屏摘要,而不是被固定模板绑住。
73
+ - 当前需求的主题、边界和最重要信息在第一屏或开篇清楚可见。
74
+ - 章节顺序跟随材料逻辑,不按评测集样例或预设场景套目录。
75
+ - 章节版式有节奏变化,并且变化来自材料关系;没有一路同款上下卡片,也没有因为预设组件清单而硬凑结构。
76
+ - 没有大面积空白、错位、低对比、文字不可读或模块之间风格突兀。
77
+ - 内容区保持平面化,没有滥用阴影、发光、玻璃拟态或厚重悬浮效果。
78
+ - 所有表达载体各司其职,没有为了数据而堆图,也没有用空泛文字或预设组件填空间。
79
+ - 文字密度可读,没有小字堆叠。
80
+ - 图标、线条、颜色和卡片样式属于同一套视觉语言。
81
+ - 明暗选择能解释为什么适合这个主题;无论浅色还是暗色,都保证长文、图表和表格可读。
82
+ - 事实性内容没有编造;不确定内容用中性描述或占位说明。
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: wireframe
3
+ metadata:
4
+ display-names:
5
+ zh-CN: 线框图
6
+ en-US: Wireframe
7
+ description: 用线框图和故事板探索多种想法。触发词:wireframe, storyboard, 线框图, 故事板, 分镜, 草图, 低保真, 方案探索, 设计探索
8
+ available-agents:
9
+ - CreativeDesign
10
+ ---
11
+
12
+ # 线框图
13
+
14
+ 帮助用户快速探索设计想法。提问遵循 [`../creative-design.md`](../creative-design.md)「提问」一节:关键信息缺失且承重时先做一轮聚焦提问,否则基于合理假设直接铺方案。生成多个粗略的线框图,在锁定方向之前把设计空间勾勒出来。优先追求广度而非精细打磨:默认每个想法给出 2-3 种明显不同的方案,用户明确要求广度探索时再加。用简单的形状、占位文字和极少的颜色,把焦点留在结构和流程上。整体保持手绘草图的感觉——手写风格但清晰可读的字体;以黑白为主、点缀少量颜色;低保真、简洁。多方案默认铺进 `design-canvas.jsx` 画布(见 [`../creative-design.md`](../creative-design.md)「如何开展设计工作」);单个 artboard 内部的局部变体用 Tweaks 承载(用 `tweaks-panel.jsx`,见 [`../creative-design.md`](../creative-design.md)「Tweaks」,不要手写控件面板)。
@@ -0,0 +1,188 @@
1
+ /* BEGIN USAGE */
2
+ // Android.jsx — Simplified Android (Material 3) device frame
3
+ // Status bar + content + gesture nav + keyboard.
4
+ // Based on Figma M3 spec. No dependencies, no image assets.
5
+ // Exports (to window): AndroidDevice, AndroidStatusBar, AndroidListItem, AndroidNavBar, AndroidKeyboard
6
+ //
7
+ // Usage — wrap your screen content in <AndroidDevice> to get the bezel, status
8
+ // bar and gesture nav (props: width=412, height=892, dark, keyboard):
9
+ //
10
+ // <AndroidDevice>
11
+ // ...your screen content...
12
+ // </AndroidDevice>
13
+ // <AndroidDevice dark keyboard>…</AndroidDevice>
14
+ // <AndroidDevice width={360} height={800}>…</AndroidDevice> // smaller device size
15
+ /* END USAGE */
16
+
17
+ const MD_C = {
18
+ surface: '#f4fbf8',
19
+ surfaceVariant: '#dae5e1',
20
+ inverseOnSurface: '#ecf2ef',
21
+ secondaryContainer: '#cde8e1',
22
+ primaryFixedDim: '#83d5c6',
23
+ onSurface: '#171d1b',
24
+ onSurfaceVar: '#49454f',
25
+ onPrimaryContainer: '#00201c',
26
+ primary: '#006a60',
27
+ frameBorder: 'rgba(116,119,117,0.5)',
28
+ };
29
+
30
+ // ─────────────────────────────────────────────────────────────
31
+ // Status bar (time left, wifi/cell/battery right)
32
+ // ─────────────────────────────────────────────────────────────
33
+ function AndroidStatusBar({ dark = false }) {
34
+ const c = dark ? '#fff' : MD_C.onSurface;
35
+ return (
36
+ <div style={{
37
+ height: 40, display: 'flex', alignItems: 'center',
38
+ justifyContent: 'space-between', padding: '0 16px',
39
+ position: 'relative',
40
+ fontFamily: 'Roboto, system-ui, sans-serif',
41
+ }}>
42
+ {/* time left */}
43
+ <div style={{ width: 128, display: 'flex', alignItems: 'center', gap: 8 }}>
44
+ <span style={{ fontSize: 14, fontWeight: 400, letterSpacing: 0.25, lineHeight: '20px', color: c }}>9:30</span>
45
+ </div>
46
+ {/* camera punch-hole (center) */}
47
+ <div style={{
48
+ position: 'absolute', left: '50%', top: 8, transform: 'translateX(-50%)',
49
+ width: 24, height: 24, borderRadius: 100, background: '#2e2e2e',
50
+ }} />
51
+ {/* status icons right */}
52
+ <div style={{ display: 'flex', alignItems: 'center' }}>
53
+ <div style={{ display: 'flex', paddingRight: 2 }}>
54
+ <svg width="16" height="16" viewBox="0 0 16 16" style={{ marginRight: -2 }}>
55
+ <path d="M8 13.3L.67 5.97a10.37 10.37 0 0114.66 0L8 13.3z" fill={c}/>
56
+ </svg>
57
+ <svg width="16" height="16" viewBox="0 0 16 16" style={{ marginRight: -2 }}>
58
+ <path d="M14.67 14.67V1.33L1.33 14.67h13.34z" fill={c}/>
59
+ </svg>
60
+ </div>
61
+ <svg width="16" height="16" viewBox="0 0 16 16">
62
+ <rect x="3.75" y="2" width="8.5" height="13" rx="1.5" fill={c}/>
63
+ <rect x="5.5" y="0.9" width="5" height="2" rx="0.5" fill={c}/>
64
+ </svg>
65
+ </div>
66
+ </div>
67
+ );
68
+ }
69
+
70
+ // ─────────────────────────────────────────────────────────────
71
+ // List item (Material 3)
72
+ // ─────────────────────────────────────────────────────────────
73
+ function AndroidListItem({ headline, supporting, leading }) {
74
+ return (
75
+ <div style={{
76
+ display: 'flex', alignItems: 'center', gap: 16,
77
+ padding: '12px 16px', minHeight: 56, boxSizing: 'border-box',
78
+ fontFamily: 'Roboto, system-ui, sans-serif',
79
+ }}>
80
+ {leading && (
81
+ <div style={{
82
+ width: 40, height: 40, borderRadius: '50%',
83
+ background: MD_C.primary, color: '#fff',
84
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
85
+ fontSize: 18, fontWeight: 500, flexShrink: 0,
86
+ }}>{leading}</div>
87
+ )}
88
+ <div style={{ flex: 1, minWidth: 0 }}>
89
+ <div style={{ fontSize: 16, color: MD_C.onSurface, lineHeight: '24px' }}>{headline}</div>
90
+ {supporting && (
91
+ <div style={{ fontSize: 14, color: MD_C.onSurfaceVar, lineHeight: '20px' }}>{supporting}</div>
92
+ )}
93
+ </div>
94
+ </div>
95
+ );
96
+ }
97
+
98
+ // ─────────────────────────────────────────────────────────────
99
+ // Gesture nav bar (pill)
100
+ // ─────────────────────────────────────────────────────────────
101
+ function AndroidNavBar({ dark = false }) {
102
+ return (
103
+ <div style={{
104
+ height: 24, display: 'flex', alignItems: 'center', justifyContent: 'center',
105
+ }}>
106
+ <div style={{
107
+ width: 108, height: 4, borderRadius: 2,
108
+ background: dark ? '#fff' : MD_C.onSurface, opacity: 0.4,
109
+ }} />
110
+ </div>
111
+ );
112
+ }
113
+
114
+ // ─────────────────────────────────────────────────────────────
115
+ // Device frame — wraps everything
116
+ // ─────────────────────────────────────────────────────────────
117
+ function AndroidDevice({
118
+ children, width = 412, height = 892, dark = false,
119
+ keyboard = false,
120
+ }) {
121
+ return (
122
+ <div style={{
123
+ width, height, borderRadius: 18, overflow: 'hidden',
124
+ background: dark ? '#1d1b20' : MD_C.surface,
125
+ border: `8px solid ${MD_C.frameBorder}`,
126
+ display: 'flex', flexDirection: 'column', boxSizing: 'border-box',
127
+ }}>
128
+ <AndroidStatusBar dark={dark} />
129
+ <div style={{ flex: 1, overflow: 'auto' }}>
130
+ {children}
131
+ </div>
132
+ {keyboard && <AndroidKeyboard />}
133
+ <AndroidNavBar dark={dark} />
134
+ </div>
135
+ );
136
+ }
137
+
138
+ // ─────────────────────────────────────────────────────────────
139
+ // Keyboard — Gboard (Material 3)
140
+ // ─────────────────────────────────────────────────────────────
141
+ function AndroidKeyboard() {
142
+ let _k = 0;
143
+ const key = (l, { flex = 1, bg = MD_C.surface, r = 6, minW, fs = 21 } = {}) => (
144
+ <div key={_k++} style={{
145
+ height: 46, borderRadius: r, flex, minWidth: minW,
146
+ background: bg, display: 'flex', alignItems: 'center', justifyContent: 'center',
147
+ fontFamily: 'Roboto, system-ui', fontSize: fs,
148
+ color: MD_C.onPrimaryContainer,
149
+ }}>{l}</div>
150
+ );
151
+ const row = (keys, style = {}) => (
152
+ <div style={{ display: 'flex', gap: 6, justifyContent: 'center', ...style }}>
153
+ {keys.map(l => key(l))}
154
+ </div>
155
+ );
156
+ return (
157
+ <div style={{
158
+ background: MD_C.inverseOnSurface, padding: '0 8px 8px',
159
+ display: 'flex', flexDirection: 'column', gap: 4,
160
+ }}>
161
+ {/* navbar spacer (icons omitted) */}
162
+ <div style={{ height: 44 }} />
163
+ {/* key rows */}
164
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
165
+ {row(['q','w','e','r','t','y','u','i','o','p'])}
166
+ {row(['a','s','d','f','g','h','j','k','l'], { padding: '0 20px' })}
167
+ <div style={{ display: 'flex', gap: 6 }}>
168
+ {key('', { bg: MD_C.surfaceVariant })}
169
+ <div style={{ display: 'flex', gap: 6, flex: 7, minWidth: 274 }}>
170
+ {['z','x','c','v','b','n','m'].map(l => key(l))}
171
+ </div>
172
+ {key('', { bg: MD_C.surfaceVariant })}
173
+ </div>
174
+ <div style={{ display: 'flex', gap: 6 }}>
175
+ {key('?123', { bg: MD_C.secondaryContainer, r: 100, minW: 58, fs: 14 })}
176
+ {key(',', { bg: MD_C.surfaceVariant })}
177
+ {key('', { flex: 3, minW: 154 })}
178
+ {key('.', { bg: MD_C.surfaceVariant })}
179
+ {key('', { bg: MD_C.primaryFixedDim, r: 100, minW: 58 })}
180
+ </div>
181
+ </div>
182
+ </div>
183
+ );
184
+ }
185
+
186
+ Object.assign(window, {
187
+ AndroidDevice, AndroidStatusBar, AndroidListItem, AndroidNavBar, AndroidKeyboard,
188
+ });