@aivorynet/slaide 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +201 -0
  3. package/README.md +87 -0
  4. package/bin/slaide.js +25 -0
  5. package/dist/assets.d.ts +10 -0
  6. package/dist/assets.js +54 -0
  7. package/dist/assets.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +433 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/compare/index.d.ts +24 -0
  12. package/dist/compare/index.js +246 -0
  13. package/dist/compare/index.js.map +1 -0
  14. package/dist/compare/ssim.d.ts +2 -0
  15. package/dist/compare/ssim.js +46 -0
  16. package/dist/compare/ssim.js.map +1 -0
  17. package/dist/compiler/chrome.d.ts +7 -0
  18. package/dist/compiler/chrome.js +94 -0
  19. package/dist/compiler/chrome.js.map +1 -0
  20. package/dist/compiler/compile.d.ts +2 -0
  21. package/dist/compiler/compile.js +432 -0
  22. package/dist/compiler/compile.js.map +1 -0
  23. package/dist/compiler/markdown.d.ts +26 -0
  24. package/dist/compiler/markdown.js +439 -0
  25. package/dist/compiler/markdown.js.map +1 -0
  26. package/dist/compiler/tokens.d.ts +13 -0
  27. package/dist/compiler/tokens.js +127 -0
  28. package/dist/compiler/tokens.js.map +1 -0
  29. package/dist/container.d.ts +47 -0
  30. package/dist/container.js +309 -0
  31. package/dist/container.js.map +1 -0
  32. package/dist/engine-entry.d.ts +1 -0
  33. package/dist/engine-entry.js +71 -0
  34. package/dist/engine-entry.js.map +1 -0
  35. package/dist/export-keynote/keynote.d.ts +10 -0
  36. package/dist/export-keynote/keynote.js +58 -0
  37. package/dist/export-keynote/keynote.js.map +1 -0
  38. package/dist/export-pptx/embed-fonts.d.ts +5 -0
  39. package/dist/export-pptx/embed-fonts.js +159 -0
  40. package/dist/export-pptx/embed-fonts.js.map +1 -0
  41. package/dist/export-pptx/inject-anim.d.ts +28 -0
  42. package/dist/export-pptx/inject-anim.js +150 -0
  43. package/dist/export-pptx/inject-anim.js.map +1 -0
  44. package/dist/export-pptx/pptx.d.ts +10 -0
  45. package/dist/export-pptx/pptx.js +425 -0
  46. package/dist/export-pptx/pptx.js.map +1 -0
  47. package/dist/export-pptx/transitions.d.ts +16 -0
  48. package/dist/export-pptx/transitions.js +82 -0
  49. package/dist/export-pptx/transitions.js.map +1 -0
  50. package/dist/import/emit.d.ts +5 -0
  51. package/dist/import/emit.js +274 -0
  52. package/dist/import/emit.js.map +1 -0
  53. package/dist/import/index.d.ts +21 -0
  54. package/dist/import/index.js +192 -0
  55. package/dist/import/index.js.map +1 -0
  56. package/dist/import/pptx.d.ts +117 -0
  57. package/dist/import/pptx.js +1043 -0
  58. package/dist/import/pptx.js.map +1 -0
  59. package/dist/import/raster-com.d.ts +27 -0
  60. package/dist/import/raster-com.js +113 -0
  61. package/dist/import/raster-com.js.map +1 -0
  62. package/dist/import/raster-extension.d.ts +35 -0
  63. package/dist/import/raster-extension.js +27 -0
  64. package/dist/import/raster-extension.js.map +1 -0
  65. package/dist/index.d.ts +63 -0
  66. package/dist/index.js +174 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/install/detect.d.ts +17 -0
  69. package/dist/install/detect.js +82 -0
  70. package/dist/install/detect.js.map +1 -0
  71. package/dist/install/index.d.ts +20 -0
  72. package/dist/install/index.js +126 -0
  73. package/dist/install/index.js.map +1 -0
  74. package/dist/install/registry.d.ts +33 -0
  75. package/dist/install/registry.js +169 -0
  76. package/dist/install/registry.js.map +1 -0
  77. package/dist/install/skills.d.ts +17 -0
  78. package/dist/install/skills.js +72 -0
  79. package/dist/install/skills.js.map +1 -0
  80. package/dist/master-io.d.ts +7 -0
  81. package/dist/master-io.js +55 -0
  82. package/dist/master-io.js.map +1 -0
  83. package/dist/mcp/server.d.ts +3 -0
  84. package/dist/mcp/server.js +114 -0
  85. package/dist/mcp/server.js.map +1 -0
  86. package/dist/optimize/export-optimize.d.ts +21 -0
  87. package/dist/optimize/export-optimize.js +167 -0
  88. package/dist/optimize/export-optimize.js.map +1 -0
  89. package/dist/parser/frontmatter.d.ts +8 -0
  90. package/dist/parser/frontmatter.js +45 -0
  91. package/dist/parser/frontmatter.js.map +1 -0
  92. package/dist/parser/parse.d.ts +2 -0
  93. package/dist/parser/parse.js +184 -0
  94. package/dist/parser/parse.js.map +1 -0
  95. package/dist/render/anim.d.ts +50 -0
  96. package/dist/render/anim.js +213 -0
  97. package/dist/render/anim.js.map +1 -0
  98. package/dist/render/charts.d.ts +3 -0
  99. package/dist/render/charts.js +171 -0
  100. package/dist/render/charts.js.map +1 -0
  101. package/dist/render/css.d.ts +3 -0
  102. package/dist/render/css.js +183 -0
  103. package/dist/render/css.js.map +1 -0
  104. package/dist/render/echarts-lib.generated.d.ts +1 -0
  105. package/dist/render/echarts-lib.generated.js +7 -0
  106. package/dist/render/echarts-lib.generated.js.map +1 -0
  107. package/dist/render/html.d.ts +5 -0
  108. package/dist/render/html.js +186 -0
  109. package/dist/render/html.js.map +1 -0
  110. package/dist/render/inject.d.ts +12 -0
  111. package/dist/render/inject.js +19 -0
  112. package/dist/render/inject.js.map +1 -0
  113. package/dist/render/mermaid-lib.generated.d.ts +1 -0
  114. package/dist/render/mermaid-lib.generated.js +7 -0
  115. package/dist/render/mermaid-lib.generated.js.map +1 -0
  116. package/dist/render/runtime.d.ts +1 -0
  117. package/dist/render/runtime.js +393 -0
  118. package/dist/render/runtime.js.map +1 -0
  119. package/dist/render-pdf/pdf.d.ts +9 -0
  120. package/dist/render-pdf/pdf.js +53 -0
  121. package/dist/render-pdf/pdf.js.map +1 -0
  122. package/dist/render-png/montage.d.ts +14 -0
  123. package/dist/render-png/montage.js +75 -0
  124. package/dist/render-png/montage.js.map +1 -0
  125. package/dist/render-png/shoot.d.ts +25 -0
  126. package/dist/render-png/shoot.js +79 -0
  127. package/dist/render-png/shoot.js.map +1 -0
  128. package/dist/scaffold.d.ts +9 -0
  129. package/dist/scaffold.js +36 -0
  130. package/dist/scaffold.js.map +1 -0
  131. package/dist/types.d.ts +212 -0
  132. package/dist/types.js +7 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/util.d.ts +6 -0
  135. package/dist/util.js +28 -0
  136. package/dist/util.js.map +1 -0
  137. package/package.json +66 -0
  138. package/skills/slaide/SKILL.md +64 -0
  139. package/skills/slaide/agents/openai.yaml +12 -0
  140. package/skills/slaide/examples/branded-deck.slaide +198 -0
  141. package/skills/slaide/examples/branded-theme.slaide.yaml +187 -0
  142. package/skills/slaide/examples/sample.slaide +98 -0
  143. package/skills/slaide/reference.md +177 -0
  144. package/skills/slaide/themes.md +171 -0
  145. package/themes/aurora.slaide.yaml +136 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echarts-lib.generated.js","sourceRoot":"","sources":["../../src/render/echarts-lib.generated.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,mEAAmE;AACnE,wDAAwD;AACxD,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GACzB,8w8zCAA8w8zC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DeckIR } from '../types.js';
