loopwind 0.22.0 → 0.24.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 (486) hide show
  1. package/README.md +13 -117
  2. package/dist/cli.js +16 -10
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +6 -10
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/agent.d.ts +8 -0
  8. package/dist/commands/agent.d.ts.map +1 -0
  9. package/dist/commands/agent.js +101 -0
  10. package/dist/commands/agent.js.map +1 -0
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +17 -7
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/render.d.ts.map +1 -1
  15. package/dist/commands/render.js +17 -19
  16. package/dist/commands/render.js.map +1 -1
  17. package/dist/default-templates/AGENTS.md +10 -24
  18. package/dist/lib/config.d.ts +2 -3
  19. package/dist/lib/config.d.ts.map +1 -1
  20. package/dist/lib/config.js +4 -9
  21. package/dist/lib/config.js.map +1 -1
  22. package/dist/lib/constants.d.ts +1 -3
  23. package/dist/lib/constants.d.ts.map +1 -1
  24. package/dist/lib/constants.js +2 -4
  25. package/dist/lib/constants.js.map +1 -1
  26. package/dist/lib/installer.d.ts +2 -0
  27. package/dist/lib/installer.d.ts.map +1 -1
  28. package/dist/lib/installer.js +6 -7
  29. package/dist/lib/installer.js.map +1 -1
  30. package/dist/lib/renderer.d.ts.map +1 -1
  31. package/dist/lib/renderer.js +14 -8
  32. package/dist/lib/renderer.js.map +1 -1
  33. package/dist/lib/resvg-init.d.ts +15 -0
  34. package/dist/lib/resvg-init.d.ts.map +1 -0
  35. package/dist/lib/resvg-init.js +55 -0
  36. package/dist/lib/resvg-init.js.map +1 -0
  37. package/dist/lib/tailwind/colors.d.ts +8 -0
  38. package/dist/lib/tailwind/colors.d.ts.map +1 -0
  39. package/dist/lib/tailwind/colors.js +102 -0
  40. package/dist/lib/tailwind/colors.js.map +1 -0
  41. package/dist/lib/tailwind/index.d.ts +10 -0
  42. package/dist/lib/tailwind/index.d.ts.map +1 -0
  43. package/dist/lib/tailwind/index.js +9 -0
  44. package/dist/lib/tailwind/index.js.map +1 -0
  45. package/dist/lib/tailwind/resolvers.d.ts +28 -0
  46. package/dist/lib/tailwind/resolvers.d.ts.map +1 -0
  47. package/dist/lib/tailwind/resolvers.js +94 -0
  48. package/dist/lib/tailwind/resolvers.js.map +1 -0
  49. package/dist/lib/tailwind/types.d.ts +29 -0
  50. package/dist/lib/tailwind/types.d.ts.map +1 -0
  51. package/dist/lib/tailwind/types.js +8 -0
  52. package/dist/lib/tailwind/types.js.map +1 -0
  53. package/dist/lib/tailwind-config-loader.d.ts +8 -45
  54. package/dist/lib/tailwind-config-loader.d.ts.map +1 -1
  55. package/dist/lib/tailwind-config-loader.js +6 -429
  56. package/dist/lib/tailwind-config-loader.js.map +1 -1
  57. package/dist/lib/tailwind.d.ts +1 -1
  58. package/dist/lib/tailwind.d.ts.map +1 -1
  59. package/dist/lib/tailwind.js +1 -1
  60. package/dist/lib/tailwind.js.map +1 -1
  61. package/dist/lib/utils.d.ts +13 -29
  62. package/dist/lib/utils.d.ts.map +1 -1
  63. package/dist/lib/utils.js +45 -155
  64. package/dist/lib/utils.js.map +1 -1
  65. package/dist/lib/video-renderer.d.ts.map +1 -1
  66. package/dist/lib/video-renderer.js +6 -5
  67. package/dist/lib/video-renderer.js.map +1 -1
  68. package/dist/types/config.d.ts +0 -2
  69. package/dist/types/config.d.ts.map +1 -1
  70. package/dist/types/config.js.map +1 -1
  71. package/package.json +2 -12
  72. package/REGISTRY_SETUP.md +0 -363
  73. package/_dsgn/templates/dashed-stroke-test/template.tsx +0 -73
  74. package/_dsgn/templates/path-follow-test/template.tsx +0 -176
  75. package/_dsgn/templates/path-simple-test/template.tsx +0 -98
  76. package/_dsgn/templates/stroke-dash-test/meta.json +0 -12
  77. package/_dsgn/templates/stroke-dash-test/template.tsx +0 -53
  78. package/dist/default-templates/image/template.d.ts +0 -20
  79. package/dist/default-templates/image/template.d.ts.map +0 -1
  80. package/dist/default-templates/image/template.js +0 -18
  81. package/dist/default-templates/image/template.js.map +0 -1
  82. package/dist/default-templates/image/template.tsx +0 -20
  83. package/dist/default-templates/kitchen-sink/template.tsx +0 -64
  84. package/dist/default-templates/page/template.tsx +0 -37
  85. package/dist/default-templates/video/template.d.ts +0 -26
  86. package/dist/default-templates/video/template.d.ts.map +0 -1
  87. package/dist/default-templates/video/template.js +0 -33
  88. package/dist/default-templates/video/template.js.map +0 -1
  89. package/dist/default-templates/video/template.tsx +0 -37
  90. package/dist/default-templates/website/pages/home.tsx +0 -17
  91. package/dist/default-templates/website/parts/footer.tsx +0 -17
  92. package/dist/default-templates/website/parts/header.tsx +0 -17
  93. package/dist/default-templates/website/template.tsx +0 -17
  94. package/dist/default-templates/website-template/pages/home.tsx +0 -13
  95. package/dist/default-templates/website-template/parts/footer.tsx +0 -15
  96. package/dist/default-templates/website-template/parts/header.tsx +0 -15
  97. package/dist/default-templates/website-template/template.tsx +0 -32
  98. package/dist/lib/encode-worker.d.ts +0 -2
  99. package/dist/lib/encode-worker.d.ts.map +0 -1
  100. package/dist/lib/encode-worker.js +0 -29
  101. package/dist/lib/encode-worker.js.map +0 -1
  102. package/dist/lib/mjpeg-muxer.d.ts +0 -46
  103. package/dist/lib/mjpeg-muxer.d.ts.map +0 -1
  104. package/dist/lib/mjpeg-muxer.js +0 -513
  105. package/dist/lib/mjpeg-muxer.js.map +0 -1
  106. package/dist/lib/tailwind-browser.d.ts +0 -27
  107. package/dist/lib/tailwind-browser.d.ts.map +0 -1
  108. package/dist/lib/tailwind-browser.js +0 -853
  109. package/dist/lib/tailwind-browser.js.map +0 -1
  110. package/dist/lib/video-player.d.ts +0 -25
  111. package/dist/lib/video-player.d.ts.map +0 -1
  112. package/dist/lib/video-player.js +0 -392
  113. package/dist/lib/video-player.js.map +0 -1
  114. package/dist/sdk/compiler.d.ts +0 -94
  115. package/dist/sdk/compiler.d.ts.map +0 -1
  116. package/dist/sdk/compiler.js +0 -122
  117. package/dist/sdk/compiler.js.map +0 -1
  118. package/dist/sdk/index.d.ts +0 -62
  119. package/dist/sdk/index.d.ts.map +0 -1
  120. package/dist/sdk/index.js +0 -141
  121. package/dist/sdk/index.js.map +0 -1
  122. package/dist/sdk/preview.d.ts +0 -65
  123. package/dist/sdk/preview.d.ts.map +0 -1
  124. package/dist/sdk/preview.js +0 -262
  125. package/dist/sdk/preview.js.map +0 -1
  126. package/dist/sdk/template.d.ts +0 -162
  127. package/dist/sdk/template.d.ts.map +0 -1
  128. package/dist/sdk/template.js +0 -231
  129. package/dist/sdk/template.js.map +0 -1
  130. package/examples/code-editor-templates.ts +0 -173
  131. package/examples/nextjs-api/README.md +0 -180
  132. package/examples/nextjs-api/package.json +0 -21
  133. package/examples/nextjs-api/pages/api/intro-video.ts +0 -53
  134. package/examples/nextjs-api/pages/api/og-image.ts +0 -50
  135. package/examples/nextjs-template-import.ts +0 -58
  136. package/examples/sdk-video-preview.tsx +0 -120
  137. package/examples/template-compiler-workflow.ts +0 -251
  138. package/examples/visual-builder-templates.ts +0 -336
  139. package/render-examples-600x400.mjs +0 -161
  140. package/render-spring-variants-fixed.mjs +0 -60
  141. package/render-staggered-text.mjs +0 -56
  142. package/test-font-files.mjs +0 -72
  143. package/test-jsx-support.mjs +0 -146
  144. package/test-sdk-config.mjs +0 -454
  145. package/test-sdk-source-config.mjs +0 -427
  146. package/test-sdk-user-templates.mjs +0 -469
  147. package/test-static-debug.tsx +0 -19
  148. package/test-templates/TESTS.md +0 -63
  149. package/test-templates/config-test.mjs +0 -17
  150. package/test-templates/demo-intro-props.json +0 -4
  151. package/test-templates/run-tests.sh +0 -44
  152. package/test-templates/test-sdk.mjs +0 -139
  153. package/test-video-props.json +0 -3
  154. package/website/.astro/content.db +0 -0
  155. package/website/.astro/integrations/_inox-tools_astro-when/types.d.ts +0 -1
  156. package/website/.astro/integrations/astro_db/db.d.ts +0 -15
  157. package/website/.astro/settings.json +0 -5
  158. package/website/.astro/types.d.ts +0 -2
  159. package/website/DEPLOYMENT.md +0 -143
  160. package/website/OG_IMAGES.md +0 -142
  161. package/website/README.md +0 -158
  162. package/website/astro.config.mjs +0 -46
  163. package/website/dist/.gitkeep +0 -5
  164. package/website/dist/_astro/agents.Yx-L_igG.css +0 -1
  165. package/website/dist/_routes.json +0 -30
  166. package/website/dist/_worker.js/_@astrojs-ssr-adapter.mjs +0 -1033
  167. package/website/dist/_worker.js/_astro-internal_middleware.mjs +0 -40
  168. package/website/dist/_worker.js/chunks/abap_BTmsHiP5.mjs +0 -1
  169. package/website/dist/_worker.js/chunks/actionscript-3_DmBelb1E.mjs +0 -1
  170. package/website/dist/_worker.js/chunks/ada_8-E0ahCN.mjs +0 -1
  171. package/website/dist/_worker.js/chunks/andromeeda_XI-CXx50.mjs +0 -1
  172. package/website/dist/_worker.js/chunks/angular-html_DKGh3gGH.mjs +0 -1
  173. package/website/dist/_worker.js/chunks/angular-ts_-qZGsJoA.mjs +0 -1
  174. package/website/dist/_worker.js/chunks/apache_ijTUt0Ee.mjs +0 -1
  175. package/website/dist/_worker.js/chunks/apex_agu1c6Sh.mjs +0 -1
  176. package/website/dist/_worker.js/chunks/apl_Bj2f7Art.mjs +0 -1
  177. package/website/dist/_worker.js/chunks/applescript_B_vXrOh3.mjs +0 -1
  178. package/website/dist/_worker.js/chunks/ara_DCEQ2rnh.mjs +0 -1
  179. package/website/dist/_worker.js/chunks/asciidoc_CGN_EkYS.mjs +0 -1
  180. package/website/dist/_worker.js/chunks/asm_BBWZgnDp.mjs +0 -1
  181. package/website/dist/_worker.js/chunks/astro/assets-service_j52rQLzU.mjs +0 -721
  182. package/website/dist/_worker.js/chunks/astro/server_Y5_QHO8v.mjs +0 -2401
  183. package/website/dist/_worker.js/chunks/astro-designed-error-pages_BNTLO-TA.mjs +0 -542
  184. package/website/dist/_worker.js/chunks/astro_Dr_hht3h.mjs +0 -1
  185. package/website/dist/_worker.js/chunks/aurora-x_9GHG8nSq.mjs +0 -1
  186. package/website/dist/_worker.js/chunks/awk_DHRvhXot.mjs +0 -1
  187. package/website/dist/_worker.js/chunks/ayu-dark_CcvqmEHE.mjs +0 -1
  188. package/website/dist/_worker.js/chunks/ballerina_C7SdeSZb.mjs +0 -1
  189. package/website/dist/_worker.js/chunks/bat_Dv4A3u45.mjs +0 -1
  190. package/website/dist/_worker.js/chunks/beancount_BfPf9Luv.mjs +0 -1
  191. package/website/dist/_worker.js/chunks/berry_B8rfM3lL.mjs +0 -1
  192. package/website/dist/_worker.js/chunks/bibtex_TcjYgtJM.mjs +0 -1
  193. package/website/dist/_worker.js/chunks/bicep_CrlFWCdN.mjs +0 -1
  194. package/website/dist/_worker.js/chunks/blade_lanKVYID.mjs +0 -1
  195. package/website/dist/_worker.js/chunks/bsl_BhppzXMB.mjs +0 -1
  196. package/website/dist/_worker.js/chunks/c_6FBALJTK.mjs +0 -1
  197. package/website/dist/_worker.js/chunks/cadence_2txU9LVE.mjs +0 -1
  198. package/website/dist/_worker.js/chunks/cairo_BkrFAIlP.mjs +0 -1
  199. package/website/dist/_worker.js/chunks/catppuccin-frappe_CkEqIYhU.mjs +0 -1
  200. package/website/dist/_worker.js/chunks/catppuccin-latte_DG4Gx_-v.mjs +0 -1
  201. package/website/dist/_worker.js/chunks/catppuccin-macchiato_Cwi3vCXf.mjs +0 -1
  202. package/website/dist/_worker.js/chunks/catppuccin-mocha_L9_OPlFX.mjs +0 -1
  203. package/website/dist/_worker.js/chunks/clarity_BEAe4Ulu.mjs +0 -1
  204. package/website/dist/_worker.js/chunks/clojure_VnUX6p2g.mjs +0 -1
  205. package/website/dist/_worker.js/chunks/cmake_0-SGkZEj.mjs +0 -1
  206. package/website/dist/_worker.js/chunks/cobol_92M_KGaE.mjs +0 -1
  207. package/website/dist/_worker.js/chunks/codeowners_CzMwskBv.mjs +0 -1
  208. package/website/dist/_worker.js/chunks/codeql_DWJZNHv1.mjs +0 -1
  209. package/website/dist/_worker.js/chunks/coffee_CQjKU2fh.mjs +0 -1
  210. package/website/dist/_worker.js/chunks/common-lisp_BBLWDpS5.mjs +0 -1
  211. package/website/dist/_worker.js/chunks/coq_hedRFV3D.mjs +0 -1
  212. package/website/dist/_worker.js/chunks/cpp_DlS1i6Zs.mjs +0 -1
  213. package/website/dist/_worker.js/chunks/crystal_D6n65fKV.mjs +0 -1
  214. package/website/dist/_worker.js/chunks/csharp_C6FCVFzc.mjs +0 -1
  215. package/website/dist/_worker.js/chunks/css_C5uJEgmJ.mjs +0 -1
  216. package/website/dist/_worker.js/chunks/csv_CtMYuuJl.mjs +0 -1
  217. package/website/dist/_worker.js/chunks/cue_BsPexqx6.mjs +0 -1
  218. package/website/dist/_worker.js/chunks/cypher_apzf6OBi.mjs +0 -1
  219. package/website/dist/_worker.js/chunks/d_DcvIRcgm.mjs +0 -1
  220. package/website/dist/_worker.js/chunks/dark-plus_C01ONtzj.mjs +0 -1
  221. package/website/dist/_worker.js/chunks/dart_WkzM5WrV.mjs +0 -1
  222. package/website/dist/_worker.js/chunks/dax_DjXAO5V4.mjs +0 -1
  223. package/website/dist/_worker.js/chunks/desktop_C92LCxdc.mjs +0 -1
  224. package/website/dist/_worker.js/chunks/diff_CVwM_9XJ.mjs +0 -1
  225. package/website/dist/_worker.js/chunks/docker_DPzgJf6Z.mjs +0 -1
  226. package/website/dist/_worker.js/chunks/dotenv_D_vgANvA.mjs +0 -1
  227. package/website/dist/_worker.js/chunks/dracula-soft_CLnUBwFm.mjs +0 -1
  228. package/website/dist/_worker.js/chunks/dracula_lBVpb6Lb.mjs +0 -1
  229. package/website/dist/_worker.js/chunks/dream-maker_DTLbzd_J.mjs +0 -1
  230. package/website/dist/_worker.js/chunks/edge_i54JYm3_.mjs +0 -1
  231. package/website/dist/_worker.js/chunks/elixir_BJCIjTu4.mjs +0 -1
  232. package/website/dist/_worker.js/chunks/elm_BbXD39-_.mjs +0 -1
  233. package/website/dist/_worker.js/chunks/emacs-lisp_pxa5cXaN.mjs +0 -1
  234. package/website/dist/_worker.js/chunks/erb_Ccjijeee.mjs +0 -1
  235. package/website/dist/_worker.js/chunks/erlang_B2VM_hi7.mjs +0 -1
  236. package/website/dist/_worker.js/chunks/everforest-dark_BxvIPBim.mjs +0 -1
  237. package/website/dist/_worker.js/chunks/everforest-light_B7VoyaJM.mjs +0 -1
  238. package/website/dist/_worker.js/chunks/fennel_D-uo7X6c.mjs +0 -1
  239. package/website/dist/_worker.js/chunks/fish_BjePoK3m.mjs +0 -1
  240. package/website/dist/_worker.js/chunks/fluent_C8fgkzLX.mjs +0 -1
  241. package/website/dist/_worker.js/chunks/fortran-fixed-form_D1pu5zrc.mjs +0 -1
  242. package/website/dist/_worker.js/chunks/fortran-free-form_CSGOhJD6.mjs +0 -1
  243. package/website/dist/_worker.js/chunks/fsharp_B0xy-A4Y.mjs +0 -1
  244. package/website/dist/_worker.js/chunks/gdresource_CWppjlHq.mjs +0 -1
  245. package/website/dist/_worker.js/chunks/gdscript_eQCHchcS.mjs +0 -1
  246. package/website/dist/_worker.js/chunks/gdshader_C4kxepX7.mjs +0 -1
  247. package/website/dist/_worker.js/chunks/genie_ACtQLcDW.mjs +0 -1
  248. package/website/dist/_worker.js/chunks/gherkin_BFp2uKUd.mjs +0 -1
  249. package/website/dist/_worker.js/chunks/git-commit_CLg9ZwMV.mjs +0 -1
  250. package/website/dist/_worker.js/chunks/git-rebase_DG8A80Nt.mjs +0 -1
  251. package/website/dist/_worker.js/chunks/github-dark-default_BI0EP2Kv.mjs +0 -1
  252. package/website/dist/_worker.js/chunks/github-dark-dimmed_a_NIC0Xb.mjs +0 -1
  253. package/website/dist/_worker.js/chunks/github-dark-high-contrast_jZGqT7hk.mjs +0 -1
  254. package/website/dist/_worker.js/chunks/github-dark_CHCDNd2O.mjs +0 -1
  255. package/website/dist/_worker.js/chunks/github-light-default_DRbOW5RG.mjs +0 -1
  256. package/website/dist/_worker.js/chunks/github-light-high-contrast_tn_kWutM.mjs +0 -1
  257. package/website/dist/_worker.js/chunks/github-light_D9brYzot.mjs +0 -1
  258. package/website/dist/_worker.js/chunks/gleam_Dmhu1oxW.mjs +0 -1
  259. package/website/dist/_worker.js/chunks/glimmer-js_BfZbXy8A.mjs +0 -1
  260. package/website/dist/_worker.js/chunks/glimmer-ts_B9QVICrD.mjs +0 -1
  261. package/website/dist/_worker.js/chunks/glsl_DD2PPwOs.mjs +0 -1
  262. package/website/dist/_worker.js/chunks/gnuplot_D2OYChUX.mjs +0 -1
  263. package/website/dist/_worker.js/chunks/go_DYGFTe3h.mjs +0 -1
  264. package/website/dist/_worker.js/chunks/graphql_B7XsT3nH.mjs +0 -1
  265. package/website/dist/_worker.js/chunks/groovy_BO12Uwkl.mjs +0 -1
  266. package/website/dist/_worker.js/chunks/hack_CB2_ztCP.mjs +0 -1
  267. package/website/dist/_worker.js/chunks/haml_CyfDcDD3.mjs +0 -1
  268. package/website/dist/_worker.js/chunks/handlebars_CfpxpWm2.mjs +0 -1
  269. package/website/dist/_worker.js/chunks/haskell_jUeC5uN5.mjs +0 -1
  270. package/website/dist/_worker.js/chunks/haxe_B6GxP1WB.mjs +0 -1
  271. package/website/dist/_worker.js/chunks/hcl_DwoHV2oh.mjs +0 -1
  272. package/website/dist/_worker.js/chunks/hjson_DV7cJRk4.mjs +0 -1
  273. package/website/dist/_worker.js/chunks/hlsl_BlFCscPI.mjs +0 -1
  274. package/website/dist/_worker.js/chunks/houston_COBFG1Mx.mjs +0 -1
  275. package/website/dist/_worker.js/chunks/html-derivative_C9pJ337h.mjs +0 -1
  276. package/website/dist/_worker.js/chunks/html_D1OkrZS5.mjs +0 -1
  277. package/website/dist/_worker.js/chunks/http_DIGXRqvJ.mjs +0 -1
  278. package/website/dist/_worker.js/chunks/hxml_DEwh9i-c.mjs +0 -1
  279. package/website/dist/_worker.js/chunks/hy_DDoIgW1K.mjs +0 -1
  280. package/website/dist/_worker.js/chunks/imba_B00zbHo4.mjs +0 -1
  281. package/website/dist/_worker.js/chunks/index_C1UTDwYg.mjs +0 -1861
  282. package/website/dist/_worker.js/chunks/ini_D7XQA_p8.mjs +0 -1
  283. package/website/dist/_worker.js/chunks/java_B9wdFd8K.mjs +0 -1
  284. package/website/dist/_worker.js/chunks/javascript_CLsPGOON.mjs +0 -1
  285. package/website/dist/_worker.js/chunks/jinja_jarBCAN1.mjs +0 -1
  286. package/website/dist/_worker.js/chunks/jison_oGg3J708.mjs +0 -1
  287. package/website/dist/_worker.js/chunks/json5_DlZ1Kyaa.mjs +0 -1
  288. package/website/dist/_worker.js/chunks/json_DaYk_FMp.mjs +0 -1
  289. package/website/dist/_worker.js/chunks/jsonc_DlwgfSDs.mjs +0 -1
  290. package/website/dist/_worker.js/chunks/jsonl_BbCCVaZF.mjs +0 -1
  291. package/website/dist/_worker.js/chunks/jsonnet_Dt-G75xe.mjs +0 -1
  292. package/website/dist/_worker.js/chunks/jssm_BtKFTj2A.mjs +0 -1
  293. package/website/dist/_worker.js/chunks/jsx_DDx_xAZ8.mjs +0 -1
  294. package/website/dist/_worker.js/chunks/julia_CK0lv68l.mjs +0 -1
  295. package/website/dist/_worker.js/chunks/kanagawa-dragon_BldAK3Oo.mjs +0 -1
  296. package/website/dist/_worker.js/chunks/kanagawa-lotus_DVM8FX9_.mjs +0 -1
  297. package/website/dist/_worker.js/chunks/kanagawa-wave_Dpih0AKP.mjs +0 -1
  298. package/website/dist/_worker.js/chunks/kotlin_kWneB9V_.mjs +0 -1
  299. package/website/dist/_worker.js/chunks/kusto_BKVATd95.mjs +0 -1
  300. package/website/dist/_worker.js/chunks/laserwave_BqatxsVl.mjs +0 -1
  301. package/website/dist/_worker.js/chunks/latex_LVDcGBbc.mjs +0 -1
  302. package/website/dist/_worker.js/chunks/lean_W7qo-5M2.mjs +0 -1
  303. package/website/dist/_worker.js/chunks/less_DFNwJnBH.mjs +0 -1
  304. package/website/dist/_worker.js/chunks/light-plus_Dp0AoWsO.mjs +0 -1
  305. package/website/dist/_worker.js/chunks/liquid_D24qs0pc.mjs +0 -1
  306. package/website/dist/_worker.js/chunks/log_IPWMXriF.mjs +0 -1
  307. package/website/dist/_worker.js/chunks/logo_C6KaatrQ.mjs +0 -1
  308. package/website/dist/_worker.js/chunks/lua_CwnEf-T7.mjs +0 -1
  309. package/website/dist/_worker.js/chunks/luau_Br3-CXjS.mjs +0 -1
  310. package/website/dist/_worker.js/chunks/make_UBNG-kOo.mjs +0 -1
  311. package/website/dist/_worker.js/chunks/markdown_C7mhJFCm.mjs +0 -1
  312. package/website/dist/_worker.js/chunks/marko_4tchUvI7.mjs +0 -1
  313. package/website/dist/_worker.js/chunks/material-theme-darker_SKtaNEPn.mjs +0 -1
  314. package/website/dist/_worker.js/chunks/material-theme-lighter_zOX_DZCH.mjs +0 -1
  315. package/website/dist/_worker.js/chunks/material-theme-ocean_BN9WbhdC.mjs +0 -1
  316. package/website/dist/_worker.js/chunks/material-theme-palenight_DT_covjH.mjs +0 -1
  317. package/website/dist/_worker.js/chunks/material-theme_6RpeM3kc.mjs +0 -1
  318. package/website/dist/_worker.js/chunks/matlab_DCOXsPKR.mjs +0 -1
  319. package/website/dist/_worker.js/chunks/mdc_B9gb2UFP.mjs +0 -1
  320. package/website/dist/_worker.js/chunks/mdx_DGU7Nu9u.mjs +0 -1
  321. package/website/dist/_worker.js/chunks/mermaid_B69URzsZ.mjs +0 -1
  322. package/website/dist/_worker.js/chunks/min-dark_BgxifOMI.mjs +0 -1
  323. package/website/dist/_worker.js/chunks/min-light_BrPjXxUp.mjs +0 -1
  324. package/website/dist/_worker.js/chunks/mipsasm_9U-4_t7k.mjs +0 -1
  325. package/website/dist/_worker.js/chunks/mojo_B0wt7ug3.mjs +0 -1
  326. package/website/dist/_worker.js/chunks/monokai_B6Pxpoyi.mjs +0 -1
  327. package/website/dist/_worker.js/chunks/move_1eid4CyR.mjs +0 -1
  328. package/website/dist/_worker.js/chunks/narrat_Ds6-p5JZ.mjs +0 -1
  329. package/website/dist/_worker.js/chunks/nextflow_v2N1Qlqa.mjs +0 -1
  330. package/website/dist/_worker.js/chunks/nginx_Bp9Ab2NH.mjs +0 -1
  331. package/website/dist/_worker.js/chunks/night-owl_CdwOw_sc.mjs +0 -1
  332. package/website/dist/_worker.js/chunks/nim_BXGDUe53.mjs +0 -1
  333. package/website/dist/_worker.js/chunks/nix_CUig1nJH.mjs +0 -1
  334. package/website/dist/_worker.js/chunks/noop-middleware_DlWGj5t5.mjs +0 -10
  335. package/website/dist/_worker.js/chunks/nord_SPoG1iae.mjs +0 -1
  336. package/website/dist/_worker.js/chunks/nushell_DJw1Lca8.mjs +0 -1
  337. package/website/dist/_worker.js/chunks/objective-c_Bktzl_CO.mjs +0 -1
  338. package/website/dist/_worker.js/chunks/objective-cpp_CP4DWdDp.mjs +0 -1
  339. package/website/dist/_worker.js/chunks/ocaml_CeEAs7bZ.mjs +0 -1
  340. package/website/dist/_worker.js/chunks/one-dark-pro_-hIwCNMi.mjs +0 -1
  341. package/website/dist/_worker.js/chunks/one-light_DSmYvJ05.mjs +0 -1
  342. package/website/dist/_worker.js/chunks/pascal_C-S_Ms_o.mjs +0 -1
  343. package/website/dist/_worker.js/chunks/perl_CKamvo15.mjs +0 -1
  344. package/website/dist/_worker.js/chunks/php_BlmcX_F3.mjs +0 -1
  345. package/website/dist/_worker.js/chunks/plastic_Ryt8tVoA.mjs +0 -1
  346. package/website/dist/_worker.js/chunks/plsql_Cb3v7cBj.mjs +0 -1
  347. package/website/dist/_worker.js/chunks/po_DZbdNRlo.mjs +0 -1
  348. package/website/dist/_worker.js/chunks/poimandres_bYmE3_5d.mjs +0 -1
  349. package/website/dist/_worker.js/chunks/polar_pJkMGwoW.mjs +0 -1
  350. package/website/dist/_worker.js/chunks/postcss_BAXSOKgk.mjs +0 -1
  351. package/website/dist/_worker.js/chunks/powerquery_oITMGN4x.mjs +0 -1
  352. package/website/dist/_worker.js/chunks/powershell_6306-xIF.mjs +0 -1
  353. package/website/dist/_worker.js/chunks/prisma_DSDxnZGz.mjs +0 -1
  354. package/website/dist/_worker.js/chunks/prolog_CxG7tjZR.mjs +0 -1
  355. package/website/dist/_worker.js/chunks/proto_CS9ByXm1.mjs +0 -1
  356. package/website/dist/_worker.js/chunks/pug_BMtLJo6U.mjs +0 -1
  357. package/website/dist/_worker.js/chunks/puppet_BfeeSzee.mjs +0 -1
  358. package/website/dist/_worker.js/chunks/purescript_BFfueNaH.mjs +0 -1
  359. package/website/dist/_worker.js/chunks/python_Cc4Faapv.mjs +0 -1
  360. package/website/dist/_worker.js/chunks/qml_C1CTJTK8.mjs +0 -1
  361. package/website/dist/_worker.js/chunks/qmldir_nG1KaqKR.mjs +0 -1
  362. package/website/dist/_worker.js/chunks/qss_Cncxk263.mjs +0 -1
  363. package/website/dist/_worker.js/chunks/r_ChR54Ihi.mjs +0 -1
  364. package/website/dist/_worker.js/chunks/racket_BDrhptDs.mjs +0 -1
  365. package/website/dist/_worker.js/chunks/raku_07OUHa0P.mjs +0 -1
  366. package/website/dist/_worker.js/chunks/razor_DIP3INLa.mjs +0 -1
  367. package/website/dist/_worker.js/chunks/red_DOPXfj-6.mjs +0 -1
  368. package/website/dist/_worker.js/chunks/reg_B64SwEDj.mjs +0 -1
  369. package/website/dist/_worker.js/chunks/regexp_ButFGoB5.mjs +0 -1
  370. package/website/dist/_worker.js/chunks/rel_BWJAWqZD.mjs +0 -1
  371. package/website/dist/_worker.js/chunks/riscv_79gXlbsF.mjs +0 -1
  372. package/website/dist/_worker.js/chunks/rose-pine-dawn_DHIjVGd3.mjs +0 -1
  373. package/website/dist/_worker.js/chunks/rose-pine-moon_t86aEbs0.mjs +0 -1
  374. package/website/dist/_worker.js/chunks/rose-pine_BHgrcDCs.mjs +0 -1
  375. package/website/dist/_worker.js/chunks/rst_D3F4Fcpj.mjs +0 -1
  376. package/website/dist/_worker.js/chunks/ruby_Cs7vM9iv.mjs +0 -1
  377. package/website/dist/_worker.js/chunks/rust_DpyRVatH.mjs +0 -1
  378. package/website/dist/_worker.js/chunks/sas_DW45xZXN.mjs +0 -1
  379. package/website/dist/_worker.js/chunks/sass_C6SiMwN_.mjs +0 -1
  380. package/website/dist/_worker.js/chunks/scala_DlZOjNZk.mjs +0 -1
  381. package/website/dist/_worker.js/chunks/scheme_D2ezSJXu.mjs +0 -1
  382. package/website/dist/_worker.js/chunks/scss_DG5Spjqu.mjs +0 -1
  383. package/website/dist/_worker.js/chunks/sdbl_ZCYaj4VN.mjs +0 -1
  384. package/website/dist/_worker.js/chunks/shaderlab_CAcRkg1_.mjs +0 -1
  385. package/website/dist/_worker.js/chunks/shellscript_BWwhkDVh.mjs +0 -1
  386. package/website/dist/_worker.js/chunks/shellsession_BfEA3juK.mjs +0 -1
  387. package/website/dist/_worker.js/chunks/slack-dark_CL3lSpCc.mjs +0 -1
  388. package/website/dist/_worker.js/chunks/slack-ochin_DdZKOQVh.mjs +0 -1
  389. package/website/dist/_worker.js/chunks/smalltalk_DgilzSui.mjs +0 -1
  390. package/website/dist/_worker.js/chunks/snazzy-light_eJU08Pz_.mjs +0 -1
  391. package/website/dist/_worker.js/chunks/solarized-dark_Dg_YQywx.mjs +0 -1
  392. package/website/dist/_worker.js/chunks/solarized-light_BnIsrA6p.mjs +0 -1
  393. package/website/dist/_worker.js/chunks/solidity_DkseH8pQ.mjs +0 -1
  394. package/website/dist/_worker.js/chunks/soy_DU7bOYoG.mjs +0 -1
  395. package/website/dist/_worker.js/chunks/sparql_BuI1DBDH.mjs +0 -1
  396. package/website/dist/_worker.js/chunks/splunk_B8Ha9Pkg.mjs +0 -1
  397. package/website/dist/_worker.js/chunks/sql_BniHwea5.mjs +0 -1
  398. package/website/dist/_worker.js/chunks/ssh-config_CkE1GuVe.mjs +0 -1
  399. package/website/dist/_worker.js/chunks/stata_Dtqpbd_l.mjs +0 -1
  400. package/website/dist/_worker.js/chunks/stylus_CXTtglzO.mjs +0 -1
  401. package/website/dist/_worker.js/chunks/svelte_BjWYcUCN.mjs +0 -1
  402. package/website/dist/_worker.js/chunks/swift_BzHql_rM.mjs +0 -1
  403. package/website/dist/_worker.js/chunks/synthwave-84_DLRNhxNA.mjs +0 -1
  404. package/website/dist/_worker.js/chunks/system-verilog_ChyInPph.mjs +0 -1
  405. package/website/dist/_worker.js/chunks/systemd_Bi9Qa2qD.mjs +0 -1
  406. package/website/dist/_worker.js/chunks/talonscript_B3sH_Y-V.mjs +0 -1
  407. package/website/dist/_worker.js/chunks/tasl_BJ5yipRs.mjs +0 -1
  408. package/website/dist/_worker.js/chunks/tcl_CoJQjNoP.mjs +0 -1
  409. package/website/dist/_worker.js/chunks/templ_CrU7Ffil.mjs +0 -1
  410. package/website/dist/_worker.js/chunks/terraform_DT9JSFpC.mjs +0 -1
  411. package/website/dist/_worker.js/chunks/tex_5PKu2yA0.mjs +0 -1
  412. package/website/dist/_worker.js/chunks/tokyo-night_Buo8OK7-.mjs +0 -1
  413. package/website/dist/_worker.js/chunks/toml_CPuXX3oc.mjs +0 -1
  414. package/website/dist/_worker.js/chunks/ts-tags_D0M_1VSH.mjs +0 -1
  415. package/website/dist/_worker.js/chunks/tsv_CuivVNot.mjs +0 -1
  416. package/website/dist/_worker.js/chunks/tsx_MkuGr8MY.mjs +0 -1
  417. package/website/dist/_worker.js/chunks/turtle_BqgEPK7f.mjs +0 -1
  418. package/website/dist/_worker.js/chunks/twig_r1G9rpYJ.mjs +0 -1
  419. package/website/dist/_worker.js/chunks/typescript_Au5buqzM.mjs +0 -1
  420. package/website/dist/_worker.js/chunks/typespec_47rhBK_z.mjs +0 -1
  421. package/website/dist/_worker.js/chunks/typst_BAtuQLh-.mjs +0 -1
  422. package/website/dist/_worker.js/chunks/v_BIvWImHg.mjs +0 -1
  423. package/website/dist/_worker.js/chunks/vala_DYEacj30.mjs +0 -1
  424. package/website/dist/_worker.js/chunks/vb_CikQuqGJ.mjs +0 -1
  425. package/website/dist/_worker.js/chunks/verilog_BQRENwI-.mjs +0 -1
  426. package/website/dist/_worker.js/chunks/vesper_DA0kvTmj.mjs +0 -1
  427. package/website/dist/_worker.js/chunks/vhdl_DHscJIyg.mjs +0 -1
  428. package/website/dist/_worker.js/chunks/viml_F2pvMwvG.mjs +0 -1
  429. package/website/dist/_worker.js/chunks/vitesse-black_D9tjNzd0.mjs +0 -1
  430. package/website/dist/_worker.js/chunks/vitesse-dark_Bnm5d0hd.mjs +0 -1
  431. package/website/dist/_worker.js/chunks/vitesse-light_CHwbyjNR.mjs +0 -1
  432. package/website/dist/_worker.js/chunks/vue-html_DyYtbbMK.mjs +0 -1
  433. package/website/dist/_worker.js/chunks/vue_DofN6juy.mjs +0 -1
  434. package/website/dist/_worker.js/chunks/vyper_CiR0m-OV.mjs +0 -1
  435. package/website/dist/_worker.js/chunks/wasm_CwIGgRGf.mjs +0 -1
  436. package/website/dist/_worker.js/chunks/wasm_jKWhg0J0.mjs +0 -1
  437. package/website/dist/_worker.js/chunks/wenyan_DKvVZKXW.mjs +0 -1
  438. package/website/dist/_worker.js/chunks/wgsl_BOWZY7yw.mjs +0 -1
  439. package/website/dist/_worker.js/chunks/wikitext_CXDhhHPy.mjs +0 -1
  440. package/website/dist/_worker.js/chunks/wolfram_ChkmGnW0.mjs +0 -1
  441. package/website/dist/_worker.js/chunks/xml_DXH3hHIu.mjs +0 -1
  442. package/website/dist/_worker.js/chunks/xsl_DuP2mFjg.mjs +0 -1
  443. package/website/dist/_worker.js/chunks/yaml_IGiEkTge.mjs +0 -1
  444. package/website/dist/_worker.js/chunks/zenscript_59iXGyNw.mjs +0 -1
  445. package/website/dist/_worker.js/chunks/zig_DKzb0zdT.mjs +0 -1
  446. package/website/dist/_worker.js/index.js +0 -53
  447. package/website/dist/_worker.js/manifest_CT_D-YDe.mjs +0 -98
  448. package/website/dist/_worker.js/pages/_image.astro.mjs +0 -24
  449. package/website/dist/_worker.js/pages/agents.astro.mjs +0 -1
  450. package/website/dist/_worker.js/pages/animation.astro.mjs +0 -1
  451. package/website/dist/_worker.js/pages/api/raw-markdown/_---path_.astro.mjs +0 -44
  452. package/website/dist/_worker.js/pages/config.astro.mjs +0 -1
  453. package/website/dist/_worker.js/pages/fonts.astro.mjs +0 -1
  454. package/website/dist/_worker.js/pages/getting-started.astro.mjs +0 -1
  455. package/website/dist/_worker.js/pages/helpers.astro.mjs +0 -1
  456. package/website/dist/_worker.js/pages/images.astro.mjs +0 -1
  457. package/website/dist/_worker.js/pages/index.astro.mjs +0 -1
  458. package/website/dist/_worker.js/pages/llm.txt.astro.mjs +0 -1
  459. package/website/dist/_worker.js/pages/preview.astro.mjs +0 -1
  460. package/website/dist/_worker.js/pages/sdk.astro.mjs +0 -1
  461. package/website/dist/_worker.js/pages/sitemap.xml.astro.mjs +0 -1
  462. package/website/dist/_worker.js/pages/styling.astro.mjs +0 -1
  463. package/website/dist/_worker.js/pages/templates.astro.mjs +0 -1
  464. package/website/dist/_worker.js/pages/video.astro.mjs +0 -1
  465. package/website/dist/_worker.js/renderers.mjs +0 -57
  466. package/website/dist/agents/index.html +0 -52
  467. package/website/dist/animation/index.html +0 -879
  468. package/website/dist/config/index.html +0 -184
  469. package/website/dist/fonts/index.html +0 -198
  470. package/website/dist/getting-started/index.html +0 -107
  471. package/website/dist/helpers/index.html +0 -164
  472. package/website/dist/images/index.html +0 -335
  473. package/website/dist/index.html +0 -140
  474. package/website/dist/llm.txt +0 -2776
  475. package/website/dist/preview/index.html +0 -111
  476. package/website/dist/robots.txt +0 -40
  477. package/website/dist/sdk/index.html +0 -1076
  478. package/website/dist/sitemap.xml +0 -76
  479. package/website/dist/styling/index.html +0 -366
  480. package/website/dist/templates/index.html +0 -74
  481. package/website/dist/video/index.html +0 -319
  482. package/website/package-lock.json +0 -8089
  483. package/website/package.json +0 -41
  484. package/website/public/.gitkeep +0 -5
  485. package/website/public/robots.txt +0 -40
  486. package/website/templates/og-image.tsx +0 -60
