loopwind 0.19.0 → 0.20.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 (52) hide show
  1. package/README.md +83 -0
  2. package/dist/commands/preview.d.ts.map +1 -1
  3. package/dist/commands/preview.js +2 -1
  4. package/dist/commands/preview.js.map +1 -1
  5. package/dist/commands/render.d.ts.map +1 -1
  6. package/dist/commands/render.js +2 -0
  7. package/dist/commands/render.js.map +1 -1
  8. package/dist/default-templates/AGENTS.md +54 -0
  9. package/dist/lib/renderer.d.ts.map +1 -1
  10. package/dist/lib/renderer.js +3 -0
  11. package/dist/lib/renderer.js.map +1 -1
  12. package/dist/lib/tailwind-browser.d.ts.map +1 -1
  13. package/dist/lib/tailwind-browser.js +169 -6
  14. package/dist/lib/tailwind-browser.js.map +1 -1
  15. package/dist/lib/tailwind.d.ts.map +1 -1
  16. package/dist/lib/tailwind.js +178 -7
  17. package/dist/lib/tailwind.js.map +1 -1
  18. package/dist/lib/video-preview.d.ts +1 -1
  19. package/dist/lib/video-preview.d.ts.map +1 -1
  20. package/dist/lib/video-preview.js +266 -249
  21. package/dist/lib/video-preview.js.map +1 -1
  22. package/dist/lib/video-renderer.d.ts +2 -0
  23. package/dist/lib/video-renderer.d.ts.map +1 -1
  24. package/dist/lib/video-renderer.js +4 -4
  25. package/dist/lib/video-renderer.js.map +1 -1
  26. package/dist/sdk/index.d.ts +2 -0
  27. package/dist/sdk/index.d.ts.map +1 -1
  28. package/dist/sdk/index.js +1 -0
  29. package/dist/sdk/index.js.map +1 -1
  30. package/dist/sdk/preview.d.ts +65 -0
  31. package/dist/sdk/preview.d.ts.map +1 -0
  32. package/dist/sdk/preview.js +262 -0
  33. package/dist/sdk/preview.js.map +1 -0
  34. package/examples/nextjs-template-import.ts +2 -2
  35. package/examples/sdk-video-preview.tsx +120 -0
  36. package/package.json +1 -1
  37. package/render-examples-600x400.mjs +161 -0
  38. package/render-spring-variants-fixed.mjs +60 -0
  39. package/render-staggered-text.mjs +56 -0
  40. package/test-sdk-config.mjs +138 -81
  41. package/test-static-debug.tsx +19 -0
  42. package/test-templates/test-sdk.mjs +46 -22
  43. package/test-video-props.json +3 -0
  44. package/website/DEPLOYMENT.md +1 -0
  45. package/website/OG_IMAGES.md +1 -0
  46. package/website/astro.config.mjs +18 -2
  47. package/website/package-lock.json +2866 -7080
  48. package/website/package.json +1 -2
  49. package/website/public/.gitkeep +1 -0
  50. package/website/templates/og-image.tsx +20 -21
  51. package/website/test-playground.mjs +45 -0
  52. package/output/sdk-static.jpg +0 -0
@@ -2,41 +2,64 @@ import { defineTemplate, renderImage, renderVideo } from '../dist/sdk/index.js';
2
2
  import fs from 'fs/promises';
3
3
  import React from 'react';
4
4
 
5
+ // Helper to create inline template modules for testing
6
+ function createTemplateModule(meta, render) {
7
+ return { meta, default: render };
8
+ }
9
+
5
10
  // Test 1: Static image template