2
+ export interface RenderOptions {
3
+ mode?: 'web' | 'print';
4
+ }
5
+ export declare function renderHtml(ir: DeckIR, opts?: RenderOptions): string;
@@ -0,0 +1,186 @@
1
+ import { BASE_CSS, tokenCss } from './css.js';
2
+ import { RUNTIME_JS } from './runtime.js';
3
+ import { CHARTS_BOOT_JS, MERMAID_LIB_B64, ECHART_LIB_B64 } from './charts.js';
4
+ import { extraHeadCss, extraBodyScript } from './inject.js';
5
+ import { escapeHtml as esc, serializeStyle } from '../util.js';
6
+ function backgroundCss(bg) {
7
+ if (!bg)
8
+ return '';
9
+ if (bg.type === 'solid')
10
+ return `background:${bg.color};`;
11
+ if (bg.type === 'gradient') {
12
+ const angle = bg.angle ?? 135;
13
+ return `background:linear-gradient(${angle}deg, ${bg.stops.join(', ')});`;
14
+ }
15
+ if (bg.type === 'image') {
16
+ const fit = bg.fit ?? 'cover';
17
+ const dim = bg.dim ? `background-color:rgba(0,0,0,${bg.dim});background-blend-mode:multiply;` : '';
18
+ return `background-image:url('${bg.src}');background-size:${fit};background-position:center;${dim}`;
19
+ }
20
+ return '';
21
+ }
22
+ function styleAttr(style) {
23
+ const s = serializeStyle(style);
24
+ return s ? `;${s}` : '';
25
+ }
26
+ function renderLayers(slide, shown) {
27
+ const bg = `<div class="sl-layer-bg" style="${backgroundCss(slide.background)}"></div>`;
28
+ const align = slide.grid.align;
29
+ const alignItems = align === 'center' ? 'center' : 'stretch';
30
+ const contentStyle = `grid-template-areas:${slide.grid.areas};` +
31
+ `grid-template-rows:${slide.grid.rows};` +
32
+ `grid-template-columns:${slide.grid.cols};` +
33
+ `padding:${slide.grid.padding};gap:${slide.grid.gap};align-content:${align};align-items:${alignItems};`;
34
+ // The `free` region is a full-slide absolute layer for placed shapes/boxes; it
35
+ // lives outside the content grid (between content and chrome).
36
+ const freeRegion = slide.regions.find((r) => r.name === 'free');
37
+ const regions = slide.regions
38
+ .filter((r) => r.name !== 'free')
39
+ .map((r) => `<div class="sl-region sl-slot-${r.slotType}" data-region="${esc(r.name)}" data-source-region="${esc(r.source)}" style="grid-area:${r.name}${styleAttr(r.style)}">${r.html}</div>`)
40
+ .join('\n');
41
+ const content = `<div class="sl-layer-content" style="${contentStyle}">${regions}</div>`;
42
+ const free = freeRegion ? `<div class="sl-region sl-layer-free" data-region="free">${freeRegion.html}</div>` : '';
43
+ const chrome = renderChrome(slide.chrome);
44
+ // In print/shown mode, pre-mark builds as shown.
45
+ const body = bg + content + free + chrome;
46
+ return shown ? body.replace(/class="([^"]*\bsl-build\b[^"]*)"/g, 'class="$1 sl-shown"') : body;
47
+ }
48
+ function band(b, kind) {
49
+ if (!b)
50
+ return '';
51
+ return (`<div class="sl-${kind}">` +
52
+ `<div class="sl-band-l">${b.left}</div>` +
53
+ `<div class="sl-band-c">${b.center}</div>` +
54
+ `<div class="sl-band-r">${b.right}</div>` +
55
+ `</div>`);
56
+ }
57
+ function renderChrome(chrome) {
58
+ if (!chrome)
59
+ return '';
60
+ const logo = chrome.logo ? `<div class="sl-logo sl-logo-${chrome.logoPos}">${chrome.logo}</div>` : '';
61
+ return `<div class="sl-layer-chrome">${logo}${band(chrome.header, 'header')}${band(chrome.footer, 'footer')}</div>`;
62
+ }
63
+ function renderSlideWeb(slide) {
64
+ const morph = slide.morph ? ` data-morph-slide="${esc(slide.morph)}"` : '';
65
+ // Master-defined names, surfaced for the editor's slide-properties panel (harmless otherwise).
66
+ const dataBg = slide.bgName ? ` data-bg="${esc(slide.bgName)}"` : '';
67
+ const dataVar = slide.variantName ? ` data-variant="${esc(slide.variantName)}"` : '';
68
+ let body = renderLayers(slide, false);
69
+ // The first slide is on screen at first paint — load its images eagerly so it
70
+ // isn't blank while offscreen slides defer (see markdown.ts loading="lazy").
71
+ if (slide.index === 0)
72
+ body = body.replace(/loading="lazy"/g, 'loading="eager"');
73
+ return (`<section class="sl-slide" data-index="${slide.index}" data-transition="${esc(slide.transition)}" ` +
74
+ `data-layout="${esc(slide.layout)}"${dataBg}${dataVar} ` +
75
+ `data-builds="${slide.buildCount}"${morph} style="${cssVars(slide.vars)}">` +
76
+ body +
77
+ `</section>`);
78
+ }
79
+ function renderSlidePrint(slide) {
80
+ return `<div class="sl-page sl-slide" style="${cssVars(slide.vars)}">${renderLayers(slide, true)}</div>`;
81
+ }
82
+ function cssVars(vars) {
83
+ return serializeStyle(vars);
84
+ }
85
+ function head(ir, extraCss) {
86
+ const title = ir.meta.title ? esc(ir.meta.title) : 'slaide';
87
+ const fonts = ir.fontImports.map((u) => `<link rel="stylesheet" href="${u}">`).join('\n');
88
+ return `<!doctype html>
89
+ <html lang="en">
90
+ <head>
91
+ <meta charset="utf-8">
92
+ <meta name="viewport" content="width=device-width, initial-scale=1">
93
+ <!-- The deck manages its own light/dark colours per slide. Declaring color-scheme opts
94
+ out of Chromium "auto dark mode", which otherwise darkens light text in embedded
95
+ webviews (e.g. the WebView2 native viewer) and forced-colors environments. -->
96
+ <meta name="color-scheme" content="light dark">
97
+ <title>${title}</title>
98
+ <link rel="preconnect" href="https://fonts.googleapis.com">
99
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
100
+ ${fonts}
101
+ <style>
102
+ :root{color-scheme:light dark;}
103
+ ${tokenCss(ir)}
104
+ ${BASE_CSS}
105
+ ${extraCss}
106
+ </style>
107
+ </head>`;
108
+ }
109
+ const PRINT_CSS = (w, h) => `
110
+ @page{size:${w}px ${h}px;margin:0;}
111
+ html,body{background:#fff;overflow:visible;height:auto;}
112
+ .sl-print-root{display:block;}
113
+ .sl-page{position:relative;width:${w}px;height:${h}px;overflow:hidden;break-after:page;page-break-after:always;}
114
+ .sl-page:last-child{break-after:auto;}
115
+ .sl-slide.sl-page{visibility:visible;opacity:1;}
116
+ .sl-layer-content{position:absolute;}
117
+ `;
118
+ // Inline the chart engines + lazy boot loader — but ONLY the engine(s) the deck actually
119
+ // uses, and only if it has charts at all. The bundles ride in inert `text/plain` tags
120
+ // (not parsed on load); the boot loader decodes + evals one the first time a chart of
121
+ // that kind renders. The boot script must precede RUNTIME_JS so its slaide:change
122
+ // listener is attached before the runtime fires its first navigation event.
123
+ function chartBlock(renderedHtml) {
124
+ const hasMermaid = renderedHtml.includes('sl-mermaid');
125
+ const hasEchart = renderedHtml.includes('sl-echart');
126
+ if (!hasMermaid && !hasEchart)
127
+ return '';
128
+ const libs = (hasMermaid ? `<script type="text/plain" id="sl-mermaid-lib">${MERMAID_LIB_B64}</script>\n` : '') +
129
+ (hasEchart ? `<script type="text/plain" id="sl-echart-lib">${ECHART_LIB_B64}</script>\n` : '');
130
+ return `${libs}<script>${CHARTS_BOOT_JS}</script>\n`;
131
+ }
132
+ export function renderHtml(ir, opts = {}) {
133
+ const mode = opts.mode ?? 'web';
134
+ const { width: w, height: h } = ir.canvas;
135
+ if (mode === 'print') {
136
+ const pages = ir.slides.map(renderSlidePrint).join('\n');
137
+ return `${head(ir, PRINT_CSS(w, h))}
138
+ <body class="sl-print">
139
+ <div class="sl-print-root">
140
+ ${pages}
141
+ </div>
142
+ ${chartBlock(pages)}</body>
143
+ </html>`;
144
+ }
145
+ const slides = ir.slides.map(renderSlideWeb).join('\n');
146
+ const extraCss = (ir.animCss ? ir.animCss : '') + extraHeadCss(ir);
147
+ const notes = JSON.stringify(ir.slides.map((s) => (s.notes ? mdToInline(s.notes) : null)));
148
+ // The position indicator (progress bar + counter chip) is gated by the master/headmatter
149
+ // `ui.progress` toggle; the floating counter is additionally suppressed when a themed
150
+ // footer already shows page numbers.
151
+ const hasFooter = ir.slides.some((s) => s.chrome?.footer);
152
+ const progressEl = ir.ui.progress ? '<div class="sl-progress"></div>' : '';
153
+ const counter = ir.ui.progress && !hasFooter ? '<div class="sl-counter"></div>' : '';
154
+ // A registered host extension may append a trailing script; empty by default.
155
+ const hostScript = extraBodyScript(ir);
156
+ const extScriptTag = hostScript ? `\n<script>${hostScript}</script>` : '';
157
+ return `${head(ir, extraCss)}
158
+ <body>
159
+ <div class="sl-viewport">
160
+ <div class="sl-stage" data-w="${w}" data-h="${h}">
161
+ ${slides}
162
+ </div>
163
+ </div>
164
+ ${progressEl}
165
+ ${counter}
166
+ <button class="sl-present-toggle" title="Present (fullscreen)" aria-label="Present">⤢</button>
167
+ <div class="sl-notes"></div>
168
+ <div class="sl-help"><div>
169
+ <strong>slaide</strong><br>
170
+ <kbd>→</kbd>/<kbd>Space</kbd> next &nbsp; <kbd>←</kbd> back &nbsp; <kbd>Home</kbd>/<kbd>End</kbd> jump<br>
171
+ <kbd>n</kbd> notes &nbsp; <kbd>f</kbd> fullscreen &nbsp; <kbd>?</kbd> help
172
+ </div></div>
173
+ <script>window.__SLAIDE_NOTES__=${notes};</script>
174
+ ${chartBlock(slides)}<script>${RUNTIME_JS}</script>${extScriptTag}
175
+ </body>
176
+ </html>`;
177
+ }
178
+ // Lightweight inline markdown for notes (bold/italic/code/linebreaks).
179
+ function mdToInline(s) {
180
+ return esc(s)
181
+ .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
182
+ .replace(/\*(.+?)\*/g, '<em>$1</em>')
183
+ .replace(/`(.+?)`/g, '<code>$1</code>')
184
+ .replace(/\n/g, '<br>');
185
+ }
186
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DeckIR } from '../types.js';
2
+ export type RenderExtension = (ir: DeckIR) => string;
3
+ /** Register host-provided render extensions. Call once at process start, before
4
+ * rendering. Re-registering replaces the previous extension. */
5
+ export declare function registerRenderExtensions(ext: {
6
+ headCss?: RenderExtension;
7
+ bodyScript?: RenderExtension;
8
+ }): void;
9
+ /** Extra CSS appended to the document <head> (empty unless a host registered it). */
10
+ export declare function extraHeadCss(ir: DeckIR): string;
11
+ /** Extra script appended at the end of <body> (empty unless a host registered it). */
12
+ export declare function extraBodyScript(ir: DeckIR): string;
@@ -0,0 +1,19 @@
1
+ let headCss = () => '';
2
+ let bodyScript = () => '';
3
+ /** Register host-provided render extensions. Call once at process start, before
4
+ * rendering. Re-registering replaces the previous extension. */
5
+ export function registerRenderExtensions(ext) {
6
+ if (ext.headCss)
7
+ headCss = ext.headCss;
8
+ if (ext.bodyScript)
9
+ bodyScript = ext.bodyScript;
10
+ }
11
+ /** Extra CSS appended to the document <head> (empty unless a host registered it). */
12
+ export function extraHeadCss(ir) {
13
+ return headCss(ir);
14
+ }
15
+ /** Extra script appended at the end of <body> (empty unless a host registered it). */
16
+ export function extraBodyScript(ir) {
17
+ return bodyScript(ir);
18
+ }
19
+ //# sourceMappingURL=inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/render/inject.ts"],"names":[],"mappings":"AAWA,IAAI,OAAO,GAAoB,GAAG,EAAE,CAAC,EAAE,CAAC;AACxC,IAAI,UAAU,GAAoB,GAAG,EAAE,CAAC,EAAE,CAAC;AAE3C;iEACiE;AACjE,MAAM,UAAU,wBAAwB,CAAC,GAAgE;IACvG,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACvC,IAAI,GAAG,CAAC,UAAU;QAAE,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;AAClD,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}