@cyber-dash-tech/revela 0.17.3 → 0.17.4

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.
@@ -480,6 +480,7 @@ These rules are mandatory for Monet.
480
480
  - **Sparse slides depend on image weight.** If content is light, the photo or page framing must hold the composition.
481
481
  - **No glass cards, neon KPI styling, or startup-product chrome.** Monet is editorial and print-adjacent.
482
482
  - **Visual hierarchy is strict:** eyebrow -> heading -> body -> caption.
483
+ - **Icon system is Lucide.** For ordinary UI, semantic, status, category, process, and navigation icons, use Lucide (`data-lucide`). Do not hand-write inline SVG for icons. SVG is allowed only for intentional decorative motifs, illustrations, or design-specific artwork. If any `data-lucide` icon is present, load Lucide via CDN and call `lucide.createIcons()` after `SlidePresentation`.
483
484
 
484
485
  ### Common Mistakes
485
486
 
@@ -823,6 +824,31 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
823
824
 
824
825
  Use these components when a page needs repeatable editorial modules inside a larger layout. Components define the block itself, not the page grid around it.
825
826
 
827
+ <!-- @component:box:start -->
828
+ #### Box
829
+
830
+ 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.
831
+
832
+ ```html
833
+ <div class="box">
834
+ <div class="text-panel text-panel--plain">
835
+ <div class="text-panel-body">
836
+ <p class="eyebrow">Evidence</p>
837
+ <h3>One clear idea</h3>
838
+ <p>Short supporting copy or source-bound explanation.</p>
839
+ </div>
840
+ </div>
841
+ </div>
842
+ ```
843
+
844
+ ```css
845
+ .box { height: 100%; min-height: 0; padding: 28px; border: 1px solid var(--line); background: rgba(255,255,255,0.46); display: flex; flex-direction: column; gap: 18px; overflow: hidden; }
846
+ .box--quiet { background: transparent; }
847
+ .box--mist { background: rgba(240,244,247,0.72); }
848
+ .box--dark { background: #0d1a24; --text-primary:#f0f4f7; --text-secondary:rgba(240,244,247,0.72); --text-muted:rgba(240,244,247,0.55); --line:rgba(240,244,247,0.16); }
849
+ ```
850
+ <!-- @component:box:end -->
851
+
826
852
 
827
853
 
828
854
  <!-- @component:text-panel:start -->
@@ -937,6 +963,35 @@ Rules:
937
963
  - **`editorial-list` inside `--dark`.** Add `style="--accent-earth:rgba(240,244,247,0.72)"` on the `<ul>` wrapper so the bullet squares read against the dark background.
938
964
  <!-- @component:text-panel:end -->
939
965
 
966
+ <!-- @component:media:start -->
967
+ #### Media
968
+
969
+ Normal image, screenshot, diagram, logo, or portrait component. Keep important visual information understandable. Do not use `media` for full-bleed covers/dividers/closings; use `hero` for those.
970
+
971
+ ```html
972
+ <figure class="media">
973
+ <div class="media-frame">
974
+ <img src="https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?q=80&w=1200&auto=format&fit=crop" alt="Atmospheric water garden detail">
975
+ </div>
976
+ <figcaption class="media-caption source-note">Optional source or field note</figcaption>
977
+ </figure>
978
+ ```
979
+
980
+ ```css
981
+ .media { height: 100%; min-height: 0; display: flex; flex-direction: column; gap: 12px; }
982
+ .media-frame { position: relative; overflow: hidden; background: transparent; width: 100%; flex: 1; min-height: 0; }
983
+ .media-frame img { width: 100%; height: 100%; display: block; object-fit: cover; }
984
+ .media--contain .media-frame img { object-fit: contain; }
985
+ .media-caption { margin-top: 0; font-size: 11px; line-height: 1.45; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-muted); }
986
+ .media-caption.source, .media-caption.source-note { font-family: "Times New Roman", Times, serif; font-size: 11px; line-height: 1.35; letter-spacing: 0; text-transform: none; }
987
+ ```
988
+
989
+ Rules:
990
+ - Use `media` for screenshots, charts exported as images, diagrams, logos, portraits, and evidence visuals that must stay readable.
991
+ - Use `object-fit: contain` through `media--contain` for screenshots, diagrams, and logos when cropping would remove information.
992
+ - Put `media` inside a `box` when the visual and text support one semantic idea.
993
+ <!-- @component:media:end -->
994
+
940
995
  <!-- @component:stat-card:start -->
