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 +32 -9
- package/dist/bin.js +1 -1
- package/dist/{chunk-UPUEFJLX.js → chunk-IAEXC5SG.js} +78 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +10 -10
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
|
-
#
|
|
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
|
-
|
|
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
|
|
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
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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:
|
|
3488
|
+
border: 1.5px solid var(--yumia-border);
|
|
3453
3489
|
border-radius: var(--yumia-radius-card);
|
|
3454
|
-
padding:
|
|
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.
|
|
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.
|
|
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yumiamd",
|
|
3
|
-
"version": "0.1.
|
|
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/
|
|
25
|
-
"@yumiamd/
|
|
26
|
-
"@yumiamd/
|
|
27
|
-
"@yumiamd/
|
|
28
|
-
"@yumiamd/
|
|
29
|
-
"@yumiamd/
|
|
30
|
-
"@yumiamd/
|
|
31
|
-
"@yumiamd/
|
|
32
|
-
"@yumiamd/renderer-pdf": "0.1.
|
|
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",
|