loopwind 0.22.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +13 -117
  2. package/dist/cli.js +16 -10
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +6 -10
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/agent.d.ts +8 -0
  8. package/dist/commands/agent.d.ts.map +1 -0
  9. package/dist/commands/agent.js +101 -0
  10. package/dist/commands/agent.js.map +1 -0
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +17 -7
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/render.d.ts.map +1 -1
  15. package/dist/commands/render.js +17 -19
  16. package/dist/commands/render.js.map +1 -1
  17. package/dist/default-templates/AGENTS.md +10 -24
  18. package/dist/lib/config.d.ts +2 -3
  19. package/dist/lib/config.d.ts.map +1 -1
  20. package/dist/lib/config.js +4 -9
  21. package/dist/lib/config.js.map +1 -1
  22. package/dist/lib/constants.d.ts +1 -3
  23. package/dist/lib/constants.d.ts.map +1 -1
  24. package/dist/lib/constants.js +2 -4
  25. package/dist/lib/constants.js.map +1 -1
  26. package/dist/lib/installer.d.ts +2 -0
  27. package/dist/lib/installer.d.ts.map +1 -1
  28. package/dist/lib/installer.js +6 -7
  29. package/dist/lib/installer.js.map +1 -1
  30. package/dist/lib/renderer.d.ts.map +1 -1
  31. package/dist/lib/renderer.js +14 -8
  32. package/dist/lib/renderer.js.map +1 -1
  33. package/dist/lib/resvg-init.d.ts +15 -0
  34. package/dist/lib/resvg-init.d.ts.map +1 -0
  35. package/dist/lib/resvg-init.js +55 -0
  36. package/dist/lib/resvg-init.js.map +1 -0
  37. package/dist/lib/tailwind/colors.d.ts +8 -0
  38. package/dist/lib/tailwind/colors.d.ts.map +1 -0
  39. package/dist/lib/tailwind/colors.js +102 -0
  40. package/dist/lib/tailwind/colors.js.map +1 -0
  41. package/dist/lib/tailwind/index.d.ts +10 -0
  42. package/dist/lib/tailwind/index.d.ts.map +1 -0
  43. package/dist/lib/tailwind/index.js +9 -0
  44. package/dist/lib/tailwind/index.js.map +1 -0
  45. package/dist/lib/tailwind/resolvers.d.ts +28 -0
  46. package/dist/lib/tailwind/resolvers.d.ts.map +1 -0
  47. package/dist/lib/tailwind/resolvers.js +94 -0
  48. package/dist/lib/tailwind/resolvers.js.map +1 -0
  49. package/dist/lib/tailwind/types.d.ts +29 -0
  50. package/dist/lib/tailwind/types.d.ts.map +1 -0
  51. package/dist/lib/tailwind/types.js +8 -0
  52. package/dist/lib/tailwind/types.js.map +1 -0
  53. package/dist/lib/tailwind-config-loader.d.ts +8 -45
  54. package/dist/lib/tailwind-config-loader.d.ts.map +1 -1
  55. package/dist/lib/tailwind-config-loader.js +6 -429
  56. package/dist/lib/tailwind-config-loader.js.map +1 -1
  57. package/dist/lib/tailwind.d.ts +1 -1
  58. package/dist/lib/tailwind.d.ts.map +1 -1
  59. package/dist/lib/tailwind.js +1 -1
  60. package/dist/lib/tailwind.js.map +1 -1
  61. package/dist/lib/utils.d.ts +13 -29
  62. package/dist/lib/utils.d.ts.map +1 -1
  63. package/dist/lib/utils.js +45 -155
  64. package/dist/lib/utils.js.map +1 -1
  65. package/dist/lib/video-renderer.d.ts.map +1 -1
  66. package/dist/lib/video-renderer.js +6 -5
  67. package/dist/lib/video-renderer.js.map +1 -1
  68. package/dist/types/config.d.ts +0 -2
  69. package/dist/types/config.d.ts.map +1 -1
  70. package/dist/types/config.js.map +1 -1
  71. package/package.json +2 -12
  72. package/REGISTRY_SETUP.md +0 -363
  73. package/_dsgn/templates/dashed-stroke-test/template.tsx +0 -73
  74. package/_dsgn/templates/path-follow-test/template.tsx +0 -176
  75. package/_dsgn/templates/path-simple-test/template.tsx +0 -98
  76. package/_dsgn/templates/stroke-dash-test/meta.json +0 -12
  77. package/_dsgn/templates/stroke-dash-test/template.tsx +0 -53
  78. package/dist/default-templates/image/template.d.ts +0 -20
  79. package/dist/default-templates/image/template.d.ts.map +0 -1
  80. package/dist/default-templates/image/template.js +0 -18
  81. package/dist/default-templates/image/template.js.map +0 -1
  82. package/dist/default-templates/image/template.tsx +0 -20
  83. package/dist/default-templates/kitchen-sink/template.tsx +0 -64
  84. package/dist/default-templates/page/template.tsx +0 -37
  85. package/dist/default-templates/video/template.d.ts +0 -26
  86. package/dist/default-templates/video/template.d.ts.map +0 -1
  87. package/dist/default-templates/video/template.js +0 -33
  88. package/dist/default-templates/video/template.js.map +0 -1
  89. package/dist/default-templates/video/template.tsx +0 -37
  90. package/dist/default-templates/website/pages/home.tsx +0 -17
  91. package/dist/default-templates/website/parts/footer.tsx +0 -17
  92. package/dist/default-templates/website/parts/header.tsx +0 -17
  93. package/dist/default-templates/website/template.tsx +0 -17
  94. package/dist/default-templates/website-template/pages/home.tsx +0 -13
  95. package/dist/default-templates/website-template/parts/footer.tsx +0 -15
  96. package/dist/default-templates/website-template/parts/header.tsx +0 -15
  97. package/dist/default-templates/website-template/template.tsx +0 -32
  98. package/dist/lib/encode-worker.d.ts +0 -2
  99. package/dist/lib/encode-worker.d.ts.map +0 -1
  100. package/dist/lib/encode-worker.js +0 -29
  101. package/dist/lib/encode-worker.js.map +0 -1
  102. package/dist/lib/mjpeg-muxer.d.ts +0 -46
  103. package/dist/lib/mjpeg-muxer.d.ts.map +0 -1
  104. package/dist/lib/mjpeg-muxer.js +0 -513
  105. package/dist/lib/mjpeg-muxer.js.map +0 -1
  106. package/dist/lib/tailwind-browser.d.ts +0 -27
  107. package/dist/lib/tailwind-browser.d.ts.map +0 -1
  108. package/dist/lib/tailwind-browser.js +0 -853
  109. package/dist/lib/tailwind-browser.js.map +0 -1
  110. package/dist/lib/video-player.d.ts +0 -25
  111. package/dist/lib/video-player.d.ts.map +0 -1
  112. package/dist/lib/video-player.js +0 -392
  113. package/dist/lib/video-player.js.map +0 -1
  114. package/dist/sdk/compiler.d.ts +0 -94
  115. package/dist/sdk/compiler.d.ts.map +0 -1
  116. package/dist/sdk/compiler.js +0 -122
  117. package/dist/sdk/compiler.js.map +0 -1
  118. package/dist/sdk/index.d.ts +0 -62
  119. package/dist/sdk/index.d.ts.map +0 -1
  120. package/dist/sdk/index.js +0 -141
  121. package/dist/sdk/index.js.map +0 -1
  122. package/dist/sdk/preview.d.ts +0 -65
  123. package/dist/sdk/preview.d.ts.map +0 -1
  124. package/dist/sdk/preview.js +0 -262
  125. package/dist/sdk/preview.js.map +0 -1
  126. package/dist/sdk/template.d.ts +0 -162
  127. package/dist/sdk/template.d.ts.map +0 -1
  128. package/dist/sdk/template.js +0 -231
  129. package/dist/sdk/template.js.map +0 -1
  130. package/examples/code-editor-templates.ts +0 -173
  131. package/examples/nextjs-api/README.md +0 -180
  132. package/examples/nextjs-api/package.json +0 -21
  133. package/examples/nextjs-api/pages/api/intro-video.ts +0 -53
  134. package/examples/nextjs-api/pages/api/og-image.ts +0 -50
  135. package/examples/nextjs-template-import.ts +0 -58
  136. package/examples/sdk-video-preview.tsx +0 -120
  137. package/examples/template-compiler-workflow.ts +0 -251
  138. package/examples/visual-builder-templates.ts +0 -336
  139. package/render-examples-600x400.mjs +0 -161
  140. package/render-spring-variants-fixed.mjs +0 -60
  141. package/render-staggered-text.mjs +0 -56
  142. package/test-font-files.mjs +0 -72
  143. package/test-jsx-support.mjs +0 -146
  144. package/test-sdk-config.mjs +0 -454
  145. package/test-sdk-source-config.mjs +0 -427
  146. package/test-sdk-user-templates.mjs +0 -469
  147. package/test-static-debug.tsx +0 -19
  148. package/test-templates/TESTS.md +0 -63
  149. package/test-templates/config-test.mjs +0 -17
  150. package/test-templates/demo-intro-props.json +0 -4
  151. package/test-templates/run-tests.sh +0 -44
  152. package/test-templates/test-sdk.mjs +0 -139
  153. package/test-video-props.json +0 -3
  154. package/website/.astro/content.db +0 -0
  155. package/website/.astro/integrations/_inox-tools_astro-when/types.d.ts +0 -1
  156. package/website/.astro/integrations/astro_db/db.d.ts +0 -15
  157. package/website/.astro/settings.json +0 -5
  158. package/website/.astro/types.d.ts +0 -2
  159. package/website/DEPLOYMENT.md +0 -143
  160. package/website/OG_IMAGES.md +0 -142
  161. package/website/README.md +0 -158
  162. package/website/astro.config.mjs +0 -46
  163. package/website/dist/.gitkeep +0 -5
  164. package/website/dist/_astro/agents.Yx-L_igG.css +0 -1
  165. package/website/dist/_routes.json +0 -30
  166. package/website/dist/_worker.js/_@astrojs-ssr-adapter.mjs +0 -1033
  167. package/website/dist/_worker.js/_astro-internal_middleware.mjs +0 -40
  168. package/website/dist/_worker.js/chunks/abap_BTmsHiP5.mjs +0 -1
  169. package/website/dist/_worker.js/chunks/actionscript-3_DmBelb1E.mjs +0 -1
  170. package/website/dist/_worker.js/chunks/ada_8-E0ahCN.mjs +0 -1
  171. package/website/dist/_worker.js/chunks/andromeeda_XI-CXx50.mjs +0 -1
  172. package/website/dist/_worker.js/chunks/angular-html_DKGh3gGH.mjs +0 -1
  173. package/website/dist/_worker.js/chunks/angular-ts_-qZGsJoA.mjs +0 -1
  174. package/website/dist/_worker.js/chunks/apache_ijTUt0Ee.mjs +0 -1
  175. package/website/dist/_worker.js/chunks/apex_agu1c6Sh.mjs +0 -1
  176. package/website/dist/_worker.js/chunks/apl_Bj2f7Art.mjs +0 -1
  177. package/website/dist/_worker.js/chunks/applescript_B_vXrOh3.mjs +0 -1
  178. package/website/dist/_worker.js/chunks/ara_DCEQ2rnh.mjs +0 -1
  179. package/website/dist/_worker.js/chunks/asciidoc_CGN_EkYS.mjs +0 -1
  180. package/website/dist/_worker.js/chunks/asm_BBWZgnDp.mjs +0 -1
  181. package/website/dist/_worker.js/chunks/astro/assets-service_j52rQLzU.mjs +0 -721
  182. package/website/dist/_worker.js/chunks/astro/server_Y5_QHO8v.mjs +0 -2401
  183. package/website/dist/_worker.js/chunks/astro-designed-error-pages_BNTLO-TA.mjs +0 -542
  184. package/website/dist/_worker.js/chunks/astro_Dr_hht3h.mjs +0 -1
  185. package/website/dist/_worker.js/chunks/aurora-x_9GHG8nSq.mjs +0 -1
  186. package/website/dist/_worker.js/chunks/awk_DHRvhXot.mjs +0 -1
  187. package/website/dist/_worker.js/chunks/ayu-dark_CcvqmEHE.mjs +0 -1
  188. package/website/dist/_worker.js/chunks/ballerina_C7SdeSZb.mjs +0 -1
  189. package/website/dist/_worker.js/chunks/bat_Dv4A3u45.mjs +0 -1
  190. package/website/dist/_worker.js/chunks/beancount_BfPf9Luv.mjs +0 -1
  191. package/website/dist/_worker.js/chunks/berry_B8rfM3lL.mjs +0 -1
  192. package/website/dist/_worker.js/chunks/bibtex_TcjYgtJM.mjs +0 -1
  193. package/website/dist/_worker.js/chunks/bicep_CrlFWCdN.mjs +0 -1
  194. package/website/dist/_worker.js/chunks/blade_lanKVYID.mjs +0 -1
  195. package/website/dist/_worker.js/chunks/bsl_BhppzXMB.mjs +0 -1
  196. package/website/dist/_worker.js/chunks/c_6FBALJTK.mjs +0 -1
  197. package/website/dist/_worker.js/chunks/cadence_2txU9LVE.mjs +0 -1
  198. package/website/dist/_worker.js/chunks/cairo_BkrFAIlP.mjs +0 -1
  199. package/website/dist/_worker.js/chunks/catppuccin-frappe_CkEqIYhU.mjs +0 -1
  200. package/website/dist/_worker.js/chunks/catppuccin-latte_DG4Gx_-v.mjs +0 -1
  201. package/website/dist/_worker.js/chunks/catppuccin-macchiato_Cwi3vCXf.mjs +0 -1
  202. package/website/dist/_worker.js/chunks/catppuccin-mocha_L9_OPlFX.mjs +0 -1
  203. package/website/dist/_worker.js/chunks/clarity_BEAe4Ulu.mjs +0 -1
  204. package/website/dist/_worker.js/chunks/clojure_VnUX6p2g.mjs +0 -1
  205. package/website/dist/_worker.js/chunks/cmake_0-SGkZEj.mjs +0 -1
  206. package/website/dist/_worker.js/chunks/cobol_92M_KGaE.mjs +0 -1
  207. package/website/dist/_worker.js/chunks/codeowners_CzMwskBv.mjs +0 -1
  208. package/website/dist/_worker.js/chunks/codeql_DWJZNHv1.mjs +0 -1
  209. package/website/dist/_worker.js/chunks/coffee_CQjKU2fh.mjs +0 -1
  210. package/website/dist/_worker.js/chunks/common-lisp_BBLWDpS5.mjs +0 -1
  211. package/website/dist/_worker.js/chunks/coq_hedRFV3D.mjs +0 -1
  212. package/website/dist/_worker.js/chunks/cpp_DlS1i6Zs.mjs +0 -1
  213. package/website/dist/_worker.js/chunks/crystal_D6n65fKV.mjs +0 -1
  214. package/website/dist/_worker.js/chunks/csharp_C6FCVFzc.mjs +0 -1
  215. package/website/dist/_worker.js/chunks/css_C5uJEgmJ.mjs +0 -1
  216. package/website/dist/_worker.js/chunks/csv_CtMYuuJl.mjs +0 -1
  217. package/website/dist/_worker.js/chunks/cue_BsPexqx6.mjs +0 -1
  218. package/website/dist/_worker.js/chunks/cypher_apzf6OBi.mjs +0 -1
  219. package/website/dist/_worker.js/chunks/d_DcvIRcgm.mjs +0 -1
  220. package/website/dist/_worker.js/chunks/dark-plus_C01ONtzj.mjs +0 -1
  221. package/website/dist/_worker.js/chunks/dart_WkzM5WrV.mjs +0 -1
  222. package/website/dist/_worker.js/chunks/dax_DjXAO5V4.mjs +0 -1
  223. package/website/dist/_worker.js/chunks/desktop_C92LCxdc.mjs +0 -1
  224. package/website/dist/_worker.js/chunks/diff_CVwM_9XJ.mjs +0 -1
  225. package/website/dist/_worker.js/chunks/docker_DPzgJf6Z.mjs +0 -1
  226. package/website/dist/_worker.js/chunks/dotenv_D_vgANvA.mjs +0 -1
  227. package/website/dist/_worker.js/chunks/dracula-soft_CLnUBwFm.mjs +0 -1
  228. package/website/dist/_worker.js/chunks/dracula_lBVpb6Lb.mjs +0 -1
  229. package/website/dist/_worker.js/chunks/dream-maker_DTLbzd_J.mjs +0 -1
  230. package/website/dist/_worker.js/chunks/edge_i54JYm3_.mjs +0 -1
  231. package/website/dist/_worker.js/chunks/elixir_BJCIjTu4.mjs +0 -1
  232. package/website/dist/_worker.js/chunks/elm_BbXD39-_.mjs +0 -1
  233. package/website/dist/_worker.js/chunks/emacs-lisp_pxa5cXaN.mjs +0 -1
  234. package/website/dist/_worker.js/chunks/erb_Ccjijeee.mjs +0 -1
  235. package/website/dist/_worker.js/chunks/erlang_B2VM_hi7.mjs +0 -1
  236. package/website/dist/_worker.js/chunks/everforest-dark_BxvIPBim.mjs +0 -1
  237. package/website/dist/_worker.js/chunks/everforest-light_B7VoyaJM.mjs +0 -1
  238. package/website/dist/_worker.js/chunks/fennel_D-uo7X6c.mjs +0 -1
  239. package/website/dist/_worker.js/chunks/fish_BjePoK3m.mjs +0 -1
  240. package/website/dist/_worker.js/chunks/fluent_C8fgkzLX.mjs +0 -1
  241. package/website/dist/_worker.js/chunks/fortran-fixed-form_D1pu5zrc.mjs +0 -1
  242. package/website/dist/_worker.js/chunks/fortran-free-form_CSGOhJD6.mjs +0 -1
  243. package/website/dist/_worker.js/chunks/fsharp_B0xy-A4Y.mjs +0 -1
  244. package/website/dist/_worker.js/chunks/gdresource_CWppjlHq.mjs +0 -1
  245. package/website/dist/_worker.js/chunks/gdscript_eQCHchcS.mjs +0 -1
  246. package/website/dist/_worker.js/chunks/gdshader_C4kxepX7.mjs +0 -1
  247. package/website/dist/_worker.js/chunks/genie_ACtQLcDW.mjs +0 -1
  248. package/website/dist/_worker.js/chunks/gherkin_BFp2uKUd.mjs +0 -1
  249. package/website/dist/_worker.js/chunks/git-commit_CLg9ZwMV.mjs +0 -1
  250. package/website/dist/_worker.js/chunks/git-rebase_DG8A80Nt.mjs +0 -1
  251. package/website/dist/_worker.js/chunks/github-dark-default_BI0EP2Kv.mjs +0 -1
  252. package/website/dist/_worker.js/chunks/github-dark-dimmed_a_NIC0Xb.mjs +0 -1
  253. package/website/dist/_worker.js/chunks/github-dark-high-contrast_jZGqT7hk.mjs +0 -1
  254. package/website/dist/_worker.js/chunks/github-dark_CHCDNd2O.mjs +0 -1
  255. package/website/dist/_worker.js/chunks/github-light-default_DRbOW5RG.mjs +0 -1
  256. package/website/dist/_worker.js/chunks/github-light-high-contrast_tn_kWutM.mjs +0 -1
  257. package/website/dist/_worker.js/chunks/github-light_D9brYzot.mjs +0 -1
  258. package/website/dist/_worker.js/chunks/gleam_Dmhu1oxW.mjs +0 -1
  259. package/website/dist/_worker.js/chunks/glimmer-js_BfZbXy8A.mjs +0 -1
  260. package/website/dist/_worker.js/chunks/glimmer-ts_B9QVICrD.mjs +0 -1
  261. package/website/dist/_worker.js/chunks/glsl_DD2PPwOs.mjs +0 -1
  262. package/website/dist/_worker.js/chunks/gnuplot_D2OYChUX.mjs +0 -1
  263. package/website/dist/_worker.js/chunks/go_DYGFTe3h.mjs +0 -1
  264. package/website/dist/_worker.js/chunks/graphql_B7XsT3nH.mjs +0 -1
  265. package/website/dist/_worker.js/chunks/groovy_BO12Uwkl.mjs +0 -1
  266. package/website/dist/_worker.js/chunks/hack_CB2_ztCP.mjs +0 -1
  267. package/website/dist/_worker.js/chunks/haml_CyfDcDD3.mjs +0 -1
  268. package/website/dist/_worker.js/chunks/handlebars_CfpxpWm2.mjs +0 -1
  269. package/website/dist/_worker.js/chunks/haskell_jUeC5uN5.mjs +0 -1
  270. package/website/dist/_worker.js/chunks/haxe_B6GxP1WB.mjs +0 -1
  271. package/website/dist/_worker.js/chunks/hcl_DwoHV2oh.mjs +0 -1
  272. package/website/dist/_worker.js/chunks/hjson_DV7cJRk4.mjs +0 -1
  273. package/website/dist/_worker.js/chunks/hlsl_BlFCscPI.mjs +0 -1
  274. package/website/dist/_worker.js/chunks/houston_COBFG1Mx.mjs +0 -1
  275. package/website/dist/_worker.js/chunks/html-derivative_C9pJ337h.mjs +0 -1
  276. package/website/dist/_worker.js/chunks/html_D1OkrZS5.mjs +0 -1
  277. package/website/dist/_worker.js/chunks/http_DIGXRqvJ.mjs +0 -1
  278. package/website/dist/_worker.js/chunks/hxml_DEwh9i-c.mjs +0 -1
  279. package/website/dist/_worker.js/chunks/hy_DDoIgW1K.mjs +0 -1
  280. package/website/dist/_worker.js/chunks/imba_B00zbHo4.mjs +0 -1
  281. package/website/dist/_worker.js/chunks/index_C1UTDwYg.mjs +0 -1861
  282. package/website/dist/_worker.js/chunks/ini_D7XQA_p8.mjs +0 -1
  283. package/website/dist/_worker.js/chunks/java_B9wdFd8K.mjs +0 -1
  284. package/website/dist/_worker.js/chunks/javascript_CLsPGOON.mjs +0 -1
  285. package/website/dist/_worker.js/chunks/jinja_jarBCAN1.mjs +0 -1
  286. package/website/dist/_worker.js/chunks/jison_oGg3J708.mjs +0 -1
  287. package/website/dist/_worker.js/chunks/json5_DlZ1Kyaa.mjs +0 -1
  288. package/website/dist/_worker.js/chunks/json_DaYk_FMp.mjs +0 -1
  289. package/website/dist/_worker.js/chunks/jsonc_DlwgfSDs.mjs +0 -1
  290. package/website/dist/_worker.js/chunks/jsonl_BbCCVaZF.mjs +0 -1
  291. package/website/dist/_worker.js/chunks/jsonnet_Dt-G75xe.mjs +0 -1
  292. package/website/dist/_worker.js/chunks/jssm_BtKFTj2A.mjs +0 -1
  293. package/website/dist/_worker.js/chunks/jsx_DDx_xAZ8.mjs +0 -1
  294. package/website/dist/_worker.js/chunks/julia_CK0lv68l.mjs +0 -1
  295. package/website/dist/_worker.js/chunks/kanagawa-dragon_BldAK3Oo.mjs +0 -1
  296. package/website/dist/_worker.js/chunks/kanagawa-lotus_DVM8FX9_.mjs +0 -1
  297. package/website/dist/_worker.js/chunks/kanagawa-wave_Dpih0AKP.mjs +0 -1
  298. package/website/dist/_worker.js/chunks/kotlin_kWneB9V_.mjs +0 -1
  299. package/website/dist/_worker.js/chunks/kusto_BKVATd95.mjs +0 -1
  300. package/website/dist/_worker.js/chunks/laserwave_BqatxsVl.mjs +0 -1
  301. package/website/dist/_worker.js/chunks/latex_LVDcGBbc.mjs +0 -1
  302. package/website/dist/_worker.js/chunks/lean_W7qo-5M2.mjs +0 -1
  303. package/website/dist/_worker.js/chunks/less_DFNwJnBH.mjs +0 -1
  304. package/website/dist/_worker.js/chunks/light-plus_Dp0AoWsO.mjs +0 -1
  305. package/website/dist/_worker.js/chunks/liquid_D24qs0pc.mjs +0 -1
  306. package/website/dist/_worker.js/chunks/log_IPWMXriF.mjs +0 -1
  307. package/website/dist/_worker.js/chunks/logo_C6KaatrQ.mjs +0 -1
  308. package/website/dist/_worker.js/chunks/lua_CwnEf-T7.mjs +0 -1
  309. package/website/dist/_worker.js/chunks/luau_Br3-CXjS.mjs +0 -1
  310. package/website/dist/_worker.js/chunks/make_UBNG-kOo.mjs +0 -1
  311. package/website/dist/_worker.js/chunks/markdown_C7mhJFCm.mjs +0 -1
  312. package/website/dist/_worker.js/chunks/marko_4tchUvI7.mjs +0 -1
  313. package/website/dist/_worker.js/chunks/material-theme-darker_SKtaNEPn.mjs +0 -1
  314. package/website/dist/_worker.js/chunks/material-theme-lighter_zOX_DZCH.mjs +0 -1
  315. package/website/dist/_worker.js/chunks/material-theme-ocean_BN9WbhdC.mjs +0 -1
  316. package/website/dist/_worker.js/chunks/material-theme-palenight_DT_covjH.mjs +0 -1
  317. package/website/dist/_worker.js/chunks/material-theme_6RpeM3kc.mjs +0 -1
  318. package/website/dist/_worker.js/chunks/matlab_DCOXsPKR.mjs +0 -1
  319. package/website/dist/_worker.js/chunks/mdc_B9gb2UFP.mjs +0 -1
  320. package/website/dist/_worker.js/chunks/mdx_DGU7Nu9u.mjs +0 -1
  321. package/website/dist/_worker.js/chunks/mermaid_B69URzsZ.mjs +0 -1
  322. package/website/dist/_worker.js/chunks/min-dark_BgxifOMI.mjs +0 -1
  323. package/website/dist/_worker.js/chunks/min-light_BrPjXxUp.mjs +0 -1
  324. package/website/dist/_worker.js/chunks/mipsasm_9U-4_t7k.mjs +0 -1
  325. package/website/dist/_worker.js/chunks/mojo_B0wt7ug3.mjs +0 -1
  326. package/website/dist/_worker.js/chunks/monokai_B6Pxpoyi.mjs +0 -1
  327. package/website/dist/_worker.js/chunks/move_1eid4CyR.mjs +0 -1
  328. package/website/dist/_worker.js/chunks/narrat_Ds6-p5JZ.mjs +0 -1
  329. package/website/dist/_worker.js/chunks/nextflow_v2N1Qlqa.mjs +0 -1
  330. package/website/dist/_worker.js/chunks/nginx_Bp9Ab2NH.mjs +0 -1
  331. package/website/dist/_worker.js/chunks/night-owl_CdwOw_sc.mjs +0 -1
  332. package/website/dist/_worker.js/chunks/nim_BXGDUe53.mjs +0 -1
  333. package/website/dist/_worker.js/chunks/nix_CUig1nJH.mjs +0 -1
  334. package/website/dist/_worker.js/chunks/noop-middleware_DlWGj5t5.mjs +0 -10
  335. package/website/dist/_worker.js/chunks/nord_SPoG1iae.mjs +0 -1
  336. package/website/dist/_worker.js/chunks/nushell_DJw1Lca8.mjs +0 -1
  337. package/website/dist/_worker.js/chunks/objective-c_Bktzl_CO.mjs +0 -1
  338. package/website/dist/_worker.js/chunks/objective-cpp_CP4DWdDp.mjs +0 -1
  339. package/website/dist/_worker.js/chunks/ocaml_CeEAs7bZ.mjs +0 -1
  340. package/website/dist/_worker.js/chunks/one-dark-pro_-hIwCNMi.mjs +0 -1
  341. package/website/dist/_worker.js/chunks/one-light_DSmYvJ05.mjs +0 -1
  342. package/website/dist/_worker.js/chunks/pascal_C-S_Ms_o.mjs +0 -1
  343. package/website/dist/_worker.js/chunks/perl_CKamvo15.mjs +0 -1
  344. package/website/dist/_worker.js/chunks/php_BlmcX_F3.mjs +0 -1
  345. package/website/dist/_worker.js/chunks/plastic_Ryt8tVoA.mjs +0 -1
  346. package/website/dist/_worker.js/chunks/plsql_Cb3v7cBj.mjs +0 -1
  347. package/website/dist/_worker.js/chunks/po_DZbdNRlo.mjs +0 -1
  348. package/website/dist/_worker.js/chunks/poimandres_bYmE3_5d.mjs +0 -1
  349. package/website/dist/_worker.js/chunks/polar_pJkMGwoW.mjs +0 -1
  350. package/website/dist/_worker.js/chunks/postcss_BAXSOKgk.mjs +0 -1
  351. package/website/dist/_worker.js/chunks/powerquery_oITMGN4x.mjs +0 -1
  352. package/website/dist/_worker.js/chunks/powershell_6306-xIF.mjs +0 -1
  353. package/website/dist/_worker.js/chunks/prisma_DSDxnZGz.mjs +0 -1
  354. package/website/dist/_worker.js/chunks/prolog_CxG7tjZR.mjs +0 -1
  355. package/website/dist/_worker.js/chunks/proto_CS9ByXm1.mjs +0 -1
  356. package/website/dist/_worker.js/chunks/pug_BMtLJo6U.mjs +0 -1
  357. package/website/dist/_worker.js/chunks/puppet_BfeeSzee.mjs +0 -1
  358. package/website/dist/_worker.js/chunks/purescript_BFfueNaH.mjs +0 -1
  359. package/website/dist/_worker.js/chunks/python_Cc4Faapv.mjs +0 -1
  360. package/website/dist/_worker.js/chunks/qml_C1CTJTK8.mjs +0 -1
  361. package/website/dist/_worker.js/chunks/qmldir_nG1KaqKR.mjs +0 -1
  362. package/website/dist/_worker.js/chunks/qss_Cncxk263.mjs +0 -1
  363. package/website/dist/_worker.js/chunks/r_ChR54Ihi.mjs +0 -1
  364. package/website/dist/_worker.js/chunks/racket_BDrhptDs.mjs +0 -1
  365. package/website/dist/_worker.js/chunks/raku_07OUHa0P.mjs +0 -1
  366. package/website/dist/_worker.js/chunks/razor_DIP3INLa.mjs +0 -1
  367. package/website/dist/_worker.js/chunks/red_DOPXfj-6.mjs +0 -1
  368. package/website/dist/_worker.js/chunks/reg_B64SwEDj.mjs +0 -1
  369. package/website/dist/_worker.js/chunks/regexp_ButFGoB5.mjs +0 -1
  370. package/website/dist/_worker.js/chunks/rel_BWJAWqZD.mjs +0 -1
  371. package/website/dist/_worker.js/chunks/riscv_79gXlbsF.mjs +0 -1
  372. package/website/dist/_worker.js/chunks/rose-pine-dawn_DHIjVGd3.mjs +0 -1
  373. package/website/dist/_worker.js/chunks/rose-pine-moon_t86aEbs0.mjs +0 -1
  374. package/website/dist/_worker.js/chunks/rose-pine_BHgrcDCs.mjs +0 -1
  375. package/website/dist/_worker.js/chunks/rst_D3F4Fcpj.mjs +0 -1
  376. package/website/dist/_worker.js/chunks/ruby_Cs7vM9iv.mjs +0 -1
  377. package/website/dist/_worker.js/chunks/rust_DpyRVatH.mjs +0 -1
  378. package/website/dist/_worker.js/chunks/sas_DW45xZXN.mjs +0 -1
  379. package/website/dist/_worker.js/chunks/sass_C6SiMwN_.mjs +0 -1
  380. package/website/dist/_worker.js/chunks/scala_DlZOjNZk.mjs +0 -1
  381. package/website/dist/_worker.js/chunks/scheme_D2ezSJXu.mjs +0 -1
  382. package/website/dist/_worker.js/chunks/scss_DG5Spjqu.mjs +0 -1
  383. package/website/dist/_worker.js/chunks/sdbl_ZCYaj4VN.mjs +0 -1
  384. package/website/dist/_worker.js/chunks/shaderlab_CAcRkg1_.mjs +0 -1
  385. package/website/dist/_worker.js/chunks/shellscript_BWwhkDVh.mjs +0 -1
  386. package/website/dist/_worker.js/chunks/shellsession_BfEA3juK.mjs +0 -1
  387. package/website/dist/_worker.js/chunks/slack-dark_CL3lSpCc.mjs +0 -1
  388. package/website/dist/_worker.js/chunks/slack-ochin_DdZKOQVh.mjs +0 -1
  389. package/website/dist/_worker.js/chunks/smalltalk_DgilzSui.mjs +0 -1
  390. package/website/dist/_worker.js/chunks/snazzy-light_eJU08Pz_.mjs +0 -1
  391. package/website/dist/_worker.js/chunks/solarized-dark_Dg_YQywx.mjs +0 -1
  392. package/website/dist/_worker.js/chunks/solarized-light_BnIsrA6p.mjs +0 -1
  393. package/website/dist/_worker.js/chunks/solidity_DkseH8pQ.mjs +0 -1
  394. package/website/dist/_worker.js/chunks/soy_DU7bOYoG.mjs +0 -1
  395. package/website/dist/_worker.js/chunks/sparql_BuI1DBDH.mjs +0 -1
  396. package/website/dist/_worker.js/chunks/splunk_B8Ha9Pkg.mjs +0 -1
  397. package/website/dist/_worker.js/chunks/sql_BniHwea5.mjs +0 -1
  398. package/website/dist/_worker.js/chunks/ssh-config_CkE1GuVe.mjs +0 -1
  399. package/website/dist/_worker.js/chunks/stata_Dtqpbd_l.mjs +0 -1
  400. package/website/dist/_worker.js/chunks/stylus_CXTtglzO.mjs +0 -1
  401. package/website/dist/_worker.js/chunks/svelte_BjWYcUCN.mjs +0 -1
  402. package/website/dist/_worker.js/chunks/swift_BzHql_rM.mjs +0 -1
  403. package/website/dist/_worker.js/chunks/synthwave-84_DLRNhxNA.mjs +0 -1
  404. package/website/dist/_worker.js/chunks/system-verilog_ChyInPph.mjs +0 -1
  405. package/website/dist/_worker.js/chunks/systemd_Bi9Qa2qD.mjs +0 -1
  406. package/website/dist/_worker.js/chunks/talonscript_B3sH_Y-V.mjs +0 -1
  407. package/website/dist/_worker.js/chunks/tasl_BJ5yipRs.mjs +0 -1
  408. package/website/dist/_worker.js/chunks/tcl_CoJQjNoP.mjs +0 -1
  409. package/website/dist/_worker.js/chunks/templ_CrU7Ffil.mjs +0 -1
  410. package/website/dist/_worker.js/chunks/terraform_DT9JSFpC.mjs +0 -1
  411. package/website/dist/_worker.js/chunks/tex_5PKu2yA0.mjs +0 -1
  412. package/website/dist/_worker.js/chunks/tokyo-night_Buo8OK7-.mjs +0 -1
  413. package/website/dist/_worker.js/chunks/toml_CPuXX3oc.mjs +0 -1
  414. package/website/dist/_worker.js/chunks/ts-tags_D0M_1VSH.mjs +0 -1
  415. package/website/dist/_worker.js/chunks/tsv_CuivVNot.mjs +0 -1
  416. package/website/dist/_worker.js/chunks/tsx_MkuGr8MY.mjs +0 -1
  417. package/website/dist/_worker.js/chunks/turtle_BqgEPK7f.mjs +0 -1
  418. package/website/dist/_worker.js/chunks/twig_r1G9rpYJ.mjs +0 -1
  419. package/website/dist/_worker.js/chunks/typescript_Au5buqzM.mjs +0 -1
  420. package/website/dist/_worker.js/chunks/typespec_47rhBK_z.mjs +0 -1
  421. package/website/dist/_worker.js/chunks/typst_BAtuQLh-.mjs +0 -1
  422. package/website/dist/_worker.js/chunks/v_BIvWImHg.mjs +0 -1
  423. package/website/dist/_worker.js/chunks/vala_DYEacj30.mjs +0 -1
  424. package/website/dist/_worker.js/chunks/vb_CikQuqGJ.mjs +0 -1
  425. package/website/dist/_worker.js/chunks/verilog_BQRENwI-.mjs +0 -1
  426. package/website/dist/_worker.js/chunks/vesper_DA0kvTmj.mjs +0 -1
  427. package/website/dist/_worker.js/chunks/vhdl_DHscJIyg.mjs +0 -1
  428. package/website/dist/_worker.js/chunks/viml_F2pvMwvG.mjs +0 -1
  429. package/website/dist/_worker.js/chunks/vitesse-black_D9tjNzd0.mjs +0 -1
  430. package/website/dist/_worker.js/chunks/vitesse-dark_Bnm5d0hd.mjs +0 -1
  431. package/website/dist/_worker.js/chunks/vitesse-light_CHwbyjNR.mjs +0 -1
  432. package/website/dist/_worker.js/chunks/vue-html_DyYtbbMK.mjs +0 -1
  433. package/website/dist/_worker.js/chunks/vue_DofN6juy.mjs +0 -1
  434. package/website/dist/_worker.js/chunks/vyper_CiR0m-OV.mjs +0 -1
  435. package/website/dist/_worker.js/chunks/wasm_CwIGgRGf.mjs +0 -1
  436. package/website/dist/_worker.js/chunks/wasm_jKWhg0J0.mjs +0 -1
  437. package/website/dist/_worker.js/chunks/wenyan_DKvVZKXW.mjs +0 -1
  438. package/website/dist/_worker.js/chunks/wgsl_BOWZY7yw.mjs +0 -1
  439. package/website/dist/_worker.js/chunks/wikitext_CXDhhHPy.mjs +0 -1
  440. package/website/dist/_worker.js/chunks/wolfram_ChkmGnW0.mjs +0 -1
  441. package/website/dist/_worker.js/chunks/xml_DXH3hHIu.mjs +0 -1
  442. package/website/dist/_worker.js/chunks/xsl_DuP2mFjg.mjs +0 -1
  443. package/website/dist/_worker.js/chunks/yaml_IGiEkTge.mjs +0 -1
  444. package/website/dist/_worker.js/chunks/zenscript_59iXGyNw.mjs +0 -1
  445. package/website/dist/_worker.js/chunks/zig_DKzb0zdT.mjs +0 -1
  446. package/website/dist/_worker.js/index.js +0 -53
  447. package/website/dist/_worker.js/manifest_CT_D-YDe.mjs +0 -98
  448. package/website/dist/_worker.js/pages/_image.astro.mjs +0 -24
  449. package/website/dist/_worker.js/pages/agents.astro.mjs +0 -1
  450. package/website/dist/_worker.js/pages/animation.astro.mjs +0 -1
  451. package/website/dist/_worker.js/pages/api/raw-markdown/_---path_.astro.mjs +0 -44
  452. package/website/dist/_worker.js/pages/config.astro.mjs +0 -1
  453. package/website/dist/_worker.js/pages/fonts.astro.mjs +0 -1
  454. package/website/dist/_worker.js/pages/getting-started.astro.mjs +0 -1
  455. package/website/dist/_worker.js/pages/helpers.astro.mjs +0 -1
  456. package/website/dist/_worker.js/pages/images.astro.mjs +0 -1
  457. package/website/dist/_worker.js/pages/index.astro.mjs +0 -1
  458. package/website/dist/_worker.js/pages/llm.txt.astro.mjs +0 -1
  459. package/website/dist/_worker.js/pages/preview.astro.mjs +0 -1
  460. package/website/dist/_worker.js/pages/sdk.astro.mjs +0 -1
  461. package/website/dist/_worker.js/pages/sitemap.xml.astro.mjs +0 -1
  462. package/website/dist/_worker.js/pages/styling.astro.mjs +0 -1
  463. package/website/dist/_worker.js/pages/templates.astro.mjs +0 -1
  464. package/website/dist/_worker.js/pages/video.astro.mjs +0 -1
  465. package/website/dist/_worker.js/renderers.mjs +0 -57
  466. package/website/dist/agents/index.html +0 -52
  467. package/website/dist/animation/index.html +0 -879
  468. package/website/dist/config/index.html +0 -184
  469. package/website/dist/fonts/index.html +0 -198
  470. package/website/dist/getting-started/index.html +0 -107
  471. package/website/dist/helpers/index.html +0 -164
  472. package/website/dist/images/index.html +0 -335
  473. package/website/dist/index.html +0 -140
  474. package/website/dist/llm.txt +0 -2776
  475. package/website/dist/preview/index.html +0 -111
  476. package/website/dist/robots.txt +0 -40
  477. package/website/dist/sdk/index.html +0 -1076
  478. package/website/dist/sitemap.xml +0 -76
  479. package/website/dist/styling/index.html +0 -366
  480. package/website/dist/templates/index.html +0 -74
  481. package/website/dist/video/index.html +0 -319
  482. package/website/package-lock.json +0 -8089
  483. package/website/package.json +0 -41
  484. package/website/public/.gitkeep +0 -5
  485. package/website/public/robots.txt +0 -40
  486. package/website/templates/og-image.tsx +0 -60