941
996
  #### Stat Card
942
997
 
@@ -1010,7 +1065,7 @@ Rules:
1010
1065
  - **Do not over-explain.** If the description starts to become paragraph-length, switch to `text-panel` or pair the stat card with a narrative component in the neighboring slot.
1011
1066
  <!-- @component:stat-card:end -->
1012
1067
 
1013
- <!-- @component:editorial-image-top:start -->
1068
+ <!-- @compat:editorial-image-top:start -->
1014
1069
  #### Editorial Image Top
1015
1070
 
1016
1071
  Image-first editorial module: image on top, text below. Best for highlight grids, product/material stories, and any module where the picture should lead before the reader enters the copy.
@@ -1094,9 +1149,9 @@ Rules:
1094
1149
  - **Image aspect ratio.** Aim for 16:9 or 3:2 crops for the image block. Portrait crops create tall image zones that push text down and unbalance the composition.
1095
1150
  - **Kicker icon size.** Keep Lucide SVG icons at 16–20px. Larger icons shift visual weight from the image to the label zone.
1096
1151
  - **`editorial-list` font-size.** Override to `font-size:13px;gap:10px` inline when used inside a very narrow copy zone — the base `editorial-list` is `17px/gap:14px`, which may be too large for tight columns.
1097
- <!-- @component:editorial-image-top:end -->
1152
+ <!-- @compat:editorial-image-top:end -->
1098
1153
 
1099
- <!-- @component:editorial-text-top:start -->
1154
+ <!-- @compat:editorial-text-top:start -->
1100
1155
  #### Editorial Text Top
1101
1156
 
1102
1157
  Text-first editorial module: text on top, image below. Best for narrative snippets, report-style explanations, or blocks where the image serves as evidence rather than the primary hook.
@@ -1160,9 +1215,9 @@ Rules:
1160
1215
  - **Same height/stretch rule as `editorial-image-top`.** Do not set fixed heights; let parent grid stretch control the column.
1161
1216
  - **When used as a center spine in `highlight-cols`,** this is the one component that may legitimately be taller than its neighbors. That density imbalance is intentional — do not try to equalize it with padding or extra content in the outer columns.
1162
1217
  - **`editorial-list` font-size.** Override to `font-size:13px;gap:10px` inline when used inside a very narrow copy zone — the base `editorial-list` is `17px/gap:14px`, which may be too large for tight columns.
1163
- <!-- @component:editorial-text-top:end -->
1218
+ <!-- @compat:editorial-text-top:end -->
1164
1219
 
1165
- <!-- @component:editorial-text-left:start -->
1220
+ <!-- @compat:editorial-text-left:start -->
1166
1221
  #### Editorial Text Left
1167
1222
 
1168
1223
  Horizontal editorial module: a full-width title band on top, with text on the left and a visual slot on the right below. Best for compact feature rows or any slot where a wide-but-short frame suits a side-by-side composition with a clear heading above.
@@ -1274,7 +1329,7 @@ Rules:
1274
1329
  - **`echart-container` in visual slot.** Set `width:100%;height:100%` on the container and call `echarts.init()` after `SlidePresentation` is instantiated. The `position:relative;overflow:hidden` on `.editorial-text-left-visual` contains the canvas correctly.
1275
1330
  - **`image-title` in visual slot.** The component is self-contained and fills `width:100%;height:100%` automatically. Use `image-title--right` modifier with a bottom-heavy overlay and right-biased blur mask for the most common editorial orientation.
1276
1331
  - **Dark background.** Override CSS variables on `.editorial-text-left` to cascade into both the copy and visual zones: `--text-primary`, `--text-secondary`, `--text-muted`, `--line`, `--line-strong` — all set to white-family values.
