@aigne/afs-ui 1.11.0-beta.12

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 (196) hide show
  1. package/LICENSE.md +26 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  4. package/dist/aup-protocol.cjs +235 -0
  5. package/dist/aup-protocol.d.cts +78 -0
  6. package/dist/aup-protocol.d.cts.map +1 -0
  7. package/dist/aup-protocol.d.mts +78 -0
  8. package/dist/aup-protocol.d.mts.map +1 -0
  9. package/dist/aup-protocol.mjs +235 -0
  10. package/dist/aup-protocol.mjs.map +1 -0
  11. package/dist/aup-registry.cjs +2489 -0
  12. package/dist/aup-registry.mjs +2487 -0
  13. package/dist/aup-registry.mjs.map +1 -0
  14. package/dist/aup-spec.cjs +1467 -0
  15. package/dist/aup-spec.mjs +1466 -0
  16. package/dist/aup-spec.mjs.map +1 -0
  17. package/dist/aup-types.cjs +165 -0
  18. package/dist/aup-types.d.cts +157 -0
  19. package/dist/aup-types.d.cts.map +1 -0
  20. package/dist/aup-types.d.mts +157 -0
  21. package/dist/aup-types.d.mts.map +1 -0
  22. package/dist/aup-types.mjs +157 -0
  23. package/dist/aup-types.mjs.map +1 -0
  24. package/dist/backend.cjs +14 -0
  25. package/dist/backend.d.cts +104 -0
  26. package/dist/backend.d.cts.map +1 -0
  27. package/dist/backend.d.mts +104 -0
  28. package/dist/backend.d.mts.map +1 -0
  29. package/dist/backend.mjs +13 -0
  30. package/dist/backend.mjs.map +1 -0
  31. package/dist/degradation.cjs +85 -0
  32. package/dist/degradation.d.cts +17 -0
  33. package/dist/degradation.d.cts.map +1 -0
  34. package/dist/degradation.d.mts +17 -0
  35. package/dist/degradation.d.mts.map +1 -0
  36. package/dist/degradation.mjs +84 -0
  37. package/dist/degradation.mjs.map +1 -0
  38. package/dist/index.cjs +36 -0
  39. package/dist/index.d.cts +12 -0
  40. package/dist/index.d.mts +12 -0
  41. package/dist/index.mjs +13 -0
  42. package/dist/runtime.cjs +117 -0
  43. package/dist/runtime.d.cts +59 -0
  44. package/dist/runtime.d.cts.map +1 -0
  45. package/dist/runtime.d.mts +59 -0
  46. package/dist/runtime.d.mts.map +1 -0
  47. package/dist/runtime.mjs +118 -0
  48. package/dist/runtime.mjs.map +1 -0
  49. package/dist/session.cjs +159 -0
  50. package/dist/session.d.cts +80 -0
  51. package/dist/session.d.cts.map +1 -0
  52. package/dist/session.d.mts +80 -0
  53. package/dist/session.d.mts.map +1 -0
  54. package/dist/session.mjs +159 -0
  55. package/dist/session.mjs.map +1 -0
  56. package/dist/snapshot.cjs +162 -0
  57. package/dist/snapshot.mjs +163 -0
  58. package/dist/snapshot.mjs.map +1 -0
  59. package/dist/term-page.cjs +264 -0
  60. package/dist/term-page.mjs +264 -0
  61. package/dist/term-page.mjs.map +1 -0
  62. package/dist/term.cjs +295 -0
  63. package/dist/term.d.cts +84 -0
  64. package/dist/term.d.cts.map +1 -0
  65. package/dist/term.d.mts +84 -0
  66. package/dist/term.d.mts.map +1 -0
  67. package/dist/term.mjs +296 -0
  68. package/dist/term.mjs.map +1 -0
  69. package/dist/tty.cjs +136 -0
  70. package/dist/tty.d.cts +53 -0
  71. package/dist/tty.d.cts.map +1 -0
  72. package/dist/tty.d.mts +53 -0
  73. package/dist/tty.d.mts.map +1 -0
  74. package/dist/tty.mjs +135 -0
  75. package/dist/tty.mjs.map +1 -0
  76. package/dist/ui-provider.cjs +4615 -0
  77. package/dist/ui-provider.d.cts +307 -0
  78. package/dist/ui-provider.d.cts.map +1 -0
  79. package/dist/ui-provider.d.mts +307 -0
  80. package/dist/ui-provider.d.mts.map +1 -0
  81. package/dist/ui-provider.mjs +4616 -0
  82. package/dist/ui-provider.mjs.map +1 -0
  83. package/dist/web-page/core.cjs +1388 -0
  84. package/dist/web-page/core.mjs +1387 -0
  85. package/dist/web-page/core.mjs.map +1 -0
  86. package/dist/web-page/css.cjs +1699 -0
  87. package/dist/web-page/css.mjs +1698 -0
  88. package/dist/web-page/css.mjs.map +1 -0
  89. package/dist/web-page/icons.cjs +248 -0
  90. package/dist/web-page/icons.mjs +248 -0
  91. package/dist/web-page/icons.mjs.map +1 -0
  92. package/dist/web-page/overlay-themes.cjs +514 -0
  93. package/dist/web-page/overlay-themes.mjs +513 -0
  94. package/dist/web-page/overlay-themes.mjs.map +1 -0
  95. package/dist/web-page/renderers/action.cjs +72 -0
  96. package/dist/web-page/renderers/action.mjs +72 -0
  97. package/dist/web-page/renderers/action.mjs.map +1 -0
  98. package/dist/web-page/renderers/broadcast.cjs +160 -0
  99. package/dist/web-page/renderers/broadcast.mjs +160 -0
  100. package/dist/web-page/renderers/broadcast.mjs.map +1 -0
  101. package/dist/web-page/renderers/calendar.cjs +137 -0
  102. package/dist/web-page/renderers/calendar.mjs +137 -0
  103. package/dist/web-page/renderers/calendar.mjs.map +1 -0
  104. package/dist/web-page/renderers/canvas.cjs +173 -0
  105. package/dist/web-page/renderers/canvas.mjs +173 -0
  106. package/dist/web-page/renderers/canvas.mjs.map +1 -0
  107. package/dist/web-page/renderers/cdn-loader.cjs +25 -0
  108. package/dist/web-page/renderers/cdn-loader.mjs +25 -0
  109. package/dist/web-page/renderers/cdn-loader.mjs.map +1 -0
  110. package/dist/web-page/renderers/chart.cjs +101 -0
  111. package/dist/web-page/renderers/chart.mjs +101 -0
  112. package/dist/web-page/renderers/chart.mjs.map +1 -0
  113. package/dist/web-page/renderers/deck.cjs +390 -0
  114. package/dist/web-page/renderers/deck.mjs +390 -0
  115. package/dist/web-page/renderers/deck.mjs.map +1 -0
  116. package/dist/web-page/renderers/device.cjs +1015 -0
  117. package/dist/web-page/renderers/device.mjs +1015 -0
  118. package/dist/web-page/renderers/device.mjs.map +1 -0
  119. package/dist/web-page/renderers/editor.cjs +127 -0
  120. package/dist/web-page/renderers/editor.mjs +127 -0
  121. package/dist/web-page/renderers/editor.mjs.map +1 -0
  122. package/dist/web-page/renderers/finance-chart.cjs +178 -0
  123. package/dist/web-page/renderers/finance-chart.mjs +178 -0
  124. package/dist/web-page/renderers/finance-chart.mjs.map +1 -0
  125. package/dist/web-page/renderers/frame.cjs +274 -0
  126. package/dist/web-page/renderers/frame.mjs +274 -0
  127. package/dist/web-page/renderers/frame.mjs.map +1 -0
  128. package/dist/web-page/renderers/globe.cjs +119 -0
  129. package/dist/web-page/renderers/globe.mjs +119 -0
  130. package/dist/web-page/renderers/globe.mjs.map +1 -0
  131. package/dist/web-page/renderers/input.cjs +137 -0
  132. package/dist/web-page/renderers/input.mjs +137 -0
  133. package/dist/web-page/renderers/input.mjs.map +1 -0
  134. package/dist/web-page/renderers/list.cjs +1243 -0
  135. package/dist/web-page/renderers/list.mjs +1243 -0
  136. package/dist/web-page/renderers/list.mjs.map +1 -0
  137. package/dist/web-page/renderers/map.cjs +126 -0
  138. package/dist/web-page/renderers/map.mjs +126 -0
  139. package/dist/web-page/renderers/map.mjs.map +1 -0
  140. package/dist/web-page/renderers/media.cjs +106 -0
  141. package/dist/web-page/renderers/media.mjs +106 -0
  142. package/dist/web-page/renderers/media.mjs.map +1 -0
  143. package/dist/web-page/renderers/moonphase.cjs +105 -0
  144. package/dist/web-page/renderers/moonphase.mjs +105 -0
  145. package/dist/web-page/renderers/moonphase.mjs.map +1 -0
  146. package/dist/web-page/renderers/natal-chart.cjs +222 -0
  147. package/dist/web-page/renderers/natal-chart.mjs +222 -0
  148. package/dist/web-page/renderers/natal-chart.mjs.map +1 -0
  149. package/dist/web-page/renderers/overlay.cjs +531 -0
  150. package/dist/web-page/renderers/overlay.mjs +531 -0
  151. package/dist/web-page/renderers/overlay.mjs.map +1 -0
  152. package/dist/web-page/renderers/table.cjs +74 -0
  153. package/dist/web-page/renderers/table.mjs +74 -0
  154. package/dist/web-page/renderers/table.mjs.map +1 -0
  155. package/dist/web-page/renderers/terminal.cjs +30 -0
  156. package/dist/web-page/renderers/terminal.mjs +30 -0
  157. package/dist/web-page/renderers/terminal.mjs.map +1 -0
  158. package/dist/web-page/renderers/text.cjs +109 -0
  159. package/dist/web-page/renderers/text.mjs +109 -0
  160. package/dist/web-page/renderers/text.mjs.map +1 -0
  161. package/dist/web-page/renderers/ticker.cjs +133 -0
  162. package/dist/web-page/renderers/ticker.mjs +133 -0
  163. package/dist/web-page/renderers/ticker.mjs.map +1 -0
  164. package/dist/web-page/renderers/time.cjs +69 -0
  165. package/dist/web-page/renderers/time.mjs +69 -0
  166. package/dist/web-page/renderers/time.mjs.map +1 -0
  167. package/dist/web-page/renderers/unknown.cjs +20 -0
  168. package/dist/web-page/renderers/unknown.mjs +20 -0
  169. package/dist/web-page/renderers/unknown.mjs.map +1 -0
  170. package/dist/web-page/renderers/view.cjs +161 -0
  171. package/dist/web-page/renderers/view.mjs +161 -0
  172. package/dist/web-page/renderers/view.mjs.map +1 -0
  173. package/dist/web-page/renderers/wm.cjs +669 -0
  174. package/dist/web-page/renderers/wm.mjs +669 -0
  175. package/dist/web-page/renderers/wm.mjs.map +1 -0
  176. package/dist/web-page/skeleton.cjs +103 -0
  177. package/dist/web-page/skeleton.mjs +103 -0
  178. package/dist/web-page/skeleton.mjs.map +1 -0
  179. package/dist/web-page.cjs +114 -0
  180. package/dist/web-page.d.cts +19 -0
  181. package/dist/web-page.d.cts.map +1 -0
  182. package/dist/web-page.d.mts +19 -0
  183. package/dist/web-page.d.mts.map +1 -0
  184. package/dist/web-page.mjs +115 -0
  185. package/dist/web-page.mjs.map +1 -0
  186. package/dist/web.cjs +827 -0
  187. package/dist/web.d.cts +144 -0
  188. package/dist/web.d.cts.map +1 -0
  189. package/dist/web.d.mts +144 -0
  190. package/dist/web.d.mts.map +1 -0
  191. package/dist/web.mjs +828 -0
  192. package/dist/web.mjs.map +1 -0
  193. package/dist/wm-state.cjs +172 -0
  194. package/dist/wm-state.mjs +171 -0
  195. package/dist/wm-state.mjs.map +1 -0
  196. package/package.json +59 -0