6
- const staticTemplate = defineTemplate({
7
- name: 'sdk-static',
8
- type: 'image',
9
- size: { width: 1200, height: 630 },
10
- render: ({ tw, title, subtitle }) => (
11
+ const staticTemplateModule = createTemplateModule(
12
+ {
13
+ name: 'sdk-static',
14
+ type: 'image',
15
+ size: { width: 1200, height: 630 },
16
+ props: {
17
+ title: 'string',
18
+ subtitle: 'string',
19
+ },
20
+ },
21
+ ({ tw, title, subtitle }) => (
11
22
  React.createElement('div', { style: tw('flex flex-col w-full h-full bg-gradient-to-br from-green-600 to-teal-700 p-12 justify-center items-center') },
12
23
  React.createElement('h1', { style: tw('text-6xl font-bold text-white mb-4') }, title),
13
24
  React.createElement('p', { style: tw('text-2xl text-white/80') }, subtitle),
14
25
  React.createElement('p', { style: tw('text-white/60 mt-8') }, 'Rendered via SDK')
15
26
  )
16
27
  )
17
- });
28
+ );
29
+ const staticTemplate = defineTemplate(staticTemplateModule);
18
30
 
19
31
  // Test 2: Animated video template
20
- const animatedTemplate = defineTemplate({
21
- name: 'sdk-animated',
22
- type: 'video',
23
- size: { width: 1920, height: 1080 },
24
- video: { fps: 30, duration: 2 },
25
- render: ({ tw, title }) => (
32
+ const animatedTemplateModule = createTemplateModule(
33
+ {
34
+ name: 'sdk-animated',
35
+ type: 'video',
36
+ size: { width: 1920, height: 1080 },
37
+ video: { fps: 30, duration: 2 },
38
+ props: {
39
+ title: 'string',
40
+ },
41
+ },
42
+ ({ tw, title }) => (
26
43
  React.createElement('div', { style: tw('flex flex-col items-center justify-center w-full h-full bg-gray-900') },
27
- React.createElement('div', { style: tw('w-20 h-20 rounded-full bg-gradient-to-br from-pink-500 to-orange-500 mb-8 ease-out animate-bounce-in/0/0.3') }),
28
- React.createElement('h1', { style: tw('text-7xl font-bold text-white ease-out animate-fade-in-up/0.2/0.6') }, title),
29
- React.createElement('p', { style: tw('text-2xl text-white/60 mt-4 ease-out animate-fade-in/0.5/0.9') }, 'SDK Video Test')
44
+ React.createElement('div', { style: tw('w-20 h-20 rounded-full bg-gradient-to-br from-pink-500 to-orange-500 mb-8 ease-out enter-bounce-in/0/300') }),
45
+ React.createElement('h1', { style: tw('text-7xl font-bold text-white ease-out enter-fade-in-up/200/600') }, title),
46
+ React.createElement('p', { style: tw('text-2xl text-white/60 mt-4 ease-out enter-fade-in/500/900') }, 'SDK Video Test')
30
47
  )
31
48
  )
32
- });
49
+ );
50
+ const animatedTemplate = defineTemplate(animatedTemplateModule);
33
51
 
34
52
  // Test 3: QR code template
35
- const qrTemplate = defineTemplate({
36
- name: 'sdk-qr',
37
- type: 'image',
38
- size: { width: 800, height: 800 },
39
- render: ({ tw, qr, url }) => (
53
+ const qrTemplateModule = createTemplateModule(
54
+ {
55
+ name: 'sdk-qr',
56
+ type: 'image',
57
+ size: { width: 800, height: 800 },
58
+ props: {
59
+ url: 'string',
60
+ },
61
+ },
62
+ ({ tw, qr, url }) => (
40
63
  React.createElement('div', { style: tw('flex flex-col items-center justify-center w-full h-full bg-white p-8') },
41
64
  React.createElement('h2', { style: tw('text-3xl font-bold text-gray-900 mb-6') }, 'SDK QR Test'),
42
65
  React.createElement('img', {
@@ -46,7 +69,8 @@ const qrTemplate = defineTemplate({
46
69
  React.createElement('p', { style: tw('text-gray-600 mt-6') }, url)
47
70
  )
48
71
  )
49
- });
72
+ );
73
+ const qrTemplate = defineTemplate(qrTemplateModule);
50
74
 
51
75
  async function runTests() {
52
76
  console.log('Testing loopwind SDK...\n');
@@ -0,0 +1,3 @@
1
+ {
2
+ "title": "Welcome!"
3
+ }
@@ -140,3 +140,4 @@ npm run dev
140
140
  - [OG Images Setup](./OG_IMAGES.md)
141
141
  - [Cloudflare Astro Guide](https://developers.cloudflare.com/workers/framework-guides/web-apps/astro/)
142
142
 
143
+
@@ -139,3 +139,4 @@ const ogTemplate = defineTemplate({
139
139
  - [Styling](/styling) - Tailwind CSS styling guide
140
140
  - [Config](/config) - loopwind.json configuration
141
141
 
142
+
@@ -16,8 +16,24 @@ export default defineConfig({
16
16
  vite: {
17
17
  plugins: [tailwindcss()],
18
18
  ssr: {
19
- external: ['node:fs/promises', 'node:fs', 'node:path', 'fs', 'fs/promises', 'path'],
20
- noExternal: ['loopwind'],
19
+ external: [
20
+ 'node:fs/promises',
21
+ 'node:fs',
22
+ 'node:path',
23
+ 'fs',
24
+ 'fs/promises',
25
+ 'path',
26
+ 'loopwind',
27
+ '@resvg/resvg-js',
28
+ '@resvg/resvg-js-darwin-arm64',
29
+ '@resvg/resvg-js-darwin-x64',
30
+ '@resvg/resvg-js-linux-arm64-gnu',
31
+ '@resvg/resvg-js-linux-x64-gnu',
32
+ '@resvg/resvg-js-win32-x64-msvc',
33
+ ],
34
+ },
35
+ optimizeDeps: {
36
+ exclude: ['loopwind', '@resvg/resvg-js'],
21
37
  },
22
38
  },
23
39
  markdown: {