@aivorynet/slaide 1.0.2 → 1.0.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/README.md +29 -8
  3. package/dist/assets.d.ts +1 -0
  4. package/dist/assets.js +3 -0
  5. package/dist/assets.js.map +1 -1
  6. package/dist/cli.js +70 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/compiler/compile.d.ts +1 -0
  9. package/dist/compiler/compile.js +3 -1
  10. package/dist/compiler/compile.js.map +1 -1
  11. package/dist/compiler/markdown.d.ts +1 -0
  12. package/dist/compiler/markdown.js +2 -1
  13. package/dist/compiler/markdown.js.map +1 -1
  14. package/dist/desktop/bootstrap.d.ts +31 -0
  15. package/dist/desktop/bootstrap.js +217 -0
  16. package/dist/desktop/bootstrap.js.map +1 -0
  17. package/dist/desktop/paths.d.ts +28 -0
  18. package/dist/desktop/paths.js +62 -0
  19. package/dist/desktop/paths.js.map +1 -0
  20. package/dist/desktop/verify.d.ts +21 -0
  21. package/dist/desktop/verify.js +78 -0
  22. package/dist/desktop/verify.js.map +1 -0
  23. package/dist/engine-entry.js +6 -0
  24. package/dist/engine-entry.js.map +1 -1
  25. package/dist/index.js +4 -7
  26. package/dist/index.js.map +1 -1
  27. package/dist/master-io.js +12 -0
  28. package/dist/master-io.js.map +1 -1
  29. package/dist/parser/parse.d.ts +1 -0
  30. package/dist/parser/parse.js +3 -2
  31. package/dist/parser/parse.js.map +1 -1
  32. package/dist/render/css.js +7 -4
  33. package/dist/render/css.js.map +1 -1
  34. package/dist/render/runtime.js +40 -13
  35. package/dist/render/runtime.js.map +1 -1
  36. package/dist/update.d.ts +5 -0
  37. package/dist/update.js +112 -0
  38. package/dist/update.js.map +1 -0
  39. package/dist/vocab.d.ts +36 -0
  40. package/dist/vocab.js +77 -0
  41. package/dist/vocab.js.map +1 -0
  42. package/package.json +1 -1
  43. package/skills/slaide/SKILL.md +1 -1
  44. package/skills/slaide/grammar.md +183 -0
  45. package/skills/slaide/reference.md +58 -2
  46. package/skills/slaide/themes.md +22 -8
