loopwind 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/FONTS.md +156 -0
  2. package/HELPERS_DEMO.md +134 -0
  3. package/PROJECT_STRUCTURE.md +286 -0
  4. package/PUBLISHING.md +171 -0
  5. package/README.md +1020 -0
  6. package/REGISTRY_SETUP.md +427 -0
  7. package/SHADCN_INTEGRATION.md +269 -0
  8. package/TAILWIND.md +228 -0
  9. package/TEMPLATE_SOURCES.md +363 -0
  10. package/_dsgn/templates/banner-hero/banner-hero.tsx +57 -0
  11. package/_dsgn/templates/banner-hero/meta.json +14 -0
  12. package/_dsgn/templates/composite-card/meta.json +16 -0
  13. package/_dsgn/templates/composite-card/template.tsx +44 -0
  14. package/_dsgn/templates/image/meta.json +13 -0
  15. package/_dsgn/templates/image/template.tsx +28 -0
  16. package/_dsgn/templates/kitchen-sink/meta.json +13 -0
  17. package/_dsgn/templates/kitchen-sink/template.tsx +72 -0
  18. package/_dsgn/templates/qr-card/meta.json +14 -0
  19. package/_dsgn/templates/qr-card/template.tsx +39 -0
  20. package/_dsgn/templates/test-parent/child/meta.json +11 -0
  21. package/_dsgn/templates/test-parent/child/template.tsx +27 -0
  22. package/_dsgn/templates/test-parent/meta.json +12 -0
  23. package/_dsgn/templates/test-parent/template.tsx +30 -0
  24. package/_dsgn/templates/test-sibling/meta.json +11 -0
  25. package/_dsgn/templates/test-sibling/template.tsx +20 -0
  26. package/_dsgn/templates/video/.tmp/template-1763421345296.mjs +43 -0
  27. package/_dsgn/templates/video/.tmp/template-1763421362228.mjs +43 -0
  28. package/_dsgn/templates/video/.tmp/template-1763421377706.mjs +43 -0
  29. package/_dsgn/templates/video/meta.json +17 -0
  30. package/_dsgn/templates/video/template.tsx +48 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +70 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/commands/add.d.ts +6 -0
  36. package/dist/commands/add.d.ts.map +1 -0
  37. package/dist/commands/add.js +86 -0
  38. package/dist/commands/add.js.map +1 -0
  39. package/dist/commands/default.d.ts +2 -0
  40. package/dist/commands/default.d.ts.map +1 -0
  41. package/dist/commands/default.js +69 -0
  42. package/dist/commands/default.js.map +1 -0
  43. package/dist/commands/init.d.ts +2 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +75 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/list.d.ts +2 -0
  48. package/dist/commands/list.d.ts.map +1 -0
  49. package/dist/commands/list.js +83 -0
  50. package/dist/commands/list.js.map +1 -0
  51. package/dist/commands/preview.d.ts +3 -0
  52. package/dist/commands/preview.d.ts.map +1 -0
  53. package/dist/commands/preview.js +296 -0
  54. package/dist/commands/preview.js.map +1 -0
  55. package/dist/commands/render.d.ts +10 -0
  56. package/dist/commands/render.d.ts.map +1 -0
  57. package/dist/commands/render.js +204 -0
  58. package/dist/commands/render.js.map +1 -0
  59. package/dist/commands/validate.d.ts +2 -0
  60. package/dist/commands/validate.d.ts.map +1 -0
  61. package/dist/commands/validate.js +107 -0
  62. package/dist/commands/validate.js.map +1 -0
  63. package/dist/default-templates/AGENTS.md +229 -0
  64. package/dist/default-templates/image/meta.json +13 -0
  65. package/dist/default-templates/image/template.d.ts +20 -0
  66. package/dist/default-templates/image/template.d.ts.map +1 -0
  67. package/dist/default-templates/image/template.js +18 -0
  68. package/dist/default-templates/image/template.js.map +1 -0
  69. package/dist/default-templates/image/template.tsx +20 -0
  70. package/dist/default-templates/image-template/meta.json +13 -0
  71. package/dist/default-templates/image-template/template.tsx +19 -0
  72. package/dist/default-templates/kitchen-sink/meta.json +13 -0
  73. package/dist/default-templates/kitchen-sink/template.tsx +64 -0
  74. package/dist/default-templates/page/meta.json +17 -0
  75. package/dist/default-templates/page/template.tsx +37 -0
  76. package/dist/default-templates/video/meta.json +17 -0
  77. package/dist/default-templates/video/template.d.ts +26 -0
  78. package/dist/default-templates/video/template.d.ts.map +1 -0
  79. package/dist/default-templates/video/template.js +33 -0
  80. package/dist/default-templates/video/template.js.map +1 -0
  81. package/dist/default-templates/video/template.tsx +37 -0
  82. package/dist/default-templates/video-template/meta.json +17 -0
  83. package/dist/default-templates/video-template/template.tsx +36 -0
  84. package/dist/default-templates/website/meta.json +16 -0
  85. package/dist/default-templates/website/pages/home.tsx +17 -0
  86. package/dist/default-templates/website/parts/footer.tsx +17 -0
  87. package/dist/default-templates/website/parts/header.tsx +17 -0
  88. package/dist/default-templates/website/template.tsx +17 -0
  89. package/dist/default-templates/website-template/meta.json +16 -0
  90. package/dist/default-templates/website-template/pages/home.tsx +16 -0
  91. package/dist/default-templates/website-template/parts/footer.tsx +16 -0
  92. package/dist/default-templates/website-template/parts/header.tsx +16 -0
  93. package/dist/default-templates/website-template/template.tsx +16 -0
  94. package/dist/lib/config.d.ts +34 -0
  95. package/dist/lib/config.d.ts.map +1 -0
  96. package/dist/lib/config.js +248 -0
  97. package/dist/lib/config.js.map +1 -0
  98. package/dist/lib/constants.d.ts +7 -0
  99. package/dist/lib/constants.d.ts.map +1 -0
  100. package/dist/lib/constants.js +12 -0
  101. package/dist/lib/constants.js.map +1 -0
  102. package/dist/lib/helpers.d.ts +29 -0
  103. package/dist/lib/helpers.d.ts.map +1 -0
  104. package/dist/lib/helpers.js +159 -0
  105. package/dist/lib/helpers.js.map +1 -0
  106. package/dist/lib/installer.d.ts +51 -0
  107. package/dist/lib/installer.d.ts.map +1 -0
  108. package/dist/lib/installer.js +215 -0
  109. package/dist/lib/installer.js.map +1 -0
  110. package/dist/lib/renderer.d.ts +51 -0
  111. package/dist/lib/renderer.d.ts.map +1 -0
  112. package/dist/lib/renderer.js +524 -0
  113. package/dist/lib/renderer.js.map +1 -0
  114. package/dist/lib/tailwind-config-loader.d.ts +47 -0
  115. package/dist/lib/tailwind-config-loader.d.ts.map +1 -0
  116. package/dist/lib/tailwind-config-loader.js +432 -0
  117. package/dist/lib/tailwind-config-loader.js.map +1 -0
  118. package/dist/lib/tailwind-detector.d.ts +36 -0
  119. package/dist/lib/tailwind-detector.d.ts.map +1 -0
  120. package/dist/lib/tailwind-detector.js +156 -0
  121. package/dist/lib/tailwind-detector.js.map +1 -0
  122. package/dist/lib/tailwind.d.ts +8 -0
  123. package/dist/lib/tailwind.d.ts.map +1 -0
  124. package/dist/lib/tailwind.js +994 -0
  125. package/dist/lib/tailwind.js.map +1 -0
  126. package/dist/lib/template-validator.d.ts +22 -0
  127. package/dist/lib/template-validator.d.ts.map +1 -0
  128. package/dist/lib/template-validator.js +174 -0
  129. package/dist/lib/template-validator.js.map +1 -0
  130. package/dist/lib/utils.d.ts +44 -0
  131. package/dist/lib/utils.d.ts.map +1 -0
  132. package/dist/lib/utils.js +207 -0
  133. package/dist/lib/utils.js.map +1 -0
  134. package/dist/lib/version-check.d.ts +16 -0
  135. package/dist/lib/version-check.d.ts.map +1 -0
  136. package/dist/lib/version-check.js +88 -0
  137. package/dist/lib/version-check.js.map +1 -0
  138. package/dist/lib/video-renderer.d.ts +32 -0
  139. package/dist/lib/video-renderer.d.ts.map +1 -0
  140. package/dist/lib/video-renderer.js +226 -0
  141. package/dist/lib/video-renderer.js.map +1 -0
  142. package/dist/sdk/index.d.ts +58 -0
  143. package/dist/sdk/index.d.ts.map +1 -0
  144. package/dist/sdk/index.js +119 -0
  145. package/dist/sdk/index.js.map +1 -0
  146. package/dist/sdk/template.d.ts +40 -0
  147. package/dist/sdk/template.d.ts.map +1 -0
  148. package/dist/sdk/template.js +60 -0
  149. package/dist/sdk/template.js.map +1 -0
  150. package/dist/types/config.d.ts +62 -0
  151. package/dist/types/config.d.ts.map +1 -0
  152. package/dist/types/config.js +47 -0
  153. package/dist/types/config.js.map +1 -0
  154. package/dist/types/template.d.ts +79 -0
  155. package/dist/types/template.d.ts.map +1 -0
  156. package/dist/types/template.js +2 -0
  157. package/dist/types/template.js.map +1 -0
  158. package/examples/nextjs-api/README.md +180 -0
  159. package/examples/nextjs-api/package.json +21 -0
  160. package/examples/nextjs-api/pages/api/intro-video.ts +53 -0
  161. package/examples/nextjs-api/pages/api/og-image.ts +50 -0
  162. package/netlify.toml +13 -0
  163. package/package.json +84 -0
  164. package/patches/satori+0.18.3.patch +13 -0
  165. package/test-templates/TESTS.md +63 -0
  166. package/test-templates/_dsgn/templates/absolute-spin/meta.json +7 -0
  167. package/test-templates/_dsgn/templates/absolute-spin/template.tsx +16 -0
  168. package/test-templates/_dsgn/templates/animated-intro/.tmp/template-1763468771640.mjs +7 -0
  169. package/test-templates/_dsgn/templates/animated-intro/meta.json +10 -0
  170. package/test-templates/_dsgn/templates/animated-intro/template.tsx +23 -0
  171. package/test-templates/_dsgn/templates/centered-spin/.tmp/template-1763468525386.mjs +7 -0
  172. package/test-templates/_dsgn/templates/centered-spin/meta.json +7 -0
  173. package/test-templates/_dsgn/templates/centered-spin/template.tsx +11 -0
  174. package/test-templates/_dsgn/templates/composite/.tmp/template-1763468815645.mjs +7 -0
  175. package/test-templates/_dsgn/templates/composite/meta.json +9 -0
  176. package/test-templates/_dsgn/templates/composite/template.tsx +23 -0
  177. package/test-templates/_dsgn/templates/easing-test/.tmp/template-1763468824501.mjs +7 -0
  178. package/test-templates/_dsgn/templates/easing-test/meta.json +7 -0
  179. package/test-templates/_dsgn/templates/easing-test/template.tsx +47 -0
  180. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466364336.mjs +10 -0
  181. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466584319.mjs +10 -0
  182. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466667797.mjs +10 -0
  183. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466746504.mjs +10 -0
  184. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763466930225.mjs +10 -0
  185. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467004552.mjs +10 -0
  186. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467060334.mjs +10 -0
  187. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467124493.mjs +10 -0
  188. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467174690.mjs +10 -0
  189. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467359134.mjs +10 -0
  190. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467451928.mjs +10 -0
  191. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467758275.mjs +10 -0
  192. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763467985201.mjs +10 -0
  193. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468020563.mjs +10 -0
  194. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468090428.mjs +10 -0
  195. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468211036.mjs +10 -0
  196. package/test-templates/_dsgn/templates/minimal-spin/.tmp/template-1763468394057.mjs +10 -0
  197. package/test-templates/_dsgn/templates/minimal-spin/meta.json +7 -0
  198. package/test-templates/_dsgn/templates/minimal-spin/template.tsx +13 -0
  199. package/test-templates/_dsgn/templates/no-origin-spin/meta.json +7 -0
  200. package/test-templates/_dsgn/templates/no-origin-spin/template.tsx +10 -0
  201. package/test-templates/_dsgn/templates/opacity-test/meta.json +7 -0
  202. package/test-templates/_dsgn/templates/opacity-test/template.tsx +9 -0
  203. package/test-templates/_dsgn/templates/qr-code/.tmp/template-1763468758954.mjs +17 -0
  204. package/test-templates/_dsgn/templates/qr-code/.tmp/template-1763468815672.mjs +17 -0
  205. package/test-templates/_dsgn/templates/qr-code/meta.json +9 -0
  206. package/test-templates/_dsgn/templates/qr-code/template.tsx +20 -0
  207. package/test-templates/_dsgn/templates/rotation-abs-test/meta.json +7 -0
  208. package/test-templates/_dsgn/templates/rotation-abs-test/template.tsx +15 -0
  209. package/test-templates/_dsgn/templates/rotation-corner/meta.json +7 -0
  210. package/test-templates/_dsgn/templates/rotation-corner/template.tsx +12 -0
  211. package/test-templates/_dsgn/templates/rotation-test/meta.json +7 -0
  212. package/test-templates/_dsgn/templates/rotation-test/template.tsx +12 -0
  213. package/test-templates/_dsgn/templates/shake-test/meta.json +7 -0
  214. package/test-templates/_dsgn/templates/shake-test/template.tsx +12 -0
  215. package/test-templates/_dsgn/templates/static-image/.tmp/template-1763468746271.mjs +7 -0
  216. package/test-templates/_dsgn/templates/static-image/meta.json +9 -0
  217. package/test-templates/_dsgn/templates/static-image/template.tsx +19 -0
  218. package/test-templates/_dsgn/templates/translate-test/meta.json +7 -0
  219. package/test-templates/_dsgn/templates/translate-test/template.tsx +9 -0
  220. package/test-templates/_dsgn/templates/video-loops/.tmp/template-1763468793192.mjs +15 -0
  221. package/test-templates/_dsgn/templates/video-loops/meta.json +9 -0
  222. package/test-templates/_dsgn/templates/video-loops/template.tsx +39 -0
  223. package/test-templates/_dsgn/templates/wrapped-spin/meta.json +7 -0
  224. package/test-templates/_dsgn/templates/wrapped-spin/template.tsx +17 -0
  225. package/test-templates/compare-svgs.mjs +30 -0
  226. package/test-templates/convert-frames.mjs +15 -0
  227. package/test-templates/debug-rotation.mjs +25 -0
  228. package/test-templates/run-tests.sh +39 -0
  229. package/test-templates/test-sdk.mjs +115 -0
  230. package/website/.astro/settings.json +5 -0
  231. package/website/.astro/types.d.ts +1 -0
  232. package/website/README.md +112 -0
  233. package/website/astro.config.mjs +18 -0
  234. package/website/dist/_astro/fonts.DHdiHGBO.css +1 -0
  235. package/website/dist/fonts/index.html +193 -0
  236. package/website/dist/helpers/index.html +166 -0
  237. package/website/dist/images/index.html +314 -0
  238. package/website/dist/index.html +219 -0
  239. package/website/dist/llm.txt +2448 -0
  240. package/website/dist/styling/index.html +365 -0
  241. package/website/dist/templates/index.html +124 -0
  242. package/website/dist/video/index.html +636 -0
  243. package/website/package-lock.json +7606 -0
  244. package/website/package.json +23 -0
  245. package/website/public/robots.txt +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG/F;;GAEG;AACH,SAAS,YAAY,CAAC,IAAS,EAAE,YAAoB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,wBAAwB;IACxB,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAE1E,aAAa;IACb,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACpF,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACxF,CAAC;IAED,cAAc;IACd,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;IAED,6CAA6C;IAC7C,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,wBAAwB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,YAAqB;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,mBAAmB,GAAG,YAAY;YACtC,CAAC,CAAC,CAAC,YAAY,CAAC;YAChB,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAC;QAElC,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;YACvC,cAAc,EAAE,CAAC;YAEjB,qBAAqB;YACrB,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC,CAAC;gBACxD,WAAW,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAExC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;oBAC/D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;wBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;oBACvC,CAAC,CAAC,CAAC;oBACH,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC;gBAC/B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,2BAA2B,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAQ,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC1D,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,cAAc,2BAA2B,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,WAAW,gBAAgB,cAAc,gBAAgB,CAAC,CAAC,CAAC;YAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,229 @@
