loopwind 0.17.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.
- package/REGISTRY_SETUP.md +55 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +3 -0
- package/dist/commands/add.js.map +1 -1
- package/dist/lib/installer.d.ts +8 -0
- package/dist/lib/installer.d.ts.map +1 -1
- package/dist/lib/installer.js +48 -1
- package/dist/lib/installer.js.map +1 -1
- 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 +133 -0
- package/dist/sdk/template.d.ts.map +1 -1
- package/dist/sdk/template.js +198 -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 +1 -1
- 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 +0 -2
- package/website/deploy.sh +19 -0
- 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.json +1 -5
- package/website/public/.assetsignore +3 -0
- package/website/public/.gitkeep +0 -1
- package/website/templates/og-image.tsx +61 -0
- package/website/wrangler.toml +12 -0
- package/website/dist/_astro/agents.I1-fN38o.css +0 -1
|
@@ -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
|
+
*/
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Visual Builder - Templates from JSON schemas
|
|
3
|
+
*
|
|
4
|
+
* Use case: Building a drag-and-drop template builder where users
|
|
5
|
+
* construct templates visually without writing code.
|
|
6
|
+
*
|
|
7
|
+
* Safe for user-generated content - no code execution!
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
defineTemplateFromSchema,
|
|
12
|
+
renderImage,
|
|
13
|
+
renderVideo,
|
|
14
|
+
type TemplateSchema,
|
|
15
|
+
} from 'loopwind/sdk';
|
|
16
|
+
import fs from 'fs/promises';
|
|
17
|
+
|
|
18
|
+
// Example 1: Simple card template
|
|
19
|
+
const cardSchema: TemplateSchema = {
|
|
20
|
+
name: 'simple-card',
|
|
21
|
+
size: { width: 1200, height: 630 },
|
|
22
|
+
config: {
|
|
23
|
+
colors: {
|
|
24
|
+
primary: '#3b82f6',
|
|
25
|
+
background: '#ffffff',
|
|
26
|
+
text: '#1f2937',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
elements: [
|
|
30
|
+
{
|
|
31
|
+
type: 'div',
|
|
32
|
+
className: 'flex flex-col w-full h-full bg-background p-12 justify-center',
|
|
33
|
+
children: [
|
|
34
|
+
{
|
|
35
|
+
type: 'h1',
|
|
36
|
+
className: 'text-6xl font-bold text-primary mb-4',
|
|
37
|
+
content: '{{title}}',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: 'p',
|
|
41
|
+
className: 'text-2xl text-text',
|
|
42
|
+
content: '{{description}}',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
async function renderSimpleCard() {
|
|
50
|
+
const template = defineTemplateFromSchema(cardSchema);
|
|
51
|
+
|
|
52
|
+
const png = await renderImage(template, {
|
|
53
|
+
title: 'Visual Builder',
|
|
54
|
+
description: 'No code required!',
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
await fs.writeFile('simple-card.png', png);
|
|
58
|
+
console.log('✓ Rendered simple-card.png');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Example 2: Complex layout with multiple sections
|
|
62
|
+
const complexSchema: TemplateSchema = {
|
|
63
|
+
name: 'complex-layout',
|
|
64
|
+
size: { width: 1200, height: 630 },
|
|
65
|
+
config: {
|
|
66
|
+
colors: {
|
|
67
|
+
primary: '#8b5cf6',
|
|
68
|
+
secondary: '#ec4899',
|
|
69
|
+
background: '#fafafa',
|
|
70
|
+
text: '#0f172a',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
elements: [
|
|
74
|
+
{
|
|
75
|
+
type: 'div',
|
|
76
|
+
className: 'flex w-full h-full bg-background',
|
|
77
|
+
children: [
|
|
78
|
+
// Left sidebar
|
|
79
|
+
{
|
|
80
|
+
type: 'div',
|
|
81
|
+
className: 'flex flex-col w-1/3 bg-primary p-8 justify-between',
|
|
82
|
+
children: [
|
|
83
|
+
{
|
|
84
|
+
type: 'h2',
|
|
85
|
+
className: 'text-3xl font-bold text-white',
|
|
86
|
+
content: '{{category}}',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: 'p',
|
|
90
|
+
className: 'text-lg text-white/80',
|
|
91
|
+
content: '{{subtitle}}',
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
// Right content area
|
|
96
|
+
{
|
|
97
|
+
type: 'div',
|
|
98
|
+
className: 'flex flex-col flex-1 p-12 justify-center',
|
|
99
|
+
children: [
|
|
100
|
+
{
|
|
101
|
+
type: 'h1',
|
|
102
|
+
className: 'text-6xl font-bold text-text mb-6',
|
|
103
|
+
content: '{{title}}',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
type: 'div',
|
|
107
|
+
className: 'w-24 h-2 bg-secondary mb-6',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'p',
|
|
111
|
+
className: 'text-2xl text-text/70',
|
|
112
|
+
content: '{{description}}',
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
async function renderComplexLayout() {
|
|
122
|
+
const template = defineTemplateFromSchema(complexSchema);
|
|
123
|
+
|
|
124
|
+
const png = await renderImage(template, {
|
|
125
|
+
category: 'TECHNOLOGY',
|
|
126
|
+
subtitle: 'Innovation Series',
|
|
127
|
+
title: 'The Future of AI',
|
|
128
|
+
description: 'Exploring the next generation of artificial intelligence',
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
await fs.writeFile('complex-layout.png', png);
|
|
132
|
+
console.log('✓ Rendered complex-layout.png');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Example 3: Template with dynamic branding
|
|
136
|
+
const brandedSchema: TemplateSchema = {
|
|
137
|
+
name: 'branded-template',
|
|
138
|
+
size: { width: 1200, height: 630 },
|
|
139
|
+
elements: [
|
|
140
|
+
{
|
|
141
|
+
type: 'div',
|
|
142
|
+
className: 'flex flex-col w-full h-full bg-brand-bg p-12 justify-between',
|
|
143
|
+
children: [
|
|
144
|
+
{
|
|
145
|
+
type: 'div',
|
|
146
|
+
className: 'flex items-center gap-4',
|
|
147
|
+
children: [
|
|
148
|
+
{
|
|
149
|
+
type: 'div',
|
|
150
|
+
className: 'w-16 h-16 rounded-full bg-brand-primary',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'span',
|
|
154
|
+
className: 'text-2xl font-bold text-brand-text',
|
|
155
|
+
content: '{{companyName}}',
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'div',
|
|
161
|
+
children: [
|
|
162
|
+
{
|
|
163
|
+
type: 'h1',
|
|
164
|
+
className: 'text-6xl font-bold text-brand-text mb-4',
|
|
165
|
+
content: '{{title}}',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'p',
|
|
169
|
+
className: 'text-2xl text-brand-text/80',
|
|
170
|
+
content: '{{tagline}}',
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
async function renderWithBranding(brandColors: any, props: any) {
|
|
180
|
+
const template = defineTemplateFromSchema({
|
|
181
|
+
...brandedSchema,
|
|
182
|
+
config: { colors: brandColors },
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const png = await renderImage(template, props);
|
|
186
|
+
return png;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function renderMultipleBrands() {
|
|
190
|
+
// Brand 1: Blue theme
|
|
191
|
+
const brand1 = await renderWithBranding(
|
|
192
|
+
{
|
|
193
|
+
'brand-primary': '#3b82f6',
|
|
194
|
+
'brand-bg': '#eff6ff',
|
|
195
|
+
'brand-text': '#1e3a8a',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
companyName: 'TechCorp',
|
|
199
|
+
title: 'Innovation Summit 2024',
|
|
200
|
+
tagline: 'Building the Future Together',
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
await fs.writeFile('brand-1.png', brand1);
|
|
204
|
+
console.log('✓ Rendered brand-1.png');
|
|
205
|
+
|
|
206
|
+
// Brand 2: Purple theme
|
|
207
|
+
const brand2 = await renderWithBranding(
|
|
208
|
+
{
|
|
209
|
+
'brand-primary': '#8b5cf6',
|
|
210
|
+
'brand-bg': '#faf5ff',
|
|
211
|
+
'brand-text': '#581c87',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
companyName: 'DesignStudio',
|
|
215
|
+
title: 'Creative Workshop',
|
|
216
|
+
tagline: 'Unleash Your Creativity',
|
|
217
|
+
}
|
|
218
|
+
);
|
|
219
|
+
await fs.writeFile('brand-2.png', brand2);
|
|
220
|
+
console.log('✓ Rendered brand-2.png');
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Example 4: User interface builder output
|
|
224
|
+
// This simulates what a drag-and-drop builder would generate
|
|
225
|
+
interface BuilderElement {
|
|
226
|
+
id: string;
|
|
227
|
+
type: string;
|
|
228
|
+
className: string;
|
|
229
|
+
content?: string;
|
|
230
|
+
children?: BuilderElement[];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function convertBuilderToSchema(
|
|
234
|
+
name: string,
|
|
235
|
+
elements: BuilderElement[],
|
|
236
|
+
config?: any
|
|
237
|
+
): TemplateSchema {
|
|
238
|
+
// Remove IDs and convert to schema format
|
|
239
|
+
const cleanElements = (els: BuilderElement[]) => {
|
|
240
|
+
return els.map((el) => ({
|
|
241
|
+
type: el.type as any,
|
|
242
|
+
className: el.className,
|
|
243
|
+
content: el.content,
|
|
244
|
+
children: el.children ? cleanElements(el.children) : undefined,
|
|
245
|
+
}));
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
name,
|
|
250
|
+
size: { width: 1200, height: 630 },
|
|
251
|
+
config,
|
|
252
|
+
elements: cleanElements(elements),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async function renderFromBuilder() {
|
|
257
|
+
// Simulated output from visual builder
|
|
258
|
+
const builderOutput: BuilderElement[] = [
|
|
259
|
+
{
|
|
260
|
+
id: 'root-1',
|
|
261
|
+
type: 'div',
|
|
262
|
+
className: 'flex items-center justify-center w-full h-full bg-gradient-to-br from-indigo-500 to-purple-600',
|
|
263
|
+
children: [
|
|
264
|
+
{
|
|
265
|
+
id: 'text-1',
|
|
266
|
+
type: 'h1',
|
|
267
|
+
className: 'text-8xl font-bold text-white',
|
|
268
|
+
content: '{{message}}',
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
];
|
|
273
|
+
|
|
274
|
+
const schema = convertBuilderToSchema('builder-output', builderOutput);
|
|
275
|
+
const template = defineTemplateFromSchema(schema);
|
|
276
|
+
|
|
277
|
+
const png = await renderImage(template, {
|
|
278
|
+
message: 'Built Visually!',
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
await fs.writeFile('builder-output.png', png);
|
|
282
|
+
console.log('✓ Rendered builder-output.png');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Example 5: Video schema (for animated templates)
|
|
286
|
+
const videoSchema: TemplateSchema = {
|
|
287
|
+
name: 'animated-card',
|
|
288
|
+
type: 'video',
|
|
289
|
+
size: { width: 1920, height: 1080 },
|
|
290
|
+
video: { fps: 30, duration: 3 },
|
|
291
|
+
config: {
|
|
292
|
+
colors: {
|
|
293
|
+
background: '#000000',
|
|
294
|
+
text: '#ffffff',
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
elements: [
|
|
298
|
+
{
|
|
299
|
+
type: 'div',
|
|
300
|
+
className: 'flex items-center justify-center w-full h-full bg-background',
|
|
301
|
+
children: [
|
|
302
|
+
{
|
|
303
|
+
type: 'h1',
|
|
304
|
+
className: 'text-8xl font-bold text-text enter-fade-in/0/1500 exit-fade-out/2500/3000',
|
|
305
|
+
content: '{{title}}',
|
|
306
|
+
},
|
|
307
|
+
],
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
async function renderVideoSchema() {
|
|
313
|
+
const template = defineTemplateFromSchema(videoSchema);
|
|
314
|
+
|
|
315
|
+
const mp4 = await renderVideo(template, {
|
|
316
|
+
title: 'Schema Video',
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
await fs.writeFile('animated-card.mp4', mp4);
|
|
320
|
+
console.log('✓ Rendered animated-card.mp4');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Run all examples
|
|
324
|
+
async function main() {
|
|
325
|
+
console.log('Visual Builder Examples\n');
|
|
326
|
+
|
|
327
|
+
await renderSimpleCard();
|
|
328
|
+
await renderComplexLayout();
|
|
329
|
+
await renderMultipleBrands();
|
|
330
|
+
await renderFromBuilder();
|
|
331
|
+
await renderVideoSchema();
|
|
332
|
+
|
|
333
|
+
console.log('\n✅ All visual builder examples completed!');
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
main().catch(console.error);
|