@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,50 @@
1
+ export interface SlideTransitionDef {
2
+ /** keyframe body for the entering slide, forward, e.g. "from{opacity:0}to{opacity:1}". */
3
+ enter: string;
4
+ /** keyframe body for the leaving slide, forward. */
5
+ exit: string;
6
+ /** entering-slide keyframe when navigating backward (defaults to `enter`). */
7
+ enterRev?: string;
8
+ /** leaving-slide keyframe when navigating backward (defaults to `exit`). */
9
+ exitRev?: string;
10
+ /** default easing; a per-slide `--transition-ease` overrides it. */
11
+ easing?: string;
12
+ /** z-index of the entering / leaving slide during the transition (default 2 / 1). */
13
+ enterZ?: number;
14
+ exitZ?: number;
15
+ }
16
+ export interface EntranceDef {
17
+ /** CSS declarations for the pre-reveal (hidden) state, e.g. "opacity:0;transform:translateY(8px)". */
18
+ hidden: string;
19
+ /** optional per-effect default easing (an inline `ease=` overrides it). */
20
+ easing?: string;
21
+ /** optional per-effect default duration in ms (an inline `dur=` overrides it). */
22
+ durationMs?: number;
23
+ }
24
+ export declare const SLIDE_TRANSITIONS: Record<string, SlideTransitionDef>;
25
+ export declare const DEFAULT_ENTRANCE = "fade-up";
26
+ export declare const ENTRANCES: Record<string, EntranceDef>;
27
+ export declare const SLIDE_TRANSITION_NAMES: string[];
28
+ export declare const ENTRANCE_NAMES: string[];
29
+ export declare function isSlideTransition(n: string): boolean;
30
+ export declare function isEntrance(n: string): boolean;
31
+ /** CSS for a set of slide transitions (defaults to the built-in catalog). */
32
+ export declare function slideTransitionCss(defs?: Record<string, SlideTransitionDef>): string;
33
+ /** CSS for a set of entrances: per-effect hidden state (+ optional easing/duration vars). */
34
+ export declare function entranceCss(defs?: Record<string, EntranceDef>): string;
35
+ /** Generic build machinery + reduced-motion / print guards. Emitted once. */
36
+ export declare function buildBaseCss(): string;
37
+ export interface MasterAnimationDef {
38
+ in?: string;
39
+ out?: string;
40
+ hidden?: string;
41
+ entrance?: boolean;
42
+ duration?: number;
43
+ ease?: string;
44
+ }
45
+ /** Split a master `animations` map into slide-transition and entrance catalogs. */
46
+ export declare function masterAnimations(animations: Record<string, MasterAnimationDef> | undefined): {
47
+ slides: Record<string, SlideTransitionDef>;
48
+ entrances: Record<string, EntranceDef>;
49
+ warnings: string[];
50
+ };
@@ -0,0 +1,213 @@
1
+ // Copyright 2026 AIVory, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // Single source of truth for named slide transitions and element entrances.
4
+ //
5
+ // Design goal: adding an effect = adding ONE catalog entry here. The runtime derives
6
+ // CSS classes from the name by convention (`sl-anim-<name>-in/out` for slide
7
+ // transitions, `sl-ent-<name>` for element entrances), so no runtime JS edit is
8
+ // needed per effect. This module BOTH generates the CSS and exposes the name lists
9
+ // surfaced to authors / AI (CLI `slots`, MCP spec) and used for `loud` validation.
10
+ const EASE_SLIDE = 'cubic-bezier(.4,0,.2,1)';
11
+ const EASE_ZOOM = 'cubic-bezier(.2,.7,.3,1)';
12
+ // ---- slide↔slide transitions ----------------------------------------------
13
+ // `none` and `morph` are synthetic (handled directly in the runtime, no CSS).
14
+ export const SLIDE_TRANSITIONS = {
15
+ fade: {
16
+ enter: 'from{opacity:0}to{opacity:1}',
17
+ exit: 'from{opacity:1}to{opacity:0}',
18
+ easing: 'ease',
19
+ },
20
+ dissolve: {
21
+ enter: 'from{opacity:0;filter:blur(6px)}to{opacity:1;filter:blur(0)}',
22
+ exit: 'from{opacity:1;filter:blur(0)}to{opacity:0;filter:blur(6px)}',
23
+ easing: 'ease',
24
+ },
25
+ zoom: {
26
+ enter: 'from{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}',
27
+ exit: 'from{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(1.06)}',
28
+ easing: EASE_ZOOM,
29
+ },
30
+ 'zoom-out': {
31
+ enter: 'from{opacity:0;transform:scale(1.08)}to{opacity:1;transform:scale(1)}',
32
+ exit: 'from{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.94)}',
33
+ easing: EASE_ZOOM,
34
+ },
35
+ 'slide-left': {
36
+ enter: 'from{opacity:0;transform:translateX(6%)}to{opacity:1;transform:none}',
37
+ exit: 'from{opacity:1;transform:none}to{opacity:0;transform:translateX(-6%)}',
38
+ enterRev: 'from{opacity:0;transform:translateX(-6%)}to{opacity:1;transform:none}',
39
+ exitRev: 'from{opacity:1;transform:none}to{opacity:0;transform:translateX(6%)}',
40
+ easing: EASE_SLIDE,
41
+ },
42
+ 'slide-right': {
43
+ enter: 'from{opacity:0;transform:translateX(-6%)}to{opacity:1;transform:none}',
44
+ exit: 'from{opacity:1;transform:none}to{opacity:0;transform:translateX(6%)}',
45
+ enterRev: 'from{opacity:0;transform:translateX(6%)}to{opacity:1;transform:none}',
46
+ exitRev: 'from{opacity:1;transform:none}to{opacity:0;transform:translateX(-6%)}',
47
+ easing: EASE_SLIDE,
48
+ },
49
+ 'slide-up': {
50
+ enter: 'from{opacity:0;transform:translateY(6%)}to{opacity:1;transform:none}',
51
+ exit: 'from{opacity:1;transform:none}to{opacity:0;transform:translateY(-6%)}',
52
+ enterRev: 'from{opacity:0;transform:translateY(-6%)}to{opacity:1;transform:none}',
53
+ exitRev: 'from{opacity:1;transform:none}to{opacity:0;transform:translateY(6%)}',
54
+ easing: EASE_SLIDE,
55
+ },
56
+ 'slide-down': {
57
+ enter: 'from{opacity:0;transform:translateY(-6%)}to{opacity:1;transform:none}',
58
+ exit: 'from{opacity:1;transform:none}to{opacity:0;transform:translateY(6%)}',
59
+ enterRev: 'from{opacity:0;transform:translateY(6%)}to{opacity:1;transform:none}',
60
+ exitRev: 'from{opacity:1;transform:none}to{opacity:0;transform:translateY(-6%)}',
61
+ easing: EASE_SLIDE,
62
+ },
63
+ push: {
64
+ enter: 'from{transform:translateX(100%)}to{transform:none}',
65
+ exit: 'from{transform:none}to{transform:translateX(-100%)}',
66
+ enterRev: 'from{transform:translateX(-100%)}to{transform:none}',
67
+ exitRev: 'from{transform:none}to{transform:translateX(100%)}',
68
+ easing: EASE_SLIDE,
69
+ },
70
+ cover: {
71
+ // the new slide slides in on top; the old one sits still beneath
72
+ enter: 'from{transform:translateX(100%)}to{transform:none}',
73
+ exit: 'from{opacity:1}to{opacity:1}',
74
+ enterRev: 'from{transform:translateX(-100%)}to{transform:none}',
75
+ exitRev: 'from{opacity:1}to{opacity:1}',
76
+ easing: EASE_SLIDE,
77
+ },
78
+ reveal: {
79
+ // the old slide slides away on top, revealing the new one sitting beneath
80
+ enter: 'from{opacity:1}to{opacity:1}',
81
+ exit: 'from{transform:none}to{transform:translateX(-100%)}',
82
+ enterRev: 'from{opacity:1}to{opacity:1}',
83
+ exitRev: 'from{transform:none}to{transform:translateX(100%)}',
84
+ easing: EASE_SLIDE,
85
+ enterZ: 1,
86
+ exitZ: 2,
87
+ },
88
+ flip: {
89
+ enter: 'from{opacity:0;transform:perspective(1200px) rotateY(90deg)}to{opacity:1;transform:perspective(1200px) rotateY(0)}',
90
+ exit: 'from{opacity:1;transform:perspective(1200px) rotateY(0)}to{opacity:0;transform:perspective(1200px) rotateY(-90deg)}',
91
+ enterRev: 'from{opacity:0;transform:perspective(1200px) rotateY(-90deg)}to{opacity:1;transform:perspective(1200px) rotateY(0)}',
92
+ exitRev: 'from{opacity:1;transform:perspective(1200px) rotateY(0)}to{opacity:0;transform:perspective(1200px) rotateY(90deg)}',
93
+ easing: EASE_ZOOM,
94
+ },
95
+ 'fade-through-black': {
96
+ // both slides pass through the dark stage backdrop at the midpoint
97
+ enter: 'from{opacity:0}50%{opacity:0}to{opacity:1}',
98
+ exit: 'from{opacity:1}50%{opacity:0}to{opacity:0}',
99
+ easing: 'ease',
100
+ },
101
+ };
102
+ // aliases (share the same definition; emitted as their own class names)
103
+ SLIDE_TRANSITIONS['slide'] = SLIDE_TRANSITIONS['slide-left'];
104
+ SLIDE_TRANSITIONS['fade-black'] = SLIDE_TRANSITIONS['fade-through-black'];
105
+ // ---- element / build entrances ---------------------------------------------
106
+ export const DEFAULT_ENTRANCE = 'fade-up';
107
+ export const ENTRANCES = {
108
+ fade: { hidden: 'opacity:0' },
109
+ 'fade-up': { hidden: 'opacity:0;transform:translateY(8px)' },
110
+ 'fade-down': { hidden: 'opacity:0;transform:translateY(-8px)' },
111
+ 'fade-left': { hidden: 'opacity:0;transform:translateX(-16px)' },
112
+ 'fade-right': { hidden: 'opacity:0;transform:translateX(16px)' },
113
+ 'slide-in-left': { hidden: 'opacity:0;transform:translateX(-24px)' },
114
+ 'slide-in-right': { hidden: 'opacity:0;transform:translateX(24px)' },
115
+ 'slide-in-up': { hidden: 'opacity:0;transform:translateY(24px)' },
116
+ 'slide-in-down': { hidden: 'opacity:0;transform:translateY(-24px)' },
117
+ 'zoom-in': { hidden: 'opacity:0;transform:scale(.9)' },
118
+ 'zoom-out': { hidden: 'opacity:0;transform:scale(1.08)' },
119
+ pop: { hidden: 'opacity:0;transform:scale(.6)', easing: 'cubic-bezier(.2,1.5,.4,1)' },
120
+ 'blur-in': { hidden: 'opacity:0;filter:blur(8px)' },
121
+ rise: { hidden: 'opacity:0;transform:translateY(40px)' },
122
+ none: { hidden: 'opacity:0', durationMs: 0 },
123
+ };
124
+ export const SLIDE_TRANSITION_NAMES = ['none', 'morph', ...Object.keys(SLIDE_TRANSITIONS)];
125
+ export const ENTRANCE_NAMES = Object.keys(ENTRANCES);
126
+ export function isSlideTransition(n) {
127
+ return n === 'none' || n === 'morph' || Object.prototype.hasOwnProperty.call(SLIDE_TRANSITIONS, n);
128
+ }
129
+ export function isEntrance(n) {
130
+ return Object.prototype.hasOwnProperty.call(ENTRANCES, n);
131
+ }
132
+ // ---- CSS generators --------------------------------------------------------
133
+ function transitionRules(name, d) {
134
+ const ez = d.enterZ ?? 2;
135
+ const xz = d.exitZ ?? 1;
136
+ const ease = d.easing ?? 'ease';
137
+ const inA = `slk-${name}-in`;
138
+ const outA = `slk-${name}-out`;
139
+ let css = `.sl-anim-${name}-in{z-index:${ez};animation:${inA} var(--transition-ms) var(--transition-ease,${ease}) both;}` +
140
+ `.sl-anim-${name}-out{z-index:${xz};animation:${outA} var(--transition-ms) var(--transition-ease,${ease}) both;}` +
141
+ `@keyframes ${inA}{${d.enter}}` +
142
+ `@keyframes ${outA}{${d.exit}}`;
143
+ if (d.enterRev || d.exitRev) {
144
+ const inR = `slk-${name}-in-rev`;
145
+ const outR = `slk-${name}-out-rev`;
146
+ css +=
147
+ `.sl-anim-${name}-in.sl-anim-rev{animation-name:${inR};}` +
148
+ `.sl-anim-${name}-out.sl-anim-rev{animation-name:${outR};}` +
149
+ `@keyframes ${inR}{${d.enterRev ?? d.enter}}` +
150
+ `@keyframes ${outR}{${d.exitRev ?? d.exit}}`;
151
+ }
152
+ return css;
153
+ }
154
+ /** CSS for a set of slide transitions (defaults to the built-in catalog). */
155
+ export function slideTransitionCss(defs = SLIDE_TRANSITIONS) {
156
+ return Object.entries(defs)
157
+ .map(([n, d]) => transitionRules(n, d))
158
+ .join('\n');
159
+ }
160
+ /** CSS for a set of entrances: per-effect hidden state (+ optional easing/duration vars). */
161
+ export function entranceCss(defs = ENTRANCES) {
162
+ return Object.entries(defs)
163
+ .map(([n, d]) => {
164
+ let css = `.sl-ent-${n}:not(.sl-shown){${d.hidden};}`;
165
+ const vars = [];
166
+ if (d.easing)
167
+ vars.push(`--sl-ent-ease:${d.easing}`);
168
+ if (d.durationMs !== undefined)
169
+ vars.push(`--sl-ent-dur:${d.durationMs}ms`);
170
+ if (vars.length)
171
+ css += `.sl-ent-${n}{${vars.join(';')};}`;
172
+ return css;
173
+ })
174
+ .join('\n');
175
+ }
176
+ /** Generic build machinery + reduced-motion / print guards. Emitted once. */
177
+ export function buildBaseCss() {
178
+ return [
179
+ `.sl-build{transition:opacity var(--sl-ent-dur,.35s) var(--sl-ent-ease,ease) var(--sl-ent-delay,0s),` +
180
+ `transform var(--sl-ent-dur,.35s) var(--sl-ent-ease,ease) var(--sl-ent-delay,0s),` +
181
+ `filter var(--sl-ent-dur,.35s) var(--sl-ent-ease,ease) var(--sl-ent-delay,0s);}`,
182
+ // bare `>>>` (no sl-ent-* class) keeps the classic fade-up
183
+ `.sl-build[data-build]:not(.sl-shown):not([class*="sl-ent-"]){opacity:0;transform:translateY(8px);}`,
184
+ `.sl-build.sl-shown{opacity:1;transform:none;filter:none;}`,
185
+ `@media print{.sl-build{opacity:1!important;transform:none!important;filter:none!important;}}`,
186
+ `@media (prefers-reduced-motion: reduce){.sl-slide,.sl-build{animation:none!important;transition:none!important;}}`,
187
+ ].join('\n');
188
+ }
189
+ /** Split a master `animations` map into slide-transition and entrance catalogs. */
190
+ export function masterAnimations(animations) {
191
+ const slides = {};
192
+ const entrances = {};
193
+ const warnings = [];
194
+ for (const [name, def] of Object.entries(animations ?? {})) {
195
+ const isEnt = def.entrance || (def.hidden !== undefined && def.in === undefined);
196
+ if (isEnt) {
197
+ if (def.hidden === undefined) {
198
+ warnings.push(`custom entrance "${name}" has no \`hidden\` state; ignored.`);
199
+ continue;
200
+ }
201
+ entrances[name] = { hidden: def.hidden, easing: def.ease, durationMs: def.duration };
202
+ }
203
+ else {
204
+ if (def.in === undefined || def.out === undefined) {
205
+ warnings.push(`custom transition "${name}" needs both \`in\` and \`out\` keyframes; ignored.`);
206
+ continue;
207
+ }
208
+ slides[name] = { enter: def.in, exit: def.out, easing: def.ease };
209
+ }
210
+ }
211
+ return { slides, entrances, warnings };
212
+ }
213
+ //# sourceMappingURL=anim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anim.js","sourceRoot":"","sources":["../../src/render/anim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { MERMAID_LIB_B64 } from './mermaid-lib.generated.js';
2
+ export { ECHART_LIB_B64 } from './echarts-lib.generated.js';
3
+ export declare const CHARTS_BOOT_JS: string;
@@ -0,0 +1,171 @@
1
+ // Copyright 2026 AIVory, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // Chart engines (Mermaid diagrams + ECharts data viz), inlined but LAZILY booted.
4
+ //
5
+ // Each engine's minified UMD bundle ships base64-encoded (see *-lib.generated.ts) and is
6
+ // placed by html.ts into an inert `<script type="text/plain">` tag — it is NOT parsed or
7
+ // executed on load. The small boot loader below decodes + evals a bundle the *first* time
8
+ // one of its charts needs rendering, then renders to inline SVG (themed from the deck's
9
+ // CSS vars). Both engines render in the browser, so the same path covers the web runtime
10
+ // and the headless-Chromium outputs (PNG/PDF/PPTX).
11
+ export { MERMAID_LIB_B64 } from './mermaid-lib.generated.js';
12
+ export { ECHART_LIB_B64 } from './echarts-lib.generated.js';
13
+ // Vanilla JS, no template literals inside (so it is safe in this String.raw block).
14
+ // Exposes window.__slaideCharts = { renderAll, renderIn } and sets
15
+ // window.__slaideChartsReady = true once renderAll settles (or immediately if the deck
16
+ // has no charts, so the exporters' waitForFunction never hangs).
17
+ export const CHARTS_BOOT_JS = String.raw `
18
+ (function(){
19
+ if(window.__slaideCharts) return;
20
+ var booted = {};
21
+ var idc = 0;
22
+
23
+ function cssVar(name, fallback){
24
+ var v = getComputedStyle(document.documentElement).getPropertyValue(name);
25
+ v = (v||'').trim();
26
+ return v || fallback;
27
+ }
28
+ function b64decode(b64){
29
+ var bin = atob((b64||'').trim());
30
+ var bytes = new Uint8Array(bin.length);
31
+ for(var i=0;i<bin.length;i++) bytes[i] = bin.charCodeAt(i);
32
+ return new TextDecoder('utf-8').decode(bytes);
33
+ }
34
+
35
+ // Eval an engine's vendored bundle exactly once, then configure its theme from the
36
+ // deck's CSS custom properties so charts come out on-brand automatically.
37
+ function ensure(engine){
38
+ if(booted[engine]) return booted[engine];
39
+ var tag = document.getElementById('sl-'+engine+'-lib');
40
+ if(!tag) return null;
41
+ try{ (0,eval)(b64decode(tag.textContent)); }
42
+ catch(e){ console.error('slaide: failed to boot '+engine, e); return null; }
43
+
44
+ if(engine==='mermaid' && window.mermaid){
45
+ var font = cssVar('--font-sans','system-ui');
46
+ window.mermaid.initialize({
47
+ startOnLoad:false, securityLevel:'strict', theme:'base', fontFamily:font,
48
+ themeVariables:{
49
+ background:'transparent',
50
+ primaryColor: cssVar('--color-surface', cssVar('--color-accent','#5B8CFF')),
51
+ primaryTextColor: cssVar('--color-text','#ffffff'),
52
+ primaryBorderColor: cssVar('--color-accent','#5B8CFF'),
53
+ lineColor: cssVar('--color-accent','#5B8CFF'),
54
+ secondaryColor: cssVar('--color-surface','#121A2B'),
55
+ tertiaryColor: cssVar('--color-surface','#121A2B'),
56
+ textColor: cssVar('--color-text','#ffffff'),
57
+ fontFamily: font
58
+ }
59
+ });
60
+ booted.mermaid = window.mermaid;
61
+ } else if(engine==='echart' && window.echarts){
62
+ var def = ['#5B8CFF','#A855F7','#2DD4BF','#34D399','#FB923C','#EC4899','#818CF8'];
63
+ var list = cssVar('--chart-colors','');
64
+ var colors = list ? list.split(',').map(function(s){return s.trim();}).filter(Boolean) : def;
65
+ var accent = cssVar('--color-accent','');
66
+ if(accent && colors.indexOf(accent)<0) colors = [accent].concat(colors);
67
+ var text = cssVar('--color-text','#ffffff');
68
+ var muted = cssVar('--color-muted','#8B93A7');
69
+ var font = cssVar('--font-sans','system-ui');
70
+ var axis = {
71
+ axisLine:{lineStyle:{color:muted}},
72
+ axisTick:{lineStyle:{color:muted}},
73
+ axisLabel:{color:muted},
74
+ splitLine:{lineStyle:{color:'rgba(127,127,127,0.18)'}}
75
+ };
76
+ window.echarts.registerTheme('slaide', {
77
+ color: colors, backgroundColor:'transparent',
78
+ textStyle:{ fontFamily:font, color:text },
79
+ title:{ textStyle:{ color:text } },
80
+ legend:{ textStyle:{ color:muted } },
81
+ categoryAxis: axis, valueAxis: axis, logAxis: axis, timeAxis: axis
82
+ });
83
+ booted.echart = window.echarts;
84
+ }
85
+ return booted[engine] || true;
86
+ }
87
+
88
+ function renderMermaid(el){
89
+ if(!ensure('mermaid')) return Promise.resolve();
90
+ var graph;
91
+ try{ graph = b64decode(el.getAttribute('data-graph')); }
92
+ catch(e){ return Promise.resolve(); }
93
+ el.setAttribute('data-rendered','1');
94
+ return window.mermaid.render('slm'+(idc++), graph).then(function(r){
95
+ el.innerHTML = r.svg;
96
+ }).catch(function(e){
97
+ el.removeAttribute('data-rendered');
98
+ el.innerHTML = '<pre style="white-space:pre-wrap;font-size:.6em;opacity:.7">'+String((e&&e.message)||e)+'</pre>';
99
+ });
100
+ }
101
+ function renderEchart(el){
102
+ if(!ensure('echart')) return Promise.resolve();
103
+ var opt;
104
+ try{ opt = JSON.parse(b64decode(el.getAttribute('data-option'))); }
105
+ catch(e){ return Promise.resolve(); }
106
+ var w = el.clientWidth||600, h = el.clientHeight;
107
+ if(!h){ h = Math.round(w*0.58); el.style.height = h+'px'; } // avoid 0-height collapse
108
+ el.setAttribute('data-rendered','1');
109
+ try{
110
+ var inst = window.echarts.init(el, 'slaide', { renderer:'svg', width:w, height:h });
111
+ // Slides are static stills captured to SVG/PNG/PDF; intro animation would otherwise
112
+ // be caught mid-grow (e.g. bars at ~68% height) by the export screenshot/print.
113
+ if(opt && opt.animation === undefined) opt.animation = false;
114
+ inst.setOption(opt);
115
+ el.__slEchart = inst;
116
+ // Add a viewBox but KEEP the intrinsic width/height attributes: the print/PDF
117
+ // rasterizer needs concrete dimensions (a percentage-sized SVG with no intrinsic
118
+ // size prints distorted), and the viewBox lets CSS max-width/height scale it cleanly.
119
+ var svg = el.querySelector('svg');
120
+ if(svg && !svg.getAttribute('viewBox')){
121
+ var wv = parseFloat(svg.getAttribute('width'))||w, hv = parseFloat(svg.getAttribute('height'))||h;
122
+ svg.setAttribute('viewBox','0 0 '+wv+' '+hv);
123
+ svg.setAttribute('preserveAspectRatio','xMidYMid meet');
124
+ }
125
+ }catch(e){ el.removeAttribute('data-rendered'); }
126
+ return Promise.resolve();
127
+ }
128
+ function renderEl(el){
129
+ if(el.getAttribute('data-rendered')) return Promise.resolve();
130
+ if(el.classList.contains('sl-mermaid')) return renderMermaid(el);
131
+ if(el.classList.contains('sl-echart')) return renderEchart(el);
132
+ return Promise.resolve();
133
+ }
134
+ function renderNodes(nodes){
135
+ var ps=[]; for(var i=0;i<nodes.length;i++) ps.push(renderEl(nodes[i]));
136
+ return Promise.all(ps);
137
+ }
138
+ function renderIn(root){
139
+ return renderNodes((root||document).querySelectorAll('.sl-chart:not([data-rendered])'));
140
+ }
141
+ function renderAll(){
142
+ return renderNodes(document.querySelectorAll('.sl-chart:not([data-rendered])')).then(function(){
143
+ window.__slaideChartsReady = true;
144
+ });
145
+ }
146
+
147
+ window.__slaideCharts = { renderAll:renderAll, renderIn:renderIn, renderEl:renderEl };
148
+
149
+ // Render the slide as it becomes active (lazy) — attached synchronously so the runtime's
150
+ // initial slaide:change (fired during parse, e.g. for a deep-linked chart slide) is caught.
151
+ document.addEventListener('slaide:change', function(e){
152
+ var slides = document.querySelectorAll('.sl-slide');
153
+ var idx = (e && e.detail) ? e.detail.index : -1;
154
+ if(idx>=0 && slides[idx]) renderIn(slides[idx]);
155
+ });
156
+
157
+ function start(){
158
+ if(!document.querySelector('.sl-chart')){ window.__slaideChartsReady = true; return; }
159
+ // print/PDF: every page is laid out at once and there is no navigation runtime.
160
+ if(document.body && document.body.classList.contains('sl-print')){ renderAll(); return; }
161
+ // web: render whatever slide is on screen right now; later slides render on navigation.
162
+ var active = document.querySelector('.sl-slide.sl-active') || document.querySelector('.sl-slide');
163
+ if(active) renderIn(active);
164
+ }
165
+ // Render on full load (not DOMContentLoaded): charts size to their slot, so the
166
+ // stylesheet + layout must be applied first or ECharts measures a wrong height.
167
+ if(document.readyState==='complete') start();
168
+ else window.addEventListener('load', start);
169
+ })();
170
+ `;
171
+ //# sourceMappingURL=charts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charts.js","sourceRoot":"","sources":["../../src/render/charts.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,sCAAsC;AACtC,kFAAkF;AAClF,EAAE;AACF,yFAAyF;AACzF,yFAAyF;AACzF,0FAA0F;AAC1F,wFAAwF;AACxF,yFAAyF;AACzF,oDAAoD;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,oFAAoF;AACpF,mEAAmE;AACnE,uFAAuF;AACvF,iEAAiE;AACjE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyJvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DeckIR } from '../types.js';
2
+ export declare function tokenCss(ir: DeckIR): string;
3
+ export declare const BASE_CSS: string;
@@ -0,0 +1,183 @@
1
+ import { buildBaseCss, entranceCss, slideTransitionCss } from './anim.js';
2
+ export function tokenCss(ir) {
3
+ const lines = Object.entries(ir.tokens).map(([k, v]) => ` ${k}: ${v};`);
4
+ return `:root{\n${lines.join('\n')}\n --canvas-w:${ir.canvas.width}px;\n --canvas-h:${ir.canvas.height}px;\n --transition-ms:${ir.transitions.duration}ms;\n}`;
5
+ }
6
+ const STATIC_CSS = `
7
+ *,*::before,*::after{box-sizing:border-box;}
8
+ html,body{margin:0;height:100%;}
9
+ body{
10
+ background:#0a0a0e;
11
+ font-family:var(--font-sans, system-ui, sans-serif);
12
+ color:var(--color-text,#eee);
13
+ overflow:hidden;
14
+ -webkit-font-smoothing:antialiased;
15
+ text-rendering:optimizeLegibility;
16
+ }
17
+ .sl-viewport{position:fixed;inset:0;overflow:hidden;background:#0a0a0e;}
18
+
19
+ /* thin, unobtrusive scrollbars wherever the deck scrolls (notes, code, help) */
20
+ *{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.22) transparent;}
21
+ ::-webkit-scrollbar{width:9px;height:9px;}
22
+ ::-webkit-scrollbar-track{background:transparent;}
23
+ ::-webkit-scrollbar-thumb{background:rgba(255,255,255,.2);border-radius:9px;border:2px solid transparent;background-clip:padding-box;}
24
+ ::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.34);background-clip:padding-box;}
25
+ ::-webkit-scrollbar-corner{background:transparent;}
26
+ .sl-stage{
27
+ position:absolute;
28
+ left:0;top:0;
29
+ width:var(--canvas-w);
30
+ height:var(--canvas-h);
31
+ transform-origin:0 0;
32
+ box-shadow:0 24px 80px -20px rgba(0,0,0,.6);
33
+ overflow:hidden;
34
+ }
35
+ /* Presentation default: a viewed/presented/exported deck is not text-selectable — dragging to
36
+ highlight slide text breaks the "this is a slideshow" feel. Unconditional + editor-token-free
37
+ so it covers OSS/non-editable/exported renders and keeps the paywall boundary clean; the Pro
38
+ editor's edit CSS re-enables selection on editable regions while editing. */
39
+ .sl-stage, .sl-stage *{
40
+ -webkit-user-select:none; user-select:none;
41
+ }
42
+
43
+ /* ---- slide + layers ---- */
44
+ .sl-slide{
45
+ position:absolute;inset:0;width:100%;height:100%;
46
+ background:var(--color-background,#111);
47
+ color:var(--color-text,#eee);
48
+ font-size:var(--type-base,22px);
49
+ line-height:1.5;
50
+ overflow:hidden;
51
+ visibility:hidden;
52
+ opacity:0;
53
+ }
54
+ .sl-slide.sl-active{visibility:visible;opacity:1;}
55
+ .sl-layer-bg{position:absolute;inset:0;z-index:0;}
56
+ .sl-layer-content{
57
+ position:absolute;inset:0;z-index:1;
58
+ display:grid;
59
+ width:100%;height:100%;
60
+ padding:var(--slide-padding,6%);
61
+ gap:var(--slide-gap,.8em);
62
+ align-content:start;
63
+ justify-items:stretch;
64
+ }
65
+ .sl-region{min-width:0;min-height:0;}
66
+
67
+ /* ---- free layer: absolutely positioned shapes/boxes ---- */
68
+ .sl-layer-free{position:absolute;inset:0;z-index:2;pointer-events:none;}
69
+ .sl-shape{position:absolute;box-sizing:border-box;}
70
+ .sl-shape[data-shape="text"]{display:flex;flex-direction:column;justify-content:center;overflow:hidden;outline:none;}
71
+
72
+ /* ---- typography ---- */
73
+ .sl-slide h1,.sl-slide h2,.sl-slide h3,.sl-slide h4{
74
+ font-family:var(--font-display,var(--font-sans));
75
+ font-weight:700;line-height:1.08;margin:0 0 .3em;color:var(--color-heading,var(--color-text));
76
+ letter-spacing:-0.01em;
77
+ }
78
+ .sl-slide h1{font-size:var(--size-h1,3em);}
79
+ .sl-slide h2{font-size:var(--size-h2,2.2em);}
80
+ .sl-slide h3{font-size:var(--size-h3,1.6em);}
81
+ .sl-slide h4{font-size:var(--size-h4,1.3em);}
82
+ .sl-slide p{margin:0 0 .6em;}
83
+ .sl-slide ul,.sl-slide ol{margin:.2em 0;padding-left:1.2em;}
84
+ .sl-slide li{margin:.35em 0;}
85
+ .sl-slide a{color:var(--color-link,var(--color-accent,#6cf));text-decoration:none;border-bottom:1px solid currentColor;}
86
+ .sl-slide strong{color:inherit;font-weight:700;}
87
+ .sl-slide code{font-family:var(--font-mono,ui-monospace,monospace);font-size:.9em;background:var(--code-inline-bg,rgba(127,127,127,.18));padding:.1em .35em;border-radius:4px;}
88
+ .sl-slide pre{font-family:var(--font-mono,ui-monospace,monospace);background:var(--code-bg,rgba(127,127,127,.12));color:var(--code-fg,inherit);padding:var(--code-pad,1.1em 1.3em);border-radius:var(--code-radius,12px);overflow:auto;font-size:.8em;line-height:1.55;box-shadow:var(--code-shadow,none);}
89
+ .sl-slide pre code{background:none;padding:0;color:inherit;}
90
+ .sl-slide blockquote{margin:0;padding-left:.8em;border-left:4px solid var(--color-accent,#6cf);font-style:italic;color:var(--color-muted,inherit);}
91
+ .sl-slide blockquote p{font-size:1.15em;}
92
+ .sl-img{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px;display:block;}
93
+
94
+ /* slot types */
95
+ .sl-slot-title{font-family:var(--font-display,inherit);font-weight:700;font-size:var(--size-h2,2.2em);line-height:1.08;letter-spacing:-0.01em;color:var(--color-heading,var(--color-text));}
96
+ .sl-slot-subtitle{font-size:var(--size-h3,1.4em);color:var(--color-muted,var(--color-accent));font-weight:400;}
97
+ .sl-slot-body{font-size:var(--size-body,var(--type-base));}
98
+ .sl-slot-image,.sl-slot-media{display:grid;place-items:center;height:100%;position:relative;}
99
+ .sl-slot-media .sl-img{width:100%;height:100%;object-fit:cover;border-radius:0;}
100
+ .sl-slot-quote{font-size:var(--size-h3);font-style:italic;}
101
+ .sl-slot-caption{font-size:var(--size-caption,.8em);color:var(--color-muted);}
102
+
103
+ /* ---- tables ---- */
104
+ .sl-slide table{border-collapse:collapse;width:100%;font-size:.82em;}
105
+ .sl-slide th{text-align:left;color:var(--color-muted);font-weight:600;padding:.45em .8em;border-bottom:1px solid color-mix(in srgb, currentColor 20%, transparent);}
106
+ .sl-slide td{padding:.6em .8em;border-bottom:1px solid color-mix(in srgb, currentColor 10%, transparent);vertical-align:top;}
107
+ .sl-slide tr:last-child td{border-bottom:none;}
108
+
109
+ /* ---- gradient text & image utilities ---- */
110
+ .sl-grad{background-image:var(--gradient-brand);-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;}
111
+ /* whole-slot gradient text fill (slot style: fill: <gradient>) */
112
+ .sl-region[style*="--region-fill"]{background-image:var(--region-fill);-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;}
113
+ .sl-img.round{border-radius:50%;object-fit:cover;aspect-ratio:1/1;}
114
+ .sl-img.cover{object-fit:cover;width:100%;height:100%;}
115
+ .sl-img.shadow{box-shadow:0 18px 50px -16px rgba(0,0,0,.6);}
116
+ .sl-img.right{float:right;margin:0 0 .6em 1.4em;}
117
+ .sl-img.left{float:left;margin:0 1.4em .6em 0;}
118
+ .sl-img.logo{display:inline-block;filter:brightness(0) invert(1);opacity:.82;vertical-align:middle;margin:0 .4em;}
119
+ .sl-img.logo-dark{filter:none;}
120
+ .sl-video{max-width:100%;max-height:100%;border-radius:8px;display:block;}
121
+ .sl-slot-media .sl-video{width:100%;height:100%;object-fit:cover;border-radius:0;}
122
+ .sl-audio{width:100%;margin:.4em 0;}
123
+ .sl-embed-wrap{position:relative;width:100%;height:100%;min-height:0;}
124
+ .sl-embed,.sl-widget{width:100%;height:100%;min-height:240px;border:0;border-radius:10px;background:transparent;display:block;}
125
+ .sl-embed-fallback{display:none;align-items:center;justify-content:center;height:100%;min-height:240px;border:1px dashed var(--color-muted,#888);border-radius:10px;color:var(--color-muted,#888);font-family:var(--font-sans,system-ui);}
126
+ @media print{.sl-embed,.sl-widget{display:none;} .sl-embed-fallback{display:flex;}}
127
+ /* inline svg follows the region's text-align (left/center) */
128
+ .sl-svg{display:block;}
129
+ .sl-svg svg{display:inline-block;vertical-align:middle;max-width:100%;max-height:100%;height:auto;}
130
+
131
+ /* ---- charts: mermaid diagrams + echarts data viz (rendered to inline SVG) ---- */
132
+ /* .sl-mermaid is a pre — the .sl-slide prefix outranks ".sl-slide pre" so the default
133
+ code-panel background/padding/radius is stripped and the chart reads as a figure. */
134
+ .sl-slide .sl-chart{display:flex;justify-content:center;align-items:center;width:100%;height:100%;
135
+ margin:0;background:none;padding:0;box-shadow:none;border-radius:0;overflow:visible;}
136
+ .sl-slide .sl-chart svg{max-width:100%;max-height:100%;height:auto;}
137
+ .sl-slide .sl-echart{display:block;}
138
+ @media print{.sl-chart{break-inside:avoid;}}
139
+
140
+ /* ---- chrome: header / footer / logo (overlay layer) ---- */
141
+ .sl-layer-chrome{position:absolute;inset:0;z-index:3;pointer-events:none;}
142
+ .sl-header,.sl-footer{position:absolute;left:0;right:0;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;
143
+ padding:0 var(--chrome-pad,6%);font-family:var(--font-sans,system-ui);font-size:var(--chrome-size,15px);color:var(--color-muted,#888);}
144
+ .sl-header{top:var(--chrome-top,4.4%);}
145
+ .sl-footer{bottom:var(--chrome-bottom,5%);font-size:var(--chrome-foot-size,17px);color:var(--color-text,#eee);}
146
+ .sl-footer .sl-band-c,.sl-footer .sl-band-r{font-size:var(--chrome-page-size,inherit);}
147
+ .sl-band-l{justify-self:start;text-align:left;}
148
+ .sl-band-c{justify-self:center;text-align:center;}
149
+ .sl-band-r{justify-self:end;text-align:right;}
150
+ .sl-footer .sl-band-r{color:var(--color-muted);}
151
+ .sl-header p,.sl-footer p{margin:0;display:inline;}
152
+ .sl-logo{position:absolute;color:var(--color-text,#fff);}
153
+ .sl-logo svg,.sl-logo img{height:var(--logo-h,30px);width:auto;display:block;}
154
+ .sl-logo-top-left{top:var(--chrome-top,4.4%);left:var(--chrome-pad,6%);}
155
+ .sl-logo-top-right{top:var(--chrome-top,4.4%);right:var(--chrome-pad,6%);}
156
+ .sl-logo-bottom-left{bottom:var(--chrome-bottom,5%);left:var(--chrome-pad,6%);}
157
+ .sl-logo-bottom-right{bottom:var(--chrome-bottom,5%);right:var(--chrome-pad,6%);}
158
+
159
+ /* ---- present-mode toggle (the web viewer's switch into fullscreen) ---- */
160
+ .sl-present-toggle{position:fixed;right:14px;top:12px;z-index:55;width:34px;height:34px;border:0;border-radius:9px;
161
+ background:rgba(0,0,0,.3);color:#fff;opacity:.26;cursor:pointer;font:16px/1 var(--font-sans,system-ui);
162
+ display:grid;place-items:center;backdrop-filter:blur(6px);transition:opacity .2s;}
163
+ .sl-present-toggle:hover{opacity:.85;}
164
+ body.sl-presenting .sl-present-toggle,body.sl-presenting .sl-counter{opacity:0;pointer-events:none;}
165
+ @media print{.sl-present-toggle{display:none;}}
166
+
167
+ /* ---- builds + transitions live in anim.ts (appended to BASE_CSS below) ---- */
168
+
169
+ /* ---- UI chrome ---- */
170
+ .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
+ .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
+ .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;}
174
+ .sl-notes.sl-open{display:block;}
175
+ .sl-help{position:fixed;inset:0;display:none;place-items:center;background:rgba(5,5,10,.82);z-index:70;}
176
+ .sl-help.sl-open{display:grid;}
177
+ .sl-help div{background:#16161f;color:#eee;padding:26px 30px;border-radius:14px;font:15px/1.9 var(--font-sans,system-ui);box-shadow:0 30px 80px -20px #000;}
178
+ .sl-help kbd{background:#2a2a38;border-radius:5px;padding:2px 7px;font-family:var(--font-mono,monospace);font-size:.85em;}
179
+ `;
180
+ // Builds + slide transitions are generated from the single-source catalog in anim.ts
181
+ // (so adding an effect is one catalog entry, not edits scattered across files).
182
+ export const BASE_CSS = STATIC_CSS + '\n' + buildBaseCss() + '\n' + entranceCss() + '\n' + slideTransitionCss();
183
+ //# sourceMappingURL=css.js.map
@@ -0,0 +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"}