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,314 @@
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="description" content="dsgn - Generate beautiful images from React components"><meta name="viewport" content="width=device-width"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="generator" content="Astro v4.16.19"><title></title><link rel="stylesheet" href="/_astro/fonts.DHdiHGBO.css"></head> <body class="antialiased"> <div class="min-h-screen" data-astro-cid-mw7aashj> <!-- Sidebar --> <aside class="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> <a href="/" class="block mb-8 no-underline" data-astro-cid-mw7aashj> <h1 class="text-3xl font-bold bg-gradient-to-r from-[var(--color-brand-from)] to-[var(--color-brand-to)] bg-clip-text text-transparent" data-astro-cid-mw7aashj>
2
+ _dsgn
3
+ </h1> </a> <nav data-astro-cid-mw7aashj> <ul class="space-y-1" data-astro-cid-mw7aashj> <li data-astro-cid-mw7aashj> <a href="/" class="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="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="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="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="/helpers" class="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="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="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="/llm.txt" class="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 Docs </a> </li> </ul> </nav> </div> </aside> <!-- Main content --> <main class="ml-64" data-astro-cid-mw7aashj> <div class="p-12" data-astro-cid-mw7aashj> <article class="prose prose-invert max-w-4xl" data-astro-cid-mw7aashj> <h1 id="image-rendering">Image Rendering</h1>
4
+ <p>Generate beautiful images from React components using dsgn’s powerful image rendering engine powered by Satori.</p>
5
+ <h2 id="quick-start">Quick Start</h2>
6
+ <pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#6A737D"># Render an image template with inline props</span></span>
7
+ <span class="line"><span style="color:#B392F0">dsgn</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;,&quot;subtitle&quot;:&quot;Welcome&quot;}&#39;</span></span>
8
+ <span class="line"></span>
9
+ <span class="line"><span style="color:#6A737D"># Custom output name</span></span>
10
+ <span class="line"><span style="color:#B392F0">dsgn</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>
11
+ <span class="line"></span>
12
+ <span class="line"><span style="color:#6A737D"># Different format</span></span>
13
+ <span class="line"><span style="color:#B392F0">dsgn</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 style="color:#79B8FF"> --quality</span><span style="color:#79B8FF"> 95</span></span>
14
+ <span class="line"></span>
15
+ <span class="line"><span style="color:#6A737D"># Or use a props file</span></span>
16
+ <span class="line"><span style="color:#B392F0">dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> banner-hero</span><span style="color:#9ECBFF"> props.json</span></span>
17
+ <span class="line"></span></code></pre>
18
+ <h2 id="image-template-structure">Image Template Structure</h2>
19
+ <h3 id="basic-template">Basic Template</h3>
20
+ <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">// banner-hero.tsx</span></span>
21
+ <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"> BannerHero</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">subtitle</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8"> }) {</span></span>
22
+ <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
23
+ <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 justify-center items-center 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>
24
+ <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-7xl font-bold text-white mb-4&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
25
+ <span class="line"><span style="color:#E1E4E8"> {title}</span></span>
26
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
27
+ <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-2xl text-white/80&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
28
+ <span class="line"><span style="color:#E1E4E8"> {subtitle}</span></span>
29
+ <span class="line"><span style="color:#E1E4E8"> &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"> );</span></span>
32
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
33
+ <span class="line"></span></code></pre>
34
+ <h3 id="metadata-metajson">Metadata (meta.json)</h3>
35
+ <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>
36
+ <span class="line"><span style="color:#79B8FF"> &quot;name&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;banner-hero&quot;</span><span style="color:#E1E4E8">,</span></span>
37
+ <span class="line"><span style="color:#79B8FF"> &quot;type&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;image&quot;</span><span style="color:#E1E4E8">,</span></span>
38
+ <span class="line"><span style="color:#79B8FF"> &quot;description&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;Hero banner with gradient background&quot;</span><span style="color:#E1E4E8">,</span></span>
39
+ <span class="line"><span style="color:#79B8FF"> &quot;size&quot;</span><span style="color:#E1E4E8">: {</span></span>
40
+ <span class="line"><span style="color:#79B8FF"> &quot;width&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">1600</span><span style="color:#E1E4E8">,</span></span>
41
+ <span class="line"><span style="color:#79B8FF"> &quot;height&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">900</span></span>
42
+ <span class="line"><span style="color:#E1E4E8"> },</span></span>
43
+ <span class="line"><span style="color:#79B8FF"> &quot;props&quot;</span><span style="color:#E1E4E8">: {</span></span>
44
+ <span class="line"><span style="color:#79B8FF"> &quot;title&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;string&quot;</span><span style="color:#E1E4E8">,</span></span>
45
+ <span class="line"><span style="color:#79B8FF"> &quot;subtitle&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;string&quot;</span></span>
46
+ <span class="line"><span style="color:#E1E4E8"> }</span></span>
47
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
48
+ <span class="line"></span></code></pre>
49
+ <h3 id="props-file">Props File</h3>
50
+ <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>
51
+ <span class="line"><span style="color:#79B8FF"> &quot;title&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;Welcome to dsgn&quot;</span><span style="color:#E1E4E8">,</span></span>
52
+ <span class="line"><span style="color:#79B8FF"> &quot;subtitle&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;Generate beautiful images from React&quot;</span></span>
53
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
54
+ <span class="line"></span></code></pre>
55
+ <h2 id="output-formats">Output Formats</h2>
56
+ <h3 id="png-default">PNG (Default)</h3>
57
+ <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">dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> my-template</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Hello&quot;}&#39;</span></span>
58
+ <span class="line"><span style="color:#6A737D"># Output: my-template.png</span></span>
59
+ <span class="line"></span></code></pre>
60
+ <p><strong>Best for:</strong></p>
61
+ <ul>
62
+ <li>Designs with transparency</li>
63
+ <li>High-quality graphics</li>
64
+ <li>Sharp text and logos</li>
65
+ <li>Web graphics</li>
66
+ </ul>
67
+ <h3 id="jpeg">JPEG</h3>
68
+ <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">dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> my-template</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 style="color:#79B8FF"> --quality</span><span style="color:#79B8FF"> 92</span></span>
69
+ <span class="line"></span></code></pre>
70
+ <p><strong>Options:</strong></p>
71
+ <ul>
72
+ <li><code>--quality</code> - 1-100 (default: 92)</li>
73
+ </ul>
74
+ <p><strong>Best for:</strong></p>
75
+ <ul>
76
+ <li>Photographs</li>
77
+ <li>Gradients</li>
78
+ <li>Smaller file sizes</li>
79
+ <li>Social media images</li>
80
+ </ul>
81
+ <h3 id="svg">SVG</h3>
82
+ <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">dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> my-template</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Hello&quot;}&#39;</span><span style="color:#79B8FF"> --format</span><span style="color:#9ECBFF"> svg</span></span>
83
+ <span class="line"></span></code></pre>
84
+ <p><strong>Best for:</strong></p>
85
+ <ul>
86
+ <li>Vector graphics</li>
87
+ <li>Scalable designs</li>
88
+ <li>Print-ready artwork</li>
89
+ <li>Logos and icons</li>
90
+ </ul>
91
+ <h2 id="embedding-images">Embedding Images</h2>
92
+ <p>Use the <code>image()</code> helper to embed external images in your templates.</p>
93
+ <h3 id="basic-usage">Basic Usage</h3>
94
+ <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"> ProductCard</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">image</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">background</span><span style="color:#E1E4E8"> }) {</span></span>
95
+ <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
96
+ <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;relative w-full h-full&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
97
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Background image */</span><span style="color:#E1E4E8">}</span></span>
98
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
99
+ <span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(background)} </span></span>
100
+ <span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;absolute inset-0 w-full h-full object-cover&#39;</span><span style="color:#E1E4E8">)}</span></span>
101
+ <span class="line"><span style="color:#E1E4E8"> /&gt;</span></span>
102
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
103
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Content overlay */</span><span style="color:#E1E4E8">}</span></span>
104
+ <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;relative z-10 p-12&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
105
+ <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-6xl font-bold text-white&#39;</span><span style="color:#E1E4E8">)}&gt;{title}&lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
106
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
107
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
108
+ <span class="line"><span style="color:#E1E4E8"> );</span></span>
109
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
110
+ <span class="line"></span></code></pre>
111
+ <p><strong>Props:</strong></p>
112
+ <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>
113
+ <span class="line"><span style="color:#79B8FF"> &quot;title&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;New Product&quot;</span><span style="color:#E1E4E8">,</span></span>
114
+ <span class="line"><span style="color:#79B8FF"> &quot;background&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;./images/background.jpg&quot;</span></span>
115
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
116
+ <span class="line"></span></code></pre>
117
+ <h3 id="supported-image-formats">Supported Image Formats</h3>
118
+ <ul>
119
+ <li>✅ <strong>JPEG</strong> (<code>.jpg</code>, <code>.jpeg</code>)</li>
120
+ <li>✅ <strong>PNG</strong> (<code>.png</code>)</li>
121
+ <li>✅ <strong>GIF</strong> (<code>.gif</code>)</li>
122
+ <li>✅ <strong>WebP</strong> (<code>.webp</code>)</li>
123
+ <li>✅ <strong>SVG</strong> (<code>.svg</code>)</li>
124
+ </ul>
125
+ <h3 id="image-positioning">Image Positioning</h3>
126
+ <pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="tsx"><code><span class="line"><span style="color:#F97583">export</span><span style="color:#F97583"> default</span><span style="color:#F97583"> function</span><span style="color:#B392F0"> ImageGrid</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">image</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">img1</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">img2</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">img3</span><span style="color:#E1E4E8"> }) {</span></span>
127
+ <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
128
+ <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-3 gap-4 w-full h-full p-8 bg-gray-100&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
129
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Cover - fills entire area */</span><span style="color:#E1E4E8">}</span></span>
130
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
131
+ <span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(img1)} </span></span>
132
+ <span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;w-full h-full object-cover rounded-lg&#39;</span><span style="color:#E1E4E8">)}</span></span>
133
+ <span class="line"><span style="color:#E1E4E8"> /&gt;</span></span>
134
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
135
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Contain - fits within area */</span><span style="color:#E1E4E8">}</span></span>
136
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
137
+ <span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(img2)} </span></span>
138
+ <span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;w-full h-full object-contain&#39;</span><span style="color:#E1E4E8">)}</span></span>
139
+ <span class="line"><span style="color:#E1E4E8"> /&gt;</span></span>
140
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
141
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Fill - stretches to fill */</span><span style="color:#E1E4E8">}</span></span>
142
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
143
+ <span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(img3)} </span></span>
144
+ <span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;w-full h-full object-fill&#39;</span><span style="color:#E1E4E8">)}</span></span>
145
+ <span class="line"><span style="color:#E1E4E8"> /&gt;</span></span>
146
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
147
+ <span class="line"><span style="color:#E1E4E8"> );</span></span>
148
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
149
+ <span class="line"></span></code></pre>
150
+ <h2 id="common-image-templates">Common Image Templates</h2>
151
+ <h3 id="open-graph--social-cards">Open Graph / Social Cards</h3>
152
+ <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">// og-image.tsx</span></span>
153
+ <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"> OGImage</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">title</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">description</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">image</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">logo</span><span style="color:#E1E4E8"> }) {</span></span>
154
+ <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
155
+ <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 w-full h-full bg-white&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
156
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Left side - Content */</span><span style="color:#E1E4E8">}</span></span>
157
+ <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-1 flex flex-col justify-between p-12&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
158
+ <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">image</span><span style="color:#E1E4E8">(logo)} </span><span style="color:#B392F0">style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;h-12 w-auto&#39;</span><span style="color:#E1E4E8">)} /&gt;</span></span>
159
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
160
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
161
+ <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-5xl font-bold text-gray-900 mb-4&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
162
+ <span class="line"><span style="color:#E1E4E8"> {title}</span></span>
163
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">&gt;</span></span>
164
+ <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-xl text-gray-600&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
165
+ <span class="line"><span style="color:#E1E4E8"> {description}</span></span>
166
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">&gt;</span></span>
167
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
168
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
169
+ <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-400&#39;</span><span style="color:#E1E4E8">)}&gt;yoursite.com&lt;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">&gt;</span></span>
170
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
171
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
172
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Right side - Image */</span><span style="color:#E1E4E8">}</span></span>
173
+ <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-1&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
174
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
175
+ <span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(featuredImage)} </span></span>
176
+ <span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;w-full h-full object-cover&#39;</span><span style="color:#E1E4E8">)}</span></span>
177
+ <span class="line"><span style="color:#E1E4E8"> /&gt;</span></span>
178
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
179
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
180
+ <span class="line"><span style="color:#E1E4E8"> );</span></span>
181
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
182
+ <span class="line"></span></code></pre>
183
+ <p><strong>Size:</strong> 1200x630 (standard OG image size)</p>
184
+ <h3 id="product-cards">Product Cards</h3>
185
+ <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"> ProductCard</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">image</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">product</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">price</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">badge</span><span style="color:#E1E4E8"> }) {</span></span>
186
+ <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
187
+ <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 w-full h-full bg-white rounded-2xl overflow-hidden&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
188
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Product image */</span><span style="color:#E1E4E8">}</span></span>
189
+ <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;relative h-2/3&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
190
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
191
+ <span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(product)} </span></span>
192
+ <span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;w-full h-full object-cover&#39;</span><span style="color:#E1E4E8">)}</span></span>
193
+ <span class="line"><span style="color:#E1E4E8"> /&gt;</span></span>
194
+ <span class="line"><span style="color:#E1E4E8"> {badge </span><span style="color:#F97583">&amp;&amp;</span><span style="color:#E1E4E8"> (</span></span>
195
+ <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;absolute top-4 right-4 bg-red-500 text-white px-4 py-2 rounded-full text-sm font-bold&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
196
+ <span class="line"><span style="color:#E1E4E8"> {badge}</span></span>
197
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
198
+ <span class="line"><span style="color:#E1E4E8"> )}</span></span>
199
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
200
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
201
+ <span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#6A737D">/* Product info */</span><span style="color:#E1E4E8">}</span></span>
202
+ <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-1 p-6 flex flex-col justify-between&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
203
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">h2</span><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;text-2xl font-bold text-gray-900&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
204
+ <span class="line"><span style="color:#E1E4E8"> {title}</span></span>
205
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">h2</span><span style="color:#E1E4E8">&gt;</span></span>
206
+ <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 justify-between items-center&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
207
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">span</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-3xl font-bold text-gray-900&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
208
+ <span class="line"><span style="color:#E1E4E8"> ${price}</span></span>
209
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">span</span><span style="color:#E1E4E8">&gt;</span></span>
210
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
211
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
212
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
213
+ <span class="line"><span style="color:#E1E4E8"> );</span></span>
214
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
215
+ <span class="line"></span></code></pre>
216
+ <h3 id="quote-cards">Quote Cards</h3>
217
+ <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"> QuoteCard</span><span style="color:#E1E4E8">({ </span><span style="color:#FFAB70">tw</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">image</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">quote</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>
218
+ <span class="line"><span style="color:#F97583"> return</span><span style="color:#E1E4E8"> (</span></span>
219
+ <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-gradient-to-br from-indigo-500 to-purple-600 p-16&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
220
+ <span class="line"><span style="color:#E1E4E8"> {avatar </span><span style="color:#F97583">&amp;&amp;</span><span style="color:#E1E4E8"> (</span></span>
221
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">img</span><span style="color:#E1E4E8"> </span></span>
222
+ <span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">image</span><span style="color:#E1E4E8">(avatar)} </span></span>
223
+ <span class="line"><span style="color:#B392F0"> style</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{</span><span style="color:#B392F0">tw</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">&#39;w-24 h-24 rounded-full border-4 border-white mb-8&#39;</span><span style="color:#E1E4E8">)}</span></span>
224
+ <span class="line"><span style="color:#E1E4E8"> /&gt;</span></span>
225
+ <span class="line"><span style="color:#E1E4E8"> )}</span></span>
226
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
227
+ <span class="line"><span style="color:#E1E4E8"> &lt;</span><span style="color:#85E89D">blockquote</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-3xl text-white text-center font-light mb-8 max-w-3xl&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
228
+ <span class="line"><span style="color:#E1E4E8"> &quot;{quote}&quot;</span></span>
229
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">blockquote</span><span style="color:#E1E4E8">&gt;</span></span>
230
+ <span class="line"><span style="color:#E1E4E8"> </span></span>
231
+ <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-xl text-white/80&#39;</span><span style="color:#E1E4E8">)}&gt;</span></span>
232
+ <span class="line"><span style="color:#E1E4E8"> — {author}</span></span>
233
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">&gt;</span></span>
234
+ <span class="line"><span style="color:#E1E4E8"> &lt;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">&gt;</span></span>
235
+ <span class="line"><span style="color:#E1E4E8"> );</span></span>
236
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
237
+ <span class="line"></span></code></pre>
238
+ <h2 id="performance-tips">Performance Tips</h2>
239
+ <h3 id="1-optimize-image-sizes">1. Optimize Image Sizes</h3>
240
+ <p>Use appropriately sized images before embedding:</p>
241
+ <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"># Resize large images before using them</span></span>
242
+ <span class="line"><span style="color:#B392F0">convert</span><span style="color:#9ECBFF"> large-image.jpg</span><span style="color:#79B8FF"> -resize</span><span style="color:#9ECBFF"> 1600x900</span><span style="color:#9ECBFF"> optimized.jpg</span></span>
243
+ <span class="line"></span></code></pre>
244
+ <h3 id="2-use-web-optimized-formats">2. Use Web-Optimized Formats</h3>
245
+ <ul>
246
+ <li><strong>WebP</strong> for modern browsers (smaller file sizes)</li>
247
+ <li><strong>JPEG</strong> for photos with controlled quality</li>
248
+ <li><strong>PNG</strong> only when transparency is needed</li>
249
+ </ul>
250
+ <h3 id="3-batch-rendering">3. Batch Rendering</h3>
251
+ <p>Render multiple images at once:</p>
252
+ <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"># Using a script with inline props</span></span>
253
+ <span class="line"><span style="color:#B392F0">dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> my-template</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Image 1&quot;}&#39;</span></span>
254
+ <span class="line"><span style="color:#B392F0">dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> my-template</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Image 2&quot;}&#39;</span></span>
255
+ <span class="line"><span style="color:#B392F0">dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> my-template</span><span style="color:#9ECBFF"> &#39;{&quot;title&quot;:&quot;Image 3&quot;}&#39;</span></span>
256
+ <span class="line"></span>
257
+ <span class="line"><span style="color:#6A737D"># Or loop through props files</span></span>
258
+ <span class="line"><span style="color:#F97583">for</span><span style="color:#E1E4E8"> props </span><span style="color:#F97583">in</span><span style="color:#9ECBFF"> props/*.json</span><span style="color:#E1E4E8">; </span><span style="color:#F97583">do</span></span>
259
+ <span class="line"><span style="color:#B392F0"> dsgn</span><span style="color:#9ECBFF"> render</span><span style="color:#9ECBFF"> my-template</span><span style="color:#9ECBFF"> &quot;</span><span style="color:#E1E4E8">$props</span><span style="color:#9ECBFF">&quot;</span></span>
260
+ <span class="line"><span style="color:#F97583">done</span></span>
261
+ <span class="line"></span></code></pre>
262
+ <h3 id="4-cache-templates">4. Cache Templates</h3>
263
+ <p>Templates are cached after first load for faster subsequent renders.</p>
264
+ <h2 id="common-sizes">Common Sizes</h2>
265
+ <h3 id="social-media">Social Media</h3>
266
+ <ul>
267
+ <li><strong>Twitter/X Card</strong>: 1200x675</li>
268
+ <li><strong>Facebook Post</strong>: 1200x630</li>
269
+ <li><strong>Instagram Post</strong>: 1080x1080</li>
270
+ <li><strong>LinkedIn Post</strong>: 1200x627</li>
271
+ <li><strong>Pinterest Pin</strong>: 1000x1500</li>
272
+ </ul>
273
+ <h3 id="web-graphics">Web Graphics</h3>
274
+ <ul>
275
+ <li><strong>Hero Banner</strong>: 1920x1080</li>
276
+ <li><strong>Blog Header</strong>: 1600x900</li>
277
+ <li><strong>Thumbnail</strong>: 640x360</li>
278
+ <li><strong>Avatar</strong>: 400x400</li>
279
+ </ul>
280
+ <h3 id="print">Print</h3>
281
+ <ul>
282
+ <li><strong>Flyer (A4)</strong>: 2480x3508 (300 DPI)</li>
283
+ <li><strong>Business Card</strong>: 1050x600 (300 DPI)</li>
284
+ <li><strong>Poster (A3)</strong>: 3508x4961 (300 DPI)</li>
285
+ </ul>
286
+ <h2 id="troubleshooting">Troubleshooting</h2>
287
+ <h3 id="fonts-not-rendering">Fonts Not Rendering</h3>
288
+ <p>Make sure fonts are properly loaded in <code>meta.json</code>:</p>
289
+ <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>
290
+ <span class="line"><span style="color:#79B8FF"> &quot;fonts&quot;</span><span style="color:#E1E4E8">: [</span></span>
291
+ <span class="line"><span style="color:#E1E4E8"> {</span></span>
292
+ <span class="line"><span style="color:#79B8FF"> &quot;name&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;Inter&quot;</span><span style="color:#E1E4E8">,</span></span>
293
+ <span class="line"><span style="color:#79B8FF"> &quot;path&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;fonts/Inter-Bold.woff&quot;</span><span style="color:#E1E4E8">,</span></span>
294
+ <span class="line"><span style="color:#79B8FF"> &quot;weight&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">700</span></span>
295
+ <span class="line"><span style="color:#E1E4E8"> }</span></span>
296
+ <span class="line"><span style="color:#E1E4E8"> ]</span></span>
297
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
298
+ <span class="line"></span></code></pre>
299
+ <h3 id="images-not-loading">Images Not Loading</h3>
300
+ <p>Check file paths are relative to the props file:</p>
301
+ <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>
302
+ <span class="line"><span style="color:#79B8FF"> &quot;background&quot;</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">&quot;./images/bg.jpg&quot;</span><span style="color:#6A737D"> // ✅ Relative path</span></span>
303
+ <span class="line"><span style="color:#9ECBFF"> &quot;background&quot;</span><span style="color:#FDAEB7;font-style:italic">:</span><span style="color:#9ECBFF"> &quot;/images/bg.jpg&quot;</span><span style="color:#6A737D"> // ❌ Absolute path won&#39;t work</span></span>
304
+ <span class="line"><span style="color:#E1E4E8">}</span></span>
305
+ <span class="line"></span></code></pre>
306
+ <h3 id="blurry-text">Blurry Text</h3>
307
+ <p>Ensure you’re using appropriate dimensions. Satori renders at exact pixel dimensions.</p>
308
+ <h2 id="next-steps">Next Steps</h2>
309
+ <ul>
310
+ <li><a href="/video">Learn about Video Rendering</a></li>
311
+ <li><a href="/helpers">QR Codes and Template Composition</a></li>
312
+ <li><a href="/styling">Styling with Tailwind &amp; shadcn/ui</a></li>
313
+ <li><a href="/fonts">Using Custom Fonts</a></li>
314
+ </ul> </article> </div> </main> </div> </body></html>