loopwind 0.16.0 → 0.18.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 (354) hide show
  1. package/dist/default-templates/AGENTS.md +18 -2
  2. package/dist/lib/renderer.d.ts +6 -1
  3. package/dist/lib/renderer.d.ts.map +1 -1
  4. package/dist/lib/renderer.js +9 -9
  5. package/dist/lib/renderer.js.map +1 -1
  6. package/dist/lib/video-renderer.d.ts +3 -0
  7. package/dist/lib/video-renderer.d.ts.map +1 -1
  8. package/dist/lib/video-renderer.js +7 -7
  9. package/dist/lib/video-renderer.js.map +1 -1
  10. package/dist/sdk/index.d.ts +5 -3
  11. package/dist/sdk/index.d.ts.map +1 -1
  12. package/dist/sdk/index.js +30 -9
  13. package/dist/sdk/index.js.map +1 -1
  14. package/dist/sdk/template.d.ts +136 -0
  15. package/dist/sdk/template.d.ts.map +1 -1
  16. package/dist/sdk/template.js +198 -0
  17. package/dist/sdk/template.js.map +1 -1
  18. package/examples/code-editor-templates.ts +173 -0
  19. package/examples/nextjs-template-import.ts +58 -0
  20. package/examples/visual-builder-templates.ts +336 -0
  21. package/package.json +1 -1
  22. package/test-font-files.mjs +72 -0
  23. package/test-sdk-config.mjs +397 -0
  24. package/test-sdk-user-templates.mjs +469 -0
  25. package/website/.astro/integrations/_inox-tools_astro-when/types.d.ts +1 -0
  26. package/website/.astro/types.d.ts +1 -0
  27. package/website/DEPLOYMENT.md +142 -0
  28. package/website/OG_IMAGES.md +141 -0
  29. package/website/README.md +39 -19
  30. package/website/deploy.sh +19 -0
  31. package/website/dist/.gitkeep +1 -0
  32. package/website/dist/_astro/agents.Yx-L_igG.css +1 -0
  33. package/website/dist/_routes.json +30 -0
  34. package/website/dist/_worker.js/_@astrojs-ssr-adapter.mjs +1033 -0
  35. package/website/dist/_worker.js/_astro-internal_middleware.mjs +40 -0
  36. package/website/dist/_worker.js/chunks/abap_BTmsHiP5.mjs +1 -0
  37. package/website/dist/_worker.js/chunks/actionscript-3_DmBelb1E.mjs +1 -0
  38. package/website/dist/_worker.js/chunks/ada_8-E0ahCN.mjs +1 -0
  39. package/website/dist/_worker.js/chunks/andromeeda_XI-CXx50.mjs +1 -0
  40. package/website/dist/_worker.js/chunks/angular-html_DKGh3gGH.mjs +1 -0
  41. package/website/dist/_worker.js/chunks/angular-ts_-qZGsJoA.mjs +1 -0
  42. package/website/dist/_worker.js/chunks/apache_ijTUt0Ee.mjs +1 -0
  43. package/website/dist/_worker.js/chunks/apex_agu1c6Sh.mjs +1 -0
  44. package/website/dist/_worker.js/chunks/apl_Bj2f7Art.mjs +1 -0
  45. package/website/dist/_worker.js/chunks/applescript_B_vXrOh3.mjs +1 -0
  46. package/website/dist/_worker.js/chunks/ara_DCEQ2rnh.mjs +1 -0
  47. package/website/dist/_worker.js/chunks/asciidoc_CGN_EkYS.mjs +1 -0
  48. package/website/dist/_worker.js/chunks/asm_BBWZgnDp.mjs +1 -0
  49. package/website/dist/_worker.js/chunks/astro/assets-service_j52rQLzU.mjs +721 -0
  50. package/website/dist/_worker.js/chunks/astro/server_Y5_QHO8v.mjs +2401 -0
  51. package/website/dist/_worker.js/chunks/astro-designed-error-pages_BNTLO-TA.mjs +542 -0
  52. package/website/dist/_worker.js/chunks/astro_Dr_hht3h.mjs +1 -0
  53. package/website/dist/_worker.js/chunks/aurora-x_9GHG8nSq.mjs +1 -0
  54. package/website/dist/_worker.js/chunks/awk_DHRvhXot.mjs +1 -0
  55. package/website/dist/_worker.js/chunks/ayu-dark_CcvqmEHE.mjs +1 -0
  56. package/website/dist/_worker.js/chunks/ballerina_C7SdeSZb.mjs +1 -0
  57. package/website/dist/_worker.js/chunks/bat_Dv4A3u45.mjs +1 -0
  58. package/website/dist/_worker.js/chunks/beancount_BfPf9Luv.mjs +1 -0
  59. package/website/dist/_worker.js/chunks/berry_B8rfM3lL.mjs +1 -0
  60. package/website/dist/_worker.js/chunks/bibtex_TcjYgtJM.mjs +1 -0
  61. package/website/dist/_worker.js/chunks/bicep_CrlFWCdN.mjs +1 -0
  62. package/website/dist/_worker.js/chunks/blade_lanKVYID.mjs +1 -0
  63. package/website/dist/_worker.js/chunks/bsl_BhppzXMB.mjs +1 -0
  64. package/website/dist/_worker.js/chunks/c_6FBALJTK.mjs +1 -0
  65. package/website/dist/_worker.js/chunks/cadence_2txU9LVE.mjs +1 -0
  66. package/website/dist/_worker.js/chunks/cairo_BkrFAIlP.mjs +1 -0
  67. package/website/dist/_worker.js/chunks/catppuccin-frappe_CkEqIYhU.mjs +1 -0
  68. package/website/dist/_worker.js/chunks/catppuccin-latte_DG4Gx_-v.mjs +1 -0
  69. package/website/dist/_worker.js/chunks/catppuccin-macchiato_Cwi3vCXf.mjs +1 -0
  70. package/website/dist/_worker.js/chunks/catppuccin-mocha_L9_OPlFX.mjs +1 -0
  71. package/website/dist/_worker.js/chunks/clarity_BEAe4Ulu.mjs +1 -0
  72. package/website/dist/_worker.js/chunks/clojure_VnUX6p2g.mjs +1 -0
  73. package/website/dist/_worker.js/chunks/cmake_0-SGkZEj.mjs +1 -0
  74. package/website/dist/_worker.js/chunks/cobol_92M_KGaE.mjs +1 -0
  75. package/website/dist/_worker.js/chunks/codeowners_CzMwskBv.mjs +1 -0
  76. package/website/dist/_worker.js/chunks/codeql_DWJZNHv1.mjs +1 -0
  77. package/website/dist/_worker.js/chunks/coffee_CQjKU2fh.mjs +1 -0
  78. package/website/dist/_worker.js/chunks/common-lisp_BBLWDpS5.mjs +1 -0
  79. package/website/dist/_worker.js/chunks/coq_hedRFV3D.mjs +1 -0
  80. package/website/dist/_worker.js/chunks/cpp_DlS1i6Zs.mjs +1 -0
  81. package/website/dist/_worker.js/chunks/crystal_D6n65fKV.mjs +1 -0
  82. package/website/dist/_worker.js/chunks/csharp_C6FCVFzc.mjs +1 -0
  83. package/website/dist/_worker.js/chunks/css_C5uJEgmJ.mjs +1 -0
  84. package/website/dist/_worker.js/chunks/csv_CtMYuuJl.mjs +1 -0
  85. package/website/dist/_worker.js/chunks/cue_BsPexqx6.mjs +1 -0
  86. package/website/dist/_worker.js/chunks/cypher_apzf6OBi.mjs +1 -0
  87. package/website/dist/_worker.js/chunks/d_DcvIRcgm.mjs +1 -0
  88. package/website/dist/_worker.js/chunks/dark-plus_C01ONtzj.mjs +1 -0
  89. package/website/dist/_worker.js/chunks/dart_WkzM5WrV.mjs +1 -0
  90. package/website/dist/_worker.js/chunks/dax_DjXAO5V4.mjs +1 -0
  91. package/website/dist/_worker.js/chunks/desktop_C92LCxdc.mjs +1 -0
  92. package/website/dist/_worker.js/chunks/diff_CVwM_9XJ.mjs +1 -0
  93. package/website/dist/_worker.js/chunks/docker_DPzgJf6Z.mjs +1 -0
  94. package/website/dist/_worker.js/chunks/dotenv_D_vgANvA.mjs +1 -0
  95. package/website/dist/_worker.js/chunks/dracula-soft_CLnUBwFm.mjs +1 -0
  96. package/website/dist/_worker.js/chunks/dracula_lBVpb6Lb.mjs +1 -0
  97. package/website/dist/_worker.js/chunks/dream-maker_DTLbzd_J.mjs +1 -0
  98. package/website/dist/_worker.js/chunks/edge_i54JYm3_.mjs +1 -0
  99. package/website/dist/_worker.js/chunks/elixir_BJCIjTu4.mjs +1 -0
  100. package/website/dist/_worker.js/chunks/elm_BbXD39-_.mjs +1 -0
  101. package/website/dist/_worker.js/chunks/emacs-lisp_pxa5cXaN.mjs +1 -0
  102. package/website/dist/_worker.js/chunks/erb_Ccjijeee.mjs +1 -0
  103. package/website/dist/_worker.js/chunks/erlang_B2VM_hi7.mjs +1 -0
  104. package/website/dist/_worker.js/chunks/everforest-dark_BxvIPBim.mjs +1 -0
  105. package/website/dist/_worker.js/chunks/everforest-light_B7VoyaJM.mjs +1 -0
  106. package/website/dist/_worker.js/chunks/fennel_D-uo7X6c.mjs +1 -0
  107. package/website/dist/_worker.js/chunks/fish_BjePoK3m.mjs +1 -0
  108. package/website/dist/_worker.js/chunks/fluent_C8fgkzLX.mjs +1 -0
  109. package/website/dist/_worker.js/chunks/fortran-fixed-form_D1pu5zrc.mjs +1 -0
  110. package/website/dist/_worker.js/chunks/fortran-free-form_CSGOhJD6.mjs +1 -0
  111. package/website/dist/_worker.js/chunks/fsharp_B0xy-A4Y.mjs +1 -0
  112. package/website/dist/_worker.js/chunks/gdresource_CWppjlHq.mjs +1 -0
  113. package/website/dist/_worker.js/chunks/gdscript_eQCHchcS.mjs +1 -0
  114. package/website/dist/_worker.js/chunks/gdshader_C4kxepX7.mjs +1 -0
  115. package/website/dist/_worker.js/chunks/genie_ACtQLcDW.mjs +1 -0
  116. package/website/dist/_worker.js/chunks/gherkin_BFp2uKUd.mjs +1 -0
  117. package/website/dist/_worker.js/chunks/git-commit_CLg9ZwMV.mjs +1 -0
  118. package/website/dist/_worker.js/chunks/git-rebase_DG8A80Nt.mjs +1 -0
  119. package/website/dist/_worker.js/chunks/github-dark-default_BI0EP2Kv.mjs +1 -0
  120. package/website/dist/_worker.js/chunks/github-dark-dimmed_a_NIC0Xb.mjs +1 -0
  121. package/website/dist/_worker.js/chunks/github-dark-high-contrast_jZGqT7hk.mjs +1 -0
  122. package/website/dist/_worker.js/chunks/github-dark_CHCDNd2O.mjs +1 -0
  123. package/website/dist/_worker.js/chunks/github-light-default_DRbOW5RG.mjs +1 -0
  124. package/website/dist/_worker.js/chunks/github-light-high-contrast_tn_kWutM.mjs +1 -0
  125. package/website/dist/_worker.js/chunks/github-light_D9brYzot.mjs +1 -0
  126. package/website/dist/_worker.js/chunks/gleam_Dmhu1oxW.mjs +1 -0
  127. package/website/dist/_worker.js/chunks/glimmer-js_BfZbXy8A.mjs +1 -0
  128. package/website/dist/_worker.js/chunks/glimmer-ts_B9QVICrD.mjs +1 -0
  129. package/website/dist/_worker.js/chunks/glsl_DD2PPwOs.mjs +1 -0
  130. package/website/dist/_worker.js/chunks/gnuplot_D2OYChUX.mjs +1 -0
  131. package/website/dist/_worker.js/chunks/go_DYGFTe3h.mjs +1 -0
  132. package/website/dist/_worker.js/chunks/graphql_B7XsT3nH.mjs +1 -0
  133. package/website/dist/_worker.js/chunks/groovy_BO12Uwkl.mjs +1 -0
  134. package/website/dist/_worker.js/chunks/hack_CB2_ztCP.mjs +1 -0
  135. package/website/dist/_worker.js/chunks/haml_CyfDcDD3.mjs +1 -0
  136. package/website/dist/_worker.js/chunks/handlebars_CfpxpWm2.mjs +1 -0
  137. package/website/dist/_worker.js/chunks/haskell_jUeC5uN5.mjs +1 -0
  138. package/website/dist/_worker.js/chunks/haxe_B6GxP1WB.mjs +1 -0
  139. package/website/dist/_worker.js/chunks/hcl_DwoHV2oh.mjs +1 -0
  140. package/website/dist/_worker.js/chunks/hjson_DV7cJRk4.mjs +1 -0
  141. package/website/dist/_worker.js/chunks/hlsl_BlFCscPI.mjs +1 -0
  142. package/website/dist/_worker.js/chunks/houston_COBFG1Mx.mjs +1 -0
  143. package/website/dist/_worker.js/chunks/html-derivative_C9pJ337h.mjs +1 -0
  144. package/website/dist/_worker.js/chunks/html_D1OkrZS5.mjs +1 -0
  145. package/website/dist/_worker.js/chunks/http_DIGXRqvJ.mjs +1 -0
  146. package/website/dist/_worker.js/chunks/hxml_DEwh9i-c.mjs +1 -0
  147. package/website/dist/_worker.js/chunks/hy_DDoIgW1K.mjs +1 -0
  148. package/website/dist/_worker.js/chunks/imba_B00zbHo4.mjs +1 -0
  149. package/website/dist/_worker.js/chunks/index_C1UTDwYg.mjs +1861 -0
  150. package/website/dist/_worker.js/chunks/ini_D7XQA_p8.mjs +1 -0
  151. package/website/dist/_worker.js/chunks/java_B9wdFd8K.mjs +1 -0
  152. package/website/dist/_worker.js/chunks/javascript_CLsPGOON.mjs +1 -0
  153. package/website/dist/_worker.js/chunks/jinja_jarBCAN1.mjs +1 -0
  154. package/website/dist/_worker.js/chunks/jison_oGg3J708.mjs +1 -0
  155. package/website/dist/_worker.js/chunks/json5_DlZ1Kyaa.mjs +1 -0
  156. package/website/dist/_worker.js/chunks/json_DaYk_FMp.mjs +1 -0
  157. package/website/dist/_worker.js/chunks/jsonc_DlwgfSDs.mjs +1 -0
  158. package/website/dist/_worker.js/chunks/jsonl_BbCCVaZF.mjs +1 -0
  159. package/website/dist/_worker.js/chunks/jsonnet_Dt-G75xe.mjs +1 -0
  160. package/website/dist/_worker.js/chunks/jssm_BtKFTj2A.mjs +1 -0
  161. package/website/dist/_worker.js/chunks/jsx_DDx_xAZ8.mjs +1 -0
  162. package/website/dist/_worker.js/chunks/julia_CK0lv68l.mjs +1 -0
  163. package/website/dist/_worker.js/chunks/kanagawa-dragon_BldAK3Oo.mjs +1 -0
  164. package/website/dist/_worker.js/chunks/kanagawa-lotus_DVM8FX9_.mjs +1 -0
  165. package/website/dist/_worker.js/chunks/kanagawa-wave_Dpih0AKP.mjs +1 -0
  166. package/website/dist/_worker.js/chunks/kotlin_kWneB9V_.mjs +1 -0
  167. package/website/dist/_worker.js/chunks/kusto_BKVATd95.mjs +1 -0
  168. package/website/dist/_worker.js/chunks/laserwave_BqatxsVl.mjs +1 -0
  169. package/website/dist/_worker.js/chunks/latex_LVDcGBbc.mjs +1 -0
  170. package/website/dist/_worker.js/chunks/lean_W7qo-5M2.mjs +1 -0
  171. package/website/dist/_worker.js/chunks/less_DFNwJnBH.mjs +1 -0
  172. package/website/dist/_worker.js/chunks/light-plus_Dp0AoWsO.mjs +1 -0
  173. package/website/dist/_worker.js/chunks/liquid_D24qs0pc.mjs +1 -0
  174. package/website/dist/_worker.js/chunks/log_IPWMXriF.mjs +1 -0
  175. package/website/dist/_worker.js/chunks/logo_C6KaatrQ.mjs +1 -0
  176. package/website/dist/_worker.js/chunks/lua_CwnEf-T7.mjs +1 -0
  177. package/website/dist/_worker.js/chunks/luau_Br3-CXjS.mjs +1 -0
  178. package/website/dist/_worker.js/chunks/make_UBNG-kOo.mjs +1 -0
  179. package/website/dist/_worker.js/chunks/markdown_C7mhJFCm.mjs +1 -0
  180. package/website/dist/_worker.js/chunks/marko_4tchUvI7.mjs +1 -0
  181. package/website/dist/_worker.js/chunks/material-theme-darker_SKtaNEPn.mjs +1 -0
  182. package/website/dist/_worker.js/chunks/material-theme-lighter_zOX_DZCH.mjs +1 -0
  183. package/website/dist/_worker.js/chunks/material-theme-ocean_BN9WbhdC.mjs +1 -0
  184. package/website/dist/_worker.js/chunks/material-theme-palenight_DT_covjH.mjs +1 -0
  185. package/website/dist/_worker.js/chunks/material-theme_6RpeM3kc.mjs +1 -0
  186. package/website/dist/_worker.js/chunks/matlab_DCOXsPKR.mjs +1 -0
  187. package/website/dist/_worker.js/chunks/mdc_B9gb2UFP.mjs +1 -0
  188. package/website/dist/_worker.js/chunks/mdx_DGU7Nu9u.mjs +1 -0
  189. package/website/dist/_worker.js/chunks/mermaid_B69URzsZ.mjs +1 -0
  190. package/website/dist/_worker.js/chunks/min-dark_BgxifOMI.mjs +1 -0
  191. package/website/dist/_worker.js/chunks/min-light_BrPjXxUp.mjs +1 -0
  192. package/website/dist/_worker.js/chunks/mipsasm_9U-4_t7k.mjs +1 -0
  193. package/website/dist/_worker.js/chunks/mojo_B0wt7ug3.mjs +1 -0
  194. package/website/dist/_worker.js/chunks/monokai_B6Pxpoyi.mjs +1 -0
  195. package/website/dist/_worker.js/chunks/move_1eid4CyR.mjs +1 -0
  196. package/website/dist/_worker.js/chunks/narrat_Ds6-p5JZ.mjs +1 -0
  197. package/website/dist/_worker.js/chunks/nextflow_v2N1Qlqa.mjs +1 -0
  198. package/website/dist/_worker.js/chunks/nginx_Bp9Ab2NH.mjs +1 -0
  199. package/website/dist/_worker.js/chunks/night-owl_CdwOw_sc.mjs +1 -0
  200. package/website/dist/_worker.js/chunks/nim_BXGDUe53.mjs +1 -0
  201. package/website/dist/_worker.js/chunks/nix_CUig1nJH.mjs +1 -0
  202. package/website/dist/_worker.js/chunks/noop-middleware_DlWGj5t5.mjs +10 -0
  203. package/website/dist/_worker.js/chunks/nord_SPoG1iae.mjs +1 -0
  204. package/website/dist/_worker.js/chunks/nushell_DJw1Lca8.mjs +1 -0
  205. package/website/dist/_worker.js/chunks/objective-c_Bktzl_CO.mjs +1 -0
  206. package/website/dist/_worker.js/chunks/objective-cpp_CP4DWdDp.mjs +1 -0
  207. package/website/dist/_worker.js/chunks/ocaml_CeEAs7bZ.mjs +1 -0
  208. package/website/dist/_worker.js/chunks/one-dark-pro_-hIwCNMi.mjs +1 -0
  209. package/website/dist/_worker.js/chunks/one-light_DSmYvJ05.mjs +1 -0
  210. package/website/dist/_worker.js/chunks/pascal_C-S_Ms_o.mjs +1 -0
  211. package/website/dist/_worker.js/chunks/perl_CKamvo15.mjs +1 -0
  212. package/website/dist/_worker.js/chunks/php_BlmcX_F3.mjs +1 -0
  213. package/website/dist/_worker.js/chunks/plastic_Ryt8tVoA.mjs +1 -0
  214. package/website/dist/_worker.js/chunks/plsql_Cb3v7cBj.mjs +1 -0
  215. package/website/dist/_worker.js/chunks/po_DZbdNRlo.mjs +1 -0
  216. package/website/dist/_worker.js/chunks/poimandres_bYmE3_5d.mjs +1 -0
  217. package/website/dist/_worker.js/chunks/polar_pJkMGwoW.mjs +1 -0
  218. package/website/dist/_worker.js/chunks/postcss_BAXSOKgk.mjs +1 -0
  219. package/website/dist/_worker.js/chunks/powerquery_oITMGN4x.mjs +1 -0
  220. package/website/dist/_worker.js/chunks/powershell_6306-xIF.mjs +1 -0
  221. package/website/dist/_worker.js/chunks/prisma_DSDxnZGz.mjs +1 -0
  222. package/website/dist/_worker.js/chunks/prolog_CxG7tjZR.mjs +1 -0
  223. package/website/dist/_worker.js/chunks/proto_CS9ByXm1.mjs +1 -0
  224. package/website/dist/_worker.js/chunks/pug_BMtLJo6U.mjs +1 -0
  225. package/website/dist/_worker.js/chunks/puppet_BfeeSzee.mjs +1 -0
  226. package/website/dist/_worker.js/chunks/purescript_BFfueNaH.mjs +1 -0
  227. package/website/dist/_worker.js/chunks/python_Cc4Faapv.mjs +1 -0
  228. package/website/dist/_worker.js/chunks/qml_C1CTJTK8.mjs +1 -0
  229. package/website/dist/_worker.js/chunks/qmldir_nG1KaqKR.mjs +1 -0
  230. package/website/dist/_worker.js/chunks/qss_Cncxk263.mjs +1 -0
  231. package/website/dist/_worker.js/chunks/r_ChR54Ihi.mjs +1 -0
  232. package/website/dist/_worker.js/chunks/racket_BDrhptDs.mjs +1 -0
  233. package/website/dist/_worker.js/chunks/raku_07OUHa0P.mjs +1 -0
  234. package/website/dist/_worker.js/chunks/razor_DIP3INLa.mjs +1 -0
  235. package/website/dist/_worker.js/chunks/red_DOPXfj-6.mjs +1 -0
  236. package/website/dist/_worker.js/chunks/reg_B64SwEDj.mjs +1 -0
  237. package/website/dist/_worker.js/chunks/regexp_ButFGoB5.mjs +1 -0
  238. package/website/dist/_worker.js/chunks/rel_BWJAWqZD.mjs +1 -0
  239. package/website/dist/_worker.js/chunks/riscv_79gXlbsF.mjs +1 -0
  240. package/website/dist/_worker.js/chunks/rose-pine-dawn_DHIjVGd3.mjs +1 -0
  241. package/website/dist/_worker.js/chunks/rose-pine-moon_t86aEbs0.mjs +1 -0
  242. package/website/dist/_worker.js/chunks/rose-pine_BHgrcDCs.mjs +1 -0
  243. package/website/dist/_worker.js/chunks/rst_D3F4Fcpj.mjs +1 -0
  244. package/website/dist/_worker.js/chunks/ruby_Cs7vM9iv.mjs +1 -0
  245. package/website/dist/_worker.js/chunks/rust_DpyRVatH.mjs +1 -0
  246. package/website/dist/_worker.js/chunks/sas_DW45xZXN.mjs +1 -0
  247. package/website/dist/_worker.js/chunks/sass_C6SiMwN_.mjs +1 -0
  248. package/website/dist/_worker.js/chunks/scala_DlZOjNZk.mjs +1 -0
  249. package/website/dist/_worker.js/chunks/scheme_D2ezSJXu.mjs +1 -0
  250. package/website/dist/_worker.js/chunks/scss_DG5Spjqu.mjs +1 -0
  251. package/website/dist/_worker.js/chunks/sdbl_ZCYaj4VN.mjs +1 -0
  252. package/website/dist/_worker.js/chunks/shaderlab_CAcRkg1_.mjs +1 -0
  253. package/website/dist/_worker.js/chunks/shellscript_BWwhkDVh.mjs +1 -0
  254. package/website/dist/_worker.js/chunks/shellsession_BfEA3juK.mjs +1 -0
  255. package/website/dist/_worker.js/chunks/slack-dark_CL3lSpCc.mjs +1 -0
  256. package/website/dist/_worker.js/chunks/slack-ochin_DdZKOQVh.mjs +1 -0
  257. package/website/dist/_worker.js/chunks/smalltalk_DgilzSui.mjs +1 -0
  258. package/website/dist/_worker.js/chunks/snazzy-light_eJU08Pz_.mjs +1 -0
  259. package/website/dist/_worker.js/chunks/solarized-dark_Dg_YQywx.mjs +1 -0
  260. package/website/dist/_worker.js/chunks/solarized-light_BnIsrA6p.mjs +1 -0
  261. package/website/dist/_worker.js/chunks/solidity_DkseH8pQ.mjs +1 -0
  262. package/website/dist/_worker.js/chunks/soy_DU7bOYoG.mjs +1 -0
  263. package/website/dist/_worker.js/chunks/sparql_BuI1DBDH.mjs +1 -0
  264. package/website/dist/_worker.js/chunks/splunk_B8Ha9Pkg.mjs +1 -0
  265. package/website/dist/_worker.js/chunks/sql_BniHwea5.mjs +1 -0
  266. package/website/dist/_worker.js/chunks/ssh-config_CkE1GuVe.mjs +1 -0
  267. package/website/dist/_worker.js/chunks/stata_Dtqpbd_l.mjs +1 -0
  268. package/website/dist/_worker.js/chunks/stylus_CXTtglzO.mjs +1 -0
  269. package/website/dist/_worker.js/chunks/svelte_BjWYcUCN.mjs +1 -0
  270. package/website/dist/_worker.js/chunks/swift_BzHql_rM.mjs +1 -0
  271. package/website/dist/_worker.js/chunks/synthwave-84_DLRNhxNA.mjs +1 -0
  272. package/website/dist/_worker.js/chunks/system-verilog_ChyInPph.mjs +1 -0
  273. package/website/dist/_worker.js/chunks/systemd_Bi9Qa2qD.mjs +1 -0
  274. package/website/dist/_worker.js/chunks/talonscript_B3sH_Y-V.mjs +1 -0
  275. package/website/dist/_worker.js/chunks/tasl_BJ5yipRs.mjs +1 -0
  276. package/website/dist/_worker.js/chunks/tcl_CoJQjNoP.mjs +1 -0
  277. package/website/dist/_worker.js/chunks/templ_CrU7Ffil.mjs +1 -0
  278. package/website/dist/_worker.js/chunks/terraform_DT9JSFpC.mjs +1 -0
  279. package/website/dist/_worker.js/chunks/tex_5PKu2yA0.mjs +1 -0
  280. package/website/dist/_worker.js/chunks/tokyo-night_Buo8OK7-.mjs +1 -0
  281. package/website/dist/_worker.js/chunks/toml_CPuXX3oc.mjs +1 -0
  282. package/website/dist/_worker.js/chunks/ts-tags_D0M_1VSH.mjs +1 -0
  283. package/website/dist/_worker.js/chunks/tsv_CuivVNot.mjs +1 -0
  284. package/website/dist/_worker.js/chunks/tsx_MkuGr8MY.mjs +1 -0
  285. package/website/dist/_worker.js/chunks/turtle_BqgEPK7f.mjs +1 -0
  286. package/website/dist/_worker.js/chunks/twig_r1G9rpYJ.mjs +1 -0
  287. package/website/dist/_worker.js/chunks/typescript_Au5buqzM.mjs +1 -0
  288. package/website/dist/_worker.js/chunks/typespec_47rhBK_z.mjs +1 -0
  289. package/website/dist/_worker.js/chunks/typst_BAtuQLh-.mjs +1 -0
  290. package/website/dist/_worker.js/chunks/v_BIvWImHg.mjs +1 -0
  291. package/website/dist/_worker.js/chunks/vala_DYEacj30.mjs +1 -0
  292. package/website/dist/_worker.js/chunks/vb_CikQuqGJ.mjs +1 -0
  293. package/website/dist/_worker.js/chunks/verilog_BQRENwI-.mjs +1 -0
  294. package/website/dist/_worker.js/chunks/vesper_DA0kvTmj.mjs +1 -0
  295. package/website/dist/_worker.js/chunks/vhdl_DHscJIyg.mjs +1 -0
  296. package/website/dist/_worker.js/chunks/viml_F2pvMwvG.mjs +1 -0
  297. package/website/dist/_worker.js/chunks/vitesse-black_D9tjNzd0.mjs +1 -0
  298. package/website/dist/_worker.js/chunks/vitesse-dark_Bnm5d0hd.mjs +1 -0
  299. package/website/dist/_worker.js/chunks/vitesse-light_CHwbyjNR.mjs +1 -0
  300. package/website/dist/_worker.js/chunks/vue-html_DyYtbbMK.mjs +1 -0
  301. package/website/dist/_worker.js/chunks/vue_DofN6juy.mjs +1 -0
  302. package/website/dist/_worker.js/chunks/vyper_CiR0m-OV.mjs +1 -0
  303. package/website/dist/_worker.js/chunks/wasm_CwIGgRGf.mjs +1 -0
  304. package/website/dist/_worker.js/chunks/wasm_jKWhg0J0.mjs +1 -0
  305. package/website/dist/_worker.js/chunks/wenyan_DKvVZKXW.mjs +1 -0
  306. package/website/dist/_worker.js/chunks/wgsl_BOWZY7yw.mjs +1 -0
  307. package/website/dist/_worker.js/chunks/wikitext_CXDhhHPy.mjs +1 -0
  308. package/website/dist/_worker.js/chunks/wolfram_ChkmGnW0.mjs +1 -0
  309. package/website/dist/_worker.js/chunks/xml_DXH3hHIu.mjs +1 -0
  310. package/website/dist/_worker.js/chunks/xsl_DuP2mFjg.mjs +1 -0
  311. package/website/dist/_worker.js/chunks/yaml_IGiEkTge.mjs +1 -0
  312. package/website/dist/_worker.js/chunks/zenscript_59iXGyNw.mjs +1 -0
  313. package/website/dist/_worker.js/chunks/zig_DKzb0zdT.mjs +1 -0
  314. package/website/dist/_worker.js/index.js +53 -0
  315. package/website/dist/_worker.js/manifest_BAAoOzaU.mjs +98 -0
  316. package/website/dist/_worker.js/pages/_image.astro.mjs +24 -0
  317. package/website/dist/_worker.js/pages/agents.astro.mjs +1 -0
  318. package/website/dist/_worker.js/pages/animation.astro.mjs +1 -0
  319. package/website/dist/_worker.js/pages/api/raw-markdown/_---path_.astro.mjs +44 -0
  320. package/website/dist/_worker.js/pages/config.astro.mjs +1 -0
  321. package/website/dist/_worker.js/pages/fonts.astro.mjs +1 -0
  322. package/website/dist/_worker.js/pages/getting-started.astro.mjs +1 -0
  323. package/website/dist/_worker.js/pages/helpers.astro.mjs +1 -0
  324. package/website/dist/_worker.js/pages/images.astro.mjs +1 -0
  325. package/website/dist/_worker.js/pages/index.astro.mjs +1 -0
  326. package/website/dist/_worker.js/pages/llm.txt.astro.mjs +1 -0
  327. package/website/dist/_worker.js/pages/preview.astro.mjs +1 -0
  328. package/website/dist/_worker.js/pages/sdk.astro.mjs +1 -0
  329. package/website/dist/_worker.js/pages/sitemap.xml.astro.mjs +1 -0
  330. package/website/dist/_worker.js/pages/styling.astro.mjs +1 -0
  331. package/website/dist/_worker.js/pages/templates.astro.mjs +1 -0
  332. package/website/dist/_worker.js/pages/video.astro.mjs +1 -0
  333. package/website/dist/_worker.js/renderers.mjs +57 -0
  334. package/website/dist/agents/index.html +3 -2
  335. package/website/dist/animation/index.html +402 -128
  336. package/website/dist/config/index.html +184 -0
  337. package/website/dist/fonts/index.html +56 -52
  338. package/website/dist/getting-started/index.html +107 -0
  339. package/website/dist/helpers/index.html +8 -8
  340. package/website/dist/images/index.html +50 -23
  341. package/website/dist/index.html +114 -148
  342. package/website/dist/llm.txt +751 -1055
  343. package/website/dist/preview/index.html +111 -0
  344. package/website/dist/robots.txt +35 -0
  345. package/website/dist/sdk/index.html +390 -52
  346. package/website/dist/sitemap.xml +76 -0
  347. package/website/dist/styling/index.html +10 -7
  348. package/website/dist/templates/index.html +11 -59
  349. package/website/dist/video/index.html +106 -537
  350. package/website/package.json +1 -0
  351. package/website/public/.assetsignore +3 -0
  352. package/website/templates/og-image.tsx +61 -0
  353. package/website/wrangler.toml +12 -0
  354. package/website/dist/_astro/agents.I1-fN38o.css +0 -1
