yumiamd 0.1.16 → 0.1.17

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
@@ -16,6 +16,9 @@ You can run YumiaMD immediately without installing anything via `npx`:
16
16
  # Initialize a starter presentation
17
17
  npx yumiamd init my-deck
18
18
 
19
+ # Launch instant dev server with live-reload
20
+ npx yumiamd dev presentation.yumia.md --open
21
+
19
22
  # Compile presentation directly to an editable PowerPoint (.pptx)
20
23
  npx yumiamd build presentation.yumia.md --out presentation.pptx
21
24
  ```
@@ -64,6 +67,9 @@ yumia build presentation.yumia.md --format pdf --out dist/presentation.pdf
64
67
  # Compile to standalone interactive HTML5 presentation deck (.html)
65
68
  yumia build presentation.yumia.md --format html --out dist/presentation.html
66
69
 
70
+ # Deploy presentation deck (static, GitHub Pages, or Vercel)
71
+ yumia deploy presentation.yumia.md --provider gh-pages --out public
72
+
67
73
  # Watch presentation file and recompile automatically on save
68
74
  yumia watch presentation.yumia.md --format pdf
69
75
 
@@ -96,6 +102,9 @@ author: Biagio Scaglia
96
102
 
97
103
  Deterministic compilation from Markdown directly to native PowerPoint slides.
98
104
 
105
+ :::badge text="v0.1.15" variant="primary" :::
106
+ :::badge text="Multi-Target" variant="success" :::
107
+
99
108
  :::notes
100
109
  Opening slide introducing the core architectural vision.
101
110
  :::
@@ -128,14 +137,26 @@ Opening slide introducing the core architectural vision.
128
137
 
129
138
  ---
130
139
 
131
- # Feature Comparison
140
+ # Native Charts & Data Visuals
141
+
142
+ :::chart type="bar" title="Execution Speed" labels="Parser, Layout, PDF, PPTX" data="1200, 850, 430, 680"
143
+
144
+ ---
145
+
146
+ # Roadmap Timeline
147
+
148
+ :::timeline layout="horizontal"
149
+
150
+ - [Phase 1] AST & Compiler Core
151
+ - [Phase 2] Multi-Format Renderers
152
+ - [Phase 3] Rich Directives & Charts
153
+ - [Phase 4] Cloud Deployments
154
+ :::
155
+
156
+ :::step
132
157
 
133
- | Feature | YumiaMD | Legacy HTML Deck Tools |
134
- | :----------------------- | :------------------------------- | :----------------------------------- |
135
- | **Output Type** | Native OpenXML Shapes & Text | Flat rasterized images / screenshots |
136
- | **Full Editability** | ✅ 100% Editable in PowerPoint | ❌ Read-only image slides |
137
- | **Deterministic Layout** | ✅ Pixel-exact bounding boxes | ❌ Browser rendering variance |
138
- | **AI / Agent Tooling** | ✅ Machine-readable schema & CLI | ❌ Complex DOM scraping |
158
+ - 🚀 Seamless deployment via `yumia deploy`
159
+ :::
139
160
  ```
140
161
 
141
162
  ---
@@ -171,8 +192,10 @@ const schema = compiler.getSchema();
171
192
 
172
193
  ## ✨ Key Features
173
194
 
174
- - 🎯 **Native Object Principle**: Slides compiled to PowerPoint are **NOT** rasterized screenshot images. Headings, bullet points, cards, tables, and speaker notes are generated as **100% native vector PowerPoint shapes, tables & textboxes** that you can click, re-format, and edit in Microsoft PowerPoint or Google Slides.
175
- - 📊 **Native Tables & Multicolumn**: Full support for Markdown tables and semantic responsive multi-column layouts with customizable ratio splits (`ratios="50:50"` or `"30:70"`).
195
+ - 🎯 **Native Object Principle**: Slides compiled to PowerPoint are **NOT** rasterized screenshot images. Headings, bullet points, cards, tables, charts, badges, and speaker notes are generated as **100% native vector PowerPoint shapes, tables & textboxes** that you can click, re-format, and edit in Microsoft PowerPoint or Google Slides.
196
+ - 📊 **Native Charts & Diagrams**: Full support for `:::chart` (bar, line, pie, doughnut) and `:::mermaid` diagrams across HTML, PDF, and PowerPoint.
197
+ - ⏳ **Timelines, Compare & Steps**: Rich layout directives including `:::timeline`, `:::compare`, and click-to-reveal `:::step` animations.
198
+ - 🚀 **One-Command Cloud Deploy**: Instantly deploy decks to GitHub Pages, Vercel, or static web servers with `yumia deploy`.
176
199
  - 📐 **Deterministic Layout Engine**: Exact coordinate calculations for stack, columns, cards, and automatic overflow detection.
177
200
  - 🎨 **Semantic Design Tokens**: Built-in themes with typography scales, color palettes, and contrast-safe themes.
178
201
  - 🤖 **AI-Friendly Format**: Clean Markdown syntax designed for LLM prompts and agentic workflows, complete with `yumia schema` and `--json` CLI diagnostics.