@@ -1,122 +0,0 @@
1
- import * as Babel from '@babel/standalone';
2
- /**
3
- * Compile JSX template source to plain JavaScript
4
- *
5
- * This function transforms JSX syntax to React.createElement calls using Babel.
6
- * Use this in your admin panel, build pipeline, or anywhere you need to compile
7
- * user-generated JSX templates before storing or deploying them.
8
- *
9
- * **When to use this:**
10
- * - In admin panels where users edit templates in a code editor
11
- * - In build pipelines that process templates before deployment
12
- * - Before storing templates in a database
13
- *
14
- * **Benefits:**
15
- * - Compile JSX at save time instead of runtime
16
- * - Catch syntax errors early (before production)
17
- * - Reduce production bundle size (no Babel in production)
18
- * - Faster rendering (no compilation overhead)
19
- *
20
- * @example
21
- * ```typescript
22
- * // In your admin panel API
23
- * import { compileTemplate } from 'loopwind/sdk/compiler';
24
- *
25
- * export async function POST(req: Request) {
26
- * const { templateId, jsxCode } = await req.json();
27
- *
28
- * try {
29
- * // Compile JSX to JavaScript
30
- * const compiled = compileTemplate(jsxCode);
31
- *
32
- * // Save compiled version to database
33
- * await db.templates.update(templateId, {
34
- * sourceCode: compiled,
35
- * updatedAt: new Date()
36
- * });
37
- *
38
- * return Response.json({ success: true });
39
- * } catch (error) {
40
- * return Response.json({
41
- * error: 'Compilation failed',
42
- * message: error.message
43
- * }, { status: 400 });
44
- * }
45
- * }
46
- * ```
47
- *
48
- * @example
49
- * ```typescript
50
- * // Input JSX
51
- * const jsxSource = `
52
- * export const meta = {
53
- * name: 'card',
54
- * size: { width: 1200, height: 630 }
55
- * };
56
- *
57
- * export default ({ tw, title }) => (
58
- * <div style={tw('flex items-center justify-center w-full h-full bg-blue-500')}>
59
- * <h1 style={tw('text-6xl font-bold text-white')}>{title}</h1>
60
- * </div>
61
- * );
62
- * `;
63
- *
64
- * // Compile to plain JavaScript
65
- * const compiled = compileTemplate(jsxSource);
66
- *
67
- * // compiled now contains React.createElement calls
68
- * // You can safely use this with defineTemplateFromSource in production
69
- * ```
70
- *
71
- * @param jsxSource - Template source code containing JSX syntax
72
- * @returns Compiled JavaScript with React.createElement calls
73
- * @throws Error if the JSX syntax is invalid or compilation fails
74
- */
75
- export function compileTemplate(jsxSource) {
76
- try {
77
- const result = Babel.transform(jsxSource, {
78
- presets: ['react'],
79
- filename: 'template.tsx',
80
- });
81
- if (!result.code) {
82
- throw new Error('Babel compilation returned empty code');
83
- }
84
- return result.code;
85
- }
86
- catch (error) {
87
- throw new Error(`Failed to compile JSX template: ${error instanceof Error ? error.message : String(error)}`);
88
- }
89
- }
90
- /**
91
- * Check if source code contains JSX syntax
92
- *
93
- * This is a simple heuristic check that looks for common JSX patterns.
94
- * Use this to determine if source code needs compilation.
95
- *
96
- * @example
97
- * ```typescript
98
- * const code1 = '<div>Hello</div>';
99
- * const code2 = 'React.createElement("div", null, "Hello")';
100
- *
101
- * containsJSX(code1); // true
102
- * containsJSX(code2); // false
103
- * ```
104
- *
105
- * @param sourceCode - Source code to check
106
- * @returns true if the code appears to contain JSX
107
- */
108
- export function containsJSX(sourceCode) {
109
- // Look for JSX-like patterns:
110
- // - Opening tags: <div, <Component
111
- // - Self-closing tags: <div />, <Component />
112
- // - JSX fragments: <>, </>
113
- const jsxPatterns = [
114
- /<[A-Za-z][A-Za-z0-9]*\s/, // <div , <Component
115
- /<[A-Za-z][A-Za-z0-9]*>/, // <div>, <Component>
116
- /<[A-Za-z][A-Za-z0-9]*\s*\/>/, // <div/>, <Component />
117
- /<>\s*/, // Fragment opening
118
- /<\/>\s*/, // Fragment closing
119
- ];
120
- return jsxPatterns.some((pattern) => pattern.test(sourceCode));
121
- }
122
- //# sourceMappingURL=compiler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/sdk/compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE;YACxC,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,QAAQ,EAAE,cAAc;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mCAAmC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,8BAA8B;IAC9B,mCAAmC;IACnC,8CAA8C;IAC9C,2BAA2B;IAC3B,MAAM,WAAW,GAAG;QAClB,yBAAyB,EAAE,oBAAoB;QAC/C,wBAAwB,EAAE,qBAAqB;QAC/C,6BAA6B,EAAE,wBAAwB;QACvD,OAAO,EAAE,mBAAmB;QAC5B,SAAS,EAAE,mBAAmB;KAC/B,CAAC;IAEF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -1,62 +0,0 @@
1
- import type { TemplateDefinition, StyleConfig } from './template.js';
2
- export { defineTemplate, defineTemplateFromSource, defineTemplateFromSchema } from './template.js';
3
- export type { TemplateDefinition, StyleConfig, TemplateSchema, SchemaElement } from './template.js';
4
- export { previewVideo, VideoPreview } from './preview.js';
5
- export type { PreviewFrames, VideoPreviewProps } from './preview.js';
6
- /**
7
- * Render options for image generation
8
- */
9
- export interface RenderImageOptions {
10
- format?: 'png' | 'jpeg' | 'jpg' | 'webp' | 'svg';
11
- quality?: number;
12
- config?: StyleConfig;
13
- }
14
- /**
15
- * Render options for video generation
16
- */
17
- export interface RenderVideoOptions {
18
- quality?: number;
19
- onProgress?: (frame: number, total: number, phase?: 'svg' | 'encode') => void;
20
- config?: StyleConfig;
21
- }
22
- /**
23
- * Render an image from a template definition
24
- *
25
- * @example
26
- * ```typescript
27
- * const template = defineTemplate({
28
- * name: 'og-image',
29
- * size: { width: 1200, height: 630 },
30
- * render: ({ tw, title }) => <div style={tw('flex')}>{title}</div>
31
- * });
32
- *
33
- * const png = await renderImage(template, { title: 'Hello World' });
34
- * // Returns Buffer containing PNG data
35
- * ```
36
- */
37
- export declare function renderImage<TProps = any>(template: TemplateDefinition<TProps>, props: TProps, options?: RenderImageOptions): Promise<Buffer>;
38
- /**
39
- * Render a video from a template definition
40
- *
41
- * @example
42
- * ```typescript
43
- * const template = defineTemplate({
44
- * name: 'intro-video',
45
- * type: 'video',
46
- * size: { width: 1920, height: 1080 },
47
- * video: { fps: 30, duration: 3 },
48
- * render: ({ tw, progress, title }) => (
49
- * <div style={tw('flex items-center justify-center w-full h-full bg-black')}>
50
- * <h1 style={{ ...tw('text-8xl font-bold text-white'), opacity: progress }}>
51
- * {title}
52
- * </h1>
53
- * </div>
54
- * )
55
- * });
56
- *
57
- * const mp4 = await renderVideo(template, { title: 'Hello' });
58
- * // Returns Buffer containing MP4 data
59
- * ```
60
- */
61
- export declare function renderVideo<TProps = any>(template: TemplateDefinition<TProps>, props: TProps, options?: RenderVideoOptions): Promise<Buffer>;
62
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQrE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACnG,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;IAC9E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,MAAM,GAAG,GAAG,EAC5C,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAoDjB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,WAAW,CAAC,MAAM,GAAG,GAAG,EAC5C,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
package/dist/sdk/index.js DELETED
@@ -1,141 +0,0 @@
1
- import { renderToSVG, renderToPNG, renderToJPEG, renderToWebP } from '../lib/renderer.js';
2
- import { templateToMeta } from './template.js';
3
- import { renderVideo as renderVideoInternal } from '../lib/video-renderer.js';
4
- import fs from 'fs/promises';
5
- import path from 'path';
6
- import os from 'os';
7
- export { defineTemplate, defineTemplateFromSource, defineTemplateFromSchema } from './template.js';
8
- export { previewVideo, VideoPreview } from './preview.js';
9
- /**
10
- * Render an image from a template definition
11
- *
12
- * @example
13
- * ```typescript
14
- * const template = defineTemplate({
15
- * name: 'og-image',
16
- * size: { width: 1200, height: 630 },
17
- * render: ({ tw, title }) => <div style={tw('flex')}>{title}</div>
18
- * });
19
- *
20
- * const png = await renderImage(template, { title: 'Hello World' });
21
- * // Returns Buffer containing PNG data
22
- * ```
23
- */
24
- export async function renderImage(template, props, options = {}) {
25
- const { format = 'png', quality = 92, config } = options;
26
- const meta = templateToMeta(template);
27
- if (meta.type === 'video') {
28
- throw new Error('Cannot render video template as image. Use renderVideo() instead.');
29
- }
30
- // Save template to temp file so we can use the existing renderer
31
- const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'loopwind-sdk-'));
32
- const templatePath = path.join(tempDir, 'template.tsx');
33
- try {
34
- // Write template component with embedded meta
35
- const templateContent = `import React from 'react';
36
-
37
- const h = React.createElement;
38
-
39
- export const meta = ${JSON.stringify(meta, null, 2)};
40
-
41
- export default ${template.render.toString()};`;
42
- await fs.writeFile(templatePath, templateContent);
43
- // Merge configs: options.config overrides template.config (deep merge for colors/fonts)
44
- const mergedConfig = {
45
- ...template.config,
46
- ...config,
47
- colors: { ...template.config?.colors, ...config?.colors },
48
- fonts: { ...template.config?.fonts, ...config?.fonts },
49
- };
50
- // Use existing renderer and pass config directly (no filesystem writes!)
51
- // Pass absolute template path instead of template name
52
- if (format === 'svg') {
53
- const svg = await renderToSVG(templatePath, props, { config: mergedConfig });
54
- return Buffer.from(svg);
55
- }
56
- else if (format === 'jpeg' || format === 'jpg') {
57
- const buffer = await renderToJPEG(templatePath, props, { quality, config: mergedConfig });
58
- return buffer;
59
- }
60
- else if (format === 'webp') {
61
- const buffer = await renderToWebP(templatePath, props, { config: mergedConfig });
62
- // Note: renderToWebP doesn't take quality param, uses fixed 90
63
- return buffer;
64
- }
65
- else {
66
- // PNG
67
- const buffer = await renderToPNG(templatePath, props, { config: mergedConfig });
68
- return buffer;
69
- }
70
- }
71
- finally {
72
- // Cleanup temp files
73
- await fs.rm(tempDir, { recursive: true, force: true });
74
- }
75
- }
76
- /**
77
- * Render a video from a template definition
78
- *
79
- * @example
80
- * ```typescript
81
- * const template = defineTemplate({
82
- * name: 'intro-video',
83
- * type: 'video',
84
- * size: { width: 1920, height: 1080 },
85
- * video: { fps: 30, duration: 3 },
86
- * render: ({ tw, progress, title }) => (
87
- * <div style={tw('flex items-center justify-center w-full h-full bg-black')}>
88
- * <h1 style={{ ...tw('text-8xl font-bold text-white'), opacity: progress }}>
89
- * {title}
90
- * </h1>
91
- * </div>
92
- * )
93
- * });
94
- *
95
- * const mp4 = await renderVideo(template, { title: 'Hello' });
96
- * // Returns Buffer containing MP4 data
97
- * ```
98
- */
99
- export async function renderVideo(template, props, options = {}) {
100
- const { config, ...renderOptions } = options;
101
- const meta = templateToMeta(template);
102
- if (meta.type !== 'video') {
103
- throw new Error('Cannot render image template as video. Use renderImage() instead.');
104
- }
105
- if (!meta.video) {
106
- throw new Error('Template is missing video metadata (fps, duration)');
107
- }
108
- // Save template to temp file so we can use the existing renderer
109
- const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'loopwind-sdk-'));
110
- const templatePath = path.join(tempDir, 'template.tsx');
111
- const outputPath = path.join(tempDir, 'output.mp4');
112
- try {
113
- // Write template component with embedded meta
114
- const templateContent = `import React from 'react';
115
-
116
- const h = React.createElement;
117
-
118
- export const meta = ${JSON.stringify(meta, null, 2)};
119
-
120
- export default ${template.render.toString()};`;
121
- await fs.writeFile(templatePath, templateContent);
122
- // Merge configs: options.config overrides template.config (deep merge for colors/fonts)
123
- const mergedConfig = {
124
- ...template.config,
125
- ...config,
126
- colors: { ...template.config?.colors, ...config?.colors },
127
- fonts: { ...template.config?.fonts, ...config?.fonts },
128
- };
129
- // Use existing video renderer and pass config directly (no filesystem writes!)
130
- // Pass absolute template path instead of template name
131
- await renderVideoInternal(templatePath, props, outputPath, { ...renderOptions, config: mergedConfig });
132
- // Read the generated MP4
133
- const buffer = await fs.readFile(outputPath);
134
- return buffer;
135
- }
136
- finally {
137
- // Cleanup temp files
138
- await fs.rm(tempDir, { recursive: true, force: true });
139
- }
140
- }
141
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG1F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEnG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAqB1D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAoC,EACpC,KAAa,EACb,UAA8B,EAAE;IAEhC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,iEAAiE;IACjE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,8CAA8C;QAC9C,MAAM,eAAe,GAAG;;;;sBAIN,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;;iBAElC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC;QAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAElD,wFAAwF;QACxF,MAAM,YAAY,GAAG;YACnB,GAAG,QAAQ,CAAC,MAAM;YAClB,GAAG,MAAM;YACT,MAAM,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE;YACzD,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE;SACvD,CAAC;QAEF,yEAAyE;QACzE,uDAAuD;QACvD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,KAAY,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YACpF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,KAAY,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YACjG,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,KAAY,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YACxF,+DAA+D;YAC/D,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM;YACN,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,KAAY,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YACvF,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,qBAAqB;QACrB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAoC,EACpC,KAAa,EACb,UAA8B,EAAE;IAEhC,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,iEAAiE;IACjE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,8CAA8C;QAC9C,MAAM,eAAe,GAAG;;;;sBAIN,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;;iBAElC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC;QAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAElD,wFAAwF;QACxF,MAAM,YAAY,GAAG;YACnB,GAAG,QAAQ,CAAC,MAAM;YAClB,GAAG,MAAM;YACT,MAAM,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE;YACzD,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE;SACvD,CAAC;QAEF,+EAA+E;QAC/E,uDAAuD;QACvD,MAAM,mBAAmB,CAAC,YAAY,EAAE,KAAY,EAAE,UAAU,EAAE,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAE9G,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,qBAAqB;QACrB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
@@ -1,65 +0,0 @@
1
- import React from 'react';
2
- import type { TemplateDefinition, StyleConfig } from './template.js';
3
- /**
4
- * Pre-rendered video frames
5
- */
6
- export interface PreviewFrames {
7
- frames: string[];
8
- meta: {
9
- name: string;
10
- width: number;
11
- height: number;
12
- fps: number;
13
- duration: number;
14
- totalFrames: number;
15
- };
16
- }
17
- /**
18
- * Pre-render all frames of a video template for preview
19
- * Call this on the server or at build time
20
- *
21
- * @example
22
- * ```typescript
23
- * const template = defineTemplate({
24
- * name: 'intro',
25
- * type: 'video',
26
- * size: { width: 1920, height: 1080 },
27
- * video: { fps: 30, duration: 3 },
28
- * render: ({ tw, progress }) => <div style={tw('flex')}>Frame</div>
29
- * });
30
- *
31
- * const frames = await previewVideo(template, { title: 'Hello' });
32
- * // Pass to <VideoPreview frames={frames} />
33
- * ```
34
- */
35
- export declare function previewVideo<TProps = any>(template: TemplateDefinition<TProps>, props: TProps, options?: {
36
- config?: StyleConfig;
37
- format?: 'svg' | 'data-url';
38
- }): Promise<PreviewFrames>;
39
- /**
40
- * Props for VideoPreview component
41
- */
42
- export interface VideoPreviewProps {
43
- frames: PreviewFrames;
44
- autoPlay?: boolean;
45
- loop?: boolean;
46
- controls?: boolean;
47
- className?: string;
48
- style?: React.CSSProperties;
49
- onFrameChange?: (frame: number) => void;
50
- }
51
- /**
52
- * Video preview component that displays pre-rendered frames
53
- * Works in browser - no Node.js dependencies
54
- *
55
- * @example
56
- * ```tsx
57
- * // Server-side (Next.js, etc.)
58
- * const frames = await previewVideo(template, props);
59
- *
60
- * // Client-side
61
- * <VideoPreview frames={frames} autoPlay loop />
62
- * ```
63
- */
64
- export declare function VideoPreview({ frames: previewFrames, autoPlay, loop, controls, className, style, onFrameChange, }: VideoPreviewProps): React.JSX.Element;
65
- //# sourceMappingURL=preview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/sdk/preview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMrE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAG,GAAG,EAC7C,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;CAAO,GAClE,OAAO,CAAC,aAAa,CAAC,CAwExB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EAAE,aAAa,EACrB,QAAe,EACf,IAAW,EACX,QAAe,EACf,SAAS,EACT,KAAK,EACL,aAAa,GACd,EAAE,iBAAiB,qBA2PnB"}
@@ -1,262 +0,0 @@
1
- import React, { useState, useEffect, useRef } from 'react';
2
- import { renderToSVG } from '../lib/renderer.js';
3
- import { templateToMeta } from './template.js';
4
- import fs from 'fs/promises';
5
- import path from 'path';
6
- import os from 'os';
7
- /**
8
- * Pre-render all frames of a video template for preview
9
- * Call this on the server or at build time
10
- *
11
- * @example
12
- * ```typescript
13
- * const template = defineTemplate({
14
- * name: 'intro',
15
- * type: 'video',
16
- * size: { width: 1920, height: 1080 },
17
- * video: { fps: 30, duration: 3 },
18
- * render: ({ tw, progress }) => <div style={tw('flex')}>Frame</div>
19
- * });
20
- *
21
- * const frames = await previewVideo(template, { title: 'Hello' });
22
- * // Pass to <VideoPreview frames={frames} />
23
- * ```
24
- */
25
- export async function previewVideo(template, props, options = {}) {
26
- const { config, format = 'svg' } = options;
27
- const meta = templateToMeta(template);
28
- if (meta.type !== 'video') {
29
- throw new Error('Cannot preview image template. Only video templates are supported.');
30
- }
31
- if (!meta.video) {
32
- throw new Error('Template is missing video metadata (fps, duration)');
33
- }
34
- const { fps, duration } = meta.video;
35
- const totalFrames = Math.floor(fps * duration);
36
- const frames = [];
37
- // Save template to temp file so we can use the existing renderer
38
- const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'loopwind-preview-'));
39
- const templatePath = path.join(tempDir, 'template.tsx');
40
- try {
41
- // Write template component with embedded meta
42
- const templateContent = `import React from 'react';
43
-
44
- const h = React.createElement;
45
-
46
- export const meta = ${JSON.stringify(meta, null, 2)};
47
-
48
- export default ${template.render.toString()};`;
49
- await fs.writeFile(templatePath, templateContent);
50
- // Merge configs
51
- const mergedConfig = {
52
- ...template.config,
53
- ...config,
54
- colors: { ...template.config?.colors, ...config?.colors },
55
- fonts: { ...template.config?.fonts, ...config?.fonts },
56
- };
57
- // Render each frame
58
- for (let frame = 0; frame < totalFrames; frame++) {
59
- const progress = frame / totalFrames;
60
- const svg = await renderToSVG(templatePath, { ...props, frame, progress }, { config: mergedConfig });
61
- if (format === 'data-url') {
62
- // Convert SVG to data URL for easier browser usage
63
- const dataUrl = `data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`;
64
- frames.push(dataUrl);
65
- }
66
- else {
67
- frames.push(svg);
68
- }
69
- }
70
- return {
71
- frames,
72
- meta: {
73
- name: meta.name,
74
- width: meta.size.width,
75
- height: meta.size.height,
76
- fps,
77
- duration,
78
- totalFrames,
79
- },
80
- };
81
- }
82
- finally {
83
- // Cleanup temp files
84
- await fs.rm(tempDir, { recursive: true, force: true });
85
- }
86
- }
87
- /**
88
- * Video preview component that displays pre-rendered frames
89
- * Works in browser - no Node.js dependencies
90
- *
91
- * @example
92
- * ```tsx
93
- * // Server-side (Next.js, etc.)
94
- * const frames = await previewVideo(template, props);
95
- *
96
- * // Client-side
97
- * <VideoPreview frames={frames} autoPlay loop />
98
- * ```
99
- */
100
- export function VideoPreview({ frames: previewFrames, autoPlay = true, loop = true, controls = true, className, style, onFrameChange, }) {
101
- const [frame, setFrame] = useState(0);
102
- const [isPlaying, setIsPlaying] = useState(autoPlay);
103
- const [isLooping, setIsLooping] = useState(loop);
104
- const animationRef = useRef(null);
105
- const lastTimeRef = useRef(0);
106
- const { frames, meta } = previewFrames;
107
- const { fps, duration, totalFrames, width, height } = meta;
108
- const durationMs = duration * 1000;
109
- // Notify parent of frame changes
110
- useEffect(() => {
111
- if (onFrameChange) {
112
- onFrameChange(Math.floor(frame));
113
- }
114
- }, [frame, onFrameChange]);
115
- // Playback loop
116
- useEffect(() => {
117
- if (!isPlaying) {
118
- if (animationRef.current) {
119
- cancelAnimationFrame(animationRef.current);
120
- animationRef.current = null;
121
- }
122
- return;
123
- }
124
- lastTimeRef.current = performance.now();
125
- const animate = (time) => {
126
- const delta = time - lastTimeRef.current;
127
- lastTimeRef.current = time;
128
- setFrame((prev) => {
129
- const increment = (delta / 1000) * fps;
130
- const next = prev + increment;
131
- if (next >= totalFrames) {
132
- if (isLooping) {
133
- return next % totalFrames;
134
- }
135
- else {
136
- setIsPlaying(false);
137
- return totalFrames - 1;
138
- }
139
- }
140
- return next;
141
- });
142
- animationRef.current = requestAnimationFrame(animate);
143
- };
144
- animationRef.current = requestAnimationFrame(animate);
145
- return () => {
146
- if (animationRef.current) {
147
- cancelAnimationFrame(animationRef.current);
148
- }
149
- };
150
- }, [isPlaying, fps, totalFrames, isLooping]);
151
- const currentMs = (frame / totalFrames) * durationMs;
152
- const progress = (frame / totalFrames) * 100;
153
- const frameNum = Math.floor(frame);
154
- const handleScrub = (e) => {
155
- const value = parseFloat(e.target.value);
156
- setFrame((value / 100) * totalFrames);
157
- };
158
- const handlePlayPause = () => {
159
- if (!isPlaying && frame >= totalFrames - 1) {
160
- setFrame(0);
161
- }
162
- setIsPlaying(!isPlaying);
163
- };
164
- const handleRestart = () => {
165
- setFrame(0);
166
- setIsPlaying(true);
167
- };
168
- const handleStepBackward = () => {
169
- setIsPlaying(false);
170
- setFrame((prev) => Math.max(0, prev - 1));
171
- };
172
- const handleStepForward = () => {
173
- setIsPlaying(false);
174
- setFrame((prev) => Math.min(totalFrames - 1, prev + 1));
175
- };
176
- return (React.createElement("div", { className: className, style: {
177
- display: 'inline-flex',
178
- flexDirection: 'column',
179
- gap: '0.75rem',
180
- ...style,
181
- } },
182
- React.createElement("div", { style: {
183
- position: 'relative',
184
- width,
185
- height,
186
- overflow: 'hidden',
187
- borderRadius: '0.5rem',
188
- boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1)',
189
- } }, frames[frameNum]?.startsWith('data:') ? (React.createElement("img", { src: frames[frameNum], alt: `Frame ${frameNum}`, style: { display: 'block', width: '100%', height: '100%' } })) : (React.createElement("div", { dangerouslySetInnerHTML: { __html: frames[frameNum] || '' }, style: { width: '100%', height: '100%' } }))),
190
- controls && (React.createElement("div", { style: {
191
- display: 'flex',
192
- flexDirection: 'column',
193
- gap: '0.5rem',
194
- width,
195
- } },
196
- React.createElement("input", { type: "range", min: "0", max: "100", step: "0.1", value: progress, onChange: handleScrub, style: {
197
- width: '100%',
198
- height: '6px',
199
- background: `linear-gradient(to right, #7c3aed ${progress}%, #d1d5db ${progress}%)`,
200
- borderRadius: '3px',
201
- cursor: 'pointer',
202
- WebkitAppearance: 'none',
203
- appearance: 'none',
204
- } }),
205
- React.createElement("div", { style: {
206
- display: 'flex',
207
- alignItems: 'center',
208
- justifyContent: 'space-between',
209
- fontSize: '0.875rem',
210
- } },
211
- React.createElement("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' } },
212
- React.createElement("button", { onClick: handleRestart, title: "Restart", style: {
213
- background: 'transparent',
214
- border: 'none',
215
- cursor: 'pointer',
216
- padding: '0.25rem',
217
- fontSize: '1.25rem',
218
- } }, "\u23EE"),
219
- React.createElement("button", { onClick: handleStepBackward, title: "Previous frame", style: {
220
- background: 'transparent',
221
- border: 'none',
222
- cursor: 'pointer',
223
- padding: '0.25rem',
224
- fontSize: '1.25rem',
225
- } }, "\u23EA"),
226
- React.createElement("button", { onClick: handlePlayPause, style: {
227
- background: '#7c3aed',
228
- border: 'none',
229
- color: 'white',
230
- cursor: 'pointer',
231
- padding: '0.5rem 0.75rem',
232
- borderRadius: '0.375rem',
233
- fontSize: '1rem',
234
- minWidth: '3rem',
235
- } }, isPlaying ? '⏸' : '▶'),
236
- React.createElement("button", { onClick: handleStepForward, title: "Next frame", style: {
237
- background: 'transparent',
238
- border: 'none',
239
- cursor: 'pointer',
240
- padding: '0.25rem',
241
- fontSize: '1.25rem',
242
- } }, "\u23E9"),
243
- React.createElement("button", { onClick: () => setIsLooping(!isLooping), title: isLooping ? 'Loop enabled' : 'Loop disabled', style: {
244
- background: isLooping ? '#e5e7eb' : 'transparent',
245
- border: '1px solid #d1d5db',
246
- cursor: 'pointer',
247
- padding: '0.25rem 0.5rem',
248
- borderRadius: '0.375rem',
249
- fontSize: '0.875rem',
250
- } }, "\uD83D\uDD01")),
251
- React.createElement("div", { style: { fontFamily: 'monospace', color: '#6b7280' } },
252
- Math.floor(currentMs),
253
- "ms / ",
254
- Math.floor(durationMs),
255
- "ms",
256
- React.createElement("span", { style: { marginLeft: '0.5rem' } },
257
- "Frame ",
258
- frameNum,
259
- " / ",
260
- totalFrames)))))));
261
- }
262
- //# sourceMappingURL=preview.js.map