@@ -1,107 +0,0 @@
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/getting-started/"><!-- Primary Meta Tags --><title></title><meta name="title"><meta name="description" content="CLI-based Image &#38; 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/getting-started/"><meta property="og:title"><meta property="og:description" content="CLI-based Image &#38; Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta property="og:image" content="https://loopwind.dev/api/og/getting-started"><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/getting-started/"><meta name="twitter:title"><meta name="twitter:description" content="CLI-based Image &#38; Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta name="twitter:image" content="https://loopwind.dev/api/og/getting-started"><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/getting-started","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":"Getting started","item":"https://loopwind.dev/getting-started"}]}</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> <h2 id="quick-start">Quick Start</h2>
3
- <p>Loopwind is a CLI tool and SDK kit for generating images and videos with React and Tailwind CSS. It’s designed to be used with AI Agents and Cursor.</p>
4
- <h3 id="installation">Installation</h3>
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:#B392F0">npm</span><span style="color:#9ECBFF"> install</span><span style="color:#79B8FF"> -g</span><span style="color:#9ECBFF"> loopwind</span></span>
6
- <span class="line"></span></code></pre>
7
- <p>Or use with npx:</p>
8
- <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:#B392F0">npx</span><span style="color:#9ECBFF"> loopwind</span><span style="color:#79B8FF"> --help</span></span>
9
- <span class="line"></span></code></pre>
10
- <h3 id="initialize-in-your-project">Initialize in Your Project</h3>
11
- <p>Navigate to any project folder and run:</p>
12
- <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:#B392F0">loopwind</span><span style="color:#9ECBFF"> init</span></span>
13
- <span class="line"></span></code></pre>
14
- <p>This creates a <code>_loopwind/</code> folder with <code>loopwind.json</code> config, templates, and outputs.</p>
15
- <h3 id="install-a-template">Install a Template</h3>
16
- <h4 id="1-official-templates">1. Official Templates</h4>
17
- <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:#B392F0">loopwind</span><span style="color:#9ECBFF"> add</span><span style="color:#9ECBFF"> image-template</span></span>
18
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> add</span><span style="color:#9ECBFF"> video-template</span></span>
19
- <span class="line"></span></code></pre>
20
- <p>Templates are installed to: <code>_loopwind/templates/&lt;template&gt;/</code> (customizable in <code>_loopwind/loopwind.json</code>)</p>
21
- <p><strong>Benefits:</strong></p>
22
- <ul>
23
- <li>Templates are local to your project</li>
24
- <li>Version controlled with your project</li>
25
- <li>Easy to share within your team</li>
26
- </ul>
27
- <h3 id="render-a-template">Render a Template</h3>
28
- <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:#B392F0">loopwind</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> template-name</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Hello World&quot;,&quot;subtitle&quot;:&quot;Built with loopwind&quot;}&#39;</span></span>
29
- <span class="line"></span></code></pre>
30
- <p>or use a local props file:</p>
31
- <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:#B392F0">loopwind</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> template-name</span><span style="color:#9ECBFF"> props.json</span></span>
32
- <span class="line"></span></code></pre>
33
- <h2 id="commands">Commands</h2>
34
- <h3 id="loopwind-add-source"><code>loopwind add &lt;source&gt;</code></h3>
35
- <p>Install a template from various sources:</p>
36
- <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"># Official templates</span></span>
37
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> add</span><span style="color:#9ECBFF"> image-template</span></span>
38
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> add</span><span style="color:#9ECBFF"> video-template</span></span>
39
- <span class="line"></span></code></pre>
40
- <p>These will be downloaded to <code>_loopwind/templates/&lt;template&gt;/</code></p>
41
- <h3 id="loopwind-list"><code>loopwind list</code></h3>
42
- <p>List all installed templates:</p>
43
- <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:#B392F0">loopwind</span><span style="color:#9ECBFF"> list</span></span>
44
- <span class="line"></span></code></pre>
45
- <h3 id="loopwind-render-template-props-options"><code>loopwind render &lt;template&gt; &lt;props&gt; [options]</code></h3>
46
- <p>Render an image or video:</p>
47
- <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"># Image with inline props</span></span>
48
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> banner-hero</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Hello World&quot;}&#39;</span></span>
49
- <span class="line"></span>
50
- <span class="line"><span style="color:#6A737D"># Video with inline props</span></span>
51
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> video-intro</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Welcome&quot;}&#39;</span></span>
52
- <span class="line"></span>
53
- <span class="line"><span style="color:#6A737D"># Using a props file</span></span>
54
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> banner-hero</span><span style="color:#9ECBFF"> props.json</span></span>
55
- <span class="line"></span>
56
- <span class="line"><span style="color:#6A737D"># Custom output</span></span>
57
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> banner-hero</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Hello&quot;}&#39;</span><span style="color:#79B8FF"> --out</span><span style="color:#9ECBFF"> custom-name.png</span></span>
58
- <span class="line"></span>
59
- <span class="line"><span style="color:#6A737D"># Different format</span></span>
60
- <span class="line"><span style="color:#B392F0">loopwind</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> banner-hero</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Hello&quot;}&#39;</span><span style="color:#79B8FF"> --format</span><span style="color:#9ECBFF"> jpeg</span></span>
61
- <span class="line"></span></code></pre>
62
- <p>Options:</p>
63
- <ul>
64
- <li><code>--out, -o</code> - Output filename (default: <code>_loopwind/outputs/&lt;template&gt;.&lt;ext&gt;</code>)</li>
65
- <li><code>--format</code> - Output format: <code>png</code>, <code>jpeg</code>, <code>svg</code> (images only)</li>
66
- <li><code>--quality</code> - JPEG quality 1-100 (default: 92)</li>
67
- </ul>
68
- <h3 id="loopwind-validate-template"><code>loopwind validate &lt;template&gt;</code></h3>
69
- <p>Validate a template:</p>
70
- <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:#B392F0">loopwind</span><span style="color:#9ECBFF"> validate</span><span style="color:#9ECBFF"> banner-hero</span></span>
71
- <span class="line"></span></code></pre>
72
- <p>Checks:</p>
73
- <ul>
74
- <li>Template file exists and is valid React</li>
75
- <li><code>export const meta</code> exists and is valid</li>
76
- <li>Required props are defined</li>
77
- <li>Fonts exist (if specified)</li>
78
- </ul>
79
- <h3 id="loopwind-init"><code>loopwind init</code></h3>
80
- <p>Initialize loopwind in a project:</p>
81
- <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:#B392F0">loopwind</span><span style="color:#9ECBFF"> init</span></span>
82
- <span class="line"></span></code></pre>
83
- <p>Creates <code>_loopwind/loopwind.json</code> configuration file.</p>
84
- <h2 id="animation-classes-video-only">Animation Classes (Video Only)</h2>
85
- <p>Use Tailwind-style animation classes - no manual calculations needed:</p>
86
- <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 in: starts at 0ms, lasts 500ms</span></span>
87
- <span class="line"><span style="color:#E1E4E8">&lt;</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">&#39;enter-fade-in/0/500&#39;</span><span style="color:#E1E4E8">)}&gt;Hello&lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
88
- <span class="line"></span>
89
- <span class="line"><span style="color:#6A737D">// Loop: ping effect every 500ms</span></span>
90
- <span class="line"><span style="color:#E1E4E8">&lt;</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">&#39;loop-ping/500&#39;</span><span style="color:#E1E4E8">)} /&gt;</span></span>
91
- <span class="line"></span>
92
- <span class="line"><span style="color:#6A737D">// Combined with easing</span></span>
93
- <span class="line"><span style="color:#E1E4E8">&lt;</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">&#39;ease-out enter-bounce-in-up/0/600&#39;</span><span style="color:#E1E4E8">)}&gt;Title&lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
94
- <span class="line"></span></code></pre>
95
- <p>See <a href="/animation">Animation</a> for the complete reference.</p>
96
- <h2 id="next-steps">Next Steps</h2>
97
- <ul>
98
- <li><a href="/templates">Learn about Templates</a></li>
99
- <li><a href="/images">Image Rendering</a></li>
100
- <li><a href="/video">Video Rendering</a></li>
101
- <li><a href="/animation">Animation</a></li>
102
- <li><a href="/helpers">Helpers (QR, Template Composition)</a></li>
103
- <li><a href="/styling">Styling with Tailwind &amp; shadcn/ui</a></li>
104
- <li><a href="/fonts">Custom Fonts</a></li>
105
- <li><a href="/sdk">SDK Usage</a></li>
106
- <li><a href="/agents">AI Agent Integration</a></li>
107
- </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>
@@ -1,164 +0,0 @@
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/helpers/"><!-- Primary Meta Tags --><title></title><meta name="title"><meta name="description" content="CLI-based Image &#38; 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/helpers/"><meta property="og:title"><meta property="og:description" content="CLI-based Image &#38; Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta property="og:image" content="https://loopwind.dev/api/og/helpers"><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/helpers/"><meta name="twitter:title"><meta name="twitter:description" content="CLI-based Image &#38; Video Generator for developers and AI Agents. Generate stunning visuals from React + Tailwind templates."><meta name="twitter:image" content="https://loopwind.dev/api/og/helpers"><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/helpers","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":"Helpers","item":"https://loopwind.dev/helpers"}]}</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="template-helpers">Template Helpers</h1>
3
- <p>Additional helpers for creating powerful, composable templates.</p>
4
- <h2 id="overview">Overview</h2>
5
- <p>Beyond the basics, loopwind provides:</p>
6
- <ul>
7
- <li><code>template()</code> - Compose templates together</li>
8
- <li><code>qr()</code> - Generate QR codes on the fly</li>
9
- <li><code>config</code> - Access user configuration</li>
10
- </ul>
11
- <p>For image embedding, see the <a href="/images">Images</a> page.</p>
12
- <h2 id="template-composition">Template Composition</h2>
13
- <p>Compose multiple templates together to create complex designs.</p>
14
- <h3 id="usage">Usage</h3>
15
- <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"> CompositeCard</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">template</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">author</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">avatar</span><span style="color:#E1E4E8"> }) {</span></span>
16
- <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
17
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;w-full h-full bg-gradient-to-br from-purple-600 to-blue-500 p-12&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
18
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;bg-white rounded-2xl p-8 shadow-xl&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
19
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;text-4xl font-bold text-gray-900 mb-6&#39;</span><span style="color:#E1E4E8">)}&gt;{title}&lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
20
- <span class="line"><span style="color:#E1E4E8"> </span></span>
21
- <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Embed another template */</span><span style="color:#E1E4E8">}</span></span>
22
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;mb-6&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
23
- <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#B392F0">template</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;user-badge&#39;</span><span style="color:#E1E4E8">, {</span></span>
24
- <span class="line"><span style="color:#E1E4E8"> name: author,</span></span>
25
- <span class="line"><span style="color:#E1E4E8"> avatar: avatar</span></span>
26
- <span class="line"><span style="color:#E1E4E8"> })}</span></span>
27
- <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
28
- <span class="line"><span style="color:#E1E4E8"> </span></span>
29
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;text-gray-600&#39;</span><span style="color:#E1E4E8">)}&gt;Published by {author}&lt;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">&gt;</span></span>
30
- <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
31
- <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
32
- <span class="line"><span style="color:#E1E4E8"> );</span></span>
33
- <span class="line"><span style="color:#E1E4E8">}</span></span>
34
- <span class="line"></span></code></pre>
35
- <p><strong>How it works:</strong></p>
36
- <ol>
37
- <li><code>template(name, props)</code> renders another installed template</li>
38
- <li>The embedded template is rendered at its specified size</li>
39
- <li>You can embed multiple templates in one design</li>
40
- <li>Templates can be nested (template within a template)</li>
41
- </ol>
42
- <h3 id="use-cases">Use Cases</h3>
43
- <p><strong>1. Reusable components:</strong></p>
44
- <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">// Create a logo template once, use it everywhere</span></span>
45
- <span class="line"><span style="color:#E1E4E8">&lt;</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;{</span><span style="color:#B392F0">template</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;company-logo&#39;</span><span style="color:#E1E4E8">, { variant: </span><span style="color:#9ECBFF">&#39;dark&#39;</span><span style="color:#E1E4E8"> })}&lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
46
- <span class="line"></span></code></pre>
47
- <p><strong>2. Complex layouts:</strong></p>
48
- <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">// Combine multiple templates into one design</span></span>
49
- <span class="line"><span style="color:#E1E4E8">&lt;</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">&#39;grid grid-cols-2 gap-4&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
50
- <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#B392F0">template</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;product-card&#39;</span><span style="color:#E1E4E8">, { product: product1 })}</span></span>
51
- <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#B392F0">template</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;product-card&#39;</span><span style="color:#E1E4E8">, { product: product2 })}</span></span>
52
- <span class="line"><span style="color:#E1E4E8">&lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
53
- <span class="line"></span></code></pre>
54
- <p><strong>3. Dynamic content:</strong></p>
55
- <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">// Render templates based on data</span></span>
56
- <span class="line"><span style="color:#E1E4E8">{users.</span><span style="color:#B392F0">map</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">user</span><span style="color:#F97583"> =&gt;</span><span style="color:#E1E4E8"> </span></span>
57
- <span class="line"><span style="color:#B392F0"> template</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;user-avatar&#39;</span><span style="color:#E1E4E8">, { name: user.name, image: user.avatar })</span></span>
58
- <span class="line"><span style="color:#E1E4E8">)}</span></span>
59
- <span class="line"></span></code></pre>
60
- <h3 id="best-practices">Best Practices</h3>
61
- <ol>
62
- <li><strong>Keep templates focused</strong> - Each template should do one thing well</li>
63
- <li><strong>Pass minimal props</strong> - Only pass what the embedded template needs</li>
64
- <li><strong>Document dependencies</strong> - Note which templates are required in your README</li>
65
- <li><strong>Avoid deep nesting</strong> - Too many nested templates can be hard to debug</li>
66
- </ol>
67
- <h2 id="qr-codes">QR Codes</h2>
68
- <p>Generate QR codes dynamically in your templates.</p>
69
- <h3 id="usage-1">Usage</h3>
70
- <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"> QRCard</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">qr</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">url</span><span style="color:#E1E4E8"> }) {</span></span>
71
- <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
72
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;flex flex-col items-center justify-center w-full h-full bg-white p-10&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
73
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;text-4xl font-bold text-black mb-8&#39;</span><span style="color:#E1E4E8">)}&gt;{title}&lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
74
- <span class="line"><span style="color:#E1E4E8"> </span></span>
75
- <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Generate QR code for the URL */</span><span style="color:#E1E4E8">}</span></span>
76
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">qr</span><span style="color:#E1E4E8">(url)} </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">&#39;w-64 h-64&#39;</span><span style="color:#E1E4E8">)} /&gt;</span></span>
77
- <span class="line"><span style="color:#E1E4E8"> </span></span>
78
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;text-gray-600 mt-4&#39;</span><span style="color:#E1E4E8">)}&gt;{url}&lt;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">&gt;</span></span>
79
- <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
80
- <span class="line"><span style="color:#E1E4E8"> );</span></span>
81
- <span class="line"><span style="color:#E1E4E8">}</span></span>
82
- <span class="line"></span></code></pre>
83
- <p><strong>Props format:</strong></p>
84
- <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>
85
- <span class="line"><span style="color:#79B8FF"> &quot;title&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;Scan Me&quot;</span><span style="color:#E1E4E8">,</span></span>
86
- <span class="line"><span style="color:#79B8FF"> &quot;url&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;https://example.com&quot;</span></span>
87
- <span class="line"><span style="color:#E1E4E8">}</span></span>
88
- <span class="line"></span></code></pre>
89
- <h3 id="qr-options">QR Options</h3>
90
- <p>You can customize QR code appearance:</p>
91
- <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">// Basic QR code</span></span>
92
- <span class="line"><span style="color:#E1E4E8">&lt;</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">qr</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;https://example.com&#39;</span><span style="color:#E1E4E8">)} /&gt;</span></span>
93
- <span class="line"></span>
94
- <span class="line"><span style="color:#6A737D">// With error correction level</span></span>
95
- <span class="line"><span style="color:#E1E4E8">&lt;</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">qr</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;https://example.com&#39;</span><span style="color:#E1E4E8">, { errorCorrectionLevel: </span><span style="color:#9ECBFF">&#39;H&#39;</span><span style="color:#E1E4E8"> })} /&gt;</span></span>
96
- <span class="line"></span>
97
- <span class="line"><span style="color:#6A737D">// With custom size</span></span>
98
- <span class="line"><span style="color:#E1E4E8">&lt;</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">qr</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;https://example.com&#39;</span><span style="color:#E1E4E8">, { width: </span><span style="color:#79B8FF">512</span><span style="color:#E1E4E8"> })} /&gt;</span></span>
99
- <span class="line"></span></code></pre>
100
- <p><strong>Error correction levels:</strong></p>
101
- <ul>
102
- <li><code>L</code> - Low (~7% correction)</li>
103
- <li><code>M</code> - Medium (~15% correction) - default</li>
104
- <li><code>Q</code> - Quartile (~25% correction)</li>
105
- <li><code>H</code> - High (~30% correction)</li>
106
- </ul>
107
- <h2 id="user-configuration">User Configuration</h2>
108
- <p>Access user settings from <code>_loopwind/loopwind.json</code> using the <code>config</code> prop:</p>
109
- <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"> BrandedTemplate</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">config</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8"> }) {</span></span>
110
- <span class="line"><span style="color:#6A737D"> // Access custom colors from loopwind.json</span></span>
111
- <span class="line"><span style="color:#F97583"> const</span><span style="color:#79B8FF"> primaryColor</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> config?.colors?.brand </span><span style="color:#F97583">||</span><span style="color:#9ECBFF"> &#39;#6366f1&#39;</span><span style="color:#E1E4E8">;</span></span>
112
- <span class="line"><span style="color:#E1E4E8"> </span></span>
113
- <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
114
- <span class="line"><span style="color:#E1E4E8"> &lt;</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">&#39;w-full h-full p-12&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
115
- <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">h1</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{{ </span></span>
116
- <span class="line"><span style="color:#F97583"> ...</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;text-6xl font-bold&#39;</span><span style="color:#E1E4E8">),</span></span>
117
- <span class="line"><span style="color:#E1E4E8"> color: primaryColor </span></span>
118
- <span class="line"><span style="color:#E1E4E8"> }}&gt;</span></span>
119
- <span class="line"><span style="color:#E1E4E8"> {title}</span></span>
120
- <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
121
- <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
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
- <p><strong>User’s <code>_loopwind/loopwind.json</code>:</strong></p>
126
- <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>
127
- <span class="line"><span style="color:#79B8FF"> &quot;colors&quot;</span><span style="color:#E1E4E8">: {</span></span>
128
- <span class="line"><span style="color:#79B8FF"> &quot;brand&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;#ff6b6b&quot;</span></span>
129
- <span class="line"><span style="color:#E1E4E8"> },</span></span>
130
- <span class="line"><span style="color:#79B8FF"> &quot;fonts&quot;</span><span style="color:#E1E4E8">: {</span></span>
131
- <span class="line"><span style="color:#79B8FF"> &quot;sans&quot;</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">&quot;Inter&quot;</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">&quot;system-ui&quot;</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">&quot;sans-serif&quot;</span><span style="color:#E1E4E8">]</span></span>
132
- <span class="line"><span style="color:#E1E4E8"> }</span></span>
133
- <span class="line"><span style="color:#E1E4E8">}</span></span>
134
- <span class="line"></span></code></pre>
135
- <p>This allows templates to adapt to user preferences and brand guidelines.</p>
136
- <h2 id="all-props-reference">All Props Reference</h2>
137
- <p>Every template receives these props:</p>
138
- <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"> MyTemplate</span><span style="color:#E1E4E8">({ </span></span>
139
- <span class="line"><span style="color:#6A737D"> // Core helpers</span></span>
140
- <span class="line"><span style="color:#FFAB70"> tw</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// Tailwind class converter</span></span>
141
- <span class="line"><span style="color:#FFAB70"> qr</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// QR code generator (this page)</span></span>
142
- <span class="line"><span style="color:#FFAB70"> template</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// Template composer (this page)</span></span>
143
- <span class="line"><span style="color:#FFAB70"> config</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// User config from loopwind.json (this page)</span></span>
144
- <span class="line"><span style="color:#E1E4E8"> </span></span>
145
- <span class="line"><span style="color:#6A737D"> // Media helpers (see dedicated pages)</span></span>
146
- <span class="line"><span style="color:#FFAB70"> image</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// Image embedder → see /images</span></span>
147
- <span class="line"></span>
148
- <span class="line"><span style="color:#6A737D"> // Video-specific (only in video templates)</span></span>
149
- <span class="line"><span style="color:#FFAB70"> frame</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// Current frame number → see /video</span></span>
150
- <span class="line"><span style="color:#FFAB70"> progress</span><span style="color:#E1E4E8">, </span><span style="color:#6A737D">// Animation progress 0-1 → see /video</span></span>
151
- <span class="line"><span style="color:#E1E4E8"> </span></span>
152
- <span class="line"><span style="color:#6A737D"> // Your custom props</span></span>
153
- <span class="line"><span style="color:#F97583"> ...</span><span style="color:#FFAB70">props</span><span style="color:#6A737D"> // Any props from your props.json</span></span>
154
- <span class="line"><span style="color:#E1E4E8">}) {</span></span>
155
- <span class="line"><span style="color:#6A737D"> // Your template code</span></span>
156
- <span class="line"><span style="color:#E1E4E8">}</span></span>
157
- <span class="line"></span></code></pre>
158
- <h2 id="next-steps">Next Steps</h2>
159
- <ul>
160
- <li><a href="/images">Image Rendering and Embedding</a></li>
161
- <li><a href="/video">Video Animation</a></li>
162
- <li><a href="/styling">Styling with Tailwind &amp; shadcn/ui</a></li>
163
- <li><a href="/fonts">Custom Fonts</a></li>
164
- </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>