groove-dev 0.26.39 → 0.27.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 (914) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/CLAUDE.md +24 -19
  3. package/node_modules/@groove-dev/cli/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/integrations-registry.json +548 -0
  5. package/node_modules/@groove-dev/daemon/package.json +1 -1
  6. package/node_modules/@groove-dev/daemon/src/api.js +172 -4
  7. package/node_modules/@groove-dev/daemon/src/classifier.js +20 -1
  8. package/node_modules/@groove-dev/daemon/src/firstrun.js +14 -1
  9. package/node_modules/@groove-dev/daemon/src/gateways/manager.js +2 -2
  10. package/node_modules/@groove-dev/daemon/src/index.js +3 -1
  11. package/node_modules/@groove-dev/daemon/src/introducer.js +56 -5
  12. package/node_modules/@groove-dev/daemon/src/journalist.js +43 -1
  13. package/node_modules/@groove-dev/daemon/src/lockmanager.js +60 -0
  14. package/node_modules/@groove-dev/daemon/src/mcp-manager.js +2 -1
  15. package/node_modules/@groove-dev/daemon/src/memory.js +370 -0
  16. package/node_modules/@groove-dev/daemon/src/pm.js +1 -1
  17. package/node_modules/@groove-dev/daemon/src/process.js +20 -1
  18. package/node_modules/@groove-dev/daemon/src/rotator.js +155 -5
  19. package/node_modules/@groove-dev/daemon/src/router.js +43 -0
  20. package/node_modules/@groove-dev/daemon/src/tokentracker.js +62 -8
  21. package/node_modules/@groove-dev/daemon/src/validate.js +0 -13
  22. package/node_modules/@groove-dev/daemon/test/lockmanager.test.js +64 -0
  23. package/node_modules/@groove-dev/daemon/test/memory.test.js +252 -0
  24. package/node_modules/@groove-dev/daemon/test/rotator.test.js +108 -0
  25. package/node_modules/@groove-dev/daemon/test/router.test.js +64 -0
  26. package/node_modules/@groove-dev/daemon/test/tokentracker.test.js +78 -0
  27. package/node_modules/@groove-dev/gui/dist/assets/index-DjORRpF0.css +1 -0
  28. package/node_modules/@groove-dev/gui/dist/assets/index-eCrVowF0.js +652 -0
  29. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  30. package/node_modules/@groove-dev/gui/package.json +1 -4
  31. package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +18 -0
  32. package/node_modules/@groove-dev/gui/src/components/dashboard/cache-ring.jsx +6 -2
  33. package/node_modules/@groove-dev/gui/src/components/dashboard/intel-panel.jsx +251 -8
  34. package/node_modules/@groove-dev/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
  35. package/node_modules/@groove-dev/gui/src/components/marketplace/marketplace-card.jsx +22 -4
  36. package/node_modules/@groove-dev/gui/src/lib/format.js +0 -6
  37. package/node_modules/@groove-dev/gui/src/lib/hooks/use-dashboard.js +18 -1
  38. package/node_modules/@groove-dev/gui/src/stores/groove.js +0 -2
  39. package/node_modules/@groove-dev/gui/src/views/dashboard.jsx +9 -2
  40. package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +103 -77
  41. package/package.json +2 -8
  42. package/packages/cli/package.json +1 -1
  43. package/packages/daemon/integrations-registry.json +548 -0
  44. package/packages/daemon/package.json +1 -1
  45. package/packages/daemon/src/api.js +172 -4
  46. package/packages/daemon/src/classifier.js +20 -1
  47. package/packages/daemon/src/firstrun.js +14 -1
  48. package/packages/daemon/src/gateways/manager.js +2 -2
  49. package/packages/daemon/src/index.js +3 -1
  50. package/packages/daemon/src/introducer.js +56 -5
  51. package/packages/daemon/src/journalist.js +43 -1
  52. package/packages/daemon/src/lockmanager.js +60 -0
  53. package/packages/daemon/src/mcp-manager.js +2 -1
  54. package/packages/daemon/src/memory.js +370 -0
  55. package/packages/daemon/src/pm.js +1 -1
  56. package/packages/daemon/src/process.js +20 -1
  57. package/packages/daemon/src/rotator.js +155 -5
  58. package/packages/daemon/src/router.js +43 -0
  59. package/packages/daemon/src/tokentracker.js +62 -8
  60. package/packages/daemon/src/validate.js +0 -13
  61. package/packages/gui/dist/assets/index-DjORRpF0.css +1 -0
  62. package/packages/gui/dist/assets/index-eCrVowF0.js +652 -0
  63. package/packages/gui/dist/index.html +2 -2
  64. package/packages/gui/package.json +1 -4
  65. package/packages/gui/src/components/agents/spawn-wizard.jsx +18 -0
  66. package/packages/gui/src/components/dashboard/cache-ring.jsx +6 -2
  67. package/packages/gui/src/components/dashboard/intel-panel.jsx +251 -8
  68. package/packages/gui/src/components/dashboard/team-burn-panel.jsx +55 -0
  69. package/packages/gui/src/components/marketplace/marketplace-card.jsx +22 -4
  70. package/packages/gui/src/lib/format.js +0 -6
  71. package/packages/gui/src/lib/hooks/use-dashboard.js +18 -1
  72. package/packages/gui/src/stores/groove.js +0 -2
  73. package/packages/gui/src/views/dashboard.jsx +9 -2
  74. package/packages/gui/src/views/marketplace.jsx +103 -77
  75. package/docs-manager/DOCS-WORKFLOW.md +0 -176
  76. package/node_modules/@groove-dev/gui/dist/assets/index-BkY43sei.css +0 -1
  77. package/node_modules/@groove-dev/gui/dist/assets/index-DmKZLrXU.js +0 -652
  78. package/node_modules/@groove-dev/gui/dist/groove-logo-short.png +0 -0
  79. package/node_modules/@groove-dev/gui/dist/groove-logo.png +0 -0
  80. package/node_modules/@groove-dev/gui/public/groove-logo-short.png +0 -0
  81. package/node_modules/@groove-dev/gui/public/groove-logo.png +0 -0
  82. package/node_modules/@groove-dev/gui/src/components/ui/dropdown-menu.jsx +0 -60
  83. package/node_modules/@groove-dev/gui/src/lib/hooks/use-media-query.js +0 -18
  84. package/node_modules/@radix-ui/react-dropdown-menu/LICENSE +0 -21
  85. package/node_modules/@radix-ui/react-dropdown-menu/README.md +0 -3
  86. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.mts +0 -97
  87. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.ts +0 -97
  88. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +0 -337
  89. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.js.map +0 -7
  90. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs +0 -305
  91. package/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs.map +0 -7
  92. package/node_modules/@radix-ui/react-dropdown-menu/package.json +0 -75
  93. package/node_modules/@radix-ui/react-popover/LICENSE +0 -21
  94. package/node_modules/@radix-ui/react-popover/README.md +0 -3
  95. package/node_modules/@radix-ui/react-popover/dist/index.d.mts +0 -85
  96. package/node_modules/@radix-ui/react-popover/dist/index.d.ts +0 -85
  97. package/node_modules/@radix-ui/react-popover/dist/index.js +0 -352
  98. package/node_modules/@radix-ui/react-popover/dist/index.js.map +0 -7
  99. package/node_modules/@radix-ui/react-popover/dist/index.mjs +0 -320
  100. package/node_modules/@radix-ui/react-popover/dist/index.mjs.map +0 -7
  101. package/node_modules/@radix-ui/react-popover/package.json +0 -82
  102. package/node_modules/@radix-ui/react-separator/LICENSE +0 -21
  103. package/node_modules/@radix-ui/react-separator/README.md +0 -3
  104. package/node_modules/@radix-ui/react-separator/dist/index.d.mts +0 -21
  105. package/node_modules/@radix-ui/react-separator/dist/index.d.ts +0 -21
  106. package/node_modules/@radix-ui/react-separator/dist/index.js +0 -65
  107. package/node_modules/@radix-ui/react-separator/dist/index.js.map +0 -7
  108. package/node_modules/@radix-ui/react-separator/dist/index.mjs +0 -32
  109. package/node_modules/@radix-ui/react-separator/dist/index.mjs.map +0 -7
  110. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/LICENSE +0 -21
  111. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/README.md +0 -3
  112. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.mts +0 -52
  113. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.d.ts +0 -52
  114. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js +0 -80
  115. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.js.map +0 -7
  116. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs +0 -47
  117. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/dist/index.mjs.map +0 -7
  118. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive/package.json +0 -69
  119. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/LICENSE +0 -21
  120. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/README.md +0 -3
  121. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.mts +0 -22
  122. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.d.ts +0 -22
  123. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js +0 -152
  124. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.js.map +0 -7
  125. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs +0 -119
  126. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/dist/index.mjs.map +0 -7
  127. package/node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot/package.json +0 -64
  128. package/node_modules/@radix-ui/react-separator/package.json +0 -69
  129. package/packages/gui/dist/assets/index-BkY43sei.css +0 -1
  130. package/packages/gui/dist/assets/index-DmKZLrXU.js +0 -652
  131. package/packages/gui/dist/groove-logo-short.png +0 -0
  132. package/packages/gui/dist/groove-logo.png +0 -0
  133. package/packages/gui/public/groove-logo-short.png +0 -0
  134. package/packages/gui/public/groove-logo.png +0 -0
  135. package/packages/gui/src/components/ui/dropdown-menu.jsx +0 -60
  136. package/packages/gui/src/lib/hooks/use-media-query.js +0 -18
  137. package/slides/convert-slides.js +0 -1120
  138. package/slides/deck.pptx +0 -0
  139. package/slides/index.html +0 -825
  140. package/slides/node_modules/.package-lock.json +0 -527
  141. package/slides/node_modules/@types/node/LICENSE +0 -21
  142. package/slides/node_modules/@types/node/README.md +0 -15
  143. package/slides/node_modules/@types/node/assert/strict.d.ts +0 -111
  144. package/slides/node_modules/@types/node/assert.d.ts +0 -1078
  145. package/slides/node_modules/@types/node/async_hooks.d.ts +0 -603
  146. package/slides/node_modules/@types/node/buffer.buffer.d.ts +0 -472
  147. package/slides/node_modules/@types/node/buffer.d.ts +0 -1934
  148. package/slides/node_modules/@types/node/child_process.d.ts +0 -1476
  149. package/slides/node_modules/@types/node/cluster.d.ts +0 -578
  150. package/slides/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  151. package/slides/node_modules/@types/node/compatibility/index.d.ts +0 -9
  152. package/slides/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  153. package/slides/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
  154. package/slides/node_modules/@types/node/console.d.ts +0 -452
  155. package/slides/node_modules/@types/node/constants.d.ts +0 -21
  156. package/slides/node_modules/@types/node/crypto.d.ts +0 -4545
  157. package/slides/node_modules/@types/node/dgram.d.ts +0 -600
  158. package/slides/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
  159. package/slides/node_modules/@types/node/dns/promises.d.ts +0 -503
  160. package/slides/node_modules/@types/node/dns.d.ts +0 -923
  161. package/slides/node_modules/@types/node/domain.d.ts +0 -170
  162. package/slides/node_modules/@types/node/events.d.ts +0 -976
  163. package/slides/node_modules/@types/node/fs/promises.d.ts +0 -1295
  164. package/slides/node_modules/@types/node/fs.d.ts +0 -4461
  165. package/slides/node_modules/@types/node/globals.d.ts +0 -172
  166. package/slides/node_modules/@types/node/globals.typedarray.d.ts +0 -38
  167. package/slides/node_modules/@types/node/http.d.ts +0 -2089
  168. package/slides/node_modules/@types/node/http2.d.ts +0 -2644
  169. package/slides/node_modules/@types/node/https.d.ts +0 -579
  170. package/slides/node_modules/@types/node/index.d.ts +0 -97
  171. package/slides/node_modules/@types/node/inspector.d.ts +0 -253
  172. package/slides/node_modules/@types/node/inspector.generated.d.ts +0 -4052
  173. package/slides/node_modules/@types/node/module.d.ts +0 -891
  174. package/slides/node_modules/@types/node/net.d.ts +0 -1076
  175. package/slides/node_modules/@types/node/os.d.ts +0 -506
  176. package/slides/node_modules/@types/node/package.json +0 -145
  177. package/slides/node_modules/@types/node/path.d.ts +0 -200
  178. package/slides/node_modules/@types/node/perf_hooks.d.ts +0 -968
  179. package/slides/node_modules/@types/node/process.d.ts +0 -2084
  180. package/slides/node_modules/@types/node/punycode.d.ts +0 -117
  181. package/slides/node_modules/@types/node/querystring.d.ts +0 -152
  182. package/slides/node_modules/@types/node/readline/promises.d.ts +0 -161
  183. package/slides/node_modules/@types/node/readline.d.ts +0 -594
  184. package/slides/node_modules/@types/node/repl.d.ts +0 -428
  185. package/slides/node_modules/@types/node/sea.d.ts +0 -153
  186. package/slides/node_modules/@types/node/sqlite.d.ts +0 -721
  187. package/slides/node_modules/@types/node/stream/consumers.d.ts +0 -38
  188. package/slides/node_modules/@types/node/stream/promises.d.ts +0 -90
  189. package/slides/node_modules/@types/node/stream/web.d.ts +0 -622
  190. package/slides/node_modules/@types/node/stream.d.ts +0 -1687
  191. package/slides/node_modules/@types/node/string_decoder.d.ts +0 -67
  192. package/slides/node_modules/@types/node/test.d.ts +0 -2163
  193. package/slides/node_modules/@types/node/timers/promises.d.ts +0 -108
  194. package/slides/node_modules/@types/node/timers.d.ts +0 -287
  195. package/slides/node_modules/@types/node/tls.d.ts +0 -1319
  196. package/slides/node_modules/@types/node/trace_events.d.ts +0 -197
  197. package/slides/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
  198. package/slides/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
  199. package/slides/node_modules/@types/node/ts5.6/index.d.ts +0 -97
  200. package/slides/node_modules/@types/node/tty.d.ts +0 -208
  201. package/slides/node_modules/@types/node/url.d.ts +0 -984
  202. package/slides/node_modules/@types/node/util.d.ts +0 -2606
  203. package/slides/node_modules/@types/node/v8.d.ts +0 -920
  204. package/slides/node_modules/@types/node/vm.d.ts +0 -1000
  205. package/slides/node_modules/@types/node/wasi.d.ts +0 -181
  206. package/slides/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
  207. package/slides/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
  208. package/slides/node_modules/@types/node/web-globals/events.d.ts +0 -97
  209. package/slides/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
  210. package/slides/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
  211. package/slides/node_modules/@types/node/web-globals/storage.d.ts +0 -24
  212. package/slides/node_modules/@types/node/worker_threads.d.ts +0 -784
  213. package/slides/node_modules/@types/node/zlib.d.ts +0 -747
  214. package/slides/node_modules/base64-js/LICENSE +0 -21
  215. package/slides/node_modules/base64-js/README.md +0 -34
  216. package/slides/node_modules/base64-js/base64js.min.js +0 -1
  217. package/slides/node_modules/base64-js/index.d.ts +0 -3
  218. package/slides/node_modules/base64-js/index.js +0 -150
  219. package/slides/node_modules/base64-js/package.json +0 -47
  220. package/slides/node_modules/bl/.travis.yml +0 -17
  221. package/slides/node_modules/bl/BufferList.js +0 -396
  222. package/slides/node_modules/bl/LICENSE.md +0 -13
  223. package/slides/node_modules/bl/README.md +0 -247
  224. package/slides/node_modules/bl/bl.js +0 -84
  225. package/slides/node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  226. package/slides/node_modules/bl/node_modules/readable-stream/GOVERNANCE.md +0 -136
  227. package/slides/node_modules/bl/node_modules/readable-stream/LICENSE +0 -47
  228. package/slides/node_modules/bl/node_modules/readable-stream/README.md +0 -106
  229. package/slides/node_modules/bl/node_modules/readable-stream/errors-browser.js +0 -127
  230. package/slides/node_modules/bl/node_modules/readable-stream/errors.js +0 -116
  231. package/slides/node_modules/bl/node_modules/readable-stream/experimentalWarning.js +0 -17
  232. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  233. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  234. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  235. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  236. package/slides/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  237. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  238. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  239. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  240. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  241. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  242. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  243. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  244. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  245. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  246. package/slides/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  247. package/slides/node_modules/bl/node_modules/readable-stream/package.json +0 -68
  248. package/slides/node_modules/bl/node_modules/readable-stream/readable-browser.js +0 -9
  249. package/slides/node_modules/bl/node_modules/readable-stream/readable.js +0 -16
  250. package/slides/node_modules/bl/package.json +0 -37
  251. package/slides/node_modules/bl/test/convert.js +0 -21
  252. package/slides/node_modules/bl/test/indexOf.js +0 -492
  253. package/slides/node_modules/bl/test/isBufferList.js +0 -32
  254. package/slides/node_modules/bl/test/test.js +0 -869
  255. package/slides/node_modules/buffer/AUTHORS.md +0 -70
  256. package/slides/node_modules/buffer/LICENSE +0 -21
  257. package/slides/node_modules/buffer/README.md +0 -410
  258. package/slides/node_modules/buffer/index.d.ts +0 -186
  259. package/slides/node_modules/buffer/index.js +0 -1817
  260. package/slides/node_modules/buffer/package.json +0 -96
  261. package/slides/node_modules/canvas/Readme.md +0 -657
  262. package/slides/node_modules/canvas/binding.gyp +0 -229
  263. package/slides/node_modules/canvas/browser.js +0 -31
  264. package/slides/node_modules/canvas/build/Makefile +0 -347
  265. package/slides/node_modules/canvas/build/Release/canvas.node +0 -0
  266. package/slides/node_modules/canvas/build/Release/libX11.6.dylib +0 -0
  267. package/slides/node_modules/canvas/build/Release/libXau.6.dylib +0 -0
  268. package/slides/node_modules/canvas/build/Release/libXdmcp.6.dylib +0 -0
  269. package/slides/node_modules/canvas/build/Release/libXext.6.dylib +0 -0
  270. package/slides/node_modules/canvas/build/Release/libXrender.1.dylib +0 -0
  271. package/slides/node_modules/canvas/build/Release/libcairo-gobject.2.dylib +0 -0
  272. package/slides/node_modules/canvas/build/Release/libcairo.2.dylib +0 -0
  273. package/slides/node_modules/canvas/build/Release/libdatrie.1.dylib +0 -0
  274. package/slides/node_modules/canvas/build/Release/libfontconfig.1.dylib +0 -0
  275. package/slides/node_modules/canvas/build/Release/libfreetype.6.dylib +0 -0
  276. package/slides/node_modules/canvas/build/Release/libfribidi.0.dylib +0 -0
  277. package/slides/node_modules/canvas/build/Release/libgdk_pixbuf-2.0.0.dylib +0 -0
  278. package/slides/node_modules/canvas/build/Release/libgif.7.2.0.dylib +0 -0
  279. package/slides/node_modules/canvas/build/Release/libgio-2.0.0.dylib +0 -0
  280. package/slides/node_modules/canvas/build/Release/libglib-2.0.0.dylib +0 -0
  281. package/slides/node_modules/canvas/build/Release/libgmodule-2.0.0.dylib +0 -0
  282. package/slides/node_modules/canvas/build/Release/libgobject-2.0.0.dylib +0 -0
  283. package/slides/node_modules/canvas/build/Release/libgraphite2.3.2.1.dylib +0 -0
  284. package/slides/node_modules/canvas/build/Release/libharfbuzz.0.dylib +0 -0
  285. package/slides/node_modules/canvas/build/Release/libintl.8.dylib +0 -0
  286. package/slides/node_modules/canvas/build/Release/libjpeg.8.3.2.dylib +0 -0
  287. package/slides/node_modules/canvas/build/Release/libpango-1.0.0.dylib +0 -0
  288. package/slides/node_modules/canvas/build/Release/libpangocairo-1.0.0.dylib +0 -0
  289. package/slides/node_modules/canvas/build/Release/libpangoft2-1.0.0.dylib +0 -0
  290. package/slides/node_modules/canvas/build/Release/libpcre2-8.0.dylib +0 -0
  291. package/slides/node_modules/canvas/build/Release/libpixman-1.0.dylib +0 -0
  292. package/slides/node_modules/canvas/build/Release/libpng16.16.dylib +0 -0
  293. package/slides/node_modules/canvas/build/Release/librsvg-2.2.dylib +0 -0
  294. package/slides/node_modules/canvas/build/Release/libthai.0.dylib +0 -0
  295. package/slides/node_modules/canvas/build/Release/libxcb-render.0.0.0.dylib +0 -0
  296. package/slides/node_modules/canvas/build/Release/libxcb-shm.0.0.0.dylib +0 -0
  297. package/slides/node_modules/canvas/build/Release/libxcb.1.1.0.dylib +0 -0
  298. package/slides/node_modules/canvas/build/binding.Makefile +0 -6
  299. package/slides/node_modules/canvas/build/canvas.target.mk +0 -299
  300. package/slides/node_modules/canvas/build/gyp-mac-tool +0 -766
  301. package/slides/node_modules/canvas/index.d.ts +0 -507
  302. package/slides/node_modules/canvas/index.js +0 -94
  303. package/slides/node_modules/canvas/lib/DOMMatrix.js +0 -678
  304. package/slides/node_modules/canvas/lib/bindings.js +0 -43
  305. package/slides/node_modules/canvas/lib/canvas.js +0 -113
  306. package/slides/node_modules/canvas/lib/context2d.js +0 -11
  307. package/slides/node_modules/canvas/lib/image.js +0 -97
  308. package/slides/node_modules/canvas/lib/jpegstream.js +0 -41
  309. package/slides/node_modules/canvas/lib/pattern.js +0 -15
  310. package/slides/node_modules/canvas/lib/pdfstream.js +0 -35
  311. package/slides/node_modules/canvas/lib/pngstream.js +0 -42
  312. package/slides/node_modules/canvas/package.json +0 -71
  313. package/slides/node_modules/canvas/src/Backends.h +0 -9
  314. package/slides/node_modules/canvas/src/Canvas.cc +0 -1026
  315. package/slides/node_modules/canvas/src/Canvas.h +0 -128
  316. package/slides/node_modules/canvas/src/CanvasError.h +0 -37
  317. package/slides/node_modules/canvas/src/CanvasGradient.cc +0 -113
  318. package/slides/node_modules/canvas/src/CanvasGradient.h +0 -20
  319. package/slides/node_modules/canvas/src/CanvasPattern.cc +0 -129
  320. package/slides/node_modules/canvas/src/CanvasPattern.h +0 -33
  321. package/slides/node_modules/canvas/src/CanvasRenderingContext2d.cc +0 -3527
  322. package/slides/node_modules/canvas/src/CanvasRenderingContext2d.h +0 -238
  323. package/slides/node_modules/canvas/src/CharData.h +0 -233
  324. package/slides/node_modules/canvas/src/FontParser.cc +0 -605
  325. package/slides/node_modules/canvas/src/FontParser.h +0 -115
  326. package/slides/node_modules/canvas/src/Image.cc +0 -1719
  327. package/slides/node_modules/canvas/src/Image.h +0 -146
  328. package/slides/node_modules/canvas/src/ImageData.cc +0 -138
  329. package/slides/node_modules/canvas/src/ImageData.h +0 -26
  330. package/slides/node_modules/canvas/src/InstanceData.h +0 -12
  331. package/slides/node_modules/canvas/src/JPEGStream.h +0 -157
  332. package/slides/node_modules/canvas/src/PNG.h +0 -292
  333. package/slides/node_modules/canvas/src/Point.h +0 -11
  334. package/slides/node_modules/canvas/src/Util.h +0 -9
  335. package/slides/node_modules/canvas/src/bmp/BMPParser.cc +0 -459
  336. package/slides/node_modules/canvas/src/bmp/BMPParser.h +0 -60
  337. package/slides/node_modules/canvas/src/bmp/LICENSE.md +0 -24
  338. package/slides/node_modules/canvas/src/closure.cc +0 -52
  339. package/slides/node_modules/canvas/src/closure.h +0 -98
  340. package/slides/node_modules/canvas/src/color.cc +0 -796
  341. package/slides/node_modules/canvas/src/color.h +0 -30
  342. package/slides/node_modules/canvas/src/dll_visibility.h +0 -20
  343. package/slides/node_modules/canvas/src/init.cc +0 -114
  344. package/slides/node_modules/canvas/src/register_font.cc +0 -352
  345. package/slides/node_modules/canvas/src/register_font.h +0 -7
  346. package/slides/node_modules/canvas/util/has_lib.js +0 -119
  347. package/slides/node_modules/canvas/util/win_jpeg_lookup.js +0 -21
  348. package/slides/node_modules/chownr/LICENSE +0 -15
  349. package/slides/node_modules/chownr/README.md +0 -3
  350. package/slides/node_modules/chownr/chownr.js +0 -167
  351. package/slides/node_modules/chownr/package.json +0 -29
  352. package/slides/node_modules/core-util-is/LICENSE +0 -19
  353. package/slides/node_modules/core-util-is/README.md +0 -3
  354. package/slides/node_modules/core-util-is/lib/util.js +0 -107
  355. package/slides/node_modules/core-util-is/package.json +0 -38
  356. package/slides/node_modules/decompress-response/index.d.ts +0 -22
  357. package/slides/node_modules/decompress-response/index.js +0 -58
  358. package/slides/node_modules/decompress-response/license +0 -9
  359. package/slides/node_modules/decompress-response/package.json +0 -56
  360. package/slides/node_modules/decompress-response/readme.md +0 -48
  361. package/slides/node_modules/deep-extend/CHANGELOG.md +0 -46
  362. package/slides/node_modules/deep-extend/LICENSE +0 -20
  363. package/slides/node_modules/deep-extend/README.md +0 -91
  364. package/slides/node_modules/deep-extend/index.js +0 -1
  365. package/slides/node_modules/deep-extend/lib/deep-extend.js +0 -150
  366. package/slides/node_modules/deep-extend/package.json +0 -62
  367. package/slides/node_modules/detect-libc/LICENSE +0 -201
  368. package/slides/node_modules/detect-libc/README.md +0 -163
  369. package/slides/node_modules/detect-libc/index.d.ts +0 -14
  370. package/slides/node_modules/detect-libc/lib/detect-libc.js +0 -313
  371. package/slides/node_modules/detect-libc/lib/elf.js +0 -39
  372. package/slides/node_modules/detect-libc/lib/filesystem.js +0 -51
  373. package/slides/node_modules/detect-libc/lib/process.js +0 -24
  374. package/slides/node_modules/detect-libc/package.json +0 -44
  375. package/slides/node_modules/end-of-stream/LICENSE +0 -21
  376. package/slides/node_modules/end-of-stream/README.md +0 -54
  377. package/slides/node_modules/end-of-stream/index.js +0 -96
  378. package/slides/node_modules/end-of-stream/package.json +0 -37
  379. package/slides/node_modules/expand-template/.travis.yml +0 -6
  380. package/slides/node_modules/expand-template/LICENSE +0 -21
  381. package/slides/node_modules/expand-template/README.md +0 -43
  382. package/slides/node_modules/expand-template/index.js +0 -26
  383. package/slides/node_modules/expand-template/package.json +0 -29
  384. package/slides/node_modules/expand-template/test.js +0 -67
  385. package/slides/node_modules/fs-constants/LICENSE +0 -21
  386. package/slides/node_modules/fs-constants/README.md +0 -26
  387. package/slides/node_modules/fs-constants/browser.js +0 -1
  388. package/slides/node_modules/fs-constants/index.js +0 -1
  389. package/slides/node_modules/fs-constants/package.json +0 -19
  390. package/slides/node_modules/github-from-package/.travis.yml +0 -4
  391. package/slides/node_modules/github-from-package/LICENSE +0 -18
  392. package/slides/node_modules/github-from-package/example/package.json +0 -8
  393. package/slides/node_modules/github-from-package/example/url.js +0 -3
  394. package/slides/node_modules/github-from-package/index.js +0 -17
  395. package/slides/node_modules/github-from-package/package.json +0 -30
  396. package/slides/node_modules/github-from-package/readme.markdown +0 -53
  397. package/slides/node_modules/github-from-package/test/a.json +0 -8
  398. package/slides/node_modules/github-from-package/test/b.json +0 -5
  399. package/slides/node_modules/github-from-package/test/c.json +0 -5
  400. package/slides/node_modules/github-from-package/test/d.json +0 -7
  401. package/slides/node_modules/github-from-package/test/e.json +0 -5
  402. package/slides/node_modules/github-from-package/test/url.js +0 -19
  403. package/slides/node_modules/https/package.json +0 -15
  404. package/slides/node_modules/ieee754/LICENSE +0 -11
  405. package/slides/node_modules/ieee754/README.md +0 -51
  406. package/slides/node_modules/ieee754/index.d.ts +0 -10
  407. package/slides/node_modules/ieee754/index.js +0 -85
  408. package/slides/node_modules/ieee754/package.json +0 -52
  409. package/slides/node_modules/image-size/LICENSE +0 -9
  410. package/slides/node_modules/image-size/Readme.md +0 -184
  411. package/slides/node_modules/image-size/bin/image-size.js +0 -53
  412. package/slides/node_modules/image-size/dist/detector.d.ts +0 -2
  413. package/slides/node_modules/image-size/dist/detector.js +0 -30
  414. package/slides/node_modules/image-size/dist/index.d.ts +0 -10
  415. package/slides/node_modules/image-size/dist/index.js +0 -129
  416. package/slides/node_modules/image-size/dist/types/bmp.d.ts +0 -2
  417. package/slides/node_modules/image-size/dist/types/bmp.js +0 -11
  418. package/slides/node_modules/image-size/dist/types/cur.d.ts +0 -2
  419. package/slides/node_modules/image-size/dist/types/cur.js +0 -17
  420. package/slides/node_modules/image-size/dist/types/dds.d.ts +0 -2
  421. package/slides/node_modules/image-size/dist/types/dds.js +0 -11
  422. package/slides/node_modules/image-size/dist/types/gif.d.ts +0 -2
  423. package/slides/node_modules/image-size/dist/types/gif.js +0 -12
  424. package/slides/node_modules/image-size/dist/types/heif.d.ts +0 -2
  425. package/slides/node_modules/image-size/dist/types/heif.js +0 -40
  426. package/slides/node_modules/image-size/dist/types/icns.d.ts +0 -2
  427. package/slides/node_modules/image-size/dist/types/icns.js +0 -101
  428. package/slides/node_modules/image-size/dist/types/ico.d.ts +0 -2
  429. package/slides/node_modules/image-size/dist/types/ico.js +0 -68
  430. package/slides/node_modules/image-size/dist/types/index.d.ts +0 -23
  431. package/slides/node_modules/image-size/dist/types/index.js +0 -46
  432. package/slides/node_modules/image-size/dist/types/interface.d.ts +0 -13
  433. package/slides/node_modules/image-size/dist/types/interface.js +0 -2
  434. package/slides/node_modules/image-size/dist/types/j2c.d.ts +0 -2
  435. package/slides/node_modules/image-size/dist/types/j2c.js +0 -12
  436. package/slides/node_modules/image-size/dist/types/jp2.d.ts +0 -2
  437. package/slides/node_modules/image-size/dist/types/jp2.js +0 -27
  438. package/slides/node_modules/image-size/dist/types/jpg.d.ts +0 -2
  439. package/slides/node_modules/image-size/dist/types/jpg.js +0 -123
  440. package/slides/node_modules/image-size/dist/types/jxl-stream.d.ts +0 -2
  441. package/slides/node_modules/image-size/dist/types/jxl-stream.js +0 -45
  442. package/slides/node_modules/image-size/dist/types/jxl.d.ts +0 -2
  443. package/slides/node_modules/image-size/dist/types/jxl.js +0 -59
  444. package/slides/node_modules/image-size/dist/types/ktx.d.ts +0 -2
  445. package/slides/node_modules/image-size/dist/types/ktx.js +0 -19
  446. package/slides/node_modules/image-size/dist/types/png.d.ts +0 -2
  447. package/slides/node_modules/image-size/dist/types/png.js +0 -35
  448. package/slides/node_modules/image-size/dist/types/pnm.d.ts +0 -2
  449. package/slides/node_modules/image-size/dist/types/pnm.js +0 -72
  450. package/slides/node_modules/image-size/dist/types/psd.d.ts +0 -2
  451. package/slides/node_modules/image-size/dist/types/psd.js +0 -11
  452. package/slides/node_modules/image-size/dist/types/svg.d.ts +0 -2
  453. package/slides/node_modules/image-size/dist/types/svg.js +0 -90
  454. package/slides/node_modules/image-size/dist/types/tga.d.ts +0 -2
  455. package/slides/node_modules/image-size/dist/types/tga.js +0 -15
  456. package/slides/node_modules/image-size/dist/types/tiff.d.ts +0 -2
  457. package/slides/node_modules/image-size/dist/types/tiff.js +0 -95
  458. package/slides/node_modules/image-size/dist/types/utils.d.ts +0 -15
  459. package/slides/node_modules/image-size/dist/types/utils.js +0 -75
  460. package/slides/node_modules/image-size/dist/types/webp.d.ts +0 -2
  461. package/slides/node_modules/image-size/dist/types/webp.js +0 -60
  462. package/slides/node_modules/image-size/dist/utils/bit-reader.d.ts +0 -10
  463. package/slides/node_modules/image-size/dist/utils/bit-reader.js +0 -44
  464. package/slides/node_modules/image-size/package.json +0 -81
  465. package/slides/node_modules/immediate/LICENSE.txt +0 -20
  466. package/slides/node_modules/immediate/README.md +0 -93
  467. package/slides/node_modules/immediate/dist/immediate.js +0 -75
  468. package/slides/node_modules/immediate/dist/immediate.min.js +0 -1
  469. package/slides/node_modules/immediate/lib/browser.js +0 -69
  470. package/slides/node_modules/immediate/lib/index.js +0 -73
  471. package/slides/node_modules/immediate/package.json +0 -42
  472. package/slides/node_modules/inherits/LICENSE +0 -16
  473. package/slides/node_modules/inherits/README.md +0 -42
  474. package/slides/node_modules/inherits/inherits.js +0 -9
  475. package/slides/node_modules/inherits/inherits_browser.js +0 -27
  476. package/slides/node_modules/inherits/package.json +0 -29
  477. package/slides/node_modules/ini/LICENSE +0 -15
  478. package/slides/node_modules/ini/README.md +0 -102
  479. package/slides/node_modules/ini/ini.js +0 -206
  480. package/slides/node_modules/ini/package.json +0 -33
  481. package/slides/node_modules/isarray/.travis.yml +0 -4
  482. package/slides/node_modules/isarray/Makefile +0 -6
  483. package/slides/node_modules/isarray/README.md +0 -60
  484. package/slides/node_modules/isarray/component.json +0 -19
  485. package/slides/node_modules/isarray/index.js +0 -5
  486. package/slides/node_modules/isarray/package.json +0 -45
  487. package/slides/node_modules/isarray/test.js +0 -20
  488. package/slides/node_modules/jszip/.codeclimate.yml +0 -16
  489. package/slides/node_modules/jszip/.editorconfig +0 -8
  490. package/slides/node_modules/jszip/.eslintrc.js +0 -43
  491. package/slides/node_modules/jszip/.github/workflows/pr.yaml +0 -58
  492. package/slides/node_modules/jszip/.jekyll-metadata +0 -0
  493. package/slides/node_modules/jszip/.travis.yml +0 -17
  494. package/slides/node_modules/jszip/CHANGES.md +0 -204
  495. package/slides/node_modules/jszip/LICENSE.markdown +0 -651
  496. package/slides/node_modules/jszip/README.markdown +0 -33
  497. package/slides/node_modules/jszip/deps.js +0 -37
  498. package/slides/node_modules/jszip/dist/jszip.js +0 -11577
  499. package/slides/node_modules/jszip/dist/jszip.min.js +0 -13
  500. package/slides/node_modules/jszip/graph.svg +0 -601
  501. package/slides/node_modules/jszip/index.d.ts +0 -330
  502. package/slides/node_modules/jszip/lib/base64.js +0 -106
  503. package/slides/node_modules/jszip/lib/compressedObject.js +0 -74
  504. package/slides/node_modules/jszip/lib/compressions.js +0 -14
  505. package/slides/node_modules/jszip/lib/crc32.js +0 -77
  506. package/slides/node_modules/jszip/lib/defaults.js +0 -11
  507. package/slides/node_modules/jszip/lib/external.js +0 -18
  508. package/slides/node_modules/jszip/lib/flate.js +0 -85
  509. package/slides/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -539
  510. package/slides/node_modules/jszip/lib/generate/index.js +0 -57
  511. package/slides/node_modules/jszip/lib/index.js +0 -55
  512. package/slides/node_modules/jszip/lib/license_header.js +0 -11
  513. package/slides/node_modules/jszip/lib/load.js +0 -88
  514. package/slides/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
  515. package/slides/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
  516. package/slides/node_modules/jszip/lib/nodejsUtils.js +0 -57
  517. package/slides/node_modules/jszip/lib/object.js +0 -384
  518. package/slides/node_modules/jszip/lib/readable-stream-browser.js +0 -10
  519. package/slides/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
  520. package/slides/node_modules/jszip/lib/reader/DataReader.js +0 -116
  521. package/slides/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
  522. package/slides/node_modules/jszip/lib/reader/StringReader.js +0 -38
  523. package/slides/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
  524. package/slides/node_modules/jszip/lib/reader/readerFor.js +0 -28
  525. package/slides/node_modules/jszip/lib/signature.js +0 -7
  526. package/slides/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
  527. package/slides/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
  528. package/slides/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
  529. package/slides/node_modules/jszip/lib/stream/DataWorker.js +0 -116
  530. package/slides/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
  531. package/slides/node_modules/jszip/lib/stream/StreamHelper.js +0 -214
  532. package/slides/node_modules/jszip/lib/support.js +0 -38
  533. package/slides/node_modules/jszip/lib/utf8.js +0 -275
  534. package/slides/node_modules/jszip/lib/utils.js +0 -501
  535. package/slides/node_modules/jszip/lib/zipEntries.js +0 -261
  536. package/slides/node_modules/jszip/lib/zipEntry.js +0 -293
  537. package/slides/node_modules/jszip/lib/zipObject.js +0 -133
  538. package/slides/node_modules/jszip/package.json +0 -67
  539. package/slides/node_modules/jszip/sponsors.md +0 -21
  540. package/slides/node_modules/jszip/tsconfig.json +0 -101
  541. package/slides/node_modules/jszip/vendor/FileSaver.js +0 -247
  542. package/slides/node_modules/lie/README.md +0 -62
  543. package/slides/node_modules/lie/dist/lie.js +0 -350
  544. package/slides/node_modules/lie/dist/lie.min.js +0 -1
  545. package/slides/node_modules/lie/dist/lie.polyfill.js +0 -358
  546. package/slides/node_modules/lie/dist/lie.polyfill.min.js +0 -1
  547. package/slides/node_modules/lie/lib/browser.js +0 -273
  548. package/slides/node_modules/lie/lib/index.js +0 -298
  549. package/slides/node_modules/lie/license.md +0 -7
  550. package/slides/node_modules/lie/lie.d.ts +0 -244
  551. package/slides/node_modules/lie/package.json +0 -69
  552. package/slides/node_modules/lie/polyfill.js +0 -4
  553. package/slides/node_modules/mimic-response/index.d.ts +0 -17
  554. package/slides/node_modules/mimic-response/index.js +0 -77
  555. package/slides/node_modules/mimic-response/license +0 -9
  556. package/slides/node_modules/mimic-response/package.json +0 -42
  557. package/slides/node_modules/mimic-response/readme.md +0 -78
  558. package/slides/node_modules/minimist/.eslintrc +0 -29
  559. package/slides/node_modules/minimist/.github/FUNDING.yml +0 -12
  560. package/slides/node_modules/minimist/.nycrc +0 -14
  561. package/slides/node_modules/minimist/CHANGELOG.md +0 -298
  562. package/slides/node_modules/minimist/LICENSE +0 -18
  563. package/slides/node_modules/minimist/README.md +0 -121
  564. package/slides/node_modules/minimist/example/parse.js +0 -4
  565. package/slides/node_modules/minimist/index.js +0 -263
  566. package/slides/node_modules/minimist/package.json +0 -75
  567. package/slides/node_modules/minimist/test/all_bool.js +0 -34
  568. package/slides/node_modules/minimist/test/bool.js +0 -177
  569. package/slides/node_modules/minimist/test/dash.js +0 -43
  570. package/slides/node_modules/minimist/test/default_bool.js +0 -37
  571. package/slides/node_modules/minimist/test/dotted.js +0 -24
  572. package/slides/node_modules/minimist/test/kv_short.js +0 -32
  573. package/slides/node_modules/minimist/test/long.js +0 -33
  574. package/slides/node_modules/minimist/test/num.js +0 -38
  575. package/slides/node_modules/minimist/test/parse.js +0 -209
  576. package/slides/node_modules/minimist/test/parse_modified.js +0 -11
  577. package/slides/node_modules/minimist/test/proto.js +0 -64
  578. package/slides/node_modules/minimist/test/short.js +0 -69
  579. package/slides/node_modules/minimist/test/stop_early.js +0 -17
  580. package/slides/node_modules/minimist/test/unknown.js +0 -104
  581. package/slides/node_modules/minimist/test/whitespace.js +0 -10
  582. package/slides/node_modules/mkdirp-classic/LICENSE +0 -21
  583. package/slides/node_modules/mkdirp-classic/README.md +0 -18
  584. package/slides/node_modules/mkdirp-classic/index.js +0 -98
  585. package/slides/node_modules/mkdirp-classic/package.json +0 -18
  586. package/slides/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +0 -31
  587. package/slides/node_modules/napi-build-utils/LICENSE +0 -21
  588. package/slides/node_modules/napi-build-utils/README.md +0 -52
  589. package/slides/node_modules/napi-build-utils/index.js +0 -214
  590. package/slides/node_modules/napi-build-utils/index.md +0 -0
  591. package/slides/node_modules/napi-build-utils/package.json +0 -42
  592. package/slides/node_modules/node-abi/LICENSE +0 -21
  593. package/slides/node_modules/node-abi/README.md +0 -54
  594. package/slides/node_modules/node-abi/abi_registry.json +0 -439
  595. package/slides/node_modules/node-abi/index.js +0 -179
  596. package/slides/node_modules/node-abi/package.json +0 -45
  597. package/slides/node_modules/node-addon-api/LICENSE.md +0 -9
  598. package/slides/node_modules/node-addon-api/README.md +0 -319
  599. package/slides/node_modules/node-addon-api/common.gypi +0 -20
  600. package/slides/node_modules/node-addon-api/except.gypi +0 -25
  601. package/slides/node_modules/node-addon-api/index.js +0 -12
  602. package/slides/node_modules/node-addon-api/napi-inl.deprecated.h +0 -186
  603. package/slides/node_modules/node-addon-api/napi-inl.h +0 -6607
  604. package/slides/node_modules/node-addon-api/napi.h +0 -3201
  605. package/slides/node_modules/node-addon-api/node_addon_api.gyp +0 -32
  606. package/slides/node_modules/node-addon-api/node_api.gyp +0 -9
  607. package/slides/node_modules/node-addon-api/noexcept.gypi +0 -26
  608. package/slides/node_modules/node-addon-api/nothing.c +0 -0
  609. package/slides/node_modules/node-addon-api/package-support.json +0 -21
  610. package/slides/node_modules/node-addon-api/package.json +0 -480
  611. package/slides/node_modules/node-addon-api/tools/README.md +0 -73
  612. package/slides/node_modules/node-addon-api/tools/check-napi.js +0 -99
  613. package/slides/node_modules/node-addon-api/tools/clang-format.js +0 -71
  614. package/slides/node_modules/node-addon-api/tools/conversion.js +0 -301
  615. package/slides/node_modules/node-addon-api/tools/eslint-format.js +0 -79
  616. package/slides/node_modules/once/LICENSE +0 -15
  617. package/slides/node_modules/once/README.md +0 -79
  618. package/slides/node_modules/once/once.js +0 -42
  619. package/slides/node_modules/once/package.json +0 -33
  620. package/slides/node_modules/pako/CHANGELOG.md +0 -164
  621. package/slides/node_modules/pako/LICENSE +0 -21
  622. package/slides/node_modules/pako/README.md +0 -191
  623. package/slides/node_modules/pako/dist/pako.js +0 -6818
  624. package/slides/node_modules/pako/dist/pako.min.js +0 -1
  625. package/slides/node_modules/pako/dist/pako_deflate.js +0 -3997
  626. package/slides/node_modules/pako/dist/pako_deflate.min.js +0 -1
  627. package/slides/node_modules/pako/dist/pako_inflate.js +0 -3300
  628. package/slides/node_modules/pako/dist/pako_inflate.min.js +0 -1
  629. package/slides/node_modules/pako/index.js +0 -14
  630. package/slides/node_modules/pako/lib/deflate.js +0 -400
  631. package/slides/node_modules/pako/lib/inflate.js +0 -423
  632. package/slides/node_modules/pako/lib/utils/common.js +0 -105
  633. package/slides/node_modules/pako/lib/utils/strings.js +0 -187
  634. package/slides/node_modules/pako/lib/zlib/README +0 -59
  635. package/slides/node_modules/pako/lib/zlib/adler32.js +0 -51
  636. package/slides/node_modules/pako/lib/zlib/constants.js +0 -68
  637. package/slides/node_modules/pako/lib/zlib/crc32.js +0 -59
  638. package/slides/node_modules/pako/lib/zlib/deflate.js +0 -1874
  639. package/slides/node_modules/pako/lib/zlib/gzheader.js +0 -58
  640. package/slides/node_modules/pako/lib/zlib/inffast.js +0 -345
  641. package/slides/node_modules/pako/lib/zlib/inflate.js +0 -1556
  642. package/slides/node_modules/pako/lib/zlib/inftrees.js +0 -343
  643. package/slides/node_modules/pako/lib/zlib/messages.js +0 -32
  644. package/slides/node_modules/pako/lib/zlib/trees.js +0 -1222
  645. package/slides/node_modules/pako/lib/zlib/zstream.js +0 -47
  646. package/slides/node_modules/pako/package.json +0 -44
  647. package/slides/node_modules/pptxgenjs/LICENSE +0 -21
  648. package/slides/node_modules/pptxgenjs/README.md +0 -224
  649. package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js +0 -96
  650. package/slides/node_modules/pptxgenjs/dist/pptxgen.bundle.js.map +0 -1
  651. package/slides/node_modules/pptxgenjs/dist/pptxgen.cjs.js +0 -7370
  652. package/slides/node_modules/pptxgenjs/dist/pptxgen.es.js +0 -7368
  653. package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js +0 -96
  654. package/slides/node_modules/pptxgenjs/dist/pptxgen.min.js.map +0 -1
  655. package/slides/node_modules/pptxgenjs/package.json +0 -96
  656. package/slides/node_modules/pptxgenjs/types/index.d.ts +0 -2679
  657. package/slides/node_modules/prebuild-install/CHANGELOG.md +0 -131
  658. package/slides/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
  659. package/slides/node_modules/prebuild-install/LICENSE +0 -21
  660. package/slides/node_modules/prebuild-install/README.md +0 -163
  661. package/slides/node_modules/prebuild-install/asset.js +0 -44
  662. package/slides/node_modules/prebuild-install/bin.js +0 -78
  663. package/slides/node_modules/prebuild-install/download.js +0 -142
  664. package/slides/node_modules/prebuild-install/error.js +0 -14
  665. package/slides/node_modules/prebuild-install/help.txt +0 -16
  666. package/slides/node_modules/prebuild-install/index.js +0 -1
  667. package/slides/node_modules/prebuild-install/log.js +0 -33
  668. package/slides/node_modules/prebuild-install/package.json +0 -67
  669. package/slides/node_modules/prebuild-install/proxy.js +0 -35
  670. package/slides/node_modules/prebuild-install/rc.js +0 -64
  671. package/slides/node_modules/prebuild-install/util.js +0 -143
  672. package/slides/node_modules/process-nextick-args/index.js +0 -45
  673. package/slides/node_modules/process-nextick-args/license.md +0 -19
  674. package/slides/node_modules/process-nextick-args/package.json +0 -25
  675. package/slides/node_modules/process-nextick-args/readme.md +0 -18
  676. package/slides/node_modules/pump/.github/FUNDING.yml +0 -2
  677. package/slides/node_modules/pump/.travis.yml +0 -5
  678. package/slides/node_modules/pump/LICENSE +0 -21
  679. package/slides/node_modules/pump/README.md +0 -74
  680. package/slides/node_modules/pump/SECURITY.md +0 -5
  681. package/slides/node_modules/pump/empty.js +0 -1
  682. package/slides/node_modules/pump/index.js +0 -86
  683. package/slides/node_modules/pump/package.json +0 -30
  684. package/slides/node_modules/pump/test-browser.js +0 -66
  685. package/slides/node_modules/pump/test-node.js +0 -53
  686. package/slides/node_modules/queue/LICENSE +0 -8
  687. package/slides/node_modules/queue/index.d.ts +0 -173
  688. package/slides/node_modules/queue/index.js +0 -195
  689. package/slides/node_modules/queue/package.json +0 -43
  690. package/slides/node_modules/queue/readme.md +0 -221
  691. package/slides/node_modules/rc/LICENSE.APACHE2 +0 -15
  692. package/slides/node_modules/rc/LICENSE.BSD +0 -26
  693. package/slides/node_modules/rc/LICENSE.MIT +0 -24
  694. package/slides/node_modules/rc/README.md +0 -227
  695. package/slides/node_modules/rc/browser.js +0 -7
  696. package/slides/node_modules/rc/cli.js +0 -4
  697. package/slides/node_modules/rc/index.js +0 -53
  698. package/slides/node_modules/rc/lib/utils.js +0 -104
  699. package/slides/node_modules/rc/package.json +0 -29
  700. package/slides/node_modules/rc/test/ini.js +0 -16
  701. package/slides/node_modules/rc/test/nested-env-vars.js +0 -50
  702. package/slides/node_modules/rc/test/test.js +0 -59
  703. package/slides/node_modules/readable-stream/.travis.yml +0 -34
  704. package/slides/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  705. package/slides/node_modules/readable-stream/GOVERNANCE.md +0 -136
  706. package/slides/node_modules/readable-stream/LICENSE +0 -47
  707. package/slides/node_modules/readable-stream/README.md +0 -58
  708. package/slides/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
  709. package/slides/node_modules/readable-stream/duplex-browser.js +0 -1
  710. package/slides/node_modules/readable-stream/duplex.js +0 -1
  711. package/slides/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
  712. package/slides/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
  713. package/slides/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
  714. package/slides/node_modules/readable-stream/lib/_stream_transform.js +0 -214
  715. package/slides/node_modules/readable-stream/lib/_stream_writable.js +0 -685
  716. package/slides/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -78
  717. package/slides/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -84
  718. package/slides/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  719. package/slides/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  720. package/slides/node_modules/readable-stream/package.json +0 -52
  721. package/slides/node_modules/readable-stream/passthrough.js +0 -1
  722. package/slides/node_modules/readable-stream/readable-browser.js +0 -7
  723. package/slides/node_modules/readable-stream/readable.js +0 -19
  724. package/slides/node_modules/readable-stream/transform.js +0 -1
  725. package/slides/node_modules/readable-stream/writable-browser.js +0 -1
  726. package/slides/node_modules/readable-stream/writable.js +0 -8
  727. package/slides/node_modules/safe-buffer/LICENSE +0 -21
  728. package/slides/node_modules/safe-buffer/README.md +0 -584
  729. package/slides/node_modules/safe-buffer/index.d.ts +0 -187
  730. package/slides/node_modules/safe-buffer/index.js +0 -62
  731. package/slides/node_modules/safe-buffer/package.json +0 -37
  732. package/slides/node_modules/semver/LICENSE +0 -15
  733. package/slides/node_modules/semver/README.md +0 -665
  734. package/slides/node_modules/semver/bin/semver.js +0 -191
  735. package/slides/node_modules/semver/classes/comparator.js +0 -143
  736. package/slides/node_modules/semver/classes/index.js +0 -7
  737. package/slides/node_modules/semver/classes/range.js +0 -557
  738. package/slides/node_modules/semver/classes/semver.js +0 -333
  739. package/slides/node_modules/semver/functions/clean.js +0 -8
  740. package/slides/node_modules/semver/functions/cmp.js +0 -54
  741. package/slides/node_modules/semver/functions/coerce.js +0 -62
  742. package/slides/node_modules/semver/functions/compare-build.js +0 -9
  743. package/slides/node_modules/semver/functions/compare-loose.js +0 -5
  744. package/slides/node_modules/semver/functions/compare.js +0 -7
  745. package/slides/node_modules/semver/functions/diff.js +0 -60
  746. package/slides/node_modules/semver/functions/eq.js +0 -5
  747. package/slides/node_modules/semver/functions/gt.js +0 -5
  748. package/slides/node_modules/semver/functions/gte.js +0 -5
  749. package/slides/node_modules/semver/functions/inc.js +0 -21
  750. package/slides/node_modules/semver/functions/lt.js +0 -5
  751. package/slides/node_modules/semver/functions/lte.js +0 -5
  752. package/slides/node_modules/semver/functions/major.js +0 -5
  753. package/slides/node_modules/semver/functions/minor.js +0 -5
  754. package/slides/node_modules/semver/functions/neq.js +0 -5
  755. package/slides/node_modules/semver/functions/parse.js +0 -18
  756. package/slides/node_modules/semver/functions/patch.js +0 -5
  757. package/slides/node_modules/semver/functions/prerelease.js +0 -8
  758. package/slides/node_modules/semver/functions/rcompare.js +0 -5
  759. package/slides/node_modules/semver/functions/rsort.js +0 -5
  760. package/slides/node_modules/semver/functions/satisfies.js +0 -12
  761. package/slides/node_modules/semver/functions/sort.js +0 -5
  762. package/slides/node_modules/semver/functions/valid.js +0 -8
  763. package/slides/node_modules/semver/index.js +0 -91
  764. package/slides/node_modules/semver/internal/constants.js +0 -37
  765. package/slides/node_modules/semver/internal/debug.js +0 -11
  766. package/slides/node_modules/semver/internal/identifiers.js +0 -29
  767. package/slides/node_modules/semver/internal/lrucache.js +0 -42
  768. package/slides/node_modules/semver/internal/parse-options.js +0 -17
  769. package/slides/node_modules/semver/internal/re.js +0 -223
  770. package/slides/node_modules/semver/package.json +0 -78
  771. package/slides/node_modules/semver/preload.js +0 -4
  772. package/slides/node_modules/semver/range.bnf +0 -16
  773. package/slides/node_modules/semver/ranges/gtr.js +0 -6
  774. package/slides/node_modules/semver/ranges/intersects.js +0 -9
  775. package/slides/node_modules/semver/ranges/ltr.js +0 -6
  776. package/slides/node_modules/semver/ranges/max-satisfying.js +0 -27
  777. package/slides/node_modules/semver/ranges/min-satisfying.js +0 -26
  778. package/slides/node_modules/semver/ranges/min-version.js +0 -63
  779. package/slides/node_modules/semver/ranges/outside.js +0 -82
  780. package/slides/node_modules/semver/ranges/simplify.js +0 -49
  781. package/slides/node_modules/semver/ranges/subset.js +0 -249
  782. package/slides/node_modules/semver/ranges/to-comparators.js +0 -10
  783. package/slides/node_modules/semver/ranges/valid.js +0 -13
  784. package/slides/node_modules/setimmediate/LICENSE.txt +0 -20
  785. package/slides/node_modules/setimmediate/package.json +0 -30
  786. package/slides/node_modules/setimmediate/setImmediate.js +0 -186
  787. package/slides/node_modules/simple-concat/.travis.yml +0 -3
  788. package/slides/node_modules/simple-concat/LICENSE +0 -20
  789. package/slides/node_modules/simple-concat/README.md +0 -44
  790. package/slides/node_modules/simple-concat/index.js +0 -15
  791. package/slides/node_modules/simple-concat/package.json +0 -47
  792. package/slides/node_modules/simple-concat/test/basic.js +0 -41
  793. package/slides/node_modules/simple-get/.github/dependabot.yml +0 -15
  794. package/slides/node_modules/simple-get/.github/workflows/ci.yml +0 -23
  795. package/slides/node_modules/simple-get/LICENSE +0 -20
  796. package/slides/node_modules/simple-get/README.md +0 -333
  797. package/slides/node_modules/simple-get/index.js +0 -108
  798. package/slides/node_modules/simple-get/package.json +0 -67
  799. package/slides/node_modules/string_decoder/.travis.yml +0 -50
  800. package/slides/node_modules/string_decoder/LICENSE +0 -48
  801. package/slides/node_modules/string_decoder/README.md +0 -47
  802. package/slides/node_modules/string_decoder/lib/string_decoder.js +0 -296
  803. package/slides/node_modules/string_decoder/package.json +0 -31
  804. package/slides/node_modules/strip-json-comments/index.js +0 -70
  805. package/slides/node_modules/strip-json-comments/license +0 -21
  806. package/slides/node_modules/strip-json-comments/package.json +0 -42
  807. package/slides/node_modules/strip-json-comments/readme.md +0 -64
  808. package/slides/node_modules/tar-fs/.travis.yml +0 -6
  809. package/slides/node_modules/tar-fs/LICENSE +0 -21
  810. package/slides/node_modules/tar-fs/README.md +0 -165
  811. package/slides/node_modules/tar-fs/index.js +0 -363
  812. package/slides/node_modules/tar-fs/package.json +0 -41
  813. package/slides/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
  814. package/slides/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
  815. package/slides/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  816. package/slides/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  817. package/slides/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  818. package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  819. package/slides/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  820. package/slides/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  821. package/slides/node_modules/tar-fs/test/fixtures/e/file +0 -0
  822. package/slides/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  823. package/slides/node_modules/tar-fs/test/index.js +0 -346
  824. package/slides/node_modules/tar-stream/LICENSE +0 -21
  825. package/slides/node_modules/tar-stream/README.md +0 -168
  826. package/slides/node_modules/tar-stream/extract.js +0 -257
  827. package/slides/node_modules/tar-stream/headers.js +0 -295
  828. package/slides/node_modules/tar-stream/index.js +0 -2
  829. package/slides/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  830. package/slides/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md +0 -136
  831. package/slides/node_modules/tar-stream/node_modules/readable-stream/LICENSE +0 -47
  832. package/slides/node_modules/tar-stream/node_modules/readable-stream/README.md +0 -106
  833. package/slides/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js +0 -127
  834. package/slides/node_modules/tar-stream/node_modules/readable-stream/errors.js +0 -116
  835. package/slides/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js +0 -17
  836. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  837. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  838. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  839. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  840. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  841. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  842. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  843. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  844. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  845. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  846. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  847. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  848. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  849. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  850. package/slides/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  851. package/slides/node_modules/tar-stream/node_modules/readable-stream/package.json +0 -68
  852. package/slides/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js +0 -9
  853. package/slides/node_modules/tar-stream/node_modules/readable-stream/readable.js +0 -16
  854. package/slides/node_modules/tar-stream/pack.js +0 -255
  855. package/slides/node_modules/tar-stream/package.json +0 -58
  856. package/slides/node_modules/tar-stream/sandbox.js +0 -11
  857. package/slides/node_modules/tunnel-agent/LICENSE +0 -55
  858. package/slides/node_modules/tunnel-agent/README.md +0 -4
  859. package/slides/node_modules/tunnel-agent/index.js +0 -244
  860. package/slides/node_modules/tunnel-agent/package.json +0 -22
  861. package/slides/node_modules/undici-types/LICENSE +0 -21
  862. package/slides/node_modules/undici-types/README.md +0 -6
  863. package/slides/node_modules/undici-types/agent.d.ts +0 -31
  864. package/slides/node_modules/undici-types/api.d.ts +0 -43
  865. package/slides/node_modules/undici-types/balanced-pool.d.ts +0 -29
  866. package/slides/node_modules/undici-types/cache.d.ts +0 -36
  867. package/slides/node_modules/undici-types/client.d.ts +0 -108
  868. package/slides/node_modules/undici-types/connector.d.ts +0 -34
  869. package/slides/node_modules/undici-types/content-type.d.ts +0 -21
  870. package/slides/node_modules/undici-types/cookies.d.ts +0 -28
  871. package/slides/node_modules/undici-types/diagnostics-channel.d.ts +0 -66
  872. package/slides/node_modules/undici-types/dispatcher.d.ts +0 -256
  873. package/slides/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -21
  874. package/slides/node_modules/undici-types/errors.d.ts +0 -149
  875. package/slides/node_modules/undici-types/eventsource.d.ts +0 -61
  876. package/slides/node_modules/undici-types/fetch.d.ts +0 -209
  877. package/slides/node_modules/undici-types/file.d.ts +0 -39
  878. package/slides/node_modules/undici-types/filereader.d.ts +0 -54
  879. package/slides/node_modules/undici-types/formdata.d.ts +0 -108
  880. package/slides/node_modules/undici-types/global-dispatcher.d.ts +0 -9
  881. package/slides/node_modules/undici-types/global-origin.d.ts +0 -7
  882. package/slides/node_modules/undici-types/handlers.d.ts +0 -15
  883. package/slides/node_modules/undici-types/header.d.ts +0 -4
  884. package/slides/node_modules/undici-types/index.d.ts +0 -71
  885. package/slides/node_modules/undici-types/interceptors.d.ts +0 -17
  886. package/slides/node_modules/undici-types/mock-agent.d.ts +0 -50
  887. package/slides/node_modules/undici-types/mock-client.d.ts +0 -25
  888. package/slides/node_modules/undici-types/mock-errors.d.ts +0 -12
  889. package/slides/node_modules/undici-types/mock-interceptor.d.ts +0 -93
  890. package/slides/node_modules/undici-types/mock-pool.d.ts +0 -25
  891. package/slides/node_modules/undici-types/package.json +0 -55
  892. package/slides/node_modules/undici-types/patch.d.ts +0 -33
  893. package/slides/node_modules/undici-types/pool-stats.d.ts +0 -19
  894. package/slides/node_modules/undici-types/pool.d.ts +0 -39
  895. package/slides/node_modules/undici-types/proxy-agent.d.ts +0 -28
  896. package/slides/node_modules/undici-types/readable.d.ts +0 -65
  897. package/slides/node_modules/undici-types/retry-agent.d.ts +0 -8
  898. package/slides/node_modules/undici-types/retry-handler.d.ts +0 -116
  899. package/slides/node_modules/undici-types/util.d.ts +0 -18
  900. package/slides/node_modules/undici-types/webidl.d.ts +0 -228
  901. package/slides/node_modules/undici-types/websocket.d.ts +0 -150
  902. package/slides/node_modules/util-deprecate/History.md +0 -16
  903. package/slides/node_modules/util-deprecate/LICENSE +0 -24
  904. package/slides/node_modules/util-deprecate/README.md +0 -53
  905. package/slides/node_modules/util-deprecate/browser.js +0 -67
  906. package/slides/node_modules/util-deprecate/node.js +0 -6
  907. package/slides/node_modules/util-deprecate/package.json +0 -27
  908. package/slides/node_modules/wrappy/LICENSE +0 -15
  909. package/slides/node_modules/wrappy/README.md +0 -36
  910. package/slides/node_modules/wrappy/package.json +0 -29
  911. package/slides/node_modules/wrappy/wrappy.js +0 -33
  912. package/slides/package-lock.json +0 -536
  913. package/slides/package.json +0 -16
  914. package/slides/slides.json +0 -238