1277
- <!-- @component:editorial-text-left:end -->
1332
+ <!-- @compat:editorial-text-left:end -->
1278
1333
 
1279
1334
  <!-- @component:echart-panel:start -->
1280
1335
  #### EChart Panel
@@ -1357,7 +1412,11 @@ Rules:
1357
1412
  - **Chart sizing for `narrative-hero-left-dark`.** The left 7.8fr column is wide. A donut or candlestick chart works best centered with some breathing room. Add `padding: 24px 32px` to `.echart-container` to prevent the chart from touching the column edges.
1358
1413
  <!-- @component:echart-panel:end -->
1359
1414
 
1360
- <!-- @component:flow-horizontal:start -->
1415
+ <!-- @component:steps:start -->
1416
+ #### Steps
1417
+
1418
+ Monet step and phase sequences use the flow-horizontal and flow-vertical implementations. Use `.flow-horizontal` for left-to-right process stages and `.flow-vertical` for top-to-bottom phases.
1419
+
1361
1420
  #### Flow Horizontal
1362
1421
 
1363
1422
  Horizontal step or phase sequence. Use for process stages, numbered definitions, or parallel concepts that should be read left to right. Suitable for 2–5 items.
@@ -1487,9 +1546,9 @@ Rules:
1487
1546
  - **Step copy length directly affects column balance.** One step with a long paragraph will push its column taller than the others and break the horizontal rhythm. Trim all steps to roughly equal length (2–4 lines each).
1488
1547
  - **Number card design.** Each `.flow-number` uses two overlapping squares: a white `::before` base square (with border) and a blue `::after` top square (`--accent-earth`) rotated by `--fn-rot`. Set `data-n="01"` on the element (the `::after` reads it via `content: attr(data-n)`). Vary `--fn-rot` per item (e.g. `-9deg`, `7deg`, `-6deg`, `10deg`) for a hand-placed impression.
1489
1548
  - **Horizontal rule connector.** The `::before` pseudo-element on `.flow-horizontal` draws a full-width line at `top: 18px` (vertical centre of the 36px number box). `.flow-number` sits above it via `z-index: 1`; its `::before` background is set to `var(--bg-page)` to mask the line behind the white square. On dark backgrounds, override `.flow-horizontal .flow-number::before { background: <dark-bg-color>; }` and set `.flow-horizontal::before { background: rgba(240,244,247,0.15); }`.
1490
- <!-- @component:flow-horizontal:end -->
1549
+ <!-- flow-horizontal implementation ends -->
1491
1550
 
1492
- <!-- @component:flow-vertical:start -->
1551
+ <!-- flow-vertical implementation starts -->
1493
1552
  #### Flow Vertical
1494
1553
 
1495
1554
  Vertical step or timeline sequence. Use for chronological phases, execution stages, or progress narratives that should be read top to bottom. Suitable for 2–6 items.
@@ -1587,7 +1646,7 @@ Rules:
1587
1646
  - **Number card design (same as flow-horizontal).** Use `data-n="01"` and `style="--fn-rot:-8deg;"` on each `.flow-number`. Vary the rotation angle per item.
1588
1647
  - **Dark text overrides.** Flow-number `::before` border: `rgba(240,244,247,0.3)`; `::after` background: a darker accent or `rgba(41,128,175,0.85)`. h4: `color:#f0f4f7`; p: `color:rgba(240,244,247,0.7)`. Also override the connecting line: `background:rgba(240,244,247,0.2)`.
1589
1648
  - **Column height constraint.** `flow-vertical` expands naturally with content. In a two-column layout, ensure the opposing column (`text-panel` or `echart-panel`) has enough content to avoid a large height mismatch.
1590
- <!-- @component:flow-vertical:end -->
1649
+ <!-- @component:steps:end -->
1591
1650
 
1592
1651
  <!-- @component:data-table:start -->
1593
1652
  #### Data Table
@@ -1781,7 +1840,11 @@ Rules:
1781
1840
 
1782
1841
 
1783
1842
 
