@cyber-dash-tech/revela 0.19.6 → 0.19.7

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/README.md CHANGED
@@ -39,7 +39,7 @@ npm_config_cache=/tmp/revela-npm-cache bun run smoke:mcp-pack
39
39
  Install Revela through the Codex Git marketplace:
40
40
 
41
41
  ```bash
42
- codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.6
42
+ codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.7
43
43
  codex plugin add revela@revela
44
44
  ```
45
45
 
@@ -121,7 +121,7 @@ Revela includes built-in deck designs. Design previews are generated from the bu
121
121
 
122
122
  To switch designs in Codex, ask:
123
123
 
124
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), use summit as the design.
124
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), use summit as the design.
125
125
 
126
126
  In Codex, ask Revela to list or switch designs; the plugin uses the active design when making decks.
127
127
 
@@ -129,7 +129,7 @@ In Codex, ask Revela to list or switch designs; the plugin uses the active desig
129
129
 
130
130
  Domains add topic-specific communication guidance, such as consulting, product, or investor communication. Use them when you want Revela to adapt deck framing to a specific context.
131
131
 
132
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), list available domains.
132
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), list available domains.
133
133
 
134
134
  In Codex, ask Revela to list or switch domains; the active domain guides deck framing during init, research, and planning.
135
135
 
@@ -139,35 +139,35 @@ Use these prompts in Codex from the workspace that contains your source material
139
139
 
140
140
  1. Choose the narrative domain before authoring so Revela frames the audience, decision, risks, and objections for your context.
141
141
 
142
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), use consulting as the domain.
142
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), use consulting as the domain.
143
143
 
144
144
  2. Choose the deck design before rendering so generated artifacts use the intended visual language.
145
145
 
146
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), use summit as the design.
146
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), use summit as the design.
147
147
 
148
148
  3. Create a custom design when you want a different visual direction.
149
149
 
150
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), create a new design named neon-finance with a crisp financial-dashboard style: dark surfaces, precise grids, and bright green accents.
150
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), create a new design named neon-finance with a crisp financial-dashboard style: dark surfaces, precise grids, and bright green accents.
151
151
 
152
152
  Revela may ask for references or constraints, then creates a workspace draft with `DESIGN.md`, `design.css`, and any local `assets/**`. It generates a preview from the built-in page-template fixture plus that CSS so you can review cover, agenda, timelines, charts, tables, cards, and visual slots before installing. When it is ready, switch to it:
153
153
 
154
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), use neon-finance as the design.
154
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), use neon-finance as the design.
155
155
 
156
156
  4. Initialize local material intake. Init scans, extracts, and reviews workspace sources; it does not create a Narrative Vault.
157
157
 
158
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), help me init this workspace from the local materials.
158
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), help me init this workspace from the local materials.
159
159
 
160
160
  5. Research source-linked deck inputs and save findings.
161
161
 
162
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), research the public evidence and examples needed for this deck.
162
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), research the public evidence and examples needed for this deck.
163
163
 
164
164
  6. Create or update the deck plan before generating HTML so slide order, chapter structure, source links, unresolved inputs, source limitations, and visual intent are explicit.
165
165
 
166
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), create or update the deck plan before generating HTML.
166
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), create or update the deck plan before generating HTML.
167
167
 
168
168
  7. Make an HTML deck from the current deck plan.
169
169
 
170
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), make the deck from the current deck plan.
170
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), make the deck from the current deck plan.
171
171
 
172
172
  8. Review and annotate the generated deck from the localhost website card after make-deck completes.
173
173
 
@@ -175,15 +175,15 @@ Revela serves the deck from `http://127.0.0.1:<port>/decks/<file>.html` so you c
175
175
 
176
176
  9. Export a PDF after deck QA passes.
177
177
 
178
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), export the deck to PDF.
178
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), export the deck to PDF.
179
179
 
180
180
  10. Export an editable PPTX after deck QA passes.
181
181
 
182
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), export the deck to PPTX.
182
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), export the deck to PPTX.
183
183
 
184
184
  11. Export per-slide PNG files after deck QA passes.
185
185
 
186
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md), export the deck to PNG.
186
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md), export the deck to PNG.
187
187
 
188
188
  ## Annotate A Deck
189
189
 
package/README.zh-CN.md CHANGED
@@ -39,7 +39,7 @@ npm_config_cache=/tmp/revela-npm-cache bun run smoke:mcp-pack
39
39
  通过 Codex Git marketplace 安装 Revela:
40
40
 
41
41
  ```bash
42
- codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.6
42
+ codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.7
43
43
  codex plugin add revela@revela
44
44
  ```