@@ -1,1120 +0,0 @@
1
- // FSL-1.1-Apache-2.0 — see LICENSE
2
- const pptxgen = require('pptxgenjs');
3
- const { createCanvas } = require('canvas');
4
- const fs = require('fs');
5
-
6
- const data = JSON.parse(fs.readFileSync('slides.json', 'utf8'));
7
- const { meta, slides } = data;
8
-
9
- const ACCENT = meta.accentColor || '4338CA';
10
- const ACCENT_L = meta.accentLight || '6366F1';
11
- const AMBER = meta.amber || 'D97706';
12
- const AMBER_L = meta.amberLight || 'F59E0B';
13
- const ROSE = meta.rose || 'E11D48';
14
- const FONT_H = meta.fontHeader || 'Georgia';
15
- const FONT_B = meta.fontBody || 'Arial';
16
-
17
- const pres = new pptxgen();
18
- pres.layout = 'LAYOUT_16x9';
19
-
20
- const LAYOUT = {
21
- SLIDE_W: 10, SLIDE_H: 5.625,
22
- SAFE_X: 0.6, SAFE_R: 9.4, SAFE_W: 8.8,
23
- SAFE_TOP: 0.65, SAFE_BOT: 5.125, SAFE_H: 4.475,
24
- GAP_TIGHT: 0.1, GAP_STD: 0.25, GAP_SECTION: 0.4,
25
- TEXT_INSET: 0.2, BRAND_Y: 0.25, BRAND_H: 0.3,
26
- CONTENT_START: 0.65,
27
- };
28
-
29
- // ═══════════════════════════════════════════════════════════
30
- // UTILITIES
31
- // ═══════════════════════════════════════════════════════════
32
-
33
- function estimateTextHeight(text, fontSize, boxWidth, opts = {}) {
34
- const charWidthFactor = opts.bold ? 0.0075 : 0.007;
35
- const avgCharWidth = fontSize * charWidthFactor;
36
- const margin = opts.margin !== undefined ? opts.margin : 0.1;
37
- const effectiveWidth = boxWidth - (margin * 2);
38
- const charsPerLine = Math.floor(effectiveWidth / avgCharWidth);
39
- if (charsPerLine <= 0) return fontSize / 72;
40
- const words = text.split(/\s+/);
41
- let lines = 1, lineLen = 0;
42
- for (const word of words) {
43
- if (lineLen + word.length > charsPerLine && lineLen > 0) { lines++; lineLen = word.length; }
44
- else { lineLen += (lineLen > 0 ? 1 : 0) + word.length; }
45
- }
46
- lines += (text.match(/\n/g) || []).length;
47
- const lineHeight = (fontSize * 1.3) / 72;
48
- return Math.max(lines * lineHeight, fontSize / 72);
49
- }
50
-
51
- function gradientBg(w, h, angle, stops) {
52
- const c = createCanvas(w, h);
53
- const ctx = c.getContext('2d');
54
- const rad = (angle * Math.PI) / 180;
55
- const g = ctx.createLinearGradient(
56
- w/2 - Math.cos(rad)*w, h/2 - Math.sin(rad)*h,
57
- w/2 + Math.cos(rad)*w, h/2 + Math.sin(rad)*h
58
- );
59
- stops.forEach(([p, col]) => g.addColorStop(p, col));
60
- ctx.fillStyle = g; ctx.fillRect(0, 0, w, h);
61
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
62
- }
63
-
64
- function renderOrb(accent = '#4338CA', size = 800) {
65
- const c = createCanvas(size, size);
66
- const ctx = c.getContext('2d');
67
- const cx = size/2, cy = size/2, r = size*0.44;
68
- const g = ctx.createRadialGradient(cx*0.7, cy*0.6, r*0.1, cx, cy, r);
69
- g.addColorStop(0, accent + '80');
70
- g.addColorStop(0.4, accent + '4D');
71
- g.addColorStop(1, accent + '0D');
72
- ctx.fillStyle = g; ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI*2); ctx.fill();
73
- const h = ctx.createRadialGradient(cx*0.65, cy*0.5, 0, cx*0.65, cy*0.5, r*0.5);
74
- h.addColorStop(0, 'rgba(255,255,255,0.3)');
75
- h.addColorStop(1, 'rgba(255,255,255,0)');
76
- ctx.fillStyle = h; ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI*2); ctx.fill();
77
- const s = ctx.createRadialGradient(cx, size*0.88, 0, cx, size*0.88, r*0.7);
78
- s.addColorStop(0, 'rgba(0,0,0,0.2)');
79
- s.addColorStop(1, 'rgba(0,0,0,0)');
80
- ctx.fillStyle = s; ctx.beginPath(); ctx.ellipse(cx, size*0.88, r*0.8, r*0.15, 0, 0, Math.PI*2); ctx.fill();
81
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
82
- }
83
-
84
- function renderBlob(accent = '#E11D48', size = 600) {
85
- const c = createCanvas(size, size);
86
- const ctx = c.getContext('2d');
87
- const g = ctx.createRadialGradient(size*0.4, size*0.4, 0, size*0.5, size*0.5, size*0.45);
88
- g.addColorStop(0, accent + '59');
89
- g.addColorStop(1, accent + '00');
90
- ctx.filter = 'blur(30px)';
91
- ctx.fillStyle = g;
92
- ctx.beginPath();
93
- ctx.moveTo(300, 80);
94
- ctx.bezierCurveTo(420, 80, 520, 180, 500, 300);
95
- ctx.bezierCurveTo(480, 420, 380, 520, 260, 500);
96
- ctx.bezierCurveTo(140, 480, 60, 380, 80, 260);
97
- ctx.bezierCurveTo(100, 140, 180, 80, 300, 80);
98
- ctx.fill();
99
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
100
- }
101
-
102
- function renderRing(pct, accent = '#4338CA', size = 300) {
103
- const c = createCanvas(size, size);
104
- const ctx = c.getContext('2d');
105
- const cx = size/2, cy = size/2, r = size*0.38, lw = size*0.09;
106
- ctx.strokeStyle = 'rgba(255,255,255,0.05)';
107
- ctx.lineWidth = lw; ctx.lineCap = 'round';
108
- ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI*2); ctx.stroke();
109
- const grad = ctx.createLinearGradient(0, 0, size, size);
110
- grad.addColorStop(0, accent); grad.addColorStop(1, accent + 'AA');
111
- ctx.strokeStyle = grad; ctx.lineWidth = lw; ctx.lineCap = 'round';
112
- ctx.shadowColor = accent; ctx.shadowBlur = 12;
113
- ctx.beginPath(); ctx.arc(cx, cy, r, -Math.PI/2, -Math.PI/2 + Math.PI*2*pct); ctx.stroke();
114
- ctx.shadowBlur = 0;
115
- ctx.fillStyle = '#fff'; ctx.font = `bold ${Math.round(size*0.18)}px Georgia`;
116
- ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
117
- ctx.fillText(Math.round(pct*100)+'%', cx, cy);
118
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
119
- }
120
-
121
- function renderProgressArc(pct, accent = '#4338CA', size = 400) {
122
- const c = createCanvas(size, size);
123
- const ctx = c.getContext('2d');
124
- const cx = size/2, cy = size/2, r = size*0.4, lw = size*0.08;
125
- ctx.strokeStyle = 'rgba(255,255,255,0.04)';
126
- ctx.lineWidth = lw; ctx.lineCap = 'round';
127
- ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI*2); ctx.stroke();
128
- const grad = ctx.createLinearGradient(0, 0, size, size);
129
- grad.addColorStop(0, '#6366F1'); grad.addColorStop(1, accent);
130
- ctx.strokeStyle = grad; ctx.lineWidth = lw; ctx.lineCap = 'round';
131
- ctx.shadowColor = accent; ctx.shadowBlur = 16;
132
- ctx.beginPath(); ctx.arc(cx, cy, r, -Math.PI/2, -Math.PI/2 + Math.PI*2*pct); ctx.stroke();
133
- ctx.shadowBlur = 0;
134
- ctx.fillStyle = '#fff'; ctx.font = `bold ${Math.round(size*0.16)}px Georgia`;
135
- ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
136
- ctx.fillText(Math.round(pct*100)+'%', cx, cy - size*0.02);
137
- ctx.fillStyle = 'rgba(255,255,255,0.5)'; ctx.font = `${Math.round(size*0.045)}px Arial`;
138
- ctx.fillText('Quality Score', cx, cy + size*0.08);
139
- ctx.fillStyle = '#6366F1'; ctx.font = `bold ${Math.round(size*0.035)}px Arial`;
140
- ctx.fillText('HEALTHY', cx, cy + size*0.14);
141
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
142
- }
143
-
144
- function renderSpline(accent = '#4338CA', w = 1200, h = 300) {
145
- const c = createCanvas(w, h);
146
- const ctx = c.getContext('2d');
147
- ctx.strokeStyle = 'rgba(255,255,255,0.04)';
148
- ctx.lineWidth = 1;
149
- for (let y = 0; y < h; y += h/4) { ctx.beginPath(); ctx.moveTo(40, y); ctx.lineTo(w-20, y); ctx.stroke(); }
150
- const grad = ctx.createLinearGradient(0, 0, 0, h);
151
- grad.addColorStop(0, accent + '40'); grad.addColorStop(1, accent + '00');
152
- ctx.fillStyle = grad;
153
- ctx.beginPath();
154
- ctx.moveTo(40, h*0.85);
155
- ctx.bezierCurveTo(w*0.2, h*0.8, w*0.3, h*0.55, w*0.45, h*0.42);
156
- ctx.bezierCurveTo(w*0.55, h*0.32, w*0.7, h*0.18, w*0.85, h*0.12);
157
- ctx.lineTo(w*0.85, h); ctx.lineTo(40, h); ctx.closePath(); ctx.fill();
158
- ctx.strokeStyle = '#6366F1'; ctx.lineWidth = 3; ctx.lineCap = 'round';
159
- ctx.shadowColor = accent; ctx.shadowBlur = 8;
160
- ctx.beginPath();
161
- ctx.moveTo(40, h*0.85);
162
- ctx.bezierCurveTo(w*0.2, h*0.8, w*0.3, h*0.55, w*0.45, h*0.42);
163
- ctx.bezierCurveTo(w*0.55, h*0.32, w*0.7, h*0.18, w*0.85, h*0.12);
164
- ctx.stroke();
165
- ctx.shadowBlur = 0;
166
- const points = [[40, h*0.85], [w*0.45, h*0.42], [w*0.85, h*0.12]];
167
- points.forEach(([px, py]) => {
168
- ctx.fillStyle = '#6366F1'; ctx.shadowColor = accent; ctx.shadowBlur = 10;
169
- ctx.beginPath(); ctx.arc(px, py, 5, 0, Math.PI*2); ctx.fill();
170
- });
171
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
172
- }
173
-
174
- function renderRadar(accent = '#4338CA', size = 400) {
175
- const c = createCanvas(size, size);
176
- const ctx = c.getContext('2d');
177
- const cx = size/2, cy = size/2;
178
- const axes = 6;
179
- const labels = ['Speed', 'Quality', 'Accuracy', 'Cost', 'Context', 'Multi-tool'];
180
- const grooveData = [0.92, 0.9, 0.88, 0.85, 0.9, 0.95];
181
- const altData = [0.6, 0.7, 0.65, 0.55, 0.5, 0.3];
182
- function polyPoints(data, maxR) {
183
- return data.map((v, i) => {
184
- const angle = (i * Math.PI * 2 / axes) - Math.PI/2;
185
- return [cx + maxR * v * Math.cos(angle), cy + maxR * v * Math.sin(angle)];
186
- });
187
- }
188
- [0.33, 0.66, 1.0].forEach(scale => {
189
- const r = size * 0.38 * scale;
190
- ctx.strokeStyle = 'rgba(255,255,255,0.04)'; ctx.lineWidth = 1;
191
- ctx.beginPath();
192
- for (let i = 0; i <= axes; i++) {
193
- const angle = (i * Math.PI * 2 / axes) - Math.PI/2;
194
- const method = i === 0 ? 'moveTo' : 'lineTo';
195
- ctx[method](cx + r * Math.cos(angle), cy + r * Math.sin(angle));
196
- }
197
- ctx.stroke();
198
- });
199
- for (let i = 0; i < axes; i++) {
200
- const angle = (i * Math.PI * 2 / axes) - Math.PI/2;
201
- ctx.strokeStyle = 'rgba(255,255,255,0.03)'; ctx.lineWidth = 1;
202
- ctx.beginPath(); ctx.moveTo(cx, cy);
203
- ctx.lineTo(cx + size*0.38 * Math.cos(angle), cy + size*0.38 * Math.sin(angle));
204
- ctx.stroke();
205
- }
206
- const altPts = polyPoints(altData, size*0.38);
207
- ctx.fillStyle = '#D9770614'; ctx.strokeStyle = '#D97706'; ctx.lineWidth = 1;
208
- ctx.setLineDash([4, 4]); ctx.globalAlpha = 0.5;
209
- ctx.beginPath(); altPts.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));
210
- ctx.closePath(); ctx.fill(); ctx.stroke();
211
- ctx.setLineDash([]); ctx.globalAlpha = 1;
212
- const gPts = polyPoints(grooveData, size*0.38);
213
- ctx.fillStyle = accent + '26'; ctx.strokeStyle = '#6366F1'; ctx.lineWidth = 2;
214
- ctx.shadowColor = accent; ctx.shadowBlur = 8;
215
- ctx.beginPath(); gPts.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));
216
- ctx.closePath(); ctx.fill(); ctx.stroke();
217
- ctx.shadowBlur = 0;
218
- gPts.forEach(([x, y]) => {
219
- ctx.fillStyle = '#6366F1'; ctx.beginPath(); ctx.arc(x, y, 4, 0, Math.PI*2); ctx.fill();
220
- });
221
- ctx.fillStyle = 'rgba(255,255,255,0.5)'; ctx.font = `${Math.round(size*0.028)}px Arial`;
222
- ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
223
- labels.forEach((label, i) => {
224
- const angle = (i * Math.PI * 2 / axes) - Math.PI/2;
225
- const lr = size * 0.48;
226
- ctx.fillText(label, cx + lr * Math.cos(angle), cy + lr * Math.sin(angle));
227
- });
228
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
229
- }
230
-
231
- function renderHeatmap(heatData, accent = '#4338CA', w = 700, h = 350) {
232
- const c = createCanvas(w, h);
233
- const ctx = c.getContext('2d');
234
- const { providers, features, matrix } = heatData;
235
- const rowH = (h - 40) / features.length;
236
- const colW = (w - 130) / providers.length;
237
- ctx.fillStyle = 'rgba(255,255,255,0.4)'; ctx.font = '11px Arial'; ctx.textAlign = 'center';
238
- providers.forEach((p, i) => { ctx.fillText(p, 130 + i * colW + colW/2, 20); });
239
- ctx.textAlign = 'right';
240
- features.forEach((f, i) => {
241
- ctx.fillStyle = 'rgba(255,255,255,0.6)'; ctx.font = '11px Arial';
242
- ctx.fillText(f, 120, 40 + i * rowH + rowH/2 + 4);
243
- matrix[i].forEach((val, j) => {
244
- const x = 130 + j * colW + 2;
245
- const y = 40 + i * rowH + 2;
246
- ctx.fillStyle = `rgba(67, 56, 202, ${val * 0.85})`;
247
- ctx.fillRect(x, y, colW - 4, rowH - 4);
248
- if (val >= 0.7) {
249
- ctx.fillStyle = '#fff'; ctx.font = '14px Arial'; ctx.textAlign = 'center';
250
- ctx.fillText('\u2713', x + (colW-4)/2, y + (rowH-4)/2 + 5);
251
- } else if (val < 0.3 && val > 0) {
252
- ctx.fillStyle = 'rgba(255,255,255,0.4)'; ctx.font = '12px Arial'; ctx.textAlign = 'center';
253
- ctx.fillText('\u2014', x + (colW-4)/2, y + (rowH-4)/2 + 4);
254
- } else if (val === 0) {
255
- ctx.fillStyle = 'rgba(255,255,255,0.3)'; ctx.font = '12px Arial'; ctx.textAlign = 'center';
256
- ctx.fillText('\u2717', x + (colW-4)/2, y + (rowH-4)/2 + 4);
257
- }
258
- });
259
- });
260
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
261
- }
262
-
263
- function renderConcentricRings(accent = '#4338CA', size = 500) {
264
- const c = createCanvas(size, size);
265
- const ctx = c.getContext('2d');
266
- const cx = size/2, cy = size/2;
267
- [{ r: size*0.42, o: 0.06, sw: 0.15 }, { r: size*0.28, o: 0.12, sw: 0.25 }, { r: size*0.13, o: 0.25, sw: 1 }].forEach(ring => {
268
- ctx.fillStyle = accent + Math.round(ring.o * 255).toString(16).padStart(2, '0');
269
- ctx.beginPath(); ctx.arc(cx, cy, ring.r, 0, Math.PI*2); ctx.fill();
270
- ctx.strokeStyle = '#6366F1'; ctx.lineWidth = ring.sw; ctx.globalAlpha = ring.sw < 1 ? 0.2 : 0.5;
271
- ctx.beginPath(); ctx.arc(cx, cy, ring.r, 0, Math.PI*2); ctx.stroke();
272
- ctx.globalAlpha = 1;
273
- });
274
- ctx.shadowColor = accent; ctx.shadowBlur = 8;
275
- ctx.fillStyle = '#fff'; ctx.font = `bold ${Math.round(size*0.06)}px Georgia`;
276
- ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
277
- ctx.fillText('$800M', cx, cy);
278
- ctx.shadowBlur = 0;
279
- ctx.fillStyle = 'rgba(255,255,255,0.6)'; ctx.font = `${Math.round(size*0.042)}px Georgia`;
280
- ctx.fillText('$8B', cx, cy - size*0.22);
281
- ctx.fillStyle = 'rgba(255,255,255,0.4)';
282
- ctx.fillText('$45B', cx, cy - size*0.38);
283
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
284
- }
285
-
286
- function renderBeforeAfter(w = 800, h = 400) {
287
- const c = createCanvas(w, h);
288
- const ctx = c.getContext('2d');
289
- const mid = w / 2;
290
- ctx.strokeStyle = 'rgba(255,255,255,0.06)'; ctx.lineWidth = 1;
291
- ctx.beginPath(); ctx.moveTo(mid, 0); ctx.lineTo(mid, h); ctx.stroke();
292
- const chaosPoints = [];
293
- for (let i = 0; i < 12; i++) {
294
- chaosPoints.push([Math.random() * (mid - 40) + 20, Math.random() * (h - 40) + 20]);
295
- }
296
- chaosPoints.forEach(([x, y]) => {
297
- ctx.fillStyle = `rgba(225, 29, 72, ${0.2 + Math.random() * 0.35})`;
298
- ctx.beginPath(); ctx.arc(x, y, 3 + Math.random() * 5, 0, Math.PI*2); ctx.fill();
299
- });
300
- for (let i = 0; i < 6; i++) {
301
- const [x1, y1] = chaosPoints[i*2];
302
- const [x2, y2] = chaosPoints[i*2+1];
303
- ctx.strokeStyle = 'rgba(225, 29, 72, 0.15)'; ctx.lineWidth = 0.5;
304
- ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke();
305
- }
306
- const nodes = [[mid+60, 50], [mid+180, 50], [mid+300, 50], [mid+120, 140], [mid+240, 140], [mid+180, 230]];
307
- nodes.forEach(([x, y]) => {
308
- ctx.strokeStyle = '#6366F1'; ctx.lineWidth = 1.5;
309
- ctx.fillStyle = 'rgba(255,255,255,0.04)';
310
- ctx.beginPath(); ctx.arc(x, y, 12, 0, Math.PI*2); ctx.fill(); ctx.stroke();
311
- });
312
- const connections = [[0,3],[1,3],[1,4],[2,4],[3,5],[4,5]];
313
- connections.forEach(([a, b]) => {
314
- ctx.strokeStyle = 'rgba(99, 102, 241, 0.35)'; ctx.lineWidth = 1;
315
- ctx.beginPath(); ctx.moveTo(nodes[a][0], nodes[a][1]+12); ctx.lineTo(nodes[b][0], nodes[b][1]-12); ctx.stroke();
316
- });
317
- ctx.fillStyle = 'rgba(225, 29, 72, 0.7)'; ctx.font = 'bold 11px Arial'; ctx.textAlign = 'center';
318
- ctx.fillText('HARNESSES', mid/2, h - 20);
319
- ctx.fillStyle = 'rgba(99, 102, 241, 0.7)';
320
- ctx.fillText('GROOVE', mid + (w-mid)/2, h - 20);
321
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
322
- }
323
-
324
- function renderNodeGraph(accent = '#4338CA', w = 600, h = 400) {
325
- const c = createCanvas(w, h);
326
- const ctx = c.getContext('2d');
327
- const nodes = [
328
- { x: w*0.5, y: 30, r: 22, label: 'GROOVE', color: '#6366F1' },
329
- { x: w*0.25, y: 130, r: 18, label: 'Claude', color: '#818CF8' },
330
- { x: w*0.75, y: 130, r: 18, label: 'Codex', color: '#A78BFA' },
331
- { x: w*0.15, y: 240, r: 15, label: 'Gemini', color: '#D97706' },
332
- { x: w*0.5, y: 240, r: 15, label: 'Ollama', color: '#F59E0B' },
333
- { x: w*0.85, y: 240, r: 15, label: 'Aider', color: '#818CF8' },
334
- { x: w*0.5, y: 340, r: 20, label: 'GUI', color: '#FBBF24' },
335
- ];
336
- const edges = [[0,1],[0,2],[1,3],[1,4],[2,4],[2,5],[3,6],[4,6],[5,6]];
337
- edges.forEach(([a, b]) => {
338
- ctx.strokeStyle = nodes[a].color; ctx.lineWidth = 1.5; ctx.globalAlpha = 0.3;
339
- ctx.beginPath();
340
- ctx.moveTo(nodes[a].x, nodes[a].y + nodes[a].r);
341
- const cpY = (nodes[a].y + nodes[b].y) / 2;
342
- ctx.bezierCurveTo(nodes[a].x, cpY, nodes[b].x, cpY, nodes[b].x, nodes[b].y - nodes[b].r);
343
- ctx.stroke(); ctx.globalAlpha = 1;
344
- });
345
- nodes.forEach(n => {
346
- ctx.fillStyle = 'rgba(255,255,255,0.05)';
347
- ctx.strokeStyle = n.color; ctx.lineWidth = 2;
348
- ctx.beginPath(); ctx.arc(n.x, n.y, n.r, 0, Math.PI*2); ctx.fill(); ctx.stroke();
349
- ctx.fillStyle = '#fff'; ctx.font = `bold ${n.r < 18 ? 8 : 9}px Arial`;
350
- ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
351
- ctx.fillText(n.label, n.x, n.y);
352
- });
353
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
354
- }
355
-
356
- function renderBars(items, w = 500, h = 350) {
357
- const c = createCanvas(w, h);
358
- const ctx = c.getContext('2d');
359
- const barH = 32;
360
- const gap = 15;
361
- const maxVal = Math.max(...items.map(i => parseFloat(i.value)));
362
- const labelW = 80;
363
- const barMaxW = w - labelW - 60;
364
- items.forEach((item, i) => {
365
- const y = 20 + i * (barH + gap);
366
- const val = parseFloat(item.value);
367
- const barW = (val / maxVal) * barMaxW;
368
- const grad = ctx.createLinearGradient(labelW, 0, labelW + barW, 0);
369
- const color = item.color || ACCENT_L;
370
- grad.addColorStop(0, '#' + color + '1A');
371
- grad.addColorStop(1, '#' + color + 'CC');
372
- ctx.fillStyle = grad;
373
- ctx.beginPath();
374
- const radius = 3;
375
- ctx.moveTo(labelW, y); ctx.lineTo(labelW + barW - radius, y);
376
- ctx.arcTo(labelW + barW, y, labelW + barW, y + radius, radius);
377
- ctx.lineTo(labelW + barW, y + barH - radius);
378
- ctx.arcTo(labelW + barW, y + barH, labelW + barW - radius, y + barH, radius);
379
- ctx.lineTo(labelW, y + barH); ctx.closePath(); ctx.fill();
380
- ctx.fillStyle = 'rgba(255,255,255,0.5)'; ctx.font = '11px Arial';
381
- ctx.textAlign = 'right'; ctx.textBaseline = 'middle';
382
- ctx.fillText(item.label, labelW - 8, y + barH/2);
383
- ctx.fillStyle = 'rgba(255,255,255,0.6)'; ctx.font = 'bold 12px Georgia';
384
- ctx.textAlign = 'left';
385
- ctx.fillText(item.value, labelW + barW + 8, y + barH/2);
386
- });
387
- return 'image/png;base64,' + c.toBuffer('image/png').toString('base64');
388
- }
389
-
390
- // ═══════════════════════════════════════════════════════════
391
- // LAYOUT HELPERS
392
- // ═══════════════════════════════════════════════════════════
393
-
394
- function getBg(slideDef) {
395
- const bgName = slideDef.background || 'steel';
396
- const bg = meta.backgrounds[bgName] || meta.backgroundGradient;
397
- return gradientBg(1920, 1080, bg.angle, bg.stops);
398
- }
399
-
400
- function slideWithBg(slideDef, category) {
401
- const s = pres.addSlide();
402
- s.background = { data: getBg(slideDef) };
403
- s.addText(meta.brand, {
404
- x: 0.6, y: 0.25, w: 3, h: 0.3,
405
- fontSize: 11, fontFace: FONT_B, bold: true, color: 'F5F5F5', margin: 0
406
- });
407
- if (category) {
408
- s.addText(category.toUpperCase(), {
409
- x: 6.5, y: 0.25, w: 3, h: 0.3,
410
- fontSize: 9, fontFace: FONT_B, bold: true,
411
- color: '94A3B8', align: 'right', charSpacing: 5, margin: 0
412
- });
413
- }
414
- return s;
415
- }
416
-
417
- function addDivider(slide, y, x = 0.6, w = 8.8) {
418
- slide.addShape(pres.shapes.LINE, { x, y, w, h: 0, line: { color: 'FFFFFF', width: 0.5, transparency: 94 } });
419
- }
420
-
421
- function accentBorder(slide, x, y, h, color = ACCENT) {
422
- slide.addShape(pres.shapes.LINE, { x, y, w: 0, h, line: { color, width: 3 } });
423
- }
424
-
425
- function colDivider(slide, x, y, h) {
426
- slide.addShape(pres.shapes.LINE, { x, y, w: 0, h, line: { color: 'FFFFFF', width: 0.5, transparency: 88 } });
427
- }
428
-
429
- function columnLayout(cols, rows, area, gap = 0.4) {
430
- const colW = (area.w - gap * (cols - 1)) / cols;
431
- const rowH = (area.h - gap * (rows - 1)) / rows;
432
- const positions = [];
433
- for (let r = 0; r < rows; r++) {
434
- for (let c = 0; c < cols; c++) {
435
- positions.push({ x: area.x + c * (colW + gap), y: area.y + r * (rowH + gap), w: colW, h: rowH });
436
- }
437
- }
438
- return positions;
439
- }
440
-
441
- // ═══════════════════════════════════════════════════════════
442
- // COLLISION DETECTION
443
- // ═══════════════════════════════════════════════════════════
444
-
445
- function checkCollisions(elements) {
446
- const issues = [];
447
- for (let i = 0; i < elements.length; i++) {
448
- for (let j = i + 1; j < elements.length; j++) {
449
- const a = elements[i], b = elements[j];
450
- if (a.skipCollision || b.skipCollision) continue;
451
- const overlapX = a.x < b.x + b.w && a.x + a.w > b.x;
452
- const overlapY = a.y < b.y + b.h && a.y + a.h > b.y;
453
- if (overlapX && overlapY) {
454
- issues.push(`OVERLAP: "${a.name}" (y:${a.y.toFixed(2)}-${(a.y+a.h).toFixed(2)}) <-> "${b.name}" (y:${b.y.toFixed(2)}-${(b.y+b.h).toFixed(2)})`);
455
- }
456
- }
457
- }
458
- return issues;
459
- }
460
-
461
- function checkBounds(elements, { safeTop = 0.25, safeBot = 5.125 } = {}) {
462
- const issues = [];
463
- for (const el of elements) {
464
- if (el.skipBounds) continue;
465
- if (el.y + el.h > safeBot) issues.push(`BOTTOM-OVERFLOW: "${el.name}" ends at y=${(el.y + el.h).toFixed(2)} (safe bottom = ${safeBot})`);
466
- }
467
- return issues;
468
- }
469
-
470
- function checkTextWrap(elements, { slack = 1.3 } = {}) {
471
- const issues = [];
472
- for (const el of elements) {
473
- if (!el.text || !el.fontSize) continue;
474
- if (el.shrinkText) continue;
475
- const needed = estimateTextHeight(el.text, el.fontSize, el.w, { bold: el.bold, margin: el.margin });
476
- if (needed > el.h * slack) {
477
- issues.push(`TEXT-WRAP: "${el.name}" needs ~${needed.toFixed(2)}" but got ${el.h.toFixed(2)}"`);
478
- }
479
- }
480
- return issues;
481
- }
482
-
483
- function hardGate(allSlideElements) {
484
- const issues = [];
485
- for (const [slideName, elements] of allSlideElements) {
486
- const slideIssues = [
487
- ...checkCollisions(elements),
488
- ...checkBounds(elements),
489
- ...checkTextWrap(elements),
490
- ];
491
- for (const msg of slideIssues) issues.push(`[${slideName}] ${msg}`);
492
- }
493
- if (issues.length === 0) {
494
- console.log(`\u2713 Layout gate passed \u2014 ${allSlideElements.length} slides, zero issues.`);
495
- return;
496
- }
497
- console.error(`\u2717 Layout gate FAILED \u2014 ${issues.length} issue(s):\n`);
498
- for (const msg of issues) console.error(' ' + msg);
499
- console.error('\nFix the slide generators above. Never ship a deck with layout issues.');
500
- process.exit(1);
501
- }
502
-
503
- // ═══════════════════════════════════════════════════════════
504
- // SLIDE RENDERERS
505
- // ═══════════════════════════════════════════════════════════
506
-
507
- function renderTitleSlide(d) {
508
- const slide = pres.addSlide();
509
- slide.background = { data: getBg(d) };
510
- const placed = [];
511
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
512
-
513
- let Y = 0.8;
514
- slide.addText(d.label.toUpperCase(), track('label', {
515
- x: 0.6, y: Y, w: 5, h: 0.2, text: d.label, fontSize: 11, bold: true,
516
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
517
- }));
518
- Y += 0.4;
519
-
520
- slide.addText(d.title, track('title', {
521
- x: 0.6, y: Y, w: 5.5, h: 0.9, text: d.title, fontSize: 52, bold: true, shrinkText: true,
522
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
523
- }));
524
- Y += 1.0;
525
-
526
- slide.addText(d.subtitle, track('subtitle', {
527
- x: 0.6, y: Y, w: 5, h: 0.6, text: d.subtitle, fontSize: 20, shrinkText: true,
528
- fontFace: FONT_B, color: '94A3B8', margin: 0
529
- }));
530
- Y += 0.8;
531
-
532
- addDivider(slide, Y, 0.6, 3.5);
533
- Y += 0.25;
534
-
535
- slide.addText(d.footer, track('footer', {
536
- x: 0.6, y: Y, w: 3, h: 0.2, text: d.footer, fontSize: 11,
537
- fontFace: FONT_B, color: '94A3B8', charSpacing: 3, margin: 0
538
- }));
539
-
540
- slide.addImage({ data: renderOrb('#' + ACCENT), x: 5.5, y: -0.5, w: 5.5, h: 5.5 });
541
-
542
- return { name: 'title', elements: placed };
543
- }
544
-
545
- function renderProblemSlide(d) {
546
- const slide = slideWithBg(d, d.category);
547
- const placed = [];
548
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
549
-
550
- let Y = LAYOUT.CONTENT_START;
551
- slide.addText(d.label.toUpperCase(), track('label', {
552
- x: 0.6, y: Y, w: 5, h: 0.2, text: d.label, fontSize: 11, bold: true,
553
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
554
- }));
555
- Y += 0.3;
556
-
557
- slide.addText(d.title, track('title', {
558
- x: 0.6, y: Y, w: 5.5, h: 0.85, text: d.title, fontSize: 38, bold: true, shrinkText: true,
559
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
560
- }));
561
- Y += 0.95;
562
-
563
- slide.addText(d.body, track('body', {
564
- x: 0.6, y: Y, w: 5, h: 0.6, text: d.body, fontSize: 14,
565
- fontFace: FONT_B, color: '94A3B8', margin: 0
566
- }));
567
-
568
- d.painWords.forEach((pw, i) => {
569
- slide.addText(pw.text, {
570
- x: pw.x, y: pw.y, w: 2.5, h: 0.4,
571
- fontSize: pw.size, fontFace: FONT_B, italic: true,
572
- color: 'FFFFFF', transparency: pw.opacity, margin: 0
573
- });
574
- placed.push({ name: `pain-${i}`, x: pw.x, y: pw.y, w: 2.5, h: 0.4, skipCollision: true, skipBounds: true });
575
- });
576
-
577
- slide.addImage({ data: renderBlob('#' + ROSE), x: 6.5, y: 2.0, w: 4.5, h: 4.5 });
578
-
579
- return { name: 'problem', elements: placed };
580
- }
581
-
582
- function renderTokenCrisisSlide(d) {
583
- const slide = slideWithBg(d, d.category);
584
- const placed = [];
585
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
586
-
587
- let Y = LAYOUT.CONTENT_START;
588
- slide.addText(d.label.toUpperCase(), track('label', {
589
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
590
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
591
- }));
592
- Y += 0.3;
593
-
594
- slide.addText(d.title, track('title', {
595
- x: 0.6, y: Y, w: 5.5, h: 0.7, text: d.title, fontSize: 34, bold: true, shrinkText: true,
596
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
597
- }));
598
- Y += 0.85;
599
-
600
- slide.addText(d.metrics[0].value, track('hero', {
601
- x: 0.6, y: Y, w: 3.5, h: 0.85, text: d.metrics[0].value, fontSize: 72, bold: true, shrinkText: true,
602
- fontFace: FONT_H, color: AMBER, margin: 0
603
- }));
604
- Y += 0.85;
605
-
606
- slide.addText(d.metrics[0].label, track('hero-label', {
607
- x: 0.6, y: Y, w: 3.5, h: 0.25, text: d.metrics[0].label, fontSize: 16, bold: true,
608
- fontFace: FONT_B, color: 'F5F5F5', margin: 0
609
- }));
610
- Y += 0.25;
611
-
612
- slide.addText(d.metrics[0].sublabel, track('hero-sub', {
613
- x: 0.6, y: Y, w: 3.5, h: 0.2, text: d.metrics[0].sublabel, fontSize: 12,
614
- fontFace: FONT_B, color: '94A3B8', margin: 0
615
- }));
616
-
617
- const barItems = [
618
- { value: '500', label: 'Pro Cost', color: AMBER },
619
- { value: '20', label: 'Pro Pays', color: ACCENT_L },
620
- { value: '5000', label: 'Max Cost', color: AMBER },
621
- { value: '200', label: 'Max Pays', color: ACCENT_L },
622
- ];
623
- slide.addImage({ data: renderBars(barItems, 500, 280), x: 5.0, y: 1.5, w: 4.5, h: 3.2 });
624
- placed.push({ name: 'bars-visual', x: 5.0, y: 1.5, w: 4.5, h: 3.2, skipCollision: true });
625
-
626
- return { name: 'token-crisis', elements: placed };
627
- }
628
-
629
- function renderSolutionSlide(d) {
630
- const slide = slideWithBg(d, d.category);
631
- const placed = [];
632
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
633
-
634
- let Y = LAYOUT.CONTENT_START;
635
- slide.addText(d.label.toUpperCase(), track('label', {
636
- x: 0.6, y: Y, w: 5, h: 0.2, text: d.label, fontSize: 11, bold: true,
637
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
638
- }));
639
- Y += 0.3;
640
-
641
- slide.addText(d.title, track('title', {
642
- x: 0.6, y: Y, w: 5, h: 0.7, text: d.title, fontSize: 32, bold: true, shrinkText: true,
643
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
644
- }));
645
- Y += 0.8;
646
-
647
- d.layers.forEach((layer, i) => {
648
- const layerY = Y + i * 0.42;
649
- accentBorder(slide, 0.6, layerY, 0.32, layer.color);
650
- slide.addText([
651
- { text: layer.num + ' ', options: { fontSize: 10, color: layer.color, bold: true, charSpacing: 3 } },
652
- { text: layer.name + ' ', options: { fontSize: 12, color: 'F5F5F5', bold: true } },
653
- { text: layer.desc, options: { fontSize: 10, color: '94A3B8' } },
654
- ], track(`layer-${i}`, {
655
- x: 0.8, y: layerY, w: 4.3, h: 0.32, text: `${layer.num} ${layer.name} ${layer.desc}`, fontSize: 11,
656
- fontFace: FONT_B, margin: 0
657
- }));
658
- });
659
-
660
- slide.addImage({ data: renderNodeGraph('#' + ACCENT), x: 5.3, y: 1.0, w: 4.5, h: 4.0 });
661
- placed.push({ name: 'node-graph', x: 5.3, y: 1.0, w: 4.5, h: 4.0, skipCollision: true });
662
-
663
- return { name: 'solution', elements: placed };
664
- }
665
-
666
- function renderJournalistSlide(d) {
667
- const slide = slideWithBg(d, d.category);
668
- const placed = [];
669
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
670
-
671
- let Y = LAYOUT.CONTENT_START;
672
- slide.addText(d.label.toUpperCase(), track('label', {
673
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
674
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
675
- }));
676
- Y += 0.3;
677
-
678
- slide.addText(d.title, track('title', {
679
- x: 0.6, y: Y, w: 5.5, h: 0.7, text: d.title, fontSize: 34, bold: true, shrinkText: true,
680
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
681
- }));
682
- Y += 0.8;
683
-
684
- slide.addText(d.body, track('body', {
685
- x: 0.6, y: Y, w: 5, h: 0.5, text: d.body, fontSize: 13, shrinkText: true,
686
- fontFace: FONT_B, color: '94A3B8', margin: 0
687
- }));
688
- Y += 0.6;
689
-
690
- const splineH = Math.min(2.2, LAYOUT.SAFE_BOT - Y - 0.1);
691
- slide.addImage({ data: renderSpline('#' + ACCENT), x: 0.3, y: Y, w: 9.4, h: splineH });
692
- placed.push({ name: 'spline', x: 0.3, y: Y, w: 9.4, h: splineH });
693
-
694
- return { name: 'journalist', elements: placed };
695
- }
696
-
697
- function renderRotationSlide(d) {
698
- const slide = slideWithBg(d, d.category);
699
- const placed = [];
700
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
701
-
702
- let Y = LAYOUT.CONTENT_START;
703
- slide.addText(d.label.toUpperCase(), track('label', {
704
- x: 0.6, y: Y, w: 5, h: 0.2, text: d.label, fontSize: 11, bold: true,
705
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
706
- }));
707
- Y += 0.3;
708
-
709
- slide.addText(d.title, track('title', {
710
- x: 0.6, y: Y, w: 5, h: 0.7, text: d.title, fontSize: 36, bold: true, shrinkText: true,
711
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
712
- }));
713
- Y += 0.8;
714
-
715
- slide.addText(d.body, track('body', {
716
- x: 0.6, y: Y, w: 4.5, h: 0.65, text: d.body, fontSize: 13, shrinkText: true,
717
- fontFace: FONT_B, color: '94A3B8', margin: 0
718
- }));
719
- Y += 0.75;
720
-
721
- d.features.forEach((feat, i) => {
722
- const fy = Y + i * 0.6;
723
- accentBorder(slide, 0.6, fy, 0.45, feat.color);
724
- slide.addText(feat.title, track(`feat-title-${i}`, {
725
- x: 0.8, y: fy, w: 4, h: 0.22, text: feat.title, fontSize: 13, bold: true,
726
- fontFace: FONT_B, color: 'F5F5F5', margin: 0
727
- }));
728
- slide.addText(feat.desc, track(`feat-desc-${i}`, {
729
- x: 0.8, y: fy + 0.22, w: 4, h: 0.22, text: feat.desc, fontSize: 11, shrinkText: true,
730
- fontFace: FONT_B, color: '94A3B8', margin: 0
731
- }));
732
- });
733
-
734
- slide.addImage({ data: renderProgressArc(d.arcValue, '#' + ACCENT), x: 5.8, y: 1.0, w: 3.5, h: 3.5 });
735
- placed.push({ name: 'progress-arc', x: 5.8, y: 1.0, w: 3.5, h: 3.5, skipCollision: true });
736
-
737
- return { name: 'rotation', elements: placed };
738
- }
739
-
740
- function renderRoutingSlide(d) {
741
- const slide = slideWithBg(d, d.category);
742
- const placed = [];
743
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
744
-
745
- let Y = LAYOUT.CONTENT_START;
746
- slide.addText(d.label.toUpperCase(), track('label', {
747
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
748
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
749
- }));
750
- Y += 0.3;
751
-
752
- slide.addText(d.title, track('title', {
753
- x: 0.6, y: Y, w: 5, h: 0.7, text: d.title, fontSize: 32, bold: true, shrinkText: true,
754
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
755
- }));
756
- Y += 0.8;
757
-
758
- d.tiers.forEach((tier, i) => {
759
- const ty = Y + i * 0.8;
760
- slide.addText([
761
- { text: tier.level + ' ', options: { fontSize: 11, color: tier.color, bold: true, charSpacing: 3 } },
762
- { text: tier.model, options: { fontSize: 18, color: 'F5F5F5', bold: true } },
763
- ], track(`tier-name-${i}`, {
764
- x: 0.6, y: ty, w: 4.5, h: 0.3, text: `${tier.level} ${tier.model}`, fontSize: 15,
765
- fontFace: FONT_B, margin: 0
766
- }));
767
- slide.addText(tier.desc, track(`tier-desc-${i}`, {
768
- x: 0.6, y: ty + 0.3, w: 4.5, h: 0.18, text: tier.desc, fontSize: 11,
769
- fontFace: FONT_B, color: '94A3B8', margin: 0
770
- }));
771
- slide.addText(tier.cost, track(`tier-cost-${i}`, {
772
- x: 0.6, y: ty + 0.48, w: 4.5, h: 0.18, text: tier.cost, fontSize: 11,
773
- fontFace: FONT_B, color: AMBER, margin: 0
774
- }));
775
- if (i < d.tiers.length - 1) addDivider(slide, ty + 0.7, 0.6, 4.5);
776
- });
777
-
778
- slide.addImage({ data: renderRadar('#' + ACCENT), x: 5.5, y: 1.0, w: 4.0, h: 4.0 });
779
- placed.push({ name: 'radar', x: 5.5, y: 1.0, w: 4.0, h: 4.0, skipCollision: true });
780
-
781
- return { name: 'routing', elements: placed };
782
- }
783
-
784
- function renderTokenEconomicsSlide(d) {
785
- const slide = slideWithBg(d, d.category);
786
- const placed = [];
787
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
788
-
789
- let Y = LAYOUT.CONTENT_START;
790
- slide.addText(d.label.toUpperCase(), track('label', {
791
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
792
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
793
- }));
794
- Y += 0.3;
795
-
796
- slide.addText(d.title, track('title', {
797
- x: 0.6, y: Y, w: 5.5, h: 0.7, text: d.title, fontSize: 34, bold: true, shrinkText: true,
798
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
799
- }));
800
- Y += 0.9;
801
-
802
- const remainH = LAYOUT.SAFE_BOT - Y - 0.1;
803
- const cols = columnLayout(2, 1, { x: 0.6, y: Y, w: 8.8, h: remainH }, 0.6);
804
- const ringColors = ['#' + ACCENT, '#' + AMBER];
805
-
806
- d.metrics.forEach((m, i) => {
807
- const pos = cols[i];
808
- if (i > 0) colDivider(slide, pos.x - 0.3, pos.y, pos.h);
809
-
810
- slide.addText(m.value, track(`hero-${i}`, {
811
- x: pos.x, y: pos.y, w: pos.w, h: 0.8, text: m.value, fontSize: 64, bold: true, shrinkText: true,
812
- fontFace: FONT_H, color: i === 0 ? ACCENT_L : AMBER, margin: 0
813
- }));
814
- slide.addText(m.label, track(`unit-${i}`, {
815
- x: pos.x, y: pos.y + 0.8, w: pos.w, h: 0.28, text: m.label, fontSize: 15, bold: true,
816
- fontFace: FONT_B, color: 'F5F5F5', margin: 0
817
- }));
818
- const ringY = pos.y + 1.2;
819
- const ringH = Math.min(1.4, pos.y + pos.h - ringY);
820
- slide.addImage({
821
- data: renderRing(m.ringPercent, ringColors[i]),
822
- x: pos.x + 0.6, y: ringY, w: ringH, h: ringH
823
- });
824
- placed.push({ name: `ring-${i}`, x: pos.x + 0.6, y: ringY, w: ringH, h: ringH });
825
- });
826
-
827
- return { name: 'token-economics', elements: placed };
828
- }
829
-
830
- function renderProviderSlide(d) {
831
- const slide = slideWithBg(d, d.category);
832
- const placed = [];
833
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
834
-
835
- let Y = LAYOUT.CONTENT_START;
836
- slide.addText(d.label.toUpperCase(), track('label', {
837
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
838
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
839
- }));
840
- Y += 0.3;
841
-
842
- slide.addText(d.title, track('title', {
843
- x: 0.6, y: Y, w: 5.5, h: 0.7, text: d.title, fontSize: 32, bold: true, shrinkText: true,
844
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
845
- }));
846
- Y += 0.75;
847
-
848
- slide.addText(d.body, track('body', {
849
- x: 0.6, y: Y, w: 5, h: 0.35, text: d.body, fontSize: 12, shrinkText: true,
850
- fontFace: FONT_B, color: '94A3B8', margin: 0
851
- }));
852
- Y += 0.45;
853
-
854
- const heatH = LAYOUT.SAFE_BOT - Y;
855
- slide.addImage({
856
- data: renderHeatmap(d.heatmapData, '#' + ACCENT),
857
- x: 0.4, y: Y, w: 9.2, h: heatH
858
- });
859
- placed.push({ name: 'heatmap', x: 0.4, y: Y, w: 9.2, h: heatH });
860
-
861
- return { name: 'providers', elements: placed };
862
- }
863
-
864
- function renderMarketSlide(d) {
865
- const slide = slideWithBg(d, d.category);
866
- const placed = [];
867
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
868
-
869
- let Y = LAYOUT.CONTENT_START;
870
- slide.addText(d.label.toUpperCase(), track('label', {
871
- x: 0.6, y: Y, w: 5, h: 0.2, text: d.label, fontSize: 11, bold: true,
872
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
873
- }));
874
- Y += 0.3;
875
-
876
- slide.addText(d.title, track('title', {
877
- x: 0.6, y: Y, w: 5, h: 0.7, text: d.title, fontSize: 34, bold: true, shrinkText: true,
878
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
879
- }));
880
- Y += 0.85;
881
-
882
- const markets = [
883
- { label: 'TAM', ...d.tam, color: '94A3B8' },
884
- { label: 'SAM', ...d.sam, color: ACCENT_L },
885
- { label: 'SOM', ...d.som, color: AMBER },
886
- ];
887
- markets.forEach((m, i) => {
888
- const my = Y + i * 0.78;
889
- slide.addText(m.label, track(`market-label-${i}`, {
890
- x: 0.6, y: my, w: 4, h: 0.18, text: m.label, fontSize: 11, bold: true,
891
- fontFace: FONT_B, color: '94A3B8', charSpacing: 4, margin: 0
892
- }));
893
- slide.addText(m.value, track(`market-val-${i}`, {
894
- x: 0.6, y: my + 0.18, w: 4, h: 0.32, text: m.value, fontSize: 26, bold: true, shrinkText: true,
895
- fontFace: FONT_H, color: m.color, margin: 0
896
- }));
897
- slide.addText(m.label_text || m.label, track(`market-desc-${i}`, {
898
- x: 0.6, y: my + 0.5, w: 4, h: 0.18, text: m.label, fontSize: 11,
899
- fontFace: FONT_B, color: '94A3B8', margin: 0
900
- }));
901
- if (i < markets.length - 1) addDivider(slide, my + 0.72, 0.6, 3.5);
902
- });
903
-
904
- slide.addImage({ data: renderConcentricRings('#' + ACCENT), x: 5.2, y: 0.8, w: 4.2, h: 4.2 });
905
- placed.push({ name: 'concentric', x: 5.2, y: 0.8, w: 4.2, h: 4.2, skipCollision: true, skipBounds: true });
906
-
907
- return { name: 'market', elements: placed };
908
- }
909
-
910
- function renderMoatSlide(d) {
911
- const slide = slideWithBg(d, d.category);
912
- const placed = [];
913
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
914
-
915
- let Y = LAYOUT.CONTENT_START;
916
- slide.addText(d.label.toUpperCase(), track('label', {
917
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
918
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
919
- }));
920
- Y += 0.3;
921
-
922
- slide.addText(d.title, track('title', {
923
- x: 0.6, y: Y, w: 5.5, h: 0.7, text: d.title, fontSize: 32, bold: true, shrinkText: true,
924
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
925
- }));
926
- Y += 0.8;
927
-
928
- const vizH = Math.min(2.4, LAYOUT.SAFE_BOT - Y - 0.45);
929
- slide.addImage({ data: renderBeforeAfter(), x: 0.6, y: Y, w: 8.8, h: vizH });
930
- placed.push({ name: 'before-after', x: 0.6, y: Y, w: 8.8, h: vizH });
931
-
932
- const leftTextY = Y + vizH + 0.1;
933
- slide.addText(d.leftPanel.points.join(' | '), track('left-points', {
934
- x: 0.6, y: leftTextY, w: 4.2, h: 0.25, text: d.leftPanel.points.join(' | '), fontSize: 9,
935
- fontFace: FONT_B, color: ROSE, margin: 0
936
- }));
937
- slide.addText(d.rightPanel.points.join(' | '), track('right-points', {
938
- x: 5.2, y: leftTextY, w: 4.2, h: 0.25, text: d.rightPanel.points.join(' | '), fontSize: 9,
939
- fontFace: FONT_B, color: ACCENT_L, margin: 0
940
- }));
941
-
942
- return { name: 'moat', elements: placed };
943
- }
944
-
945
- function renderProductSlide(d) {
946
- const slide = slideWithBg(d, d.category);
947
- const placed = [];
948
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
949
-
950
- let Y = LAYOUT.CONTENT_START;
951
- slide.addText(d.label.toUpperCase(), track('label', {
952
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
953
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
954
- }));
955
- Y += 0.3;
956
-
957
- slide.addText(d.title, track('title', {
958
- x: 0.6, y: Y, w: 5.5, h: 0.7, text: d.title, fontSize: 32, bold: true, shrinkText: true,
959
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
960
- }));
961
- Y += 0.85;
962
-
963
- const metricSpacing = Math.min(0.7, (LAYOUT.SAFE_BOT - Y) / d.metrics.length);
964
- d.metrics.forEach((m, i) => {
965
- const my = Y + i * metricSpacing;
966
- accentBorder(slide, 0.6, my, metricSpacing - 0.1, m.color);
967
- slide.addText(m.value, track(`prod-val-${i}`, {
968
- x: 0.85, y: my, w: 3, h: 0.35, text: m.value, fontSize: 28, bold: true, shrinkText: true,
969
- fontFace: FONT_H, color: m.color, margin: 0
970
- }));
971
- slide.addText(m.label, track(`prod-label-${i}`, {
972
- x: 0.85, y: my + 0.35, w: 3, h: 0.2, text: m.label, fontSize: 11,
973
- fontFace: FONT_B, color: '94A3B8', margin: 0
974
- }));
975
- });
976
-
977
- const barItems = d.metrics.map(m => ({ value: m.value.replace('+', ''), label: m.label.split(' ')[0], color: m.color }));
978
- slide.addImage({ data: renderBars(barItems), x: 5.0, y: 1.5, w: 4.5, h: 3.2 });
979
- placed.push({ name: 'bars', x: 5.0, y: 1.5, w: 4.5, h: 3.2, skipCollision: true });
980
-
981
- return { name: 'product', elements: placed };
982
- }
983
-
984
- function renderPricingSlide(d) {
985
- const slide = slideWithBg(d, d.category);
986
- const placed = [];
987
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
988
-
989
- let Y = LAYOUT.CONTENT_START;
990
- slide.addText(d.label.toUpperCase(), track('label', {
991
- x: 0.6, y: Y, w: 5.5, h: 0.2, text: d.label, fontSize: 11, bold: true,
992
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
993
- }));
994
- Y += 0.3;
995
-
996
- slide.addText(d.title, track('title', {
997
- x: 0.6, y: Y, w: 5.5, h: 0.7, text: d.title, fontSize: 32, bold: true, shrinkText: true,
998
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
999
- }));
1000
- Y += 0.8;
1001
-
1002
- const tierH = LAYOUT.SAFE_BOT - Y - 0.4;
1003
- const cols = columnLayout(d.tiers.length, 1, { x: 0.6, y: Y, w: 8.8, h: tierH }, 0.3);
1004
- d.tiers.forEach((tier, i) => {
1005
- const pos = cols[i];
1006
- if (tier.highlighted) {
1007
- slide.addShape(pres.shapes.RECTANGLE, {
1008
- x: pos.x - 0.1, y: pos.y - 0.1, w: pos.w + 0.2, h: pos.h + 0.2,
1009
- fill: { color: 'FFFFFF', transparency: 96 }
1010
- });
1011
- }
1012
- if (i > 0) colDivider(slide, pos.x - 0.15, pos.y, pos.h);
1013
-
1014
- let innerY = pos.y;
1015
- slide.addText(tier.name, track(`tier-name-${i}`, {
1016
- x: pos.x, y: innerY, w: pos.w, h: 0.22, text: tier.name, fontSize: 13, bold: true,
1017
- fontFace: FONT_B, color: tier.highlighted ? ACCENT_L : 'F5F5F5', margin: 0
1018
- }));
1019
- innerY += 0.25;
1020
-
1021
- slide.addText(tier.price, track(`tier-price-${i}`, {
1022
- x: pos.x, y: innerY, w: pos.w, h: 0.45, text: tier.price, fontSize: 32, bold: true, shrinkText: true,
1023
- fontFace: FONT_H, color: tier.highlighted ? ACCENT_L : 'F5F5F5', margin: 0
1024
- }));
1025
- innerY += 0.5;
1026
-
1027
- addDivider(slide, innerY, pos.x, pos.w);
1028
- innerY += 0.12;
1029
-
1030
- const featuresH = (pos.y + pos.h) - innerY;
1031
- const featureText = tier.features.map(f => ({
1032
- text: f, options: { bullet: true, breakLine: true, fontSize: 10, color: '94A3B8' }
1033
- }));
1034
- slide.addText(featureText, {
1035
- x: pos.x, y: innerY, w: pos.w, h: featuresH,
1036
- fontFace: FONT_B, margin: 0, valign: 'top'
1037
- });
1038
- placed.push({ name: `tier-feats-${i}`, x: pos.x, y: innerY, w: pos.w, h: featuresH });
1039
- });
1040
-
1041
- const quoteY = LAYOUT.SAFE_BOT - 0.3;
1042
- if (d.quote) {
1043
- slide.addText(d.quote, track('quote', {
1044
- x: 0.6, y: quoteY, w: 8.8, h: 0.25, text: d.quote, fontSize: 11, italic: true,
1045
- fontFace: FONT_H, color: '94A3B8', margin: 0
1046
- }));
1047
- }
1048
-
1049
- return { name: 'pricing', elements: placed };
1050
- }
1051
-
1052
- function renderCtaSlide(d) {
1053
- const slide = pres.addSlide();
1054
- slide.background = { data: getBg(d) };
1055
- const placed = [];
1056
- const track = (name, opts) => { placed.push({ name, ...opts }); return opts; };
1057
-
1058
- let Y = 0.8;
1059
- slide.addText(d.label.toUpperCase(), track('label', {
1060
- x: 0.6, y: Y, w: 5, h: 0.2, text: d.label, fontSize: 11, bold: true,
1061
- fontFace: FONT_B, color: ACCENT_L, charSpacing: 5, margin: 0
1062
- }));
1063
- Y += 0.35;
1064
-
1065
- slide.addText(d.title, track('title', {
1066
- x: 0.6, y: Y, w: 5.5, h: 0.9, text: d.title, fontSize: 44, bold: true, shrinkText: true,
1067
- fontFace: FONT_H, color: 'F5F5F5', margin: 0
1068
- }));
1069
- Y += 1.0;
1070
-
1071
- slide.addText(d.subtitle, track('subtitle', {
1072
- x: 0.6, y: Y, w: 4.5, h: 0.7, text: d.subtitle, fontSize: 15, shrinkText: true,
1073
- fontFace: FONT_B, color: '94A3B8', margin: 0
1074
- }));
1075
- Y += 0.85;
1076
-
1077
- addDivider(slide, Y, 0.6, 3.5);
1078
- Y += 0.25;
1079
-
1080
- slide.addText(d.contact.email, track('email', {
1081
- x: 0.6, y: Y, w: 3, h: 0.2, text: d.contact.email, fontSize: 13, bold: true,
1082
- fontFace: FONT_B, color: 'F5F5F5', margin: 0
1083
- }));
1084
- Y += 0.22;
1085
- slide.addText(d.contact.website, track('website', {
1086
- x: 0.6, y: Y, w: 3, h: 0.18, text: d.contact.website, fontSize: 11,
1087
- fontFace: FONT_B, color: '94A3B8', margin: 0
1088
- }));
1089
-
1090
- slide.addImage({ data: renderOrb('#' + ACCENT), x: 5.5, y: -0.5, w: 5.5, h: 5.5 });
1091
-
1092
- return { name: 'cta', elements: placed };
1093
- }
1094
-
1095
- // ═══════════════════════════════════════════════════════════
1096
- // BUILD DECK
1097
- // ═══════════════════════════════════════════════════════════
1098
-
1099
- const allSlides = [];
1100
-
1101
- allSlides.push(renderTitleSlide(slides[0]));
1102
- allSlides.push(renderProblemSlide(slides[1]));
1103
- allSlides.push(renderTokenCrisisSlide(slides[2]));
1104
- allSlides.push(renderSolutionSlide(slides[3]));
1105
- allSlides.push(renderJournalistSlide(slides[4]));
1106
- allSlides.push(renderRotationSlide(slides[5]));
1107
- allSlides.push(renderRoutingSlide(slides[6]));
1108
- allSlides.push(renderTokenEconomicsSlide(slides[7]));
1109
- allSlides.push(renderProviderSlide(slides[8]));
1110
- allSlides.push(renderMarketSlide(slides[9]));
1111
- allSlides.push(renderMoatSlide(slides[10]));
1112
- allSlides.push(renderProductSlide(slides[11]));
1113
- allSlides.push(renderPricingSlide(slides[12]));
1114
- allSlides.push(renderCtaSlide(slides[13]));
1115
-
1116
- hardGate(allSlides.map(s => [s.name, s.elements]));
1117
-
1118
- pres.writeFile({ fileName: 'deck.pptx' }).then(() => {
1119
- console.log('deck.pptx ready.');
1120
- });