1784
- <!-- @component:image-title:start -->
1843
+ <!-- @component:hero:start -->
1844
+ #### Hero
1845
+
1846
+ Monet hero slides use the image-title implementation for full-bleed cover, closing, atmospheric section divider, or strong visual statement slides.
1847
+
1785
1848
  #### Image Title
1786
1849
 
1787
1850
  Self-contained full-canvas component: a dominant photograph with a directional blur layer, a gradient overlay, and a foreground text stack — all composited inside one element. Use for cover slides, closing slides, atmospheric section dividers, or any full-bleed spread where a single image should dominate the entire canvas.
@@ -1945,7 +2008,7 @@ Rules:
1945
2008
  - **`--right` closing variant.** Mirror the blur mask: use `mask-image:linear-gradient(to right, transparent 0%, transparent 20%, black 100%)`. The right side stays blurred (text zone); the left side of the image stays sharp.
1946
2009
  - **`--center` variant.** Use a radial or symmetric overlay: `radial-gradient(ellipse at center, rgba(5,5,5,0.72) 0%, rgba(5,5,5,0.20) 100%)` or a flat `rgba(5,5,5,0.55)`. Center blur mask: `mask-image:radial-gradient(ellipse at center, black 0%, transparent 80%)`.
1947
2010
  - **Subtitle width on `--right`.** `.image-title-subtitle` inherits `max-width:480px` which is set for left-aligned text. On `--right`, override to match the `.image-title-body` width: `style="max-width:520px;margin-left:auto;"`.
1948
- <!-- @component:image-title:end -->
2011
+ <!-- @component:hero:end -->
1949
2012
 
1950
2013
  <!-- @component:toc:start -->
1951
2014
  #### TOC Panel
@@ -2368,7 +2431,11 @@ Omit `--light` only on slides with a white/light background.
2368
2431
 
2369
2432
  <!-- @component:page-number:end -->
2370
2433
 
2371
- <!-- @component:timeline-journey-horizontal:start -->
2434
+ <!-- @component:roadmap-horizontal:start -->
2435
+ #### Roadmap Horizontal
2436
+
2437
+ Monet horizontal roadmaps use the timeline-journey-horizontal implementation.
2438
+
2372
2439
  #### Timeline Journey Horizontal
2373
2440
 
2374
2441
  A horizontal milestone timeline with a central axis line. Nodes sit on the axis; a dashed vertical stem leads to a tip node, with date, title, and description text alongside. Alternate nodes above and below the axis for rhythm. Suitable for 4–8 milestones across a chronological arc, transformation story, or multi-year programme recap.
@@ -2534,9 +2601,13 @@ Rules:
2534
2601
  - **Adjust stem length**: Change `--tjh-stem-h` to lengthen or shorten the dashed connector.
2535
2602
  - **Dark background overrides**: Set `--line-strong: rgba(240,244,247,0.25)` on `.tjh`, override `.tjh-axis { background }`, set `.tjh-title { color: #f0f4f7 }`, `.tjh-text { color: rgba(240,244,247,0.7) }`. The `--tjh-item-color` accent colours work on dark backgrounds without change.
2536
2603
  - **Fewer nodes**: For 4–5 nodes, widen `--tjh-col` by using a smaller denominator (e.g. `calc(100% / 5)`), and space `left` values accordingly.
2537
- <!-- @component:timeline-journey-horizontal:end -->
2604
+ <!-- @component:roadmap-horizontal:end -->
2605
+
2606
+ <!-- @component:roadmap-vertical:start -->
2607
+ #### Roadmap Vertical
2608
+
2609
+ Monet vertical roadmaps use the timeline-journey-vertical implementation.
2538
2610
 
2539
- <!-- @component:timeline-journey-vertical:start -->
2540
2611
  #### Timeline Journey Vertical
2541
2612
 
2542
2613
  A vertical milestone timeline with a central axis line. Nodes sit on the axis; a horizontal dashed stem leads to a tip dot, with date, title, and description text alongside. Alternate nodes left and right of the axis for rhythm. Suitable for 3–8 milestones across a chronological arc, transformation story, or multi-year programme recap.
