oddlyalive 0.2.0-alpha.2

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 (86) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/CONTRIBUTING.md +62 -0
  3. package/LICENSE +21 -0
  4. package/README.md +158 -0
  5. package/SECURITY.md +29 -0
  6. package/assets/photoreal/PROVENANCE.md +19 -0
  7. package/assets/photoreal/baseball.png +0 -0
  8. package/assets/photoreal/basketball.png +0 -0
  9. package/assets/photoreal/crystal.png +0 -0
  10. package/assets/photoreal/kicking-cleat.png +0 -0
  11. package/assets/photoreal/letter-charm-square.png +0 -0
  12. package/assets/photoreal/letter-charm.png +0 -0
  13. package/assets/photoreal/sneaker.png +0 -0
  14. package/assets/photoreal/soccer-ball.png +0 -0
  15. package/bin/oddlyalive.js +283 -0
  16. package/docs/ARCHITECTURE.md +55 -0
  17. package/docs/DEMO-VIDEOS.md +122 -0
  18. package/docs/QUICKSTART.md +115 -0
  19. package/docs/ROADMAP.md +33 -0
  20. package/examples/ball-lab/PROVENANCE.md +4 -0
  21. package/examples/ball-lab/app.js +33 -0
  22. package/examples/ball-lab/index.html +56 -0
  23. package/examples/ball-lab/scene.json +68 -0
  24. package/examples/crystal-mobile/PROVENANCE.md +4 -0
  25. package/examples/crystal-mobile/app.js +26 -0
  26. package/examples/crystal-mobile/index.html +56 -0
  27. package/examples/crystal-mobile/scene.json +69 -0
  28. package/examples/football-kick/PROVENANCE.md +4 -0
  29. package/examples/football-kick/app.js +33 -0
  30. package/examples/football-kick/index.html +56 -0
  31. package/examples/football-kick/scene.json +44 -0
  32. package/examples/gallery.css +379 -0
  33. package/examples/index.html +109 -0
  34. package/examples/shared/example.css +320 -0
  35. package/examples/shared/player.js +85 -0
  36. package/examples/shoe-splash/PROVENANCE.md +4 -0
  37. package/examples/shoe-splash/app.js +26 -0
  38. package/examples/shoe-splash/index.html +56 -0
  39. package/examples/shoe-splash/scene.json +38 -0
  40. package/examples/string-touch/PROVENANCE.md +11 -0
  41. package/examples/string-touch/app.js +79 -0
  42. package/examples/string-touch/index.html +70 -0
  43. package/examples/string-touch/scene.json +73 -0
  44. package/examples/string-touch/styles.css +273 -0
  45. package/package.json +82 -0
  46. package/schemas/scene.schema.json +336 -0
  47. package/scripts/render-demo-videos.sh +77 -0
  48. package/scripts/serve.js +88 -0
  49. package/scripts/update-visual-fixtures.mjs +60 -0
  50. package/scripts/verify-demo-videos.mjs +138 -0
  51. package/skills/oddlyalive/SKILL.md +68 -0
  52. package/skills/oddlyalive/agents/openai.yaml +4 -0
  53. package/skills/oddlyalive/references/object-models.md +25 -0
  54. package/skills/oddlyalive/references/recipes.md +27 -0
  55. package/skills/oddlyalive/references/scene-schema.md +84 -0
  56. package/src/crystal-renderer.js +338 -0
  57. package/src/gesture.js +58 -0
  58. package/src/index.js +44 -0
  59. package/src/rigid-balls.js +304 -0
  60. package/src/rigid-renderer.js +760 -0
  61. package/src/rigid-scene.js +223 -0
  62. package/src/scene-registry.js +17 -0
  63. package/src/scene.js +206 -0
  64. package/src/state-hash.js +17 -0
  65. package/src/strands.js +773 -0
  66. package/src/surface-wave.js +209 -0
  67. package/src/svg-renderer.js +348 -0
  68. package/src/wave-renderer.js +463 -0
  69. package/src/wave-scene.js +163 -0
  70. package/tests/cli.test.js +101 -0
  71. package/tests/determinism.test.js +57 -0
  72. package/tests/fixtures/visual-baselines.json +27 -0
  73. package/tests/rigid-balls.test.js +77 -0
  74. package/tests/scene.test.js +78 -0
  75. package/tests/surface-wave.test.js +39 -0
  76. package/tests/visual-fixtures.test.js +43 -0
  77. package/videos/oddlyalive-demos/BRIEF.md +40 -0
  78. package/videos/oddlyalive-demos/DEMO-PLAN.md +13 -0
  79. package/videos/oddlyalive-demos/README.md +45 -0
  80. package/videos/oddlyalive-demos/app.js +212 -0
  81. package/videos/oddlyalive-demos/hyperframes.json +9 -0
  82. package/videos/oddlyalive-demos/index.html +246 -0
  83. package/videos/oddlyalive-demos/meta.json +5 -0
  84. package/videos/oddlyalive-demos/package-lock.json +506 -0
  85. package/videos/oddlyalive-demos/package.json +19 -0
  86. package/videos/oddlyalive-demos/prepare-assets.mjs +16 -0