@@ -0,0 +1,390 @@
1
+ //#region src/web-page/renderers/deck.ts
2
+ const DECK_JS = `
3
+ // ── Design presets ──
4
+ var _DECK_PRESETS = {
5
+ "tech-dark": {
6
+ fonts: { heading: "Sora", body: "DM Sans", mono: "JetBrains Mono" },
7
+ colors: { bg: "#0a0a0a", surface: "#141414", text: "#ffffff", accent: "#6366f1", accentGlow: "rgba(99,102,241,0.4)", muted: "#71717a", gradient: "linear-gradient(135deg, #0f0f23, #1a1a3e, #0f0f23)" },
8
+ effects: { slideBackground: "grid", headingStyle: "gradient-text", cardStyle: "glass" },
9
+ spacing: { slidePadding: "60px 80px", gap: 32, headingSize: "3.5rem" }
10
+ },
11
+ "corporate-clean": {
12
+ fonts: { heading: "Manrope", body: "DM Sans", mono: "JetBrains Mono" },
13
+ colors: { bg: "#ffffff", surface: "#f8fafc", text: "#0f172a", accent: "#2563eb", accentGlow: "rgba(37,99,235,0.2)", muted: "#64748b", gradient: "none" },
14
+ effects: { slideBackground: "solid", headingStyle: "plain", cardStyle: "flat" },
15
+ spacing: { slidePadding: "60px 80px", gap: 32, headingSize: "3rem" }
16
+ },
17
+ "keynote-dark": {
18
+ fonts: { heading: "Outfit", body: "DM Sans", mono: "JetBrains Mono" },
19
+ colors: { bg: "#000000", surface: "#111111", text: "#ffffff", accent: "#3b82f6", accentGlow: "rgba(59,130,246,0.3)", muted: "#9ca3af", gradient: "radial-gradient(ellipse at center, #111 0%, #000 70%)" },
20
+ effects: { slideBackground: "spotlight", headingStyle: "plain", cardStyle: "floating" },
21
+ spacing: { slidePadding: "80px 100px", gap: 40, headingSize: "4rem" }
22
+ },
23
+ "gradient-dream": {
24
+ fonts: { heading: "Outfit", body: "DM Sans", mono: "JetBrains Mono" },
25
+ colors: { bg: "#0c0015", surface: "#1a0030", text: "#f8f0ff", accent: "#c084fc", accentGlow: "rgba(192,132,252,0.4)", muted: "#a78bfa", gradient: "linear-gradient(135deg, #0c0015, #1a0030, #2d1b69)" },
26
+ effects: { slideBackground: "aurora", headingStyle: "glow", cardStyle: "glass" },
27
+ spacing: { slidePadding: "60px 80px", gap: 32, headingSize: "3.5rem" }
28
+ },
29
+ "neon-night": {
30
+ fonts: { heading: "Sora", body: "DM Sans", mono: "Share Tech Mono" },
31
+ colors: { bg: "#000000", surface: "#0a0a0a", text: "#e0ffe0", accent: "#22d3ee", accentGlow: "rgba(34,211,238,0.4)", muted: "#4ade80", gradient: "linear-gradient(180deg, #000, #001a1a)" },
32
+ effects: { slideBackground: "noise", headingStyle: "glow", cardStyle: "neon" },
33
+ spacing: { slidePadding: "60px 80px", gap: 32, headingSize: "3.5rem" }
34
+ },
35
+ "warm-earth": {
36
+ fonts: { heading: "DM Serif Display", body: "DM Sans", mono: "JetBrains Mono" },
37
+ colors: { bg: "#faf7f2", surface: "#f0ebe3", text: "#2c1810", accent: "#b45309", accentGlow: "rgba(180,83,9,0.2)", muted: "#78716c", gradient: "none" },
38
+ effects: { slideBackground: "noise", headingStyle: "plain", cardStyle: "flat" },
39
+ spacing: { slidePadding: "60px 80px", gap: 32, headingSize: "3rem" }
40
+ },
41
+ "retro-terminal": {
42
+ fonts: { heading: "Space Mono", body: "Space Mono", mono: "Space Mono" },
43
+ colors: { bg: "#0a0a0a", surface: "#111111", text: "#33ff33", accent: "#33ff33", accentGlow: "rgba(51,255,51,0.3)", muted: "#1a8f1a", gradient: "none" },
44
+ effects: { slideBackground: "grid", headingStyle: "glow", cardStyle: "bordered" },
45
+ spacing: { slidePadding: "40px 60px", gap: 24, headingSize: "2.5rem" }
46
+ },
47
+ "frosted-glass": {
48
+ fonts: { heading: "Outfit", body: "DM Sans", mono: "JetBrains Mono" },
49
+ colors: { bg: "#0f172a", surface: "#1e293b", text: "#f1f5f9", accent: "#818cf8", accentGlow: "rgba(129,140,248,0.3)", muted: "#94a3b8", gradient: "linear-gradient(135deg, #0f172a, #1e1b4b, #0f172a)" },
50
+ effects: { slideBackground: "aurora", headingStyle: "gradient-text", cardStyle: "glass" },
51
+ spacing: { slidePadding: "60px 80px", gap: 32, headingSize: "3.5rem" }
52
+ },
53
+ "brutalist": {
54
+ fonts: { heading: "Instrument Serif", body: "DM Sans", mono: "Space Mono" },
55
+ colors: { bg: "#fffff0", surface: "#f5f5dc", text: "#000000", accent: "#dc2626", accentGlow: "rgba(220,38,38,0.2)", muted: "#525252", gradient: "none" },
56
+ effects: { slideBackground: "solid", headingStyle: "plain", cardStyle: "bordered" },
57
+ spacing: { slidePadding: "60px 80px", gap: 32, headingSize: "4rem" }
58
+ }
59
+ };
60
+
61
+ // ── Token sanitization ──
62
+ function _sanitizeDeckToken(value) {
63
+ if (typeof value !== "string") return value;
64
+ return value.replace(/[;{}]/g, "").replace(/expression\\s*\\(/gi, "").replace(/javascript\\s*:/gi, "").replace(/url\\s*\\(/gi, "blocked(");
65
+ }
66
+
67
+ // ── CSS generation from design tokens ──
68
+ function _buildDeckTokenCSS(design) {
69
+ if (!design) return "";
70
+ var c = design.colors || {};
71
+ var f = design.fonts || {};
72
+ var s = design.spacing || {};
73
+ var lines = [":host {"];
74
+ if (c.bg) lines.push(" --deck-bg: " + _sanitizeDeckToken(c.bg) + ";");
75
+ if (c.surface) lines.push(" --deck-surface: " + _sanitizeDeckToken(c.surface) + ";");
76
+ if (c.text) lines.push(" --deck-text: " + _sanitizeDeckToken(c.text) + ";");
77
+ if (c.accent) lines.push(" --deck-accent: " + _sanitizeDeckToken(c.accent) + ";");
78
+ if (c.accentGlow) lines.push(" --deck-accent-glow: " + _sanitizeDeckToken(c.accentGlow) + ";");
79
+ if (c.muted) lines.push(" --deck-muted: " + _sanitizeDeckToken(c.muted) + ";");
80
+ if (c.gradient) lines.push(" --deck-gradient: " + _sanitizeDeckToken(c.gradient) + ";");
81
+ if (f.heading) lines.push(" --deck-font-heading: " + _sanitizeDeckToken(f.heading) + ";");
82
+ if (f.body) lines.push(" --deck-font-body: " + _sanitizeDeckToken(f.body) + ";");
83
+ if (f.mono) lines.push(" --deck-font-mono: " + _sanitizeDeckToken(f.mono) + ";");
84
+ if (s.slidePadding) lines.push(" --deck-slide-padding: " + _sanitizeDeckToken(s.slidePadding) + ";");
85
+ if (s.headingSize) lines.push(" --deck-heading-size: " + _sanitizeDeckToken(s.headingSize) + ";");
86
+ if (s.gap) lines.push(" --deck-gap: " + (parseInt(s.gap) || 32) + "px;");
87
+ lines.push("}");
88
+ return lines.join("\\n");
89
+ }
90
+
91
+ // ── Allowed font URL origins ──
92
+ var _FONT_URL_WHITELIST = ["fonts.googleapis.com", "fonts.gstatic.com", "use.typekit.net", "cdnjs.cloudflare.com"];
93
+ function _isSafeFontURL(url) {
94
+ try {
95
+ var u = new URL(url);
96
+ return _FONT_URL_WHITELIST.some(function(h) { return u.hostname === h || u.hostname.endsWith("." + h); });
97
+ } catch(e) { return false; }
98
+ }
99
+
100
+ function renderAupDeck(node) {
101
+ var p = node.props || {};
102
+ var s = node.state || {};
103
+ var transition = p.transition || "fade";
104
+ var transitionDuration = p.transitionDuration || 600;
105
+ var autoPlay = !!p.autoPlay;
106
+ var autoPlayInterval = p.autoPlayInterval || 5000;
107
+ var loop = !!p.loop;
108
+ var showControls = p.showControls !== false;
109
+ var showProgress = p.showProgress !== false;
110
+ var keyboard = p.keyboard !== false;
111
+ var aspectRatio = p.aspectRatio || "auto";
112
+ var presentation = !!p.presentation;
113
+ var slides = node.children || [];
114
+ var total = slides.length;
115
+ var current = Math.max(0, Math.min(parseInt(s.current) || 0, total - 1));
116
+ var autoTimer = null;
117
+
118
+ // ── Resolve design tokens ──
119
+ var preset = p.designPreset ? _DECK_PRESETS[p.designPreset] : null;
120
+ var design = {};
121
+ if (preset) {
122
+ design.fonts = Object.assign({}, preset.fonts);
123
+ design.colors = Object.assign({}, preset.colors);
124
+ design.effects = Object.assign({}, preset.effects);
125
+ design.spacing = Object.assign({}, preset.spacing);
126
+ }
127
+ if (p.design) {
128
+ if (p.design.fonts) design.fonts = Object.assign(design.fonts || {}, p.design.fonts);
129
+ if (p.design.colors) design.colors = Object.assign(design.colors || {}, p.design.colors);
130
+ if (p.design.effects) design.effects = Object.assign(design.effects || {}, p.design.effects);
131
+ if (p.design.spacing) design.spacing = Object.assign(design.spacing || {}, p.design.spacing);
132
+ }
133
+ var effects = (design && design.effects) || {};
134
+
135
+ // ── Shadow DOM host ──
136
+ var host = document.createElement("div");
137
+ host.className = "aup-deck-host";
138
+ host.style.width = "100%";
139
+ var shadow = host.attachShadow({ mode: "open" });
140
+
141
+ // 1. Clone main page CSS into shadow (so child primitives render correctly)
142
+ var mainStyle = document.querySelector("head > style");
143
+ if (mainStyle) {
144
+ var clonedStyle = document.createElement("style");
145
+ clonedStyle.textContent = mainStyle.textContent;
146
+ shadow.appendChild(clonedStyle);
147
+ }
148
+
149
+ // 2. Inject deck shadow CSS (from DECK_SHADOW_CSS constant embedded at build time)
150
+ var deckStyle = document.createElement("style");
151
+ deckStyle.textContent = _DECK_SHADOW_CSS;
152
+ shadow.appendChild(deckStyle);
153
+
154
+ // 3. Inject design token CSS
155
+ if (design && (design.colors || design.fonts || design.spacing)) {
156
+ var tokenStyle = document.createElement("style");
157
+ tokenStyle.textContent = _buildDeckTokenCSS(design);
158
+ shadow.appendChild(tokenStyle);
159
+ }
160
+
161
+ // 4. Load font URLs
162
+ var fontUrls = (design.fonts && design.fonts.urls) || [];
163
+ for (var fi = 0; fi < fontUrls.length; fi++) {
164
+ if (_isSafeFontURL(fontUrls[fi])) {
165
+ var link = document.createElement("link");
166
+ link.rel = "stylesheet";
167
+ link.href = fontUrls[fi];
168
+ shadow.appendChild(link);
169
+ }
170
+ }
171
+
172
+ // ── Build deck inside shadow ──
173
+ var el = document.createElement("div");
174
+ el.className = "aup-deck";
175
+ el.setAttribute("data-transition", transition);
176
+ el.style.setProperty("--deck-transition-duration", transitionDuration + "ms");
177
+
178
+ if (presentation) {
179
+ el.setAttribute("data-presentation", "true");
180
+ host.style.height = "100vh";
181
+ el.style.height = "100%";
182
+ }
183
+ if (aspectRatio === "16:9") el.setAttribute("data-aspect", "16-9");
184
+ else if (aspectRatio === "4:3") el.setAttribute("data-aspect", "4-3");
185
+
186
+ // Slide background effect
187
+ if (effects.slideBackground && effects.slideBackground !== "solid") {
188
+ el.setAttribute("data-slide-bg", effects.slideBackground);
189
+ }
190
+
191
+ // Heading style class
192
+ if (effects.headingStyle === "gradient-text") el.classList.add("deck-heading-gradient");
193
+ else if (effects.headingStyle === "glow") el.classList.add("deck-heading-glow");
194
+
195
+ // Card style class
196
+ if (effects.cardStyle === "glass") el.classList.add("deck-card-glass");
197
+ else if (effects.cardStyle === "neon") el.classList.add("deck-card-neon");
198
+ else if (effects.cardStyle === "bordered") el.classList.add("deck-card-bordered");
199
+
200
+ // ── Viewport ──
201
+ var viewport = document.createElement("div");
202
+ viewport.className = "aup-deck-viewport";
203
+
204
+ for (var i = 0; i < total; i++) {
205
+ var slideEl = document.createElement("div");
206
+ slideEl.className = "aup-deck-slide";
207
+ if (i === current) slideEl.classList.add("active");
208
+ var childEl = renderAupNode(slides[i]);
209
+ if (childEl) slideEl.appendChild(childEl);
210
+ viewport.appendChild(slideEl);
211
+ }
212
+ el.appendChild(viewport);
213
+
214
+ // ── Controls ──
215
+ if (showControls && total > 1) {
216
+ var controls = document.createElement("div");
217
+ controls.className = "aup-deck-controls";
218
+ var prevBtn = document.createElement("button");
219
+ prevBtn.className = "aup-deck-prev";
220
+ prevBtn.innerHTML = _ICON_PATHS["arrow-left"] ?
221
+ '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' + _ICON_PATHS["arrow-left"] + '</svg>' :
222
+ '&#8592;';
223
+ prevBtn.onclick = function(e) { e.stopPropagation(); goTo(current - 1); };
224
+ controls.appendChild(prevBtn);
225
+
226
+ var nextBtn = document.createElement("button");
227
+ nextBtn.className = "aup-deck-next";
228
+ nextBtn.innerHTML = _ICON_PATHS["arrow-right"] ?
229
+ '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' + _ICON_PATHS["arrow-right"] + '</svg>' :
230
+ '&#8594;';
231
+ nextBtn.onclick = function(e) { e.stopPropagation(); goTo(current + 1); };
232
+ controls.appendChild(nextBtn);
233
+ el.appendChild(controls);
234
+
235
+ // ── Dots ──
236
+ var dots = document.createElement("div");
237
+ dots.className = "aup-deck-dots";
238
+ for (var d = 0; d < total; d++) {
239
+ (function(idx) {
240
+ var dot = document.createElement("button");
241
+ dot.className = "aup-deck-dot" + (idx === current ? " active" : "");
242
+ dot.onclick = function(e) { e.stopPropagation(); goTo(idx); };
243
+ dots.appendChild(dot);
244
+ })(d);
245
+ }
246
+ el.appendChild(dots);
247
+ }
248
+
249
+ // ── Progress bar ──
250
+ if (showProgress && total > 1) {
251
+ var progressBar = document.createElement("div");
252
+ progressBar.className = "aup-deck-progress";
253
+ var progressFill = document.createElement("div");
254
+ progressFill.className = "aup-deck-progress-fill";
255
+ progressFill.style.width = ((current + 1) / total * 100) + "%";
256
+ progressBar.appendChild(progressFill);
257
+ el.appendChild(progressBar);
258
+ }
259
+
260
+ shadow.appendChild(el);
261
+
262
+ // ── Navigation logic ──
263
+ function goTo(idx) {
264
+ if (total === 0) return;
265
+ var prev = current;
266
+ if (idx < 0) { idx = loop ? total - 1 : 0; }
267
+ if (idx >= total) {
268
+ if (loop) { idx = 0; }
269
+ else {
270
+ emitDeckEvent(node, "complete", { current: current, total: total });
271
+ return;
272
+ }
273
+ }
274
+ if (idx === current) return;
275
+ current = idx;
276
+ updateSlides(prev);
277
+ emitDeckEvent(node, "change", { current: current, previous: prev });
278
+ resetAutoPlay();
279
+ }
280
+
281
+ function updateSlides(prev) {
282
+ var slideEls = viewport.children;
283
+ for (var j = 0; j < slideEls.length; j++) {
284
+ var sEl = slideEls[j];
285
+ sEl.classList.remove("active", "prev", "entering");
286
+ if (j === current) {
287
+ sEl.classList.add("active", "entering");
288
+ triggerSlideAnimations(sEl);
289
+ } else if (j === prev) {
290
+ sEl.classList.add("prev");
291
+ }
292
+ }
293
+ setTimeout(function() {
294
+ var active = viewport.children[current];
295
+ if (active) active.classList.remove("entering");
296
+ }, transitionDuration);
297
+
298
+ // Update dots
299
+ var dotEls = el.querySelectorAll(".aup-deck-dot");
300
+ for (var k = 0; k < dotEls.length; k++) {
301
+ dotEls[k].classList.toggle("active", k === current);
302
+ }
303
+ // Update progress
304
+ var fill = el.querySelector(".aup-deck-progress-fill");
305
+ if (fill) fill.style.width = ((current + 1) / total * 100) + "%";
306
+ }
307
+
308
+ function triggerSlideAnimations(slideEl) {
309
+ var animatedEls = slideEl.querySelectorAll("[data-animate]");
310
+ for (var a = 0; a < animatedEls.length; a++) {
311
+ var ae = animatedEls[a];
312
+ ae.classList.remove("aup-animated");
313
+ void ae.offsetWidth;
314
+ ae.classList.add("aup-animated");
315
+ }
316
+ // Also trigger count-up for elements inside shadow
317
+ var countEls = slideEl.querySelectorAll('[data-animate="count-up"]');
318
+ for (var cu = 0; cu < countEls.length; cu++) {
319
+ _startCountUp(countEls[cu]);
320
+ }
321
+ }
322
+
323
+ // Trigger animations on the initial slide
324
+ setTimeout(function() {
325
+ var activeSlide = viewport.children[current];
326
+ if (activeSlide) triggerSlideAnimations(activeSlide);
327
+ }, 100);
328
+
329
+ function emitDeckEvent(n, eventName, detail) {
330
+ if (!n.events || !n.events[eventName]) return;
331
+ var ev = n.events[eventName];
332
+ if (ev.exec && ws && ws.readyState === 1) {
333
+ ws.send(JSON.stringify({
334
+ type: "aup_event",
335
+ nodeId: n.id,
336
+ event: eventName,
337
+ payload: Object.assign({}, ev.args || {}, detail)
338
+ }));
339
+ }
340
+ }
341
+
342
+ // ── AutoPlay ──
343
+ function resetAutoPlay() {
344
+ if (autoTimer) clearInterval(autoTimer);
345
+ if (autoPlay && total > 1) {
346
+ autoTimer = setInterval(function() { goTo(current + 1); }, autoPlayInterval);
347
+ }
348
+ }
349
+ resetAutoPlay();
350
+
351
+ // Pause on hover
352
+ host.onmouseenter = function() { if (autoTimer) clearInterval(autoTimer); };
353
+ host.onmouseleave = function() { resetAutoPlay(); };
354
+
355
+ // ── Keyboard (on host, delegates into shadow) ──
356
+ if (keyboard) {
357
+ host.setAttribute("tabindex", "0");
358
+ host.style.outline = "none";
359
+ host.onkeydown = function(e) {
360
+ switch (e.key) {
361
+ case "ArrowRight": case "ArrowDown": case " ":
362
+ e.preventDefault(); goTo(current + 1); break;
363
+ case "ArrowLeft": case "ArrowUp":
364
+ e.preventDefault(); goTo(current - 1); break;
365
+ case "f": case "F":
366
+ e.preventDefault();
367
+ if (document.fullscreenElement) document.exitFullscreen();
368
+ else el.requestFullscreen && el.requestFullscreen();
369
+ break;
370
+ case "Escape":
371
+ if (document.fullscreenElement) document.exitFullscreen();
372
+ break;
373
+ default:
374
+ var num = parseInt(e.key);
375
+ if (num >= 1 && num <= 9 && num <= total) {
376
+ e.preventDefault();
377
+ goTo(num - 1);
378
+ }
379
+ }
380
+ };
381
+ }
382
+
383
+ return host;
384
+ }
385
+
386
+ `;
387
+
388
+ //#endregion
389
+ export { DECK_JS };
390
+ //# sourceMappingURL=deck.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck.mjs","names":[],"sources":["../../../src/web-page/renderers/deck.ts"],"sourcesContent":["export const DECK_JS = `\n // ── Design presets ──\n var _DECK_PRESETS = {\n \"tech-dark\": {\n fonts: { heading: \"Sora\", body: \"DM Sans\", mono: \"JetBrains Mono\" },\n colors: { bg: \"#0a0a0a\", surface: \"#141414\", text: \"#ffffff\", accent: \"#6366f1\", accentGlow: \"rgba(99,102,241,0.4)\", muted: \"#71717a\", gradient: \"linear-gradient(135deg, #0f0f23, #1a1a3e, #0f0f23)\" },\n effects: { slideBackground: \"grid\", headingStyle: \"gradient-text\", cardStyle: \"glass\" },\n spacing: { slidePadding: \"60px 80px\", gap: 32, headingSize: \"3.5rem\" }\n },\n \"corporate-clean\": {\n fonts: { heading: \"Manrope\", body: \"DM Sans\", mono: \"JetBrains Mono\" },\n colors: { bg: \"#ffffff\", surface: \"#f8fafc\", text: \"#0f172a\", accent: \"#2563eb\", accentGlow: \"rgba(37,99,235,0.2)\", muted: \"#64748b\", gradient: \"none\" },\n effects: { slideBackground: \"solid\", headingStyle: \"plain\", cardStyle: \"flat\" },\n spacing: { slidePadding: \"60px 80px\", gap: 32, headingSize: \"3rem\" }\n },\n \"keynote-dark\": {\n fonts: { heading: \"Outfit\", body: \"DM Sans\", mono: \"JetBrains Mono\" },\n colors: { bg: \"#000000\", surface: \"#111111\", text: \"#ffffff\", accent: \"#3b82f6\", accentGlow: \"rgba(59,130,246,0.3)\", muted: \"#9ca3af\", gradient: \"radial-gradient(ellipse at center, #111 0%, #000 70%)\" },\n effects: { slideBackground: \"spotlight\", headingStyle: \"plain\", cardStyle: \"floating\" },\n spacing: { slidePadding: \"80px 100px\", gap: 40, headingSize: \"4rem\" }\n },\n \"gradient-dream\": {\n fonts: { heading: \"Outfit\", body: \"DM Sans\", mono: \"JetBrains Mono\" },\n colors: { bg: \"#0c0015\", surface: \"#1a0030\", text: \"#f8f0ff\", accent: \"#c084fc\", accentGlow: \"rgba(192,132,252,0.4)\", muted: \"#a78bfa\", gradient: \"linear-gradient(135deg, #0c0015, #1a0030, #2d1b69)\" },\n effects: { slideBackground: \"aurora\", headingStyle: \"glow\", cardStyle: \"glass\" },\n spacing: { slidePadding: \"60px 80px\", gap: 32, headingSize: \"3.5rem\" }\n },\n \"neon-night\": {\n fonts: { heading: \"Sora\", body: \"DM Sans\", mono: \"Share Tech Mono\" },\n colors: { bg: \"#000000\", surface: \"#0a0a0a\", text: \"#e0ffe0\", accent: \"#22d3ee\", accentGlow: \"rgba(34,211,238,0.4)\", muted: \"#4ade80\", gradient: \"linear-gradient(180deg, #000, #001a1a)\" },\n effects: { slideBackground: \"noise\", headingStyle: \"glow\", cardStyle: \"neon\" },\n spacing: { slidePadding: \"60px 80px\", gap: 32, headingSize: \"3.5rem\" }\n },\n \"warm-earth\": {\n fonts: { heading: \"DM Serif Display\", body: \"DM Sans\", mono: \"JetBrains Mono\" },\n colors: { bg: \"#faf7f2\", surface: \"#f0ebe3\", text: \"#2c1810\", accent: \"#b45309\", accentGlow: \"rgba(180,83,9,0.2)\", muted: \"#78716c\", gradient: \"none\" },\n effects: { slideBackground: \"noise\", headingStyle: \"plain\", cardStyle: \"flat\" },\n spacing: { slidePadding: \"60px 80px\", gap: 32, headingSize: \"3rem\" }\n },\n \"retro-terminal\": {\n fonts: { heading: \"Space Mono\", body: \"Space Mono\", mono: \"Space Mono\" },\n colors: { bg: \"#0a0a0a\", surface: \"#111111\", text: \"#33ff33\", accent: \"#33ff33\", accentGlow: \"rgba(51,255,51,0.3)\", muted: \"#1a8f1a\", gradient: \"none\" },\n effects: { slideBackground: \"grid\", headingStyle: \"glow\", cardStyle: \"bordered\" },\n spacing: { slidePadding: \"40px 60px\", gap: 24, headingSize: \"2.5rem\" }\n },\n \"frosted-glass\": {\n fonts: { heading: \"Outfit\", body: \"DM Sans\", mono: \"JetBrains Mono\" },\n colors: { bg: \"#0f172a\", surface: \"#1e293b\", text: \"#f1f5f9\", accent: \"#818cf8\", accentGlow: \"rgba(129,140,248,0.3)\", muted: \"#94a3b8\", gradient: \"linear-gradient(135deg, #0f172a, #1e1b4b, #0f172a)\" },\n effects: { slideBackground: \"aurora\", headingStyle: \"gradient-text\", cardStyle: \"glass\" },\n spacing: { slidePadding: \"60px 80px\", gap: 32, headingSize: \"3.5rem\" }\n },\n \"brutalist\": {\n fonts: { heading: \"Instrument Serif\", body: \"DM Sans\", mono: \"Space Mono\" },\n colors: { bg: \"#fffff0\", surface: \"#f5f5dc\", text: \"#000000\", accent: \"#dc2626\", accentGlow: \"rgba(220,38,38,0.2)\", muted: \"#525252\", gradient: \"none\" },\n effects: { slideBackground: \"solid\", headingStyle: \"plain\", cardStyle: \"bordered\" },\n spacing: { slidePadding: \"60px 80px\", gap: 32, headingSize: \"4rem\" }\n }\n };\n\n // ── Token sanitization ──\n function _sanitizeDeckToken(value) {\n if (typeof value !== \"string\") return value;\n return value.replace(/[;{}]/g, \"\").replace(/expression\\\\s*\\\\(/gi, \"\").replace(/javascript\\\\s*:/gi, \"\").replace(/url\\\\s*\\\\(/gi, \"blocked(\");\n }\n\n // ── CSS generation from design tokens ──\n function _buildDeckTokenCSS(design) {\n if (!design) return \"\";\n var c = design.colors || {};\n var f = design.fonts || {};\n var s = design.spacing || {};\n var lines = [\":host {\"];\n if (c.bg) lines.push(\" --deck-bg: \" + _sanitizeDeckToken(c.bg) + \";\");\n if (c.surface) lines.push(\" --deck-surface: \" + _sanitizeDeckToken(c.surface) + \";\");\n if (c.text) lines.push(\" --deck-text: \" + _sanitizeDeckToken(c.text) + \";\");\n if (c.accent) lines.push(\" --deck-accent: \" + _sanitizeDeckToken(c.accent) + \";\");\n if (c.accentGlow) lines.push(\" --deck-accent-glow: \" + _sanitizeDeckToken(c.accentGlow) + \";\");\n if (c.muted) lines.push(\" --deck-muted: \" + _sanitizeDeckToken(c.muted) + \";\");\n if (c.gradient) lines.push(\" --deck-gradient: \" + _sanitizeDeckToken(c.gradient) + \";\");\n if (f.heading) lines.push(\" --deck-font-heading: \" + _sanitizeDeckToken(f.heading) + \";\");\n if (f.body) lines.push(\" --deck-font-body: \" + _sanitizeDeckToken(f.body) + \";\");\n if (f.mono) lines.push(\" --deck-font-mono: \" + _sanitizeDeckToken(f.mono) + \";\");\n if (s.slidePadding) lines.push(\" --deck-slide-padding: \" + _sanitizeDeckToken(s.slidePadding) + \";\");\n if (s.headingSize) lines.push(\" --deck-heading-size: \" + _sanitizeDeckToken(s.headingSize) + \";\");\n if (s.gap) lines.push(\" --deck-gap: \" + (parseInt(s.gap) || 32) + \"px;\");\n lines.push(\"}\");\n return lines.join(\"\\\\n\");\n }\n\n // ── Allowed font URL origins ──\n var _FONT_URL_WHITELIST = [\"fonts.googleapis.com\", \"fonts.gstatic.com\", \"use.typekit.net\", \"cdnjs.cloudflare.com\"];\n function _isSafeFontURL(url) {\n try {\n var u = new URL(url);\n return _FONT_URL_WHITELIST.some(function(h) { return u.hostname === h || u.hostname.endsWith(\".\" + h); });\n } catch(e) { return false; }\n }\n\n function renderAupDeck(node) {\n var p = node.props || {};\n var s = node.state || {};\n var transition = p.transition || \"fade\";\n var transitionDuration = p.transitionDuration || 600;\n var autoPlay = !!p.autoPlay;\n var autoPlayInterval = p.autoPlayInterval || 5000;\n var loop = !!p.loop;\n var showControls = p.showControls !== false;\n var showProgress = p.showProgress !== false;\n var keyboard = p.keyboard !== false;\n var aspectRatio = p.aspectRatio || \"auto\";\n var presentation = !!p.presentation;\n var slides = node.children || [];\n var total = slides.length;\n var current = Math.max(0, Math.min(parseInt(s.current) || 0, total - 1));\n var autoTimer = null;\n\n // ── Resolve design tokens ──\n var preset = p.designPreset ? _DECK_PRESETS[p.designPreset] : null;\n var design = {};\n if (preset) {\n design.fonts = Object.assign({}, preset.fonts);\n design.colors = Object.assign({}, preset.colors);\n design.effects = Object.assign({}, preset.effects);\n design.spacing = Object.assign({}, preset.spacing);\n }\n if (p.design) {\n if (p.design.fonts) design.fonts = Object.assign(design.fonts || {}, p.design.fonts);\n if (p.design.colors) design.colors = Object.assign(design.colors || {}, p.design.colors);\n if (p.design.effects) design.effects = Object.assign(design.effects || {}, p.design.effects);\n if (p.design.spacing) design.spacing = Object.assign(design.spacing || {}, p.design.spacing);\n }\n var effects = (design && design.effects) || {};\n\n // ── Shadow DOM host ──\n var host = document.createElement(\"div\");\n host.className = \"aup-deck-host\";\n host.style.width = \"100%\";\n var shadow = host.attachShadow({ mode: \"open\" });\n\n // 1. Clone main page CSS into shadow (so child primitives render correctly)\n var mainStyle = document.querySelector(\"head > style\");\n if (mainStyle) {\n var clonedStyle = document.createElement(\"style\");\n clonedStyle.textContent = mainStyle.textContent;\n shadow.appendChild(clonedStyle);\n }\n\n // 2. Inject deck shadow CSS (from DECK_SHADOW_CSS constant embedded at build time)\n var deckStyle = document.createElement(\"style\");\n deckStyle.textContent = _DECK_SHADOW_CSS;\n shadow.appendChild(deckStyle);\n\n // 3. Inject design token CSS\n if (design && (design.colors || design.fonts || design.spacing)) {\n var tokenStyle = document.createElement(\"style\");\n tokenStyle.textContent = _buildDeckTokenCSS(design);\n shadow.appendChild(tokenStyle);\n }\n\n // 4. Load font URLs\n var fontUrls = (design.fonts && design.fonts.urls) || [];\n for (var fi = 0; fi < fontUrls.length; fi++) {\n if (_isSafeFontURL(fontUrls[fi])) {\n var link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = fontUrls[fi];\n shadow.appendChild(link);\n }\n }\n\n // ── Build deck inside shadow ──\n var el = document.createElement(\"div\");\n el.className = \"aup-deck\";\n el.setAttribute(\"data-transition\", transition);\n el.style.setProperty(\"--deck-transition-duration\", transitionDuration + \"ms\");\n\n if (presentation) {\n el.setAttribute(\"data-presentation\", \"true\");\n host.style.height = \"100vh\";\n el.style.height = \"100%\";\n }\n if (aspectRatio === \"16:9\") el.setAttribute(\"data-aspect\", \"16-9\");\n else if (aspectRatio === \"4:3\") el.setAttribute(\"data-aspect\", \"4-3\");\n\n // Slide background effect\n if (effects.slideBackground && effects.slideBackground !== \"solid\") {\n el.setAttribute(\"data-slide-bg\", effects.slideBackground);\n }\n\n // Heading style class\n if (effects.headingStyle === \"gradient-text\") el.classList.add(\"deck-heading-gradient\");\n else if (effects.headingStyle === \"glow\") el.classList.add(\"deck-heading-glow\");\n\n // Card style class\n if (effects.cardStyle === \"glass\") el.classList.add(\"deck-card-glass\");\n else if (effects.cardStyle === \"neon\") el.classList.add(\"deck-card-neon\");\n else if (effects.cardStyle === \"bordered\") el.classList.add(\"deck-card-bordered\");\n\n // ── Viewport ──\n var viewport = document.createElement(\"div\");\n viewport.className = \"aup-deck-viewport\";\n\n for (var i = 0; i < total; i++) {\n var slideEl = document.createElement(\"div\");\n slideEl.className = \"aup-deck-slide\";\n if (i === current) slideEl.classList.add(\"active\");\n var childEl = renderAupNode(slides[i]);\n if (childEl) slideEl.appendChild(childEl);\n viewport.appendChild(slideEl);\n }\n el.appendChild(viewport);\n\n // ── Controls ──\n if (showControls && total > 1) {\n var controls = document.createElement(\"div\");\n controls.className = \"aup-deck-controls\";\n var prevBtn = document.createElement(\"button\");\n prevBtn.className = \"aup-deck-prev\";\n prevBtn.innerHTML = _ICON_PATHS[\"arrow-left\"] ?\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' + _ICON_PATHS[\"arrow-left\"] + '</svg>' :\n '&#8592;';\n prevBtn.onclick = function(e) { e.stopPropagation(); goTo(current - 1); };\n controls.appendChild(prevBtn);\n\n var nextBtn = document.createElement(\"button\");\n nextBtn.className = \"aup-deck-next\";\n nextBtn.innerHTML = _ICON_PATHS[\"arrow-right\"] ?\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' + _ICON_PATHS[\"arrow-right\"] + '</svg>' :\n '&#8594;';\n nextBtn.onclick = function(e) { e.stopPropagation(); goTo(current + 1); };\n controls.appendChild(nextBtn);\n el.appendChild(controls);\n\n // ── Dots ──\n var dots = document.createElement(\"div\");\n dots.className = \"aup-deck-dots\";\n for (var d = 0; d < total; d++) {\n (function(idx) {\n var dot = document.createElement(\"button\");\n dot.className = \"aup-deck-dot\" + (idx === current ? \" active\" : \"\");\n dot.onclick = function(e) { e.stopPropagation(); goTo(idx); };\n dots.appendChild(dot);\n })(d);\n }\n el.appendChild(dots);\n }\n\n // ── Progress bar ──\n if (showProgress && total > 1) {\n var progressBar = document.createElement(\"div\");\n progressBar.className = \"aup-deck-progress\";\n var progressFill = document.createElement(\"div\");\n progressFill.className = \"aup-deck-progress-fill\";\n progressFill.style.width = ((current + 1) / total * 100) + \"%\";\n progressBar.appendChild(progressFill);\n el.appendChild(progressBar);\n }\n\n shadow.appendChild(el);\n\n // ── Navigation logic ──\n function goTo(idx) {\n if (total === 0) return;\n var prev = current;\n if (idx < 0) { idx = loop ? total - 1 : 0; }\n if (idx >= total) {\n if (loop) { idx = 0; }\n else {\n emitDeckEvent(node, \"complete\", { current: current, total: total });\n return;\n }\n }\n if (idx === current) return;\n current = idx;\n updateSlides(prev);\n emitDeckEvent(node, \"change\", { current: current, previous: prev });\n resetAutoPlay();\n }\n\n function updateSlides(prev) {\n var slideEls = viewport.children;\n for (var j = 0; j < slideEls.length; j++) {\n var sEl = slideEls[j];\n sEl.classList.remove(\"active\", \"prev\", \"entering\");\n if (j === current) {\n sEl.classList.add(\"active\", \"entering\");\n triggerSlideAnimations(sEl);\n } else if (j === prev) {\n sEl.classList.add(\"prev\");\n }\n }\n setTimeout(function() {\n var active = viewport.children[current];\n if (active) active.classList.remove(\"entering\");\n }, transitionDuration);\n\n // Update dots\n var dotEls = el.querySelectorAll(\".aup-deck-dot\");\n for (var k = 0; k < dotEls.length; k++) {\n dotEls[k].classList.toggle(\"active\", k === current);\n }\n // Update progress\n var fill = el.querySelector(\".aup-deck-progress-fill\");\n if (fill) fill.style.width = ((current + 1) / total * 100) + \"%\";\n }\n\n function triggerSlideAnimations(slideEl) {\n var animatedEls = slideEl.querySelectorAll(\"[data-animate]\");\n for (var a = 0; a < animatedEls.length; a++) {\n var ae = animatedEls[a];\n ae.classList.remove(\"aup-animated\");\n void ae.offsetWidth;\n ae.classList.add(\"aup-animated\");\n }\n // Also trigger count-up for elements inside shadow\n var countEls = slideEl.querySelectorAll('[data-animate=\"count-up\"]');\n for (var cu = 0; cu < countEls.length; cu++) {\n _startCountUp(countEls[cu]);\n }\n }\n\n // Trigger animations on the initial slide\n setTimeout(function() {\n var activeSlide = viewport.children[current];\n if (activeSlide) triggerSlideAnimations(activeSlide);\n }, 100);\n\n function emitDeckEvent(n, eventName, detail) {\n if (!n.events || !n.events[eventName]) return;\n var ev = n.events[eventName];\n if (ev.exec && ws && ws.readyState === 1) {\n ws.send(JSON.stringify({\n type: \"aup_event\",\n nodeId: n.id,\n event: eventName,\n payload: Object.assign({}, ev.args || {}, detail)\n }));\n }\n }\n\n // ── AutoPlay ──\n function resetAutoPlay() {\n if (autoTimer) clearInterval(autoTimer);\n if (autoPlay && total > 1) {\n autoTimer = setInterval(function() { goTo(current + 1); }, autoPlayInterval);\n }\n }\n resetAutoPlay();\n\n // Pause on hover\n host.onmouseenter = function() { if (autoTimer) clearInterval(autoTimer); };\n host.onmouseleave = function() { resetAutoPlay(); };\n\n // ── Keyboard (on host, delegates into shadow) ──\n if (keyboard) {\n host.setAttribute(\"tabindex\", \"0\");\n host.style.outline = \"none\";\n host.onkeydown = function(e) {\n switch (e.key) {\n case \"ArrowRight\": case \"ArrowDown\": case \" \":\n e.preventDefault(); goTo(current + 1); break;\n case \"ArrowLeft\": case \"ArrowUp\":\n e.preventDefault(); goTo(current - 1); break;\n case \"f\": case \"F\":\n e.preventDefault();\n if (document.fullscreenElement) document.exitFullscreen();\n else el.requestFullscreen && el.requestFullscreen();\n break;\n case \"Escape\":\n if (document.fullscreenElement) document.exitFullscreen();\n break;\n default:\n var num = parseInt(e.key);\n if (num >= 1 && num <= 9 && num <= total) {\n e.preventDefault();\n goTo(num - 1);\n }\n }\n };\n }\n\n return host;\n }\n\n`;\n"],"mappings":";AAAA,MAAa,UAAU"}