@@ -1,4 +1,6 @@
1
1
  import type { TemplateProps, TemplateMeta } from '../types/template.js';
2
+ import type { DesignConfig } from '../types/config.js';
3
+ export type StyleConfig = DesignConfig;
2
4
  export interface TemplateDefinition<TProps = any> {
3
5
  name: string;
4
6
  type?: 'image' | 'video';
@@ -10,6 +12,7 @@ export interface TemplateDefinition<TProps = any> {
10
12
  fps: number;
11
13
  duration: number;
12
14
  };
15
+ config?: StyleConfig;
13
16
  render: (props: TProps & TemplateProps) => JSX.Element;
14
17
  }
15
18
  /**
@@ -36,4 +39,137 @@ export declare function defineTemplate<TProps = any>(definition: TemplateDefinit
36
39
  * @internal
37
40
  */
38
41
  export declare function templateToMeta(template: TemplateDefinition): TemplateMeta;
42
+ /**
43
+ * Define a template from an imported template file
44
+ *
45
+ * Allows reusing file-based templates from _loopwind/templates/ in the SDK
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * import * as videoIntro from './_loopwind/templates/video-intro/template';
50
+ *
51
+ * const template = defineTemplateFromFile(videoIntro, {
52
+ * config: {
53
+ * colors: { primary: '#ff0000' }
54
+ * }
55
+ * });
56
+ *
57
+ * const mp4 = await renderVideo(template, { version: '2.0.0' });
58
+ * ```
59
+ */
60
+ export declare function defineTemplateFromFile<TProps = any>(templateModule: {
61
+ meta: TemplateMeta;
62
+ default: (props: TProps & TemplateProps) => JSX.Element;
63
+ }, options?: {
64
+ config?: StyleConfig;
65
+ }): TemplateDefinition<TProps>;
66
+ /**
67
+ * Define a template from a source code string
68
+ *
69
+ * **WARNING:** This function evaluates code strings using `new Function()`.
70
+ * Only use with **trusted** template sources. Never use with user input from
71
+ * untrusted sources as it can execute arbitrary code.
72
+ *
73
+ * Perfect for:
74
+ * - Templates stored in a database (admin-created only)
75
+ * - Templates from a trusted CMS
76
+ * - Code editor features where templates are validated
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * const templateSource = `
81
+ * export const meta = {
82
+ * name: 'user-template',
83
+ * type: 'image',
84
+ * size: { width: 1200, height: 630 }
85
+ * };
86
+ *
87
+ * export default ({ tw, title }) => {
88
+ * const h = React.createElement;
89
+ * return h('div', { style: tw('flex w-full h-full bg-blue-500 p-12') },
90
+ * h('h1', { style: tw('text-6xl font-bold text-white') }, title)
91
+ * );
92
+ * };
93
+ * `;
94
+ *
95
+ * const template = defineTemplateFromSource(templateSource, {
96
+ * config: { colors: { primary: '#3b82f6' } }
97
+ * });
98
+ *
99
+ * const png = await renderImage(template, { title: 'Hello' });
100
+ * ```
101
+ */
102
+ export declare function defineTemplateFromSource<TProps = any>(sourceCode: string, options?: {
103
+ config?: StyleConfig;
104
+ }): TemplateDefinition<TProps>;
105
+ /**
106
+ * Schema element definition for visual template builders
107
+ */
108
+ export interface SchemaElement {
109
+ type: 'div' | 'span' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'img';
110
+ className?: string;
111
+ content?: string;
112
+ src?: string;
113
+ style?: Record<string, any>;
114
+ children?: SchemaElement[];
115
+ }
116
+ /**
117
+ * Template schema for visual builders
118
+ */
119
+ export interface TemplateSchema {
120
+ name: string;
121
+ type?: 'image' | 'video';
122
+ size: {
123
+ width: number;
124
+ height: number;
125
+ };
126
+ video?: {
127
+ fps: number;
128
+ duration: number;
129
+ };
130
+ config?: StyleConfig;
131
+ elements: SchemaElement[];
132
+ }
133
+ /**
134
+ * Define a template from a JSON schema
135
+ *
136
+ * Perfect for visual template builders where users drag and drop elements.
137
+ * Converts a declarative JSON schema into a working template.
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * const schema: TemplateSchema = {
142
+ * name: 'card',
143
+ * size: { width: 1200, height: 630 },
144
+ * config: {
145
+ * colors: { primary: '#3b82f6', background: '#ffffff' }
146
+ * },
147
+ * elements: [
148
+ * {
149
+ * type: 'div',
150
+ * className: 'flex flex-col w-full h-full bg-background p-12',
151
+ * children: [
152
+ * {
153
+ * type: 'h1',
154
+ * className: 'text-6xl font-bold text-primary',
155
+ * content: '{{title}}'
156
+ * },
157
+ * {
158
+ * type: 'p',
159
+ * className: 'text-2xl text-gray-600',
160
+ * content: '{{description}}'
161
+ * }
162
+ * ]
163
+ * }
164
+ * ]
165
+ * };
166
+ *
167
+ * const template = defineTemplateFromSchema(schema);
168
+ * const png = await renderImage(template, {
169
+ * title: 'Hello World',
170
+ * description: 'Created with visual builder'
171
+ * });
172
+ * ```
173
+ */
174
+ export declare function defineTemplateFromSchema<TProps = any>(schema: TemplateSchema): TemplateDefinition<TProps>;
39
175
  //# sourceMappingURL=template.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,WAAW,kBAAkB,CAAC,MAAM,GAAG,GAAG;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,GAAG,CAAC,OAAO,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAG,GAAG,EACzC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,GACrC,kBAAkB,CAAC,MAAM,CAAC,CAyB5B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,YAAY,CASzE"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC;AAEvC,MAAM,WAAW,kBAAkB,CAAC,MAAM,GAAG,GAAG;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,GAAG,CAAC,OAAO,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAG,GAAG,EACzC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,GACrC,kBAAkB,CAAC,MAAM,CAAC,CAyB5B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,YAAY,CASzE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAG,GAAG,EACjD,cAAc,EAAE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,GAAG,CAAC,OAAO,CAAA;CAAE,EAC/F,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,kBAAkB,CAAC,MAAM,CAAC,CAW5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,GAAG,GAAG,EACnD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,kBAAkB,CAAC,MAAM,CAAC,CAiC5B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,GAAG,GAAG,EACnD,MAAM,EAAE,cAAc,GACrB,kBAAkB,CAAC,MAAM,CAAC,CA+D5B"}
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  /**
2
3
  * Define a template programmatically for use in serverless environments
3
4
  *
@@ -51,4 +52,201 @@ export function templateToMeta(template) {
51
52
  props: {}, // SDK templates don't need props metadata
52
53
  };
53
54
  }
55
+ /**
56
+ * Define a template from an imported template file
57
+ *
58
+ * Allows reusing file-based templates from _loopwind/templates/ in the SDK
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * import * as videoIntro from './_loopwind/templates/video-intro/template';
63
+ *
64
+ * const template = defineTemplateFromFile(videoIntro, {
65
+ * config: {
66
+ * colors: { primary: '#ff0000' }
67
+ * }
68
+ * });
69
+ *
70
+ * const mp4 = await renderVideo(template, { version: '2.0.0' });
71
+ * ```
72
+ */
73
+ export function defineTemplateFromFile(templateModule, options = {}) {
74
+ const { meta, default: render } = templateModule;
75
+ return defineTemplate({
76
+ name: meta.name,
77
+ type: meta.type,
78
+ size: meta.size,
79
+ video: meta.video,
80
+ config: options.config,
81
+ render,
82
+ });
83
+ }
84
+ /**
85
+ * Define a template from a source code string
86
+ *
87
+ * **WARNING:** This function evaluates code strings using `new Function()`.
88
+ * Only use with **trusted** template sources. Never use with user input from
89
+ * untrusted sources as it can execute arbitrary code.
90
+ *
91
+ * Perfect for:
92
+ * - Templates stored in a database (admin-created only)
93
+ * - Templates from a trusted CMS
94
+ * - Code editor features where templates are validated
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const templateSource = `
99
+ * export const meta = {
100
+ * name: 'user-template',
101
+ * type: 'image',
102
+ * size: { width: 1200, height: 630 }
103
+ * };
104
+ *
105
+ * export default ({ tw, title }) => {
106
+ * const h = React.createElement;
107
+ * return h('div', { style: tw('flex w-full h-full bg-blue-500 p-12') },
108
+ * h('h1', { style: tw('text-6xl font-bold text-white') }, title)
109
+ * );
110
+ * };
111
+ * `;
112
+ *
113
+ * const template = defineTemplateFromSource(templateSource, {
114
+ * config: { colors: { primary: '#3b82f6' } }
115
+ * });
116
+ *
117
+ * const png = await renderImage(template, { title: 'Hello' });
118
+ * ```
119
+ */
120
+ export function defineTemplateFromSource(sourceCode, options = {}) {
121
+ try {
122
+ // Strip export keywords to make it work in function context
123
+ // Convert "export const meta = ..." to "const meta = ..."
124
+ // Convert "export default ..." to "const defaultExport = ..."
125
+ let processedSource = sourceCode
126
+ .replace(/export\s+const\s+meta\s*=/g, 'const meta =')
127
+ .replace(/export\s+default\s+/g, 'const defaultExport = ');
128
+ // Create a module evaluation function
129
+ // This executes the source code and returns the exports
130
+ const moduleFactory = new Function('React', `
131
+ 'use strict';
132
+ const h = React.createElement;
133
+ ${processedSource}
134
+ return { meta, default: defaultExport };
135
+ `);
136
+ // Execute to get meta and render function
137
+ const templateModule = moduleFactory(React);
138
+ if (!templateModule.meta) {
139
+ throw new Error('Template source must export a "meta" object');
140
+ }
141
+ if (!templateModule.default || typeof templateModule.default !== 'function') {
142
+ throw new Error('Template source must have a default export function');
143
+ }
144
+ return defineTemplateFromFile(templateModule, options);
145
+ }
146
+ catch (error) {
147
+ throw new Error(`Failed to parse template source: ${error instanceof Error ? error.message : String(error)}`);
148
+ }
149
+ }
150
+ /**
151
+ * Define a template from a JSON schema
152
+ *
153
+ * Perfect for visual template builders where users drag and drop elements.
154
+ * Converts a declarative JSON schema into a working template.
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * const schema: TemplateSchema = {
159
+ * name: 'card',
160
+ * size: { width: 1200, height: 630 },
161
+ * config: {
162
+ * colors: { primary: '#3b82f6', background: '#ffffff' }
163
+ * },
164
+ * elements: [
165
+ * {
166
+ * type: 'div',
167
+ * className: 'flex flex-col w-full h-full bg-background p-12',
168
+ * children: [
169
+ * {
170
+ * type: 'h1',
171
+ * className: 'text-6xl font-bold text-primary',
172
+ * content: '{{title}}'
173
+ * },
174
+ * {
175
+ * type: 'p',
176
+ * className: 'text-2xl text-gray-600',
177
+ * content: '{{description}}'
178
+ * }
179
+ * ]
180
+ * }
181
+ * ]
182
+ * };
183
+ *
184
+ * const template = defineTemplateFromSchema(schema);
185
+ * const png = await renderImage(template, {
186
+ * title: 'Hello World',
187
+ * description: 'Created with visual builder'
188
+ * });
189
+ * ```
190
+ */
191
+ export function defineTemplateFromSchema(schema) {
192
+ if (schema.elements.length === 0) {
193
+ throw new Error('Schema must have at least one element');
194
+ }
195
+ // Embed schema directly in the function body as a JSON literal
196
+ // This way the function is completely self-contained and survives serialization
197
+ const elementsJSON = JSON.stringify(schema.elements);
198
+ // Create a completely self-contained render function
199
+ // The function body contains the entire schema and all helper functions
200
+ // React must be available globally or passed in
201
+ const render = new Function('React', `
202
+ return function(props) {
203
+ const h = React.createElement;
204
+ const elements = ${elementsJSON};
205
+
206
+ const interpolate = (str) => {
207
+ return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {
208
+ return props[key] !== undefined ? String(props[key]) : '';
209
+ });
210
+ };
211
+
212
+ const buildElement = (element, key) => {
213
+ const { type, className, content, src, style, children } = element;
214
+ const elementProps = { key };
215
+
216
+ if (className && props.tw) {
217
+ elementProps.style = props.tw(className);
218
+ } else if (style) {
219
+ elementProps.style = style;
220
+ }
221
+
222
+ if (type === 'img' && src) {
223
+ elementProps.src = interpolate(src);
224
+ }
225
+
226
+ let elementChildren = null;
227
+ if (content) {
228
+ elementChildren = interpolate(content);
229
+ } else if (children && children.length > 0) {
230
+ elementChildren = children.map((child, i) => buildElement(child, i));
231
+ }
232
+
233
+ return h(type, elementProps, elementChildren);
234
+ };
235
+
236
+ if (elements.length === 1) {
237
+ return buildElement(elements[0]);
238
+ }
239
+
240
+ return h(React.Fragment, null, elements.map((el, i) => buildElement(el, i)));
241
+ }
242
+ `)(React);
243
+ return defineTemplate({
244
+ name: schema.name,
245
+ type: schema.type,
246
+ size: schema.size,
247
+ video: schema.video,
248
+ config: schema.config,
249
+ render,
250
+ });
251
+ }
54
252
  //# sourceMappingURL=template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAsC;IAEtC,sBAAsB;IACtB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,eAAe;IACf,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,OAAO,CAAC;IAExC,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO;QACL,GAAG,UAAU;QACb,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAA4B;IACzD,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,4CAA4C;QACxE,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,OAAO;QAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,EAAE,EAAE,0CAA0C;KACtD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Example: Code Editor - User-created templates from source strings