@@ -2731,6 +2802,6 @@ Rules:
2731
2802
  - **Dark background overrides**: set on the `.tjv` wrapper — `--line-strong: rgba(240,244,247,0.25)` (axis + stem), `.tjv-title { color: #f0f4f7 }`, `.tjv-text { color: rgba(240,244,247,0.7) }`. The `--tjv-item-color` accent colours work on dark backgrounds without change.
2732
2803
  - **Fewer nodes (3–4)**: increase spacing — use `top` values like `15%, 35%, 55%, 75%` to prevent the timeline from clustering at the top.
2733
2804
  - **More nodes (6–8)**: keep `.tjv-text` to 1-2 lines and increase vertical spacing between nodes if needed. Treat `17px` as the default body size; only use a smaller local override in exceptional dense layouts.
2734
- <!-- @component:timeline-journey-vertical:end -->
2805
+ <!-- @component:roadmap-vertical:end -->
2735
2806
 
2736
2807
  <!-- @design:components:end -->
@@ -233,6 +233,7 @@ new SlidePresentation();
233
233
  - **Stable layout CSS.** Do not rewrite base layout/container CSS unless the structure itself must change. Prefer tokens, typography, component skins, and small motif components.
234
234
  - **Reusable class vocabulary.** New classes must be documented in this DESIGN.md. Avoid many one-off selectors in generated decks.
235
235
  - **SVG is exceptional.** Use decorative SVG only when the user explicitly asks for an illustration/icon-like visual or when design authoring requires a motif.
236
+ - **Icon system is Lucide.** For ordinary UI, semantic, status, category, process, and navigation icons, use Lucide (`data-lucide`). Do not hand-write inline SVG for icons. SVG is allowed only for intentional decorative motifs, illustrations, or design-specific artwork. If any `data-lucide` icon is present, load Lucide via CDN and call `lucide.createIcons()` after `SlidePresentation`.
236
237
  - **Images for photographic references.** Use image treatment rules rather than fake SVG when the reference is photographic, UI, webpage, or product imagery.
237
238
  - **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.
238
239
  - **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.
@@ -443,6 +443,7 @@ These rules are mandatory for Summit.
443
443
  - **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.
444
444
  - **Titles are Title Case.** Do not set `text-transform:uppercase` on `h1`, `h2`, `h3`, or `h4` titles. Uppercase is reserved for eyebrows, captions, metadata labels, short codes, and date/code-like markers.
445
445
  - **Components are transparent by default.** Component primitives should not bring their own paper/background fill. Let `.page`, layout containers, or explicit modifier variants provide background color when needed.
446
+ - **Icon system is Lucide.** For ordinary UI, semantic, status, category, process, and navigation icons, use Lucide (`data-lucide`). Do not hand-write inline SVG for icons. SVG is allowed only for intentional decorative motifs, illustrations, or design-specific artwork. If any `data-lucide` icon is present, load Lucide via CDN and call `lucide.createIcons()` after `SlidePresentation`.
446
447
 
447
448
  ### Common Mistakes
448
449
 
