loopwind 0.17.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/template.d.ts +97 -0
- package/dist/sdk/template.d.ts.map +1 -1
- package/dist/sdk/template.js +217 -0
- package/dist/sdk/template.js.map +1 -1
- package/examples/code-editor-templates.ts +173 -0
- package/examples/nextjs-template-import.ts +58 -0
- package/examples/visual-builder-templates.ts +336 -0
- package/package.json +3 -1
- package/test-jsx-support.mjs +120 -0
- package/test-sdk-user-templates.mjs +469 -0
- package/website/.astro/integrations/_inox-tools_astro-when/types.d.ts +1 -0
- package/website/.astro/types.d.ts +1 -0
- package/website/DEPLOYMENT.md +142 -0
- package/website/OG_IMAGES.md +141 -0
- package/website/astro.config.mjs +9 -1
- package/website/dist/.gitkeep +1 -0
- package/website/dist/_astro/agents.Yx-L_igG.css +1 -0
- package/website/dist/_routes.json +30 -0
- package/website/dist/_worker.js/_@astrojs-ssr-adapter.mjs +1033 -0
- package/website/dist/_worker.js/_astro-internal_middleware.mjs +40 -0
- package/website/dist/_worker.js/chunks/abap_BTmsHiP5.mjs +1 -0
- package/website/dist/_worker.js/chunks/actionscript-3_DmBelb1E.mjs +1 -0
- package/website/dist/_worker.js/chunks/ada_8-E0ahCN.mjs +1 -0
- package/website/dist/_worker.js/chunks/andromeeda_XI-CXx50.mjs +1 -0
- package/website/dist/_worker.js/chunks/angular-html_DKGh3gGH.mjs +1 -0
- package/website/dist/_worker.js/chunks/angular-ts_-qZGsJoA.mjs +1 -0
- package/website/dist/_worker.js/chunks/apache_ijTUt0Ee.mjs +1 -0
- package/website/dist/_worker.js/chunks/apex_agu1c6Sh.mjs +1 -0
- package/website/dist/_worker.js/chunks/apl_Bj2f7Art.mjs +1 -0
- package/website/dist/_worker.js/chunks/applescript_B_vXrOh3.mjs +1 -0
- package/website/dist/_worker.js/chunks/ara_DCEQ2rnh.mjs +1 -0
- package/website/dist/_worker.js/chunks/asciidoc_CGN_EkYS.mjs +1 -0
- package/website/dist/_worker.js/chunks/asm_BBWZgnDp.mjs +1 -0
- package/website/dist/_worker.js/chunks/astro/assets-service_j52rQLzU.mjs +721 -0
- package/website/dist/_worker.js/chunks/astro/server_Y5_QHO8v.mjs +2401 -0
- package/website/dist/_worker.js/chunks/astro-designed-error-pages_BNTLO-TA.mjs +542 -0
- package/website/dist/_worker.js/chunks/astro_Dr_hht3h.mjs +1 -0
- package/website/dist/_worker.js/chunks/aurora-x_9GHG8nSq.mjs +1 -0
- package/website/dist/_worker.js/chunks/awk_DHRvhXot.mjs +1 -0
- package/website/dist/_worker.js/chunks/ayu-dark_CcvqmEHE.mjs +1 -0
- package/website/dist/_worker.js/chunks/ballerina_C7SdeSZb.mjs +1 -0
- package/website/dist/_worker.js/chunks/bat_Dv4A3u45.mjs +1 -0
- package/website/dist/_worker.js/chunks/beancount_BfPf9Luv.mjs +1 -0
- package/website/dist/_worker.js/chunks/berry_B8rfM3lL.mjs +1 -0
- package/website/dist/_worker.js/chunks/bibtex_TcjYgtJM.mjs +1 -0
- package/website/dist/_worker.js/chunks/bicep_CrlFWCdN.mjs +1 -0
- package/website/dist/_worker.js/chunks/blade_lanKVYID.mjs +1 -0
- package/website/dist/_worker.js/chunks/bsl_BhppzXMB.mjs +1 -0
- package/website/dist/_worker.js/chunks/c_6FBALJTK.mjs +1 -0
- package/website/dist/_worker.js/chunks/cadence_2txU9LVE.mjs +1 -0
- package/website/dist/_worker.js/chunks/cairo_BkrFAIlP.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-frappe_CkEqIYhU.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-latte_DG4Gx_-v.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-macchiato_Cwi3vCXf.mjs +1 -0
- package/website/dist/_worker.js/chunks/catppuccin-mocha_L9_OPlFX.mjs +1 -0
- package/website/dist/_worker.js/chunks/clarity_BEAe4Ulu.mjs +1 -0
- package/website/dist/_worker.js/chunks/clojure_VnUX6p2g.mjs +1 -0
- package/website/dist/_worker.js/chunks/cmake_0-SGkZEj.mjs +1 -0
- package/website/dist/_worker.js/chunks/cobol_92M_KGaE.mjs +1 -0
- package/website/dist/_worker.js/chunks/codeowners_CzMwskBv.mjs +1 -0
- package/website/dist/_worker.js/chunks/codeql_DWJZNHv1.mjs +1 -0
- package/website/dist/_worker.js/chunks/coffee_CQjKU2fh.mjs +1 -0
- package/website/dist/_worker.js/chunks/common-lisp_BBLWDpS5.mjs +1 -0
- package/website/dist/_worker.js/chunks/coq_hedRFV3D.mjs +1 -0
- package/website/dist/_worker.js/chunks/cpp_DlS1i6Zs.mjs +1 -0
- package/website/dist/_worker.js/chunks/crystal_D6n65fKV.mjs +1 -0
- package/website/dist/_worker.js/chunks/csharp_C6FCVFzc.mjs +1 -0
- package/website/dist/_worker.js/chunks/css_C5uJEgmJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/csv_CtMYuuJl.mjs +1 -0
- package/website/dist/_worker.js/chunks/cue_BsPexqx6.mjs +1 -0
- package/website/dist/_worker.js/chunks/cypher_apzf6OBi.mjs +1 -0
- package/website/dist/_worker.js/chunks/d_DcvIRcgm.mjs +1 -0
- package/website/dist/_worker.js/chunks/dark-plus_C01ONtzj.mjs +1 -0
- package/website/dist/_worker.js/chunks/dart_WkzM5WrV.mjs +1 -0
- package/website/dist/_worker.js/chunks/dax_DjXAO5V4.mjs +1 -0
- package/website/dist/_worker.js/chunks/desktop_C92LCxdc.mjs +1 -0
- package/website/dist/_worker.js/chunks/diff_CVwM_9XJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/docker_DPzgJf6Z.mjs +1 -0
- package/website/dist/_worker.js/chunks/dotenv_D_vgANvA.mjs +1 -0
- package/website/dist/_worker.js/chunks/dracula-soft_CLnUBwFm.mjs +1 -0
- package/website/dist/_worker.js/chunks/dracula_lBVpb6Lb.mjs +1 -0
- package/website/dist/_worker.js/chunks/dream-maker_DTLbzd_J.mjs +1 -0
- package/website/dist/_worker.js/chunks/edge_i54JYm3_.mjs +1 -0
- package/website/dist/_worker.js/chunks/elixir_BJCIjTu4.mjs +1 -0
- package/website/dist/_worker.js/chunks/elm_BbXD39-_.mjs +1 -0
- package/website/dist/_worker.js/chunks/emacs-lisp_pxa5cXaN.mjs +1 -0
- package/website/dist/_worker.js/chunks/erb_Ccjijeee.mjs +1 -0
- package/website/dist/_worker.js/chunks/erlang_B2VM_hi7.mjs +1 -0
- package/website/dist/_worker.js/chunks/everforest-dark_BxvIPBim.mjs +1 -0
- package/website/dist/_worker.js/chunks/everforest-light_B7VoyaJM.mjs +1 -0
- package/website/dist/_worker.js/chunks/fennel_D-uo7X6c.mjs +1 -0
- package/website/dist/_worker.js/chunks/fish_BjePoK3m.mjs +1 -0
- package/website/dist/_worker.js/chunks/fluent_C8fgkzLX.mjs +1 -0
- package/website/dist/_worker.js/chunks/fortran-fixed-form_D1pu5zrc.mjs +1 -0
- package/website/dist/_worker.js/chunks/fortran-free-form_CSGOhJD6.mjs +1 -0
- package/website/dist/_worker.js/chunks/fsharp_B0xy-A4Y.mjs +1 -0
- package/website/dist/_worker.js/chunks/gdresource_CWppjlHq.mjs +1 -0
- package/website/dist/_worker.js/chunks/gdscript_eQCHchcS.mjs +1 -0
- package/website/dist/_worker.js/chunks/gdshader_C4kxepX7.mjs +1 -0
- package/website/dist/_worker.js/chunks/genie_ACtQLcDW.mjs +1 -0
- package/website/dist/_worker.js/chunks/gherkin_BFp2uKUd.mjs +1 -0
- package/website/dist/_worker.js/chunks/git-commit_CLg9ZwMV.mjs +1 -0
- package/website/dist/_worker.js/chunks/git-rebase_DG8A80Nt.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark-default_BI0EP2Kv.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark-dimmed_a_NIC0Xb.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark-high-contrast_jZGqT7hk.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-dark_CHCDNd2O.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-light-default_DRbOW5RG.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-light-high-contrast_tn_kWutM.mjs +1 -0
- package/website/dist/_worker.js/chunks/github-light_D9brYzot.mjs +1 -0
- package/website/dist/_worker.js/chunks/gleam_Dmhu1oxW.mjs +1 -0
- package/website/dist/_worker.js/chunks/glimmer-js_BfZbXy8A.mjs +1 -0
- package/website/dist/_worker.js/chunks/glimmer-ts_B9QVICrD.mjs +1 -0
- package/website/dist/_worker.js/chunks/glsl_DD2PPwOs.mjs +1 -0
- package/website/dist/_worker.js/chunks/gnuplot_D2OYChUX.mjs +1 -0
- package/website/dist/_worker.js/chunks/go_DYGFTe3h.mjs +1 -0
- package/website/dist/_worker.js/chunks/graphql_B7XsT3nH.mjs +1 -0
- package/website/dist/_worker.js/chunks/groovy_BO12Uwkl.mjs +1 -0
- package/website/dist/_worker.js/chunks/hack_CB2_ztCP.mjs +1 -0
- package/website/dist/_worker.js/chunks/haml_CyfDcDD3.mjs +1 -0
- package/website/dist/_worker.js/chunks/handlebars_CfpxpWm2.mjs +1 -0
- package/website/dist/_worker.js/chunks/haskell_jUeC5uN5.mjs +1 -0
- package/website/dist/_worker.js/chunks/haxe_B6GxP1WB.mjs +1 -0
- package/website/dist/_worker.js/chunks/hcl_DwoHV2oh.mjs +1 -0
- package/website/dist/_worker.js/chunks/hjson_DV7cJRk4.mjs +1 -0
- package/website/dist/_worker.js/chunks/hlsl_BlFCscPI.mjs +1 -0
- package/website/dist/_worker.js/chunks/houston_COBFG1Mx.mjs +1 -0
- package/website/dist/_worker.js/chunks/html-derivative_C9pJ337h.mjs +1 -0
- package/website/dist/_worker.js/chunks/html_D1OkrZS5.mjs +1 -0
- package/website/dist/_worker.js/chunks/http_DIGXRqvJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/hxml_DEwh9i-c.mjs +1 -0
- package/website/dist/_worker.js/chunks/hy_DDoIgW1K.mjs +1 -0
- package/website/dist/_worker.js/chunks/imba_B00zbHo4.mjs +1 -0
- package/website/dist/_worker.js/chunks/index_C1UTDwYg.mjs +1861 -0
- package/website/dist/_worker.js/chunks/ini_D7XQA_p8.mjs +1 -0
- package/website/dist/_worker.js/chunks/java_B9wdFd8K.mjs +1 -0
- package/website/dist/_worker.js/chunks/javascript_CLsPGOON.mjs +1 -0
- package/website/dist/_worker.js/chunks/jinja_jarBCAN1.mjs +1 -0
- package/website/dist/_worker.js/chunks/jison_oGg3J708.mjs +1 -0
- package/website/dist/_worker.js/chunks/json5_DlZ1Kyaa.mjs +1 -0
- package/website/dist/_worker.js/chunks/json_DaYk_FMp.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsonc_DlwgfSDs.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsonl_BbCCVaZF.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsonnet_Dt-G75xe.mjs +1 -0
- package/website/dist/_worker.js/chunks/jssm_BtKFTj2A.mjs +1 -0
- package/website/dist/_worker.js/chunks/jsx_DDx_xAZ8.mjs +1 -0
- package/website/dist/_worker.js/chunks/julia_CK0lv68l.mjs +1 -0
- package/website/dist/_worker.js/chunks/kanagawa-dragon_BldAK3Oo.mjs +1 -0
- package/website/dist/_worker.js/chunks/kanagawa-lotus_DVM8FX9_.mjs +1 -0
- package/website/dist/_worker.js/chunks/kanagawa-wave_Dpih0AKP.mjs +1 -0
- package/website/dist/_worker.js/chunks/kotlin_kWneB9V_.mjs +1 -0
- package/website/dist/_worker.js/chunks/kusto_BKVATd95.mjs +1 -0
- package/website/dist/_worker.js/chunks/laserwave_BqatxsVl.mjs +1 -0
- package/website/dist/_worker.js/chunks/latex_LVDcGBbc.mjs +1 -0
- package/website/dist/_worker.js/chunks/lean_W7qo-5M2.mjs +1 -0
- package/website/dist/_worker.js/chunks/less_DFNwJnBH.mjs +1 -0
- package/website/dist/_worker.js/chunks/light-plus_Dp0AoWsO.mjs +1 -0
- package/website/dist/_worker.js/chunks/liquid_D24qs0pc.mjs +1 -0
- package/website/dist/_worker.js/chunks/log_IPWMXriF.mjs +1 -0
- package/website/dist/_worker.js/chunks/logo_C6KaatrQ.mjs +1 -0
- package/website/dist/_worker.js/chunks/lua_CwnEf-T7.mjs +1 -0
- package/website/dist/_worker.js/chunks/luau_Br3-CXjS.mjs +1 -0
- package/website/dist/_worker.js/chunks/make_UBNG-kOo.mjs +1 -0
- package/website/dist/_worker.js/chunks/markdown_C7mhJFCm.mjs +1 -0
- package/website/dist/_worker.js/chunks/marko_4tchUvI7.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-darker_SKtaNEPn.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-lighter_zOX_DZCH.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-ocean_BN9WbhdC.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme-palenight_DT_covjH.mjs +1 -0
- package/website/dist/_worker.js/chunks/material-theme_6RpeM3kc.mjs +1 -0
- package/website/dist/_worker.js/chunks/matlab_DCOXsPKR.mjs +1 -0
- package/website/dist/_worker.js/chunks/mdc_B9gb2UFP.mjs +1 -0
- package/website/dist/_worker.js/chunks/mdx_DGU7Nu9u.mjs +1 -0
- package/website/dist/_worker.js/chunks/mermaid_B69URzsZ.mjs +1 -0
- package/website/dist/_worker.js/chunks/min-dark_BgxifOMI.mjs +1 -0
- package/website/dist/_worker.js/chunks/min-light_BrPjXxUp.mjs +1 -0
- package/website/dist/_worker.js/chunks/mipsasm_9U-4_t7k.mjs +1 -0
- package/website/dist/_worker.js/chunks/mojo_B0wt7ug3.mjs +1 -0
- package/website/dist/_worker.js/chunks/monokai_B6Pxpoyi.mjs +1 -0
- package/website/dist/_worker.js/chunks/move_1eid4CyR.mjs +1 -0
- package/website/dist/_worker.js/chunks/narrat_Ds6-p5JZ.mjs +1 -0
- package/website/dist/_worker.js/chunks/nextflow_v2N1Qlqa.mjs +1 -0
- package/website/dist/_worker.js/chunks/nginx_Bp9Ab2NH.mjs +1 -0
- package/website/dist/_worker.js/chunks/night-owl_CdwOw_sc.mjs +1 -0
- package/website/dist/_worker.js/chunks/nim_BXGDUe53.mjs +1 -0
- package/website/dist/_worker.js/chunks/nix_CUig1nJH.mjs +1 -0
- package/website/dist/_worker.js/chunks/noop-middleware_DlWGj5t5.mjs +10 -0
- package/website/dist/_worker.js/chunks/nord_SPoG1iae.mjs +1 -0
- package/website/dist/_worker.js/chunks/nushell_DJw1Lca8.mjs +1 -0
- package/website/dist/_worker.js/chunks/objective-c_Bktzl_CO.mjs +1 -0
- package/website/dist/_worker.js/chunks/objective-cpp_CP4DWdDp.mjs +1 -0
- package/website/dist/_worker.js/chunks/ocaml_CeEAs7bZ.mjs +1 -0
- package/website/dist/_worker.js/chunks/one-dark-pro_-hIwCNMi.mjs +1 -0
- package/website/dist/_worker.js/chunks/one-light_DSmYvJ05.mjs +1 -0
- package/website/dist/_worker.js/chunks/pascal_C-S_Ms_o.mjs +1 -0
- package/website/dist/_worker.js/chunks/perl_CKamvo15.mjs +1 -0
- package/website/dist/_worker.js/chunks/php_BlmcX_F3.mjs +1 -0
- package/website/dist/_worker.js/chunks/plastic_Ryt8tVoA.mjs +1 -0
- package/website/dist/_worker.js/chunks/plsql_Cb3v7cBj.mjs +1 -0
- package/website/dist/_worker.js/chunks/po_DZbdNRlo.mjs +1 -0
- package/website/dist/_worker.js/chunks/poimandres_bYmE3_5d.mjs +1 -0
- package/website/dist/_worker.js/chunks/polar_pJkMGwoW.mjs +1 -0
- package/website/dist/_worker.js/chunks/postcss_BAXSOKgk.mjs +1 -0
- package/website/dist/_worker.js/chunks/powerquery_oITMGN4x.mjs +1 -0
- package/website/dist/_worker.js/chunks/powershell_6306-xIF.mjs +1 -0
- package/website/dist/_worker.js/chunks/prisma_DSDxnZGz.mjs +1 -0
- package/website/dist/_worker.js/chunks/prolog_CxG7tjZR.mjs +1 -0
- package/website/dist/_worker.js/chunks/proto_CS9ByXm1.mjs +1 -0
- package/website/dist/_worker.js/chunks/pug_BMtLJo6U.mjs +1 -0
- package/website/dist/_worker.js/chunks/puppet_BfeeSzee.mjs +1 -0
- package/website/dist/_worker.js/chunks/purescript_BFfueNaH.mjs +1 -0
- package/website/dist/_worker.js/chunks/python_Cc4Faapv.mjs +1 -0
- package/website/dist/_worker.js/chunks/qml_C1CTJTK8.mjs +1 -0
- package/website/dist/_worker.js/chunks/qmldir_nG1KaqKR.mjs +1 -0
- package/website/dist/_worker.js/chunks/qss_Cncxk263.mjs +1 -0
- package/website/dist/_worker.js/chunks/r_ChR54Ihi.mjs +1 -0
- package/website/dist/_worker.js/chunks/racket_BDrhptDs.mjs +1 -0
- package/website/dist/_worker.js/chunks/raku_07OUHa0P.mjs +1 -0
- package/website/dist/_worker.js/chunks/razor_DIP3INLa.mjs +1 -0
- package/website/dist/_worker.js/chunks/red_DOPXfj-6.mjs +1 -0
- package/website/dist/_worker.js/chunks/reg_B64SwEDj.mjs +1 -0
- package/website/dist/_worker.js/chunks/regexp_ButFGoB5.mjs +1 -0
- package/website/dist/_worker.js/chunks/rel_BWJAWqZD.mjs +1 -0
- package/website/dist/_worker.js/chunks/riscv_79gXlbsF.mjs +1 -0
- package/website/dist/_worker.js/chunks/rose-pine-dawn_DHIjVGd3.mjs +1 -0
- package/website/dist/_worker.js/chunks/rose-pine-moon_t86aEbs0.mjs +1 -0
- package/website/dist/_worker.js/chunks/rose-pine_BHgrcDCs.mjs +1 -0
- package/website/dist/_worker.js/chunks/rst_D3F4Fcpj.mjs +1 -0
- package/website/dist/_worker.js/chunks/ruby_Cs7vM9iv.mjs +1 -0
- package/website/dist/_worker.js/chunks/rust_DpyRVatH.mjs +1 -0
- package/website/dist/_worker.js/chunks/sas_DW45xZXN.mjs +1 -0
- package/website/dist/_worker.js/chunks/sass_C6SiMwN_.mjs +1 -0
- package/website/dist/_worker.js/chunks/scala_DlZOjNZk.mjs +1 -0
- package/website/dist/_worker.js/chunks/scheme_D2ezSJXu.mjs +1 -0
- package/website/dist/_worker.js/chunks/scss_DG5Spjqu.mjs +1 -0
- package/website/dist/_worker.js/chunks/sdbl_ZCYaj4VN.mjs +1 -0
- package/website/dist/_worker.js/chunks/shaderlab_CAcRkg1_.mjs +1 -0
- package/website/dist/_worker.js/chunks/shellscript_BWwhkDVh.mjs +1 -0
- package/website/dist/_worker.js/chunks/shellsession_BfEA3juK.mjs +1 -0
- package/website/dist/_worker.js/chunks/slack-dark_CL3lSpCc.mjs +1 -0
- package/website/dist/_worker.js/chunks/slack-ochin_DdZKOQVh.mjs +1 -0
- package/website/dist/_worker.js/chunks/smalltalk_DgilzSui.mjs +1 -0
- package/website/dist/_worker.js/chunks/snazzy-light_eJU08Pz_.mjs +1 -0
- package/website/dist/_worker.js/chunks/solarized-dark_Dg_YQywx.mjs +1 -0
- package/website/dist/_worker.js/chunks/solarized-light_BnIsrA6p.mjs +1 -0
- package/website/dist/_worker.js/chunks/solidity_DkseH8pQ.mjs +1 -0
- package/website/dist/_worker.js/chunks/soy_DU7bOYoG.mjs +1 -0
- package/website/dist/_worker.js/chunks/sparql_BuI1DBDH.mjs +1 -0
- package/website/dist/_worker.js/chunks/splunk_B8Ha9Pkg.mjs +1 -0
- package/website/dist/_worker.js/chunks/sql_BniHwea5.mjs +1 -0
- package/website/dist/_worker.js/chunks/ssh-config_CkE1GuVe.mjs +1 -0
- package/website/dist/_worker.js/chunks/stata_Dtqpbd_l.mjs +1 -0
- package/website/dist/_worker.js/chunks/stylus_CXTtglzO.mjs +1 -0
- package/website/dist/_worker.js/chunks/svelte_BjWYcUCN.mjs +1 -0
- package/website/dist/_worker.js/chunks/swift_BzHql_rM.mjs +1 -0
- package/website/dist/_worker.js/chunks/synthwave-84_DLRNhxNA.mjs +1 -0
- package/website/dist/_worker.js/chunks/system-verilog_ChyInPph.mjs +1 -0
- package/website/dist/_worker.js/chunks/systemd_Bi9Qa2qD.mjs +1 -0
- package/website/dist/_worker.js/chunks/talonscript_B3sH_Y-V.mjs +1 -0
- package/website/dist/_worker.js/chunks/tasl_BJ5yipRs.mjs +1 -0
- package/website/dist/_worker.js/chunks/tcl_CoJQjNoP.mjs +1 -0
- package/website/dist/_worker.js/chunks/templ_CrU7Ffil.mjs +1 -0
- package/website/dist/_worker.js/chunks/terraform_DT9JSFpC.mjs +1 -0
- package/website/dist/_worker.js/chunks/tex_5PKu2yA0.mjs +1 -0
- package/website/dist/_worker.js/chunks/tokyo-night_Buo8OK7-.mjs +1 -0
- package/website/dist/_worker.js/chunks/toml_CPuXX3oc.mjs +1 -0
- package/website/dist/_worker.js/chunks/ts-tags_D0M_1VSH.mjs +1 -0
- package/website/dist/_worker.js/chunks/tsv_CuivVNot.mjs +1 -0
- package/website/dist/_worker.js/chunks/tsx_MkuGr8MY.mjs +1 -0
- package/website/dist/_worker.js/chunks/turtle_BqgEPK7f.mjs +1 -0
- package/website/dist/_worker.js/chunks/twig_r1G9rpYJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/typescript_Au5buqzM.mjs +1 -0
- package/website/dist/_worker.js/chunks/typespec_47rhBK_z.mjs +1 -0
- package/website/dist/_worker.js/chunks/typst_BAtuQLh-.mjs +1 -0
- package/website/dist/_worker.js/chunks/v_BIvWImHg.mjs +1 -0
- package/website/dist/_worker.js/chunks/vala_DYEacj30.mjs +1 -0
- package/website/dist/_worker.js/chunks/vb_CikQuqGJ.mjs +1 -0
- package/website/dist/_worker.js/chunks/verilog_BQRENwI-.mjs +1 -0
- package/website/dist/_worker.js/chunks/vesper_DA0kvTmj.mjs +1 -0
- package/website/dist/_worker.js/chunks/vhdl_DHscJIyg.mjs +1 -0
- package/website/dist/_worker.js/chunks/viml_F2pvMwvG.mjs +1 -0
- package/website/dist/_worker.js/chunks/vitesse-black_D9tjNzd0.mjs +1 -0
- package/website/dist/_worker.js/chunks/vitesse-dark_Bnm5d0hd.mjs +1 -0
- package/website/dist/_worker.js/chunks/vitesse-light_CHwbyjNR.mjs +1 -0
- package/website/dist/_worker.js/chunks/vue-html_DyYtbbMK.mjs +1 -0
- package/website/dist/_worker.js/chunks/vue_DofN6juy.mjs +1 -0
- package/website/dist/_worker.js/chunks/vyper_CiR0m-OV.mjs +1 -0
- package/website/dist/_worker.js/chunks/wasm_CwIGgRGf.mjs +1 -0
- package/website/dist/_worker.js/chunks/wasm_jKWhg0J0.mjs +1 -0
- package/website/dist/_worker.js/chunks/wenyan_DKvVZKXW.mjs +1 -0
- package/website/dist/_worker.js/chunks/wgsl_BOWZY7yw.mjs +1 -0
- package/website/dist/_worker.js/chunks/wikitext_CXDhhHPy.mjs +1 -0
- package/website/dist/_worker.js/chunks/wolfram_ChkmGnW0.mjs +1 -0
- package/website/dist/_worker.js/chunks/xml_DXH3hHIu.mjs +1 -0
- package/website/dist/_worker.js/chunks/xsl_DuP2mFjg.mjs +1 -0
- package/website/dist/_worker.js/chunks/yaml_IGiEkTge.mjs +1 -0
- package/website/dist/_worker.js/chunks/zenscript_59iXGyNw.mjs +1 -0
- package/website/dist/_worker.js/chunks/zig_DKzb0zdT.mjs +1 -0
- package/website/dist/_worker.js/index.js +53 -0
- package/website/dist/_worker.js/manifest_BAAoOzaU.mjs +98 -0
- package/website/dist/_worker.js/pages/_image.astro.mjs +24 -0
- package/website/dist/_worker.js/pages/agents.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/animation.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/api/raw-markdown/_---path_.astro.mjs +44 -0
- package/website/dist/_worker.js/pages/config.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/fonts.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/getting-started.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/helpers.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/images.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/index.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/llm.txt.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/preview.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/sdk.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/sitemap.xml.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/styling.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/templates.astro.mjs +1 -0
- package/website/dist/_worker.js/pages/video.astro.mjs +1 -0
- package/website/dist/_worker.js/renderers.mjs +57 -0
- package/website/dist/agents/index.html +3 -2
- package/website/dist/animation/index.html +402 -128
- package/website/dist/config/index.html +184 -0
- package/website/dist/fonts/index.html +56 -52
- package/website/dist/getting-started/index.html +107 -0
- package/website/dist/helpers/index.html +8 -8
- package/website/dist/images/index.html +50 -23
- package/website/dist/index.html +114 -148
- package/website/dist/llm.txt +751 -1055
- package/website/dist/preview/index.html +111 -0
- package/website/dist/robots.txt +35 -0
- package/website/dist/sdk/index.html +390 -52
- package/website/dist/sitemap.xml +76 -0
- package/website/dist/styling/index.html +10 -7
- package/website/dist/templates/index.html +11 -59
- package/website/dist/video/index.html +106 -537
- package/website/package-lock.json +1077 -17
- package/website/templates/og-image.tsx +61 -0
- package/website/dist/_astro/agents.I1-fN38o.css +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="generator" content="Astro v4.16.19"><link rel="canonical" href="https://loopwind.dev/video/"><!-- Primary Meta Tags --><title></title><meta name="title"><meta name="description" content="CLI-based Image & Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta name="keywords" content="loopwind, image generation, video generation, React, Tailwind CSS, Satori, CLI tool, templates, shadcn/ui, AI agents, Cursor, automation"><meta name="author" content="loopwind"><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://loopwind.dev/video/"><meta property="og:title"><meta property="og:description" content="CLI-based Image & Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta property="og:image" content="https://loopwind.dev/og
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-astro-cid-mw7aashj> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="generator" content="Astro v4.16.19"><link rel="canonical" href="https://loopwind.dev/video/"><!-- Primary Meta Tags --><title></title><meta name="title"><meta name="description" content="CLI-based Image & Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta name="keywords" content="loopwind, image generation, video generation, React, Tailwind CSS, Satori, CLI tool, templates, shadcn/ui, AI agents, Cursor, automation, serverless, WASM, Open Graph, social media, marketing automation"><meta name="author" content="loopwind"><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://loopwind.dev/video/"><meta property="og:title"><meta property="og:description" content="CLI-based Image & Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta property="og:image" content="https://loopwind.dev/api/og/video"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt"><meta property="og:site_name" content="loopwind"><meta property="og:locale" content="en_US"><!-- Twitter --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:url" content="https://loopwind.dev/video/"><meta name="twitter:title"><meta name="twitter:description" content="CLI-based Image & Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta name="twitter:image" content="https://loopwind.dev/api/og/video"><meta name="twitter:image:alt"><meta name="twitter:creator" content="@loopwind"><meta name="twitter:site" content="@loopwind"><!-- Theme Color --><meta name="theme-color" content="#0a0a0a"><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#0a0a0a"><meta name="theme-color" media="(prefers-color-scheme: light)" content="#fafafa"><!-- Additional SEO --><meta name="robots" content="index, follow"><meta name="googlebot" content="index, follow"><meta name="language" content="English"><meta name="revisit-after" content="7 days"><meta name="rating" content="general"><!-- Mobile Web App --><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="loopwind"><!-- Structured Data (JSON-LD) --><script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"loopwind","applicationCategory":"DeveloperApplication","operatingSystem":"Cross-platform","description":"CLI-based Image & Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates.","url":"https://loopwind.dev/","author":{"@type":"Organization","name":"loopwind","url":"https://loopwind.dev/"},"offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"softwareVersion":"0.11.0","releaseNotes":"https://github.com/loopwind/loopwind/releases","screenshot":"https://loopwind.dev/api/og/video","featureList":["Image generation from React templates","Video generation with animations","Tailwind CSS support","shadcn/ui design system","CLI-based workflow","Serverless rendering","TypeScript support","AI Agent friendly"]}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"loopwind","url":"https://loopwind.dev/","logo":"https://loopwind.dev/favicon.svg","sameAs":["https://github.com/loopwind/loopwind","https://www.npmjs.com/package/loopwind"]}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://loopwind.dev/"},{"@type":"ListItem","position":2,"name":"Video","item":"https://loopwind.dev/video"}]}</script><link rel="stylesheet" href="/_astro/agents.Yx-L_igG.css"><script type="module">const p=document.getElementById("mobile-menu-button"),l=document.getElementById("mobile-menu"),g=document.querySelectorAll(".mobile-menu-link");p?.addEventListener("click",()=>{l?.classList.toggle("hidden")});l?.addEventListener("click",o=>{o.target===l&&l.classList.add("hidden")});g.forEach(o=>{o.addEventListener("click",()=>{l?.classList.add("hidden")})});function m(){const o=document.getElementById("toc-nav");if(!o){console.log("TOC: No toc-nav element found");return}const n=document.querySelector("article");if(!n){console.log("TOC: No article element found");return}const c=n.querySelectorAll("h2, h3");if(c.length===0){console.log("TOC: No headings found");return}console.log(`TOC: Found ${c.length} headings`);const a=document.createElement("ul");a.className="space-y-0 text-sm border-l border-border/50",c.forEach(e=>{const t=e.tagName==="H2"?2:3,r=e.id||e.textContent?.toLowerCase().replace(/[^\w]+/g,"-");!e.id&&r&&(e.id=r);const s=document.createElement("li"),d=document.createElement("a");d.href=`#${r}`,d.textContent=e.textContent,d.className=`toc-link block py-1 px-3 -ml-px border-l-2 border-transparent transition-all no-underline ${t===3?"pl-6 text-xs text-muted-foreground/70":"text-sm text-muted-foreground"} hover:text-foreground hover:border-muted-foreground/50`,s.appendChild(d),a.appendChild(s)}),o.appendChild(a);const i=new IntersectionObserver(e=>{e.forEach(t=>{const r=t.target.id,s=o.querySelector(`a[href="#${r}"]`);t.isIntersecting&&(document.querySelectorAll(".toc-link").forEach(d=>{d.classList.remove("text-foreground","border-accent","font-medium")}),s?.classList.add("text-foreground","border-accent","font-medium"))})},{rootMargin:"-100px 0px -66%",threshold:0});c.forEach(e=>{i.observe(e)})}document.addEventListener("DOMContentLoaded",m);document.addEventListener("astro:page-load",m);function u(){const o=document.getElementById("copy-to-llm-btn"),n=document.getElementById("copy-btn-text");if(!o||!n){console.log("Copy to LLM: Button not found on this page");return}console.log("Copy to LLM: Initialized"),o.addEventListener("click",async()=>{const c=window.location.pathname,a=c.replace(/^\//,"").replace(/\/$/,""),e=`/api/raw-markdown/${a===""?"index":a}`;console.log("Copy to LLM clicked: pathname=",c,"apiUrl=",e);try{n.textContent="Copying...";const t=await fetch(e);if(console.log("Response status:",t.status),!t.ok)throw new Error(`HTTP error! status: ${t.status}`);const r=await t.text();console.log("Got markdown, length:",r.length),await navigator.clipboard.writeText(r),n.textContent="Copied!",setTimeout(()=>{n.textContent="Copy to LLM"},2e3)}catch(t){console.error("Copy failed:",t),n.textContent="Failed",setTimeout(()=>{n.textContent="Copy to LLM"},2e3)}})}document.addEventListener("DOMContentLoaded",u);document.addEventListener("astro:page-load",u);
|
|
2
|
+
</script></head> <body class="antialiased" data-astro-cid-mw7aashj> <div class="min-h-screen" data-astro-cid-mw7aashj> <!-- Mobile Header --> <header class="mobile-header fixed top-0 left-0 right-0 h-16 bg-card border-b border-border z-50 md:hidden" data-astro-cid-mw7aashj> <div class="flex items-center justify-between h-full px-4" data-astro-cid-mw7aashj> <a href="/" class="no-underline"> <h1 class="text-xl flex items-center gap-2 bg-linear-to-r from-brand-from to-brand-to bg-clip-text text-transparent"> <span class="text-2xl">➰</span> <span>loopwind</span> </h1> </a> <button id="mobile-menu-button" class="p-2 text-foreground hover:bg-accent rounded-md transition-colors" aria-label="Toggle menu" data-astro-cid-mw7aashj> <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-mw7aashj> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" data-astro-cid-mw7aashj></path> </svg> </button> </div> </header> <!-- Mobile Menu Overlay --> <div id="mobile-menu" class="mobile-menu fixed inset-0 bg-background/80 backdrop-blur-sm z-40 md:hidden hidden" data-astro-cid-mw7aashj> <div class="fixed top-0 left-0 h-screen w-64 bg-card border-r border-border overflow-y-auto" data-astro-cid-mw7aashj> <div class="p-6 pt-20" data-astro-cid-mw7aashj> <nav data-astro-cid-mw7aashj> <ul class="space-y-1" data-astro-cid-mw7aashj> <li data-astro-cid-mw7aashj> <a href="/" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Home </a> </li><li data-astro-cid-mw7aashj> <a href="/getting-started" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Getting Started </a> </li><li data-astro-cid-mw7aashj> <a href="/templates" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Templates </a> </li><li data-astro-cid-mw7aashj> <a href="/images" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Images </a> </li><li data-astro-cid-mw7aashj> <a href="/video" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Video </a> </li><li data-astro-cid-mw7aashj> <a href="/preview" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Preview </a> </li><li data-astro-cid-mw7aashj> <a href="/animation" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Animation </a> </li><li data-astro-cid-mw7aashj> <a href="/helpers" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Helpers </a> </li><li data-astro-cid-mw7aashj> <a href="/styling" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Styling </a> </li><li data-astro-cid-mw7aashj> <a href="/fonts" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Fonts </a> </li><li data-astro-cid-mw7aashj> <a href="/config" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> loopwind.json </a> </li><li data-astro-cid-mw7aashj> <a href="/sdk" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> SDK </a> </li><li data-astro-cid-mw7aashj> <a href="/agents" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Use with AI Agents </a> </li><li data-astro-cid-mw7aashj> <a href="/llm.txt" class="mobile-menu-link block px-3 py-2 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> llm.txt ⇱ </a> </li> </ul> </nav> </div> </div> </div> <!-- Desktop Sidebar --> <aside class="desktop-sidebar fixed top-0 left-0 h-screen w-64 border-r border-border bg-card overflow-y-auto z-10" data-astro-cid-mw7aashj> <div class="p-6" data-astro-cid-mw7aashj> <div class="block mb-3" data-astro-cid-mw7aashj> <a href="/" class="no-underline"> <h1 class="text-3xl flex items-center gap-2 bg-linear-to-r from-brand-from to-brand-to bg-clip-text text-transparent"> <span class="text-4xl">➰</span> <span>loopwind</span> </h1> </a> </div> <nav data-astro-cid-mw7aashj> <ul class="space-y-0" data-astro-cid-mw7aashj> <li data-astro-cid-mw7aashj> <a href="/" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Home </a> </li><li data-astro-cid-mw7aashj> <a href="/getting-started" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Getting Started </a> </li><li data-astro-cid-mw7aashj> <a href="/templates" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Templates </a> </li><li data-astro-cid-mw7aashj> <a href="/images" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Images </a> </li><li data-astro-cid-mw7aashj> <a href="/video" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Video </a> </li><li data-astro-cid-mw7aashj> <a href="/preview" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Preview </a> </li><li data-astro-cid-mw7aashj> <a href="/animation" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Animation </a> </li><li data-astro-cid-mw7aashj> <a href="/helpers" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Helpers </a> </li><li data-astro-cid-mw7aashj> <a href="/styling" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Styling </a> </li><li data-astro-cid-mw7aashj> <a href="/fonts" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Fonts </a> </li><li data-astro-cid-mw7aashj> <a href="/config" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> loopwind.json </a> </li><li data-astro-cid-mw7aashj> <a href="/sdk" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> SDK </a> </li><li data-astro-cid-mw7aashj> <a href="/agents" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> Use with AI Agents </a> </li><li data-astro-cid-mw7aashj> <a href="/llm.txt" class="block px-3 py-1.5 rounded-md text-sm transition-colors no-underline text-muted-foreground hover:text-foreground hover:bg-accent/50" data-astro-cid-mw7aashj> llm.txt ⇱ </a> </li> </ul> </nav> </div> </aside> <!-- Main content --> <main class="ml-64 mr-64" data-astro-cid-mw7aashj> <div class="p-12" data-astro-cid-mw7aashj> <button id="copy-to-llm-btn" class="mb-6 px-4 py-2 bg-accent hover:bg-accent/80 text-accent-foreground rounded-md text-sm font-medium transition-colors flex items-center gap-2" aria-label="Copy raw markdown to clipboard" data-astro-cid-mw7aashj> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-mw7aashj> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" data-astro-cid-mw7aashj></path> </svg> <span id="copy-btn-text" data-astro-cid-mw7aashj>Copy to LLM</span> </button> <article class="prose prose-invert max-w-4xl" data-astro-cid-mw7aashj> <h1 id="video-rendering">Video Rendering</h1>
|
|
2
3
|
<p>Create animated videos programmatically using React components. Perfect for automated video generation, social media content, and dynamic animations.</p>
|
|
3
4
|
<h2 id="quick-start">Quick Start</h2>
|
|
4
5
|
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#6A737D"># Render a video template with inline props</span></span>
|
|
@@ -16,31 +17,19 @@
|
|
|
16
17
|
<span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> const</span><span style="color:#79B8FF"> meta</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> {</span></span>
|
|
17
18
|
<span class="line"><span style="color:#E1E4E8"> name: </span><span style="color:#9ECBFF">"video-intro"</span><span style="color:#E1E4E8">,</span></span>
|
|
18
19
|
<span class="line"><span style="color:#E1E4E8"> type: </span><span style="color:#9ECBFF">"video"</span><span style="color:#E1E4E8">,</span></span>
|
|
19
|
-
<span class="line"><span style="color:#E1E4E8"> description: </span><span style="color:#9ECBFF">"Animated intro with
|
|
20
|
+
<span class="line"><span style="color:#E1E4E8"> description: </span><span style="color:#9ECBFF">"Animated intro with bounce-in title"</span><span style="color:#E1E4E8">,</span></span>
|
|
20
21
|
<span class="line"><span style="color:#E1E4E8"> size: { width: </span><span style="color:#79B8FF">1920</span><span style="color:#E1E4E8">, height: </span><span style="color:#79B8FF">1080</span><span style="color:#E1E4E8"> },</span></span>
|
|
21
22
|
<span class="line"><span style="color:#E1E4E8"> video: { fps: </span><span style="color:#79B8FF">30</span><span style="color:#E1E4E8">, duration: </span><span style="color:#79B8FF">3</span><span style="color:#E1E4E8"> },</span></span>
|
|
22
23
|
<span class="line"><span style="color:#E1E4E8"> props: { title: </span><span style="color:#9ECBFF">"string"</span><span style="color:#E1E4E8"> }</span></span>
|
|
23
24
|
<span class="line"><span style="color:#E1E4E8">};</span></span>
|
|
24
25
|
<span class="line"></span>
|
|
25
|
-
<span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> VideoIntro</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8"
|
|
26
|
-
<span class="line"><span style="color:#6A737D"> // Animate opacity based on progress</span></span>
|
|
27
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> titleOpacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583"><</span><span style="color:#79B8FF"> 0.3</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.3</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">;</span></span>
|
|
28
|
-
<span class="line"></span>
|
|
26
|
+
<span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> VideoIntro</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
29
27
|
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
30
28
|
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex items-center justify-center w-full h-full bg-gradient-to-br from-blue-600 to-purple-700'</span><span style="color:#E1E4E8">)}></span></span>
|
|
31
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
32
|
-
<span class="line"><span style="color:#B392F0">
|
|
33
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-8xl font-bold text-white'</span><span style="color:#E1E4E8">),</span></span>
|
|
34
|
-
<span class="line"><span style="color:#E1E4E8"> opacity: titleOpacity</span></span>
|
|
35
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
36
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
29
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Bounce in from below at start */</span><span style="color:#E1E4E8">}</span></span>
|
|
30
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h1</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-8xl font-bold text-white ease-out enter-bounce-in-up/0/600'</span><span style="color:#E1E4E8">)}></span></span>
|
|
37
31
|
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
38
32
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
|
|
39
|
-
<span class="line"></span>
|
|
40
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Show frame counter */</span><span style="color:#E1E4E8">}</span></span>
|
|
41
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute bottom-10 right-10 text-white text-sm'</span><span style="color:#E1E4E8">)}></span></span>
|
|
42
|
-
<span class="line"><span style="color:#E1E4E8"> Frame: {frame}</span></span>
|
|
43
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
44
33
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
45
34
|
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
46
35
|
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
@@ -50,507 +39,73 @@
|
|
|
50
39
|
<span class="line"><span style="color:#79B8FF"> "title"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Welcome!"</span></span>
|
|
51
40
|
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
52
41
|
<span class="line"></span></code></pre>
|
|
53
|
-
<h2 id="
|
|
54
|
-
<p>
|
|
55
|
-
<
|
|
56
|
-
<
|
|
57
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> MyVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">frame</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
58
|
-
<span class="line"><span style="color:#6A737D"> // Frame 0, 1, 2, 3, ... 89 (for 3s @ 30fps)</span></span>
|
|
59
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">>Frame: {frame}</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">>;</span></span>
|
|
60
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
61
|
-
<span class="line"></span></code></pre>
|
|
62
|
-
<h3 id="progress"><code>progress</code></h3>
|
|
63
|
-
<p>Animation progress from 0 to 1</p>
|
|
64
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> MyVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
65
|
-
<span class="line"><span style="color:#6A737D"> // 0.0 at start, 0.5 at middle, 1.0 at end</span></span>
|
|
66
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> x</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 100</span><span style="color:#E1E4E8">; </span><span style="color:#6A737D">// Move from 0 to 100</span></span>
|
|
67
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
68
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
69
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ transform: </span><span style="color:#9ECBFF">`translateX(${</span><span style="color:#E1E4E8">x</span><span style="color:#9ECBFF">}px)`</span><span style="color:#E1E4E8"> }}></span></span>
|
|
70
|
-
<span class="line"><span style="color:#E1E4E8"> Moving element</span></span>
|
|
71
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
72
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
73
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
74
|
-
<span class="line"></span></code></pre>
|
|
75
|
-
<h2 id="animation-patterns">Animation Patterns</h2>
|
|
76
|
-
<h3 id="pulse-animation">Pulse Animation</h3>
|
|
77
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> PulseVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
42
|
+
<h2 id="animation">Animation</h2>
|
|
43
|
+
<p>loopwind provides <strong>Tailwind-style animation classes</strong> for creating smooth video animations without writing custom code.</p>
|
|
44
|
+
<p>Use declarative animation classes with millisecond-based timing:</p>
|
|
45
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> AnimatedIntro</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">subtitle</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
78
46
|
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
79
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex items-center justify-center w-full h-full bg-
|
|
80
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
47
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex flex-col items-center justify-center w-full h-full bg-gradient-to-br from-blue-600 to-purple-700'</span><span style="color:#E1E4E8">)}></span></span>
|
|
48
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Bounce in from below: starts at 0ms, lasts 400ms */</span><span style="color:#E1E4E8">}</span></span>
|
|
49
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h1</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-8xl font-bold text-white ease-out enter-bounce-in-up/0/400'</span><span style="color:#E1E4E8">)}></span></span>
|
|
81
50
|
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
82
51
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
|
|
52
|
+
<span class="line"></span>
|
|
53
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Fade in with upward motion: starts at 300ms, lasts 400ms */</span><span style="color:#E1E4E8">}</span></span>
|
|
54
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">p</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-2xl text-white/80 mt-4 ease-out enter-fade-in-up/300/400'</span><span style="color:#E1E4E8">)}></span></span>
|
|
55
|
+
<span class="line"><span style="color:#E1E4E8"> {subtitle}</span></span>
|
|
56
|
+
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
|
|
83
57
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
84
58
|
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
85
59
|
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
86
60
|
<span class="line"></span></code></pre>
|
|
87
|
-
<h3 id="
|
|
88
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#
|
|
89
|
-
<span class="line"><span style="color:#F97583">
|
|
90
|
-
<span class="line"><span style="color:#E1E4E8"
|
|
91
|
-
<span class="line"
|
|
92
|
-
<span class="line"><span style="color:#
|
|
93
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
94
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
95
|
-
<span class="line"
|
|
96
|
-
<span class="line"></span
|
|
97
|
-
<
|
|
98
|
-
<
|
|
99
|
-
<span class="line"
|
|
100
|
-
<span class="line"><span style="color:#
|
|
101
|
-
<span class="line"><span style="color:#E1E4E8"
|
|
102
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
103
|
-
<span class="line"
|
|
104
|
-
<
|
|
105
|
-
<
|
|
106
|
-
<span class="line"><span style="color:#
|
|
107
|
-
<span class="line"></span
|
|
108
|
-
<
|
|
109
|
-
<
|
|
110
|
-
<span class="line"
|
|
111
|
-
<span class="line"><span style="color:#
|
|
112
|
-
<span class="line"><span style="color:#
|
|
113
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
114
|
-
<span class="line"><span style="color:#E1E4E8"
|
|
115
|
-
<span class="line"
|
|
116
|
-
<
|
|
117
|
-
<
|
|
118
|
-
<
|
|
119
|
-
<span class="line"><span style="color:#
|
|
120
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
121
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
122
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
123
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
124
|
-
<span class="line"></span></code></pre>
|
|
125
|
-
<h3 id="slide-in">Slide In</h3>
|
|
126
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> SlideVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
127
|
-
<span class="line"><span style="color:#6A737D"> // Slide in from left</span></span>
|
|
128
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> x</span><span style="color:#F97583"> =</span><span style="color:#F97583"> -</span><span style="color:#79B8FF">100</span><span style="color:#F97583"> +</span><span style="color:#E1E4E8"> (progress </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 100</span><span style="color:#E1E4E8">); </span><span style="color:#6A737D">// -100 to 0</span></span>
|
|
129
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
130
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
131
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ </span></span>
|
|
132
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-4xl font-bold'</span><span style="color:#E1E4E8">),</span></span>
|
|
133
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`translateX(${</span><span style="color:#E1E4E8">x</span><span style="color:#9ECBFF">}%)`</span></span>
|
|
134
|
-
<span class="line"><span style="color:#E1E4E8"> }}></span></span>
|
|
135
|
-
<span class="line"><span style="color:#E1E4E8"> Sliding Text</span></span>
|
|
136
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
137
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
138
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
139
|
-
<span class="line"></span></code></pre>
|
|
140
|
-
<h3 id="scale-animation">Scale Animation</h3>
|
|
141
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> ScaleVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
142
|
-
<span class="line"><span style="color:#6A737D"> // Scale from 0 to 1</span></span>
|
|
143
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> scale</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress;</span></span>
|
|
61
|
+
<h3 id="common-animation-patterns">Common Animation Patterns</h3>
|
|
62
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#6A737D">// Fade animations</span></span>
|
|
63
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-fade-in/0/500'</span><span style="color:#E1E4E8">)}>Fade in</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
64
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-fade-in-up/0/600'</span><span style="color:#E1E4E8">)}>Fade in with slide</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
65
|
+
<span class="line"></span>
|
|
66
|
+
<span class="line"><span style="color:#6A737D">// Slide animations</span></span>
|
|
67
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-slide-left/0/500'</span><span style="color:#E1E4E8">)}>Slide from left</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
68
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'exit-slide-up/2500/500'</span><span style="color:#E1E4E8">)}>Slide out up</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
69
|
+
<span class="line"></span>
|
|
70
|
+
<span class="line"><span style="color:#6A737D">// Bounce and scale</span></span>
|
|
71
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-bounce-in/0/500'</span><span style="color:#E1E4E8">)}>Bouncy entrance</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
72
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-scale-in/0/400'</span><span style="color:#E1E4E8">)}>Scale up</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
73
|
+
<span class="line"></span>
|
|
74
|
+
<span class="line"><span style="color:#6A737D">// Loop animations (continuous)</span></span>
|
|
75
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'loop-float/1000'</span><span style="color:#E1E4E8">)}>Continuous floating</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
76
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'loop-pulse/800'</span><span style="color:#E1E4E8">)}>Pulsing effect</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
77
|
+
<span class="line"></span></code></pre>
|
|
78
|
+
<h3 id="utility-based-animations">Utility-Based Animations</h3>
|
|
79
|
+
<p>Animate any transform or opacity property directly:</p>
|
|
80
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#6A737D">// Translate, rotate, scale</span></span>
|
|
81
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-translate-x-5/0/500'</span><span style="color:#E1E4E8">)}>Slide 20px from left</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
82
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-rotate-90/0/800'</span><span style="color:#E1E4E8">)}>Rotate 90 degrees</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
83
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-scale-100/0/500'</span><span style="color:#E1E4E8">)}>Scale from 0 to 100%</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
84
|
+
<span class="line"></span>
|
|
85
|
+
<span class="line"><span style="color:#6A737D">// Combine multiple animations</span></span>
|
|
86
|
+
<span class="line"><span style="color:#E1E4E8"><</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'enter-translate-y-10/0/500 enter-rotate-45/0/500'</span><span style="color:#E1E4E8">)}></span></span>
|
|
87
|
+
<span class="line"><span style="color:#E1E4E8"> Fly and spin</span></span>
|
|
88
|
+
<span class="line"><span style="color:#E1E4E8"></</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
89
|
+
<span class="line"></span></code></pre>
|
|
90
|
+
<p><strong>See the full <a href="/animation">Animation documentation</a></strong> for all animation classes, easing functions, staggered animations, and advanced patterns.</p>
|
|
91
|
+
<h3 id="programmatic-animations">Programmatic Animations</h3>
|
|
92
|
+
<p>For complex custom animations, use the <code>progress</code> prop directly:</p>
|
|
93
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> CustomAnimation</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
94
|
+
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> opacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583"><</span><span style="color:#79B8FF"> 0.3</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.3</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">;</span></span>
|
|
95
|
+
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> scale</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> 0.8</span><span style="color:#F97583"> +</span><span style="color:#E1E4E8"> (progress </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 0.2</span><span style="color:#E1E4E8">);</span></span>
|
|
144
96
|
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
145
97
|
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
146
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">
|
|
147
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-
|
|
98
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h1</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
99
|
+
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-8xl font-bold text-white'</span><span style="color:#E1E4E8">),</span></span>
|
|
100
|
+
<span class="line"><span style="color:#E1E4E8"> opacity,</span></span>
|
|
148
101
|
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`scale(${</span><span style="color:#E1E4E8">scale</span><span style="color:#9ECBFF">})`</span></span>
|
|
149
102
|
<span class="line"><span style="color:#E1E4E8"> }}></span></span>
|
|
150
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
151
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">
|
|
152
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
153
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
154
|
-
<span class="line"></span></code></pre>
|
|
155
|
-
<h3 id="progress-based-rotation">Progress-Based Rotation</h3>
|
|
156
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> RotateVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
157
|
-
<span class="line"><span style="color:#6A737D"> // Rotate 360 degrees based on progress</span></span>
|
|
158
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> rotation</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 360</span><span style="color:#E1E4E8">;</span></span>
|
|
159
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
160
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
161
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex items-center justify-center w-full h-full bg-gray-900'</span><span style="color:#E1E4E8">)}></span></span>
|
|
162
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ </span></span>
|
|
163
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-32 h-32 bg-blue-500 rounded-lg'</span><span style="color:#E1E4E8">),</span></span>
|
|
164
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`rotate(${</span><span style="color:#E1E4E8">rotation</span><span style="color:#9ECBFF">}deg)`</span></span>
|
|
165
|
-
<span class="line"><span style="color:#E1E4E8"> }}></span></span>
|
|
166
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
167
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
168
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
169
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
170
|
-
<span class="line"></span></code></pre>
|
|
171
|
-
<h3 id="using-tailwind-animations">Using Tailwind Animations</h3>
|
|
172
|
-
<p>Combine Tailwind’s built-in animations with progress-based animations:</p>
|
|
173
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> PulsingLogo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">image</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">logo</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
174
|
-
<span class="line"><span style="color:#6A737D"> // Fade in based on progress</span></span>
|
|
175
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> opacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> Math.</span><span style="color:#B392F0">min</span><span style="color:#E1E4E8">(progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.3</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">);</span></span>
|
|
176
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
177
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
178
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex items-center justify-center w-full h-full bg-gray-900'</span><span style="color:#E1E4E8">)}></span></span>
|
|
179
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Tailwind's animate-pulse + custom opacity */</span><span style="color:#E1E4E8">}</span></span>
|
|
180
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ </span><span style="color:#F97583">...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'animate-pulse'</span><span style="color:#E1E4E8">), opacity }}></span></span>
|
|
181
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(logo)} </span><span style="color:#B392F0">style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-64 h-64'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
182
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
183
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
184
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
185
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
186
|
-
<span class="line"></span></code></pre>
|
|
187
|
-
<p><strong>Available Tailwind animations:</strong></p>
|
|
188
|
-
<ul>
|
|
189
|
-
<li><code>animate-spin</code> - Continuous rotation</li>
|
|
190
|
-
<li><code>animate-pulse</code> - Subtle fade in/out</li>
|
|
191
|
-
<li><code>animate-bounce</code> - Bouncing motion</li>
|
|
192
|
-
<li><code>animate-ping</code> - Ripple effect (great for badges)</li>
|
|
193
|
-
</ul>
|
|
194
|
-
<p><strong>Example with multiple animations:</strong></p>
|
|
195
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> NotificationVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
196
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> slideX</span><span style="color:#F97583"> =</span><span style="color:#F97583"> -</span><span style="color:#79B8FF">100</span><span style="color:#F97583"> +</span><span style="color:#E1E4E8"> (progress </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 100</span><span style="color:#E1E4E8">); </span><span style="color:#6A737D">// Slide in from left</span></span>
|
|
197
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
198
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
199
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex items-center justify-center w-full h-full bg-gradient-to-br from-purple-600 to-blue-600'</span><span style="color:#E1E4E8">)}></span></span>
|
|
200
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8"> </span></span>
|
|
201
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
202
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex items-center gap-4 bg-white rounded-2xl p-6 shadow-2xl'</span><span style="color:#E1E4E8">),</span></span>
|
|
203
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`translateX(${</span><span style="color:#E1E4E8">slideX</span><span style="color:#9ECBFF">}%)`</span></span>
|
|
204
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
205
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
206
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Pinging indicator */</span><span style="color:#E1E4E8">}</span></span>
|
|
207
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative'</span><span style="color:#E1E4E8">)}></span></span>
|
|
208
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-3 h-3 bg-green-500 rounded-full animate-ping absolute'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
209
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-3 h-3 bg-green-500 rounded-full'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
210
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
211
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
212
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
213
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h2</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-2xl font-bold text-gray-900'</span><span style="color:#E1E4E8">)}>{title}</</span><span style="color:#85E89D">h2</span><span style="color:#E1E4E8">></span></span>
|
|
214
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">p</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-gray-600'</span><span style="color:#E1E4E8">)}>New notification</</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
|
|
215
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
216
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
217
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
218
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
219
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
220
|
-
<span class="line"></span></code></pre>
|
|
221
|
-
<h3 id="easing-functions">Easing Functions</h3>
|
|
222
|
-
<p>Create smooth animations with easing:</p>
|
|
223
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">function</span><span style="color:#B392F0"> easeOutCubic</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">t</span><span style="color:#E1E4E8">) {</span></span>
|
|
224
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#79B8FF"> 1</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8"> Math.</span><span style="color:#B392F0">pow</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">1</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8"> t, </span><span style="color:#79B8FF">3</span><span style="color:#E1E4E8">);</span></span>
|
|
225
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
226
|
-
<span class="line"></span>
|
|
227
|
-
<span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> EasedVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
228
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> easedProgress</span><span style="color:#F97583"> =</span><span style="color:#B392F0"> easeOutCubic</span><span style="color:#E1E4E8">(progress);</span></span>
|
|
229
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> x</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> easedProgress </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 100</span><span style="color:#E1E4E8">;</span></span>
|
|
230
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
231
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
232
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ transform: </span><span style="color:#9ECBFF">`translateX(${</span><span style="color:#E1E4E8">x</span><span style="color:#9ECBFF">}px)`</span><span style="color:#E1E4E8"> }}></span></span>
|
|
233
|
-
<span class="line"><span style="color:#E1E4E8"> Smooth animation</span></span>
|
|
234
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
235
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
236
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
237
|
-
<span class="line"></span></code></pre>
|
|
238
|
-
<h2 id="embedding-videos">Embedding Videos</h2>
|
|
239
|
-
<p>Use the <code>video()</code> helper to embed video backgrounds that auto-sync with your animation.</p>
|
|
240
|
-
<h3 id="basic-usage">Basic Usage</h3>
|
|
241
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> VideoOverlay</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">video</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">background</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
242
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
243
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative w-full h-full'</span><span style="color:#E1E4E8">)}></span></span>
|
|
244
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Background video - automatically synced to current frame */</span><span style="color:#E1E4E8">}</span></span>
|
|
245
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
246
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">video</span><span style="color:#E1E4E8">(background)} </span></span>
|
|
247
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 w-full h-full object-cover'</span><span style="color:#E1E4E8">)}</span></span>
|
|
248
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
249
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
250
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Text overlay */</span><span style="color:#E1E4E8">}</span></span>
|
|
251
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative z-10 flex items-center justify-center w-full h-full'</span><span style="color:#E1E4E8">)}></span></span>
|
|
252
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h1</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-7xl font-bold text-white drop-shadow-lg'</span><span style="color:#E1E4E8">)}></span></span>
|
|
253
|
-
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
254
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
|
|
255
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
256
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
257
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
258
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
259
|
-
<span class="line"></span></code></pre>
|
|
260
|
-
<p><strong>Props:</strong></p>
|
|
261
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
|
|
262
|
-
<span class="line"><span style="color:#79B8FF"> "title"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Amazing Video"</span><span style="color:#E1E4E8">,</span></span>
|
|
263
|
-
<span class="line"><span style="color:#79B8FF"> "background"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./footage/background.mp4"</span></span>
|
|
264
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
265
|
-
<span class="line"></span></code></pre>
|
|
266
|
-
<h3 id="how-video-sync-works">How Video Sync Works</h3>
|
|
267
|
-
<ol>
|
|
268
|
-
<li><strong>First pass</strong>: Template calls <code>video()</code> to register needed videos</li>
|
|
269
|
-
<li><strong>Pre-processing</strong>: loopwind extracts all frames at template’s FPS</li>
|
|
270
|
-
<li><strong>Rendering</strong>: Each frame uses the corresponding video frame</li>
|
|
271
|
-
<li><strong>Caching</strong>: Frames are cached in memory for fast access</li>
|
|
272
|
-
</ol>
|
|
273
|
-
<h3 id="animated-overlay-example">Animated Overlay Example</h3>
|
|
274
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> VideoWithText</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">video</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">frame</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">clip</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
275
|
-
<span class="line"><span style="color:#6A737D"> // Fade in title</span></span>
|
|
276
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> titleOpacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583"><</span><span style="color:#79B8FF"> 0.2</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.2</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">;</span></span>
|
|
277
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
278
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
279
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative w-full h-full'</span><span style="color:#E1E4E8">)}></span></span>
|
|
280
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Synced video background */</span><span style="color:#E1E4E8">}</span></span>
|
|
281
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
282
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">video</span><span style="color:#E1E4E8">(clip)} </span></span>
|
|
283
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 w-full h-full object-cover'</span><span style="color:#E1E4E8">)}</span></span>
|
|
284
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
285
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
286
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Dark overlay */</span><span style="color:#E1E4E8">}</span></span>
|
|
287
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 bg-black/40'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
288
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
289
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Animated title */</span><span style="color:#E1E4E8">}</span></span>
|
|
290
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative z-10 flex items-center justify-center w-full h-full'</span><span style="color:#E1E4E8">)}></span></span>
|
|
291
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8"> </span></span>
|
|
292
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
293
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-8xl font-bold text-white text-center'</span><span style="color:#E1E4E8">),</span></span>
|
|
294
|
-
<span class="line"><span style="color:#E1E4E8"> opacity: titleOpacity</span></span>
|
|
295
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
296
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
297
|
-
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
298
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
|
|
299
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
300
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
301
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Frame counter */</span><span style="color:#E1E4E8">}</span></span>
|
|
302
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute bottom-4 right-4 text-white text-sm bg-black/50 px-3 py-1 rounded'</span><span style="color:#E1E4E8">)}></span></span>
|
|
303
|
-
<span class="line"><span style="color:#E1E4E8"> {frame} / {Math.</span><span style="color:#B392F0">floor</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">3</span><span style="color:#F97583"> *</span><span style="color:#79B8FF"> 30</span><span style="color:#E1E4E8">)}</span></span>
|
|
304
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
305
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
306
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
307
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
308
|
-
<span class="line"></span></code></pre>
|
|
309
|
-
<h2 id="combining-videos-and-images">Combining Videos and Images</h2>
|
|
310
|
-
<p>Use both <code>video()</code> and <code>image()</code> helpers together to create rich, branded video content.</p>
|
|
311
|
-
<h3 id="video-background-with-logo">Video Background with Logo</h3>
|
|
312
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> BrandedVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">video</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">image</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">background</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">logo</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
313
|
-
<span class="line"><span style="color:#6A737D"> // Logo slides in from top</span></span>
|
|
314
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> logoY</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583"><</span><span style="color:#79B8FF"> 0.3</span><span style="color:#F97583"> ?</span><span style="color:#F97583"> -</span><span style="color:#79B8FF">100</span><span style="color:#F97583"> +</span><span style="color:#E1E4E8"> (progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.3</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 100</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 0</span><span style="color:#E1E4E8">;</span></span>
|
|
315
|
-
<span class="line"><span style="color:#6A737D"> // Title fades in after logo</span></span>
|
|
316
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> titleOpacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">></span><span style="color:#79B8FF"> 0.3</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> Math.</span><span style="color:#B392F0">min</span><span style="color:#E1E4E8">((progress </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 0.3</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.3</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">:</span><span style="color:#79B8FF"> 0</span><span style="color:#E1E4E8">;</span></span>
|
|
317
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
318
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
319
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative w-full h-full'</span><span style="color:#E1E4E8">)}></span></span>
|
|
320
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Video background */</span><span style="color:#E1E4E8">}</span></span>
|
|
321
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
322
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">video</span><span style="color:#E1E4E8">(background)} </span></span>
|
|
323
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 w-full h-full object-cover'</span><span style="color:#E1E4E8">)}</span></span>
|
|
324
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
325
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
326
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Gradient overlay */</span><span style="color:#E1E4E8">}</span></span>
|
|
327
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 bg-gradient-to-t from-black/80 to-transparent'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
328
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
329
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Animated logo */</span><span style="color:#E1E4E8">}</span></span>
|
|
330
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8"> </span></span>
|
|
331
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
332
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute top-12 left-12'</span><span style="color:#E1E4E8">),</span></span>
|
|
333
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`translateY(${</span><span style="color:#E1E4E8">logoY</span><span style="color:#9ECBFF">}px)`</span></span>
|
|
334
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
335
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
336
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
337
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(logo)} </span></span>
|
|
338
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'h-16 w-auto'</span><span style="color:#E1E4E8">)}</span></span>
|
|
339
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
340
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
341
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
342
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Animated title */</span><span style="color:#E1E4E8">}</span></span>
|
|
343
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute bottom-20 left-12 right-12'</span><span style="color:#E1E4E8">)}></span></span>
|
|
344
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8"> </span></span>
|
|
345
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
346
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-7xl font-bold text-white'</span><span style="color:#E1E4E8">),</span></span>
|
|
347
|
-
<span class="line"><span style="color:#E1E4E8"> opacity: titleOpacity</span></span>
|
|
348
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
349
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
350
|
-
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
351
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
|
|
352
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
353
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
354
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
355
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
356
|
-
<span class="line"></span></code></pre>
|
|
357
|
-
<p><strong>Props:</strong></p>
|
|
358
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
|
|
359
|
-
<span class="line"><span style="color:#79B8FF"> "title"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Introducing Our New Product"</span><span style="color:#E1E4E8">,</span></span>
|
|
360
|
-
<span class="line"><span style="color:#79B8FF"> "background"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./footage/product-demo.mp4"</span><span style="color:#E1E4E8">,</span></span>
|
|
361
|
-
<span class="line"><span style="color:#79B8FF"> "logo"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./images/company-logo.png"</span></span>
|
|
362
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
363
|
-
<span class="line"></span></code></pre>
|
|
364
|
-
<h3 id="multi-element-video-composition">Multi-Element Video Composition</h3>
|
|
365
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> ProductShowcase</span><span style="color:#E1E4E8">({ </span></span>
|
|
366
|
-
<span class="line"><span style="color:#FFAB70"> tw</span><span style="color:#E1E4E8">, </span></span>
|
|
367
|
-
<span class="line"><span style="color:#FFAB70"> video</span><span style="color:#E1E4E8">, </span></span>
|
|
368
|
-
<span class="line"><span style="color:#FFAB70"> image</span><span style="color:#E1E4E8">, </span></span>
|
|
369
|
-
<span class="line"><span style="color:#FFAB70"> progress</span><span style="color:#E1E4E8">, </span></span>
|
|
370
|
-
<span class="line"><span style="color:#FFAB70"> backgroundVideo</span><span style="color:#E1E4E8">,</span></span>
|
|
371
|
-
<span class="line"><span style="color:#FFAB70"> productImage</span><span style="color:#E1E4E8">,</span></span>
|
|
372
|
-
<span class="line"><span style="color:#FFAB70"> badge</span><span style="color:#E1E4E8">,</span></span>
|
|
373
|
-
<span class="line"><span style="color:#FFAB70"> title</span><span style="color:#E1E4E8">,</span></span>
|
|
374
|
-
<span class="line"><span style="color:#FFAB70"> price</span><span style="color:#E1E4E8"> </span></span>
|
|
375
|
-
<span class="line"><span style="color:#E1E4E8">}) {</span></span>
|
|
376
|
-
<span class="line"><span style="color:#6A737D"> // Product image zooms in</span></span>
|
|
377
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> scale</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> 0.8</span><span style="color:#F97583"> +</span><span style="color:#E1E4E8"> (Math.</span><span style="color:#B392F0">min</span><span style="color:#E1E4E8">(progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.5</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 0.2</span><span style="color:#E1E4E8">); </span><span style="color:#6A737D">// 0.8 to 1.0</span></span>
|
|
378
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
379
|
-
<span class="line"><span style="color:#6A737D"> // Badge rotates in</span></span>
|
|
380
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> badgeRotation</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583"><</span><span style="color:#79B8FF"> 0.4</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> (progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.4</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 360</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 360</span><span style="color:#E1E4E8">;</span></span>
|
|
381
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> badgeOpacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> Math.</span><span style="color:#B392F0">min</span><span style="color:#E1E4E8">(progress </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.4</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">);</span></span>
|
|
382
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
383
|
-
<span class="line"><span style="color:#6A737D"> // Price slides up</span></span>
|
|
384
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> priceY</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">></span><span style="color:#79B8FF"> 0.6</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">1</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8"> Math.</span><span style="color:#B392F0">min</span><span style="color:#E1E4E8">((progress </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 0.6</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.4</span><span style="color:#E1E4E8">, </span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">)) </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 50</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 50</span><span style="color:#E1E4E8">;</span></span>
|
|
385
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
386
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
387
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative w-full h-full bg-white'</span><span style="color:#E1E4E8">)}></span></span>
|
|
388
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Video background (blurred) */</span><span style="color:#E1E4E8">}</span></span>
|
|
389
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 overflow-hidden'</span><span style="color:#E1E4E8">)}></span></span>
|
|
390
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
391
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">video</span><span style="color:#E1E4E8">(backgroundVideo)} </span></span>
|
|
392
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
393
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-full h-full object-cover'</span><span style="color:#E1E4E8">),</span></span>
|
|
394
|
-
<span class="line"><span style="color:#E1E4E8"> filter: </span><span style="color:#9ECBFF">'blur(20px)'</span><span style="color:#E1E4E8">,</span></span>
|
|
395
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">'scale(1.1)'</span><span style="color:#6A737D"> // Prevent blur edge artifacts</span></span>
|
|
396
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
397
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
398
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 bg-white/50'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
399
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
400
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
401
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Main product image */</span><span style="color:#E1E4E8">}</span></span>
|
|
402
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative z-10 flex items-center justify-center w-full h-full p-20'</span><span style="color:#E1E4E8">)}></span></span>
|
|
403
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ transform: </span><span style="color:#9ECBFF">`scale(${</span><span style="color:#E1E4E8">scale</span><span style="color:#9ECBFF">})`</span><span style="color:#E1E4E8"> }}></span></span>
|
|
404
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
405
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(productImage)} </span></span>
|
|
406
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-96 h-96 object-contain drop-shadow-2xl'</span><span style="color:#E1E4E8">)}</span></span>
|
|
407
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
408
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
409
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
410
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
411
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Animated badge */</span><span style="color:#E1E4E8">}</span></span>
|
|
412
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8"> </span></span>
|
|
413
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
414
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute top-20 right-20'</span><span style="color:#E1E4E8">),</span></span>
|
|
415
|
-
<span class="line"><span style="color:#E1E4E8"> opacity: badgeOpacity,</span></span>
|
|
416
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`rotate(${</span><span style="color:#E1E4E8">badgeRotation</span><span style="color:#9ECBFF">}deg)`</span></span>
|
|
417
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
418
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
419
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
420
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(badge)} </span></span>
|
|
421
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-32 h-32'</span><span style="color:#E1E4E8">)}</span></span>
|
|
422
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
423
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
424
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
425
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Title */</span><span style="color:#E1E4E8">}</span></span>
|
|
426
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute top-20 left-20'</span><span style="color:#E1E4E8">)}></span></span>
|
|
427
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h2</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-5xl font-bold text-gray-900'</span><span style="color:#E1E4E8">)}></span></span>
|
|
428
|
-
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
429
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h2</span><span style="color:#E1E4E8">></span></span>
|
|
430
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
431
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
432
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Animated price */</span><span style="color:#E1E4E8">}</span></span>
|
|
433
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8"> </span></span>
|
|
434
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
435
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute bottom-20 left-20'</span><span style="color:#E1E4E8">),</span></span>
|
|
436
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`translateY(${</span><span style="color:#E1E4E8">priceY</span><span style="color:#9ECBFF">}px)`</span></span>
|
|
437
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
438
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
439
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-6xl font-black text-blue-600'</span><span style="color:#E1E4E8">)}></span></span>
|
|
440
|
-
<span class="line"><span style="color:#E1E4E8"> ${price}</span></span>
|
|
441
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
442
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
443
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
444
|
-
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
445
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
446
|
-
<span class="line"></span></code></pre>
|
|
447
|
-
<p><strong>Props:</strong></p>
|
|
448
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
|
|
449
|
-
<span class="line"><span style="color:#79B8FF"> "title"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Premium Headphones"</span><span style="color:#E1E4E8">,</span></span>
|
|
450
|
-
<span class="line"><span style="color:#79B8FF"> "price"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"299"</span><span style="color:#E1E4E8">,</span></span>
|
|
451
|
-
<span class="line"><span style="color:#79B8FF"> "backgroundVideo"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./footage/studio-background.mp4"</span><span style="color:#E1E4E8">,</span></span>
|
|
452
|
-
<span class="line"><span style="color:#79B8FF"> "productImage"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./images/headphones.png"</span><span style="color:#E1E4E8">,</span></span>
|
|
453
|
-
<span class="line"><span style="color:#79B8FF"> "badge"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./images/new-badge.png"</span></span>
|
|
454
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
455
|
-
<span class="line"></span></code></pre>
|
|
456
|
-
<h3 id="video-with-multiple-image-overlays">Video with Multiple Image Overlays</h3>
|
|
457
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> TutorialVideo</span><span style="color:#E1E4E8">({ </span></span>
|
|
458
|
-
<span class="line"><span style="color:#FFAB70"> tw</span><span style="color:#E1E4E8">, </span></span>
|
|
459
|
-
<span class="line"><span style="color:#FFAB70"> video</span><span style="color:#E1E4E8">, </span></span>
|
|
460
|
-
<span class="line"><span style="color:#FFAB70"> image</span><span style="color:#E1E4E8">, </span></span>
|
|
461
|
-
<span class="line"><span style="color:#FFAB70"> progress</span><span style="color:#E1E4E8">, </span></span>
|
|
462
|
-
<span class="line"><span style="color:#FFAB70"> frame</span><span style="color:#E1E4E8">,</span></span>
|
|
463
|
-
<span class="line"><span style="color:#FFAB70"> screencast</span><span style="color:#E1E4E8">,</span></span>
|
|
464
|
-
<span class="line"><span style="color:#FFAB70"> avatar</span><span style="color:#E1E4E8">,</span></span>
|
|
465
|
-
<span class="line"><span style="color:#FFAB70"> logo</span><span style="color:#E1E4E8">,</span></span>
|
|
466
|
-
<span class="line"><span style="color:#FFAB70"> instructor</span><span style="color:#E1E4E8">,</span></span>
|
|
467
|
-
<span class="line"><span style="color:#FFAB70"> lesson</span></span>
|
|
468
|
-
<span class="line"><span style="color:#E1E4E8">}) {</span></span>
|
|
469
|
-
<span class="line"><span style="color:#6A737D"> // Avatar pulses</span></span>
|
|
470
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> avatarScale</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> 1</span><span style="color:#F97583"> +</span><span style="color:#E1E4E8"> Math.</span><span style="color:#B392F0">sin</span><span style="color:#E1E4E8">(frame </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 0.2</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 0.05</span><span style="color:#E1E4E8">;</span></span>
|
|
471
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
472
|
-
<span class="line"><span style="color:#6A737D"> // Logo stays visible</span></span>
|
|
473
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> logoOpacity</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> 1</span><span style="color:#E1E4E8">;</span></span>
|
|
474
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
475
|
-
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
476
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative w-full h-full bg-gray-900'</span><span style="color:#E1E4E8">)}></span></span>
|
|
477
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Main screencast video */</span><span style="color:#E1E4E8">}</span></span>
|
|
478
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
479
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">video</span><span style="color:#E1E4E8">(screencast)} </span></span>
|
|
480
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute inset-0 w-full h-full object-contain'</span><span style="color:#E1E4E8">)}</span></span>
|
|
481
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
482
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
483
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Company logo (top left) */</span><span style="color:#E1E4E8">}</span></span>
|
|
484
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
485
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute top-8 left-8'</span><span style="color:#E1E4E8">),</span></span>
|
|
486
|
-
<span class="line"><span style="color:#E1E4E8"> opacity: logoOpacity</span></span>
|
|
487
|
-
<span class="line"><span style="color:#E1E4E8"> }}></span></span>
|
|
488
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
489
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(logo)} </span></span>
|
|
490
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'h-12 w-auto'</span><span style="color:#E1E4E8">)}</span></span>
|
|
491
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
492
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
493
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
494
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Instructor avatar (bottom right) */</span><span style="color:#E1E4E8">}</span></span>
|
|
495
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute bottom-8 right-8'</span><span style="color:#E1E4E8">)}></span></span>
|
|
496
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8"> </span></span>
|
|
497
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
498
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'relative'</span><span style="color:#E1E4E8">),</span></span>
|
|
499
|
-
<span class="line"><span style="color:#E1E4E8"> transform: </span><span style="color:#9ECBFF">`scale(${</span><span style="color:#E1E4E8">avatarScale</span><span style="color:#9ECBFF">})`</span></span>
|
|
500
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
501
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
502
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
|
|
503
|
-
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(avatar)} </span></span>
|
|
504
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-24 h-24 rounded-full border-4 border-blue-500'</span><span style="color:#E1E4E8">)}</span></span>
|
|
505
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
506
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Red recording dot */</span><span style="color:#E1E4E8">}</span></span>
|
|
507
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute -top-1 -right-1 w-6 h-6 bg-red-500 rounded-full animate-pulse'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
508
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
509
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
510
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
511
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Lesson info overlay */</span><span style="color:#E1E4E8">}</span></span>
|
|
512
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'absolute bottom-8 left-8 bg-black/80 backdrop-blur px-6 py-4 rounded-lg'</span><span style="color:#E1E4E8">)}></span></span>
|
|
513
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">p</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-sm text-gray-400'</span><span style="color:#E1E4E8">)}>Instructor</</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
|
|
514
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">p</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-xl font-bold text-white mb-2'</span><span style="color:#E1E4E8">)}>{instructor}</</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
|
|
515
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">p</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-sm text-blue-400'</span><span style="color:#E1E4E8">)}>{lesson}</</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
|
|
516
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
517
|
-
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
103
|
+
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
104
|
+
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
|
|
518
105
|
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
519
106
|
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
520
107
|
<span class="line"></span></code></pre>
|
|
521
|
-
<p
|
|
522
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
|
|
523
|
-
<span class="line"><span style="color:#79B8FF"> "instructor"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Sarah Johnson"</span><span style="color:#E1E4E8">,</span></span>
|
|
524
|
-
<span class="line"><span style="color:#79B8FF"> "lesson"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Lesson 3: Advanced Techniques"</span><span style="color:#E1E4E8">,</span></span>
|
|
525
|
-
<span class="line"><span style="color:#79B8FF"> "screencast"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./footage/screen-recording.mp4"</span><span style="color:#E1E4E8">,</span></span>
|
|
526
|
-
<span class="line"><span style="color:#79B8FF"> "avatar"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./images/instructor.jpg"</span><span style="color:#E1E4E8">,</span></span>
|
|
527
|
-
<span class="line"><span style="color:#79B8FF"> "logo"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"./images/course-logo.png"</span></span>
|
|
528
|
-
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
529
|
-
<span class="line"></span></code></pre>
|
|
530
|
-
<h3 id="supported-formats">Supported Formats</h3>
|
|
531
|
-
<p><strong>Video formats</strong> (via <code>video()</code> helper):</p>
|
|
532
|
-
<ul>
|
|
533
|
-
<li>✅ MP4 (<code>.mp4</code>)</li>
|
|
534
|
-
<li>✅ MOV (<code>.mov</code>)</li>
|
|
535
|
-
<li>✅ WebM (<code>.webm</code>)</li>
|
|
536
|
-
<li>✅ AVI (<code>.avi</code>)</li>
|
|
537
|
-
</ul>
|
|
538
|
-
<p><strong>Image formats</strong> (via <code>image()</code> helper):</p>
|
|
539
|
-
<ul>
|
|
540
|
-
<li>✅ JPEG (<code>.jpg</code>, <code>.jpeg</code>)</li>
|
|
541
|
-
<li>✅ PNG (<code>.png</code>) - with transparency</li>
|
|
542
|
-
<li>✅ GIF (<code>.gif</code>)</li>
|
|
543
|
-
<li>✅ WebP (<code>.webp</code>)</li>
|
|
544
|
-
<li>✅ SVG (<code>.svg</code>)</li>
|
|
545
|
-
</ul>
|
|
546
|
-
<h3 id="best-practices">Best Practices</h3>
|
|
547
|
-
<ol>
|
|
548
|
-
<li><strong>Pre-optimize assets</strong>: Resize images and videos to match your output resolution</li>
|
|
549
|
-
<li><strong>Use PNG for logos</strong>: Transparency works perfectly with video backgrounds</li>
|
|
550
|
-
<li><strong>Match frame rates</strong>: If possible, use videos with the same FPS as your template</li>
|
|
551
|
-
<li><strong>Consider file sizes</strong>: Large videos take longer to process</li>
|
|
552
|
-
<li><strong>Test opacity</strong>: Ensure overlays are visible against video backgrounds</li>
|
|
553
|
-
</ol>
|
|
108
|
+
<p>Most use cases are better served by animation classes, but <code>progress</code> and <code>frame</code> props give you complete control when needed.</p>
|
|
554
109
|
<h2 id="fps-and-duration">FPS and Duration</h2>
|
|
555
110
|
<h3 id="common-frame-rates">Common Frame Rates</h3>
|
|
556
111
|
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#6A737D">// Film standard</span></span>
|
|
@@ -626,67 +181,58 @@
|
|
|
626
181
|
<p>For long videos, consider rendering in segments.</p>
|
|
627
182
|
<h2 id="common-video-templates">Common Video Templates</h2>
|
|
628
183
|
<h3 id="loading-spinner">Loading Spinner</h3>
|
|
629
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> LoadingVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">
|
|
630
|
-
<span class="line"><span style="color:#6A737D"> // Show spinner for first 60%, then fade to title</span></span>
|
|
631
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> spinnerOpacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583"><</span><span style="color:#79B8FF"> 0.6</span><span style="color:#F97583"> ?</span><span style="color:#79B8FF"> 1</span><span style="color:#F97583"> :</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">1</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8"> (progress </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 0.6</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.4</span><span style="color:#E1E4E8">);</span></span>
|
|
632
|
-
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> titleOpacity</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">></span><span style="color:#79B8FF"> 0.6</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> (progress </span><span style="color:#F97583">-</span><span style="color:#79B8FF"> 0.6</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">/</span><span style="color:#79B8FF"> 0.4</span><span style="color:#F97583"> :</span><span style="color:#79B8FF"> 0</span><span style="color:#E1E4E8">;</span></span>
|
|
633
|
-
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
184
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> LoadingVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
634
185
|
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
635
186
|
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex flex-col items-center justify-center w-full h-full bg-gray-900'</span><span style="color:#E1E4E8">)}></span></span>
|
|
636
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/*
|
|
637
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{
|
|
638
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-32 h-32 border-8 border-blue-500 border-t-transparent rounded-full
|
|
187
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Spinner fades out at 60% (1800ms for 3s video) */</span><span style="color:#E1E4E8">}</span></span>
|
|
188
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'exit-fade-out/1800/400'</span><span style="color:#E1E4E8">)}></span></span>
|
|
189
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-32 h-32 border-8 border-blue-500 border-t-transparent rounded-full loop-spin/1000'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
639
190
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
640
191
|
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
641
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
642
|
-
<span class="line"><span style="color:#B392F0">
|
|
643
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-6xl font-bold text-white mt-12'</span><span style="color:#E1E4E8">),</span></span>
|
|
644
|
-
<span class="line"><span style="color:#E1E4E8"> opacity: titleOpacity</span></span>
|
|
645
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
646
|
-
<span class="line"><span style="color:#E1E4E8"> ></span></span>
|
|
192
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Title fades in after spinner */</span><span style="color:#E1E4E8">}</span></span>
|
|
193
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h1</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-6xl font-bold text-white mt-12 ease-out enter-fade-in-up/1800/400'</span><span style="color:#E1E4E8">)}></span></span>
|
|
647
194
|
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
648
195
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
|
|
649
196
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
650
197
|
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
651
198
|
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
652
199
|
<span class="line"></span></code></pre>
|
|
653
|
-
<h3 id="progress-bar
|
|
654
|
-
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> ProgressVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">
|
|
200
|
+
<h3 id="progress-bar">Progress Bar</h3>
|
|
201
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> ProgressVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">subtitle</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
655
202
|
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
656
203
|
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex flex-col items-center justify-center w-full h-full bg-gray-900 p-12'</span><span style="color:#E1E4E8">)}></span></span>
|
|
657
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
204
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Title bounces in */</span><span style="color:#E1E4E8">}</span></span>
|
|
205
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">h2</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-5xl font-bold text-white mb-12 ease-out enter-bounce-in/0/500'</span><span style="color:#E1E4E8">)}></span></span>
|
|
658
206
|
<span class="line"><span style="color:#E1E4E8"> {title}</span></span>
|
|
659
207
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">h2</span><span style="color:#E1E4E8">></span></span>
|
|
660
208
|
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
661
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Progress bar */</span><span style="color:#E1E4E8">}</span></span>
|
|
662
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-full max-w-2xl h-4 bg-gray-700 rounded-full overflow-hidden'</span><span style="color:#E1E4E8">)}></span></span>
|
|
663
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8"> </span></span>
|
|
664
|
-
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{</span></span>
|
|
665
|
-
<span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'h-full bg-gradient-to-r from-blue-500 to-green-500'</span><span style="color:#E1E4E8">),</span></span>
|
|
666
|
-
<span class="line"><span style="color:#E1E4E8"> width: </span><span style="color:#9ECBFF">`${</span><span style="color:#E1E4E8">progress</span><span style="color:#F97583"> *</span><span style="color:#79B8FF"> 100</span><span style="color:#9ECBFF">}%`</span></span>
|
|
667
|
-
<span class="line"><span style="color:#E1E4E8"> }}</span></span>
|
|
668
|
-
<span class="line"><span style="color:#E1E4E8"> /></span></span>
|
|
209
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Progress bar container fades in */</span><span style="color:#E1E4E8">}</span></span>
|
|
210
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'w-full max-w-2xl h-4 bg-gray-700 rounded-full overflow-hidden ease-out enter-fade-in/300/400'</span><span style="color:#E1E4E8">)}></span></span>
|
|
211
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'h-full bg-gradient-to-r from-blue-500 to-green-500 w-full'</span><span style="color:#E1E4E8">)} /></span></span>
|
|
669
212
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
670
213
|
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
671
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
214
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Subtitle fades in last */</span><span style="color:#E1E4E8">}</span></span>
|
|
215
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">p</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-2xl text-gray-400 mt-8 ease-out enter-fade-in/600/400'</span><span style="color:#E1E4E8">)}></span></span>
|
|
672
216
|
<span class="line"><span style="color:#E1E4E8"> {subtitle}</span></span>
|
|
673
217
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
|
|
674
218
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
675
219
|
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
676
220
|
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
677
221
|
<span class="line"></span></code></pre>
|
|
678
|
-
<h3 id="countdown-timer
|
|
222
|
+
<h3 id="countdown-timer">Countdown Timer</h3>
|
|
679
223
|
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> CountdownVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">frame</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">message</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
680
224
|
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> fps</span><span style="color:#F97583"> =</span><span style="color:#79B8FF"> 30</span><span style="color:#E1E4E8">;</span></span>
|
|
681
225
|
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> secondsRemaining</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> Math.</span><span style="color:#B392F0">ceil</span><span style="color:#E1E4E8">((</span><span style="color:#79B8FF">90</span><span style="color:#F97583"> -</span><span style="color:#E1E4E8"> frame) </span><span style="color:#F97583">/</span><span style="color:#E1E4E8"> fps); </span><span style="color:#6A737D">// 3s countdown</span></span>
|
|
682
226
|
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
683
227
|
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
684
228
|
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'flex flex-col items-center justify-center w-full h-full bg-black'</span><span style="color:#E1E4E8">)}></span></span>
|
|
685
|
-
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/*
|
|
686
|
-
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-[200px] font-black text-white
|
|
229
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Number scales in and pulses continuously */</span><span style="color:#E1E4E8">}</span></span>
|
|
230
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-[200px] font-black text-white ease-out enter-scale-in/0/400 loop-pulse/1000'</span><span style="color:#E1E4E8">)}></span></span>
|
|
687
231
|
<span class="line"><span style="color:#E1E4E8"> {secondsRemaining}</span></span>
|
|
688
232
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
689
|
-
<span class="line"><span style="color:#E1E4E8">
|
|
233
|
+
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
234
|
+
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Message fades in */</span><span style="color:#E1E4E8">}</span></span>
|
|
235
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">p</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'text-3xl text-gray-400 mt-8 ease-out enter-fade-in/400/500'</span><span style="color:#E1E4E8">)}></span></span>
|
|
690
236
|
<span class="line"><span style="color:#E1E4E8"> {message}</span></span>
|
|
691
237
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
|
|
692
238
|
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
@@ -741,10 +287,33 @@
|
|
|
741
287
|
<li>Complex gradients or photos</li>
|
|
742
288
|
<li>Best quality and smallest size</li>
|
|
743
289
|
</ul>
|
|
290
|
+
<h2 id="video-specific-props">Video-Specific Props</h2>
|
|
291
|
+
<p>Every video template receives these additional props:</p>
|
|
292
|
+
<h3 id="frame"><code>frame</code></h3>
|
|
293
|
+
<p>Current frame number (0 to totalFrames - 1)</p>
|
|
294
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> MyVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">frame</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
295
|
+
<span class="line"><span style="color:#6A737D"> // Frame 0, 1, 2, 3, ... 89 (for 3s @ 30fps)</span></span>
|
|
296
|
+
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">>Frame: {frame}</</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">>;</span></span>
|
|
297
|
+
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
298
|
+
<span class="line"></span></code></pre>
|
|
299
|
+
<h3 id="progress"><code>progress</code></h3>
|
|
300
|
+
<p>Animation progress from 0 to 1</p>
|
|
301
|
+
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> MyVideo</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">progress</span><span style="color:#E1E4E8"> }) {</span></span>
|
|
302
|
+
<span class="line"><span style="color:#6A737D"> // 0.0 at start, 0.5 at middle, 1.0 at end</span></span>
|
|
303
|
+
<span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> x</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> progress </span><span style="color:#F97583">*</span><span style="color:#79B8FF"> 100</span><span style="color:#E1E4E8">; </span><span style="color:#6A737D">// Move from 0 to 100</span></span>
|
|
304
|
+
<span class="line"><span style="color:#E1E4E8"> </span></span>
|
|
305
|
+
<span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
|
|
306
|
+
<span class="line"><span style="color:#E1E4E8"> <</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ transform: </span><span style="color:#9ECBFF">`translateX(${</span><span style="color:#E1E4E8">x</span><span style="color:#9ECBFF">}px)`</span><span style="color:#E1E4E8"> }}></span></span>
|
|
307
|
+
<span class="line"><span style="color:#E1E4E8"> Moving element</span></span>
|
|
308
|
+
<span class="line"><span style="color:#E1E4E8"> </</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
|
|
309
|
+
<span class="line"><span style="color:#E1E4E8"> );</span></span>
|
|
310
|
+
<span class="line"><span style="color:#E1E4E8">}</span></span>
|
|
311
|
+
<span class="line"></span></code></pre>
|
|
744
312
|
<h2 id="next-steps">Next Steps</h2>
|
|
745
313
|
<ul>
|
|
746
|
-
<li><a href="/
|
|
747
|
-
<li><a href="/
|
|
314
|
+
<li><a href="/animation">Animation - Complete animation guide</a></li>
|
|
315
|
+
<li><a href="/images">Image Rendering</a></li>
|
|
316
|
+
<li><a href="/helpers">Helpers - QR Codes and Template Composition</a></li>
|
|
748
317
|
<li><a href="/styling">Styling with Tailwind & shadcn/ui</a></li>
|
|
749
318
|
<li><a href="/fonts">Custom Fonts in Videos</a></li>
|
|
750
|
-
</ul> </article> </div> </main> </div> </body></html>
|
|
319
|
+
</ul> </article> </div> </main> <!-- Table of Contents Sidebar (Desktop only) --> <aside id="toc-sidebar" class="toc-sidebar fixed top-0 right-0 h-screen w-64 overflow-y-auto z-10" data-astro-cid-mw7aashj> <div class="px-6 py-8" data-astro-cid-mw7aashj> <h3 class="text-xs font-semibold text-muted-foreground mb-4 uppercase tracking-wider" data-astro-cid-mw7aashj>On this page</h3> <nav id="toc-nav" data-astro-cid-mw7aashj> <!-- TOC will be populated by JavaScript --> </nav> </div> </aside> </div> </body></html>
|