45
45
 
@@ -121,7 +121,7 @@ Revela 内置多个 deck design。Design preview 由内置 page-template preview
121
121
 
122
122
  在 Codex 中切换 design,可以这样问:
123
123
 
124
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),use summit as design.
124
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),use summit as design.
125
125
 
126
126
  在 Codex 中,可以直接让 Revela 列出或切换 design;生成 deck 时会使用 active design。
127
127
 
@@ -129,7 +129,7 @@ Revela 内置多个 deck design。Design preview 由内置 page-template preview
129
129
 
130
130
  Domain 提供特定场景的沟通 guidance,例如 consulting、product 或 investor communication。需要让 Revela 按具体沟通场景调整 deck framing 时使用。
131
131
 
132
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),列出 available domains。
132
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),列出 available domains。
133
133
 
134
134
  在 Codex 中,可以直接让 Revela 列出或切换 domain;active domain 会用于 init、research 和 deck planning 阶段的 framing。
135
135
 
@@ -139,35 +139,35 @@ Domain 提供特定场景的沟通 guidance,例如 consulting、product 或 in
139
139
 
140
140
  1. 先选择 domain,让 Revela 按你的沟通场景 framing 受众、决策、风险和潜在质疑。
141
141
 
142
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),use consulting as domain.
142
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),use consulting as domain.
143
143
 
144
144
  2. 再选择 design,让后续生成的 deck 使用指定视觉风格。
145
145
 
146
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),use summit as design.
146
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),use summit as design.
147
147
 
148
148
  3. 如果需要不同的视觉方向,可以创建一个自定义 design。
149
149
 
150
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),创建一个名为 neon-finance 的新 design:金融仪表盘风格,深色界面、精密网格、亮绿色重点色。
150
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),创建一个名为 neon-finance 的新 design:金融仪表盘风格,深色界面、精密网格、亮绿色重点色。
151
151
 
152
152
  Revela 可能会继续询问参考图、风格约束或禁忌项,然后在 workspace draft 中创建 `DESIGN.md`、`design.css` 和需要的本地 `assets/**`。它会用内置 page-template fixture 加上这份 CSS 生成 preview,让你在 install 前先检查 cover、agenda、timeline、chart、table、card 和 visual slot。创建完成后再切换使用:
153
153
 
154
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),使用 neon-finance 作为 design。
154
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),使用 neon-finance 作为 design。
155
155
 
156
156
  4. 初始化本地 material intake。Init 会扫描、抽取并审阅 workspace source;它不会创建 Narrative Vault。
157
157
 
158
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),帮我 init 这个 workspace,先读本地材料。
158
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),帮我 init 这个 workspace,先读本地材料。
159
159
 
160
160
  5. 针对 deck 所需输入做 research,并保存带来源的 findings。
161
161
 
162
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),research 这个 deck 需要的公开证据、案例和 source。
162
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),research 这个 deck 需要的公开证据、案例和 source。
163
163
 
164
164
  6. 先创建或更新 deck plan,明确 slide 顺序、章节结构、source links、unresolved inputs、source limitations 和 visual intent,再生成 HTML。
165
165
 
166
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),生成 HTML 前先 create or update deck plan。
166
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),生成 HTML 前先 create or update deck plan。
167
167
 
168
168
  7. 基于当前 deck plan 生成 HTML deck。
169
169
 
170
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),基于当前 deck plan make deck。
170
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),基于当前 deck plan make deck。
171
171
 
172
172
  8. make-deck 完成后,从 localhost website card 打开生成的 deck,并在 Codex Browser 中做 annotation 和定向修改。
173
173
 
@@ -175,15 +175,15 @@ Revela 会通过 `http://127.0.0.1:<port>/decks/<file>.html` 服务 deck,你
175
175
 
176
176
  9. QA 通过后导出 PDF。
177
177
 
178
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),把 deck export 成 PDF。
178
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),把 deck export 成 PDF。
179
179
 
180
180
  10. QA 通过后导出可编辑 PPTX。
181
181
 
182
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),把 deck export 成 PPTX。
182
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),把 deck export 成 PPTX。
183
183
 
184
184
  11. QA 通过后导出每页 PNG。
185
185
 
186
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.6/skills/revela/SKILL.md),把 deck export 成 PNG。
186
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.7/skills/revela/SKILL.md),把 deck export 成 PNG。
187
187
 
188
188
  ## Annotate Deck
189
189
 
@@ -210,7 +210,7 @@ Lucent agenda component using `.toc-wrap`, `.toc-title`, `.toc-list`, and option
210
210
  <!-- @component:toc:end -->
211
211
 