@@ -202,6 +202,7 @@ function buildDesignLayer(designName: string): string {
202
202
  "",
203
203
  "| Section | Fetch with |",
204
204
  "|---|---|",
205
+ "| Design composition and usage rules | `section: \"rules\"` |",
205
206
  "| Layout HTML/CSS details | `layout: \"<name>\"` (see Layout Index above) |",
206
207
  "| Component CSS/HTML details | `component: \"<name>\"` (see Component Index above) |",
207
208
  "| Data Visualization (ECharts) | `section: \"chart-rules\"` |",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyber-dash-tech/revela",
3
- "version": "0.17.3",
3
+ "version": "0.17.4",
4
4
  "description": "OpenCode plugin for trusted narrative artifacts from local sources, research, and evidence",
5
5
  "type": "module",
6
6
  "main": "./index.ts",
package/skill/SKILL.md CHANGED
@@ -193,16 +193,20 @@ If a write produces QA hard errors, fix them before continuing.
193
193
  Before writing or materially changing HTML:
194
194
 
195
195
  1. Read the deck-plan projection's layout and component names.
196
- 2. Call `revela-designs` with `action: "read"` and `layout` set to all required
196
+ 2. Call `revela-designs` with `action: "read"` and `section: "rules"` to fetch
197
+ the active design's current composition and usage rules.
198
+ 3. Call `revela-designs` with `action: "read"` and `layout` set to all required
197
199
  layout names, comma-separated.
198
- 3. Call `revela-designs` with `action: "read"` and `component` set to all
200
+ 4. Call `revela-designs` with `action: "read"` and `component` set to all
199
201
  required component names, comma-separated.
200
- 4. Fetch `section: "chart-rules"` before using ECharts.
201
- 5. Do not update legacy `requiredInputs`; design fetching is an execution step,
202
+ 5. Fetch `section: "chart-rules"` before using ECharts.
203
+ 6. Do not update legacy `requiredInputs`; design fetching is an execution step,
202
204
  not a workflow permission gate.
203
205
 
204
206
  Never generate HTML from memory or prior knowledge of a design. Copy the fetched
205
- HTML/CSS structures closely and adapt content to fit the design vocabulary.
207
+ HTML/CSS structures closely and adapt content to fit the design vocabulary. Do
208
+ not treat the injected design summary as a substitute for the fetched `rules`,
209
+ layout, and component details when generating or materially changing HTML.
206
210
 
207
211
  The active design's complete visual specification is injected below after the
208
212
  `---` separator. It is the sole visual reference for generating slides.
@@ -227,7 +231,8 @@ Required contract:
227
231
  - Do not use 0-based `data-index` as slide identity.
228
232
  - Keep the canvas exactly 1920x1080 and 16:9.
229
233
  - Keep all CSS inline in one `<style>` block and all JS inline in one `<script>`
230
- block, except approved CDNs for fonts, Lucide icons, and ECharts when needed.
234
+ block, except approved CDNs for fonts, ECharts when needed, or libraries
235
+ explicitly required by fetched design/component rules.
231
236
  - Use vanilla JS only. No React, Vue, jQuery, or external application framework.
232
237
  - All JS methods must be fully implemented. No empty stubs and no TODO comments.
233
238
  - Do not add deck-local editing JavaScript, `contenteditable`, `editable` classes,
@@ -338,8 +343,6 @@ instructions, secrets, or unverified claims.
338
343
  - Use semantic HTML where practical.
339
344
  - Full keyboard navigation must work.
340
345
  - `prefers-reduced-motion` must disable transitions/animations.
341
- - Use Lucide icons only when icons are needed; load via CDN and call
342
- `lucide.createIcons()`.
343
346
  - Avoid plain background plus unstyled bullet lists.
344
347
  - Every slide needs one clear message and one dominant visual focal point.
345
348
  - Keep bullet lists short. Prefer semantic boxes, evidence cards, charts, tables,
package/tools/designs.ts CHANGED
@@ -25,7 +25,7 @@ export default tool({
25
25
  "Use action 'activate' to switch to a different design (requires name). " +
26
26
  "Use action 'install' to add a new design from a URL, local path, or github:user/repo shorthand (requires source). " +
27
27
  "Use action 'remove' to uninstall a design (requires name). " +
28
- "Use action 'read' to fetch on-demand design content: pass layout (comma-separated names) to get full HTML/CSS for specific layouts, pass component (comma-separated names) to get full CSS/HTML for specific components, or section ('chart-rules' | 'foundation' | 'layouts' | 'components') to get an entire section. Pass neither to get the Component Index table. " +
28
+ "Use action 'read' to fetch on-demand design content: pass layout (comma-separated names) to get full HTML/CSS for specific layouts, pass component (comma-separated names) to get full CSS/HTML for specific components, or section ('rules' | 'chart-rules' | 'foundation' | 'layouts' | 'components') to get an entire section. Pass neither to get the Component Index table. " +
29
29
  "After activating a new design, the system prompt is automatically rebuilt.",
30
30
  args: {
31
31
  action: tool.schema