loopwind 0.17.0 → 0.18.1
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.
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/template.d.ts +97 -0
- package/dist/sdk/template.d.ts.map +1 -1
- package/dist/sdk/template.js +217 -0
- package/dist/sdk/template.js.map +1 -1
- package/examples/code-editor-templates.ts +173 -0
- package/examples/nextjs-template-import.ts +58 -0
- package/examples/visual-builder-templates.ts +336 -0
- package/package.json +3 -1
- package/test-jsx-support.mjs +120 -0
- package/test-sdk-user-templates.mjs +469 -0
- package/website/.astro/integrations/_inox-tools_astro-when/types.d.ts +1 -0
- package/website/.astro/types.d.ts +1 -0
- package/website/DEPLOYMENT.md +142 -0
- package/website/OG_IMAGES.md +141 -0
- package/website/astro.config.mjs +9 -1
- package/website/dist/.gitkeep +1 -0
- package/website/dist/_astro/agents.Yx-L_igG.css +1 -0
- package/website/dist/_routes.json +30 -0
- package/website/dist/_worker.js/_@astrojs-ssr-adapter.mjs +1033 -0
- package/website/dist/_worker.js/_astro-internal_middleware.mjs +40 -0
- package/website/dist/_worker.js/chunks/abap_BTmsHiP5.mjs +1 -0
- package/website/dist/_worker.js/chunks/actionscript-3_DmBelb1E.mjs +1 -0
- package/website/dist/_worker.js/chunks/ada_8-E0ahCN.mjs +1 -0
- package/website/dist/_worker.js/chunks/andromeeda_XI-CXx50.mjs +1 -0
- package/website/dist/_worker.js/chunks/angular-html_DKGh3gGH.mjs +1 -0
- package/website/dist/_worker.js/chunks/angular-ts_-qZGsJoA.mjs +1 -0
- package/website/dist/_worker.js/chunks/apache_ijTUt0Ee.mjs +1 -0
- package/website/dist/_worker.js/chunks/apex_agu1c6Sh.mjs +1 -0
- package/website/dist/_worker.js/chunks/apl_Bj2f7Art.mjs +1 -0
- package/website/dist/_worker.js/chunks/applescript_B_vXrOh3.mjs +1 -0
- package/website/dist/_worker.js/chunks/ara_DCEQ2rnh.mjs +1 -0
- package/website/dist/_worker.js/chunks/asciidoc_CGN_EkYS.mjs +1 -0
- package/website/dist/_worker.js/chunks/asm_BBWZgnDp.mjs +1 -0
- package/website/dist/_worker.js/chunks/astro/assets-service_j52rQLzU.mjs +721 -0
- package/website/dist/_worker.js/chunks/astro/server_Y5_QHO8v.mjs +2401 -0
- package/website/dist/_worker.js/chunks/astro-designed-error-pages_BNTLO-TA.mjs +542 -0
- package/website/dist/_worker.js/chunks/astro_Dr_hht3h.mjs +1 -0
- package/website/dist/_worker.js/chunks/aurora-x_9GHG8nSq.mjs +1 -0
- package/website/dist/_worker.js/chunks/awk_DHRvhXot.mjs +1 -0
- package/website/dist/_worker.js/chunks/ayu-dark_CcvqmEHE.mjs +1 -0
- package/website/dist/_worker.js/chunks/ballerina_C7SdeSZb.mjs +1 -0
- package/website/dist/_worker.js/chunks/bat_Dv4A3u45.mjs +1 -0
- package/website/dist/_worker.js/chunks/beancount_BfPf9Luv.mjs +1 -0
- package/website/dist/_worker.js/chunks/berry_B8rfM3lL.mjs +1 -0
- package/website/dist/_worker.js/chunks/bibtex_TcjYgtJM.mjs +1 -0
- package/website/dist/_worker.js/chunks/bicep_CrlFWCdN.mjs +1 -0
- package/website/dist/_worker.js/chunks/blade_lanKVYID.mjs +1 -0
- package/website/dist/_worker.js/chunks/bsl_BhppzXMB.mjs +1 -0
- package/website/dist/_worker.js/chunks/c_6FBALJTK.mjs +1 -0
- package/website/dist/_worker.js/chunks/cadence_2txU9LVE.mjs +1 -0
- package/website/dist/_worker.js/chunks/cairo_BkrFAIlP.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-frappe_CkEqIYhU.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-latte_DG4Gx_-v.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-macchiato_Cwi3vCXf.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-mocha_L9_OPlFX.mjs +1 -0
- package/website/dist/_worker.js/chunks/clarity_BEAe4Ulu.mjs +1 -0
- package/website/dist/_worker.js/chunks/clojure_VnUX6p2g.mjs +1 -0
- package/website/dist/_worker.js/chunks/cmake_0-SGkZEj.mjs +1 -0
- package/website/dist/_worker.js/chunks/cobol_92M_KGaE.mjs +1 -0
- package/website/dist/_worker.js/chunks/codeowners_CzMwskBv.mjs +1 -0
- package/website/dist/_worker.js/chunks/codeql_DWJZNHv1.mjs +1 -0
- package/website/dist/_worker.js/chunks/coffee_CQjKU2fh.mjs +1 -0
- package/website/dist/_worker.js/chunks/common-lisp_BBLWDpS5.mjs +1 -0
- package/website/dist/_worker.js/chunks/coq_hedRFV3D.mjs +1 -0
- package/website/dist/_worker.js/chunks/cpp_DlS1i6Zs.mjs +1 -0
- package/website/dist/_worker.js/chunks/crystal_D6n65fKV.mjs +1 -0
- package/website/dist/_worker.js/chunks/csharp_C6FCVFzc.mjs +1 -0
- package/website/dist/_worker.js/chunks/css_C5uJEgmJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/csv_CtMYuuJl.mjs +1 -0
- package/website/dist/_worker.js/chunks/cue_BsPexqx6.mjs +1 -0
- package/website/dist/_worker.js/chunks/cypher_apzf6OBi.mjs +1 -0
- package/website/dist/_worker.js/chunks/d_DcvIRcgm.mjs +1 -0
- package/website/dist/_worker.js/chunks/dark-plus_C01ONtzj.mjs +1 -0
- package/website/dist/_worker.js/chunks/dart_WkzM5WrV.mjs +1 -0
- package/website/dist/_worker.js/chunks/dax_DjXAO5V4.mjs +1 -0
- package/website/dist/_worker.js/chunks/desktop_C92LCxdc.mjs +1 -0
- package/website/dist/_worker.js/chunks/diff_CVwM_9XJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/docker_DPzgJf6Z.mjs +1 -0
- package/website/dist/_worker.js/chunks/dotenv_D_vgANvA.mjs +1 -0
- package/website/dist/_worker.js/chunks/dracula-soft_CLnUBwFm.mjs +1 -0
- package/website/dist/_worker.js/chunks/dracula_lBVpb6Lb.mjs +1 -0
- package/website/dist/_worker.js/chunks/dream-maker_DTLbzd_J.mjs +1 -0
- package/website/dist/_worker.js/chunks/edge_i54JYm3_.mjs +1 -0
- package/website/dist/_worker.js/chunks/elixir_BJCIjTu4.mjs +1 -0
- package/website/dist/_worker.js/chunks/elm_BbXD39-_.mjs +1 -0
- package/website/dist/_worker.js/chunks/emacs-lisp_pxa5cXaN.mjs +1 -0
- package/website/dist/_worker.js/chunks/erb_Ccjijeee.mjs +1 -0
- package/website/dist/_worker.js/chunks/erlang_B2VM_hi7.mjs +1 -0
- package/website/dist/_worker.js/chunks/everforest-dark_BxvIPBim.mjs +1 -0
- package/website/dist/_worker.js/chunks/everforest-light_B7VoyaJM.mjs +1 -0
- package/website/dist/_worker.js/chunks/fennel_D-uo7X6c.mjs +1 -0
- package/website/dist/_worker.js/chunks/fish_BjePoK3m.mjs +1 -0
- package/website/dist/_worker.js/chunks/fluent_C8fgkzLX.mjs +1 -0
- package/website/dist/_worker.js/chunks/fortran-fixed-form_D1pu5zrc.mjs +1 -0
- package/website/dist/_worker.js/chunks/fortran-free-form_CSGOhJD6.mjs +1 -0
- package/website/dist/_worker.js/chunks/fsharp_B0xy-A4Y.mjs +1 -0
- package/website/dist/_worker.js/chunks/gdresource_CWppjlHq.mjs +1 -0
- package/website/dist/_worker.js/chunks/gdscript_eQCHchcS.mjs +1 -0
- package/website/dist/_worker.js/chunks/gdshader_C4kxepX7.mjs +1 -0
- package/website/dist/_worker.js/chunks/genie_ACtQLcDW.mjs +1 -0
- package/website/dist/_worker.js/chunks/gherkin_BFp2uKUd.mjs +1 -0
- package/website/dist/_worker.js/chunks/git-commit_CLg9ZwMV.mjs +1 -0
- package/website/dist/_worker.js/chunks/git-rebase_DG8A80Nt.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark-default_BI0EP2Kv.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark-dimmed_a_NIC0Xb.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark-high-contrast_jZGqT7hk.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark_CHCDNd2O.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-light-default_DRbOW5RG.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-light-high-contrast_tn_kWutM.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-light_D9brYzot.mjs +1 -0
- package/website/dist/_worker.js/chunks/gleam_Dmhu1oxW.mjs +1 -0
- package/website/dist/_worker.js/chunks/glimmer-js_BfZbXy8A.mjs +1 -0
- package/website/dist/_worker.js/chunks/glimmer-ts_B9QVICrD.mjs +1 -0
- package/website/dist/_worker.js/chunks/glsl_DD2PPwOs.mjs +1 -0
- package/website/dist/_worker.js/chunks/gnuplot_D2OYChUX.mjs +1 -0
- package/website/dist/_worker.js/chunks/go_DYGFTe3h.mjs +1 -0
- package/website/dist/_worker.js/chunks/graphql_B7XsT3nH.mjs +1 -0
- package/website/dist/_worker.js/chunks/groovy_BO12Uwkl.mjs +1 -0
- package/website/dist/_worker.js/chunks/hack_CB2_ztCP.mjs +1 -0
- package/website/dist/_worker.js/chunks/haml_CyfDcDD3.mjs +1 -0
- package/website/dist/_worker.js/chunks/handlebars_CfpxpWm2.mjs +1 -0
- package/website/dist/_worker.js/chunks/haskell_jUeC5uN5.mjs +1 -0
- package/website/dist/_worker.js/chunks/haxe_B6GxP1WB.mjs +1 -0
- package/website/dist/_worker.js/chunks/hcl_DwoHV2oh.mjs +1 -0
- package/website/dist/_worker.js/chunks/hjson_DV7cJRk4.mjs +1 -0
- package/website/dist/_worker.js/chunks/hlsl_BlFCscPI.mjs +1 -0
- package/website/dist/_worker.js/chunks/houston_COBFG1Mx.mjs +1 -0
- package/website/dist/_worker.js/chunks/html-derivative_C9pJ337h.mjs +1 -0
- package/website/dist/_worker.js/chunks/html_D1OkrZS5.mjs +1 -0
- package/website/dist/_worker.js/chunks/http_DIGXRqvJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/hxml_DEwh9i-c.mjs +1 -0
- package/website/dist/_worker.js/chunks/hy_DDoIgW1K.mjs +1 -0
- package/website/dist/_worker.js/chunks/imba_B00zbHo4.mjs +1 -0
- package/website/dist/_worker.js/chunks/index_C1UTDwYg.mjs +1861 -0
- package/website/dist/_worker.js/chunks/ini_D7XQA_p8.mjs +1 -0
- package/website/dist/_worker.js/chunks/java_B9wdFd8K.mjs +1 -0
- package/website/dist/_worker.js/chunks/javascript_CLsPGOON.mjs +1 -0
- package/website/dist/_worker.js/chunks/jinja_jarBCAN1.mjs +1 -0
- package/website/dist/_worker.js/chunks/jison_oGg3J708.mjs +1 -0
- package/website/dist/_worker.js/chunks/json5_DlZ1Kyaa.mjs +1 -0
- package/website/dist/_worker.js/chunks/json_DaYk_FMp.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsonc_DlwgfSDs.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsonl_BbCCVaZF.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsonnet_Dt-G75xe.mjs +1 -0
- package/website/dist/_worker.js/chunks/jssm_BtKFTj2A.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsx_DDx_xAZ8.mjs +1 -0
- package/website/dist/_worker.js/chunks/julia_CK0lv68l.mjs +1 -0
- package/website/dist/_worker.js/chunks/kanagawa-dragon_BldAK3Oo.mjs +1 -0
- package/website/dist/_worker.js/chunks/kanagawa-lotus_DVM8FX9_.mjs +1 -0
- package/website/dist/_worker.js/chunks/kanagawa-wave_Dpih0AKP.mjs +1 -0
- package/website/dist/_worker.js/chunks/kotlin_kWneB9V_.mjs +1 -0
- package/website/dist/_worker.js/chunks/kusto_BKVATd95.mjs +1 -0
- package/website/dist/_worker.js/chunks/laserwave_BqatxsVl.mjs +1 -0
- package/website/dist/_worker.js/chunks/latex_LVDcGBbc.mjs +1 -0
- package/website/dist/_worker.js/chunks/lean_W7qo-5M2.mjs +1 -0
- package/website/dist/_worker.js/chunks/less_DFNwJnBH.mjs +1 -0
- package/website/dist/_worker.js/chunks/light-plus_Dp0AoWsO.mjs +1 -0
- package/website/dist/_worker.js/chunks/liquid_D24qs0pc.mjs +1 -0
- package/website/dist/_worker.js/chunks/log_IPWMXriF.mjs +1 -0
- package/website/dist/_worker.js/chunks/logo_C6KaatrQ.mjs +1 -0
- package/website/dist/_worker.js/chunks/lua_CwnEf-T7.mjs +1 -0
- package/website/dist/_worker.js/chunks/luau_Br3-CXjS.mjs +1 -0
- package/website/dist/_worker.js/chunks/make_UBNG-kOo.mjs +1 -0
- package/website/dist/_worker.js/chunks/markdown_C7mhJFCm.mjs +1 -0
- package/website/dist/_worker.js/chunks/marko_4tchUvI7.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-darker_SKtaNEPn.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-lighter_zOX_DZCH.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-ocean_BN9WbhdC.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-palenight_DT_covjH.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme_6RpeM3kc.mjs +1 -0
- package/website/dist/_worker.js/chunks/matlab_DCOXsPKR.mjs +1 -0
- package/website/dist/_worker.js/chunks/mdc_B9gb2UFP.mjs +1 -0
- package/website/dist/_worker.js/chunks/mdx_DGU7Nu9u.mjs +1 -0
- package/website/dist/_worker.js/chunks/mermaid_B69URzsZ.mjs +1 -0
- package/website/dist/_worker.js/chunks/min-dark_BgxifOMI.mjs +1 -0
- package/website/dist/_worker.js/chunks/min-light_BrPjXxUp.mjs +1 -0
- package/website/dist/_worker.js/chunks/mipsasm_9U-4_t7k.mjs +1 -0
- package/website/dist/_worker.js/chunks/mojo_B0wt7ug3.mjs +1 -0
- package/website/dist/_worker.js/chunks/monokai_B6Pxpoyi.mjs +1 -0
- package/website/dist/_worker.js/chunks/move_1eid4CyR.mjs +1 -0
- package/website/dist/_worker.js/chunks/narrat_Ds6-p5JZ.mjs +1 -0
- package/website/dist/_worker.js/chunks/nextflow_v2N1Qlqa.mjs +1 -0
- package/website/dist/_worker.js/chunks/nginx_Bp9Ab2NH.mjs +1 -0
- package/website/dist/_worker.js/chunks/night-owl_CdwOw_sc.mjs +1 -0
- package/website/dist/_worker.js/chunks/nim_BXGDUe53.mjs +1 -0
- package/website/dist/_worker.js/chunks/nix_CUig1nJH.mjs +1 -0
- package/website/dist/_worker.js/chunks/noop-middleware_DlWGj5t5.mjs +10 -0
- package/website/dist/_worker.js/chunks/nord_SPoG1iae.mjs +1 -0
- package/website/dist/_worker.js/chunks/nushell_DJw1Lca8.mjs +1 -0
- package/website/dist/_worker.js/chunks/objective-c_Bktzl_CO.mjs +1 -0
- package/website/dist/_worker.js/chunks/objective-cpp_CP4DWdDp.mjs +1 -0
- package/website/dist/_worker.js/chunks/ocaml_CeEAs7bZ.mjs +1 -0
- package/website/dist/_worker.js/chunks/one-dark-pro_-hIwCNMi.mjs +1 -0
- package/website/dist/_worker.js/chunks/one-light_DSmYvJ05.mjs +1 -0
- package/website/dist/_worker.js/chunks/pascal_C-S_Ms_o.mjs +1 -0
- package/website/dist/_worker.js/chunks/perl_CKamvo15.mjs +1 -0
- package/website/dist/_worker.js/chunks/php_BlmcX_F3.mjs +1 -0
- package/website/dist/_worker.js/chunks/plastic_Ryt8tVoA.mjs +1 -0
- package/website/dist/_worker.js/chunks/plsql_Cb3v7cBj.mjs +1 -0
- package/website/dist/_worker.js/chunks/po_DZbdNRlo.mjs +1 -0
- package/website/dist/_worker.js/chunks/poimandres_bYmE3_5d.mjs +1 -0
- package/website/dist/_worker.js/chunks/polar_pJkMGwoW.mjs +1 -0
- package/website/dist/_worker.js/chunks/postcss_BAXSOKgk.mjs +1 -0
- package/website/dist/_worker.js/chunks/powerquery_oITMGN4x.mjs +1 -0
- package/website/dist/_worker.js/chunks/powershell_6306-xIF.mjs +1 -0
- package/website/dist/_worker.js/chunks/prisma_DSDxnZGz.mjs +1 -0
- package/website/dist/_worker.js/chunks/prolog_CxG7tjZR.mjs +1 -0
- package/website/dist/_worker.js/chunks/proto_CS9ByXm1.mjs +1 -0
- package/website/dist/_worker.js/chunks/pug_BMtLJo6U.mjs +1 -0
- package/website/dist/_worker.js/chunks/puppet_BfeeSzee.mjs +1 -0
- package/website/dist/_worker.js/chunks/purescript_BFfueNaH.mjs +1 -0
- package/website/dist/_worker.js/chunks/python_Cc4Faapv.mjs +1 -0
- package/website/dist/_worker.js/chunks/qml_C1CTJTK8.mjs +1 -0
- package/website/dist/_worker.js/chunks/qmldir_nG1KaqKR.mjs +1 -0
- package/website/dist/_worker.js/chunks/qss_Cncxk263.mjs +1 -0
- package/website/dist/_worker.js/chunks/r_ChR54Ihi.mjs +1 -0
- package/website/dist/_worker.js/chunks/racket_BDrhptDs.mjs +1 -0
- package/website/dist/_worker.js/chunks/raku_07OUHa0P.mjs +1 -0
- package/website/dist/_worker.js/chunks/razor_DIP3INLa.mjs +1 -0
- package/website/dist/_worker.js/chunks/red_DOPXfj-6.mjs +1 -0
- package/website/dist/_worker.js/chunks/reg_B64SwEDj.mjs +1 -0
- package/website/dist/_worker.js/chunks/regexp_ButFGoB5.mjs +1 -0
- package/website/dist/_worker.js/chunks/rel_BWJAWqZD.mjs +1 -0
- package/website/dist/_worker.js/chunks/riscv_79gXlbsF.mjs +1 -0
- package/website/dist/_worker.js/chunks/rose-pine-dawn_DHIjVGd3.mjs +1 -0
- package/website/dist/_worker.js/chunks/rose-pine-moon_t86aEbs0.mjs +1 -0
- package/website/dist/_worker.js/chunks/rose-pine_BHgrcDCs.mjs +1 -0
- package/website/dist/_worker.js/chunks/rst_D3F4Fcpj.mjs +1 -0
- package/website/dist/_worker.js/chunks/ruby_Cs7vM9iv.mjs +1 -0
- package/website/dist/_worker.js/chunks/rust_DpyRVatH.mjs +1 -0
- package/website/dist/_worker.js/chunks/sas_DW45xZXN.mjs +1 -0
- package/website/dist/_worker.js/chunks/sass_C6SiMwN_.mjs +1 -0
- package/website/dist/_worker.js/chunks/scala_DlZOjNZk.mjs +1 -0
- package/website/dist/_worker.js/chunks/scheme_D2ezSJXu.mjs +1 -0
- package/website/dist/_worker.js/chunks/scss_DG5Spjqu.mjs +1 -0
- package/website/dist/_worker.js/chunks/sdbl_ZCYaj4VN.mjs +1 -0
- package/website/dist/_worker.js/chunks/shaderlab_CAcRkg1_.mjs +1 -0
- package/website/dist/_worker.js/chunks/shellscript_BWwhkDVh.mjs +1 -0
- package/website/dist/_worker.js/chunks/shellsession_BfEA3juK.mjs +1 -0
- package/website/dist/_worker.js/chunks/slack-dark_CL3lSpCc.mjs +1 -0
- package/website/dist/_worker.js/chunks/slack-ochin_DdZKOQVh.mjs +1 -0
- package/website/dist/_worker.js/chunks/smalltalk_DgilzSui.mjs +1 -0
- package/website/dist/_worker.js/chunks/snazzy-light_eJU08Pz_.mjs +1 -0
- package/website/dist/_worker.js/chunks/solarized-dark_Dg_YQywx.mjs +1 -0
- package/website/dist/_worker.js/chunks/solarized-light_BnIsrA6p.mjs +1 -0
- package/website/dist/_worker.js/chunks/solidity_DkseH8pQ.mjs +1 -0
- package/website/dist/_worker.js/chunks/soy_DU7bOYoG.mjs +1 -0
- package/website/dist/_worker.js/chunks/sparql_BuI1DBDH.mjs +1 -0
- package/website/dist/_worker.js/chunks/splunk_B8Ha9Pkg.mjs +1 -0
- package/website/dist/_worker.js/chunks/sql_BniHwea5.mjs +1 -0
- package/website/dist/_worker.js/chunks/ssh-config_CkE1GuVe.mjs +1 -0
- package/website/dist/_worker.js/chunks/stata_Dtqpbd_l.mjs +1 -0
- package/website/dist/_worker.js/chunks/stylus_CXTtglzO.mjs +1 -0
- package/website/dist/_worker.js/chunks/svelte_BjWYcUCN.mjs +1 -0
- package/website/dist/_worker.js/chunks/swift_BzHql_rM.mjs +1 -0
- package/website/dist/_worker.js/chunks/synthwave-84_DLRNhxNA.mjs +1 -0
- package/website/dist/_worker.js/chunks/system-verilog_ChyInPph.mjs +1 -0
- package/website/dist/_worker.js/chunks/systemd_Bi9Qa2qD.mjs +1 -0
- package/website/dist/_worker.js/chunks/talonscript_B3sH_Y-V.mjs +1 -0
- package/website/dist/_worker.js/chunks/tasl_BJ5yipRs.mjs +1 -0
- package/website/dist/_worker.js/chunks/tcl_CoJQjNoP.mjs +1 -0
- package/website/dist/_worker.js/chunks/templ_CrU7Ffil.mjs +1 -0
- package/website/dist/_worker.js/chunks/terraform_DT9JSFpC.mjs +1 -0
- package/website/dist/_worker.js/chunks/tex_5PKu2yA0.mjs +1 -0
- package/website/dist/_worker.js/chunks/tokyo-night_Buo8OK7-.mjs +1 -0
- package/website/dist/_worker.js/chunks/toml_CPuXX3oc.mjs +1 -0
- package/website/dist/_worker.js/chunks/ts-tags_D0M_1VSH.mjs +1 -0
- package/website/dist/_worker.js/chunks/tsv_CuivVNot.mjs +1 -0
- package/website/dist/_worker.js/chunks/tsx_MkuGr8MY.mjs +1 -0
- package/website/dist/_worker.js/chunks/turtle_BqgEPK7f.mjs +1 -0
- package/website/dist/_worker.js/chunks/twig_r1G9rpYJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/typescript_Au5buqzM.mjs +1 -0
- package/website/dist/_worker.js/chunks/typespec_47rhBK_z.mjs +1 -0
- package/website/dist/_worker.js/chunks/typst_BAtuQLh-.mjs +1 -0
- package/website/dist/_worker.js/chunks/v_BIvWImHg.mjs +1 -0
- package/website/dist/_worker.js/chunks/vala_DYEacj30.mjs +1 -0
- package/website/dist/_worker.js/chunks/vb_CikQuqGJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/verilog_BQRENwI-.mjs +1 -0
- package/website/dist/_worker.js/chunks/vesper_DA0kvTmj.mjs +1 -0
- package/website/dist/_worker.js/chunks/vhdl_DHscJIyg.mjs +1 -0
- package/website/dist/_worker.js/chunks/viml_F2pvMwvG.mjs +1 -0
- package/website/dist/_worker.js/chunks/vitesse-black_D9tjNzd0.mjs +1 -0
- package/website/dist/_worker.js/chunks/vitesse-dark_Bnm5d0hd.mjs +1 -0
- package/website/dist/_worker.js/chunks/vitesse-light_CHwbyjNR.mjs +1 -0
- package/website/dist/_worker.js/chunks/vue-html_DyYtbbMK.mjs +1 -0
- package/website/dist/_worker.js/chunks/vue_DofN6juy.mjs +1 -0
- package/website/dist/_worker.js/chunks/vyper_CiR0m-OV.mjs +1 -0
- package/website/dist/_worker.js/chunks/wasm_CwIGgRGf.mjs +1 -0
- package/website/dist/_worker.js/chunks/wasm_jKWhg0J0.mjs +1 -0
- package/website/dist/_worker.js/chunks/wenyan_DKvVZKXW.mjs +1 -0
- package/website/dist/_worker.js/chunks/wgsl_BOWZY7yw.mjs +1 -0
- package/website/dist/_worker.js/chunks/wikitext_CXDhhHPy.mjs +1 -0
- package/website/dist/_worker.js/chunks/wolfram_ChkmGnW0.mjs +1 -0
- package/website/dist/_worker.js/chunks/xml_DXH3hHIu.mjs +1 -0
- package/website/dist/_worker.js/chunks/xsl_DuP2mFjg.mjs +1 -0
- package/website/dist/_worker.js/chunks/yaml_IGiEkTge.mjs +1 -0
- package/website/dist/_worker.js/chunks/zenscript_59iXGyNw.mjs +1 -0
- package/website/dist/_worker.js/chunks/zig_DKzb0zdT.mjs +1 -0
- package/website/dist/_worker.js/index.js +53 -0
- package/website/dist/_worker.js/manifest_BAAoOzaU.mjs +98 -0
- package/website/dist/_worker.js/pages/_image.astro.mjs +24 -0
- package/website/dist/_worker.js/pages/agents.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/animation.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/api/raw-markdown/_---path_.astro.mjs +44 -0
- package/website/dist/_worker.js/pages/config.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/fonts.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/getting-started.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/helpers.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/images.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/index.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/llm.txt.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/preview.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/sdk.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/sitemap.xml.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/styling.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/templates.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/video.astro.mjs +1 -0
- package/website/dist/_worker.js/renderers.mjs +57 -0
- package/website/dist/agents/index.html +3 -2
- package/website/dist/animation/index.html +402 -128
- package/website/dist/config/index.html +184 -0
- package/website/dist/fonts/index.html +56 -52
- package/website/dist/getting-started/index.html +107 -0
- package/website/dist/helpers/index.html +8 -8
- package/website/dist/images/index.html +50 -23
- package/website/dist/index.html +114 -148
- package/website/dist/llm.txt +751 -1055
- package/website/dist/preview/index.html +111 -0
- package/website/dist/robots.txt +35 -0
- package/website/dist/sdk/index.html +390 -52
- package/website/dist/sitemap.xml +76 -0
- package/website/dist/styling/index.html +10 -7
- package/website/dist/templates/index.html +11 -59
- package/website/dist/video/index.html +106 -537
- package/website/package-lock.json +1077 -17
- package/website/templates/og-image.tsx +61 -0
- package/website/dist/_astro/agents.I1-fN38o.css +0 -1
package/dist/sdk/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { TemplateDefinition, StyleConfig } from './template.js';
|
|
2
|
-
export { defineTemplate } from './template.js';
|
|
3
|
-
export type { TemplateDefinition, StyleConfig } from './template.js';
|
|
2
|
+
export { defineTemplate, defineTemplateFromFile, defineTemplateFromSource, defineTemplateFromSchema } from './template.js';
|
|
3
|
+
export type { TemplateDefinition, StyleConfig, TemplateSchema, SchemaElement } from './template.js';
|
|
4
4
|
/**
|
|
5
5
|
* Render options for image generation
|
|
6
6
|
*/
|
package/dist/sdk/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,MAAM,eAAe,CAAC;
|
|
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,sBAAsB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC3H,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEpG;;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
CHANGED
|
@@ -4,7 +4,7 @@ import { renderVideo as renderVideoInternal } from '../lib/video-renderer.js';
|
|
|
4
4
|
import fs from 'fs/promises';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import os from 'os';
|
|
7
|
-
export { defineTemplate } from './template.js';
|
|
7
|
+
export { defineTemplate, defineTemplateFromFile, defineTemplateFromSource, defineTemplateFromSchema } from './template.js';
|
|
8
8
|
/**
|
|
9
9
|
* Render an image from a template definition
|
|
10
10
|
*
|
package/dist/sdk/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/template.d.ts
CHANGED
|
@@ -39,4 +39,101 @@ export declare function defineTemplate<TProps = any>(definition: TemplateDefinit
|
|
|
39
39
|
* @internal
|
|
40
40
|
*/
|
|
41
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
|
+
export declare function defineTemplateFromSource<TProps = any>(sourceCode: string, options?: {
|
|
67
|
+
config?: StyleConfig;
|
|
68
|
+
}): TemplateDefinition<TProps>;
|
|
69
|
+
/**
|
|
70
|
+
* Schema element definition for visual template builders
|
|
71
|
+
*/
|
|
72
|
+
export interface SchemaElement {
|
|
73
|
+
type: 'div' | 'span' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'img';
|
|
74
|
+
className?: string;
|
|
75
|
+
content?: string;
|
|
76
|
+
src?: string;
|
|
77
|
+
style?: Record<string, any>;
|
|
78
|
+
children?: SchemaElement[];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Template schema for visual builders
|
|
82
|
+
*/
|
|
83
|
+
export interface TemplateSchema {
|
|
84
|
+
name: string;
|
|
85
|
+
type?: 'image' | 'video';
|
|
86
|
+
size: {
|
|
87
|
+
width: number;
|
|
88
|
+
height: number;
|
|
89
|
+
};
|
|
90
|
+
video?: {
|
|
91
|
+
fps: number;
|
|
92
|
+
duration: number;
|
|
93
|
+
};
|
|
94
|
+
config?: StyleConfig;
|
|
95
|
+
elements: SchemaElement[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Define a template from a JSON schema
|
|
99
|
+
*
|
|
100
|
+
* Perfect for visual template builders where users drag and drop elements.
|
|
101
|
+
* Converts a declarative JSON schema into a working template.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* const schema: TemplateSchema = {
|
|
106
|
+
* name: 'card',
|
|
107
|
+
* size: { width: 1200, height: 630 },
|
|
108
|
+
* config: {
|
|
109
|
+
* colors: { primary: '#3b82f6', background: '#ffffff' }
|
|
110
|
+
* },
|
|
111
|
+
* elements: [
|
|
112
|
+
* {
|
|
113
|
+
* type: 'div',
|
|
114
|
+
* className: 'flex flex-col w-full h-full bg-background p-12',
|
|
115
|
+
* children: [
|
|
116
|
+
* {
|
|
117
|
+
* type: 'h1',
|
|
118
|
+
* className: 'text-6xl font-bold text-primary',
|
|
119
|
+
* content: '{{title}}'
|
|
120
|
+
* },
|
|
121
|
+
* {
|
|
122
|
+
* type: 'p',
|
|
123
|
+
* className: 'text-2xl text-gray-600',
|
|
124
|
+
* content: '{{description}}'
|
|
125
|
+
* }
|
|
126
|
+
* ]
|
|
127
|
+
* }
|
|
128
|
+
* ]
|
|
129
|
+
* };
|
|
130
|
+
*
|
|
131
|
+
* const template = defineTemplateFromSchema(schema);
|
|
132
|
+
* const png = await renderImage(template, {
|
|
133
|
+
* title: 'Hello World',
|
|
134
|
+
* description: 'Created with visual builder'
|
|
135
|
+
* });
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export declare function defineTemplateFromSchema<TProps = any>(schema: TemplateSchema): TemplateDefinition<TProps>;
|
|
42
139
|
//# 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;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
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;AAKvD,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;AAuDD,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,CAmC5B;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"}
|
package/dist/sdk/template.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import * as Babel from '@babel/standalone';
|
|
1
3
|
/**
|
|
2
4
|
* Define a template programmatically for use in serverless environments
|
|
3
5
|
*
|
|
@@ -51,4 +53,219 @@ export function templateToMeta(template) {
|
|
|
51
53
|
props: {}, // SDK templates don't need props metadata
|
|
52
54
|
};
|
|
53
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Define a template from an imported template file
|
|
58
|
+
*
|
|
59
|
+
* Allows reusing file-based templates from _loopwind/templates/ in the SDK
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* import * as videoIntro from './_loopwind/templates/video-intro/template';
|
|
64
|
+
*
|
|
65
|
+
* const template = defineTemplateFromFile(videoIntro, {
|
|
66
|
+
* config: {
|
|
67
|
+
* colors: { primary: '#ff0000' }
|
|
68
|
+
* }
|
|
69
|
+
* });
|
|
70
|
+
*
|
|
71
|
+
* const mp4 = await renderVideo(template, { version: '2.0.0' });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export function defineTemplateFromFile(templateModule, options = {}) {
|
|
75
|
+
const { meta, default: render } = templateModule;
|
|
76
|
+
return defineTemplate({
|
|
77
|
+
name: meta.name,
|
|
78
|
+
type: meta.type,
|
|
79
|
+
size: meta.size,
|
|
80
|
+
video: meta.video,
|
|
81
|
+
config: options.config,
|
|
82
|
+
render,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Define a template from a source code string
|
|
87
|
+
*
|
|
88
|
+
* **WARNING:** This function evaluates code strings using `new Function()`.
|
|
89
|
+
* Only use with **trusted** template sources. Never use with user input from
|
|
90
|
+
* untrusted sources as it can execute arbitrary code.
|
|
91
|
+
*
|
|
92
|
+
* Perfect for:
|
|
93
|
+
* - Templates stored in a database (admin-created only)
|
|
94
|
+
* - Templates from a trusted CMS
|
|
95
|
+
* - Code editor features where templates are validated
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* const templateSource = `
|
|
100
|
+
* export const meta = {
|
|
101
|
+
* name: 'user-template',
|
|
102
|
+
* type: 'image',
|
|
103
|
+
* size: { width: 1200, height: 630 }
|
|
104
|
+
* };
|
|
105
|
+
*
|
|
106
|
+
* export default ({ tw, title }) => {
|
|
107
|
+
* const h = React.createElement;
|
|
108
|
+
* return h('div', { style: tw('flex w-full h-full bg-blue-500 p-12') },
|
|
109
|
+
* h('h1', { style: tw('text-6xl font-bold text-white') }, title)
|
|
110
|
+
* );
|
|
111
|
+
* };
|
|
112
|
+
* `;
|
|
113
|
+
*
|
|
114
|
+
* const template = defineTemplateFromSource(templateSource, {
|
|
115
|
+
* config: { colors: { primary: '#3b82f6' } }
|
|
116
|
+
* });
|
|
117
|
+
*
|
|
118
|
+
* const png = await renderImage(template, { title: 'Hello' });
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
/**
|
|
122
|
+
* Transform JSX to JavaScript using Babel
|
|
123
|
+
* @internal
|
|
124
|
+
*/
|
|
125
|
+
function transformJSX(code) {
|
|
126
|
+
try {
|
|
127
|
+
const result = Babel.transform(code, {
|
|
128
|
+
presets: ['react'],
|
|
129
|
+
filename: 'template.tsx',
|
|
130
|
+
});
|
|
131
|
+
return result.code || code;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// If Babel fails, return original code (might be plain JS without JSX)
|
|
135
|
+
return code;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function defineTemplateFromSource(sourceCode, options = {}) {
|
|
139
|
+
try {
|
|
140
|
+
// Transform JSX to React.createElement calls
|
|
141
|
+
let processedSource = transformJSX(sourceCode);
|
|
142
|
+
// Strip export keywords to make it work in function context
|
|
143
|
+
// Convert "export const meta = ..." to "const meta = ..."
|
|
144
|
+
// Convert "export default ..." to "const defaultExport = ..."
|
|
145
|
+
processedSource = processedSource
|
|
146
|
+
.replace(/export\s+const\s+meta\s*=/g, 'const meta =')
|
|
147
|
+
.replace(/export\s+default\s+/g, 'const defaultExport = ');
|
|
148
|
+
// Create a module evaluation function
|
|
149
|
+
// This executes the source code and returns the exports
|
|
150
|
+
const moduleFactory = new Function('React', `
|
|
151
|
+
'use strict';
|
|
152
|
+
${processedSource}
|
|
153
|
+
return { meta, default: defaultExport };
|
|
154
|
+
`);
|
|
155
|
+
// Execute to get meta and render function
|
|
156
|
+
const templateModule = moduleFactory(React);
|
|
157
|
+
if (!templateModule.meta) {
|
|
158
|
+
throw new Error('Template source must export a "meta" object');
|
|
159
|
+
}
|
|
160
|
+
if (!templateModule.default || typeof templateModule.default !== 'function') {
|
|
161
|
+
throw new Error('Template source must have a default export function');
|
|
162
|
+
}
|
|
163
|
+
return defineTemplateFromFile(templateModule, options);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
throw new Error(`Failed to parse template source: ${error instanceof Error ? error.message : String(error)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Define a template from a JSON schema
|
|
171
|
+
*
|
|
172
|
+
* Perfect for visual template builders where users drag and drop elements.
|
|
173
|
+
* Converts a declarative JSON schema into a working template.
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```typescript
|
|
177
|
+
* const schema: TemplateSchema = {
|
|
178
|
+
* name: 'card',
|
|
179
|
+
* size: { width: 1200, height: 630 },
|
|
180
|
+
* config: {
|
|
181
|
+
* colors: { primary: '#3b82f6', background: '#ffffff' }
|
|
182
|
+
* },
|
|
183
|
+
* elements: [
|
|
184
|
+
* {
|
|
185
|
+
* type: 'div',
|
|
186
|
+
* className: 'flex flex-col w-full h-full bg-background p-12',
|
|
187
|
+
* children: [
|
|
188
|
+
* {
|
|
189
|
+
* type: 'h1',
|
|
190
|
+
* className: 'text-6xl font-bold text-primary',
|
|
191
|
+
* content: '{{title}}'
|
|
192
|
+
* },
|
|
193
|
+
* {
|
|
194
|
+
* type: 'p',
|
|
195
|
+
* className: 'text-2xl text-gray-600',
|
|
196
|
+
* content: '{{description}}'
|
|
197
|
+
* }
|
|
198
|
+
* ]
|
|
199
|
+
* }
|
|
200
|
+
* ]
|
|
201
|
+
* };
|
|
202
|
+
*
|
|
203
|
+
* const template = defineTemplateFromSchema(schema);
|
|
204
|
+
* const png = await renderImage(template, {
|
|
205
|
+
* title: 'Hello World',
|
|
206
|
+
* description: 'Created with visual builder'
|
|
207
|
+
* });
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
export function defineTemplateFromSchema(schema) {
|
|
211
|
+
if (schema.elements.length === 0) {
|
|
212
|
+
throw new Error('Schema must have at least one element');
|
|
213
|
+
}
|
|
214
|
+
// Embed schema directly in the function body as a JSON literal
|
|
215
|
+
// This way the function is completely self-contained and survives serialization
|
|
216
|
+
const elementsJSON = JSON.stringify(schema.elements);
|
|
217
|
+
// Create a completely self-contained render function
|
|
218
|
+
// The function body contains the entire schema and all helper functions
|
|
219
|
+
// React must be available globally or passed in
|
|
220
|
+
const render = new Function('React', `
|
|
221
|
+
return function(props) {
|
|
222
|
+
const h = React.createElement;
|
|
223
|
+
const elements = ${elementsJSON};
|
|
224
|
+
|
|
225
|
+
const interpolate = (str) => {
|
|
226
|
+
return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {
|
|
227
|
+
return props[key] !== undefined ? String(props[key]) : '';
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const buildElement = (element, key) => {
|
|
232
|
+
const { type, className, content, src, style, children } = element;
|
|
233
|
+
const elementProps = { key };
|
|
234
|
+
|
|
235
|
+
if (className && props.tw) {
|
|
236
|
+
elementProps.style = props.tw(className);
|
|
237
|
+
} else if (style) {
|
|
238
|
+
elementProps.style = style;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (type === 'img' && src) {
|
|
242
|
+
elementProps.src = interpolate(src);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
let elementChildren = null;
|
|
246
|
+
if (content) {
|
|
247
|
+
elementChildren = interpolate(content);
|
|
248
|
+
} else if (children && children.length > 0) {
|
|
249
|
+
elementChildren = children.map((child, i) => buildElement(child, i));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return h(type, elementProps, elementChildren);
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
if (elements.length === 1) {
|
|
256
|
+
return buildElement(elements[0]);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return h(React.Fragment, null, elements.map((el, i) => buildElement(el, i)));
|
|
260
|
+
}
|
|
261
|
+
`)(React);
|
|
262
|
+
return defineTemplate({
|
|
263
|
+
name: schema.name,
|
|
264
|
+
type: schema.type,
|
|
265
|
+
size: schema.size,
|
|
266
|
+
video: schema.video,
|
|
267
|
+
config: schema.config,
|
|
268
|
+
render,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
54
271
|
//# sourceMappingURL=template.js.map
|
package/dist/sdk/template.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/sdk/template.ts"],"names":[],"mappings":"
|
|
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
|
+
*/
|