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