1
+ # loopwind CLI - Quick Reference for AI Agents
2
+
3
+ > Template-based CLI for generating images and videos using Tailwind CSS + Satori
4
+
5
+ ## Essential Commands
6
+
7
+ ### 1. Initialize Project
8
+ ```bash
9
+ loopwind init
10
+ ```
11
+ Creates `loopwind.json` config file. Run this first in new projects.
12
+
13
+ ### 2. Add Templates
14
+ ```bash
15
+ loopwind add <template> # From registry ('image' or 'video' default)
16
+ ```
17
+
18
+ ### 3. List Installed Templates
19
+ ```bash
20
+ loopwind list
21
+ ```
22
+
23
+ ### 4. Render Images
24
+ ```bash
25
+ # With inline props (JSON string)
26
+ loopwind render banner-hero '{"title":"Hello World"}'
27
+
28
+ # With props file
29
+ loopwind render banner-hero props.json
30
+
31
+ # Specify output path and format
32
+ loopwind render banner-hero props.json --out output.png --format png
33
+
34
+ # Supported formats: png (default), svg, webp, jpg, jpeg
35
+ ```
36
+
37
+ ### 5. Render Videos
38
+ ```bash
39
+ # Requires ffmpeg installed
40
+ loopwind render my-video '{"title":"Video Title"}'
41
+
42
+ # With options
43
+ loopwind render my-video props.json --preset fast --crf 23
44
+
45
+ # Export frames only (no ffmpeg needed)
46
+ loopwind render my-video props.json --frames-only
47
+
48
+ # Keep frames after encoding
49
+ loopwind render my-video props.json --keep-frames
50
+ ```
51
+
52
+ ### 6. Validate Templates
53
+ ```bash
54
+ loopwind validate [template] # Validate one or all templates
55
+ ```
56
+
57
+ ## Project Structure
58
+
59
+ ```
60
+ project/
61
+ ├── loopwind.json # Config (colors, fonts, paths)
62
+ └── _loopwind/
63
+ ├── AGENTS.md # This file
64
+ ├── templates/ # Installed templates
65
+ └── outputs/ # Generated files
66
+ ```
67
+
68
+ ## Template Types
69
+
70
+ ### Image Template
71
+ **meta.json:**
72
+ ```json
73
+ {
74
+ "name": "my-template",
75
+ "type": "image",
76
+ "size": { "width": 1200, "height": 630 },
77
+ "props": { "title": "string" }
78
+ }
79
+ ```
80
+
81
+ **template.tsx:**
82
+ ```tsx
83
+ export default function Template({ title, tw }) {
84
+ return (
85
+ <div style={tw('flex items-center justify-center w-full h-full bg-primary')}>
86
+ <h1 style={tw('text-6xl font-bold text-white')}>{title}</h1>
87
+ </div>
88
+ );
89
+ }
90
+ ```
91
+
92
+ ### Video Template
93
+ **meta.json:**
94
+ ```json
95
+ {
96
+ "name": "my-video",
97
+ "type": "video",
98
+ "size": { "width": 1920, "height": 1080 },
99
+ "video": { "fps": 30, "duration": 3 },
100
+ "props": { "title": "string" }
101
+ }
102
+ ```
103
+
104
+ **template.tsx:**
105
+ ```tsx
106
+ export default function VideoTemplate({ title, tw, progress }) {
107
+ const opacity = progress < 0.2 ? progress / 0.2 : 1;
108
+
109
+ return (
110
+ <div style={tw('flex items-center justify-center w-full h-full bg-black')}>
111
+ <h1 style={{ ...tw('text-8xl font-bold text-white'), opacity }}>
112
+ {title}
113
+ </h1>
114
+ </div>
115
+ );
116
+ }
117
+ ```
118
+
119
+ ## Template Helpers
120
+
121
+ All templates receive these helper functions:
122
+
123
+ ```tsx
124
+ export default function Template({
125
+ // User props
126
+ title,
127
+ subtitle,
128
+
129
+ // Built-in helpers
130
+ tw, // Convert Tailwind classes to inline styles
131
+ qr, // Generate QR code data URIs
132
+ image, // Load images as data URIs
133
+ video, // Load video frames (video templates only)
134
+ template, // Embed other templates
135
+ config, // Access loopwind.json config
136
+
137
+ // Video template props
138
+ frame, // Current frame number (0, 1, 2, ...)
139
+ progress, // Animation progress (0 to 1)
140
+ }) {
141
+ return (
142
+ <div style={tw('flex w-full h-full')}>
143
+ {/* Your template code */}
144
+ </div>
145
+ );
146
+ }
147
+ ```
148
+
149
+ ### Helper Examples
150
+
151
+ **`tw()` - Tailwind to inline styles:**
152
+ ```tsx
153
+ <div style={tw('flex items-center justify-center bg-primary text-white p-8')}>
154
+ <h1 style={tw('text-6xl font-bold')}>Title</h1>
155
+ </div>
156
+ ```
157
+
158
+ **`qr()` - Generate QR codes:**
159
+ ```tsx
160
+ <img src={qr('https://example.com')} width={200} height={200} />
161
+ ```
162
+
163
+ **`image()` - Embed images:**
164
+ ```tsx
165
+ // Props: { background: "./bg.jpg" }
166
+ <img src={image('background')} style={tw('w-full h-full')} />
167
+ ```
168
+
169
+ **`video()` - Embed videos (auto-syncs to frame):**
170
+ ```tsx
171
+ // Props: { background: "./video.mp4" }
172
+ <img src={video('background')} style={tw('absolute inset-0')} />
173
+ ```
174
+
175
+ **`template()` - Embed templates:**
176
+ ```tsx
177
+ {template('banner-hero', { title: 'Nested', subtitle: 'Template' })}
178
+ ```
179
+
180
+ ## Common Workflows
181
+
182
+ ### Generate Image
183
+ ```bash
184
+ loopwind init
185
+ loopwind add banner-hero
186
+ loopwind render banner-hero '{"title":"Hello","subtitle":"World"}'
187
+ ```
188
+
189
+ ### Generate Video
190
+ ```bash
191
+ loopwind add my-video
192
+ loopwind render my-video '{"title":"Amazing Video"}' # Requires ffmpeg
193
+ ```
194
+
195
+ ### Use Custom Branding
196
+ ```bash
197
+ loopwind init # Detects tailwind.config.js automatically
198
+ # Edit loopwind.json to customize colors/fonts
199
+ loopwind add og-image
200
+ loopwind render og-image '{"title":"My Page"}'
201
+ ```
202
+
203
+ ## Satori Limitations
204
+
205
+ **Not Supported:**
206
+ - Backdrop filters, 3D transforms, calc(), z-index
207
+
208
+ **Workarounds:**
209
+ - Pre-calculate values instead of calc()
210
+ - Use DOM order instead of z-index
211
+
212
+ **Fully Supported:**
213
+ - Flexbox, colors, gradients, typography, spacing, borders, opacity, shadows, text-shadow, filters (blur, brightness, contrast, etc.)
214
+
215
+ ## Key Points for Agents
216
+
217
+ 1. Always run `loopwind init` first in new projects
218
+ 2. Check `loopwind list` to see available templates
219
+ 3. Video rendering requires ffmpeg (or use `--frames-only`)
220
+ 4. Image props are auto-detected (any prop ending in .jpg, .png, etc.)
221
+ 5. Video props are extracted at template FPS and cached
222
+ 6. Use `tw()` for all styling - it uses project's Tailwind config
223
+ 7. Templates use React/JSX but render to static images/videos
224
+ 8. Default output: `_loopwind/outputs/<template>.<format>`
225
+
226
+ ## Need Help?
227
+
228
+ - Documentation: https://github.com/tomtev/loopwind
229
+ - Issues: https://github.com/tomtev/loopwind/issues
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "image",
3
+ "description": "Simple image starter template",
4
+ "type": "image",
5
+ "size": {
6
+ "width": 1200,
7
+ "height": 630
8
+ },
9
+ "props": {
10
+ "title": "string",
11
+ "description": "string?"
12
+ }
13
+ }
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ export declare const meta: {
3
+ name: string;
4
+ description: string;
5
+ type: string;
6
+ size: {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ props: {
11
+ title: string;
12
+ description: string;
13
+ };
14
+ };
15
+ export default function Template({ title, description, tw }: {
16
+ title: any;
17
+ description: any;
18
+ tw: any;
19
+ }): React.JSX.Element;
20
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/default-templates/image/template.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,IAAI;;;;;;;;;;;;CAShB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;;;;CAAA,qBAe1D"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ export const meta = {
3
+ name: "image",
4
+ description: "Simple image starter template",
5
+ type: "image",
6
+ size: { width: 1200, height: 630 },
7
+ props: {
8
+ title: "string",
9
+ description: "string?"
10
+ }
11
+ };
12
+ export default function Template({ title, description, tw }) {
13
+ return (React.createElement("div", { style: tw('w-full h-full flex flex-col justify-center items-center bg-background p-16') },
14
+ React.createElement("div", { style: tw('bg-card border rounded-xl p-12 flex flex-col max-w-4xl') },
15
+ React.createElement("h1", { style: tw('text-7xl font-bold text-foreground mb-4') }, title),
16
+ description && (React.createElement("p", { style: tw('text-3xl text-muted-foreground') }, description)))));
17
+ }
18
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/default-templates/image/template.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,+BAA+B;IAC5C,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAClC,KAAK,EAAE;QACL,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,SAAS;KACvB;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;IACzD,OAAO,CACL,6BAAK,KAAK,EAAE,EAAE,CAAC,4EAA4E,CAAC;QAC1F,6BAAK,KAAK,EAAE,EAAE,CAAC,wDAAwD,CAAC;YACtE,4BAAI,KAAK,EAAE,EAAE,CAAC,yCAAyC,CAAC,IACrD,KAAK,CACH;YACJ,WAAW,IAAI,CACd,2BAAG,KAAK,EAAE,EAAE,CAAC,gCAAgC,CAAC,IAC3C,WAAW,CACV,CACL,CACG,CACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+
3
+ // Template metadata is defined in meta.json
4
+
5
+ export default function Template({ title, description, tw }) {
6
+ return (
7
+ <div style={tw('w-full h-full flex flex-col justify-center items-center bg-background p-16')}>
8
+ <div style={tw('bg-card border rounded-xl p-12 flex flex-col max-w-4xl')}>
9
+ <h1 style={tw('text-7xl font-bold text-foreground mb-4')}>
10
+ {title}
11
+ </h1>
12
+ {description && (
13
+ <p style={tw('text-3xl text-muted-foreground')}>
14
+ {description}
15
+ </p>
16
+ )}
17
+ </div>
18
+ </div>
19
+ );
20
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "image",
3
+ "description": "Simple image starter template",
4
+ "type": "image",
5
+ "size": {
6
+ "width": 1200,
7
+ "height": 630
8
+ },
9
+ "props": {
10
+ "title": "string",
11
+ "description": "string?"
12
+ }
13
+ }
@@ -0,0 +1,19 @@
1
+
2
+ // Template metadata is defined in meta.json
3
+
4
+ export default function Template({ title, description, tw }) {
5
+ return (
6
+ <div style={tw('w-full h-full flex flex-col justify-center items-center bg-background p-16')}>
7
+ <div style={tw('bg-card border rounded-xl p-12 flex flex-col max-w-4xl')}>
8
+ <h1 style={tw('text-7xl font-bold text-foreground mb-4')}>
9
+ {title}
10
+ </h1>
11
+ {description && (
12
+ <p style={tw('text-3xl text-muted-foreground')}>
13
+ {description}
14
+ </p>
15
+ )}
16
+ </div>
17
+ </div>
18
+ );
19
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "kitchen-sink",
3
+ "description": "Comprehensive example showcasing all supported Tailwind features",
4
+ "type": "image",
5
+ "size": {
6
+ "width": 1200,
7
+ "height": 630
8
+ },
9
+ "props": {
10
+ "title": "string",
11
+ "subtitle": "string?"
12
+ }
13
+ }
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+
3
+ // Template metadata is defined in meta.json
4
+
5
+ export default function Template({ title, subtitle, tw }) {
6
+ return (
7
+ <div style={tw('w-full h-full flex flex-col bg-gradient-to-br from-indigo-500 via-purple-500 to-pink-500 p-8')}>
8
+ {/* Header Card with Shadow */}
9
+ <div style={tw('bg-white rounded-2xl shadow-2xl p-8 mb-4 max-w-5xl flex flex-col')}>
10
+ <h1 style={tw('text-6xl font-extrabold text-indigo-600 mb-3 uppercase tracking-wide')}>
11
+ {title}
12
+ </h1>
13
+ {subtitle && (
14
+ <p style={tw('text-2xl text-gray-600 italic leading-relaxed')}>
15
+ {subtitle}
16
+ </p>
17
+ )}
18
+ </div>
19
+
20
+ {/* Feature Cards Grid */}
21
+ <div style={tw('flex flex-wrap gap-4 max-w-6xl flex-1')}>
22
+ {/* Card 1: Gradients & Shadows */}
23
+ <div style={tw('bg-gradient-to-br from-cyan-400 to-blue-500 rounded-xl shadow-lg p-6 flex-1 min-w-0 flex flex-col')}>
24
+ <h2 style={tw('text-2xl font-bold text-white mb-2 tracking-wider')}>
25
+ Gradients
26
+ </h2>
27
+ <p style={tw('text-sm text-white text-opacity-90 leading-normal')}>
28
+ Full gradient support
29
+ </p>
30
+ </div>
31
+
32
+ {/* Card 2: Borders & Transforms */}
33
+ <div style={tw('bg-white rounded-lg border-4 border-emerald-500 p-6 flex-1 min-w-0 flex flex-col shadow-md rotate-1')}>
34
+ <h2 style={tw('text-2xl font-semibold text-emerald-700 mb-2')}>
35
+ Transforms
36
+ </h2>
37
+ <p style={tw('text-sm text-gray-600 leading-tight')}>
38
+ Rotation supported!
39
+ </p>
40
+ </div>
41
+
42
+ {/* Card 3: Typography */}
43
+ <div style={tw('bg-gray-900 rounded-xl shadow-xl p-6 flex-1 min-w-0 flex flex-col')}>
44
+ <h2 style={tw('text-2xl font-black text-yellow-400 mb-2 uppercase letter-spacing-wide')}>
45
+ TYPOGRAPHY
46
+ </h2>
47
+ <p style={tw('text-xs text-gray-300 tracking-tight leading-loose')}>
48
+ All text styles work
49
+ </p>
50
+ </div>
51
+ </div>
52
+
53
+ {/* Bottom Info Bar */}
54
+ <div style={tw('mt-4 bg-white bg-opacity-20 rounded-lg px-6 py-3 max-w-5xl flex flex-row justify-between items-center')}>
55
+ <p style={tw('text-sm font-medium text-white')}>
56
+ Kitchen Sink Template
57
+ </p>
58
+ <p style={tw('text-xs text-white text-opacity-75 tracking-wide')}>
59
+ All features demonstrated
60
+ </p>
61
+ </div>
62
+ </div>
63
+ );
64
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "video",
3
+ "description": "Animated video starter template",
4
+ "type": "video",
5
+ "size": {
6
+ "width": 1200,
7
+ "height": 630
8
+ },
9
+ "props": {
10
+ "title": "string",
11
+ "description": "string?"
12
+ },
13
+ "video": {
14
+ "fps": 30,
15
+ "duration": 3
16
+ }
17
+ }
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+
3
+ // Template metadata is defined in meta.json
4
+
5
+ export default function Template({ title, description, frame, progress, tw }) {
6
+ // Fade in animation
7
+ const opacity = Math.min(1, progress * 2);
8
+
9
+ // Slide up animation
10
+ const translateY = 20 - (progress * 20);
11
+
12
+ return (
13
+ <div style={tw('w-full h-full flex flex-col justify-center items-center bg-background p-16')}>
14
+ <div style={tw('bg-card border rounded-xl p-12 flex flex-col max-w-4xl')}>
15
+ <h1
16
+ style={{
17
+ ...tw('text-7xl font-bold text-foreground mb-4'),
18
+ opacity,
19
+ transform: `translateY(${translateY}px)`
20
+ }}
21
+ >
22
+ {title}
23
+ </h1>
24
+ {description && (
25
+ <p
26
+ style={{
27
+ ...tw('text-3xl text-muted-foreground'),
28
+ opacity: Math.min(1, (progress - 0.3) * 2)
29
+ }}
30
+ >
31
+ {description}
32
+ </p>
33
+ )}
34
+ </div>
35
+ </div>
36
+ );
37
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "video",
3
+ "description": "Animated video starter template",
4
+ "type": "video",
5
+ "size": {
6
+ "width": 1200,
7
+ "height": 630
8
+ },
9
+ "props": {
10
+ "title": "string",
11
+ "description": "string?"
12
+ },
13
+ "video": {
14
+ "fps": 30,
15
+ "duration": 3
16
+ }
17
+ }
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ export declare const meta: {
3
+ name: string;
4
+ description: string;
5
+ type: string;
6
+ size: {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ props: {
11
+ title: string;
12
+ description: string;
13
+ };
14
+ video: {
15
+ fps: number;
16
+ duration: number;
17
+ };
18
+ };
19
+ export default function Template({ title, description, frame, progress, tw }: {
20
+ title: any;
21
+ description: any;
22
+ frame: any;
23
+ progress: any;
24
+ tw: any;
25
+ }): React.JSX.Element;
26
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/default-templates/video/template.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;CAahB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;;;;;;CAAA,qBAgC3E"}
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ export const meta = {
3
+ name: "video",
4
+ description: "Animated video starter template",
5
+ type: "video",
6
+ size: { width: 1200, height: 630 },
7
+ props: {
8
+ title: "string",
9
+ description: "string?"
10
+ },
11
+ video: {
12
+ fps: 30,
13
+ duration: 3
14
+ }
15
+ };
16
+ export default function Template({ title, description, frame, progress, tw }) {
17
+ // Fade in animation
18
+ const opacity = Math.min(1, progress * 2);
19
+ // Slide up animation
20
+ const translateY = 20 - (progress * 20);
21
+ return (React.createElement("div", { style: tw('w-full h-full flex flex-col justify-center items-center bg-background p-16') },
22
+ React.createElement("div", { style: tw('bg-card border rounded-xl p-12 flex flex-col max-w-4xl') },
23
+ React.createElement("h1", { style: {
24
+ ...tw('text-7xl font-bold text-foreground mb-4'),
25
+ opacity,
26
+ transform: `translateY(${translateY}px)`
27
+ } }, title),
28
+ description && (React.createElement("p", { style: {
29
+ ...tw('text-3xl text-muted-foreground'),
30
+ opacity: Math.min(1, (progress - 0.3) * 2)
31
+ } }, description)))));
32
+ }
33
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/default-templates/video/template.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,iCAAiC;IAC9C,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAClC,KAAK,EAAE;QACL,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,SAAS;KACvB;IACD,KAAK,EAAE;QACL,GAAG,EAAE,EAAE;QACP,QAAQ,EAAE,CAAC;KACZ;CACF,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC1E,oBAAoB;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE1C,qBAAqB;IACrB,MAAM,UAAU,GAAG,EAAE,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAExC,OAAO,CACL,6BAAK,KAAK,EAAE,EAAE,CAAC,4EAA4E,CAAC;QAC1F,6BAAK,KAAK,EAAE,EAAE,CAAC,wDAAwD,CAAC;YACtE,4BACE,KAAK,EAAE;oBACL,GAAG,EAAE,CAAC,yCAAyC,CAAC;oBAChD,OAAO;oBACP,SAAS,EAAE,cAAc,UAAU,KAAK;iBACzC,IAEA,KAAK,CACH;YACJ,WAAW,IAAI,CACd,2BACE,KAAK,EAAE;oBACL,GAAG,EAAE,CAAC,gCAAgC,CAAC;oBACvC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;iBAC3C,IAEA,WAAW,CACV,CACL,CACG,CACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+
3
+ // Template metadata is defined in meta.json
4
+
5
+ export default function Template({ title, description, frame, progress, tw }) {
6
+ // Fade in animation
7
+ const opacity = Math.min(1, progress * 2);
8
+
9
+ // Slide up animation
10
+ const translateY = 20 - (progress * 20);
11
+
12
+ return (
13
+ <div style={tw('w-full h-full flex flex-col justify-center items-center bg-background p-16')}>
14
+ <div style={tw('bg-card border rounded-xl p-12 flex flex-col max-w-4xl')}>
15
+ <h1
16
+ style={{
17
+ ...tw('text-7xl font-bold text-foreground mb-4'),
18
+ opacity,
19
+ transform: `translateY(${translateY}px)`
20
+ }}
21
+ >
22
+ {title}
23
+ </h1>
24
+ {description && (
25
+ <p
26
+ style={{
27
+ ...tw('text-3xl text-muted-foreground'),
28
+ opacity: Math.min(1, (progress - 0.3) * 2)
29
+ }}
30
+ >
31
+ {description}
32
+ </p>
33
+ )}
34
+ </div>
35
+ </div>
36
+ );
37
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "video",
3
+ "description": "Animated video starter template",
4
+ "type": "video",
5
+ "size": {
6
+ "width": 1200,
7
+ "height": 630
8
+ },
9
+ "props": {
10
+ "title": "string",
11
+ "description": "string?"
12
+ },
13
+ "video": {
14
+ "fps": 30,
15
+ "duration": 3
16
+ }
17
+ }
@@ -0,0 +1,36 @@
1
+
2
+ // Template metadata is defined in meta.json
3
+
4
+ export default function Template({ title, description, frame, progress, tw }) {
5
+ // Fade in animation
6
+ const opacity = Math.min(1, progress * 2);
7
+
8
+ // Slide up animation
9
+ const translateY = 20 - (progress * 20);
10
+
11
+ return (
12
+ <div style={tw('w-full h-full flex flex-col justify-center items-center bg-background p-16')}>
13
+ <div style={tw('bg-card border rounded-xl p-12 flex flex-col max-w-4xl')}>
14
+ <h1
15
+ style={{
16
+ ...tw('text-7xl font-bold text-foreground mb-4'),
17
+ opacity,
18
+ transform: `translateY(${translateY}px)`
19
+ }}
20
+ >
21
+ {title}
22
+ </h1>
23
+ {description && (
24
+ <p
25
+ style={{
26
+ ...tw('text-3xl text-muted-foreground'),
27
+ opacity: Math.min(1, (progress - 0.3) * 2)
28
+ }}
29
+ >
30
+ {description}
31
+ </p>
32
+ )}
33
+ </div>
34
+ </div>
35
+ );
36
+ }