212
212
  <!-- @component:text-panel:start -->
213
- Focused text module for setup, reading guidance, and narrative explanation. Use inside report layouts or boxes.
213
+ Focused text module for setup, reading guidance, narrative explanation, italic quote text, and formula text. Use inside report layouts or boxes. Place quotes as `<blockquote class="text-panel-quote">` and formulas as `<figure class="text-panel-formula" data-latex="...">`; use `.text-panel-formula-fallback` only when LaTeX cannot be rendered. Do not model quote or formula as standalone components.
214
214
  <!-- @component:text-panel:end -->
215
215
 
216
216
  <!-- @component:box:start -->
@@ -146,6 +146,21 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
146
146
  .template-text-panel--color { background: linear-gradient(135deg, #5f82c8 0%, var(--accent-primary) 58%, #18a8d8 115%); color: white; box-shadow: 0 22px 56px rgba(49,94,234,0.24); }
147
147
  .template-text-panel--color .template-text-panel-title { color: white; }
148
148
  .template-text-panel--color .template-text-panel-body { color: rgba(255,255,255,0.78); }
149
+ .template-text-panel-quote { margin: 2px 0 0; font-size: 22px; line-height: 1.44; font-style: italic; color: var(--text-secondary); }
150
+ .template-text-panel--color .template-text-panel-quote { color: rgba(255,255,255,0.82); }
151
+ .template-text-panel-formula { margin: 0; width: 100%; display: grid; gap: 8px; color: var(--text-primary); }
152
+ .template-text-panel--color .template-text-panel-formula { color: white; }
153
+ .template-text-panel-formula .katex-display { margin: 0; overflow: visible; }
154
+ .template-text-panel-formula .katex { font-size: 1.08em; color: inherit; }
155
+ .template-text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
156
+ .template-text-panel-formula-caption { margin: 0; font-size: 14px; line-height: 1.35; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
157
+ .template-text-panel--color .template-text-panel-formula-caption { color: rgba(255,255,255,0.72); }
158
+ .text-panel-quote { margin: 0; font-style: italic; line-height: 1.46; color: var(--text-secondary); }
159
+ .text-panel-formula { margin: 0; display: grid; gap: 8px; color: var(--text-primary); }
160
+ .text-panel-formula .katex-display { margin: 0; overflow: visible; }
161
+ .text-panel-formula .katex { color: inherit; }
162
+ .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
163
+ .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
149
164
  .template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
150
165
  .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
151
166
  .template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }
@@ -210,7 +210,7 @@ Lucent agenda component using `.toc-wrap`, `.toc-title`, `.toc-list`, and option
210
210
  <!-- @component:toc:end -->
211
211
 
212
212
  <!-- @component:text-panel:start -->
213
- Focused text module for setup, reading guidance, and narrative explanation. Use inside report layouts or boxes.
213
+ Focused text module for setup, reading guidance, narrative explanation, italic quote text, and formula text. Use inside report layouts or boxes. Place quotes as `<blockquote class="text-panel-quote">` and formulas as `<figure class="text-panel-formula" data-latex="...">`; use `.text-panel-formula-fallback` only when LaTeX cannot be rendered. Do not model quote or formula as standalone components.
214
214
  <!-- @component:text-panel:end -->
215
215
 
216
216
  <!-- @component:box:start -->
@@ -146,6 +146,21 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
146
146
  .template-text-panel--color { background: linear-gradient(135deg, #5f82c8 0%, var(--accent-primary) 58%, #18a8d8 115%); color: white; box-shadow: 0 22px 56px rgba(49,94,234,0.24); }
147
147
  .template-text-panel--color .template-text-panel-title { color: white; }
148
148
  .template-text-panel--color .template-text-panel-body { color: rgba(255,255,255,0.78); }
149
+ .template-text-panel-quote { margin: 2px 0 0; font-size: 22px; line-height: 1.44; font-style: italic; color: var(--text-secondary); }
150
+ .template-text-panel--color .template-text-panel-quote { color: rgba(255,255,255,0.82); }
151
+ .template-text-panel-formula { margin: 0; width: 100%; display: grid; gap: 8px; color: var(--text-primary); }
152
+ .template-text-panel--color .template-text-panel-formula { color: white; }
153
+ .template-text-panel-formula .katex-display { margin: 0; overflow: visible; }
154
+ .template-text-panel-formula .katex { font-size: 1.08em; color: inherit; }
155
+ .template-text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
156
+ .template-text-panel-formula-caption { margin: 0; font-size: 14px; line-height: 1.35; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
157
+ .template-text-panel--color .template-text-panel-formula-caption { color: rgba(255,255,255,0.72); }
158
+ .text-panel-quote { margin: 0; font-style: italic; line-height: 1.46; color: var(--text-secondary); }
159
+ .text-panel-formula { margin: 0; display: grid; gap: 8px; color: var(--text-primary); }
160
+ .text-panel-formula .katex-display { margin: 0; overflow: visible; }
161
+ .text-panel-formula .katex { color: inherit; }
162
+ .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
163
+ .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
149
164
  .template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
150
165
  .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
151
166
  .template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }
@@ -898,7 +898,7 @@ Use these components when a page needs repeatable editorial modules inside a lar
898
898
  <!-- @component:box:start -->
899
899
  #### Box
900
900
 
901
- Card/group primitive for one idea, case, evidence item, metric, objection, risk, or action. Put `text-panel`, `media`, `echart-panel`, `data-table`, `stat-card`, or `quote` inside a box when they support the same idea.
901
+ Card/group primitive for one idea, case, evidence item, metric, objection, risk, or action. Put `text-panel`, `media`, `echart-panel`, `data-table`, or `stat-card` inside a box when they support the same idea.
902
902
 
903
903
  ```html
904
904
  <div class="box">
@@ -927,7 +927,7 @@ Card/group primitive for one idea, case, evidence item, metric, objection, risk,
927
927
 
928
928
  <!-- renamed from report-text-panel -->
929
929
 
930
- Unified narrative text container. Use inside any layout slot that needs a self-contained reading surface with heading, body copy, and optional footer metadata. The body zone accepts prose, a bullet list, or both — choose based on content, not convention.
930
+ Unified narrative text container. Use inside any layout slot that needs a self-contained reading surface with heading, body copy, italic quote text, formula text, and optional footer metadata. The body zone accepts prose, a bullet list, quote, formula, or a mix — choose based on content, not convention.
931
931
 
932
932
  ```html
933
933
  <!-- variant A: prose only (--dark) -->
@@ -937,6 +937,11 @@ Unified narrative text container. Use inside any layout slot that needs a self-c
937
937
  <h2 style="margin-top:16px;font-size:60px;line-height:0.92;letter-spacing:-0.03em;text-transform:uppercase;color:#f0f4f7;max-width:360px;">Narrative heading</h2>
938
938
  <div class="text-panel-body" style="margin-top:20px;">
939
939
  <p style="font-size:17px;line-height:1.58;color:rgba(243,238,230,0.84);max-width:390px;">Use one or two compact paragraphs when continuous prose fits the content better than a list.</p>
940
+ <blockquote class="text-panel-quote">Italic quote text belongs inside the text panel body.</blockquote>
941
+ <figure class="text-panel-formula" data-latex="\mathrm{ROI}=\frac{\mathrm{Gain}-\mathrm{Cost}}{\mathrm{Cost}}">
942
+ <span class="katex">Rendered formula</span>
943
+ <p class="text-panel-formula-caption">Formula text member</p>
944
+ </figure>
940
945
  </div>
941
946
  </div>
942
947
  <div class="text-panel-footer" style="color:rgba(243,238,230,0.68);">
@@ -1011,6 +1016,38 @@ Unified narrative text container. Use inside any layout slot that needs a self-c
1011
1016
  gap: 12px;
1012
1017
  }
1013
1018
 
1019
+ .text-panel-quote {
1020
+ margin: 0;
1021
+ font-style: italic;
1022
+ line-height: 1.46;
1023
+ color: var(--text-secondary);
1024
+ }
1025
+
1026
+ .text-panel-formula {
1027
+ margin: 0;
1028
+ display: grid;
1029
+ gap: 8px;
1030
+ color: var(--text-primary);
1031
+ }
1032
+
1033
+ .text-panel-formula-fallback {
1034
+ display: block;
1035
+ white-space: normal;
1036
+ overflow-wrap: anywhere;
1037
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1038
+ font-size: 0.82em;
1039
+ line-height: 1.35;
1040
+ color: inherit;
1041
+ }
1042
+
1043
+ .text-panel-formula-caption {
1044
+ margin: 0;
1045
+ font-size: 12px;
1046
+ letter-spacing: 0.08em;
1047
+ text-transform: uppercase;
1048
+ color: var(--text-muted);
1049
+ }
1050
+
1014
1051
  /* renamed from .report-panel-footer */
1015
1052
  .text-panel-footer {
1016
1053
  display: flex;
@@ -1021,7 +1058,7 @@ Unified narrative text container. Use inside any layout slot that needs a self-c
1021
1058
  ```
1022
1059
 
1023
1060
  Rules:
1024
- - `.text-panel-body` is the only required structural child. Place `<p>` elements, an `<ul class="editorial-list">`, or both inside it.
1061
+ - `.text-panel-body` is the only required structural child. Place `<p>` elements, an `<ul class="editorial-list">`, `<blockquote class="text-panel-quote">`, `<figure class="text-panel-formula">`, or a deliberate mix inside it. Use `.text-panel-formula-fallback` only inside formula figures when LaTeX cannot be rendered.
1025
1062
  - Eyebrow, heading, and footer are all optional — include them only when the content calls for them.
1026
1063
  - Choose `--dark` or `--light` to match the slide's tone. Do not mix variants within a single panel.
1027
1064
  - Pair with a visually dominant neighbor (image, chart) when the layout needs strong contrast against the text zone.
@@ -2293,130 +2330,6 @@ Catalogue-style table-of-contents panel for chaptered presentations. Use a compo
2293
2330
  - **Page references stay understated.** Right-align page numbers and keep them visually secondary to the chapter title.
2294
2331
  <!-- @component:toc:end -->
2295
2332
 
2296
- <!-- @component:quote:start -->
2297
- #### Quote (.quote-block)
2298
-
2299
- Flat editorial quote block. Wide and short (width > height). Transparent background — place it inside any layout slot. The large decorative quotation mark is CSS-rendered (no icon dependency).
2300
-
2301
- ```html
2302
- <div class="quote-block">
2303
- <div class="quote-mark" aria-hidden="true">"</div>
2304
- <p class="quote-text">The mountains teach us that progress is measured not in speed, but in the ground gained against resistance.</p>
2305
- <div class="quote-attribution">
2306
- <!-- initials variant -->
2307
- <div class="quote-avatar" data-initials="JD" style="--qa-rot:-11deg;"></div>
2308
- <!-- photo variant: <div class="quote-avatar" style="--qa-rot:8deg;"><img src="avatar.jpg" alt="Jane Doe"></div> -->
2309
- <div class="quote-meta">
2310
- <p class="quote-name">Jane Doe</p>
2311
- <p class="caption">CEO, Acme Corporation</p>
2312
- </div>
2313
- </div>
2314
- </div>
2315
- ```
2316
-
2317
- ```css
2318
- .quote-block {
2319
- position: relative;
2320
- padding: 36px 44px 32px;
2321
- overflow: hidden;
2322
- }
2323
-
2324
- .quote-mark {
2325
- position: absolute;
2326
- top: -18px;
2327
- left: 28px;
2328
- font-family: Baskerville, Georgia, serif;
2329
- font-size: 140px;
2330
- font-weight: 700;
2331
- line-height: 1;
2332
- color: var(--accent-sage);
2333
- opacity: 0.42;
2334
- pointer-events: none;
2335
- user-select: none;
2336
- }
2337
-
2338
- .quote-text {
2339
- position: relative;
2340
- font-size: 20px;
2341
- font-style: italic;
2342
- line-height: 1.5;
2343
- color: var(--text-primary);
2344
- max-width: 860px;
2345
- padding-top: 48px; /* clears the decorative mark */
2346
- }
2347
-
2348
- .quote-attribution {
2349
- display: flex;
2350
- align-items: center;
2351
- gap: 14px;
2352
- margin-top: 24px;
2353
- }
2354
-
2355
- .quote-avatar {
2356
- position: relative;
2357
- width: 52px;
2358
- height: 52px;
2359
- flex-shrink: 0;
2360
- }
2361
-
2362
- .quote-avatar::before {
2363
- content: '';
2364
- position: absolute;
2365
- inset: 0;
2366
- background: #fff;
2367
- border: 1px solid var(--line-strong);
2368
- }
2369
-
2370
- .quote-avatar::after {
2371
- content: attr(data-initials);
2372
- position: absolute;
2373
- inset: 0;
2374
- background: var(--accent-earth);
2375
- display: flex;
2376
- align-items: center;
2377
- justify-content: center;
2378
- font-family: var(--font-display);
2379
- font-size: 14px;
2380
- font-weight: 700;
2381
- color: #fff;
2382
- transform: rotate(var(--qa-rot, -8deg));
2383
- }
2384
-
2385
- .quote-avatar img {
2386
- position: absolute;
2387
- inset: 0;
2388
- width: 52px;
2389
- height: 52px;
2390
- object-fit: cover;
2391
- transform: rotate(var(--qa-rot, -8deg));
2392
- z-index: 1;
2393
- }
2394
-
2395
- .quote-meta {
2396
- display: flex;
2397
- flex-direction: column;
2398
- gap: 2px;
2399
- }
2400
-
2401
- .quote-name {
2402
- font-size: 14px;
2403
- font-weight: 600;
2404
- color: var(--text-primary);
2405
- line-height: 1.3;
2406
- }
2407
- ```
2408
-
2409
- **Tips:**
2410
-
2411
- - **Dark background**: override text colors on the parent slot — `color: var(--bg-page)` for `.quote-text` and `.quote-name`; increase `.quote-mark` opacity to `0.15` (the sage hue reads better against dark at lower opacity).
2412
- - **Avatar initials variant**: use `data-initials="JD"` and `style="--qa-rot:-11deg;"` on `.quote-avatar` (no child elements). The `::after` pseudo-element reads the initials and renders them on a rotated `--accent-earth` square over a white base square.
2413
- - **Avatar photo variant**: add `<img>` inside `.quote-avatar` with `style="--qa-rot:8deg;"` on the parent. The image is fixed at `52×52px`, rotated by `--qa-rot`, and clips to the container via `overflow:hidden`. The white `::before` base square shows as corner peeking behind the rotated photo.
2414
- - **Quote text length**: adjust `font-size` between `17px` (longer quotes, 3+ lines) and `24px` (short punchy quotes, 1 line). Keep `line-height: 1.5`.
2415
- - **Opacity guidance**: on `--bg-page` (warm paper), `.quote-mark` opacity `0.25` works well. On dark `--bg-frame` backgrounds, reduce to `0.15`.
2416
- - **Source-only attribution** (no person): omit `.quote-avatar` entirely and use `.quote-name` for the source text (e.g. a report title or publication name).
2417
-
2418
- <!-- @component:quote:end -->
2419
-
2420
2333
  <!-- @component:brand-watermark:start -->
2421
2334
  #### Brand Watermark
2422
2335
 
@@ -146,6 +146,21 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
146
146
  .template-text-panel--color { background: linear-gradient(135deg, #5f82c8 0%, var(--accent-primary) 58%, #18a8d8 115%); color: white; box-shadow: 0 22px 56px rgba(49,94,234,0.24); }
147
147
  .template-text-panel--color .template-text-panel-title { color: white; }
148
148
  .template-text-panel--color .template-text-panel-body { color: rgba(255,255,255,0.78); }
149
+ .template-text-panel-quote { margin: 2px 0 0; font-size: 22px; line-height: 1.44; font-style: italic; color: var(--text-secondary); }
150
+ .template-text-panel--color .template-text-panel-quote { color: rgba(255,255,255,0.82); }
151
+ .template-text-panel-formula { margin: 0; width: 100%; display: grid; gap: 8px; color: var(--text-primary); }
152
+ .template-text-panel--color .template-text-panel-formula { color: white; }
153
+ .template-text-panel-formula .katex-display { margin: 0; overflow: visible; }
154
+ .template-text-panel-formula .katex { font-size: 1.08em; color: inherit; }
155
+ .template-text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
156
+ .template-text-panel-formula-caption { margin: 0; font-size: 14px; line-height: 1.35; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
157
+ .template-text-panel--color .template-text-panel-formula-caption { color: rgba(255,255,255,0.72); }
158
+ .text-panel-quote { margin: 0; font-style: italic; line-height: 1.46; color: var(--text-secondary); }
159
+ .text-panel-formula { margin: 0; display: grid; gap: 8px; color: var(--text-primary); }
160
+ .text-panel-formula .katex-display { margin: 0; overflow: visible; }
161
+ .text-panel-formula .katex { color: inherit; }
162
+ .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
163
+ .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
149
164
  .template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
150
165
  .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
151
166
  .template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }
@@ -240,7 +240,7 @@ new SlidePresentation();
240
240
  - **Images for photographic references.** Use image treatment rules rather than fake SVG when the reference is photographic, UI, webpage, or product imagery.
241
241
  - **Content pages need a stable title block.** Except cover, TOC, closing, section divider, and full-bleed hero slides, every normal content slide should include a visible title block from the upper-left safe area. It should contain a compact chapter/section label plus a slide title written as the page's claim or takeaway.
242
242
  - **Do not hide the page title inside a card.** Body components may have their own headings, but the slide-level title block should remain separate and easy to scan unless the chosen layout explicitly defines a compact side-title variant.
243
- - **Text panels are not decorative rule panels.** Do not add a default left border, vertical accent bar, yellow/gold line, or inline rule to `text-panel`. Use typography, spacing, boxes, stats, quotes, or layout-level dividers for emphasis.
243
+ - **Text panels are not decorative rule panels.** Do not add a default left border, vertical accent bar, yellow/gold line, or inline rule to `text-panel`. Use typography, spacing, boxes, stats, italic quote text inside `text-panel`, or layout-level dividers for emphasis.
244
244
  - **Preview must be real.** A design preview should show actual layout/component behavior, not empty placeholder boxes only.
245
245
 
246
246
  ### Common Mistakes
@@ -447,18 +447,18 @@ Structural intent:
447
447
 
448
448
  ### Components
449
449
 
450
- Components are reusable primitives. Use this hierarchy: `layout -> box/card -> text-panel + media/chart/table/stat/quote`.
450
+ Components are reusable primitives. Use this hierarchy: `layout -> box/card -> text-panel + media/chart/table/stat`.
451
451
 
452
452
  LLM-facing vocabulary:
453
453
  - `box` — card/group primitive for one idea, case, evidence item, metric, objection, risk, or action.
454
- - `text-panel` — language module for title, body text, bullets, and source notes.
454
+ - `text-panel` — language module for title, body text, bullets, italic quote text, formula text, and source notes.
455
455
  - `media` — normal image/screenshot/diagram/logo/portrait component; use `hero` instead for full-bleed covers.
456
456
  - `echart-panel` — chart frame with caption/source structure.
457
457
  - `data-table` — structured table component for tabular data and source notes.
458
458
  - `steps` — process or phase sequence; compatibility implementation may use `.flow-*` classes.
459
459
  - `roadmap-horizontal` and `roadmap-vertical` — dated phases, milestones, historical evolution, or future plans; compatibility implementation may use `.timeline-journey-*` classes.
460
460
  - `hero` — full-bleed cover, section divider, closing, or strong visual statement with overlaid title/subtitle.
461
- - `stat-card`, `quote`, and `toc` — pattern components for their specific use cases.
461
+ - `stat-card` and `toc` — pattern components for their specific use cases.
462
462
  - `page-number` and `brand-watermark` — utility components.
463
463
 
464
464
  Do not expose `image-title`, `media--cover`, `editorial-*`, `flow-*`, `timeline-journey-*`, or `svg-motif` as new component choices. Old classes may remain in CSS as compatibility implementation details.
@@ -470,7 +470,7 @@ Density guidance: normal content slides usually need 2-4 boxes. Evidence slides
470
470
  <!-- @component:box:start -->
471
471
  #### Box (.box)
472
472
 
473
- Card/group primitive for one idea, case, evidence item, metric, objection, risk, or action. Put `text-panel`, `media`, `echart-panel`, `data-table`, `stat-card`, or `quote` inside a box when they support the same idea.
473
+ Card/group primitive for one idea, case, evidence item, metric, objection, risk, or action. Put `text-panel`, `media`, `echart-panel`, `data-table`, or `stat-card` inside a box when they support the same idea.
474
474
 
475
475
  ```html
476
476
  <div class="box">
@@ -494,15 +494,20 @@ Card/group primitive for one idea, case, evidence item, metric, objection, risk,
494
494
  <!-- @component:text-panel:start -->
495
495
  #### Text Panel (.text-panel)
496
496
 
497
- Language module for headings, body copy, lists, and footer/source metadata. It can sit inside `box` or directly in a layout slot.
497
+ Language module for headings, body copy, lists, italic quote text, formula text, and footer/source metadata. It can sit inside `box` or directly in a layout slot.
498
498
 
499
- `text-panel` is a neutral language container. Do not add a default left border, vertical accent bar, yellow/gold rule, or decorative stripe to it. If a slide needs emphasis, use a `box`, `stat-card`, `quote`, `toc`, or a layout-level divider instead.
499
+ `text-panel` is a neutral language container. Do not add a default left border, vertical accent bar, yellow/gold rule, or decorative stripe to it. If a slide needs emphasis, use a `box`, `stat-card`, `toc`, or a layout-level divider instead. Quotes and formulas are text members inside `.text-panel-body`, not standalone components.
500
500
 
501
501
  ```html
502
502
  <div class="text-panel text-panel--light">
503
503
  <div class="text-panel-body">
504
504
  <p class="eyebrow">Context</p>
505
505
  <h2>Panel heading</h2>
506
+ <blockquote class="text-panel-quote">Italic quote text belongs inside the text panel body.</blockquote>
507
+ <figure class="text-panel-formula" data-latex="\mathrm{ROI}=\frac{\mathrm{Gain}-\mathrm{Cost}}{\mathrm{Cost}}">
508
+ <span class="katex">Rendered formula</span>
509
+ <p class="text-panel-formula-caption">Formula text member</p>
510
+ </figure>
506
511
  <ul class="editorial-list"><li><strong>Signal.</strong> Supporting copy.</li></ul>
507
512
  </div>
508
513
  <div class="text-panel-footer"><span class="source">Source: dataset</span><span class="caption">01</span></div>
@@ -515,6 +520,10 @@ Language module for headings, body copy, lists, and footer/source metadata. It c
515
520
  .text-panel--light { background: var(--bg-page-alt); color: var(--text-primary); }
516
521
  .text-panel--dark { background: #1f242b; color: #f8fafc; --text-primary: #f8fafc; --text-secondary: #cbd5e1; --text-muted: #94a3b8; --line: rgba(248,250,252,0.16); }
517
522
  .text-panel-body { display: flex; flex-direction: column; gap: 14px; }
523
+ .text-panel-quote { margin: 0; font-style: italic; line-height: 1.46; color: var(--text-secondary); }
524
+ .text-panel-formula { margin: 0; display: grid; gap: 8px; color: var(--text-primary); }
525
+ .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
526
+ .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
518
527
  .text-panel-footer { display: flex; justify-content: space-between; align-items: flex-end; gap: 18px; }
519
528
  ```
520
529
  <!-- @component:text-panel:end -->
@@ -711,23 +720,6 @@ Table of contents or section index.
711
720
  ```
712
721
  <!-- @component:toc:end -->
713
722
 
714
- <!-- @component:quote:start -->
715
- #### Quote (.quote-block)
716
-
717
- Large quotation or summary statement.
718
-
719
- ```html
720
- <div class="quote-block"><p class="quote-mark">“</p><blockquote>Statement text goes here.</blockquote><p class="quote-source">Source</p></div>
721
- ```
722
-
723
- ```css
724
- .quote-block { height: 100%; display: flex; flex-direction: column; justify-content: center; gap: 24px; max-width: 980px; }
725
- .quote-mark { font-size: 96px; line-height: 0.7; color: var(--accent-primary); }
726
- .quote-block blockquote { font-family: var(--font-display); font-size: 54px; line-height: 1.06; letter-spacing: -0.04em; color: var(--text-primary); }
727
- .quote-source { font-size: 13px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--text-muted); }
728
- ```
729
- <!-- @component:quote:end -->
730
-
731
723
  <!-- @component:brand-watermark:start -->
732
724
  #### Brand Watermark (.brand-watermark)
733
725
 
@@ -146,6 +146,21 @@ body { margin: 0; background: var(--bg-frame, #07111f); color: var(--text-primar
146
146
  .template-text-panel--color { background: linear-gradient(135deg, #5f82c8 0%, var(--accent-primary) 58%, #18a8d8 115%); color: white; box-shadow: 0 22px 56px rgba(49,94,234,0.24); }
147
147
  .template-text-panel--color .template-text-panel-title { color: white; }
148
148
  .template-text-panel--color .template-text-panel-body { color: rgba(255,255,255,0.78); }
149
+ .template-text-panel-quote { margin: 2px 0 0; font-size: 22px; line-height: 1.44; font-style: italic; color: var(--text-secondary); }
150
+ .template-text-panel--color .template-text-panel-quote { color: rgba(255,255,255,0.82); }
151
+ .template-text-panel-formula { margin: 0; width: 100%; display: grid; gap: 8px; color: var(--text-primary); }
152
+ .template-text-panel--color .template-text-panel-formula { color: white; }
153
+ .template-text-panel-formula .katex-display { margin: 0; overflow: visible; }
154
+ .template-text-panel-formula .katex { font-size: 1.08em; color: inherit; }
155
+ .template-text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
156
+ .template-text-panel-formula-caption { margin: 0; font-size: 14px; line-height: 1.35; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
157
+ .template-text-panel--color .template-text-panel-formula-caption { color: rgba(255,255,255,0.72); }
158
+ .text-panel-quote { margin: 0; font-style: italic; line-height: 1.46; color: var(--text-secondary); }
159
+ .text-panel-formula { margin: 0; display: grid; gap: 8px; color: var(--text-primary); }
160
+ .text-panel-formula .katex-display { margin: 0; overflow: visible; }
161
+ .text-panel-formula .katex { color: inherit; }
162
+ .text-panel-formula-fallback { display: block; white-space: normal; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.82em; line-height: 1.35; color: inherit; }
163
+ .text-panel-formula-caption { margin: 0; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted); }
149
164
  .template-chart-takeaway-list { display: grid; gap: 22px; width: 100%; }
150
165
  .template-chart-takeaway-item { display: grid; gap: 7px; padding-top: 18px; border-top: 1px solid rgba(255,255,255,0.24); }
151
166
  .template-chart-takeaway-item:first-child { padding-top: 0; border-top: 0; }