@@ -40,8 +40,9 @@ function splitSegments(content) {
40
40
  const REGION_RE = /^::\s*([\w-]+)\s*::\s*$/;
41
41
  // Keys that legitimately appear in slide frontmatter. Used only to detect a
42
42
  // config-shaped *body* mistakenly eaten as frontmatter (see ambiguous-frontmatter).
43
- const KNOWN_SLIDE_KEYS = new Set([
44
- 'layout', 'background', 'transition', 'transition-ms', 'transition-ease', 'variant', 'chrome', 'footer', 'logo', 'morph', 'notes',
43
+ // Exported as the canonical frontmatter-key set (see src/vocab.ts).
44
+ export const KNOWN_SLIDE_KEYS = new Set([
45
+ 'layout', 'background', 'transition', 'transition-ms', 'transition-ease', 'variant', 'chrome', 'footer', 'logo', 'morph', 'notes', 'progress',
45
46
  'title', 'author', 'company', 'date', 'subtitle',
46
47
  ]);
47
48
  /** Split a slide body into regions and extract speaker notes. The `::` region
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parser/parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parser/parse.ts"],"names":[],"mappings":"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"}
@@ -7,14 +7,14 @@ const STATIC_CSS = `
7
7
  *,*::before,*::after{box-sizing:border-box;}
8
8
  html,body{margin:0;height:100%;}
9
9
  body{
10
- background:#0a0a0e;
10
+ background:var(--sl-stage-bg,#0a0a0e);
11
11
  font-family:var(--font-sans, system-ui, sans-serif);
12
12
  color:var(--color-text,#eee);
13
13
  overflow:hidden;
14
14
  -webkit-font-smoothing:antialiased;
15
15
  text-rendering:optimizeLegibility;
16
16
  }
17
- .sl-viewport{position:fixed;inset:0;overflow:hidden;background:#0a0a0e;}
17
+ .sl-viewport{position:fixed;inset:0;overflow:hidden;background:var(--sl-stage-bg,#0a0a0e);}
18
18
 
19
19
  /* thin, unobtrusive scrollbars wherever the deck scrolls (notes, code, help) */
20
20
  *{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.22) transparent;}
@@ -161,7 +161,10 @@ body{
161
161
  background:rgba(0,0,0,.3);color:#fff;opacity:.26;cursor:pointer;font:16px/1 var(--font-sans,system-ui);
162
162
  display:grid;place-items:center;backdrop-filter:blur(6px);transition:opacity .2s;}
163
163
  .sl-present-toggle:hover{opacity:.85;}
164
- body.sl-presenting .sl-present-toggle,body.sl-presenting .sl-counter{opacity:0;pointer-events:none;}
164
+ body.sl-presenting .sl-present-toggle,body.slv-presenting .sl-present-toggle,
165
+ body.sl-presenting .sl-counter,body.slv-presenting .sl-counter,
166
+ body.sl-presenting .sl-progress,body.slv-presenting .sl-progress{opacity:0;pointer-events:none;}
167
+ body.sl-presenting .sl-stage,body.slv-presenting .sl-stage{box-shadow:none;}
165
168
  @media print{.sl-present-toggle{display:none;}}
166
169
 
167
170
  /* ---- builds + transitions live in anim.ts (appended to BASE_CSS below) ---- */
@@ -170,7 +173,7 @@ body.sl-presenting .sl-present-toggle,body.sl-presenting .sl-counter{opacity:0;p
170
173
  .sl-progress{position:fixed;left:0;bottom:0;height:3px;background:var(--color-accent,#6cf);width:0;z-index:50;transition:width .3s ease;}
171
174
  .sl-counter{position:fixed;right:14px;bottom:12px;font:600 13px/1 var(--font-sans,system-ui);color:#fff;opacity:.35;z-index:50;background:rgba(0,0,0,.3);padding:5px 9px;border-radius:20px;backdrop-filter:blur(6px);}
172
175
  .sl-counter:hover{opacity:.8;}
173
- .sl-notes{position:fixed;left:0;right:0;bottom:0;max-height:38vh;overflow:auto;background:rgba(10,10,16,.94);color:#ddd;padding:16px 22px;font:15px/1.6 var(--font-sans,system-ui);z-index:60;border-top:2px solid var(--color-accent,#6cf);display:none;}
176
+ .sl-notes{position:fixed;left:var(--sl-dock-left,0px);right:var(--sl-dock-right,0px);bottom:var(--sl-dock-bottom,0px);height:180px;overflow:auto;background:rgba(10,10,16,.94);color:#ddd;padding:16px 22px;font:15px/1.6 var(--font-sans,system-ui);z-index:60;border-top:2px solid var(--color-accent,#6cf);display:none;box-sizing:border-box;}
174
177
  .sl-notes.sl-open{display:block;}
175
178
  .sl-help{position:fixed;inset:0;display:none;place-items:center;background:rgba(5,5,10,.82);z-index:70;}
176
179
  .sl-help.sl-open{display:grid;}
@@ -1 +1 @@
1
- {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/render/css.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE1E,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzE,OAAO,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,KAAK,qBAAqB,EAAE,CAAC,MAAM,CAAC,MAAM,0BAA0B,EAAE,CAAC,WAAW,CAAC,QAAQ,QAAQ,CAAC;AACpK,CAAC;AAED,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6KlB,CAAC;AAEF,qFAAqF;AACrF,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,YAAY,EAAE,GAAG,IAAI,GAAG,WAAW,EAAE,GAAG,IAAI,GAAG,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/render/css.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE1E,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzE,OAAO,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,KAAK,qBAAqB,EAAE,CAAC,MAAM,CAAC,MAAM,0BAA0B,EAAE,CAAC,WAAW,CAAC,QAAQ,QAAQ,CAAC;AACpK,CAAC;AAED,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgLlB,CAAC;AAEF,qFAAqF;AACrF,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,GAAG,IAAI,GAAG,YAAY,EAAE,GAAG,IAAI,GAAG,WAAW,EAAE,GAAG,IAAI,GAAG,kBAAkB,EAAE,CAAC"}
@@ -40,20 +40,20 @@ export const RUNTIME_JS = String.raw `
40
40
  panX = Math.max(-ox, Math.min(ox, panX));
41
41
  panY = Math.max(-oy, Math.min(oy, panY));
42
42
  }
43
- // Docked panels (a left slide navigator, an optional right side panel) reserve gutters
44
- // via the --sl-dock-left / --sl-dock-right CSS vars; the stage centers in the *remaining*
45
- // width and shifts right by the left gutter. 0 (unset) means full-bleed, as before.
46
- function dockVar(name){
47
- var v = getComputedStyle(document.documentElement).getPropertyValue(name);
48
- var n = parseFloat(v); return isFinite(n) ? n : 0;
49
- }
43
+ function cssVar(cs, name){ var n = parseFloat(cs.getPropertyValue(name)); return isFinite(n) ? n : 0; }
50
44
  function scale(){
51
- var dl = dockVar('--sl-dock-left'), dr = dockVar('--sl-dock-right');
52
- var vw = window.innerWidth - dl - dr, vh = window.innerHeight;
45
+ var pres = isPresenting();
46
+ var cs = getComputedStyle(document.documentElement);
47
+ var dl = pres ? 0 : cssVar(cs,'--sl-dock-left'), dr = pres ? 0 : cssVar(cs,'--sl-dock-right');
48
+ var dt = pres ? 0 : cssVar(cs,'--sl-dock-top');
49
+ // Bottom dock = chrome dock (bstrip/filmstrip, absolute) + notes reservation (independent), so
50
+ // the two writers never clobber each other. .sl-notes sits at --sl-dock-bottom (above the chrome).
51
+ var db = pres ? 0 : cssVar(cs,'--sl-dock-bottom') + cssVar(cs,'--sl-dock-notes');
52
+ var vw = window.innerWidth - dl - dr, vh = window.innerHeight - dt - db;
53
53
  var fit = Math.min(vw/CW, vh/CH);
54
54
  var s = fit * zoomFactor;
55
55
  if(zoomFactor<=1){ panX = panY = 0; } else { clampPan(s, vw, vh); }
56
- var tx = dl + (vw - CW*s)/2 + panX, ty = (vh - CH*s)/2 + panY;
56
+ var tx = dl + (vw - CW*s)/2 + panX, ty = dt + (vh - CH*s)/2 + panY;
57
57
  stage.style.transform = 'translate('+tx+'px,'+ty+'px) scale('+s+')';
58
58
  }
59
59
 
@@ -142,6 +142,27 @@ export const RUNTIME_JS = String.raw `
142
142
  }
143
143
 
144
144
  function toggle(sel){ var e=document.querySelector(sel); if(e) e.classList.toggle('sl-open'); updateChrome(); }
145
+ var NOTES_H = 180;
146
+ // Dock the notes panel BENEATH the slide (not floating over it). The panel is a fixed sibling;
147
+ // it reserves its own space via the INDEPENDENT --sl-dock-notes var (summed into the stage fit by
148
+ // scale()), and anchors at --sl-dock-bottom so it sits flush above the chrome dock (the editor
149
+ // filmstrip, or nothing). Keeping notes' reservation separate from --sl-dock-bottom means the
150
+ // bstrip's absolute writes and the notes' toggle never clobber each other (no overlap on toggle).
151
+ function setNotesOpen(open){
152
+ var np = document.querySelector('.sl-notes');
153
+ if(!np) return;
154
+ if(open === np.classList.contains('sl-open')) return; // already in the requested state
155
+ var ds = document.documentElement.style;
156
+ if(open){ np.classList.add('sl-open'); ds.setProperty('--sl-dock-notes', NOTES_H + 'px'); }
157
+ else { np.classList.remove('sl-open'); ds.setProperty('--sl-dock-notes', '0px'); }
158
+ // innerHTML is populated by the updateChrome() call below (it fills .sl-notes when open).
159
+ scale();
160
+ updateChrome();
161
+ }
162
+ function toggleNotes(){
163
+ var np = document.querySelector('.sl-notes');
164
+ if(np) setNotesOpen(!np.classList.contains('sl-open'));
165
+ }
145
166
 
146
167
  // ---- present extras: screen blank (b/w), presenter view, cross-window sync ----------------
147
168
  var blanked = '';
@@ -292,13 +313,18 @@ export const RUNTIME_JS = String.raw `
292
313
  case 'ArrowLeft': case 'ArrowDown': case 'PageUp': backward(); e.preventDefault(); break;
293
314
  case 'Home': goTo(0,1); break;
294
315
  case 'End': goTo(slides.length-1,1); break;
295
- case 'n': case 'N': toggle('.sl-notes'); break;
316
+ case 'n': case 'N': toggleNotes(); break;
296
317
  case 'f': case 'F': setPresenting(!isPresenting(), true); break;
297
318
  case 'p': case 'P': presenter(); break;
298
319
  case 'b': case 'B': blank(blanked==='b'?'':'b'); e.preventDefault(); break;
299
320
  case 'w': case 'W': blank(blanked==='w'?'':'w'); e.preventDefault(); break;
300
321
  case '?': case 'h': toggle('.sl-help'); break;
301
- case 'Escape': document.querySelectorAll('.sl-open').forEach(function(e){e.classList.remove('sl-open');}); break;
322
+ case 'Escape':
323
+ // Close any open overlay (help, etc.) directly; notes go through setNotesOpen so the
324
+ // reserved bottom dock unwinds too. (Loop param is el; the outer e is the KeyboardEvent.)
325
+ document.querySelectorAll('.sl-open').forEach(function(el){ if(!el.classList.contains('sl-notes')) el.classList.remove('sl-open'); });
326
+ setNotesOpen(false);
327
+ break;
302
328
  }
303
329
  });
304
330
  // ---- drag-to-pan (only when zoomed in past fit) -------------------------
@@ -347,6 +373,7 @@ export const RUNTIME_JS = String.raw `
347
373
  }
348
374
  document.addEventListener('fullscreenchange', function(){
349
375
  document.body.classList.toggle('sl-presenting', !!document.fullscreenElement);
376
+ scale();
350
377
  });
351
378
  var presentBtn = document.querySelector('.sl-present-toggle');
352
379
  if(presentBtn) presentBtn.addEventListener('click', function(){ setPresenting(!isPresenting(), true); });
@@ -359,7 +386,7 @@ export const RUNTIME_JS = String.raw `
359
386
  relayout: function(){ scale(); }, // recompute the stage fit (e.g. after the dock opens/closes)
360
387
  show: function(i){ if(i<0||i>=slides.length) return; activate(i, true); cur=i; updateChrome(); },
361
388
  setInteractive: function(on){ navEnabled = on!==false; },
362
- toggleNotes: function(){ toggle('.sl-notes'); },
389
+ toggleNotes: function(){ toggleNotes(); },
363
390
  toggleHelp: function(){ toggle('.sl-help'); },
364
391
  zoom: function(f){
365
392
  zoomFactor = (f==='fit'||!f) ? 1 : Math.max(0.25, Math.min(8, f));
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/render/runtime.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,8EAA8E;AAC9E,uFAAuF;AACvF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmYnC,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/render/runtime.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,8EAA8E;AAC9E,uFAAuF;AACvF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8ZnC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Notify (or, with SLAIDE_AUTO_UPDATE=1, install) when a newer @aivorynet/slaide is published.
3
+ * Throttled to once per day via a cache in the Slaide home dir. Never throws.
4
+ */
5
+ export declare function maybeNotifyUpdate(current: string, cmd?: string): Promise<void>;
package/dist/update.js ADDED
@@ -0,0 +1,112 @@
1
+ // Copyright 2026 AIVory, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // Lightweight npm update notifier. Once a day, checks the registry for a newer published version
4
+ // and prints a one-line notice (to stderr, so machine output on stdout is untouched). Opt out with
5
+ // SLAIDE_NO_UPDATE=1; set SLAIDE_AUTO_UPDATE=1 to actually run `npm i -g` when an update exists.
6
+ // Best-effort and fully swallowed: a failed/slow check never affects the command. No deps.
7
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { slaideHome } from './desktop/paths.js';
10
+ const PKG = '@aivorynet/slaide';
11
+ const REGISTRY = `https://registry.npmjs.org/${PKG}/latest`;
12
+ const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
13
+ const FETCH_TIMEOUT_MS = 1500;
14
+ // Machine-contract commands: never emit chatter or spend time on a network check.
15
+ const QUIET_COMMANDS = new Set(['mcp', 'render', 'compile']);
16
+ function stateFile() {
17
+ return join(slaideHome(), 'update-check.json');
18
+ }
19
+ function shouldSkip(cmd) {
20
+ if (process.env.SLAIDE_NO_UPDATE || process.env.NO_UPDATE_NOTIFIER || process.env.CI)
21
+ return true;
22
+ if (!process.stderr.isTTY)
23
+ return true; // piped / non-interactive — stay silent
24
+ return QUIET_COMMANDS.has(cmd ?? '');
25
+ }
26
+ function parseVer(v) {
27
+ return v.replace(/^v/, '').split('-')[0].split('.').map((n) => parseInt(n, 10) || 0);
28
+ }
29
+ /** True if `a` is a strictly higher release than `b` (ignores prerelease tags). */
30
+ function semverGt(a, b) {
31
+ const pa = parseVer(a);
32
+ const pb = parseVer(b);
33
+ for (let i = 0; i < 3; i++) {
34
+ const x = pa[i] ?? 0;
35
+ const y = pb[i] ?? 0;
36
+ if (x !== y)
37
+ return x > y;
38
+ }
39
+ return false;
40
+ }
41
+ function readState() {
42
+ try {
43
+ return JSON.parse(readFileSync(stateFile(), 'utf8'));
44
+ }
45
+ catch {
46
+ return {};
47
+ }
48
+ }
49
+ function writeState(s) {
50
+ try {
51
+ mkdirSync(slaideHome(), { recursive: true });
52
+ writeFileSync(stateFile(), JSON.stringify(s));
53
+ }
54
+ catch {
55
+ /* cache is best-effort */
56
+ }
57
+ }
58
+ async function fetchLatest() {
59
+ const ctrl = new AbortController();
60
+ const t = setTimeout(() => ctrl.abort(), FETCH_TIMEOUT_MS);
61
+ try {
62
+ const res = await fetch(REGISTRY, { signal: ctrl.signal, headers: { accept: 'application/json' } });
63
+ if (!res.ok)
64
+ return undefined;
65
+ return (await res.json())?.version;
66
+ }
67
+ catch {
68
+ return undefined;
69
+ }
70
+ finally {
71
+ clearTimeout(t);
72
+ }
73
+ }
74
+ /**
75
+ * Notify (or, with SLAIDE_AUTO_UPDATE=1, install) when a newer @aivorynet/slaide is published.
76
+ * Throttled to once per day via a cache in the Slaide home dir. Never throws.
77
+ */
78
+ export async function maybeNotifyUpdate(current, cmd) {
79
+ if (shouldSkip(cmd))
80
+ return;
81
+ try {
82
+ const st = readState();
83
+ const now = Date.now();
84
+ let latest = st.latest;
85
+ if (!st.lastCheck || now - st.lastCheck > CHECK_INTERVAL_MS) {
86
+ const fetched = await fetchLatest();
87
+ if (fetched)
88
+ latest = fetched;
89
+ writeState({ lastCheck: now, latest });
90
+ }
91
+ if (!latest || !semverGt(latest, current))
92
+ return;
93
+ if (process.env.SLAIDE_AUTO_UPDATE === '1') {
94
+ process.stderr.write(`\n ▲ Updating slaide ${current} → ${latest}…\n`);
95
+ const { spawnSync } = await import('node:child_process');
96
+ const r = spawnSync('npm', ['i', '-g', `${PKG}@latest`], {
97
+ stdio: 'inherit',
98
+ shell: process.platform === 'win32',
99
+ });
100
+ if (r.status !== 0)
101
+ process.stderr.write(` update failed — run: npm i -g ${PKG}@latest\n`);
102
+ }
103
+ else {
104
+ process.stderr.write(`\n ▲ slaide ${current} → ${latest} available · npm i -g ${PKG}@latest` +
105
+ ` (SLAIDE_AUTO_UPDATE=1 to auto-update)\n`);
106
+ }
107
+ }
108
+ catch {
109
+ /* never let an update check break the command */
110
+ }
111
+ }
112
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { DEFAULT_ENTRANCE } from './render/anim.js';
2
+ /** Named slide transitions (frontmatter `transition:`). Canonical: render/anim.ts. */
3
+ export declare const TRANSITIONS: readonly string[];
4
+ /** Element/build entrances (`>>> <entrance>`), default `fade-up`. Canonical: render/anim.ts. */
5
+ export declare const ENTRANCES: readonly string[];
6
+ export { DEFAULT_ENTRANCE };
7
+ /** Per-slide frontmatter keys the parser recognizes (metadata keys included — they also
8
+ * become `{{placeholders}}`). Canonical: parser/parse.ts `KNOWN_SLIDE_KEYS`. */
9
+ export declare const FRONTMATTER_KEYS: readonly string[];
10
+ /** The config (non-metadata) subset — the keys that change how a slide renders. Used by
11
+ * the docs lint to check the frontmatter-key table; metadata keys (title/author/…) are
12
+ * documented as placeholders/headmatter instead. */
13
+ export declare const FRONTMATTER_CONFIG_KEYS: readonly string[];
14
+ /** Deck headmatter keys with defined meaning (plus any custom scalar → placeholder). */
15
+ export declare const HEADMATTER_KEYS: readonly string[];
16
+ /** Inline span size classes `[x]{.xs}`. Canonical: compiler/markdown.ts `SIZE_CLASS`. */
17
+ export declare const SPAN_SIZE_CLASSES: readonly string[];
18
+ /** Inline span utility classes (besides `.grad`/`.grad-<name>` and colour names). */
19
+ export declare const SPAN_UTIL_CLASSES: readonly string[];
20
+ /** Image `{...}` utility classes `![x](y){.round}`. Canonical: render/css.ts `.sl-img.*`. */
21
+ export declare const IMAGE_UTIL_CLASSES: readonly string[];
22
+ /** Renderable code-fence info-strings (rendered, not shown as code). Canonical: compiler/markdown.ts. */
23
+ export declare const RENDERABLE_FENCES: readonly string[];
24
+ /** Placeholder built-ins `{{page}}` (plus any scalar headmatter/frontmatter key). Canonical: compiler/chrome.ts `placeholderCtx`. */
25
+ export declare const PLACEHOLDER_BUILTINS: readonly string[];
26
+ /** Master layout slot `style:` keys. Canonical: compiler/compile.ts `STYLE_MAP` + the two
27
+ * keys handled before the map (`anchor`, `box`). */
28
+ export declare const SLOT_STYLE_KEYS: readonly string[];
29
+ /** Master layout slot `type:`s that get first-class styling. Canonical: render/css.ts `.sl-slot-*`. */
30
+ export declare const SLOT_TYPES: readonly string[];
31
+ /** Every diagnostic (`validate`) code the engine can emit. Canonical: emitted as `code:`
32
+ * literals across the parser/compiler; the lint scrapes src to keep this exhaustive. */
33
+ export declare const DIAGNOSTIC_CODES: readonly string[];
34
+ /** Diagnostics that are hard errors (`ok:false`); every other code is a warning.
35
+ * Canonical here so `index.ts` and the docs share one definition. */
36
+ export declare const ERROR_SEVERITY_CODES: ReadonlySet<string>;
package/dist/vocab.js ADDED
@@ -0,0 +1,77 @@
1
+ // Copyright 2026 AIVory, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ //
4
+ // THE canonical registry of the slaide language's author-facing vocabulary.
5
+ //
6
+ // Why this file exists: the token sets (transitions, frontmatter keys, span/slot
7
+ // classes, placeholders, fence types, diagnostic codes) used to live scattered and
8
+ // mostly un-exported across parser/compiler/render modules, and the human docs
9
+ // (docs/spec.md, docs/grammar.md, docs/themes.md) were hand-kept in parallel — so they
10
+ // drifted (e.g. docs listed ~5 transitions while the engine shipped 13). Everything the
11
+ // docs must stay complete about is now imported/derived here from the real code, and
12
+ // `test/docs-sync.test.ts` fails CI if a token is missing from the docs or if the code
13
+ // grows a token this registry doesn't know about. Add a token to the engine → add it
14
+ // here → the lint tells you which doc to update. One source, no drift.
15
+ //
16
+ // This module is a LEAF: it only pulls the already-exported catalogs it can reuse
17
+ // verbatim; anything without a single code-level const is listed here as the canonical
18
+ // definition and cross-checked against source text by the lint.
19
+ import { SLIDE_TRANSITION_NAMES, ENTRANCE_NAMES, DEFAULT_ENTRANCE } from './render/anim.js';
20
+ import { KNOWN_SLIDE_KEYS } from './parser/parse.js';
21
+ import { SIZE_CLASS } from './compiler/markdown.js';
22
+ import { STYLE_MAP } from './compiler/compile.js';
23
+ /** Named slide transitions (frontmatter `transition:`). Canonical: render/anim.ts. */
24
+ export const TRANSITIONS = SLIDE_TRANSITION_NAMES;
25
+ /** Element/build entrances (`>>> <entrance>`), default `fade-up`. Canonical: render/anim.ts. */
26
+ export const ENTRANCES = ENTRANCE_NAMES;
27
+ export { DEFAULT_ENTRANCE };
28
+ /** Per-slide frontmatter keys the parser recognizes (metadata keys included — they also
29
+ * become `{{placeholders}}`). Canonical: parser/parse.ts `KNOWN_SLIDE_KEYS`. */
30
+ export const FRONTMATTER_KEYS = [...KNOWN_SLIDE_KEYS];
31
+ /** The config (non-metadata) subset — the keys that change how a slide renders. Used by
32
+ * the docs lint to check the frontmatter-key table; metadata keys (title/author/…) are
33
+ * documented as placeholders/headmatter instead. */
34
+ export const FRONTMATTER_CONFIG_KEYS = [
35
+ 'layout', 'transition', 'transition-ms', 'transition-ease',
36
+ 'background', 'variant', 'morph', 'chrome', 'logo', 'footer', 'notes',
37
+ ];
38
+ /** Deck headmatter keys with defined meaning (plus any custom scalar → placeholder). */
39
+ export const HEADMATTER_KEYS = ['master', 'title', 'author', 'date', 'company', 'subtitle', 'progress'];
40
+ /** Inline span size classes `[x]{.xs}`. Canonical: compiler/markdown.ts `SIZE_CLASS`. */
41
+ export const SPAN_SIZE_CLASSES = Object.keys(SIZE_CLASS);
42
+ /** Inline span utility classes (besides `.grad`/`.grad-<name>` and colour names). */
43
+ export const SPAN_UTIL_CLASSES = ['grad', 'bold', 'muted'];
44
+ /** Image `{...}` utility classes `![x](y){.round}`. Canonical: render/css.ts `.sl-img.*`. */
45
+ export const IMAGE_UTIL_CLASSES = ['round', 'cover', 'shadow'];
46
+ /** Renderable code-fence info-strings (rendered, not shown as code). Canonical: compiler/markdown.ts. */
47
+ export const RENDERABLE_FENCES = ['svg', 'embed', 'widget', 'mermaid', 'echart'];
48
+ /** Placeholder built-ins `{{page}}` (plus any scalar headmatter/frontmatter key). Canonical: compiler/chrome.ts `placeholderCtx`. */
49
+ export const PLACEHOLDER_BUILTINS = [
50
+ 'page', 'total', 'pagePadded', 'totalPadded', 'date', 'title', 'author', 'slideTitle', 'footer',
51
+ ];
52
+ /** Master layout slot `style:` keys. Canonical: compiler/compile.ts `STYLE_MAP` + the two
53
+ * keys handled before the map (`anchor`, `box`). */
54
+ export const SLOT_STYLE_KEYS = [...Object.keys(STYLE_MAP), 'anchor', 'box'];
55
+ /** Master layout slot `type:`s that get first-class styling. Canonical: render/css.ts `.sl-slot-*`. */
56
+ export const SLOT_TYPES = ['title', 'subtitle', 'body', 'image', 'media', 'quote', 'caption'];
57
+ /** Every diagnostic (`validate`) code the engine can emit. Canonical: emitted as `code:`
58
+ * literals across the parser/compiler; the lint scrapes src to keep this exhaustive. */
59
+ export const DIAGNOSTIC_CODES = [
60
+ // parser/parse.ts
61
+ 'bad-config', 'no-headmatter', 'ambiguous-frontmatter', 'empty-deck',
62
+ // compiler/compile.ts
63
+ 'unknown-color', 'unknown-gradient', 'bad-animation', 'unknown-layout',
64
+ 'unknown-transition', 'unknown-background', 'unknown-slot', 'low-contrast',
65
+ // compiler/markdown.ts
66
+ 'unknown-class', 'unknown-entrance', 'stray-build', 'bad-chart',
67
+ // compiler/tokens.ts
68
+ 'unknown-token', 'token-cycle', 'non-embeddable-font', 'unknown-variant',
69
+ // compiler/chrome.ts
70
+ 'unknown-placeholder',
71
+ // index.ts (validation entry)
72
+ 'no-master', 'parse-error',
73
+ ];
74
+ /** Diagnostics that are hard errors (`ok:false`); every other code is a warning.
75
+ * Canonical here so `index.ts` and the docs share one definition. */
76
+ export const ERROR_SEVERITY_CODES = new Set(['empty-deck', 'no-master', 'unknown-layout']);
77
+ //# sourceMappingURL=vocab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vocab.js","sourceRoot":"","sources":["../src/vocab.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,EAAE;AACF,4EAA4E;AAC5E,EAAE;AACF,iFAAiF;AACjF,mFAAmF;AACnF,+EAA+E;AAC/E,uFAAuF;AACvF,wFAAwF;AACxF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,uEAAuE;AACvE,EAAE;AACF,kFAAkF;AAClF,uFAAuF;AACvF,gEAAgE;AAEhE,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,sFAAsF;AACtF,MAAM,CAAC,MAAM,WAAW,GAAsB,sBAAsB,CAAC;AAErE,gGAAgG;AAChG,MAAM,CAAC,MAAM,SAAS,GAAsB,cAAc,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;iFACiF;AACjF,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,GAAG,gBAAgB,CAAC,CAAC;AAEzE;;qDAEqD;AACrD,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB;IAC1D,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;CACtE,CAAC;AAEF,wFAAwF;AACxF,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAE3H,yFAAyF;AACzF,MAAM,CAAC,MAAM,iBAAiB,GAAsB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAE5E,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9E,6FAA6F;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAElF,yGAAyG;AACzG,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEpG,qIAAqI;AACrI,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ;CAChG,CAAC;AAEF;qDACqD;AACrD,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAE/F,uGAAuG;AACvG,MAAM,CAAC,MAAM,UAAU,GAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAEjH;yFACyF;AACzF,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,kBAAkB;IAClB,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,YAAY;IACpE,sBAAsB;IACtB,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB;IACtE,oBAAoB,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc;IAC1E,uBAAuB;IACvB,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW;IAC/D,qBAAqB;IACrB,eAAe,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB;IACxE,qBAAqB;IACrB,qBAAqB;IACrB,8BAA8B;IAC9B,WAAW,EAAE,aAAa;CAC3B,CAAC;AAEF;sEACsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aivorynet/slaide",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "An AI-authorable slide language with beautiful web + PDF output",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -16,7 +16,7 @@ Run as `npx @aivorynet/slaide <cmd>` (or `npm run slaide -- <cmd>` where a scrip
16
16
 
17
17
  ## Workflow
18
18
  1. **Brand first — check, then ask.** Scan the project/context for brand assets: colours, fonts, a logo, an existing `*.slaide.yaml` master, a brand doc. Found a master → use it. Found brand → build the master around it. Found nothing → **ask** the user: brand colours? logo? an existing theme, or author one from scratch? Prefer authoring a **new master** over copying an example.
19
- 2. **Read** `reference.md` (language) and `themes.md` (the master format + footguns) before authoring a master. Worked example decks: https://github.com/aivorynet/slaide/tree/main/examples
19
+ 2. **Read** `reference.md` (language) and `themes.md` (the master format + footguns) before authoring a master; `grammar.md` is the precise formal reference (frontmatter detection, attribute braces, transitions/entrances, master value forms) when you need it. Worked example decks: https://github.com/aivorynet/slaide/tree/main/examples
20
20
  3. **`slaide slots <deck>`** — prints the master's real layouts, slots, colours, gradients, sizes, transitions. Reference these **by name**. (Run on the deck, not the master.)
21
21
  4. **Write** the `.slaide` — and the master, if authoring one.
22
22
  5. **`slaide validate <deck> --strict`** — a **gate**: must be clean. Every `unknown-*` / `low-contrast` / `non-embeddable-font` means something renders wrong even when it "looks valid".