3
+ *
4
+ * Use case: Building a code editor where users write template code
5
+ * directly as strings (e.g., Monaco Editor, CodeMirror).
6
+ *
7
+ * ⚠️ SECURITY WARNING:
8
+ * Only use defineTemplateFromSource() with TRUSTED sources!
9
+ * It evaluates code using new Function() which can execute arbitrary code.
10
+ * Never pass untrusted user input directly.
11
+ */
12
+
13
+ import { defineTemplateFromSource, renderImage, renderVideo } from 'loopwind/sdk';
14
+ import fs from 'fs/promises';
15
+
16
+ // Example 1: Simple image template from string
17
+ const imageTemplateSource = `
18
+ export const meta = {
19
+ name: 'user-card',
20
+ type: 'image',
21
+ size: { width: 1200, height: 630 }
22
+ };
23
+
24
+ export default ({ tw, title, description }) => {
25
+ const h = React.createElement;
26
+ return h('div', {
27
+ style: tw('flex flex-col w-full h-full bg-gradient-to-br from-blue-600 to-purple-700 p-12 justify-between')
28
+ },
29
+ h('div', { style: tw('flex items-center gap-4') },
30
+ h('div', { style: tw('w-16 h-16 rounded-full bg-white/20') })
31
+ ),
32
+ h('div', null,
33
+ h('h1', { style: tw('text-6xl font-bold text-white mb-4') }, title),
34
+ h('p', { style: tw('text-2xl text-white/80') }, description)
35
+ )
36
+ );
37
+ };
38
+ `;
39
+
40
+ async function renderUserTemplate() {
41
+ // Create template from source string
42
+ const template = defineTemplateFromSource(imageTemplateSource, {
43
+ config: {
44
+ colors: {
45
+ primary: '#3b82f6',
46
+ background: '#ffffff',
47
+ },
48
+ },
49
+ });
50
+
51
+ // Render with user props
52
+ const png = await renderImage(template, {
53
+ title: 'User Created Template',
54
+ description: 'Built with code editor',
55
+ });
56
+
57
+ await fs.writeFile('user-card.png', png);
58
+ console.log('✓ Rendered user-card.png');
59
+ }
60
+
61
+ // Example 2: Video template from string
62
+ const videoTemplateSource = `
63
+ export const meta = {
64
+ name: 'intro-animation',
65
+ type: 'video',
66
+ size: { width: 1920, height: 1080 },
67
+ video: { fps: 30, duration: 3 }
68
+ };
69
+
70
+ export default ({ tw, progress, title }) => {
71
+ const h = React.createElement;
72
+
73
+ // Fade in animation
74
+ const opacity = progress < 0.5 ? progress / 0.5 : 1;
75
+ const scale = 0.8 + (opacity * 0.2);
76
+
77
+ return h('div', {
78
+ style: tw('flex items-center justify-center w-full h-full bg-black')
79
+ },
80
+ h('h1', {
81
+ style: {
82
+ ...tw('text-8xl font-bold text-white'),
83
+ opacity,
84
+ transform: \`scale(\${scale})\`
85
+ }
86
+ }, title)
87
+ );
88
+ };
89
+ `;
90
+
91
+ async function renderVideoTemplate() {
92
+ const template = defineTemplateFromSource(videoTemplateSource);
93
+
94
+ const mp4 = await renderVideo(template, {
95
+ title: 'Hello World',
96
+ });
97
+
98
+ await fs.writeFile('intro-animation.mp4', mp4);
99
+ console.log('✓ Rendered intro-animation.mp4');
100
+ }
101
+
102
+ // Example 3: Database-stored template
103
+ // This simulates loading templates from a database
104
+ interface StoredTemplate {
105
+ id: string;
106
+ name: string;
107
+ source: string;
108
+ config?: any;
109
+ }
110
+
111
+ const templatesDB: StoredTemplate[] = [
112
+ {
113
+ id: 'og-1',
114
+ name: 'Blog OG Image',
115
+ source: `
116
+ export const meta = {
117
+ name: 'blog-og',
118
+ type: 'image',
119
+ size: { width: 1200, height: 630 }
120
+ };
121
+
122
+ export default ({ tw, title, author }) => {
123
+ const h = React.createElement;
124
+ return h('div', {
125
+ style: tw('flex flex-col w-full h-full bg-white p-12 justify-center')
126
+ },
127
+ h('h1', { style: tw('text-6xl font-bold text-gray-900 mb-4') }, title),
128
+ h('p', { style: tw('text-2xl text-gray-600') }, 'By ' + author)
129
+ );
130
+ };
131
+ `,
132
+ config: {
133
+ colors: {
134
+ primary: '#1f2937',
135
+ background: '#ffffff',
136
+ },
137
+ },
138
+ },
139
+ ];
140
+
141
+ async function renderFromDatabase(templateId: string, props: any) {
142
+ // Fetch template from "database"
143
+ const stored = templatesDB.find((t) => t.id === templateId);
144
+ if (!stored) {
145
+ throw new Error('Template not found');
146
+ }
147
+
148
+ // Create template from stored source
149
+ const template = defineTemplateFromSource(stored.source, {
150
+ config: stored.config,
151
+ });
152
+
153
+ // Render
154
+ const png = await renderImage(template, props);
155
+ await fs.writeFile(`${stored.id}.png`, png);
156
+ console.log(`✓ Rendered ${stored.id}.png`);
157
+ }
158
+
159
+ // Run examples
160
+ async function main() {
161
+ console.log('Code Editor Examples\n');
162
+
163
+ await renderUserTemplate();
164
+ await renderVideoTemplate();
165
+ await renderFromDatabase('og-1', {
166
+ title: 'Building a Template Editor',
167
+ author: 'John Doe',
168
+ });
169
+
170
+ console.log('\n✅ All code editor examples completed!');
171
+ }
172
+
173
+ main().catch(console.error);
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Example: Importing template files in Next.js API routes
3
+ *
4
+ * This demonstrates how to reuse _loopwind/templates/ files
5
+ * in your SDK code with Next.js (or any other bundler)
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { defineTemplateFromFile, renderVideo } from 'loopwind/sdk';
10
+
11
+ // Import your template file (Next.js/bundler handles TSX automatically)
12
+ import * as videoIntroTemplate from '../../_loopwind/templates/video-intro/template';
13
+
14
+ // Create SDK template from file with custom config
15
+ const template = defineTemplateFromFile(videoIntroTemplate, {
16
+ config: {
17
+ colors: {
18
+ primary: '#ff0000', // Override gradient colors
19
+ 'indigo-900': '#1a0033',
20
+ },
21
+ },
22
+ });
23
+
24
+ export default async function handler(
25
+ req: NextApiRequest,
26
+ res: NextApiResponse
27
+ ) {
28
+ const { version = '1.0.0', changes } = req.query;
29
+
30
+ // Parse changes from query param (comma-separated)
31
+ const changeList = typeof changes === 'string'
32
+ ? changes.split(',').map(c => c.trim())
33
+ : undefined;
34
+
35
+ // Render video using imported template
36
+ const mp4 = await renderVideo(template, {
37
+ version: String(version),
38
+ changes: changeList,
39
+ });
40
+
41
+ res.setHeader('Content-Type', 'video/mp4');
42
+ res.setHeader('Cache-Control', 's-maxage=3600, stale-while-revalidate');
43
+ res.send(mp4);
44
+ }
45
+
46
+ /**
47
+ * Usage:
48
+ *
49
+ * GET /api/release-video?version=2.0.0&changes=New%20feature,Bug%20fix,Performance
50
+ *
51
+ * Returns: MP4 video with version 2.0.0 and custom changes list
52
+ *
53
+ * Benefits:
54
+ * - Reuse CLI templates in API
55
+ * - Override config for custom branding
56
+ * - Type-safe with TypeScript
57
+ * - No duplicate template code
58
+ */