@@ -0,0 +1,506 @@
1
+ {
2
+ "name": "oddlyalive-demos",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "name": "oddlyalive-demos",
8
+ "dependencies": {
9
+ "gsap": "^3.14.2"
10
+ },
11
+ "devDependencies": {
12
+ "esbuild": "^0.25.6"
13
+ }
14
+ },
15
+ "node_modules/@esbuild/aix-ppc64": {
16
+ "version": "0.25.6",
17
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz",
18
+ "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==",
19
+ "cpu": [
20
+ "ppc64"
21
+ ],
22
+ "dev": true,
23
+ "license": "MIT",
24
+ "optional": true,
25
+ "os": [
26
+ "aix"
27
+ ],
28
+ "engines": {
29
+ "node": ">=18"
30
+ }
31
+ },
32
+ "node_modules/@esbuild/android-arm": {
33
+ "version": "0.25.6",
34
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz",
35
+ "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==",
36
+ "cpu": [
37
+ "arm"
38
+ ],
39
+ "dev": true,
40
+ "license": "MIT",
41
+ "optional": true,
42
+ "os": [
43
+ "android"
44
+ ],
45
+ "engines": {
46
+ "node": ">=18"
47
+ }
48
+ },
49
+ "node_modules/@esbuild/android-arm64": {
50
+ "version": "0.25.6",
51
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz",
52
+ "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==",
53
+ "cpu": [
54
+ "arm64"
55
+ ],
56
+ "dev": true,
57
+ "license": "MIT",
58
+ "optional": true,
59
+ "os": [
60
+ "android"
61
+ ],
62
+ "engines": {
63
+ "node": ">=18"
64
+ }
65
+ },
66
+ "node_modules/@esbuild/android-x64": {
67
+ "version": "0.25.6",
68
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz",
69
+ "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==",
70
+ "cpu": [
71
+ "x64"
72
+ ],
73
+ "dev": true,
74
+ "license": "MIT",
75
+ "optional": true,
76
+ "os": [
77
+ "android"
78
+ ],
79
+ "engines": {
80
+ "node": ">=18"
81
+ }
82
+ },
83
+ "node_modules/@esbuild/darwin-arm64": {
84
+ "version": "0.25.6",
85
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz",
86
+ "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==",
87
+ "cpu": [
88
+ "arm64"
89
+ ],
90
+ "dev": true,
91
+ "license": "MIT",
92
+ "optional": true,
93
+ "os": [
94
+ "darwin"
95
+ ],
96
+ "engines": {
97
+ "node": ">=18"
98
+ }
99
+ },
100
+ "node_modules/@esbuild/darwin-x64": {
101
+ "version": "0.25.6",
102
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz",
103
+ "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==",
104
+ "cpu": [
105
+ "x64"
106
+ ],
107
+ "dev": true,
108
+ "license": "MIT",
109
+ "optional": true,
110
+ "os": [
111
+ "darwin"
112
+ ],
113
+ "engines": {
114
+ "node": ">=18"
115
+ }
116
+ },
117
+ "node_modules/@esbuild/freebsd-arm64": {
118
+ "version": "0.25.6",
119
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz",
120
+ "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==",
121
+ "cpu": [
122
+ "arm64"
123
+ ],
124
+ "dev": true,
125
+ "license": "MIT",
126
+ "optional": true,
127
+ "os": [
128
+ "freebsd"
129
+ ],
130
+ "engines": {
131
+ "node": ">=18"
132
+ }
133
+ },
134
+ "node_modules/@esbuild/freebsd-x64": {
135
+ "version": "0.25.6",
136
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz",
137
+ "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==",
138
+ "cpu": [
139
+ "x64"
140
+ ],
141
+ "dev": true,
142
+ "license": "MIT",
143
+ "optional": true,
144
+ "os": [
145
+ "freebsd"
146
+ ],
147
+ "engines": {
148
+ "node": ">=18"
149
+ }
150
+ },
151
+ "node_modules/@esbuild/linux-arm": {
152
+ "version": "0.25.6",
153
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz",
154
+ "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==",
155
+ "cpu": [
156
+ "arm"
157
+ ],
158
+ "dev": true,
159
+ "license": "MIT",
160
+ "optional": true,
161
+ "os": [
162
+ "linux"
163
+ ],
164
+ "engines": {
165
+ "node": ">=18"
166
+ }
167
+ },
168
+ "node_modules/@esbuild/linux-arm64": {
169
+ "version": "0.25.6",
170
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz",
171
+ "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==",
172
+ "cpu": [
173
+ "arm64"
174
+ ],
175
+ "dev": true,
176
+ "license": "MIT",
177
+ "optional": true,
178
+ "os": [
179
+ "linux"
180
+ ],
181
+ "engines": {
182
+ "node": ">=18"
183
+ }
184
+ },
185
+ "node_modules/@esbuild/linux-ia32": {
186
+ "version": "0.25.6",
187
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz",
188
+ "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==",
189
+ "cpu": [
190
+ "ia32"
191
+ ],
192
+ "dev": true,
193
+ "license": "MIT",
194
+ "optional": true,
195
+ "os": [
196
+ "linux"
197
+ ],
198
+ "engines": {
199
+ "node": ">=18"
200
+ }
201
+ },
202
+ "node_modules/@esbuild/linux-loong64": {
203
+ "version": "0.25.6",
204
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz",
205
+ "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==",
206
+ "cpu": [
207
+ "loong64"
208
+ ],
209
+ "dev": true,
210
+ "license": "MIT",
211
+ "optional": true,
212
+ "os": [
213
+ "linux"
214
+ ],
215
+ "engines": {
216
+ "node": ">=18"
217
+ }
218
+ },
219
+ "node_modules/@esbuild/linux-mips64el": {
220
+ "version": "0.25.6",
221
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz",
222
+ "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==",
223
+ "cpu": [
224
+ "mips64el"
225
+ ],
226
+ "dev": true,
227
+ "license": "MIT",
228
+ "optional": true,
229
+ "os": [
230
+ "linux"
231
+ ],
232
+ "engines": {
233
+ "node": ">=18"
234
+ }
235
+ },
236
+ "node_modules/@esbuild/linux-ppc64": {
237
+ "version": "0.25.6",
238
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz",
239
+ "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==",
240
+ "cpu": [
241
+ "ppc64"
242
+ ],
243
+ "dev": true,
244
+ "license": "MIT",
245
+ "optional": true,
246
+ "os": [
247
+ "linux"
248
+ ],
249
+ "engines": {
250
+ "node": ">=18"
251
+ }
252
+ },
253
+ "node_modules/@esbuild/linux-riscv64": {
254
+ "version": "0.25.6",
255
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz",
256
+ "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==",
257
+ "cpu": [
258
+ "riscv64"
259
+ ],
260
+ "dev": true,
261
+ "license": "MIT",
262
+ "optional": true,
263
+ "os": [
264
+ "linux"
265
+ ],
266
+ "engines": {
267
+ "node": ">=18"
268
+ }
269
+ },
270
+ "node_modules/@esbuild/linux-s390x": {
271
+ "version": "0.25.6",
272
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz",
273
+ "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==",
274
+ "cpu": [
275
+ "s390x"
276
+ ],
277
+ "dev": true,
278
+ "license": "MIT",
279
+ "optional": true,
280
+ "os": [
281
+ "linux"
282
+ ],
283
+ "engines": {
284
+ "node": ">=18"
285
+ }
286
+ },
287
+ "node_modules/@esbuild/linux-x64": {
288
+ "version": "0.25.6",
289
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz",
290
+ "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==",
291
+ "cpu": [
292
+ "x64"
293
+ ],
294
+ "dev": true,
295
+ "license": "MIT",
296
+ "optional": true,
297
+ "os": [
298
+ "linux"
299
+ ],
300
+ "engines": {
301
+ "node": ">=18"
302
+ }
303
+ },
304
+ "node_modules/@esbuild/netbsd-arm64": {
305
+ "version": "0.25.6",
306
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz",
307
+ "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==",
308
+ "cpu": [
309
+ "arm64"
310
+ ],
311
+ "dev": true,
312
+ "license": "MIT",
313
+ "optional": true,
314
+ "os": [
315
+ "netbsd"
316
+ ],
317
+ "engines": {
318
+ "node": ">=18"
319
+ }
320
+ },
321
+ "node_modules/@esbuild/netbsd-x64": {
322
+ "version": "0.25.6",
323
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz",
324
+ "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==",
325
+ "cpu": [
326
+ "x64"
327
+ ],
328
+ "dev": true,
329
+ "license": "MIT",
330
+ "optional": true,
331
+ "os": [
332
+ "netbsd"
333
+ ],
334
+ "engines": {
335
+ "node": ">=18"
336
+ }
337
+ },
338
+ "node_modules/@esbuild/openbsd-arm64": {
339
+ "version": "0.25.6",
340
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz",
341
+ "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==",
342
+ "cpu": [
343
+ "arm64"
344
+ ],
345
+ "dev": true,
346
+ "license": "MIT",
347
+ "optional": true,
348
+ "os": [
349
+ "openbsd"
350
+ ],
351
+ "engines": {
352
+ "node": ">=18"
353
+ }
354
+ },
355
+ "node_modules/@esbuild/openbsd-x64": {
356
+ "version": "0.25.6",
357
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz",
358
+ "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==",
359
+ "cpu": [
360
+ "x64"
361
+ ],
362
+ "dev": true,
363
+ "license": "MIT",
364
+ "optional": true,
365
+ "os": [
366
+ "openbsd"
367
+ ],
368
+ "engines": {
369
+ "node": ">=18"
370
+ }
371
+ },
372
+ "node_modules/@esbuild/openharmony-arm64": {
373
+ "version": "0.25.6",
374
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz",
375
+ "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==",
376
+ "cpu": [
377
+ "arm64"
378
+ ],
379
+ "dev": true,
380
+ "license": "MIT",
381
+ "optional": true,
382
+ "os": [
383
+ "openharmony"
384
+ ],
385
+ "engines": {
386
+ "node": ">=18"
387
+ }
388
+ },
389
+ "node_modules/@esbuild/sunos-x64": {
390
+ "version": "0.25.6",
391
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz",
392
+ "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==",
393
+ "cpu": [
394
+ "x64"
395
+ ],
396
+ "dev": true,
397
+ "license": "MIT",
398
+ "optional": true,
399
+ "os": [
400
+ "sunos"
401
+ ],
402
+ "engines": {
403
+ "node": ">=18"
404
+ }
405
+ },
406
+ "node_modules/@esbuild/win32-arm64": {
407
+ "version": "0.25.6",
408
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz",
409
+ "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==",
410
+ "cpu": [
411
+ "arm64"
412
+ ],
413
+ "dev": true,
414
+ "license": "MIT",
415
+ "optional": true,
416
+ "os": [
417
+ "win32"
418
+ ],
419
+ "engines": {
420
+ "node": ">=18"
421
+ }
422
+ },
423
+ "node_modules/@esbuild/win32-ia32": {
424
+ "version": "0.25.6",
425
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz",
426
+ "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==",
427
+ "cpu": [
428
+ "ia32"
429
+ ],
430
+ "dev": true,
431
+ "license": "MIT",
432
+ "optional": true,
433
+ "os": [
434
+ "win32"
435
+ ],
436
+ "engines": {
437
+ "node": ">=18"
438
+ }
439
+ },
440
+ "node_modules/@esbuild/win32-x64": {
441
+ "version": "0.25.6",
442
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz",
443
+ "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==",
444
+ "cpu": [
445
+ "x64"
446
+ ],
447
+ "dev": true,
448
+ "license": "MIT",
449
+ "optional": true,
450
+ "os": [
451
+ "win32"
452
+ ],
453
+ "engines": {
454
+ "node": ">=18"
455
+ }
456
+ },
457
+ "node_modules/esbuild": {
458
+ "version": "0.25.6",
459
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz",
460
+ "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==",
461
+ "dev": true,
462
+ "hasInstallScript": true,
463
+ "license": "MIT",
464
+ "bin": {
465
+ "esbuild": "bin/esbuild"
466
+ },
467
+ "engines": {
468
+ "node": ">=18"
469
+ },
470
+ "optionalDependencies": {
471
+ "@esbuild/aix-ppc64": "0.25.6",
472
+ "@esbuild/android-arm": "0.25.6",
473
+ "@esbuild/android-arm64": "0.25.6",
474
+ "@esbuild/android-x64": "0.25.6",
475
+ "@esbuild/darwin-arm64": "0.25.6",
476
+ "@esbuild/darwin-x64": "0.25.6",
477
+ "@esbuild/freebsd-arm64": "0.25.6",
478
+ "@esbuild/freebsd-x64": "0.25.6",
479
+ "@esbuild/linux-arm": "0.25.6",
480
+ "@esbuild/linux-arm64": "0.25.6",
481
+ "@esbuild/linux-ia32": "0.25.6",
482
+ "@esbuild/linux-loong64": "0.25.6",
483
+ "@esbuild/linux-mips64el": "0.25.6",
484
+ "@esbuild/linux-ppc64": "0.25.6",
485
+ "@esbuild/linux-riscv64": "0.25.6",
486
+ "@esbuild/linux-s390x": "0.25.6",
487
+ "@esbuild/linux-x64": "0.25.6",
488
+ "@esbuild/netbsd-arm64": "0.25.6",
489
+ "@esbuild/netbsd-x64": "0.25.6",
490
+ "@esbuild/openbsd-arm64": "0.25.6",
491
+ "@esbuild/openbsd-x64": "0.25.6",
492
+ "@esbuild/openharmony-arm64": "0.25.6",
493
+ "@esbuild/sunos-x64": "0.25.6",
494
+ "@esbuild/win32-arm64": "0.25.6",
495
+ "@esbuild/win32-ia32": "0.25.6",
496
+ "@esbuild/win32-x64": "0.25.6"
497
+ }
498
+ },
499
+ "node_modules/gsap": {
500
+ "version": "3.14.2",
501
+ "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.14.2.tgz",
502
+ "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==",
503
+ "license": "Standard 'no charge' license: https://gsap.com/standard-license."
504
+ }
505
+ }
506
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "oddlyalive-demos",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "prepare:assets": "node prepare-assets.mjs",
7
+ "build:bundle": "npm run prepare:assets && esbuild app.js --bundle --format=iife --target=es2020 --outfile=app.bundle.js",
8
+ "dev": "npx --yes hyperframes@0.7.66 preview",
9
+ "check": "npm run build:bundle && npx --yes hyperframes@0.7.66 check",
10
+ "render": "npm run build:bundle && npx --yes hyperframes@0.7.66 render",
11
+ "publish": "npx --yes hyperframes@0.7.66 publish"
12
+ },
13
+ "dependencies": {
14
+ "gsap": "^3.14.2"
15
+ },
16
+ "devDependencies": {
17
+ "esbuild": "^0.25.6"
18
+ }
19
+ }
@@ -0,0 +1,16 @@
1
+ import { cpSync, mkdirSync, readdirSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const projectDir = dirname(fileURLToPath(import.meta.url));
6
+ const sourceDir = resolve(projectDir, "../../assets/photoreal");
7
+ const targetDir = resolve(projectDir, "assets/images/photoreal");
8
+
9
+ mkdirSync(targetDir, { recursive: true });
10
+
11
+ for (const name of readdirSync(sourceDir)) {
12
+ if (!name.endsWith(".png")) continue;
13
+ cpSync(resolve(sourceDir, name), resolve(targetDir, name));
14
+ }
15
+
16
+ console.log(`Prepared photographic assets in ${targetDir}`);