package/dist/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "./chunk-UPUEFJLX.js";
4
+ } from "./chunk-IAEXC5SG.js";
5
5
 
6
6
  // src/bin.ts
7
7
  var result = await runCli(process.argv);
@@ -475,7 +475,9 @@ var DefaultYumiaParser = class {
475
475
  let closed = false;
476
476
  while (i < lines.length) {
477
477
  const innerLine = lines[i]?.trim() ?? "";
478
- const isSingleLine = innerLine.startsWith(":::metric") || innerLine.startsWith(":::layout") || innerLine.startsWith(":::badge") && (innerLine.includes("text=") || innerLine.includes("variant=")) || innerLine.startsWith(":::chart") && innerLine.includes("data=");
478
+ const isInlineClosed = innerLine.startsWith(":::") && innerLine.endsWith(":::") && innerLine.length > 5;
479
+ const isSeparator = innerLine === ":::vs" || innerLine.startsWith(":::vs ");
480
+ const isSingleLine = isInlineClosed || isSeparator || innerLine.startsWith(":::metric") || innerLine.startsWith(":::layout") || innerLine.startsWith(":::badge") && (innerLine.includes("text=") || innerLine.includes("variant=")) || innerLine.startsWith(":::chart") && innerLine.includes("data=");
479
481
  if (innerLine.startsWith(":::") && innerLine.length > 3 && !isSingleLine) {
480
482
  nestedCount++;
481
483
  } else if (innerLine === ":::") {
@@ -695,7 +697,9 @@ var DefaultYumiaParser = class {
695
697
  let nestedCount = 1;
696
698
  while (i < lines.length) {
697
699
  const innerLine = lines[i]?.trim() ?? "";
698
- const isSingleLine = innerLine.startsWith(":::metric") || innerLine.startsWith(":::layout");
700
+ const isInlineClosed = innerLine.startsWith(":::") && innerLine.endsWith(":::") && innerLine.length > 5;
701
+ const isSeparator = innerLine === ":::vs" || innerLine.startsWith(":::vs ");
702
+ const isSingleLine = isInlineClosed || isSeparator || innerLine.startsWith(":::metric") || innerLine.startsWith(":::layout") || innerLine.startsWith(":::badge") && (innerLine.includes("text=") || innerLine.includes("variant=")) || innerLine.startsWith(":::chart") && innerLine.includes("data=");
699
703
  if (innerLine.startsWith(":::") && innerLine.length > 3 && !isSingleLine) {
700
704
  nestedCount++;
701
705
  } else if (innerLine === ":::") {
@@ -2919,10 +2923,42 @@ var HtmlRenderer = class {
2919
2923
  <title>${this.escapeHtml(title)}</title>
2920
2924
  <link rel="preconnect" href="https://fonts.googleapis.com">
2921
2925
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
2922
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;600&family=Outfit:wght@600;700;800&display=swap" rel="stylesheet">
2923
2926
  <script type="module">
2924
2927
  import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
2925
- mermaid.initialize({ startOnLoad: true, theme: 'dark', securityLevel: 'loose' });
2928
+ try {
2929
+ mermaid.initialize({
2930
+ startOnLoad: false,
2931
+ theme: 'dark',
2932
+ securityLevel: 'loose',
2933
+ themeVariables: {
2934
+ darkMode: true,
2935
+ background: '${theme.colors.background}',
2936
+ primaryColor: '${theme.colors.primary}',
2937
+ primaryTextColor: '#ffffff',
2938
+ primaryBorderColor: '${theme.colors.primary}',
2939
+ lineColor: '${theme.colors.accent || theme.colors.primary}',
2940
+ secondaryColor: '${theme.colors.surface}',
2941
+ tertiaryColor: '${theme.colors.surface}'
2942
+ }
2943
+ });
2944
+ window.mermaid = mermaid;
2945
+ window.renderMermaidInSlide = async function(slideEl) {
2946
+ if (!slideEl || !window.mermaid) return;
2947
+ const nodes = Array.from(slideEl.querySelectorAll('.mermaid:not([data-processed="true"])'));
2948
+ if (nodes.length > 0) {
2949
+ try {
2950
+ await window.mermaid.run({ nodes: nodes });
2951
+ } catch (e) {
2952
+ console.warn('Mermaid render notice:', e);
2953
+ }
2954
+ }
2955
+ };
2956
+ // Auto-render visible slide if present
2957
+ const cur = document.querySelector('.yumia-slide-wrapper.active');
2958
+ if (cur) window.renderMermaidInSlide(cur);
2959
+ } catch (err) {
2960
+ console.warn('Mermaid load notice:', err);
2961
+ }
2926
2962
  </script>
2927
2963
  <style>
2928
2964
  :root {
@@ -3449,14 +3485,36 @@ var HtmlRenderer = class {
3449
3485
  /* Mermaid Container */
3450
3486
  .mermaid-container {
3451
3487
  background: rgba(10, 10, 18, 0.6);
3452
- border: 1px solid var(--yumia-border);
3488
+ border: 1.5px solid var(--yumia-border);
3453
3489
  border-radius: var(--yumia-radius-card);
3454
- padding: 1rem;
3490
+ padding: 1.5rem;
3455
3491
  margin: 1rem 0;
3456
3492
  display: flex;
3457
3493
  justify-content: center;
3494
+ align-items: center;
3458
3495
  overflow: auto;
3459
3496
  width: 100%;
3497
+ min-height: 240px;
3498
+ }
3499
+
3500
+ .mermaid-container pre.mermaid,
3501
+ .mermaid-container .mermaid {
3502
+ background: transparent !important;
3503
+ border: none !important;
3504
+ padding: 0 !important;
3505
+ margin: 0 !important;
3506
+ font-size: 1rem;
3507
+ color: #fff;
3508
+ display: flex;
3509
+ justify-content: center;
3510
+ align-items: center;
3511
+ width: 100%;
3512
+ }
3513
+
3514
+ .mermaid-container svg {
3515
+ max-width: 100%;
3516
+ height: auto;
3517
+ max-height: 420px;
3460
3518
  }
3461
3519
 
3462
3520
  /* Progressive Reveal (Step Builds) */
@@ -3783,6 +3841,12 @@ var HtmlRenderer = class {
3783
3841
  if (broadcast && syncChannel) {
3784
3842
  syncChannel.postMessage({ index: currentIdx });
3785
3843
  }
3844
+
3845
+ setTimeout(() => {
3846
+ if (window.renderMermaidInSlide && slides[currentIdx]) {
3847
+ window.renderMermaidInSlide(slides[currentIdx]);
3848
+ }
3849
+ }, 50);
3786
3850
  }
3787
3851
 
3788
3852
  function openSpeakerWindow() {
@@ -3887,6 +3951,13 @@ var HtmlRenderer = class {
3887
3951
  const rawNotes = slides[currentIdx].getAttribute('data-notes');
3888
3952
  notesBox.innerHTML = rawNotes ? rawNotes : '<em style="color:var(--yumia-muted);">No notes provided for this slide.</em>';
3889
3953
  }
3954
+
3955
+ setTimeout(() => {
3956
+ if (window.renderMermaidInSlide) {
3957
+ if (curBox) window.renderMermaidInSlide(curBox);
3958
+ if (nextBox) window.renderMermaidInSlide(nextBox);
3959
+ }
3960
+ }, 50);
3890
3961
  }
3891
3962
 
3892
3963
  window.addEventListener('keydown', (e) => {
@@ -4753,7 +4824,7 @@ function startDevServer(filePath, options = {}) {
4753
4824
  // src/cli.ts
4754
4825
  import { mkdirSync, readFileSync as readFileSync2, watch as fsWatch, writeFileSync } from "fs";
4755
4826
  import { basename, dirname, extname, join, resolve as resolve2 } from "path";
4756
- var VERSION = "0.1.16";
4827
+ var VERSION = "0.1.17";
4757
4828
  function printHelp() {
4758
4829
  return `
4759
4830
  YumiaMD \u2014 Markdown-based presentation compiler (v${VERSION})
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export * from '@yumiamd/renderer-pptx';
9
9
  export * from '@yumiamd/renderer-html';
10
10
  export * from '@yumiamd/renderer-pdf';
11
11
 
12
- declare const VERSION = "0.1.16";
12
+ declare const VERSION = "0.1.17";
13
13
  declare function printHelp(): string;
14
14
  declare function runCli(argv: string[]): Promise<{
15
15
  exitCode: number;
package/dist/index.js CHANGED
@@ -44,7 +44,7 @@ import {
44
44
  runCli,
45
45
  startDevServer,
46
46
  terminalTheme
47
- } from "./chunk-UPUEFJLX.js";
47
+ } from "./chunk-IAEXC5SG.js";
48
48
  export {
49
49
  DEFAULT_VIEWPORT,
50
50
  DefaultLayoutEngine,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yumiamd",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "description": "Command line interface and compiler for YumiaMD presentations",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -21,15 +21,15 @@
21
21
  },
22
22
  "devDependencies": {
23
23
  "tsup": "^8.5.1",
24
- "@yumiamd/core": "0.1.16",
25
- "@yumiamd/renderer": "0.1.16",
26
- "@yumiamd/ast": "0.1.16",
27
- "@yumiamd/layout": "0.1.16",
28
- "@yumiamd/parser": "0.1.16",
29
- "@yumiamd/renderer-html": "0.1.16",
30
- "@yumiamd/renderer-pptx": "0.1.16",
31
- "@yumiamd/theme": "0.1.16",
32
- "@yumiamd/renderer-pdf": "0.1.16"
24
+ "@yumiamd/ast": "0.1.17",
25
+ "@yumiamd/core": "0.1.17",
26
+ "@yumiamd/renderer": "0.1.17",
27
+ "@yumiamd/parser": "0.1.17",
28
+ "@yumiamd/renderer-html": "0.1.17",
29
+ "@yumiamd/theme": "0.1.17",
30
+ "@yumiamd/layout": "0.1.17",
31
+ "@yumiamd/renderer-pptx": "0.1.17",
32
+ "@yumiamd/renderer-pdf": "0.1.17"
33
33
  },
34
34
  "keywords": [
35
35
  "yumia",